@revealui/mcp 0.1.0 → 0.1.3
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/LICENSE +22 -0
- package/LICENSE.commercial +111 -0
- package/README.md +3 -0
- package/dist/{packages/mcp/src/adapters → adapters}/db.d.ts +1 -1
- package/dist/adapters/db.d.ts.map +1 -0
- package/dist/adapters/db.js.map +1 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js.map +1 -0
- package/dist/contracts.d.ts.map +1 -0
- package/dist/contracts.js.map +1 -0
- package/dist/{packages/mcp/src/hypervisor.d.ts → hypervisor.d.ts} +56 -0
- package/dist/hypervisor.d.ts.map +1 -0
- package/dist/{packages/mcp/src/hypervisor.js → hypervisor.js} +209 -1
- package/dist/hypervisor.js.map +1 -0
- package/dist/{packages/mcp/src/index.d.ts → index.d.ts} +9 -5
- package/dist/index.d.ts.map +1 -0
- package/dist/{packages/mcp/src/index.js → index.js} +8 -4
- package/dist/index.js.map +1 -0
- package/dist/{packages/mcp/src/servers → servers}/adapter.d.ts +11 -1
- package/dist/servers/adapter.d.ts.map +1 -0
- package/dist/{packages/mcp/src/servers → servers}/adapter.js +20 -4
- package/dist/servers/adapter.js.map +1 -0
- package/dist/servers/revealui-content.d.ts +21 -0
- package/dist/servers/revealui-content.d.ts.map +1 -0
- package/dist/servers/revealui-content.js +211 -0
- package/dist/servers/revealui-content.js.map +1 -0
- package/dist/servers/revealui-email.d.ts +18 -0
- package/dist/servers/revealui-email.d.ts.map +1 -0
- package/dist/servers/revealui-email.js +190 -0
- package/dist/servers/revealui-email.js.map +1 -0
- package/dist/servers/revealui-stripe.d.ts +19 -0
- package/dist/servers/revealui-stripe.d.ts.map +1 -0
- package/dist/servers/revealui-stripe.js +228 -0
- package/dist/servers/revealui-stripe.js.map +1 -0
- package/package.json +50 -11
- package/.env.example +0 -9
- package/MCP_MAINTENANCE.md +0 -265
- package/__tests__/crdt.integration.test.ts +0 -156
- package/configs/README.md +0 -77
- package/configs/claude-template.json +0 -54
- package/dist/packages/core/src/database/ssl-config.d.ts +0 -9
- package/dist/packages/core/src/database/ssl-config.d.ts.map +0 -1
- package/dist/packages/core/src/database/ssl-config.js +0 -8
- package/dist/packages/core/src/database/ssl-config.js.map +0 -1
- package/dist/packages/core/src/features.d.ts +0 -86
- package/dist/packages/core/src/features.d.ts.map +0 -1
- package/dist/packages/core/src/features.js +0 -93
- package/dist/packages/core/src/features.js.map +0 -1
- package/dist/packages/core/src/license.d.ts +0 -75
- package/dist/packages/core/src/license.d.ts.map +0 -1
- package/dist/packages/core/src/license.js +0 -174
- package/dist/packages/core/src/license.js.map +0 -1
- package/dist/packages/core/src/monitoring/alerts.d.ts +0 -118
- package/dist/packages/core/src/monitoring/alerts.d.ts.map +0 -1
- package/dist/packages/core/src/monitoring/alerts.js +0 -325
- package/dist/packages/core/src/monitoring/alerts.js.map +0 -1
- package/dist/packages/core/src/monitoring/cleanup-manager.d.ts +0 -71
- package/dist/packages/core/src/monitoring/cleanup-manager.d.ts.map +0 -1
- package/dist/packages/core/src/monitoring/cleanup-manager.js +0 -227
- package/dist/packages/core/src/monitoring/cleanup-manager.js.map +0 -1
- package/dist/packages/core/src/monitoring/health-monitor.d.ts +0 -22
- package/dist/packages/core/src/monitoring/health-monitor.d.ts.map +0 -1
- package/dist/packages/core/src/monitoring/health-monitor.js +0 -143
- package/dist/packages/core/src/monitoring/health-monitor.js.map +0 -1
- package/dist/packages/core/src/monitoring/index.d.ts +0 -14
- package/dist/packages/core/src/monitoring/index.d.ts.map +0 -1
- package/dist/packages/core/src/monitoring/index.js +0 -18
- package/dist/packages/core/src/monitoring/index.js.map +0 -1
- package/dist/packages/core/src/monitoring/process-registry.d.ts +0 -97
- package/dist/packages/core/src/monitoring/process-registry.d.ts.map +0 -1
- package/dist/packages/core/src/monitoring/process-registry.js +0 -223
- package/dist/packages/core/src/monitoring/process-registry.js.map +0 -1
- package/dist/packages/core/src/monitoring/types.d.ts +0 -231
- package/dist/packages/core/src/monitoring/types.d.ts.map +0 -1
- package/dist/packages/core/src/monitoring/types.js +0 -43
- package/dist/packages/core/src/monitoring/types.js.map +0 -1
- package/dist/packages/core/src/monitoring/zombie-detector.d.ts +0 -81
- package/dist/packages/core/src/monitoring/zombie-detector.d.ts.map +0 -1
- package/dist/packages/core/src/monitoring/zombie-detector.js +0 -232
- package/dist/packages/core/src/monitoring/zombie-detector.js.map +0 -1
- package/dist/packages/core/src/observability/logger.d.ts +0 -47
- package/dist/packages/core/src/observability/logger.d.ts.map +0 -1
- package/dist/packages/core/src/observability/logger.js +0 -141
- package/dist/packages/core/src/observability/logger.js.map +0 -1
- package/dist/packages/core/src/utils/logger-server.d.ts +0 -32
- package/dist/packages/core/src/utils/logger-server.d.ts.map +0 -1
- package/dist/packages/core/src/utils/logger-server.js +0 -69
- package/dist/packages/core/src/utils/logger-server.js.map +0 -1
- package/dist/packages/core/src/utils/request-context.d.ts +0 -143
- package/dist/packages/core/src/utils/request-context.d.ts.map +0 -1
- package/dist/packages/core/src/utils/request-context.js +0 -169
- package/dist/packages/core/src/utils/request-context.js.map +0 -1
- package/dist/packages/dev/src/code-validator/index.d.ts +0 -20
- package/dist/packages/dev/src/code-validator/index.d.ts.map +0 -1
- package/dist/packages/dev/src/code-validator/index.js +0 -20
- package/dist/packages/dev/src/code-validator/index.js.map +0 -1
- package/dist/packages/dev/src/code-validator/types.d.ts +0 -67
- package/dist/packages/dev/src/code-validator/types.d.ts.map +0 -1
- package/dist/packages/dev/src/code-validator/types.js +0 -7
- package/dist/packages/dev/src/code-validator/types.js.map +0 -1
- package/dist/packages/dev/src/code-validator/validator.d.ts +0 -48
- package/dist/packages/dev/src/code-validator/validator.d.ts.map +0 -1
- package/dist/packages/dev/src/code-validator/validator.js +0 -176
- package/dist/packages/dev/src/code-validator/validator.js.map +0 -1
- package/dist/packages/mcp/src/adapters/db.d.ts.map +0 -1
- package/dist/packages/mcp/src/adapters/db.js.map +0 -1
- package/dist/packages/mcp/src/config/index.d.ts.map +0 -1
- package/dist/packages/mcp/src/config/index.js.map +0 -1
- package/dist/packages/mcp/src/contracts.d.ts.map +0 -1
- package/dist/packages/mcp/src/contracts.js.map +0 -1
- package/dist/packages/mcp/src/hypervisor.d.ts.map +0 -1
- package/dist/packages/mcp/src/hypervisor.js.map +0 -1
- package/dist/packages/mcp/src/index.d.ts.map +0 -1
- package/dist/packages/mcp/src/index.js.map +0 -1
- package/dist/packages/mcp/src/servers/adapter.d.ts.map +0 -1
- package/dist/packages/mcp/src/servers/adapter.js.map +0 -1
- package/dist/packages/mcp/src/servers/code-validator.d.ts +0 -24
- package/dist/packages/mcp/src/servers/code-validator.d.ts.map +0 -1
- package/dist/packages/mcp/src/servers/code-validator.js +0 -156
- package/dist/packages/mcp/src/servers/code-validator.js.map +0 -1
- package/dist/packages/mcp/src/servers/neon.d.ts +0 -11
- package/dist/packages/mcp/src/servers/neon.d.ts.map +0 -1
- package/dist/packages/mcp/src/servers/neon.js +0 -90
- package/dist/packages/mcp/src/servers/neon.js.map +0 -1
- package/dist/packages/mcp/src/servers/next-devtools.d.ts +0 -11
- package/dist/packages/mcp/src/servers/next-devtools.d.ts.map +0 -1
- package/dist/packages/mcp/src/servers/next-devtools.js +0 -215
- package/dist/packages/mcp/src/servers/next-devtools.js.map +0 -1
- package/dist/packages/mcp/src/servers/playwright.d.ts +0 -11
- package/dist/packages/mcp/src/servers/playwright.d.ts.map +0 -1
- package/dist/packages/mcp/src/servers/playwright.js +0 -68
- package/dist/packages/mcp/src/servers/playwright.js.map +0 -1
- package/dist/packages/mcp/src/servers/stripe.d.ts +0 -11
- package/dist/packages/mcp/src/servers/stripe.d.ts.map +0 -1
- package/dist/packages/mcp/src/servers/stripe.js +0 -86
- package/dist/packages/mcp/src/servers/stripe.js.map +0 -1
- package/dist/packages/mcp/src/servers/supabase.d.ts +0 -11
- package/dist/packages/mcp/src/servers/supabase.d.ts.map +0 -1
- package/dist/packages/mcp/src/servers/supabase.js +0 -144
- package/dist/packages/mcp/src/servers/supabase.js.map +0 -1
- package/dist/packages/mcp/src/servers/vercel.d.ts +0 -11
- package/dist/packages/mcp/src/servers/vercel.d.ts.map +0 -1
- package/dist/packages/mcp/src/servers/vercel.js +0 -87
- package/dist/packages/mcp/src/servers/vercel.js.map +0 -1
- package/dist/packages/mcp/src/servers/vultr-test.d.ts +0 -3
- package/dist/packages/mcp/src/servers/vultr-test.d.ts.map +0 -1
- package/dist/packages/mcp/src/servers/vultr-test.js +0 -82
- package/dist/packages/mcp/src/servers/vultr-test.js.map +0 -1
- package/dist/scripts/lib/analyzers/console-analyzer.d.ts +0 -188
- package/dist/scripts/lib/analyzers/console-analyzer.d.ts.map +0 -1
- package/dist/scripts/lib/analyzers/console-analyzer.js +0 -432
- package/dist/scripts/lib/analyzers/console-analyzer.js.map +0 -1
- package/dist/scripts/lib/analyzers/index.d.ts +0 -11
- package/dist/scripts/lib/analyzers/index.d.ts.map +0 -1
- package/dist/scripts/lib/analyzers/index.js +0 -11
- package/dist/scripts/lib/analyzers/index.js.map +0 -1
- package/dist/scripts/lib/args.d.ts +0 -104
- package/dist/scripts/lib/args.d.ts.map +0 -1
- package/dist/scripts/lib/args.js +0 -304
- package/dist/scripts/lib/args.js.map +0 -1
- package/dist/scripts/lib/cache.d.ts +0 -185
- package/dist/scripts/lib/cache.d.ts.map +0 -1
- package/dist/scripts/lib/cache.js +0 -390
- package/dist/scripts/lib/cache.js.map +0 -1
- package/dist/scripts/lib/cli/dispatch.d.ts +0 -116
- package/dist/scripts/lib/cli/dispatch.d.ts.map +0 -1
- package/dist/scripts/lib/cli/dispatch.js +0 -206
- package/dist/scripts/lib/cli/dispatch.js.map +0 -1
- package/dist/scripts/lib/cli/index.d.ts +0 -10
- package/dist/scripts/lib/cli/index.d.ts.map +0 -1
- package/dist/scripts/lib/cli/index.js +0 -10
- package/dist/scripts/lib/cli/index.js.map +0 -1
- package/dist/scripts/lib/database/ssl-config.d.ts +0 -26
- package/dist/scripts/lib/database/ssl-config.d.ts.map +0 -1
- package/dist/scripts/lib/database/ssl-config.js +0 -47
- package/dist/scripts/lib/database/ssl-config.js.map +0 -1
- package/dist/scripts/lib/errors.d.ts +0 -218
- package/dist/scripts/lib/errors.d.ts.map +0 -1
- package/dist/scripts/lib/errors.js +0 -543
- package/dist/scripts/lib/errors.js.map +0 -1
- package/dist/scripts/lib/exec.d.ts +0 -107
- package/dist/scripts/lib/exec.d.ts.map +0 -1
- package/dist/scripts/lib/exec.js +0 -232
- package/dist/scripts/lib/exec.js.map +0 -1
- package/dist/scripts/lib/index.d.ts +0 -50
- package/dist/scripts/lib/index.d.ts.map +0 -1
- package/dist/scripts/lib/index.js +0 -65
- package/dist/scripts/lib/index.js.map +0 -1
- package/dist/scripts/lib/logger.d.ts +0 -50
- package/dist/scripts/lib/logger.d.ts.map +0 -1
- package/dist/scripts/lib/logger.js +0 -159
- package/dist/scripts/lib/logger.js.map +0 -1
- package/dist/scripts/lib/output.d.ts +0 -149
- package/dist/scripts/lib/output.d.ts.map +0 -1
- package/dist/scripts/lib/output.js +0 -263
- package/dist/scripts/lib/output.js.map +0 -1
- package/dist/scripts/lib/parallel.d.ts +0 -164
- package/dist/scripts/lib/parallel.d.ts.map +0 -1
- package/dist/scripts/lib/parallel.js +0 -355
- package/dist/scripts/lib/parallel.js.map +0 -1
- package/dist/scripts/lib/paths.d.ts +0 -92
- package/dist/scripts/lib/paths.d.ts.map +0 -1
- package/dist/scripts/lib/paths.js +0 -171
- package/dist/scripts/lib/paths.js.map +0 -1
- package/dist/scripts/lib/state/adapters/memory.d.ts +0 -42
- package/dist/scripts/lib/state/adapters/memory.d.ts.map +0 -1
- package/dist/scripts/lib/state/adapters/memory.js +0 -110
- package/dist/scripts/lib/state/adapters/memory.js.map +0 -1
- package/dist/scripts/lib/state/adapters/pglite.d.ts +0 -46
- package/dist/scripts/lib/state/adapters/pglite.d.ts.map +0 -1
- package/dist/scripts/lib/state/adapters/pglite.js +0 -256
- package/dist/scripts/lib/state/adapters/pglite.js.map +0 -1
- package/dist/scripts/lib/state/index.d.ts +0 -16
- package/dist/scripts/lib/state/index.d.ts.map +0 -1
- package/dist/scripts/lib/state/index.js +0 -16
- package/dist/scripts/lib/state/index.js.map +0 -1
- package/dist/scripts/lib/state/types.d.ts +0 -111
- package/dist/scripts/lib/state/types.d.ts.map +0 -1
- package/dist/scripts/lib/state/types.js +0 -8
- package/dist/scripts/lib/state/types.js.map +0 -1
- package/dist/scripts/lib/state/workflow-state.d.ts +0 -110
- package/dist/scripts/lib/state/workflow-state.d.ts.map +0 -1
- package/dist/scripts/lib/state/workflow-state.js +0 -331
- package/dist/scripts/lib/state/workflow-state.js.map +0 -1
- package/dist/scripts/lib/telemetry.d.ts +0 -194
- package/dist/scripts/lib/telemetry.d.ts.map +0 -1
- package/dist/scripts/lib/telemetry.js +0 -394
- package/dist/scripts/lib/telemetry.js.map +0 -1
- package/dist/scripts/lib/utils.d.ts +0 -270
- package/dist/scripts/lib/utils.d.ts.map +0 -1
- package/dist/scripts/lib/utils.js +0 -473
- package/dist/scripts/lib/utils.js.map +0 -1
- package/dist/scripts/lib/validation/database.d.ts +0 -83
- package/dist/scripts/lib/validation/database.d.ts.map +0 -1
- package/dist/scripts/lib/validation/database.js +0 -199
- package/dist/scripts/lib/validation/database.js.map +0 -1
- package/dist/scripts/lib/validation/env.d.ts +0 -80
- package/dist/scripts/lib/validation/env.d.ts.map +0 -1
- package/dist/scripts/lib/validation/env.js +0 -246
- package/dist/scripts/lib/validation/env.js.map +0 -1
- package/dist/scripts/lib/validation/index.d.ts +0 -16
- package/dist/scripts/lib/validation/index.d.ts.map +0 -1
- package/dist/scripts/lib/validation/index.js +0 -16
- package/dist/scripts/lib/validation/index.js.map +0 -1
- package/dist/scripts/lib/validation/post-execution.d.ts +0 -74
- package/dist/scripts/lib/validation/post-execution.d.ts.map +0 -1
- package/dist/scripts/lib/validation/post-execution.js +0 -110
- package/dist/scripts/lib/validation/post-execution.js.map +0 -1
- package/dist/scripts/lib/validation/pre-execution.d.ts +0 -165
- package/dist/scripts/lib/validation/pre-execution.d.ts.map +0 -1
- package/dist/scripts/lib/validation/pre-execution.js +0 -466
- package/dist/scripts/lib/validation/pre-execution.js.map +0 -1
- package/dist/scripts/lib/validators/documentation-validator.d.ts +0 -242
- package/dist/scripts/lib/validators/documentation-validator.d.ts.map +0 -1
- package/dist/scripts/lib/validators/documentation-validator.js +0 -584
- package/dist/scripts/lib/validators/documentation-validator.js.map +0 -1
- package/dist/scripts/lib/validators/index.d.ts +0 -11
- package/dist/scripts/lib/validators/index.d.ts.map +0 -1
- package/dist/scripts/lib/validators/index.js +0 -11
- package/dist/scripts/lib/validators/index.js.map +0 -1
- package/docker-compose.yml +0 -46
- package/docs/INDEX.md +0 -88
- package/docs/README.md +0 -774
- package/docs/SETUP.md +0 -264
- package/docs/servers/code-validator.md +0 -586
- package/eslint.config.js +0 -7
- package/migrations/0001_add_crdt_columns.sql +0 -8
- package/migrations/0001_rollback.sql +0 -6
- package/migrations/005_performance_indexes.sql +0 -190
- package/migrations/backfill_crdt_meta.js +0 -45
- package/src/__tests__/hypervisor.test.ts +0 -212
- package/src/adapters/db.ts +0 -180
- package/src/config/config.json +0 -49
- package/src/config/index.ts +0 -30
- package/src/contracts.ts +0 -221
- package/src/hypervisor.ts +0 -464
- package/src/index.ts +0 -87
- package/src/servers/adapter.ts +0 -643
- package/src/servers/code-validator.ts +0 -188
- package/src/servers/neon.ts +0 -103
- package/src/servers/next-devtools.ts +0 -230
- package/src/servers/playwright.ts +0 -77
- package/src/servers/stripe.ts +0 -99
- package/src/servers/supabase.ts +0 -161
- package/src/servers/vercel.ts +0 -100
- package/src/servers/vultr-test.ts +0 -97
- package/tsconfig.json +0 -12
- package/vitest.config.ts +0 -22
- /package/dist/{packages/mcp/src/adapters → adapters}/db.js +0 -0
- /package/dist/{packages/mcp/src/config → config}/index.d.ts +0 -0
- /package/dist/{packages/mcp/src/config → config}/index.js +0 -0
- /package/dist/{packages/mcp/src/contracts.d.ts → contracts.d.ts} +0 -0
- /package/dist/{packages/mcp/src/contracts.js → contracts.js} +0 -0
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* License validation for RevealUI Pro/Enterprise tiers.
|
|
3
|
-
*
|
|
4
|
-
* @dependencies
|
|
5
|
-
* - jose - JWT token verification (Web Crypto API)
|
|
6
|
-
* - zod - Schema validation for license payloads
|
|
7
|
-
*/
|
|
8
|
-
import { importPKCS8, importSPKI, jwtVerify, SignJWT } from 'jose';
|
|
9
|
-
import { z } from 'zod';
|
|
10
|
-
/** Decoded license payload schema */
|
|
11
|
-
const licensePayloadSchema = z.object({
|
|
12
|
-
/** License tier */
|
|
13
|
-
tier: z.enum(['pro', 'max', 'enterprise']),
|
|
14
|
-
/** Organization or customer ID */
|
|
15
|
-
customerId: z.string(),
|
|
16
|
-
/** Licensed domain(s) */
|
|
17
|
-
domains: z.array(z.string()).optional(),
|
|
18
|
-
/** Maximum number of sites allowed */
|
|
19
|
-
maxSites: z.number().int().positive().optional(),
|
|
20
|
-
/** Maximum number of users/editors allowed */
|
|
21
|
-
maxUsers: z.number().int().positive().optional(),
|
|
22
|
-
/** License issued-at timestamp */
|
|
23
|
-
iat: z.number().optional(),
|
|
24
|
-
/** License expiration timestamp */
|
|
25
|
-
exp: z.number().optional(),
|
|
26
|
-
});
|
|
27
|
-
let cachedState = {
|
|
28
|
-
tier: 'free',
|
|
29
|
-
payload: null,
|
|
30
|
-
validatedAt: null,
|
|
31
|
-
};
|
|
32
|
-
/**
|
|
33
|
-
* The public key used to verify license JWTs.
|
|
34
|
-
* In production, this is fetched from the license server.
|
|
35
|
-
* For local development, it reads from REVEALUI_LICENSE_PUBLIC_KEY env var.
|
|
36
|
-
*/
|
|
37
|
-
function getPublicKey() {
|
|
38
|
-
return process.env.REVEALUI_LICENSE_PUBLIC_KEY ?? null;
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Reads the license key from environment.
|
|
42
|
-
*/
|
|
43
|
-
function getLicenseKey() {
|
|
44
|
-
return process.env.REVEALUI_LICENSE_KEY ?? null;
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Validates a license key JWT and returns the decoded payload.
|
|
48
|
-
* Returns null if the key is invalid, expired, or missing.
|
|
49
|
-
*/
|
|
50
|
-
export async function validateLicenseKey(licenseKey, publicKey) {
|
|
51
|
-
try {
|
|
52
|
-
const key = await importSPKI(publicKey, 'RS256');
|
|
53
|
-
const { payload } = await jwtVerify(licenseKey, key, {
|
|
54
|
-
algorithms: ['RS256', 'ES256'],
|
|
55
|
-
});
|
|
56
|
-
const result = licensePayloadSchema.safeParse(payload);
|
|
57
|
-
if (!result.success) {
|
|
58
|
-
return null;
|
|
59
|
-
}
|
|
60
|
-
return result.data;
|
|
61
|
-
}
|
|
62
|
-
catch {
|
|
63
|
-
return null;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Initialize the license system. Call once at application startup.
|
|
68
|
-
* Reads REVEALUI_LICENSE_KEY and REVEALUI_LICENSE_PUBLIC_KEY from environment.
|
|
69
|
-
*
|
|
70
|
-
* @returns The resolved license tier
|
|
71
|
-
*/
|
|
72
|
-
export async function initializeLicense() {
|
|
73
|
-
const licenseKey = getLicenseKey();
|
|
74
|
-
const publicKey = getPublicKey();
|
|
75
|
-
if (!(licenseKey && publicKey)) {
|
|
76
|
-
cachedState = { tier: 'free', payload: null, validatedAt: Date.now() };
|
|
77
|
-
return 'free';
|
|
78
|
-
}
|
|
79
|
-
const payload = await validateLicenseKey(licenseKey, publicKey);
|
|
80
|
-
if (!payload) {
|
|
81
|
-
cachedState = { tier: 'free', payload: null, validatedAt: Date.now() };
|
|
82
|
-
return 'free';
|
|
83
|
-
}
|
|
84
|
-
cachedState = {
|
|
85
|
-
tier: payload.tier,
|
|
86
|
-
payload,
|
|
87
|
-
validatedAt: Date.now(),
|
|
88
|
-
};
|
|
89
|
-
return payload.tier;
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* Returns the current license tier.
|
|
93
|
-
* If the license hasn't been initialized, returns 'free'.
|
|
94
|
-
*/
|
|
95
|
-
export function getCurrentTier() {
|
|
96
|
-
return cachedState.tier;
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Returns the full license payload, or null if no valid license.
|
|
100
|
-
*/
|
|
101
|
-
export function getLicensePayload() {
|
|
102
|
-
return cachedState.payload;
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Checks whether the current license is at least the given tier.
|
|
106
|
-
* Also validates that the license has not expired (checks JWT exp claim).
|
|
107
|
-
*/
|
|
108
|
-
export function isLicensed(requiredTier) {
|
|
109
|
-
const tierRank = {
|
|
110
|
-
free: 0,
|
|
111
|
-
pro: 1,
|
|
112
|
-
max: 2,
|
|
113
|
-
enterprise: 3,
|
|
114
|
-
};
|
|
115
|
-
// Free tier is always available
|
|
116
|
-
if (requiredTier === 'free')
|
|
117
|
-
return true;
|
|
118
|
-
// Check expiration if present
|
|
119
|
-
if (cachedState.payload?.exp) {
|
|
120
|
-
const nowSeconds = Math.floor(Date.now() / 1000);
|
|
121
|
-
if (cachedState.payload.exp < nowSeconds) {
|
|
122
|
-
return false;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
return tierRank[cachedState.tier] >= tierRank[requiredTier];
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* Returns the maximum number of sites allowed by the current license.
|
|
129
|
-
*/
|
|
130
|
-
export function getMaxSites() {
|
|
131
|
-
if (cachedState.tier === 'enterprise')
|
|
132
|
-
return Infinity;
|
|
133
|
-
if (cachedState.tier === 'max')
|
|
134
|
-
return cachedState.payload?.maxSites ?? 15;
|
|
135
|
-
if (cachedState.tier === 'pro')
|
|
136
|
-
return cachedState.payload?.maxSites ?? 5;
|
|
137
|
-
return 1;
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* Returns the maximum number of users/editors allowed by the current license.
|
|
141
|
-
*/
|
|
142
|
-
export function getMaxUsers() {
|
|
143
|
-
if (cachedState.tier === 'enterprise')
|
|
144
|
-
return Infinity;
|
|
145
|
-
if (cachedState.tier === 'max')
|
|
146
|
-
return cachedState.payload?.maxUsers ?? 100;
|
|
147
|
-
if (cachedState.tier === 'pro')
|
|
148
|
-
return cachedState.payload?.maxUsers ?? 25;
|
|
149
|
-
return 3;
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* Generates a signed license key JWT.
|
|
153
|
-
* This is a server-only function — requires the private key.
|
|
154
|
-
*
|
|
155
|
-
* @param payload - License payload (tier, customerId, limits)
|
|
156
|
-
* @param privateKey - RS256 or ES256 private key (PEM format)
|
|
157
|
-
* @param expiresInSeconds - JWT expiration in seconds. Defaults to 1 year.
|
|
158
|
-
* @returns Signed JWT string
|
|
159
|
-
*/
|
|
160
|
-
export async function generateLicenseKey(payload, privateKey, expiresInSeconds = 365 * 24 * 60 * 60) {
|
|
161
|
-
const key = await importPKCS8(privateKey, 'RS256');
|
|
162
|
-
return new SignJWT({ ...payload })
|
|
163
|
-
.setProtectedHeader({ alg: 'RS256' })
|
|
164
|
-
.setIssuedAt()
|
|
165
|
-
.setExpirationTime(`${expiresInSeconds}s`)
|
|
166
|
-
.sign(key);
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* Reset license state. Primarily for testing.
|
|
170
|
-
*/
|
|
171
|
-
export function resetLicenseState() {
|
|
172
|
-
cachedState = { tier: 'free', payload: null, validatedAt: null };
|
|
173
|
-
}
|
|
174
|
-
//# sourceMappingURL=license.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"license.js","sourceRoot":"","sources":["../../../../../core/src/license.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Alert System
|
|
3
|
-
*
|
|
4
|
-
* Manages alert channels (logger, Sentry, console) and alert delivery.
|
|
5
|
-
* Provides configurable thresholds and aggregation for production.
|
|
6
|
-
*/
|
|
7
|
-
import type { Alert } from './types.js';
|
|
8
|
-
/**
|
|
9
|
-
* Sentry interface for dependency injection and testing
|
|
10
|
-
*/
|
|
11
|
-
interface SentryClient {
|
|
12
|
-
captureMessage: (message: string, context?: unknown) => void;
|
|
13
|
-
setUser: (user: unknown) => void;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Alert channel type
|
|
17
|
-
*/
|
|
18
|
-
type AlertChannel = 'logger' | 'sentry' | 'console';
|
|
19
|
-
/**
|
|
20
|
-
* Alert configuration
|
|
21
|
-
*/
|
|
22
|
-
interface AlertConfig {
|
|
23
|
-
/** Enabled channels */
|
|
24
|
-
channels: AlertChannel[];
|
|
25
|
-
/** Aggregate alerts in production (log every N minutes instead of immediately) */
|
|
26
|
-
aggregateInProduction: boolean;
|
|
27
|
-
/** Aggregation interval in milliseconds */
|
|
28
|
-
aggregationInterval: number;
|
|
29
|
-
/** Enable Sentry in production only */
|
|
30
|
-
sentryProductionOnly: boolean;
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Alert manager class
|
|
34
|
-
*/
|
|
35
|
-
declare class AlertManager {
|
|
36
|
-
private config;
|
|
37
|
-
private alertQueue;
|
|
38
|
-
private aggregationTimer;
|
|
39
|
-
private lastAggregationTime;
|
|
40
|
-
private sentryClient;
|
|
41
|
-
constructor(config?: Partial<AlertConfig>, sentryClient?: SentryClient | null);
|
|
42
|
-
/**
|
|
43
|
-
* Send an alert through configured channels
|
|
44
|
-
*/
|
|
45
|
-
sendAlert(alert: Alert): void;
|
|
46
|
-
/**
|
|
47
|
-
* Send multiple alerts
|
|
48
|
-
*/
|
|
49
|
-
sendAlerts(alerts: Alert[]): void;
|
|
50
|
-
/**
|
|
51
|
-
* Deliver an alert to configured channels
|
|
52
|
-
*/
|
|
53
|
-
private deliverAlert;
|
|
54
|
-
/**
|
|
55
|
-
* Send alert to logger
|
|
56
|
-
*/
|
|
57
|
-
private sendToLogger;
|
|
58
|
-
/**
|
|
59
|
-
* Send alert to console (uses logger for structured output)
|
|
60
|
-
*/
|
|
61
|
-
private sendToConsole;
|
|
62
|
-
/**
|
|
63
|
-
* Send alert to Sentry
|
|
64
|
-
*/
|
|
65
|
-
private sendToSentry;
|
|
66
|
-
/**
|
|
67
|
-
* Start aggregation timer
|
|
68
|
-
*/
|
|
69
|
-
private startAggregation;
|
|
70
|
-
/**
|
|
71
|
-
* Flush aggregated alerts
|
|
72
|
-
*/
|
|
73
|
-
private flushAlerts;
|
|
74
|
-
/**
|
|
75
|
-
* Stop aggregation timer
|
|
76
|
-
*/
|
|
77
|
-
stopAggregation(): void;
|
|
78
|
-
/**
|
|
79
|
-
* Check if running in production
|
|
80
|
-
*/
|
|
81
|
-
private isProduction;
|
|
82
|
-
/**
|
|
83
|
-
* Get alert queue stats
|
|
84
|
-
*/
|
|
85
|
-
getStats(): {
|
|
86
|
-
queueSize: number;
|
|
87
|
-
lastAggregationTime: number;
|
|
88
|
-
aggregationEnabled: boolean;
|
|
89
|
-
};
|
|
90
|
-
/**
|
|
91
|
-
* Configure alert channels
|
|
92
|
-
*/
|
|
93
|
-
setChannels(channels: AlertChannel[]): void;
|
|
94
|
-
/**
|
|
95
|
-
* Cleanup resources
|
|
96
|
-
*/
|
|
97
|
-
dispose(): void;
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Singleton instance
|
|
101
|
-
*/
|
|
102
|
-
export declare const alertManager: AlertManager;
|
|
103
|
-
/**
|
|
104
|
-
* Export AlertManager class for testing
|
|
105
|
-
*/
|
|
106
|
-
export { AlertManager };
|
|
107
|
-
/**
|
|
108
|
-
* Export types for testing
|
|
109
|
-
*/
|
|
110
|
-
export type { AlertChannel, SentryClient };
|
|
111
|
-
/**
|
|
112
|
-
* Convenience functions
|
|
113
|
-
*/
|
|
114
|
-
export declare function sendAlert(alert: Alert): void;
|
|
115
|
-
export declare function sendAlerts(alerts: Alert[]): void;
|
|
116
|
-
export declare function getAlertStats(): ReturnType<typeof alertManager.getStats>;
|
|
117
|
-
export declare function setAlertChannels(channels: AlertChannel[]): void;
|
|
118
|
-
//# sourceMappingURL=alerts.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"alerts.d.ts","sourceRoot":"","sources":["../../../../../../core/src/monitoring/alerts.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAEvC;;GAEG;AACH,UAAU,YAAY;IACpB,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;IAC5D,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;CACjC;AAsCD;;GAEG;AACH,KAAK,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAA;AAEnD;;GAEG;AACH,UAAU,WAAW;IACnB,uBAAuB;IACvB,QAAQ,EAAE,YAAY,EAAE,CAAA;IAExB,kFAAkF;IAClF,qBAAqB,EAAE,OAAO,CAAA;IAE9B,2CAA2C;IAC3C,mBAAmB,EAAE,MAAM,CAAA;IAE3B,uCAAuC;IACvC,oBAAoB,EAAE,OAAO,CAAA;CAC9B;AAYD;;GAEG;AACH,cAAM,YAAY;IAChB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,UAAU,CAAc;IAChC,OAAO,CAAC,gBAAgB,CAA8B;IACtD,OAAO,CAAC,mBAAmB,CAAI;IAC/B,OAAO,CAAC,YAAY,CAA4B;gBAEpC,MAAM,GAAE,OAAO,CAAC,WAAW,CAAM,EAAE,YAAY,CAAC,EAAE,YAAY,GAAG,IAAI;IAUjF;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAU7B;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI;IAMjC;;OAEG;IACH,OAAO,CAAC,YAAY;IAoBpB;;OAEG;IACH,OAAO,CAAC,YAAY;IAuBpB;;OAEG;IACH,OAAO,CAAC,aAAa;IAYrB;;OAEG;IACH,OAAO,CAAC,YAAY;IAmEpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAaxB;;OAEG;IACH,OAAO,CAAC,WAAW;IAwCnB;;OAEG;IACH,eAAe,IAAI,IAAI;IAOvB;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB;;OAEG;IACH,QAAQ,IAAI;QACV,SAAS,EAAE,MAAM,CAAA;QACjB,mBAAmB,EAAE,MAAM,CAAA;QAC3B,kBAAkB,EAAE,OAAO,CAAA;KAC5B;IAQD;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,IAAI;IAI3C;;OAEG;IACH,OAAO,IAAI,IAAI;CAIhB;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,cAAqB,CAAA;AAE9C;;GAEG;AACH,OAAO,EAAE,YAAY,EAAE,CAAA;AAEvB;;GAEG;AACH,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,CAAA;AAE1C;;GAEG;AAEH,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAE5C;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAEhD;AAED,wBAAgB,aAAa,IAAI,UAAU,CAAC,OAAO,YAAY,CAAC,QAAQ,CAAC,CAExE;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,IAAI,CAE/D"}
|
|
@@ -1,325 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Alert System
|
|
3
|
-
*
|
|
4
|
-
* Manages alert channels (logger, Sentry, console) and alert delivery.
|
|
5
|
-
* Provides configurable thresholds and aggregation for production.
|
|
6
|
-
*/
|
|
7
|
-
import { logger } from '../utils/logger-server.js';
|
|
8
|
-
import { getRequestContext } from '../utils/request-context.js';
|
|
9
|
-
/**
|
|
10
|
-
* Get Sentry client if available
|
|
11
|
-
* Using dynamic import with string variable to avoid build-time resolution
|
|
12
|
-
*/
|
|
13
|
-
async function getSentryClient() {
|
|
14
|
-
try {
|
|
15
|
-
// Use string variable to prevent static analysis and bundler resolution
|
|
16
|
-
const moduleName = '@sentry' + '/node';
|
|
17
|
-
const sentry = await import(/* webpackIgnore: true */ moduleName);
|
|
18
|
-
return sentry;
|
|
19
|
-
}
|
|
20
|
-
catch {
|
|
21
|
-
return null;
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Synchronous version that caches the client
|
|
26
|
-
*/
|
|
27
|
-
let sentryClientCache;
|
|
28
|
-
function getSentryClientSync() {
|
|
29
|
-
if (sentryClientCache !== undefined) {
|
|
30
|
-
return sentryClientCache;
|
|
31
|
-
}
|
|
32
|
-
// Initialize asynchronously in the background
|
|
33
|
-
getSentryClient()
|
|
34
|
-
.then((client) => {
|
|
35
|
-
sentryClientCache = client;
|
|
36
|
-
})
|
|
37
|
-
.catch(() => {
|
|
38
|
-
sentryClientCache = null;
|
|
39
|
-
});
|
|
40
|
-
return null;
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Default alert configuration
|
|
44
|
-
*/
|
|
45
|
-
const DEFAULT_ALERT_CONFIG = {
|
|
46
|
-
channels: ['logger', 'console'],
|
|
47
|
-
aggregateInProduction: true,
|
|
48
|
-
aggregationInterval: 5 * 60 * 1000, // 5 minutes
|
|
49
|
-
sentryProductionOnly: true,
|
|
50
|
-
};
|
|
51
|
-
/**
|
|
52
|
-
* Alert manager class
|
|
53
|
-
*/
|
|
54
|
-
class AlertManager {
|
|
55
|
-
config;
|
|
56
|
-
alertQueue = [];
|
|
57
|
-
aggregationTimer = null;
|
|
58
|
-
lastAggregationTime = 0;
|
|
59
|
-
sentryClient = null;
|
|
60
|
-
constructor(config = {}, sentryClient) {
|
|
61
|
-
this.config = { ...DEFAULT_ALERT_CONFIG, ...config };
|
|
62
|
-
this.sentryClient = sentryClient !== undefined ? sentryClient : getSentryClientSync();
|
|
63
|
-
// Start aggregation timer if enabled
|
|
64
|
-
if (this.config.aggregateInProduction && this.isProduction()) {
|
|
65
|
-
this.startAggregation();
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Send an alert through configured channels
|
|
70
|
-
*/
|
|
71
|
-
sendAlert(alert) {
|
|
72
|
-
if (this.config.aggregateInProduction && this.isProduction()) {
|
|
73
|
-
// In production, queue alerts for aggregation
|
|
74
|
-
this.alertQueue.push(alert);
|
|
75
|
-
}
|
|
76
|
-
else {
|
|
77
|
-
// In development, send immediately
|
|
78
|
-
this.deliverAlert(alert);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Send multiple alerts
|
|
83
|
-
*/
|
|
84
|
-
sendAlerts(alerts) {
|
|
85
|
-
for (const alert of alerts) {
|
|
86
|
-
this.sendAlert(alert);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Deliver an alert to configured channels
|
|
91
|
-
*/
|
|
92
|
-
deliverAlert(alert) {
|
|
93
|
-
for (const channel of this.config.channels) {
|
|
94
|
-
switch (channel) {
|
|
95
|
-
case 'logger':
|
|
96
|
-
this.sendToLogger(alert);
|
|
97
|
-
break;
|
|
98
|
-
case 'console':
|
|
99
|
-
this.sendToConsole(alert);
|
|
100
|
-
break;
|
|
101
|
-
case 'sentry':
|
|
102
|
-
if (!this.config.sentryProductionOnly || this.isProduction()) {
|
|
103
|
-
this.sendToSentry(alert);
|
|
104
|
-
}
|
|
105
|
-
break;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Send alert to logger
|
|
111
|
-
*/
|
|
112
|
-
sendToLogger(alert) {
|
|
113
|
-
// Get request context for additional metadata
|
|
114
|
-
const context = getRequestContext();
|
|
115
|
-
const logData = {
|
|
116
|
-
metric: alert.metric,
|
|
117
|
-
value: alert.value,
|
|
118
|
-
threshold: alert.threshold,
|
|
119
|
-
timestamp: alert.timestamp,
|
|
120
|
-
// Include request context if available
|
|
121
|
-
...(context?.userId && { userId: context.userId }),
|
|
122
|
-
...(context?.path && { path: context.path }),
|
|
123
|
-
...(context?.method && { method: context.method }),
|
|
124
|
-
...(context?.ip && { ip: context.ip }),
|
|
125
|
-
};
|
|
126
|
-
if (alert.level === 'critical') {
|
|
127
|
-
logger.error(alert.message, logData);
|
|
128
|
-
}
|
|
129
|
-
else {
|
|
130
|
-
logger.warn(alert.message, logData);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* Send alert to console (uses logger for structured output)
|
|
135
|
-
*/
|
|
136
|
-
sendToConsole(alert) {
|
|
137
|
-
const logLevel = alert.level === 'critical' ? 'error' : 'warn';
|
|
138
|
-
const prefix = alert.level === 'critical' ? '🔴 CRITICAL' : '⚠️ WARNING';
|
|
139
|
-
logger[logLevel](`${prefix}: ${alert.message}`, {
|
|
140
|
-
metric: alert.metric,
|
|
141
|
-
value: alert.value,
|
|
142
|
-
threshold: alert.threshold,
|
|
143
|
-
timestamp: alert.timestamp,
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
/**
|
|
147
|
-
* Send alert to Sentry
|
|
148
|
-
*/
|
|
149
|
-
sendToSentry(alert) {
|
|
150
|
-
// Only send critical alerts to Sentry
|
|
151
|
-
if (alert.level !== 'critical')
|
|
152
|
-
return;
|
|
153
|
-
// Check if Sentry is available
|
|
154
|
-
if (!this.sentryClient) {
|
|
155
|
-
logger.debug('Sentry not available for alert delivery');
|
|
156
|
-
return;
|
|
157
|
-
}
|
|
158
|
-
try {
|
|
159
|
-
// Get request context for rich tracing
|
|
160
|
-
const context = getRequestContext();
|
|
161
|
-
// Build tags (indexed, searchable fields)
|
|
162
|
-
const tags = {
|
|
163
|
-
metric: alert.metric,
|
|
164
|
-
alert_level: alert.level,
|
|
165
|
-
};
|
|
166
|
-
// Add request context to tags for better filtering
|
|
167
|
-
if (context?.requestId)
|
|
168
|
-
tags.request_id = context.requestId;
|
|
169
|
-
if (context?.userId)
|
|
170
|
-
tags.user_id = context.userId;
|
|
171
|
-
if (context?.path)
|
|
172
|
-
tags.path = context.path;
|
|
173
|
-
if (context?.method)
|
|
174
|
-
tags.method = context.method;
|
|
175
|
-
// Build extra context (non-indexed, rich data)
|
|
176
|
-
const extra = {
|
|
177
|
-
value: alert.value,
|
|
178
|
-
threshold: alert.threshold,
|
|
179
|
-
timestamp: alert.timestamp,
|
|
180
|
-
};
|
|
181
|
-
// Add full request context for debugging
|
|
182
|
-
if (context) {
|
|
183
|
-
extra.request_context = {
|
|
184
|
-
requestId: context.requestId,
|
|
185
|
-
startTime: context.startTime,
|
|
186
|
-
duration: Date.now() - context.startTime,
|
|
187
|
-
userId: context.userId,
|
|
188
|
-
path: context.path,
|
|
189
|
-
method: context.method,
|
|
190
|
-
ip: context.ip,
|
|
191
|
-
userAgent: context.userAgent,
|
|
192
|
-
};
|
|
193
|
-
}
|
|
194
|
-
// Set user context if available (for Sentry user tracking)
|
|
195
|
-
if (context?.userId) {
|
|
196
|
-
this.sentryClient.setUser({
|
|
197
|
-
id: context.userId,
|
|
198
|
-
ip_address: context.ip,
|
|
199
|
-
});
|
|
200
|
-
}
|
|
201
|
-
// Capture the alert as a Sentry event
|
|
202
|
-
this.sentryClient.captureMessage(alert.message, {
|
|
203
|
-
level: 'error',
|
|
204
|
-
tags,
|
|
205
|
-
extra,
|
|
206
|
-
});
|
|
207
|
-
}
|
|
208
|
-
catch (error) {
|
|
209
|
-
// Sentry error, log and continue
|
|
210
|
-
logger.debug('Sentry not available for alert delivery', { error });
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
/**
|
|
214
|
-
* Start aggregation timer
|
|
215
|
-
*/
|
|
216
|
-
startAggregation() {
|
|
217
|
-
if (this.aggregationTimer)
|
|
218
|
-
return;
|
|
219
|
-
this.aggregationTimer = setInterval(() => {
|
|
220
|
-
this.flushAlerts();
|
|
221
|
-
}, this.config.aggregationInterval);
|
|
222
|
-
// Don't keep process alive
|
|
223
|
-
this.aggregationTimer.unref();
|
|
224
|
-
this.lastAggregationTime = Date.now();
|
|
225
|
-
}
|
|
226
|
-
/**
|
|
227
|
-
* Flush aggregated alerts
|
|
228
|
-
*/
|
|
229
|
-
flushAlerts() {
|
|
230
|
-
if (this.alertQueue.length === 0)
|
|
231
|
-
return;
|
|
232
|
-
// Group alerts by metric and level
|
|
233
|
-
const grouped = new Map();
|
|
234
|
-
for (const alert of this.alertQueue) {
|
|
235
|
-
const key = `${alert.metric}:${alert.level}`;
|
|
236
|
-
const existing = grouped.get(key) || [];
|
|
237
|
-
existing.push(alert);
|
|
238
|
-
grouped.set(key, existing);
|
|
239
|
-
}
|
|
240
|
-
// Send aggregated alerts
|
|
241
|
-
for (const [_key, alerts] of Array.from(grouped.entries())) {
|
|
242
|
-
if (alerts.length === 0)
|
|
243
|
-
continue;
|
|
244
|
-
const first = alerts[0];
|
|
245
|
-
if (!first)
|
|
246
|
-
continue;
|
|
247
|
-
const count = alerts.length;
|
|
248
|
-
const avgValue = alerts.reduce((sum, a) => sum + a.value, 0) / count;
|
|
249
|
-
const aggregatedAlert = {
|
|
250
|
-
level: first.level,
|
|
251
|
-
metric: first.metric,
|
|
252
|
-
value: first.value,
|
|
253
|
-
threshold: first.threshold,
|
|
254
|
-
message: `${first.message} (occurred ${count} times, avg value: ${Math.round(avgValue)})`,
|
|
255
|
-
timestamp: Date.now(),
|
|
256
|
-
};
|
|
257
|
-
this.deliverAlert(aggregatedAlert);
|
|
258
|
-
}
|
|
259
|
-
// Clear queue
|
|
260
|
-
this.alertQueue = [];
|
|
261
|
-
this.lastAggregationTime = Date.now();
|
|
262
|
-
}
|
|
263
|
-
/**
|
|
264
|
-
* Stop aggregation timer
|
|
265
|
-
*/
|
|
266
|
-
stopAggregation() {
|
|
267
|
-
if (this.aggregationTimer) {
|
|
268
|
-
clearInterval(this.aggregationTimer);
|
|
269
|
-
this.aggregationTimer = null;
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
/**
|
|
273
|
-
* Check if running in production
|
|
274
|
-
*/
|
|
275
|
-
isProduction() {
|
|
276
|
-
return process.env.NODE_ENV === 'production';
|
|
277
|
-
}
|
|
278
|
-
/**
|
|
279
|
-
* Get alert queue stats
|
|
280
|
-
*/
|
|
281
|
-
getStats() {
|
|
282
|
-
return {
|
|
283
|
-
queueSize: this.alertQueue.length,
|
|
284
|
-
lastAggregationTime: this.lastAggregationTime,
|
|
285
|
-
aggregationEnabled: this.config.aggregateInProduction && this.isProduction(),
|
|
286
|
-
};
|
|
287
|
-
}
|
|
288
|
-
/**
|
|
289
|
-
* Configure alert channels
|
|
290
|
-
*/
|
|
291
|
-
setChannels(channels) {
|
|
292
|
-
this.config.channels = channels;
|
|
293
|
-
}
|
|
294
|
-
/**
|
|
295
|
-
* Cleanup resources
|
|
296
|
-
*/
|
|
297
|
-
dispose() {
|
|
298
|
-
this.stopAggregation();
|
|
299
|
-
this.flushAlerts(); // Flush remaining alerts
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
/**
|
|
303
|
-
* Singleton instance
|
|
304
|
-
*/
|
|
305
|
-
export const alertManager = new AlertManager();
|
|
306
|
-
/**
|
|
307
|
-
* Export AlertManager class for testing
|
|
308
|
-
*/
|
|
309
|
-
export { AlertManager };
|
|
310
|
-
/**
|
|
311
|
-
* Convenience functions
|
|
312
|
-
*/
|
|
313
|
-
export function sendAlert(alert) {
|
|
314
|
-
alertManager.sendAlert(alert);
|
|
315
|
-
}
|
|
316
|
-
export function sendAlerts(alerts) {
|
|
317
|
-
alertManager.sendAlerts(alerts);
|
|
318
|
-
}
|
|
319
|
-
export function getAlertStats() {
|
|
320
|
-
return alertManager.getStats();
|
|
321
|
-
}
|
|
322
|
-
export function setAlertChannels(channels) {
|
|
323
|
-
alertManager.setChannels(channels);
|
|
324
|
-
}
|
|
325
|
-
//# sourceMappingURL=alerts.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"alerts.js","sourceRoot":"","sources":["../../../../../../core/src/monitoring/alerts.ts"],"names":[],"mappings":"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"}
|