@alertee/cli 0.16.1 → 0.18.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 (66) hide show
  1. package/dist/api.d.ts +61 -0
  2. package/dist/api.d.ts.map +1 -1
  3. package/dist/api.js +20 -0
  4. package/dist/api.js.map +1 -1
  5. package/dist/commands/auth/login.d.ts.map +1 -0
  6. package/dist/commands/{login.js → auth/login.js} +28 -4
  7. package/dist/commands/auth/login.js.map +1 -0
  8. package/dist/commands/auth/logout.d.ts +3 -0
  9. package/dist/commands/auth/logout.d.ts.map +1 -0
  10. package/dist/commands/auth/logout.js +26 -0
  11. package/dist/commands/auth/logout.js.map +1 -0
  12. package/dist/commands/auth/status.d.ts +8 -0
  13. package/dist/commands/auth/status.d.ts.map +1 -0
  14. package/dist/commands/auth/status.js +53 -0
  15. package/dist/commands/auth/status.js.map +1 -0
  16. package/dist/commands/auth/switch.d.ts +6 -0
  17. package/dist/commands/auth/switch.d.ts.map +1 -0
  18. package/dist/commands/auth/switch.js +42 -0
  19. package/dist/commands/auth/switch.js.map +1 -0
  20. package/dist/commands/auth/whoami.d.ts +2 -0
  21. package/dist/commands/auth/whoami.d.ts.map +1 -0
  22. package/dist/commands/auth/whoami.js +42 -0
  23. package/dist/commands/auth/whoami.js.map +1 -0
  24. package/dist/commands/checks/history.d.ts.map +1 -1
  25. package/dist/commands/checks/history.js +26 -8
  26. package/dist/commands/checks/history.js.map +1 -1
  27. package/dist/commands/checks/list.d.ts.map +1 -1
  28. package/dist/commands/checks/list.js +18 -3
  29. package/dist/commands/checks/list.js.map +1 -1
  30. package/dist/commands/checks/unsnooze.d.ts +4 -0
  31. package/dist/commands/checks/unsnooze.d.ts.map +1 -0
  32. package/dist/commands/checks/unsnooze.js +25 -0
  33. package/dist/commands/checks/unsnooze.js.map +1 -0
  34. package/dist/commands/connections/update.d.ts +13 -0
  35. package/dist/commands/connections/update.d.ts.map +1 -0
  36. package/dist/commands/connections/update.js +51 -0
  37. package/dist/commands/connections/update.js.map +1 -0
  38. package/dist/commands/email-groups/update.d.ts +12 -0
  39. package/dist/commands/email-groups/update.d.ts.map +1 -0
  40. package/dist/commands/email-groups/update.js +36 -0
  41. package/dist/commands/email-groups/update.js.map +1 -0
  42. package/dist/commands/plan.d.ts +9 -0
  43. package/dist/commands/plan.d.ts.map +1 -0
  44. package/dist/commands/plan.js +48 -0
  45. package/dist/commands/plan.js.map +1 -0
  46. package/dist/config.d.ts +57 -2
  47. package/dist/config.d.ts.map +1 -1
  48. package/dist/config.js +141 -5
  49. package/dist/config.js.map +1 -1
  50. package/dist/index.js +56 -7
  51. package/dist/index.js.map +1 -1
  52. package/dist/mcp.d.ts.map +1 -1
  53. package/dist/mcp.js +167 -7
  54. package/dist/mcp.js.map +1 -1
  55. package/package.json +1 -1
  56. package/dist/commands/login.d.ts.map +0 -1
  57. package/dist/commands/login.js.map +0 -1
  58. package/dist/commands/logout.d.ts +0 -2
  59. package/dist/commands/logout.d.ts.map +0 -1
  60. package/dist/commands/logout.js +0 -6
  61. package/dist/commands/logout.js.map +0 -1
  62. package/dist/commands/whoami.d.ts +0 -2
  63. package/dist/commands/whoami.d.ts.map +0 -1
  64. package/dist/commands/whoami.js +0 -13
  65. package/dist/commands/whoami.js.map +0 -1
  66. /package/dist/commands/{login.d.ts → auth/login.d.ts} +0 -0
@@ -16,8 +16,20 @@ export async function listChecks(opts = {}) {
16
16
  process.exit(1);
17
17
  }
18
18
  const checks = data.checks;
