@alertee/cli 0.3.1 → 0.7.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 (154) hide show
  1. package/dist/api.d.ts +296 -0
  2. package/dist/api.d.ts.map +1 -1
  3. package/dist/api.js +44 -2
  4. package/dist/api.js.map +1 -1
  5. package/dist/commands/alert-groups/add-email-group.d.ts +9 -0
  6. package/dist/commands/alert-groups/add-email-group.d.ts.map +1 -0
  7. package/dist/commands/alert-groups/add-email-group.js +33 -0
  8. package/dist/commands/alert-groups/add-email-group.js.map +1 -0
  9. package/dist/commands/alert-groups/add-webhook.d.ts +8 -0
  10. package/dist/commands/alert-groups/add-webhook.d.ts.map +1 -0
  11. package/dist/commands/alert-groups/add-webhook.js +64 -0
  12. package/dist/commands/alert-groups/add-webhook.js.map +1 -0
  13. package/dist/commands/alert-groups/create.d.ts +11 -0
  14. package/dist/commands/alert-groups/create.d.ts.map +1 -0
  15. package/dist/commands/alert-groups/create.js +31 -0
  16. package/dist/commands/alert-groups/create.js.map +1 -0
  17. package/dist/commands/alert-groups/delete.d.ts +5 -0
  18. package/dist/commands/alert-groups/delete.d.ts.map +1 -0
  19. package/dist/commands/alert-groups/delete.js +35 -0
  20. package/dist/commands/alert-groups/delete.js.map +1 -0
  21. package/dist/commands/alert-groups/list.d.ts +5 -0
  22. package/dist/commands/alert-groups/list.d.ts.map +1 -0
  23. package/dist/commands/alert-groups/list.js +35 -0
  24. package/dist/commands/alert-groups/list.js.map +1 -0
  25. package/dist/commands/alert-groups/recipients.d.ts +5 -0
  26. package/dist/commands/alert-groups/recipients.d.ts.map +1 -0
  27. package/dist/commands/alert-groups/recipients.js +62 -0
  28. package/dist/commands/alert-groups/recipients.js.map +1 -0
  29. package/dist/commands/alert-groups/remove-recipient.d.ts +8 -0
  30. package/dist/commands/alert-groups/remove-recipient.d.ts.map +1 -0
  31. package/dist/commands/alert-groups/remove-recipient.js +33 -0
  32. package/dist/commands/alert-groups/remove-recipient.js.map +1 -0
  33. package/dist/commands/alert-groups/resolve.d.ts +6 -0
  34. package/dist/commands/alert-groups/resolve.d.ts.map +1 -0
  35. package/dist/commands/alert-groups/resolve.js +27 -0
  36. package/dist/commands/alert-groups/resolve.js.map +1 -0
  37. package/dist/commands/alert-groups/test.d.ts +3 -0
  38. package/dist/commands/alert-groups/test.d.ts.map +1 -0
  39. package/dist/commands/alert-groups/test.js +24 -0
  40. package/dist/commands/alert-groups/test.js.map +1 -0
  41. package/dist/commands/alert-groups/update.d.ts +12 -0
  42. package/dist/commands/alert-groups/update.d.ts.map +1 -0
  43. package/dist/commands/alert-groups/update.js +46 -0
  44. package/dist/commands/alert-groups/update.js.map +1 -0
  45. package/dist/commands/checks/create.d.ts +25 -1
  46. package/dist/commands/checks/create.d.ts.map +1 -1
  47. package/dist/commands/checks/create.js +141 -88
  48. package/dist/commands/checks/create.js.map +1 -1
  49. package/dist/commands/checks/update.d.ts +8 -2
  50. package/dist/commands/checks/update.d.ts.map +1 -1
  51. package/dist/commands/checks/update.js +101 -19
  52. package/dist/commands/checks/update.js.map +1 -1
  53. package/dist/commands/connections/create.d.ts +14 -0
  54. package/dist/commands/connections/create.d.ts.map +1 -0
  55. package/dist/commands/connections/create.js +52 -0
  56. package/dist/commands/connections/create.js.map +1 -0
  57. package/dist/commands/connections/delete.d.ts +5 -0
  58. package/dist/commands/connections/delete.d.ts.map +1 -0
  59. package/dist/commands/connections/delete.js +35 -0
  60. package/dist/commands/connections/delete.js.map +1 -0
  61. package/dist/commands/connections/resolve.d.ts +9 -0
  62. package/dist/commands/connections/resolve.d.ts.map +1 -0
  63. package/dist/commands/connections/resolve.js +30 -0
  64. package/dist/commands/connections/resolve.js.map +1 -0
  65. package/dist/commands/connections/test.d.ts +3 -0
  66. package/dist/commands/connections/test.d.ts.map +1 -0
  67. package/dist/commands/connections/test.js +28 -0
  68. package/dist/commands/connections/test.js.map +1 -0
  69. package/dist/commands/email-groups/add.d.ts +3 -0
  70. package/dist/commands/email-groups/add.d.ts.map +1 -0
  71. package/dist/commands/email-groups/add.js +23 -0
  72. package/dist/commands/email-groups/add.js.map +1 -0
  73. package/dist/commands/email-groups/create.d.ts +8 -0
  74. package/dist/commands/email-groups/create.d.ts.map +1 -0
  75. package/dist/commands/email-groups/create.js +28 -0
  76. package/dist/commands/email-groups/create.js.map +1 -0
  77. package/dist/commands/email-groups/delete.d.ts +5 -0
  78. package/dist/commands/email-groups/delete.d.ts.map +1 -0
  79. package/dist/commands/email-groups/delete.js +35 -0
  80. package/dist/commands/email-groups/delete.js.map +1 -0
  81. package/dist/commands/email-groups/list.d.ts +5 -0
  82. package/dist/commands/email-groups/list.d.ts.map +1 -0
  83. package/dist/commands/email-groups/list.js +36 -0
  84. package/dist/commands/email-groups/list.js.map +1 -0
  85. package/dist/commands/email-groups/members.d.ts +5 -0
  86. package/dist/commands/email-groups/members.d.ts.map +1 -0
  87. package/dist/commands/email-groups/members.js +42 -0
  88. package/dist/commands/email-groups/members.js.map +1 -0
  89. package/dist/commands/email-groups/remove.d.ts +3 -0
  90. package/dist/commands/email-groups/remove.d.ts.map +1 -0
  91. package/dist/commands/email-groups/remove.js +19 -0
  92. package/dist/commands/email-groups/remove.js.map +1 -0
  93. package/dist/commands/email-groups/resolve.d.ts +6 -0
  94. package/dist/commands/email-groups/resolve.d.ts.map +1 -0
  95. package/dist/commands/email-groups/resolve.js +27 -0
  96. package/dist/commands/email-groups/resolve.js.map +1 -0
  97. package/dist/commands/inbox/ack.d.ts +5 -0
  98. package/dist/commands/inbox/ack.d.ts.map +1 -0
  99. package/dist/commands/inbox/ack.js +17 -0
  100. package/dist/commands/inbox/ack.js.map +1 -0
  101. package/dist/commands/inbox/digest.d.ts +5 -0
  102. package/dist/commands/inbox/digest.d.ts.map +1 -0
  103. package/dist/commands/inbox/digest.js +30 -0
  104. package/dist/commands/inbox/digest.js.map +1 -0
  105. package/dist/commands/inbox/get.d.ts +5 -0
  106. package/dist/commands/inbox/get.d.ts.map +1 -0
  107. package/dist/commands/inbox/get.js +45 -0
  108. package/dist/commands/inbox/get.js.map +1 -0
  109. package/dist/commands/inbox/list.d.ts +9 -0
  110. package/dist/commands/inbox/list.d.ts.map +1 -0
  111. package/dist/commands/inbox/list.js +47 -0
  112. package/dist/commands/inbox/list.js.map +1 -0
  113. package/dist/commands/inbox/resolve.d.ts +7 -0
  114. package/dist/commands/inbox/resolve.d.ts.map +1 -0
  115. package/dist/commands/inbox/resolve.js +17 -0
  116. package/dist/commands/inbox/resolve.js.map +1 -0
  117. package/dist/commands/org/create.d.ts +12 -0
  118. package/dist/commands/org/create.d.ts.map +1 -0
  119. package/dist/commands/org/create.js +33 -0
  120. package/dist/commands/org/create.js.map +1 -0
  121. package/dist/commands/org/list.d.ts +5 -0
  122. package/dist/commands/org/list.d.ts.map +1 -0
  123. package/dist/commands/org/list.js +35 -0
  124. package/dist/commands/org/list.js.map +1 -0
  125. package/dist/commands/receivers/create.d.ts +15 -0
  126. package/dist/commands/receivers/create.d.ts.map +1 -0
  127. package/dist/commands/receivers/create.js +45 -0
  128. package/dist/commands/receivers/create.js.map +1 -0
  129. package/dist/commands/receivers/delete.d.ts +5 -0
  130. package/dist/commands/receivers/delete.d.ts.map +1 -0
  131. package/dist/commands/receivers/delete.js +35 -0
  132. package/dist/commands/receivers/delete.js.map +1 -0
  133. package/dist/commands/receivers/list.d.ts +5 -0
  134. package/dist/commands/receivers/list.d.ts.map +1 -0
  135. package/dist/commands/receivers/list.js +36 -0
  136. package/dist/commands/receivers/list.js.map +1 -0
  137. package/dist/commands/receivers/resolve.d.ts +6 -0
  138. package/dist/commands/receivers/resolve.d.ts.map +1 -0
  139. package/dist/commands/receivers/resolve.js +27 -0
  140. package/dist/commands/receivers/resolve.js.map +1 -0
  141. package/dist/index.js +235 -3
  142. package/dist/index.js.map +1 -1
  143. package/dist/mcp.d.ts.map +1 -1
  144. package/dist/mcp.js +567 -5
  145. package/dist/mcp.js.map +1 -1
  146. package/dist/prompts.d.ts +15 -0
  147. package/dist/prompts.d.ts.map +1 -0
  148. package/dist/prompts.js +25 -0
  149. package/dist/prompts.js.map +1 -0
  150. package/dist/uuid.d.ts +13 -0
  151. package/dist/uuid.d.ts.map +1 -0
  152. package/dist/uuid.js +13 -0
  153. package/dist/uuid.js.map +1 -0
  154. package/package.json +1 -1
