@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.
- package/dist/api.d.ts +61 -0
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +20 -0
- package/dist/api.js.map +1 -1
- package/dist/commands/auth/login.d.ts.map +1 -0
- package/dist/commands/{login.js → auth/login.js} +28 -4
- package/dist/commands/auth/login.js.map +1 -0
- package/dist/commands/auth/logout.d.ts +3 -0
- package/dist/commands/auth/logout.d.ts.map +1 -0
- package/dist/commands/auth/logout.js +26 -0
- package/dist/commands/auth/logout.js.map +1 -0
- package/dist/commands/auth/status.d.ts +8 -0
- package/dist/commands/auth/status.d.ts.map +1 -0
- package/dist/commands/auth/status.js +53 -0
- package/dist/commands/auth/status.js.map +1 -0
- package/dist/commands/auth/switch.d.ts +6 -0
- package/dist/commands/auth/switch.d.ts.map +1 -0
- package/dist/commands/auth/switch.js +42 -0
- package/dist/commands/auth/switch.js.map +1 -0
- package/dist/commands/auth/whoami.d.ts +2 -0
- package/dist/commands/auth/whoami.d.ts.map +1 -0
- package/dist/commands/auth/whoami.js +42 -0
- package/dist/commands/auth/whoami.js.map +1 -0
- package/dist/commands/checks/history.d.ts.map +1 -1
- package/dist/commands/checks/history.js +26 -8
- package/dist/commands/checks/history.js.map +1 -1
- package/dist/commands/checks/list.d.ts.map +1 -1
- package/dist/commands/checks/list.js +18 -3
- package/dist/commands/checks/list.js.map +1 -1
- package/dist/commands/checks/unsnooze.d.ts +4 -0
- package/dist/commands/checks/unsnooze.d.ts.map +1 -0
- package/dist/commands/checks/unsnooze.js +25 -0
- package/dist/commands/checks/unsnooze.js.map +1 -0
- package/dist/commands/connections/update.d.ts +13 -0
- package/dist/commands/connections/update.d.ts.map +1 -0
- package/dist/commands/connections/update.js +51 -0
- package/dist/commands/connections/update.js.map +1 -0
- package/dist/commands/email-groups/update.d.ts +12 -0
- package/dist/commands/email-groups/update.d.ts.map +1 -0
- package/dist/commands/email-groups/update.js +36 -0
- package/dist/commands/email-groups/update.js.map +1 -0
- package/dist/commands/plan.d.ts +9 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +48 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/config.d.ts +57 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +141 -5
- package/dist/config.js.map +1 -1
- package/dist/index.js +56 -7
- package/dist/index.js.map +1 -1
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +167 -7
- package/dist/mcp.js.map +1 -1
- package/package.json +1 -1
- package/dist/commands/login.d.ts.map +0 -1
- package/dist/commands/login.js.map +0 -1
- package/dist/commands/logout.d.ts +0 -2
- package/dist/commands/logout.d.ts.map +0 -1
- package/dist/commands/logout.js +0 -6
- package/dist/commands/logout.js.map +0 -1
- package/dist/commands/whoami.d.ts +0 -2
- package/dist/commands/whoami.d.ts.map +0 -1
- package/dist/commands/whoami.js +0 -13
- package/dist/commands/whoami.js.map +0 -1
- /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
|
|
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
|
-
|
|
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;
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/checks/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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 };
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
89
|
+
function saveConfigFile(file) {
|
|
66
90
|
mkdirSync(CONFIG_DIR, { recursive: true });
|
|
67
|
-
writeFileSync(CONFIG_PATH, JSON.stringify(
|
|
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
|
-
|
|
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() };
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC5E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,CAAA;AACxD,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|