19
+ // Annotate each check with its current quiet state (snoozed / off-hours /
20
+ // calendar holiday) in one batch call so "what's silenced?" is answerable here.
21
+ const ids = checks.map((c) => c.ID).filter(Boolean);
22
+ const quietById = new Map();
23
+ if (ids.length) {
24
+ const q = await client.batchQuietStates(ids).catch(() => null);
25
+ for (const s of q?.states ?? [])
26
+ quietById.set(s.check_id, s);
27
+ }
19
28
  if (format === 'json') {
20
- printJson(checks);
29
+ printJson(checks.map((c) => {
30
+ const q = quietById.get(c.ID);
31
+ return q ? { ...c, quiet_now: q.quiet_now, quiet_reason: q.quiet_reason } : c;
32
+ }));
21
33
  return;
22
34
  }
23
35
  if (checks.length === 0) {
@@ -25,14 +37,17 @@ export async function listChecks(opts = {}) {
25
37
  return;
26
38
  }
27
39
  const nameWidth = Math.max(4, ...checks.map((c) => (c.Name ?? '').length));
28
- const header = `${'NAME'.padEnd(nameWidth)} ${'STATUS'.padEnd(10)} ${'INTERVAL'.padEnd(8)} ID`;
40
+ const idWidth = Math.max(2, ...checks.map((c) => c.ID.length));
41
+ const header = `${'NAME'.padEnd(nameWidth)} ${'STATUS'.padEnd(10)} ${'INTERVAL'.padEnd(8)} ${'ID'.padEnd(idWidth)} QUIET`;
29
42
  console.log(header);
30
43
  console.log('─'.repeat(header.length));
31
44
  for (const c of checks) {
32
45
  const name = c.Name ?? '(unnamed)';
33
46
  const status = c.LastStatus?.Valid ? c.LastStatus.CheckStatus : '—';
34
47
  const interval = c.Interval?.Valid ? formatInterval(c.Interval.CheckInterval) : '—';
35
- console.log(`${name.padEnd(nameWidth)} ${status.padEnd(10)} ${interval.padEnd(8)} ${c.ID}`);
48
+ const q = quietById.get(c.ID);
49
+ const quiet = q?.quiet_now ? (q.quiet_reason ? `yes — ${q.quiet_reason}` : 'yes') : '—';
50
+ console.log(`${name.padEnd(nameWidth)} ${status.padEnd(10)} ${interval.padEnd(8)} ${c.ID.padEnd(idWidth)} ${quiet}`);
36
51
  }
37
52
  }
38
53
  //# sourceMappingURL=list.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/checks/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,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE1D,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAA4B,EAAE;IAC7D,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACzC,MAAM,MAAM,GAAG,aAAa,EAAE,CAAA;IAC9B,UAAU,CAAC,MAAM,CAAC,CAAA;IAElB,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;IACnC,IAAI,IAAmD,CAAA;IACvD,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAA;IAClC,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;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;IAC1B,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,kBAAkB,CAAC,CAAA;QAC/B,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,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;IAC1E,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAA;IACjG,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,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,WAAW,CAAA;QAClC,MAAM,MAAM,GAAG,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAA;QACnE,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;QACnF,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAChG,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/checks/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,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE1D,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAA4B,EAAE;IAC7D,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACzC,MAAM,MAAM,GAAG,aAAa,EAAE,CAAA;IAC9B,UAAU,CAAC,MAAM,CAAC,CAAA;IAElB,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;IACnC,IAAI,IAAmD,CAAA;IACvD,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAA;IAClC,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;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;IAE1B,0EAA0E;IAC1E,gFAAgF;IAChF,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACnD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAyD,CAAA;IAClF,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACf,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;QAC9D,KAAK,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,IAAI,EAAE;YAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;IAC/D,CAAC;IAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,SAAS,CACP,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACf,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;YAC7B,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QAC/E,CAAC,CAAC,CACH,CAAA;QACD,OAAM;IACR,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;QAC/B,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,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;IAC1E,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IAC9D,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAA;IAC7H,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,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,WAAW,CAAA;QAClC,MAAM,MAAM,GAAG,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAA;QACnE,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;QACnF,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAC7B,MAAM,KAAK,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;QACvF,OAAO,CAAC,GAAG,CACT,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,KAAK,EAAE,CAC5G,CAAA;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function unsnoozeCheck(nameOrId: string, opts?: {