@@ -0,0 +1,35 @@
1
+ import { confirm } from '@inquirer/prompts';
2
+ import { createClient } from '../../api.js';
3
+ import { requireConfig, requireOrg } from '../../config.js';
4
+ import { isInteractive } from '../../prompts.js';
5
+ import { resolveConnectionId } from './resolve.js';
6
+ /** Delete a connection (by name or ID). Prompts for confirmation unless --yes. */
7
+ export async function deleteConnection(nameOrId, opts = {}) {
8
+ const config = requireConfig();
9
+ requireOrg(config);
10
+ const client = createClient(config);
11
+ const id = await resolveConnectionId(client, nameOrId);
12
+ if (!opts.yes) {
13
+ if (!isInteractive()) {
14
+ console.error('Refusing to delete without confirmation. Pass --yes.');
15
+ process.exit(1);
16
+ }
17
+ const ok = await confirm({
18
+ message: `Delete connection "${nameOrId}"? Checks using it will stop working.`,
19
+ default: false,
20
+ });
21
+ if (!ok) {
22
+ console.log('Aborted.');
23
+ return;
24
+ }
25
+ }
26
+ try {
27
+ await client.deleteConnection(id);
28
+ }
29
+ catch (err) {
30
+ console.error('Failed to delete connection:', err.message);
31
+ process.exit(1);
32
+ }
33
+ console.log(`Deleted connection ${id}.`);
34
+ }
35
+ //# sourceMappingURL=delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../src/commands/connections/delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAElD,kFAAkF;AAClF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAgB,EAChB,OAA0B,EAAE;IAE5B,MAAM,MAAM,GAAG,aAAa,EAAE,CAAA;IAC9B,UAAU,CAAC,MAAM,CAAC,CAAA;IAClB,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;IACnC,MAAM,EAAE,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IAEtD,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACd,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;YACrB,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAA;YACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QACD,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC;YACvB,OAAO,EAAE,sBAAsB,QAAQ,uCAAuC;YAC9E,OAAO,EAAE,KAAK;SACf,CAAC,CAAA;QACF,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;YACvB,OAAM;QACR,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAA;IACnC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAG,GAAa,CAAC,OAAO,CAAC,CAAA;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAA;AAC1C,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { createClient } from '../../api.js';
2
+ type Client = ReturnType<typeof createClient>;
3
+ /**
4
+ * Resolve a connection argument that may be either a UUID or a
5
+ * (case-insensitive) name. Exits with a helpful message on no/ambiguous match.
6
+ */
7
+ export declare function resolveConnectionId(client: Client, nameOrId: string): Promise<string>;
8
+ export {};
9
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../../src/commands/connections/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAEhD,KAAK,MAAM,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAA;AAK7C;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAyBjB"}
@@ -0,0 +1,30 @@
1
+ const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
2
+ /**
3
+ * Resolve a connection argument that may be either a UUID or a
4
+ * (case-insensitive) name. Exits with a helpful message on no/ambiguous match.
5
+ */
6
+ export async function resolveConnectionId(client, nameOrId) {
7
+ if (UUID_RE.test(nameOrId.trim())) {
8
+ return nameOrId.trim();
9
+ }
10
+ let connections;
11
+ try {
12
+ connections = (await client.listConnections()).connections;
13
+ }
14
+ catch (err) {
15
+ console.error('Failed to list connections:', err.message);
16
+ process.exit(1);
17
+ }
18
+ const needle = nameOrId.trim().toLowerCase();
19
+ const matches = connections.filter((c) => c.name.toLowerCase() === needle);
20
+ if (matches.length === 0) {
21
+ console.error(`No connection named "${nameOrId}". Run \`alertee connections list\`.`);
22
+ process.exit(1);
23
+ }
24
+ if (matches.length > 1) {
25
+ console.error(`"${nameOrId}" matches ${matches.length} connections; pass the ID instead.`);
26
+ process.exit(1);
27
+ }
28
+ return matches[0].id;
29
+ }
30
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../src/commands/connections/resolve.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,GACX,iEAAiE,CAAA;AAEnE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAc,EACd,QAAgB;IAEhB,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QAClC,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAA;IACxB,CAAC;IAED,IAAI,WAA8E,CAAA;IAClF,IAAI,CAAC;QACH,WAAW,GAAG,CAAC,MAAM,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC,WAAW,CAAA;IAC5D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAG,GAAa,CAAC,OAAO,CAAC,CAAA;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAC5C,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,CAAA;IAE1E,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,wBAAwB,QAAQ,sCAAsC,CAAC,CAAA;QACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,IAAI,QAAQ,aAAa,OAAO,CAAC,MAAM,oCAAoC,CAAC,CAAA;QAC1F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IACD,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AACtB,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Re-test an existing connection's credentials (by name or ID). */
2
+ export declare function testConnection(nameOrId: string): Promise<void>;
3
+ //# sourceMappingURL=test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../../src/commands/connections/test.ts"],"names":[],"mappings":"AAIA,oEAAoE;AACpE,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBpE"}
@@ -0,0 +1,28 @@
1
+ import { createClient } from '../../api.js';
2
+ import { requireConfig, requireOrg } from '../../config.js';
3
+ import { resolveConnectionId } from './resolve.js';
4
+ /** Re-test an existing connection's credentials (by name or ID). */
5
+ export async function testConnection(nameOrId) {
6
+ const config = requireConfig();
7
+ requireOrg(config);
8
+ const client = createClient(config);
9
+ const id = await resolveConnectionId(client, nameOrId);
10
+ let res;
11
+ try {
12
+ res = await client.testConnection(id);
13
+ }
14
+ catch (err) {
15
+ console.error('Failed to test connection:', err.message);
16
+ process.exit(1);
17
+ }
18
+ if (!res.success) {
19
+ console.error(`✗ Connection failed: ${res.error ?? 'unknown error'}`);
20
+ process.exit(1);
21
+ }
22
+ console.log('✓ Connection OK');
23
+ if (res.permissions?.length)
24
+ console.log(`Permissions: ${res.permissions.join(', ')}`);
25
+ if (res.warning)
26
+ console.log(`Warning: ${res.warning}`);
27
+ }
28
+ //# sourceMappingURL=test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../../../src/commands/connections/test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAElD,oEAAoE;AACpE,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,MAAM,MAAM,GAAG,aAAa,EAAE,CAAA;IAC9B,UAAU,CAAC,MAAM,CAAC,CAAA;IAClB,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;IACnC,MAAM,EAAE,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IAEtD,IAAI,GAAsD,CAAA;IAC1D,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,CAAA;IACvC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAG,GAAa,CAAC,OAAO,CAAC,CAAA;QACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,wBAAwB,GAAG,CAAC,KAAK,IAAI,eAAe,EAAE,CAAC,CAAA;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;IAC9B,IAAI,GAAG,CAAC,WAAW,EAAE,MAAM;QAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACtF,IAAI,GAAG,CAAC,OAAO;QAAE,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;AACzD,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Add one or more email addresses to an email group (by name or ID). */
2
+ export declare function addEmailGroupMembers(nameOrId: string, emails: string[]): Promise<void>;
3
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../src/commands/email-groups/add.ts"],"names":[],"mappings":"AAIA,yEAAyE;AACzE,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EAAE,GACf,OAAO,CAAC,IAAI,CAAC,CAkBf"}
@@ -0,0 +1,23 @@
1
+ import { createClient } from '../../api.js';
2
+ import { requireConfig, requireOrg } from '../../config.js';
3
+ import { resolveEmailGroupId } from './resolve.js';
4
+ /** Add one or more email addresses to an email group (by name or ID). */
5
+ export async function addEmailGroupMembers(nameOrId, emails) {
6
+ if (!emails || emails.length === 0) {
7
+ console.error('Pass at least one email address: alertee email-groups add <group> a@b.com c@d.com');
8
+ process.exit(1);
9
+ }
10
+ const config = requireConfig();
11
+ requireOrg(config);
12
+ const client = createClient(config);
13
+ const id = await resolveEmailGroupId(client, nameOrId);
14
+ try {
15
+ await client.addEmailGroupMembers(id, emails);
16
+ }
17
+ catch (err) {
18
+ console.error('Failed to add members:', err.message);
19
+ process.exit(1);
20
+ }
21
+ console.log(`Added ${emails.length} ${emails.length === 1 ? 'address' : 'addresses'} to the group.`);
22
+ }
23
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../../src/commands/email-groups/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAElD,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,QAAgB,EAChB,MAAgB;IAEhB,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,KAAK,CAAC,mFAAmF,CAAC,CAAA;QAClG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,MAAM,GAAG,aAAa,EAAE,CAAA;IAC9B,UAAU,CAAC,MAAM,CAAC,CAAA;IAClB,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;IACnC,MAAM,EAAE,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IAEtD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,oBAAoB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;IAC/C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAG,GAAa,CAAC,OAAO,CAAC,CAAA;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,gBAAgB,CAAC,CAAA;AACtG,CAAC"}
@@ -0,0 +1,8 @@
1
+ export interface CreateEmailGroupOptions {
2
+ description?: string;
3
+ /** Initial member emails. */
4
+ email?: string[];
5
+ }
6
+ /** Create an email group (recipient list), optionally with initial emails. */
7
+ export declare function createEmailGroup(name: string | undefined, opts?: CreateEmailGroupOptions): Promise<void>;
8
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/email-groups/create.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,uBAAuB;IACtC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,6BAA6B;IAC7B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;CACjB;AAED,8EAA8E;AAC9E,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,IAAI,GAAE,uBAA4B,GACjC,OAAO,CAAC,IAAI,CAAC,CA2Bf"}
@@ -0,0 +1,28 @@
1
+ import { input } from '@inquirer/prompts';
2
+ import { createClient } from '../../api.js';
3
+ import { requireConfig, requireOrg } from '../../config.js';
4
+ import { requireValue } from '../../prompts.js';
5
+ /** Create an email group (recipient list), optionally with initial emails. */
6
+ export async function createEmailGroup(name, opts = {}) {
7
+ const config = requireConfig();
8
+ requireOrg(config);
9
+ const client = createClient(config);
10
+ const resolvedName = await requireValue(name, () => input({ message: 'Email group name:', validate: (v) => v.trim().length > 0 || 'Required' }), 'Email group name required. Pass it as an argument: alertee email-groups create "<name>"');
11
+ let group;
12
+ try {
13
+ group = await client.createEmailGroup({
14
+ name: resolvedName,
15
+ description: opts.description,
16
+ auto_add_members: false,
17
+ is_default: false,
18
+ members: opts.email,
19
+ });
20
+ }
21
+ catch (err) {
22
+ console.error('Failed to create email group:', err.message);
23
+ process.exit(1);
24
+ }
25
+ console.log(`Created email group "${group.name}" (${group.id}).`);
26
+ console.log('Attach it to an alert group: alertee alert-groups add-email-group <group> --email-group "' + group.name + '"');
27
+ }
28
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/email-groups/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAQ/C,8EAA8E;AAC9E,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAwB,EACxB,OAAgC,EAAE;IAElC,MAAM,MAAM,GAAG,aAAa,EAAE,CAAA;IAC9B,UAAU,CAAC,MAAM,CAAC,CAAA;IAClB,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;IAEnC,MAAM,YAAY,GAAG,MAAM,YAAY,CACrC,IAAI,EACJ,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,EAAE,CAAC,EACzG,yFAAyF,CAC1F,CAAA;IAED,IAAI,KAA0D,CAAA;IAC9D,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC;YACpC,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,gBAAgB,EAAE,KAAK;YACvB,UAAU,EAAE,KAAK;YACjB,OAAO,EAAE,IAAI,CAAC,KAAK;SACpB,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAG,GAAa,CAAC,OAAO,CAAC,CAAA;QACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,EAAE,IAAI,CAAC,CAAA;IACjE,OAAO,CAAC,GAAG,CAAC,2FAA2F,GAAG,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,CAAA;AAC7H,CAAC"}
@@ -0,0 +1,5 @@
1
+ /** Delete an email group (by name or ID). Prompts for confirmation unless --yes. */
2
+ export declare function deleteEmailGroup(nameOrId: string, opts?: {
3
+ yes?: boolean;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=delete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/commands/email-groups/delete.ts"],"names":[],"mappings":"AAMA,oFAAoF;AACpF,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3B,OAAO,CAAC,IAAI,CAAC,CA4Bf"}
@@ -0,0 +1,35 @@
1
+ import { confirm } from '@inquirer/prompts';
2
+ import { createClient } from '../../api.js';
3
+ import { requireConfig, requireOrg } from '../../config.js';
4
+ import { isInteractive } from '../../prompts.js';
5
+ import { resolveEmailGroupId } from './resolve.js';
6
+ /** Delete an email group (by name or ID). Prompts for confirmation unless --yes. */
7
+ export async function deleteEmailGroup(nameOrId, opts = {}) {
8
+ const config = requireConfig();
9
+ requireOrg(config);
10
+ const client = createClient(config);
11
+ const id = await resolveEmailGroupId(client, nameOrId);
12
+ if (!opts.yes) {
13
+ if (!isInteractive()) {
14
+ console.error('Refusing to delete without confirmation. Pass --yes.');
15
+ process.exit(1);
16
+ }
17
+ const ok = await confirm({
18
+ message: `Delete email group "${nameOrId}"? Alert groups using it lose those recipients.`,
19
+ default: false,
20
+ });
21
+ if (!ok) {
22
+ console.log('Aborted.');
23
+ return;
24
+ }
25
+ }
26
+ try {
27
+ await client.deleteEmailGroup(id);
28
+ }
29
+ catch (err) {
30
+ console.error('Failed to delete email group:', err.message);
31
+ process.exit(1);
32
+ }
33
+ console.log(`Deleted email group ${id}.`);
34
+ }
35
+ //# sourceMappingURL=delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../src/commands/email-groups/delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAElD,oFAAoF;AACpF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAgB,EAChB,OAA0B,EAAE;IAE5B,MAAM,MAAM,GAAG,aAAa,EAAE,CAAA;IAC9B,UAAU,CAAC,MAAM,CAAC,CAAA;IAClB,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;IACnC,MAAM,EAAE,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IAEtD,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACd,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;YACrB,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAA;YACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QACD,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC;YACvB,OAAO,EAAE,uBAAuB,QAAQ,iDAAiD;YACzF,OAAO,EAAE,KAAK;SACf,CAAC,CAAA;QACF,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;YACvB,OAAM;QACR,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAA;IACnC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAG,GAAa,CAAC,OAAO,CAAC,CAAA;QACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAA;AAC3C,CAAC"}
@@ -0,0 +1,5 @@
1
+ /** List email groups (recipient lists) in the linked organization. */
2
+ export declare function listEmailGroups(opts?: {
3
+ format?: string;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/email-groups/list.ts"],"names":[],"mappings":"AAIA,sEAAsE;AACtE,wBAAsB,eAAe,CAAC,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCnF"}
@@ -0,0 +1,36 @@
1
+ import { createClient } from '../../api.js';
2
+ import { requireConfig, requireOrg } from '../../config.js';
3
+ import { printJson, resolveFormat } from '../../output.js';
4
+ /** List email groups (recipient lists) in the linked organization. */
5
+ export async function listEmailGroups(opts = {}) {
6
+ const format = resolveFormat(opts.format);
7
+ const config = requireConfig();
8
+ requireOrg(config);
9
+ const client = createClient(config);
10
+ let groups;
11
+ try {
12
+ groups = (await client.listEmailGroups()).groups;
13
+ }
14
+ catch (err) {
15
+ console.error('Failed to list email groups:', err.message);
16
+ process.exit(1);
17
+ }
18
+ if (format === 'json') {
19
+ printJson(groups);
20
+ return;
21
+ }
22
+ if (groups.length === 0) {
23
+ console.log('No email groups found.');
24
+ return;
25
+ }
26
+ const nameWidth = Math.max(4, ...groups.map((g) => g.name.length));
27
+ const header = ` ${'NAME'.padEnd(nameWidth)} MEMBERS ID`;
28
+ console.log(header);
29
+ console.log('─'.repeat(header.length));
30
+ for (const g of groups) {
31
+ const marker = g.is_default ? '*' : ' ';
32
+ const count = g.auto_add_members ? 'auto' : String(g.member_count ?? 0);
33
+ console.log(`${marker} ${g.name.padEnd(nameWidth)} ${count.padEnd(7)} ${g.id}`);
34
+ }
35
+ }
36
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/email-groups/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC3D,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE1D,sEAAsE;AACtE,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAA4B,EAAE;IAClE,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACzC,MAAM,MAAM,GAAG,aAAa,EAAE,CAAA;IAC9B,UAAU,CAAC,MAAM,CAAC,CAAA;IAClB,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;IAEnC,IAAI,MAAoE,CAAA;IACxE,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC,MAAM,CAAA;IAClD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAG,GAAa,CAAC,OAAO,CAAC,CAAA;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,SAAS,CAAC,MAAM,CAAC,CAAA;QACjB,OAAM;IACR,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAA;QACrC,OAAM;IACR,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;IAClE,MAAM,MAAM,GAAG,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,CAAA;IAC3D,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACnB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;IACtC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAA;QACvC,MAAM,KAAK,GAAG,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,CAAA;QACvE,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IACnF,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ /** List the members of an email group (by name or ID). */
2
+ export declare function listEmailGroupMembers(nameOrId: string, opts?: {
3
+ format?: string;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=members.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"members.d.ts","sourceRoot":"","sources":["../../../src/commands/email-groups/members.ts"],"names":[],"mappings":"AAMA,0DAA0D;AAC1D,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAC7B,OAAO,CAAC,IAAI,CAAC,CAqCf"}
@@ -0,0 +1,42 @@
1
+ import { createClient } from '../../api.js';
2
+ import { requireConfig, requireOrg } from '../../config.js';
3
+ import { printJson, resolveFormat } from '../../output.js';
4
+ import { uuidIsSet } from '../../uuid.js';
5
+ import { resolveEmailGroupId } from './resolve.js';
6
+ /** List the members of an email group (by name or ID). */
7
+ export async function listEmailGroupMembers(nameOrId, opts = {}) {
8
+ const format = resolveFormat(opts.format);
9
+ const config = requireConfig();
10
+ requireOrg(config);
11
+ const client = createClient(config);
12
+ const id = await resolveEmailGroupId(client, nameOrId);
13
+ let group;
14
+ try {
15
+ group = await client.getEmailGroup(id);
16
+ }
17
+ catch (err) {
18
+ console.error('Failed to fetch email group:', err.message);
19
+ process.exit(1);
20
+ }
21
+ const members = group.members ?? [];
22
+ if (format === 'json') {
23
+ printJson(members);
24
+ return;
25
+ }
26
+ if (group.auto_add_members) {
27
+ console.log('This group auto-includes all organization members.');
28
+ }
29
+ if (members.length === 0) {
30
+ console.log('No members.');
31
+ return;
32
+ }
33
+ const emailWidth = Math.max(5, ...members.map((m) => m.email.length));
34
+ const header = `${'EMAIL'.padEnd(emailWidth)} SOURCE`;
35
+ console.log(header);
36
+ console.log('─'.repeat(header.length));
37
+ for (const m of members) {
38
+ const source = uuidIsSet(m.user_id) ? 'org user' : 'external';
39
+ console.log(`${m.email.padEnd(emailWidth)} ${source}`);
40
+ }
41
+ }
42
+ //# sourceMappingURL=members.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"members.js","sourceRoot":"","sources":["../../../src/commands/email-groups/members.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC3D,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAElD,0DAA0D;AAC1D,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,QAAgB,EAChB,OAA4B,EAAE;IAE9B,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACzC,MAAM,MAAM,GAAG,aAAa,EAAE,CAAA;IAC9B,UAAU,CAAC,MAAM,CAAC,CAAA;IAClB,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;IACnC,MAAM,EAAE,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IAEtD,IAAI,KAAuD,CAAA;IAC3D,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;IACxC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAG,GAAa,CAAC,OAAO,CAAC,CAAA;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE,CAAA;IACnC,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,SAAS,CAAC,OAAO,CAAC,CAAA;QAClB,OAAM;IACR,CAAC;IAED,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAA;IACnE,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;QAC1B,OAAM;IACR,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;IACrE,MAAM,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAA;IACtD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACnB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;IACtC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAA;QAC7D,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,MAAM,EAAE,CAAC,CAAA;IACzD,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Remove an email address from an email group (by name or ID). */
2
+ export declare function removeEmailGroupMember(nameOrId: string, email: string): Promise<void>;
3
+ //# sourceMappingURL=remove.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.d.ts","sourceRoot":"","sources":["../../../src/commands/email-groups/remove.ts"],"names":[],"mappings":"AAIA,mEAAmE;AACnE,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAaf"}
@@ -0,0 +1,19 @@
1
+ import { createClient } from '../../api.js';
2
+ import { requireConfig, requireOrg } from '../../config.js';
3
+ import { resolveEmailGroupId } from './resolve.js';
4
+ /** Remove an email address from an email group (by name or ID). */
5
+ export async function removeEmailGroupMember(nameOrId, email) {
6
+ const config = requireConfig();
7
+ requireOrg(config);
8
+ const client = createClient(config);
9
+ const id = await resolveEmailGroupId(client, nameOrId);
10
+ try {
11
+ await client.removeEmailGroupMember(id, email);
12
+ }
13
+ catch (err) {
14
+ console.error('Failed to remove member:', err.message);
15
+ process.exit(1);
16
+ }
17
+ console.log(`Removed ${email} from the group.`);
18
+ }
19
+ //# sourceMappingURL=remove.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.js","sourceRoot":"","sources":["../../../src/commands/email-groups/remove.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAElD,mEAAmE;AACnE,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,QAAgB,EAChB,KAAa;IAEb,MAAM,MAAM,GAAG,aAAa,EAAE,CAAA;IAC9B,UAAU,CAAC,MAAM,CAAC,CAAA;IAClB,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;IACnC,MAAM,EAAE,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IAEtD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,sBAAsB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;IAChD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAG,GAAa,CAAC,OAAO,CAAC,CAAA;QACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,kBAAkB,CAAC,CAAA;AACjD,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { createClient } from '../../api.js';
2
+ type Client = ReturnType<typeof createClient>;
3
+ /** Resolve an email group argument (UUID or case-insensitive name) to its ID. */
4
+ export declare function resolveEmailGroupId(client: Client, nameOrId: string): Promise<string>;
5
+ export {};
6
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../../src/commands/email-groups/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAEhD,KAAK,MAAM,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAA;AAK7C,iFAAiF;AACjF,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAyBjB"}
@@ -0,0 +1,27 @@
1
+ const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
2
+ /** Resolve an email group argument (UUID or case-insensitive name) to its ID. */
3
+ export async function resolveEmailGroupId(client, nameOrId) {
4
+ if (UUID_RE.test(nameOrId.trim())) {
5
+ return nameOrId.trim();
6
+ }
7
+ let groups;
8
+ try {
9
+ groups = (await client.listEmailGroups()).groups;
10
+ }
11
+ catch (err) {
12
+ console.error('Failed to list email groups:', err.message);
13
+ process.exit(1);
14
+ }
15
+ const needle = nameOrId.trim().toLowerCase();
16
+ const matches = groups.filter((g) => g.name.toLowerCase() === needle);
17
+ if (matches.length === 0) {
18
+ console.error(`No email group named "${nameOrId}". Run \`alertee email-groups list\`.`);
19
+ process.exit(1);
20
+ }
21
+ if (matches.length > 1) {
22
+ console.error(`"${nameOrId}" matches ${matches.length} email groups; pass the ID instead.`);
23
+ process.exit(1);
24
+ }
25
+ return matches[0].id;
26
+ }
27
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../src/commands/email-groups/resolve.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,GACX,iEAAiE,CAAA;AAEnE,iFAAiF;AACjF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAc,EACd,QAAgB;IAEhB,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QAClC,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAA;IACxB,CAAC;IAED,IAAI,MAAoE,CAAA;IACxE,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC,MAAM,CAAA;IAClD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAG,GAAa,CAAC,OAAO,CAAC,CAAA;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAC5C,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,CAAA;IAErE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,yBAAyB,QAAQ,uCAAuC,CAAC,CAAA;QACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,IAAI,QAAQ,aAAa,OAAO,CAAC,MAAM,qCAAqC,CAAC,CAAA;QAC3F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IACD,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AACtB,CAAC"}
@@ -0,0 +1,5 @@
1
+ /** Acknowledge an inbox item (incident) by ID. */
2
+ export declare function ackInboxItem(id: string, opts?: {
3
+ note?: string;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=ack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ack.d.ts","sourceRoot":"","sources":["../../../src/commands/inbox/ack.ts"],"names":[],"mappings":"AAGA,kDAAkD;AAClD,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAY1F"}
@@ -0,0 +1,17 @@
1
+ import { createClient } from '../../api.js';
2
+ import { requireConfig, requireOrg } from '../../config.js';
3
+ /** Acknowledge an inbox item (incident) by ID. */
4
+ export async function ackInboxItem(id, opts = {}) {
5
+ const config = requireConfig();
6
+ requireOrg(config);
7
+ const client = createClient(config);
8
+ try {
9
+ await client.acknowledgeIssue(id, { note: opts.note });
10
+ }
11
+ catch (err) {
12
+ console.error('Failed to acknowledge:', err.message);
13
+ process.exit(1);
14
+ }
15
+ console.log(`Acknowledged ${id}.`);
16
+ }
17
+ //# sourceMappingURL=ack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ack.js","sourceRoot":"","sources":["../../../src/commands/inbox/ack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE3D,kDAAkD;AAClD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,EAAU,EAAE,OAA0B,EAAE;IACzE,MAAM,MAAM,GAAG,aAAa,EAAE,CAAA;IAC9B,UAAU,CAAC,MAAM,CAAC,CAAA;IAClB,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;IAEnC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;IACxD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAG,GAAa,CAAC,OAAO,CAAC,CAAA;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAA;AACpC,CAAC"}
@@ -0,0 +1,5 @@
1
+ /** Show the inbox digest — a briefing plus incident counts. */
2
+ export declare function inboxDigest(opts?: {
3
+ format?: string;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=digest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"digest.d.ts","sourceRoot":"","sources":["../../../src/commands/inbox/digest.ts"],"names":[],"mappings":"AAIA,+DAA+D;AAC/D,wBAAsB,WAAW,CAAC,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB/E"}
@@ -0,0 +1,30 @@
1
+ import { createClient } from '../../api.js';
2
+ import { requireConfig, requireOrg } from '../../config.js';
3
+ import { printJson, resolveFormat } from '../../output.js';
4
+ /** Show the inbox digest — a briefing plus incident counts. */
5
+ export async function inboxDigest(opts = {}) {
6
+ const format = resolveFormat(opts.format);
7
+ const config = requireConfig();
8
+ requireOrg(config);
9
+ const client = createClient(config);
10
+ let summary;
11
+ try {
12
+ summary = (await client.getInboxDigest()).summary;
13
+ }
14
+ catch (err) {
15
+ console.error('Failed to fetch digest:', err.message);
16
+ process.exit(1);
17
+ }
18
+ if (format === 'json') {
19
+ printJson(summary);
20
+ return;
21
+ }
22
+ if (summary.briefing)
23
+ console.log(summary.briefing + '\n');
24
+ console.log(`Active incidents: ${summary.activeIncidentCount} (${summary.criticalCount} critical)`);
25
+ console.log(`Last 24h: ${summary.updated24h} updated, ${summary.resolved24h} resolved`);
26
+ if (summary.pendingImprovements > 0) {
27
+ console.log(`Pending improvements: ${summary.pendingImprovements}`);
28
+ }
29
+ }
30
+ //# sourceMappingURL=digest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"digest.js","sourceRoot":"","sources":["../../../src/commands/inbox/digest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC3D,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE1D,+DAA+D;AAC/D,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAA4B,EAAE;IAC9D,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACzC,MAAM,MAAM,GAAG,aAAa,EAAE,CAAA;IAC9B,UAAU,CAAC,MAAM,CAAC,CAAA;IAClB,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;IAEnC,IAAI,OAAqE,CAAA;IACzE,IAAI,CAAC;QACH,OAAO,GAAG,CAAC,MAAM,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,OAAO,CAAA;IACnD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAG,GAAa,CAAC,OAAO,CAAC,CAAA;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,SAAS,CAAC,OAAO,CAAC,CAAA;QAClB,OAAM;IACR,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ;QAAE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAA;IAC1D,OAAO,CAAC,GAAG,CAAC,sBAAsB,OAAO,CAAC,mBAAmB,KAAK,OAAO,CAAC,aAAa,YAAY,CAAC,CAAA;IACpG,OAAO,CAAC,GAAG,CAAC,sBAAsB,OAAO,CAAC,UAAU,aAAa,OAAO,CAAC,WAAW,WAAW,CAAC,CAAA;IAChG,IAAI,OAAO,CAAC,mBAAmB,GAAG,CAAC,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,yBAAyB,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAA;IACrE,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ /** Show a single inbox item (incident) and its timeline, by ID. */
2
+ export declare function getInboxItem(id: string, opts?: {
3
+ format?: string;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=get.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../src/commands/inbox/get.ts"],"names":[],"mappings":"AAIA,mEAAmE;AACnE,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAuC5F"}
@@ -0,0 +1,45 @@
1
+ import { createClient } from '../../api.js';
2
+ import { requireConfig, requireOrg } from '../../config.js';
3
+ import { printJson, resolveFormat } from '../../output.js';
4
+ /** Show a single inbox item (incident) and its timeline, by ID. */
5
+ export async function getInboxItem(id, opts = {}) {
6
+ const format = resolveFormat(opts.format);
7
+ const config = requireConfig();
8
+ requireOrg(config);
9
+ const client = createClient(config);
10
+ let data;
11
+ try {
12
+ data = await client.getIssue(id);
13
+ }
14
+ catch (err) {
15
+ console.error('Failed to fetch inbox item:', err.message);
16
+ process.exit(1);
17
+ }
18
+ if (format === 'json') {
19
+ printJson(data);
20
+ return;
21
+ }
22
+ const i = data.issue;
23
+ console.log(i.title);
24
+ console.log('─'.repeat(Math.min(60, i.title.length)));
25
+ console.log(`ID: ${i.id}`);
26
+ console.log(`Severity: ${i.severity}`);
27
+ console.log(`Status: ${i.status}`);
28
+ console.log(`Source: ${i.sourceType}`);
29
+ console.log(`Started: ${new Date(i.startedAt).toLocaleString()}`);
30
+ if (i.resolvedAt)
31
+ console.log(`Resolved: ${new Date(i.resolvedAt).toLocaleString()}`);
32
+ if (i.outcome)
33
+ console.log(`Outcome: ${i.outcome}`);
34
+ console.log(`Alerts: ${i.alertCount}`);
35
+ if (i.description)
36
+ console.log(`\n${i.description}`);
37
+ const events = data.timelineEvents ?? [];
38
+ if (events.length > 0) {
39
+ console.log('\nTimeline:');
40
+ for (const e of events) {
41
+ console.log(` ${new Date(e.createdAt).toLocaleString()} ${e.action}`);
42
+ }
43
+ }
44
+ }
45
+ //# sourceMappingURL=get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.js","sourceRoot":"","sources":["../../../src/commands/inbox/get.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC3D,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE1D,mEAAmE;AACnE,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,EAAU,EAAE,OAA4B,EAAE;IAC3E,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACzC,MAAM,MAAM,GAAG,aAAa,EAAE,CAAA;IAC9B,UAAU,CAAC,MAAM,CAAC,CAAA;IAClB,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;IAEnC,IAAI,IAAiD,CAAA;IACrD,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IAClC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAG,GAAa,CAAC,OAAO,CAAC,CAAA;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,SAAS,CAAC,IAAI,CAAC,CAAA;QACf,OAAM;IACR,CAAC;IAED,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAA;IACpB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;IACpB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IACrD,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IACjC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;IACvC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,MAAM,EAAE,CAAC,CAAA;IACrC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,UAAU,EAAE,CAAC,CAAA;IACzC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAA;IACnE,IAAI,CAAC,CAAC,UAAU;QAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAA;IACtF,IAAI,CAAC,CAAC,OAAO;QAAE,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;IACrD,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,UAAU,EAAE,CAAC,CAAA;IACzC,IAAI,CAAC,CAAC,WAAW;QAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAA;IAEpD,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,IAAI,EAAE,CAAA;IACxC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;QAC1B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAA;QACzE,CAAC;IACH,CAAC;AACH,CAAC"}