@revealui/mcp 0.0.1-pre.0 → 0.1.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/.env.example +9 -0
- package/MCP_MAINTENANCE.md +265 -0
- package/README.md +260 -0
- package/__tests__/crdt.integration.test.ts +156 -0
- package/configs/README.md +77 -0
- package/configs/claude-template.json +54 -0
- package/dist/packages/core/src/database/ssl-config.d.ts +9 -0
- package/dist/packages/core/src/database/ssl-config.d.ts.map +1 -0
- package/dist/packages/core/src/database/ssl-config.js +8 -0
- package/dist/packages/core/src/database/ssl-config.js.map +1 -0
- package/dist/packages/core/src/features.d.ts +86 -0
- package/dist/packages/core/src/features.d.ts.map +1 -0
- package/dist/packages/core/src/features.js +93 -0
- package/dist/packages/core/src/features.js.map +1 -0
- package/dist/packages/core/src/license.d.ts +75 -0
- package/dist/packages/core/src/license.d.ts.map +1 -0
- package/dist/packages/core/src/license.js +174 -0
- package/dist/packages/core/src/license.js.map +1 -0
- package/dist/packages/core/src/monitoring/alerts.d.ts +118 -0
- package/dist/packages/core/src/monitoring/alerts.d.ts.map +1 -0
- package/dist/packages/core/src/monitoring/alerts.js +325 -0
- package/dist/packages/core/src/monitoring/alerts.js.map +1 -0
- package/dist/packages/core/src/monitoring/cleanup-manager.d.ts +71 -0
- package/dist/packages/core/src/monitoring/cleanup-manager.d.ts.map +1 -0
- package/dist/packages/core/src/monitoring/cleanup-manager.js +227 -0
- package/dist/packages/core/src/monitoring/cleanup-manager.js.map +1 -0
- package/dist/packages/core/src/monitoring/health-monitor.d.ts +22 -0
- package/dist/packages/core/src/monitoring/health-monitor.d.ts.map +1 -0
- package/dist/packages/core/src/monitoring/health-monitor.js +143 -0
- package/dist/packages/core/src/monitoring/health-monitor.js.map +1 -0
- package/dist/packages/core/src/monitoring/index.d.ts +14 -0
- package/dist/packages/core/src/monitoring/index.d.ts.map +1 -0
- package/dist/packages/core/src/monitoring/index.js +18 -0
- package/dist/packages/core/src/monitoring/index.js.map +1 -0
- package/dist/packages/core/src/monitoring/process-registry.d.ts +97 -0
- package/dist/packages/core/src/monitoring/process-registry.d.ts.map +1 -0
- package/dist/packages/core/src/monitoring/process-registry.js +223 -0
- package/dist/packages/core/src/monitoring/process-registry.js.map +1 -0
- package/dist/packages/core/src/monitoring/types.d.ts +231 -0
- package/dist/packages/core/src/monitoring/types.d.ts.map +1 -0
- package/dist/packages/core/src/monitoring/types.js +43 -0
- package/dist/packages/core/src/monitoring/types.js.map +1 -0
- package/dist/packages/core/src/monitoring/zombie-detector.d.ts +81 -0
- package/dist/packages/core/src/monitoring/zombie-detector.d.ts.map +1 -0
- package/dist/packages/core/src/monitoring/zombie-detector.js +232 -0
- package/dist/packages/core/src/monitoring/zombie-detector.js.map +1 -0
- package/dist/packages/core/src/observability/logger.d.ts +47 -0
- package/dist/packages/core/src/observability/logger.d.ts.map +1 -0
- package/dist/packages/core/src/observability/logger.js +141 -0
- package/dist/packages/core/src/observability/logger.js.map +1 -0
- package/dist/packages/core/src/utils/logger-server.d.ts +32 -0
- package/dist/packages/core/src/utils/logger-server.d.ts.map +1 -0
- package/dist/packages/core/src/utils/logger-server.js +69 -0
- package/dist/packages/core/src/utils/logger-server.js.map +1 -0
- package/dist/packages/core/src/utils/request-context.d.ts +143 -0
- package/dist/packages/core/src/utils/request-context.d.ts.map +1 -0
- package/dist/packages/core/src/utils/request-context.js +169 -0
- package/dist/packages/core/src/utils/request-context.js.map +1 -0
- package/dist/packages/dev/src/code-validator/index.d.ts +20 -0
- package/dist/packages/dev/src/code-validator/index.d.ts.map +1 -0
- package/dist/packages/dev/src/code-validator/index.js +20 -0
- package/dist/packages/dev/src/code-validator/index.js.map +1 -0
- package/dist/packages/dev/src/code-validator/types.d.ts +67 -0
- package/dist/packages/dev/src/code-validator/types.d.ts.map +1 -0
- package/dist/packages/dev/src/code-validator/types.js +7 -0
- package/dist/packages/dev/src/code-validator/types.js.map +1 -0
- package/dist/packages/dev/src/code-validator/validator.d.ts +48 -0
- package/dist/packages/dev/src/code-validator/validator.d.ts.map +1 -0
- package/dist/packages/dev/src/code-validator/validator.js +176 -0
- package/dist/packages/dev/src/code-validator/validator.js.map +1 -0
- package/dist/packages/mcp/src/adapters/db.d.ts +46 -0
- package/dist/packages/mcp/src/adapters/db.d.ts.map +1 -0
- package/dist/packages/mcp/src/adapters/db.js +127 -0
- package/dist/packages/mcp/src/adapters/db.js.map +1 -0
- package/dist/packages/mcp/src/config/index.d.ts +11 -0
- package/dist/packages/mcp/src/config/index.d.ts.map +1 -0
- package/dist/packages/mcp/src/config/index.js +18 -0
- package/dist/packages/mcp/src/config/index.js.map +1 -0
- package/dist/packages/mcp/src/contracts.d.ts +131 -0
- package/dist/packages/mcp/src/contracts.d.ts.map +1 -0
- package/dist/packages/mcp/src/contracts.js +153 -0
- package/dist/packages/mcp/src/contracts.js.map +1 -0
- package/dist/packages/mcp/src/hypervisor.d.ts +132 -0
- package/dist/packages/mcp/src/hypervisor.d.ts.map +1 -0
- package/dist/packages/mcp/src/hypervisor.js +359 -0
- package/dist/packages/mcp/src/hypervisor.js.map +1 -0
- package/dist/packages/mcp/src/index.d.ts +25 -0
- package/dist/packages/mcp/src/index.d.ts.map +1 -0
- package/dist/packages/mcp/src/index.js +41 -0
- package/dist/packages/mcp/src/index.js.map +1 -0
- package/dist/packages/mcp/src/servers/adapter.d.ts +199 -0
- package/dist/packages/mcp/src/servers/adapter.d.ts.map +1 -0
- package/dist/packages/mcp/src/servers/adapter.js +487 -0
- package/dist/packages/mcp/src/servers/adapter.js.map +1 -0
- package/dist/packages/mcp/src/servers/code-validator.d.ts +24 -0
- package/dist/packages/mcp/src/servers/code-validator.d.ts.map +1 -0
- package/dist/packages/mcp/src/servers/code-validator.js +156 -0
- package/dist/packages/mcp/src/servers/code-validator.js.map +1 -0
- package/dist/packages/mcp/src/servers/neon.d.ts +11 -0
- package/dist/packages/mcp/src/servers/neon.d.ts.map +1 -0
- package/dist/packages/mcp/src/servers/neon.js +90 -0
- package/dist/packages/mcp/src/servers/neon.js.map +1 -0
- package/dist/packages/mcp/src/servers/next-devtools.d.ts +11 -0
- package/dist/packages/mcp/src/servers/next-devtools.d.ts.map +1 -0
- package/dist/packages/mcp/src/servers/next-devtools.js +215 -0
- package/dist/packages/mcp/src/servers/next-devtools.js.map +1 -0
- package/dist/packages/mcp/src/servers/playwright.d.ts +11 -0
- package/dist/packages/mcp/src/servers/playwright.d.ts.map +1 -0
- package/dist/packages/mcp/src/servers/playwright.js +68 -0
- package/dist/packages/mcp/src/servers/playwright.js.map +1 -0
- package/dist/packages/mcp/src/servers/stripe.d.ts +11 -0
- package/dist/packages/mcp/src/servers/stripe.d.ts.map +1 -0
- package/dist/packages/mcp/src/servers/stripe.js +86 -0
- package/dist/packages/mcp/src/servers/stripe.js.map +1 -0
- package/dist/packages/mcp/src/servers/supabase.d.ts +11 -0
- package/dist/packages/mcp/src/servers/supabase.d.ts.map +1 -0
- package/dist/packages/mcp/src/servers/supabase.js +144 -0
- package/dist/packages/mcp/src/servers/supabase.js.map +1 -0
- package/dist/packages/mcp/src/servers/vercel.d.ts +11 -0
- package/dist/packages/mcp/src/servers/vercel.d.ts.map +1 -0
- package/dist/packages/mcp/src/servers/vercel.js +87 -0
- package/dist/packages/mcp/src/servers/vercel.js.map +1 -0
- package/dist/packages/mcp/src/servers/vultr-test.d.ts +3 -0
- package/dist/packages/mcp/src/servers/vultr-test.d.ts.map +1 -0
- package/dist/packages/mcp/src/servers/vultr-test.js +82 -0
- package/dist/packages/mcp/src/servers/vultr-test.js.map +1 -0
- package/dist/scripts/lib/analyzers/console-analyzer.d.ts +188 -0
- package/dist/scripts/lib/analyzers/console-analyzer.d.ts.map +1 -0
- package/dist/scripts/lib/analyzers/console-analyzer.js +432 -0
- package/dist/scripts/lib/analyzers/console-analyzer.js.map +1 -0
- package/dist/scripts/lib/analyzers/index.d.ts +11 -0
- package/dist/scripts/lib/analyzers/index.d.ts.map +1 -0
- package/dist/scripts/lib/analyzers/index.js +11 -0
- package/dist/scripts/lib/analyzers/index.js.map +1 -0
- package/dist/scripts/lib/args.d.ts +104 -0
- package/dist/scripts/lib/args.d.ts.map +1 -0
- package/dist/scripts/lib/args.js +304 -0
- package/dist/scripts/lib/args.js.map +1 -0
- package/dist/scripts/lib/cache.d.ts +185 -0
- package/dist/scripts/lib/cache.d.ts.map +1 -0
- package/dist/scripts/lib/cache.js +390 -0
- package/dist/scripts/lib/cache.js.map +1 -0
- package/dist/scripts/lib/cli/dispatch.d.ts +116 -0
- package/dist/scripts/lib/cli/dispatch.d.ts.map +1 -0
- package/dist/scripts/lib/cli/dispatch.js +206 -0
- package/dist/scripts/lib/cli/dispatch.js.map +1 -0
- package/dist/scripts/lib/cli/index.d.ts +10 -0
- package/dist/scripts/lib/cli/index.d.ts.map +1 -0
- package/dist/scripts/lib/cli/index.js +10 -0
- package/dist/scripts/lib/cli/index.js.map +1 -0
- package/dist/scripts/lib/database/ssl-config.d.ts +26 -0
- package/dist/scripts/lib/database/ssl-config.d.ts.map +1 -0
- package/dist/scripts/lib/database/ssl-config.js +47 -0
- package/dist/scripts/lib/database/ssl-config.js.map +1 -0
- package/dist/scripts/lib/errors.d.ts +218 -0
- package/dist/scripts/lib/errors.d.ts.map +1 -0
- package/dist/scripts/lib/errors.js +543 -0
- package/dist/scripts/lib/errors.js.map +1 -0
- package/dist/scripts/lib/exec.d.ts +107 -0
- package/dist/scripts/lib/exec.d.ts.map +1 -0
- package/dist/scripts/lib/exec.js +232 -0
- package/dist/scripts/lib/exec.js.map +1 -0
- package/dist/scripts/lib/index.d.ts +50 -0
- package/dist/scripts/lib/index.d.ts.map +1 -0
- package/dist/scripts/lib/index.js +65 -0
- package/dist/scripts/lib/index.js.map +1 -0
- package/dist/scripts/lib/logger.d.ts +50 -0
- package/dist/scripts/lib/logger.d.ts.map +1 -0
- package/dist/scripts/lib/logger.js +159 -0
- package/dist/scripts/lib/logger.js.map +1 -0
- package/dist/scripts/lib/output.d.ts +149 -0
- package/dist/scripts/lib/output.d.ts.map +1 -0
- package/dist/scripts/lib/output.js +263 -0
- package/dist/scripts/lib/output.js.map +1 -0
- package/dist/scripts/lib/parallel.d.ts +164 -0
- package/dist/scripts/lib/parallel.d.ts.map +1 -0
- package/dist/scripts/lib/parallel.js +355 -0
- package/dist/scripts/lib/parallel.js.map +1 -0
- package/dist/scripts/lib/paths.d.ts +92 -0
- package/dist/scripts/lib/paths.d.ts.map +1 -0
- package/dist/scripts/lib/paths.js +171 -0
- package/dist/scripts/lib/paths.js.map +1 -0
- package/dist/scripts/lib/state/adapters/memory.d.ts +42 -0
- package/dist/scripts/lib/state/adapters/memory.d.ts.map +1 -0
- package/dist/scripts/lib/state/adapters/memory.js +110 -0
- package/dist/scripts/lib/state/adapters/memory.js.map +1 -0
- package/dist/scripts/lib/state/adapters/pglite.d.ts +46 -0
- package/dist/scripts/lib/state/adapters/pglite.d.ts.map +1 -0
- package/dist/scripts/lib/state/adapters/pglite.js +256 -0
- package/dist/scripts/lib/state/adapters/pglite.js.map +1 -0
- package/dist/scripts/lib/state/index.d.ts +16 -0
- package/dist/scripts/lib/state/index.d.ts.map +1 -0
- package/dist/scripts/lib/state/index.js +16 -0
- package/dist/scripts/lib/state/index.js.map +1 -0
- package/dist/scripts/lib/state/types.d.ts +111 -0
- package/dist/scripts/lib/state/types.d.ts.map +1 -0
- package/dist/scripts/lib/state/types.js +8 -0
- package/dist/scripts/lib/state/types.js.map +1 -0
- package/dist/scripts/lib/state/workflow-state.d.ts +110 -0
- package/dist/scripts/lib/state/workflow-state.d.ts.map +1 -0
- package/dist/scripts/lib/state/workflow-state.js +331 -0
- package/dist/scripts/lib/state/workflow-state.js.map +1 -0
- package/dist/scripts/lib/telemetry.d.ts +194 -0
- package/dist/scripts/lib/telemetry.d.ts.map +1 -0
- package/dist/scripts/lib/telemetry.js +394 -0
- package/dist/scripts/lib/telemetry.js.map +1 -0
- package/dist/scripts/lib/utils.d.ts +270 -0
- package/dist/scripts/lib/utils.d.ts.map +1 -0
- package/dist/scripts/lib/utils.js +473 -0
- package/dist/scripts/lib/utils.js.map +1 -0
- package/dist/scripts/lib/validation/database.d.ts +83 -0
- package/dist/scripts/lib/validation/database.d.ts.map +1 -0
- package/dist/scripts/lib/validation/database.js +199 -0
- package/dist/scripts/lib/validation/database.js.map +1 -0
- package/dist/scripts/lib/validation/env.d.ts +80 -0
- package/dist/scripts/lib/validation/env.d.ts.map +1 -0
- package/dist/scripts/lib/validation/env.js +246 -0
- package/dist/scripts/lib/validation/env.js.map +1 -0
- package/dist/scripts/lib/validation/index.d.ts +16 -0
- package/dist/scripts/lib/validation/index.d.ts.map +1 -0
- package/dist/scripts/lib/validation/index.js +16 -0
- package/dist/scripts/lib/validation/index.js.map +1 -0
- package/dist/scripts/lib/validation/post-execution.d.ts +74 -0
- package/dist/scripts/lib/validation/post-execution.d.ts.map +1 -0
- package/dist/scripts/lib/validation/post-execution.js +110 -0
- package/dist/scripts/lib/validation/post-execution.js.map +1 -0
- package/dist/scripts/lib/validation/pre-execution.d.ts +165 -0
- package/dist/scripts/lib/validation/pre-execution.d.ts.map +1 -0
- package/dist/scripts/lib/validation/pre-execution.js +466 -0
- package/dist/scripts/lib/validation/pre-execution.js.map +1 -0
- package/dist/scripts/lib/validators/documentation-validator.d.ts +242 -0
- package/dist/scripts/lib/validators/documentation-validator.d.ts.map +1 -0
- package/dist/scripts/lib/validators/documentation-validator.js +584 -0
- package/dist/scripts/lib/validators/documentation-validator.js.map +1 -0
- package/dist/scripts/lib/validators/index.d.ts +11 -0
- package/dist/scripts/lib/validators/index.d.ts.map +1 -0
- package/dist/scripts/lib/validators/index.js +11 -0
- package/dist/scripts/lib/validators/index.js.map +1 -0
- package/docker-compose.yml +46 -0
- package/docs/INDEX.md +88 -0
- package/docs/README.md +774 -0
- package/docs/SETUP.md +264 -0
- package/docs/servers/code-validator.md +586 -0
- package/eslint.config.js +7 -0
- package/migrations/0001_add_crdt_columns.sql +8 -0
- package/migrations/0001_rollback.sql +6 -0
- package/migrations/005_performance_indexes.sql +190 -0
- package/migrations/backfill_crdt_meta.js +45 -0
- package/package.json +21 -85
- package/src/__tests__/hypervisor.test.ts +212 -0
- package/src/adapters/db.ts +180 -0
- package/src/config/config.json +49 -0
- package/src/config/index.ts +30 -0
- package/src/contracts.ts +221 -0
- package/src/hypervisor.ts +464 -0
- package/src/index.ts +87 -0
- package/src/servers/adapter.ts +643 -0
- package/src/servers/code-validator.ts +188 -0
- package/src/servers/neon.ts +103 -0
- package/src/servers/next-devtools.ts +230 -0
- package/src/servers/playwright.ts +77 -0
- package/src/servers/stripe.ts +99 -0
- package/src/servers/supabase.ts +161 -0
- package/src/servers/vercel.ts +100 -0
- package/src/servers/vultr-test.ts +97 -0
- package/tsconfig.json +12 -0
- package/vitest.config.ts +22 -0
- package/LICENSE +0 -202
- package/dist/index.js +0 -10990
- package/dist/index.js.map +0 -1
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# MCP Configuration Templates
|
|
2
|
+
|
|
3
|
+
This directory contains template configuration files for different MCP clients.
|
|
4
|
+
|
|
5
|
+
## Available Templates
|
|
6
|
+
|
|
7
|
+
### `claude-template.json`
|
|
8
|
+
Template for Claude Code / Claude Desktop
|
|
9
|
+
|
|
10
|
+
**Installation:**
|
|
11
|
+
1. Copy to your Claude config location:
|
|
12
|
+
- Linux: `~/.config/Claude/claude_desktop_config.json`
|
|
13
|
+
- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
14
|
+
- Windows: `%APPDATA%\Claude\claude_desktop_config.json`
|
|
15
|
+
- CLI: `~/.claude/config.json`
|
|
16
|
+
|
|
17
|
+
2. Replace `<REPO_PATH>` with absolute path to RevealUI repo
|
|
18
|
+
|
|
19
|
+
3. Enable desired servers by setting `"enabled": true`
|
|
20
|
+
|
|
21
|
+
### `cursor-template.json`
|
|
22
|
+
Template for Cursor IDE
|
|
23
|
+
|
|
24
|
+
**Installation:**
|
|
25
|
+
1. Copy to `.cursor/mcp-config.json` in repo root
|
|
26
|
+
2. Replace `<REPO_PATH>` with absolute path
|
|
27
|
+
3. Enable desired servers
|
|
28
|
+
|
|
29
|
+
### `vscode-template.json`
|
|
30
|
+
Template for VS Code
|
|
31
|
+
|
|
32
|
+
**Installation:**
|
|
33
|
+
1. Copy to `.vscode/mcp.json` in repo root
|
|
34
|
+
2. Replace `<REPO_PATH>` with absolute path
|
|
35
|
+
3. Enable desired servers
|
|
36
|
+
|
|
37
|
+
## Available MCP Servers
|
|
38
|
+
|
|
39
|
+
| Server | Command | Description |
|
|
40
|
+
|--------|---------|-------------|
|
|
41
|
+
| code-validator | `tsx packages/mcp/src/servers/code-validator.ts` | Validates code against standards |
|
|
42
|
+
| vercel | `pnpm mcp:vercel` | Vercel deployment |
|
|
43
|
+
| stripe | `pnpm mcp:stripe` | Payment processing |
|
|
44
|
+
| neon | `pnpm mcp:neon` | Database operations |
|
|
45
|
+
| supabase | `pnpm mcp:supabase` | Supabase management |
|
|
46
|
+
| playwright | `pnpm mcp:playwright` | Browser automation |
|
|
47
|
+
| next-devtools | `pnpm mcp:next-devtools` | Next.js debugging |
|
|
48
|
+
|
|
49
|
+
## Quick Setup Script
|
|
50
|
+
|
|
51
|
+
Run from repo root:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
# Auto-generate config with correct paths
|
|
55
|
+
pnpm setup:mcp
|
|
56
|
+
|
|
57
|
+
# Or manually:
|
|
58
|
+
REPO_PATH=$(pwd)
|
|
59
|
+
sed "s|<REPO_PATH>|$REPO_PATH|g" packages/mcp/configs/claude-template.json > ~/.claude/config.json
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Environment Variables
|
|
63
|
+
|
|
64
|
+
Make sure these are set:
|
|
65
|
+
|
|
66
|
+
```env
|
|
67
|
+
VERCEL_API_KEY=vercel_...
|
|
68
|
+
STRIPE_SECRET_KEY=sk_test_...
|
|
69
|
+
NEON_API_KEY=neon_...
|
|
70
|
+
SUPABASE_URL=https://....supabase.co
|
|
71
|
+
SUPABASE_ANON_KEY=eyJ...
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## See Also
|
|
75
|
+
|
|
76
|
+
- [MCP Setup Guide](../docs/SETUP.md)
|
|
77
|
+
- [Server Documentation](../docs/servers/)
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://modelcontextprotocol.io/schema/mcp-config.json",
|
|
3
|
+
"mcpServers": {
|
|
4
|
+
"revealui-code-validator": {
|
|
5
|
+
"command": "tsx",
|
|
6
|
+
"args": ["<REPO_PATH>/packages/mcp/src/servers/code-validator.ts"],
|
|
7
|
+
"cwd": "<REPO_PATH>",
|
|
8
|
+
"description": "Code validation - prevents AI-generated technical debt",
|
|
9
|
+
"enabled": true
|
|
10
|
+
},
|
|
11
|
+
"revealui-vercel": {
|
|
12
|
+
"command": "pnpm",
|
|
13
|
+
"args": ["mcp:vercel"],
|
|
14
|
+
"cwd": "<REPO_PATH>",
|
|
15
|
+
"description": "Vercel deployment and storage management",
|
|
16
|
+
"enabled": false
|
|
17
|
+
},
|
|
18
|
+
"revealui-stripe": {
|
|
19
|
+
"command": "pnpm",
|
|
20
|
+
"args": ["mcp:stripe"],
|
|
21
|
+
"cwd": "<REPO_PATH>",
|
|
22
|
+
"description": "Stripe payment processing",
|
|
23
|
+
"enabled": false
|
|
24
|
+
},
|
|
25
|
+
"revealui-neon": {
|
|
26
|
+
"command": "pnpm",
|
|
27
|
+
"args": ["mcp:neon"],
|
|
28
|
+
"cwd": "<REPO_PATH>",
|
|
29
|
+
"description": "NeonDB database operations",
|
|
30
|
+
"enabled": false
|
|
31
|
+
},
|
|
32
|
+
"revealui-supabase": {
|
|
33
|
+
"command": "pnpm",
|
|
34
|
+
"args": ["mcp:supabase"],
|
|
35
|
+
"cwd": "<REPO_PATH>",
|
|
36
|
+
"description": "Supabase project management",
|
|
37
|
+
"enabled": false
|
|
38
|
+
},
|
|
39
|
+
"revealui-playwright": {
|
|
40
|
+
"command": "pnpm",
|
|
41
|
+
"args": ["mcp:playwright"],
|
|
42
|
+
"cwd": "<REPO_PATH>",
|
|
43
|
+
"description": "Browser automation",
|
|
44
|
+
"enabled": false
|
|
45
|
+
},
|
|
46
|
+
"revealui-next-devtools": {
|
|
47
|
+
"command": "pnpm",
|
|
48
|
+
"args": ["mcp:next-devtools"],
|
|
49
|
+
"cwd": "<REPO_PATH>",
|
|
50
|
+
"description": "Next.js debugging",
|
|
51
|
+
"enabled": false
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SSL Configuration Utility
|
|
3
|
+
*
|
|
4
|
+
* Re-exports from @revealui/utils to maintain backward compatibility.
|
|
5
|
+
* The actual implementation has been moved to @revealui/utils to break circular dependencies.
|
|
6
|
+
*/
|
|
7
|
+
export type { SSLConfig } from '@revealui/utils/database';
|
|
8
|
+
export { getSSLConfig, validateSSLConfig } from '@revealui/utils/database';
|
|
9
|
+
//# sourceMappingURL=ssl-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssl-config.d.ts","sourceRoot":"","sources":["../../../../../../core/src/database/ssl-config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SSL Configuration Utility
|
|
3
|
+
*
|
|
4
|
+
* Re-exports from @revealui/utils to maintain backward compatibility.
|
|
5
|
+
* The actual implementation has been moved to @revealui/utils to break circular dependencies.
|
|
6
|
+
*/
|
|
7
|
+
export { getSSLConfig, validateSSLConfig } from '@revealui/utils/database';
|
|
8
|
+
//# sourceMappingURL=ssl-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssl-config.js","sourceRoot":"","sources":["../../../../../../core/src/database/ssl-config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feature flag system for RevealUI Pro/Enterprise tiers.
|
|
3
|
+
*
|
|
4
|
+
* Gates premium features based on the current license tier.
|
|
5
|
+
* Free (OSS) users get the core CMS framework.
|
|
6
|
+
* Pro/Enterprise users unlock AI, advanced sync, dashboard, etc.
|
|
7
|
+
*
|
|
8
|
+
* @dependencies
|
|
9
|
+
* - ./license.ts - License validation and tier checking
|
|
10
|
+
*/
|
|
11
|
+
import { type LicenseTier } from './license.js';
|
|
12
|
+
/** All gated features in RevealUI */
|
|
13
|
+
export interface FeatureFlags {
|
|
14
|
+
/** AI agent system (Pro: 1 provider, Enterprise: all providers) */
|
|
15
|
+
ai: boolean;
|
|
16
|
+
/** AI memory system — working + episodic + vector (Max: basic, Enterprise: full) */
|
|
17
|
+
aiMemory: boolean;
|
|
18
|
+
/** MCP server integration */
|
|
19
|
+
mcp: boolean;
|
|
20
|
+
/** Editor integration daemon */
|
|
21
|
+
editors: boolean;
|
|
22
|
+
/** AI harness integration (Claude Code, Cursor, Copilot coordination) */
|
|
23
|
+
harnesses: boolean;
|
|
24
|
+
/** Built-in Stripe payment processing */
|
|
25
|
+
payments: boolean;
|
|
26
|
+
/** Multi-tenant site management */
|
|
27
|
+
multiTenant: boolean;
|
|
28
|
+
/** White-label admin dashboard */
|
|
29
|
+
whiteLabel: boolean;
|
|
30
|
+
/** SSO/SAML authentication */
|
|
31
|
+
sso: boolean;
|
|
32
|
+
/** BYOK server-side key storage (Max+) */
|
|
33
|
+
byokServerSide: boolean;
|
|
34
|
+
/** Multi-provider AI (Max+: 2 providers, Enterprise: all providers) */
|
|
35
|
+
aiMultiProvider: boolean;
|
|
36
|
+
/** Audit logging and compliance trail */
|
|
37
|
+
auditLog: boolean;
|
|
38
|
+
/** Full real-time sync with conflict resolution */
|
|
39
|
+
advancedSync: boolean;
|
|
40
|
+
/** Monitoring dashboard */
|
|
41
|
+
dashboard: boolean;
|
|
42
|
+
/** Custom domain mapping */
|
|
43
|
+
customDomain: boolean;
|
|
44
|
+
/** Analytics and conversion tracking */
|
|
45
|
+
analytics: boolean;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Returns the current feature flags based on the active license tier.
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```typescript
|
|
52
|
+
* import { getFeatures } from '@revealui/core/features'
|
|
53
|
+
*
|
|
54
|
+
* const features = getFeatures()
|
|
55
|
+
* if (features.ai) {
|
|
56
|
+
* // Enable AI agent system
|
|
57
|
+
* }
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
export declare function getFeatures(): FeatureFlags;
|
|
61
|
+
/**
|
|
62
|
+
* Check if a specific feature is enabled.
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* ```typescript
|
|
66
|
+
* import { isFeatureEnabled } from '@revealui/core/features'
|
|
67
|
+
*
|
|
68
|
+
* if (isFeatureEnabled('ai')) {
|
|
69
|
+
* // AI is available
|
|
70
|
+
* }
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
export declare function isFeatureEnabled(feature: keyof FeatureFlags): boolean;
|
|
74
|
+
/**
|
|
75
|
+
* Returns all features available at a given tier (useful for pricing pages).
|
|
76
|
+
*/
|
|
77
|
+
export declare function getFeaturesForTier(tier: LicenseTier): FeatureFlags;
|
|
78
|
+
/**
|
|
79
|
+
* Returns the minimum tier required for a given feature.
|
|
80
|
+
*/
|
|
81
|
+
export declare function getRequiredTier(feature: keyof FeatureFlags): LicenseTier;
|
|
82
|
+
/**
|
|
83
|
+
* Returns the current license tier. Convenience re-export.
|
|
84
|
+
*/
|
|
85
|
+
export { getCurrentTier } from './license.js';
|
|
86
|
+
//# sourceMappingURL=features.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features.d.ts","sourceRoot":"","sources":["../../../../../core/src/features.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,cAAc,CAAA;AAE3D,qCAAqC;AACrC,MAAM,WAAW,YAAY;IAC3B,mEAAmE;IACnE,EAAE,EAAE,OAAO,CAAA;IACX,oFAAoF;IACpF,QAAQ,EAAE,OAAO,CAAA;IACjB,6BAA6B;IAC7B,GAAG,EAAE,OAAO,CAAA;IACZ,gCAAgC;IAChC,OAAO,EAAE,OAAO,CAAA;IAChB,yEAAyE;IACzE,SAAS,EAAE,OAAO,CAAA;IAClB,yCAAyC;IACzC,QAAQ,EAAE,OAAO,CAAA;IACjB,mCAAmC;IACnC,WAAW,EAAE,OAAO,CAAA;IACpB,kCAAkC;IAClC,UAAU,EAAE,OAAO,CAAA;IACnB,8BAA8B;IAC9B,GAAG,EAAE,OAAO,CAAA;IACZ,0CAA0C;IAC1C,cAAc,EAAE,OAAO,CAAA;IACvB,uEAAuE;IACvE,eAAe,EAAE,OAAO,CAAA;IACxB,yCAAyC;IACzC,QAAQ,EAAE,OAAO,CAAA;IACjB,mDAAmD;IACnD,YAAY,EAAE,OAAO,CAAA;IACrB,2BAA2B;IAC3B,SAAS,EAAE,OAAO,CAAA;IAClB,4BAA4B;IAC5B,YAAY,EAAE,OAAO,CAAA;IACrB,wCAAwC;IACxC,SAAS,EAAE,OAAO,CAAA;CACnB;AAsBD;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,IAAI,YAAY,CAQ1C;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,YAAY,GAAG,OAAO,CAGrE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,WAAW,GAAG,YAAY,CAelE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,YAAY,GAAG,WAAW,CAExE;AAED;;GAEG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feature flag system for RevealUI Pro/Enterprise tiers.
|
|
3
|
+
*
|
|
4
|
+
* Gates premium features based on the current license tier.
|
|
5
|
+
* Free (OSS) users get the core CMS framework.
|
|
6
|
+
* Pro/Enterprise users unlock AI, advanced sync, dashboard, etc.
|
|
7
|
+
*
|
|
8
|
+
* @dependencies
|
|
9
|
+
* - ./license.ts - License validation and tier checking
|
|
10
|
+
*/
|
|
11
|
+
import { isLicensed } from './license.js';
|
|
12
|
+
/** Feature-to-tier mapping: minimum tier required for each feature */
|
|
13
|
+
const featureTierMap = {
|
|
14
|
+
ai: 'pro',
|
|
15
|
+
mcp: 'pro',
|
|
16
|
+
editors: 'pro',
|
|
17
|
+
harnesses: 'pro',
|
|
18
|
+
payments: 'pro',
|
|
19
|
+
advancedSync: 'pro',
|
|
20
|
+
dashboard: 'pro',
|
|
21
|
+
customDomain: 'pro',
|
|
22
|
+
analytics: 'pro',
|
|
23
|
+
aiMemory: 'max',
|
|
24
|
+
byokServerSide: 'max',
|
|
25
|
+
aiMultiProvider: 'max',
|
|
26
|
+
auditLog: 'max',
|
|
27
|
+
multiTenant: 'enterprise',
|
|
28
|
+
whiteLabel: 'enterprise',
|
|
29
|
+
sso: 'enterprise',
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Returns the current feature flags based on the active license tier.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```typescript
|
|
36
|
+
* import { getFeatures } from '@revealui/core/features'
|
|
37
|
+
*
|
|
38
|
+
* const features = getFeatures()
|
|
39
|
+
* if (features.ai) {
|
|
40
|
+
* // Enable AI agent system
|
|
41
|
+
* }
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export function getFeatures() {
|
|
45
|
+
const flags = {};
|
|
46
|
+
for (const [feature, requiredTier] of Object.entries(featureTierMap)) {
|
|
47
|
+
flags[feature] = isLicensed(requiredTier);
|
|
48
|
+
}
|
|
49
|
+
return flags;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Check if a specific feature is enabled.
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```typescript
|
|
56
|
+
* import { isFeatureEnabled } from '@revealui/core/features'
|
|
57
|
+
*
|
|
58
|
+
* if (isFeatureEnabled('ai')) {
|
|
59
|
+
* // AI is available
|
|
60
|
+
* }
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
export function isFeatureEnabled(feature) {
|
|
64
|
+
const requiredTier = featureTierMap[feature];
|
|
65
|
+
return isLicensed(requiredTier);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Returns all features available at a given tier (useful for pricing pages).
|
|
69
|
+
*/
|
|
70
|
+
export function getFeaturesForTier(tier) {
|
|
71
|
+
const tierRank = {
|
|
72
|
+
free: 0,
|
|
73
|
+
pro: 1,
|
|
74
|
+
max: 2,
|
|
75
|
+
enterprise: 3,
|
|
76
|
+
};
|
|
77
|
+
const flags = {};
|
|
78
|
+
for (const [feature, requiredTier] of Object.entries(featureTierMap)) {
|
|
79
|
+
flags[feature] = tierRank[tier] >= tierRank[requiredTier];
|
|
80
|
+
}
|
|
81
|
+
return flags;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Returns the minimum tier required for a given feature.
|
|
85
|
+
*/
|
|
86
|
+
export function getRequiredTier(feature) {
|
|
87
|
+
return featureTierMap[feature];
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Returns the current license tier. Convenience re-export.
|
|
91
|
+
*/
|
|
92
|
+
export { getCurrentTier } from './license.js';
|
|
93
|
+
//# sourceMappingURL=features.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features.js","sourceRoot":"","sources":["../../../../../core/src/features.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAoB,MAAM,cAAc,CAAA;AAsC3D,sEAAsE;AACtE,MAAM,cAAc,GAA4C;IAC9D,EAAE,EAAE,KAAK;IACT,GAAG,EAAE,KAAK;IACV,OAAO,EAAE,KAAK;IACd,SAAS,EAAE,KAAK;IAChB,QAAQ,EAAE,KAAK;IACf,YAAY,EAAE,KAAK;IACnB,SAAS,EAAE,KAAK;IAChB,YAAY,EAAE,KAAK;IACnB,SAAS,EAAE,KAAK;IAChB,QAAQ,EAAE,KAAK;IACf,cAAc,EAAE,KAAK;IACrB,eAAe,EAAE,KAAK;IACtB,QAAQ,EAAE,KAAK;IACf,WAAW,EAAE,YAAY;IACzB,UAAU,EAAE,YAAY;IACxB,GAAG,EAAE,YAAY;CAClB,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,WAAW;IACzB,MAAM,KAAK,GAAG,EAAkB,CAAA;IAEhC,KAAK,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;QACrE,KAAK,CAAC,OAA6B,CAAC,GAAG,UAAU,CAAC,YAAY,CAAC,CAAA;IACjE,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAA2B;IAC1D,MAAM,YAAY,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;IAC5C,OAAO,UAAU,CAAC,YAAY,CAAC,CAAA;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAiB;IAClD,MAAM,QAAQ,GAAgC;QAC5C,IAAI,EAAE,CAAC;QACP,GAAG,EAAE,CAAC;QACN,GAAG,EAAE,CAAC;QACN,UAAU,EAAE,CAAC;KACd,CAAA;IAED,MAAM,KAAK,GAAG,EAAkB,CAAA;IAEhC,KAAK,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;QACrE,KAAK,CAAC,OAA6B,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,YAAY,CAAC,CAAA;IACjF,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAA2B;IACzD,OAAO,cAAc,CAAC,OAAO,CAAC,CAAA;AAChC,CAAC;AAED;;GAEG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA"}
|
|
@@ -0,0 +1,75 @@
|
|
|
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 { z } from 'zod';
|
|
9
|
+
/** Available license tiers */
|
|
10
|
+
export type LicenseTier = 'free' | 'pro' | 'max' | 'enterprise';
|
|
11
|
+
/** Decoded license payload schema */
|
|
12
|
+
declare const licensePayloadSchema: z.ZodObject<{
|
|
13
|
+
tier: z.ZodEnum<{
|
|
14
|
+
pro: "pro";
|
|
15
|
+
max: "max";
|
|
16
|
+
enterprise: "enterprise";
|
|
17
|
+
}>;
|
|
18
|
+
customerId: z.ZodString;
|
|
19
|
+
domains: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
20
|
+
maxSites: z.ZodOptional<z.ZodNumber>;
|
|
21
|
+
maxUsers: z.ZodOptional<z.ZodNumber>;
|
|
22
|
+
iat: z.ZodOptional<z.ZodNumber>;
|
|
23
|
+
exp: z.ZodOptional<z.ZodNumber>;
|
|
24
|
+
}, z.core.$strip>;
|
|
25
|
+
export type LicensePayload = z.infer<typeof licensePayloadSchema>;
|
|
26
|
+
/**
|
|
27
|
+
* Validates a license key JWT and returns the decoded payload.
|
|
28
|
+
* Returns null if the key is invalid, expired, or missing.
|
|
29
|
+
*/
|
|
30
|
+
export declare function validateLicenseKey(licenseKey: string, publicKey: string): Promise<LicensePayload | null>;
|
|
31
|
+
/**
|
|
32
|
+
* Initialize the license system. Call once at application startup.
|
|
33
|
+
* Reads REVEALUI_LICENSE_KEY and REVEALUI_LICENSE_PUBLIC_KEY from environment.
|
|
34
|
+
*
|
|
35
|
+
* @returns The resolved license tier
|
|
36
|
+
*/
|
|
37
|
+
export declare function initializeLicense(): Promise<LicenseTier>;
|
|
38
|
+
/**
|
|
39
|
+
* Returns the current license tier.
|
|
40
|
+
* If the license hasn't been initialized, returns 'free'.
|
|
41
|
+
*/
|
|
42
|
+
export declare function getCurrentTier(): LicenseTier;
|
|
43
|
+
/**
|
|
44
|
+
* Returns the full license payload, or null if no valid license.
|
|
45
|
+
*/
|
|
46
|
+
export declare function getLicensePayload(): LicensePayload | null;
|
|
47
|
+
/**
|
|
48
|
+
* Checks whether the current license is at least the given tier.
|
|
49
|
+
* Also validates that the license has not expired (checks JWT exp claim).
|
|
50
|
+
*/
|
|
51
|
+
export declare function isLicensed(requiredTier: LicenseTier): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Returns the maximum number of sites allowed by the current license.
|
|
54
|
+
*/
|
|
55
|
+
export declare function getMaxSites(): number;
|
|
56
|
+
/**
|
|
57
|
+
* Returns the maximum number of users/editors allowed by the current license.
|
|
58
|
+
*/
|
|
59
|
+
export declare function getMaxUsers(): number;
|
|
60
|
+
/**
|
|
61
|
+
* Generates a signed license key JWT.
|
|
62
|
+
* This is a server-only function — requires the private key.
|
|
63
|
+
*
|
|
64
|
+
* @param payload - License payload (tier, customerId, limits)
|
|
65
|
+
* @param privateKey - RS256 or ES256 private key (PEM format)
|
|
66
|
+
* @param expiresInSeconds - JWT expiration in seconds. Defaults to 1 year.
|
|
67
|
+
* @returns Signed JWT string
|
|
68
|
+
*/
|
|
69
|
+
export declare function generateLicenseKey(payload: Omit<LicensePayload, 'iat' | 'exp'>, privateKey: string, expiresInSeconds?: number): Promise<string>;
|
|
70
|
+
/**
|
|
71
|
+
* Reset license state. Primarily for testing.
|
|
72
|
+
*/
|
|
73
|
+
export declare function resetLicenseState(): void;
|
|
74
|
+
export {};
|
|
75
|
+
//# sourceMappingURL=license.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../../../../../core/src/license.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,8BAA8B;AAC9B,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,YAAY,CAAA;AAE/D,qCAAqC;AACrC,QAAA,MAAM,oBAAoB;;;;;;;;;;;;iBAexB,CAAA;AAEF,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AA+BjE;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAgBhC;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,WAAW,CAAC,CAuB9D;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,WAAW,CAE5C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,GAAG,IAAI,CAEzD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,YAAY,EAAE,WAAW,GAAG,OAAO,CAoB7D;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAKpC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAKpC;AAED;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,KAAK,GAAG,KAAK,CAAC,EAC5C,UAAU,EAAE,MAAM,EAClB,gBAAgB,SAAqB,GACpC,OAAO,CAAC,MAAM,CAAC,CAOjB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}
|
|
@@ -0,0 +1,174 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license.js","sourceRoot":"","sources":["../../../../../core/src/license.ts"],"names":[],"mappings":"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"}
|