@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.
Files changed (56) hide show
  1. package/README.md +77 -8
  2. package/dist/agent-auth.d.ts +37 -0
  3. package/dist/agent-auth.d.ts.map +1 -0
  4. package/dist/agent-auth.js +348 -0
  5. package/dist/base-command.d.ts +11 -4
  6. package/dist/base-command.d.ts.map +1 -1
  7. package/dist/base-command.js +55 -4
  8. package/dist/commands/agent/invite-owner.d.ts +12 -0
  9. package/dist/commands/agent/invite-owner.d.ts.map +1 -0
  10. package/dist/commands/agent/invite-owner.js +36 -0
  11. package/dist/commands/agent/register.d.ts +16 -0
  12. package/dist/commands/agent/register.d.ts.map +1 -0
  13. package/dist/commands/agent/register.js +42 -0
  14. package/dist/commands/auth/login.d.ts +14 -0
  15. package/dist/commands/auth/login.d.ts.map +1 -0
  16. package/dist/commands/auth/login.js +36 -0
  17. package/dist/commands/auth/logout.d.ts +9 -0
  18. package/dist/commands/auth/logout.d.ts.map +1 -0
  19. package/dist/commands/auth/logout.js +22 -0
  20. package/dist/commands/mailbox/get-connection.d.ts +26 -0
  21. package/dist/commands/mailbox/get-connection.d.ts.map +1 -0
  22. package/dist/commands/mailbox/get-connection.js +7 -0
  23. package/dist/commands/mailbox/stream-events.d.ts +6 -6
  24. package/dist/commands/management/get-connection.d.ts +26 -0
  25. package/dist/commands/management/get-connection.d.ts.map +1 -0
  26. package/dist/commands/management/get-connection.js +7 -0
  27. package/dist/commands/profiles/list.d.ts.map +1 -1
  28. package/dist/commands/profiles/list.js +28 -8
  29. package/dist/commands/profiles/set.d.ts.map +1 -1
  30. package/dist/commands/profiles/set.js +15 -11
  31. package/dist/commands/profiles/show.d.ts.map +1 -1
  32. package/dist/commands/profiles/show.js +26 -12
  33. package/dist/commands/sending/get-connection.d.ts +26 -0
  34. package/dist/commands/sending/get-connection.d.ts.map +1 -0
  35. package/dist/commands/sending/get-connection.js +7 -0
  36. package/dist/generated/operations.d.ts +69 -6
  37. package/dist/generated/operations.d.ts.map +1 -1
  38. package/dist/generated/operations.js +76 -7
  39. package/dist/index.d.ts +1 -1
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/oauth-http.d.ts +18 -0
  42. package/dist/oauth-http.d.ts.map +1 -0
  43. package/dist/oauth-http.js +113 -0
  44. package/dist/oauth-login.d.ts +13 -0
  45. package/dist/oauth-login.d.ts.map +1 -0
  46. package/dist/oauth-login.js +236 -0
  47. package/dist/oauth-profile.d.ts +6 -0
  48. package/dist/oauth-profile.d.ts.map +1 -0
  49. package/dist/oauth-profile.js +123 -0
  50. package/dist/operation-runner.d.ts.map +1 -1
  51. package/dist/operation-runner.js +1 -1
  52. package/dist/profiles.d.ts +60 -2
  53. package/dist/profiles.d.ts.map +1 -1
  54. package/dist/profiles.js +150 -4
  55. package/oclif.manifest.json +2061 -1377
  56. 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;AAOvD,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,cAAc;IACtD,MAAM,CAAC,WAAW,SAAsC;IACxD,MAAM,CAAC,KAAK;;MAIV;IAEI,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;CAiB9B"}
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
- default: name === config.defaultProfile,
17
- key_kind: inferApiKeyKind(profile.apiKey),
18
- name,
19
- ...(profile.baseUrl ? { base_url: profile.baseUrl } : {}),
20
- ...(flags.verbose ? { api_key: maskApiKey(profile.apiKey) } : {}),
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;AAOvD,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
+ {"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 { readCliConfig, writeCliConfig, } from "../../profiles.js";
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 config = await readCliConfig(this.config.configDir);
33
- config.profiles[args.name] = {
34
- apiKey,
35
- ...(flags["base-url"] ? { baseUrl: flags["base-url"] } : {}),
36
- };
37
- if (flags.default || !config.defaultProfile) {
38
- config.defaultProfile = args.name;
39
- }
40
- await writeCliConfig(this.config.configDir, config);
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: config.defaultProfile === args.name,
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;AAOvD,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,cAAc;IACtD,MAAM,CAAC,IAAI;;MAKT;IACF,MAAM,CAAC,WAAW,SAAiE;IAE7E,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;CAyB9B"}
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
- return this.renderResult({
25
- ok: true,
26
- data: {
27
- api_key: maskApiKey(profile.apiKey),
28
- default: profileName === config.defaultProfile,
29
- key_kind: inferApiKeyKind(profile.apiKey),
30
- name: profileName,
31
- ...(profile.baseUrl ? { base_url: profile.baseUrl } : {}),
32
- },
33
- meta: {},
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgyIiC,CAAC;AAEzD,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAWpB,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,UAAU,CAAC"}
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"}