2
+ format?: string;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=unsnooze.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unsnooze.d.ts","sourceRoot":"","sources":["../../../src/commands/checks/unsnooze.ts"],"names":[],"mappings":"AAKA,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAC7B,OAAO,CAAC,IAAI,CAAC,CAsBf"}
@@ -0,0 +1,25 @@
1
+ import { createClient } from '../../api.js';
2
+ import { requireConfig, requireOrg } from '../../config.js';
3
+ import { printJson, resolveFormat } from '../../output.js';
4
+ import { resolveCheckId } from './resolve.js';
5
+ export async function unsnoozeCheck(nameOrId, opts = {}) {
6
+ const format = resolveFormat(opts.format);
7
+ const config = requireConfig();
8
+ requireOrg(config);
9
+ const client = createClient(config);
10
+ const id = await resolveCheckId(client, nameOrId);
11
+ let res;
12
+ try {
13
+ res = await client.unsnoozeCheck(id);
14
+ }
15
+ catch (err) {
16
+ console.error('Failed to unsnooze check:', err.message);
17
+ process.exit(1);
18
+ }
19
+ if (format === 'json') {
20
+ printJson(res);
21
+ return;
22
+ }
23
+ console.log(res.schedule ? `Unsnoozed. ${res.schedule.summary}` : 'Unsnoozed.');
24
+ }
25
+ //# sourceMappingURL=unsnooze.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unsnooze.js","sourceRoot":"","sources":["../../../src/commands/checks/unsnooze.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,cAAc,EAAE,MAAM,cAAc,CAAA;AAE7C,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,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;IAEnC,MAAM,EAAE,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IAEjD,IAAI,GAAqD,CAAA;IACzD,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;IACtC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAG,GAAa,CAAC,OAAO,CAAC,CAAA;QAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,SAAS,CAAC,GAAG,CAAC,CAAA;QACd,OAAM;IACR,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAA;AACjF,CAAC"}
@@ -0,0 +1,13 @@
1
+ export interface UpdateConnectionOptions {
2
+ name?: string;
3
+ type?: string;
4
+ /** New connection URI — e.g. after rotating the database password. */
5
+ uri?: string;
6
+ }
7
+ /**
8
+ * Update an existing connection — rotate its credentials (pass a new URI) or
9
+ * rename it. The new connection is re-tested before saving. The URI is encrypted
10
+ * server-side and never stored by the CLI.
11
+ */
12
+ export declare function updateConnection(nameOrId: string, opts: UpdateConnectionOptions): Promise<void>;
13
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/commands/connections/update.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,uBAAuB;IACtC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,sEAAsE;IACtE,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CAAC,IAAI,CAAC,CA8Cf"}
@@ -0,0 +1,51 @@
1
+ import { password } from '@inquirer/prompts';
2
+ import { createClient } from '../../api.js';
3
+ import { requireConfig, requireOrg } from '../../config.js';
4
+ import { isInteractive, requireValue } from '../../prompts.js';
5
+ import { resolveConnectionId } from './resolve.js';
6
+ const VALID_TYPES = ['postgres', 'postgresql', 'clickhouse'];
7
+ /**
8
+ * Update an existing connection — rotate its credentials (pass a new URI) or
9
+ * rename it. The new connection is re-tested before saving. The URI is encrypted
10
+ * server-side and never stored by the CLI.
11
+ */
12
+ export async function updateConnection(nameOrId, opts) {
13
+ const config = requireConfig();
14
+ requireOrg(config);
15
+ const client = createClient(config);
16
+ const id = await resolveConnectionId(client, nameOrId);
17
+ const current = (await client.listConnections()).connections.find((c) => c.id === id);
18
+ if (!current) {
19
+ console.error(`No connection "${nameOrId}".`);
20
+ process.exit(1);
21
+ }
22
+ const type = (opts.type ?? current.type).toLowerCase();
23
+ if (!VALID_TYPES.includes(type)) {
24
+ console.error(`Unsupported --type "${type}". Use postgres or clickhouse.`);
25
+ process.exit(1);
26
+ }
27
+ const connectionString = await requireValue(opts.uri, () => password({
28
+ message: 'New connection URI (hidden):',
29
+ mask: true,
30
+ validate: (v) => v.trim().length > 0 || 'Required',
31
+ }), 'New connection URI required. Pass --uri "postgres://user:pass@host:5432/db".');
32
+ if (!opts.uri && !isInteractive()) {
33
+ console.error('Pass --uri with the new connection string.');
34
+ process.exit(1);
35
+ }
36
+ console.log('Testing connection…');
37
+ try {
38
+ const resp = await client.upsertConnection({
39
+ id,
40
+ name: opts.name ?? current.name,
41
+ type,
42
+ connection_string: connectionString,
43
+ });
44
+ console.log(`Connection "${resp.connection.name}" updated (${resp.connection.id}).`);
45
+ }
46
+ catch (err) {
47
+ console.error('Failed to update connection:', err.message);
48
+ process.exit(1);
49
+ }
50
+ }
51
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/commands/connections/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAElD,MAAM,WAAW,GAAG,CAAC,UAAU,EAAE,YAAY,EAAE,YAAY,CAAC,CAAA;AAS5D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAgB,EAChB,IAA6B;IAE7B,MAAM,MAAM,GAAG,aAAa,EAAE,CAAA;IAC9B,UAAU,CAAC,MAAM,CAAC,CAAA;IAClB,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;IAEnC,MAAM,EAAE,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IACtD,MAAM,OAAO,GAAG,CAAC,MAAM,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;IACrF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,kBAAkB,QAAQ,IAAI,CAAC,CAAA;QAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAA;IACtD,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,uBAAuB,IAAI,gCAAgC,CAAC,CAAA;QAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,gBAAgB,GAAG,MAAM,YAAY,CACzC,IAAI,CAAC,GAAG,EACR,GAAG,EAAE,CACH,QAAQ,CAAC;QACP,OAAO,EAAE,8BAA8B;QACvC,IAAI,EAAE,IAAI;QACV,QAAQ,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU;KAC3D,CAAC,EACJ,8EAA8E,CAC/E,CAAA;IACD,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAA;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;IAClC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC;YACzC,EAAE;YACF,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI;YAC/B,IAAI;YACJ,iBAAiB,EAAE,gBAAgB;SACpC,CAAC,CAAA;QACF,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,UAAU,CAAC,IAAI,cAAc,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,CAAA;IACtF,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;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ export interface UpdateEmailGroupOptions {
2
+ name?: string;
3
+ description?: string;
4
+ autoAdd?: boolean;
5
+ }
6
+ /**
7
+ * Rename / re-describe an email group, or toggle auto-adding org members. The PUT
8
+ * endpoint replaces all fields, so we read the current group first and apply only
9
+ * the flags you pass. (Member addresses are managed with `email-groups add/remove`.)
10
+ */
11
+ export declare function updateEmailGroup(nameOrId: string, opts: UpdateEmailGroupOptions): Promise<void>;
12
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/commands/email-groups/update.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,uBAAuB;IACtC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CAAC,IAAI,CAAC,CA4Bf"}
@@ -0,0 +1,36 @@
1
+ import { createClient } from '../../api.js';
2
+ import { requireConfig, requireOrg } from '../../config.js';
3
+ import { resolveEmailGroupId } from './resolve.js';
4
+ /**
5
+ * Rename / re-describe an email group, or toggle auto-adding org members. The PUT
6
+ * endpoint replaces all fields, so we read the current group first and apply only
7
+ * the flags you pass. (Member addresses are managed with `email-groups add/remove`.)
8
+ */
9
+ export async function updateEmailGroup(nameOrId, opts) {
10
+ if (opts.name === undefined && opts.description === undefined && opts.autoAdd === undefined) {
11
+ console.error('Nothing to update. Pass --name, --description, or --auto-add / --no-auto-add.');
12
+ process.exit(1);
13
+ }
14
+ const config = requireConfig();
15
+ requireOrg(config);
16
+ const client = createClient(config);
17
+ const id = await resolveEmailGroupId(client, nameOrId);
18
+ const current = (await client.listEmailGroups()).groups.find((g) => g.id === id);
19
+ if (!current) {
20
+ console.error(`No email group "${nameOrId}".`);
21
+ process.exit(1);
22
+ }
23
+ try {
24
+ await client.updateEmailGroup(id, {
25
+ name: opts.name ?? current.name,
26
+ description: opts.description ?? current.description,
27
+ auto_add_members: opts.autoAdd ?? current.auto_add_members,
28
+ });
29
+ }
30
+ catch (err) {
31
+ console.error('Failed to update email group:', err.message);
32
+ process.exit(1);
33
+ }
34
+ console.log(`Updated email group ${id}.`);
35
+ }
36
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/commands/email-groups/update.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;AAQlD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAgB,EAChB,IAA6B;IAE7B,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC5F,OAAO,CAAC,KAAK,CAAC,+EAA+E,CAAC,CAAA;QAC9F,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;IAEnC,MAAM,EAAE,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IACtD,MAAM,OAAO,GAAG,CAAC,MAAM,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;IAChF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,mBAAmB,QAAQ,IAAI,CAAC,CAAA;QAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,gBAAgB,CAAC,EAAE,EAAE;YAChC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI;YAC/B,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW;YACpD,gBAAgB,EAAE,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,gBAAgB;SAC3D,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;IACD,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAA;AAC3C,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Show the linked org's plan and headroom: checks and data sources used vs their
3
+ * limits, the minimum check interval, and subscription status. Free orgs report
4
+ * the free plan (there's no subscription row).
5
+ */
6
+ export declare function showPlan(opts?: {
7
+ format?: string;
8
+ }): Promise<void>;
9
+ //# sourceMappingURL=plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAyC5E"}
@@ -0,0 +1,48 @@
1
+ import { createClient } from '../api.js';
2
+ import { requireConfig, requireOrg } from '../config.js';
3
+ import { printJson, resolveFormat } from '../output.js';
4
+ /**
5
+ * Show the linked org's plan and headroom: checks and data sources used vs their
6
+ * limits, the minimum check interval, and subscription status. Free orgs report
7
+ * the free plan (there's no subscription row).
8
+ */
9
+ export async function showPlan(opts = {}) {
10
+ const format = resolveFormat(opts.format);
11
+ const config = requireConfig();
12
+ requireOrg(config);
13
+ const client = createClient(config);
14
+ let sub;
15
+ let checks;
16
+ let connections;
17
+ try {
18
+ const [s, c, n] = await Promise.all([
19
+ client.getSubscription(),
20
+ client.listChecks(),
21
+ client.listConnections(),
22
+ ]);
23
+ sub = s;
24
+ checks = c.checks.length;
25
+ connections = n.connections.length;
26
+ }
27
+ catch (err) {
28
+ console.error('Failed to fetch plan:', err.message);
29
+ process.exit(1);
30
+ }
31
+ const summary = {
32
+ plan: sub.plan?.Name ?? 'unknown',
33
+ subscription_status: sub.subscription?.Status ?? 'free',
34
+ checks: { used: checks, limit: sub.plan?.MaxChecks },
35
+ data_sources: { used: connections, limit: sub.plan?.MaxConnections },
36
+ min_interval_minutes: sub.plan?.CheckIntervalMins,
37
+ };
38
+ if (format === 'json') {
39
+ printJson(summary);
40
+ return;
41
+ }
42
+ const lim = (n) => (n === undefined ? '∞' : String(n));
43
+ console.log(`Plan: ${summary.plan} (${summary.subscription_status})`);
44
+ console.log(`Checks: ${summary.checks.used} / ${lim(summary.checks.limit)}`);
45
+ console.log(`Data sources: ${summary.data_sources.used} / ${lim(summary.data_sources.limit)}`);
46
+ console.log(`Min interval: ${lim(summary.min_interval_minutes)} min`);
47
+ }
48
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACxD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAEvD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAA4B,EAAE;IAC3D,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,GAAuD,CAAA;IAC3D,IAAI,MAAc,CAAA;IAClB,IAAI,WAAmB,CAAA;IACvB,IAAI,CAAC;QACH,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAClC,MAAM,CAAC,eAAe,EAAE;YACxB,MAAM,CAAC,UAAU,EAAE;YACnB,MAAM,CAAC,eAAe,EAAE;SACzB,CAAC,CAAA;QACF,GAAG,GAAG,CAAC,CAAA;QACP,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAA;QACxB,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC,MAAM,CAAA;IACpC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAG,GAAa,CAAC,OAAO,CAAC,CAAA;QAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,OAAO,GAAG;QACd,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,IAAI,SAAS;QACjC,mBAAmB,EAAE,GAAG,CAAC,YAAY,EAAE,MAAM,IAAI,MAAM;QACvD,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE;QACpD,YAAY,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,cAAc,EAAE;QACpE,oBAAoB,EAAE,GAAG,CAAC,IAAI,EAAE,iBAAiB;KAClD,CAAA;IAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,SAAS,CAAC,OAAO,CAAC,CAAA;QAClB,OAAM;IACR,CAAC;IAED,MAAM,GAAG,GAAG,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IAC/D,OAAO,CAAC,GAAG,CAAC,kBAAkB,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,mBAAmB,GAAG,CAAC,CAAA;IAC9E,OAAO,CAAC,GAAG,CAAC,kBAAkB,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IACnF,OAAO,CAAC,GAAG,CAAC,kBAAkB,OAAO,CAAC,YAAY,CAAC,IAAI,MAAM,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAC/F,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,CAAC,OAAO,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAA;AACxE,CAAC"}
package/dist/config.d.ts CHANGED
@@ -1,9 +1,28 @@
1
- export interface Config {
1
+ /**
2
+ * One saved login. Accounts are keyed by their email in the config file;
3
+ * logins written by pre-multi-account CLI versions are keyed "default" until
4
+ * the email is learned (login/whoami re-key them automatically).
5
+ */
6
+ export interface Account {
2
7
  token: string;
3
- apiUrl?: string;
8
+ email?: string;
4
9
  organizationId?: string;
5
10
  organizationName?: string;
6
11
  }
12
+ /**
13
+ * The on-disk multi-account format (version 2). Older CLIs wrote a single
14
+ * flat Account; loadConfigFile migrates that shape transparently.
15
+ */
16
+ export interface ConfigFile {
17
+ version: 2;
18
+ activeAccount?: string;
19
+ accounts: Record<string, Account>;
20
+ }
21
+ /** The resolved view of the active account that commands consume. */
22
+ export interface Config extends Account {
23
+ apiUrl?: string;
24
+ }
25
+ export declare const LEGACY_ACCOUNT_KEY = "default";
7
26
  declare const DEFAULT_API_URL = "https://prod-neon-alertee-gru2.encr.app";
8
27
  declare const DEFAULT_WEB_URL = "https://app.alertee.app";
9
28
  /**
@@ -38,8 +57,44 @@ export declare function usingEnvToken(): boolean;
38
57
  * env token is used (the backend falls back to the user's default org).
39
58
  */
40
59
  export declare function requireOrg(config: Config): void;
60
+ /** Load the raw multi-account file, migrating the legacy flat shape in memory. */
61
+ export declare function loadConfigFile(): ConfigFile | null;
62
+ /**
63
+ * The account key commands operate on. Precedence: ALERTEE_ACCOUNT env var
64
+ * (pin a session or an MCP server config to one account) > activeAccount set
65
+ * by `alertee auth switch` > the only/first account.
66
+ */
67
+ export declare function activeAccountKey(file: ConfigFile | null): string | undefined;
68
+ /** Match an account by exact key/email (case-insensitive), else unique prefix. */
69
+ export declare function resolveAccountKey(file: ConfigFile, query: string): string | undefined;
70
+ /** The active account's settings, or null when no usable login is stored. */
41
71
  export declare function loadConfig(): Config | null;
72
+ /**
73
+ * Persist changes (org link, learned email, …) to the active account. Never
74
+ * writes apiUrl — resolveApiUrl() owns the URL from code/env.
75
+ */
42
76
  export declare function saveConfig(config: Config): void;
77
+ /**
78
+ * Save (or refresh) a login under its key and (by default) make it the active
79
+ * account. A re-login replaces the token but keeps the account's existing org
80
+ * link.
81
+ */
82
+ export declare function saveAccount(key: string, account: Account, opts?: {
83
+ activate?: boolean;
84
+ }): void;
85
+ /** Move an account to a new key (legacy "default" → its real email). */
86
+ export declare function renameAccount(oldKey: string, newKey: string): void;
87
+ export declare function setActiveAccount(key: string): void;
88
+ /**
89
+ * Remove one account. Returns the key that became active afterwards, or
90
+ * undefined when it was the last account (the file is cleared).
91
+ */
92
+ export declare function removeAccount(key: string): string | undefined;
93
+ export declare function listAccounts(): {
94
+ key: string;
95
+ account: Account;
96
+ active: boolean;
97
+ }[];
43
98
  export declare function clearConfig(): void;
44
99
  export declare function requireConfig(): Config;
45
100
  export { DEFAULT_API_URL, DEFAULT_WEB_URL };
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAA;IAGb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,QAAA,MAAM,eAAe,4CAA4C,CAAA;AACjE,QAAA,MAAM,eAAe,4BAA4B,CAAA;AAEjD;;;;;;;GAOG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,+DAA+D;AAC/D,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAEvE;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE1F;AAED,8EAA8E;AAC9E,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAK/C;AAED,wBAAgB,UAAU,IAAI,MAAM,GAAG,IAAI,CAO1C;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAG/C;AAED,wBAAgB,WAAW,IAAI,IAAI,CAIlC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAQtC;AAED,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,CAAA"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAOA;;;;GAIG;AACH,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,CAAC,CAAA;IACV,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAClC;AAED,qEAAqE;AACrE,MAAM,WAAW,MAAO,SAAQ,OAAO;IAGrC,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,eAAO,MAAM,kBAAkB,YAAY,CAAA;AAE3C,QAAA,MAAM,eAAe,4CAA4C,CAAA;AACjE,QAAA,MAAM,eAAe,4BAA4B,CAAA;AAEjD;;;;;;;GAOG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,+DAA+D;AAC/D,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAEvE;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE1F;AAED,8EAA8E;AAC9E,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAK/C;AAED,kFAAkF;AAClF,wBAAgB,cAAc,IAAI,UAAU,GAAG,IAAI,CA4BlD;AAOD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAM5E;AAED,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CASrF;AAED,6EAA6E;AAC7E,wBAAgB,UAAU,IAAI,MAAM,GAAG,IAAI,CAM1C;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAO/C;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,OAAO,EAChB,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,GAChC,IAAI,CAKN;AAED,wEAAwE;AACxE,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAOlE;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAKlD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAa7D;AAED,wBAAgB,YAAY,IAAI;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,EAAE,CASnF;AAED,wBAAgB,WAAW,IAAI,IAAI,CAIlC;AAED,wBAAgB,aAAa,IAAI,MAAM,CActC;AAED,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,CAAA"}
package/dist/config.js CHANGED
@@ -3,6 +3,7 @@ import { homedir } from 'node:os';
3
3
  import { join } from 'node:path';
4
4
  const CONFIG_DIR = join(homedir(), '.config', 'alertee');
5
5
  const CONFIG_PATH = join(CONFIG_DIR, 'config.json');
6
+ export const LEGACY_ACCOUNT_KEY = 'default';
6
7
  const DEFAULT_API_URL = 'https://prod-neon-alertee-gru2.encr.app';
7
8
  const DEFAULT_WEB_URL = 'https://app.alertee.app';
8
9
  /**
@@ -52,19 +53,149 @@ export function requireOrg(config) {
52
53
  process.exit(1);
53
54
  }
54
55
  }
55
- export function loadConfig() {
56
+ /** Load the raw multi-account file, migrating the legacy flat shape in memory. */
57
+ export function loadConfigFile() {
56
58
  if (!existsSync(CONFIG_PATH))
57
59
  return null;
60
+ let raw;
58
61
  try {
59
- return JSON.parse(readFileSync(CONFIG_PATH, 'utf8'));
62
+ raw = JSON.parse(readFileSync(CONFIG_PATH, 'utf8'));
60
63
  }
61
64
  catch {
62
65
  return null;
63
66
  }
67
+ if (!raw || typeof raw !== 'object')
68
+ return null;
69
+ const obj = raw;
70
+ if (obj.version === 2 && obj.accounts && typeof obj.accounts === 'object') {
71
+ return obj;
72
+ }
73
+ // Legacy flat shape: { token, organizationId?, organizationName? }
74
+ if (typeof obj.token === 'string' && obj.token) {
75
+ return {
76
+ version: 2,
77
+ activeAccount: LEGACY_ACCOUNT_KEY,
78
+ accounts: {
79
+ [LEGACY_ACCOUNT_KEY]: {
80
+ token: obj.token,
81
+ organizationId: obj.organizationId,
82
+ organizationName: obj.organizationName,
83
+ },
84
+ },
85
+ };
86
+ }
87
+ return null;
64
88
  }
65
- export function saveConfig(config) {
89
+ function saveConfigFile(file) {
66
90
  mkdirSync(CONFIG_DIR, { recursive: true });
67
- writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2), 'utf8');
91
+ writeFileSync(CONFIG_PATH, JSON.stringify(file, null, 2), 'utf8');
92
+ }
93
+ /**
94
+ * The account key commands operate on. Precedence: ALERTEE_ACCOUNT env var
95
+ * (pin a session or an MCP server config to one account) > activeAccount set
96
+ * by `alertee auth switch` > the only/first account.
97
+ */
98
+ export function activeAccountKey(file) {
99
+ if (!file)
100
+ return undefined;
101
+ const env = process.env.ALERTEE_ACCOUNT;
102
+ if (env)
103
+ return resolveAccountKey(file, env);
104
+ if (file.activeAccount && file.accounts[file.activeAccount])
105
+ return file.activeAccount;
106
+ return Object.keys(file.accounts)[0];
107
+ }
108
+ /** Match an account by exact key/email (case-insensitive), else unique prefix. */
109
+ export function resolveAccountKey(file, query) {
110
+ const keys = Object.keys(file.accounts);
111
+ const q = query.toLowerCase();
112
+ const exact = keys.find((k) => k.toLowerCase() === q || file.accounts[k].email?.toLowerCase() === q);
113
+ if (exact)
114
+ return exact;
115
+ const prefixed = keys.filter((k) => k.toLowerCase().startsWith(q));
116
+ return prefixed.length === 1 ? prefixed[0] : undefined;
117
+ }
118
+ /** The active account's settings, or null when no usable login is stored. */
119
+ export function loadConfig() {
120
+ const file = loadConfigFile();
121
+ if (!file)
122
+ return null;
123
+ const key = activeAccountKey(file);
124
+ const account = key ? file.accounts[key] : undefined;
125
+ return account ? { ...account } : null;
126
+ }
127
+ /**
128
+ * Persist changes (org link, learned email, …) to the active account. Never
129
+ * writes apiUrl — resolveApiUrl() owns the URL from code/env.
130
+ */
131
+ export function saveConfig(config) {
132
+ const { apiUrl: _ignored, ...account } = config;
133
+ const file = loadConfigFile() ?? { version: 2, accounts: {} };
134
+ const key = activeAccountKey(file) ?? account.email ?? LEGACY_ACCOUNT_KEY;
135
+ file.accounts[key] = { ...file.accounts[key], ...account };
136
+ if (!file.activeAccount || !file.accounts[file.activeAccount])
137
+ file.activeAccount = key;
138
+ saveConfigFile(file);
139
+ }
140
+ /**
141
+ * Save (or refresh) a login under its key and (by default) make it the active
142
+ * account. A re-login replaces the token but keeps the account's existing org
143
+ * link.
144
+ */
145
+ export function saveAccount(key, account, opts = {}) {
146
+ const file = loadConfigFile() ?? { version: 2, accounts: {} };
147
+ file.accounts[key] = { ...file.accounts[key], ...account };
148
+ if (opts.activate !== false)
149
+ file.activeAccount = key;
150
+ saveConfigFile(file);
151
+ }
152
+ /** Move an account to a new key (legacy "default" → its real email). */
153
+ export function renameAccount(oldKey, newKey) {
154
+ const file = loadConfigFile();
155
+ if (!file || !file.accounts[oldKey] || oldKey === newKey)
156
+ return;
157
+ file.accounts[newKey] = { ...file.accounts[newKey], ...file.accounts[oldKey] };
158
+ delete file.accounts[oldKey];
159
+ if (file.activeAccount === oldKey)
160
+ file.activeAccount = newKey;
161
+ saveConfigFile(file);
162
+ }
163
+ export function setActiveAccount(key) {
164
+ const file = loadConfigFile();
165
+ if (!file || !file.accounts[key])
166
+ return;
167
+ file.activeAccount = key;
168
+ saveConfigFile(file);
169
+ }
170
+ /**
171
+ * Remove one account. Returns the key that became active afterwards, or
172
+ * undefined when it was the last account (the file is cleared).
173
+ */
174
+ export function removeAccount(key) {
175
+ const file = loadConfigFile();
176
+ if (!file)
177
+ return undefined;
178
+ delete file.accounts[key];
179
+ if (Object.keys(file.accounts).length === 0) {
180
+ clearConfig();
181
+ return undefined;
182
+ }
183
+ if (!file.activeAccount || !file.accounts[file.activeAccount]) {
184
+ file.activeAccount = Object.keys(file.accounts)[0];
185
+ }
186
+ saveConfigFile(file);
187
+ return file.activeAccount;
188
+ }
189
+ export function listAccounts() {
190
+ const file = loadConfigFile();
191
+ if (!file)
192
+ return [];
193
+ const active = activeAccountKey(file);
194
+ return Object.entries(file.accounts).map(([key, account]) => ({
195
+ key,
196
+ account,
197
+ active: key === active,
198
+ }));
68
199
  }
69
200
  export function clearConfig() {
70
201
  if (existsSync(CONFIG_PATH)) {
@@ -75,7 +206,12 @@ export function requireConfig() {
75
206
  const config = loadConfig();
76
207
  const token = resolveToken(config);
77
208
  if (!token) {
78
- console.error('Not logged in. Run: alertee login');
209
+ if (process.env.ALERTEE_ACCOUNT) {
210
+ console.error(`No account matching ALERTEE_ACCOUNT="${process.env.ALERTEE_ACCOUNT}". Run: alertee auth status`);
211
+ }
212
+ else {
213
+ console.error('Not logged in. Run: alertee login');
214
+ }
79
215
  process.exit(1);
80
216
  }
81
217
  return { ...config, token, apiUrl: resolveApiUrl() };
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}