shieldcortex 2.17.1 → 2.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. package/README.md +42 -24
  2. package/dashboard/.next/standalone/dashboard/.next/BUILD_ID +1 -1
  3. package/dashboard/.next/standalone/dashboard/.next/build-manifest.json +2 -2
  4. package/dashboard/.next/standalone/dashboard/.next/prerender-manifest.json +3 -3
  5. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.html +2 -2
  6. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.rsc +1 -1
  7. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  8. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  9. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  10. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  11. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  12. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  13. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.html +1 -1
  14. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.rsc +2 -2
  15. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  16. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  17. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  18. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  19. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  20. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  21. package/dashboard/.next/standalone/dashboard/.next/server/app/index.html +1 -1
  22. package/dashboard/.next/standalone/dashboard/.next/server/app/index.rsc +3 -3
  23. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  24. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_full.segment.rsc +3 -3
  25. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_head.segment.rsc +1 -1
  26. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_index.segment.rsc +2 -2
  27. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  28. package/dashboard/.next/standalone/dashboard/.next/server/app/page_client-reference-manifest.js +1 -1
  29. package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_25b1b286._.js +1 -1
  30. package/dashboard/.next/standalone/dashboard/.next/server/pages/404.html +1 -1
  31. package/dashboard/.next/standalone/dashboard/.next/server/pages/500.html +2 -2
  32. package/dashboard/.next/standalone/dashboard/.next/server/server-reference-manifest.js +1 -1
  33. package/dashboard/.next/standalone/dashboard/.next/server/server-reference-manifest.json +1 -1
  34. package/dashboard/.next/standalone/dashboard/.next/static/chunks/1a71c9a52f0c9b16.css +3 -0
  35. package/dashboard/.next/standalone/dashboard/.next/static/chunks/6bf7d89d34068ecb.js +9 -0
  36. package/dashboard/.next/standalone/dashboard/.next/static/chunks/d0dcb5e0e04ae015.js +1 -0
  37. package/dashboard/.next/standalone/dashboard/package.json +1 -1
  38. package/dist/api/visualization-server.d.ts.map +1 -1
  39. package/dist/api/visualization-server.js +306 -0
  40. package/dist/api/visualization-server.js.map +1 -1
  41. package/dist/cloud/config.d.ts +13 -1
  42. package/dist/cloud/config.d.ts.map +1 -1
  43. package/dist/cloud/config.js +28 -3
  44. package/dist/cloud/config.js.map +1 -1
  45. package/dist/database/init.d.ts.map +1 -1
  46. package/dist/database/init.js +77 -0
  47. package/dist/database/init.js.map +1 -1
  48. package/dist/defence/__tests__/tool-response-scanner.test.d.ts +8 -0
  49. package/dist/defence/__tests__/tool-response-scanner.test.d.ts.map +1 -0
  50. package/dist/defence/__tests__/tool-response-scanner.test.js +106 -0
  51. package/dist/defence/__tests__/tool-response-scanner.test.js.map +1 -0
  52. package/dist/defence/audit/export.d.ts +6 -0
  53. package/dist/defence/audit/export.d.ts.map +1 -0
  54. package/dist/defence/audit/export.js +43 -0
  55. package/dist/defence/audit/export.js.map +1 -0
  56. package/dist/defence/custom-patterns/store.d.ts +52 -0
  57. package/dist/defence/custom-patterns/store.d.ts.map +1 -0
  58. package/dist/defence/custom-patterns/store.js +108 -0
  59. package/dist/defence/custom-patterns/store.js.map +1 -0
  60. package/dist/defence/custom-rules/store.d.ts +36 -0
  61. package/dist/defence/custom-rules/store.d.ts.map +1 -0
  62. package/dist/defence/custom-rules/store.js +57 -0
  63. package/dist/defence/custom-rules/store.js.map +1 -0
  64. package/dist/defence/iron-dome/custom-policies.d.ts +31 -0
  65. package/dist/defence/iron-dome/custom-policies.d.ts.map +1 -0
  66. package/dist/defence/iron-dome/custom-policies.js +79 -0
  67. package/dist/defence/iron-dome/custom-policies.js.map +1 -0
  68. package/dist/defence/iron-dome/index.d.ts +5 -5
  69. package/dist/defence/iron-dome/index.d.ts.map +1 -1
  70. package/dist/defence/iron-dome/index.js +55 -6
  71. package/dist/defence/iron-dome/index.js.map +1 -1
  72. package/dist/defence/pipeline.d.ts.map +1 -1
  73. package/dist/defence/pipeline.js +82 -6
  74. package/dist/defence/pipeline.js.map +1 -1
  75. package/dist/defence/skill-scanner/deep-scan.d.ts +30 -0
  76. package/dist/defence/skill-scanner/deep-scan.d.ts.map +1 -0
  77. package/dist/defence/skill-scanner/deep-scan.js +112 -0
  78. package/dist/defence/skill-scanner/deep-scan.js.map +1 -0
  79. package/dist/defence/tool-response-scanner.d.ts +23 -0
  80. package/dist/defence/tool-response-scanner.d.ts.map +1 -0
  81. package/dist/defence/tool-response-scanner.js +157 -0
  82. package/dist/defence/tool-response-scanner.js.map +1 -0
  83. package/dist/defence/trust/source-scorer.d.ts.map +1 -1
  84. package/dist/defence/trust/source-scorer.js +2 -1
  85. package/dist/defence/trust/source-scorer.js.map +1 -1
  86. package/dist/defence/types.d.ts +13 -2
  87. package/dist/defence/types.d.ts.map +1 -1
  88. package/dist/defence/types.js.map +1 -1
  89. package/dist/index.d.ts +3 -0
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/index.js +9 -0
  92. package/dist/index.js.map +1 -1
  93. package/dist/lib.d.ts +4 -0
  94. package/dist/lib.d.ts.map +1 -1
  95. package/dist/lib.js +4 -0
  96. package/dist/lib.js.map +1 -1
  97. package/dist/license/__tests__/feature-gating.test.d.ts +10 -0
  98. package/dist/license/__tests__/feature-gating.test.d.ts.map +1 -0
  99. package/dist/license/__tests__/feature-gating.test.js +188 -0
  100. package/dist/license/__tests__/feature-gating.test.js.map +1 -0
  101. package/dist/license/cli.d.ts +9 -0
  102. package/dist/license/cli.d.ts.map +1 -0
  103. package/dist/license/cli.js +141 -0
  104. package/dist/license/cli.js.map +1 -0
  105. package/dist/license/gate.d.ts +38 -0
  106. package/dist/license/gate.d.ts.map +1 -0
  107. package/dist/license/gate.js +84 -0
  108. package/dist/license/gate.js.map +1 -0
  109. package/dist/license/index.d.ts +13 -0
  110. package/dist/license/index.d.ts.map +1 -0
  111. package/dist/license/index.js +12 -0
  112. package/dist/license/index.js.map +1 -0
  113. package/dist/license/keys.d.ts +50 -0
  114. package/dist/license/keys.d.ts.map +1 -0
  115. package/dist/license/keys.js +30 -0
  116. package/dist/license/keys.js.map +1 -0
  117. package/dist/license/store.d.ts +45 -0
  118. package/dist/license/store.d.ts.map +1 -0
  119. package/dist/license/store.js +148 -0
  120. package/dist/license/store.js.map +1 -0
  121. package/dist/license/types.d.ts +16 -0
  122. package/dist/license/types.d.ts.map +1 -0
  123. package/dist/license/types.js +6 -0
  124. package/dist/license/types.js.map +1 -0
  125. package/dist/license/validate.d.ts +24 -0
  126. package/dist/license/validate.d.ts.map +1 -0
  127. package/dist/license/validate.js +86 -0
  128. package/dist/license/validate.js.map +1 -0
  129. package/dist/license/verify.d.ts +18 -0
  130. package/dist/license/verify.d.ts.map +1 -0
  131. package/dist/license/verify.js +126 -0
  132. package/dist/license/verify.js.map +1 -0
  133. package/dist/memory/store.d.ts.map +1 -1
  134. package/dist/memory/store.js +18 -16
  135. package/dist/memory/store.js.map +1 -1
  136. package/dist/server.d.ts.map +1 -1
  137. package/dist/server.js +99 -16
  138. package/dist/server.js.map +1 -1
  139. package/dist/tools/context.d.ts +5 -5
  140. package/dist/tools/context.d.ts.map +1 -1
  141. package/dist/tools/context.js +3 -1
  142. package/dist/tools/context.js.map +1 -1
  143. package/dist/tools/forget.d.ts +5 -5
  144. package/dist/tools/forget.js +1 -1
  145. package/dist/tools/forget.js.map +1 -1
  146. package/dist/tools/recall.d.ts +10 -10
  147. package/dist/tools/recall.js +1 -1
  148. package/dist/tools/recall.js.map +1 -1
  149. package/dist/tools/remember.d.ts +7 -7
  150. package/dist/tools/remember.js +1 -1
  151. package/dist/tools/remember.js.map +1 -1
  152. package/dist/worker/brain-worker.d.ts.map +1 -1
  153. package/dist/worker/brain-worker.js +25 -18
  154. package/dist/worker/brain-worker.js.map +1 -1
  155. package/hooks/openclaw/cortex-memory/HOOK.md +7 -7
  156. package/hooks/openclaw/cortex-memory/handler.ts +1 -1
  157. package/package.json +2 -1
  158. package/plugins/openclaw/README.md +8 -8
  159. package/plugins/openclaw/index.ts +1 -1
  160. package/dashboard/.next/standalone/dashboard/.next/static/chunks/42d01b77019fd208.js +0 -1
  161. package/dashboard/.next/standalone/dashboard/.next/static/chunks/61a3c89b08347bc2.js +0 -9
  162. package/dashboard/.next/standalone/dashboard/.next/static/chunks/c252c4de65df6d09.css +0 -3
  163. /package/dashboard/.next/standalone/dashboard/.next/static/{H-BGC5Yp6YmPEZGryV6bd → OfvwyqIJFP9N3Qdb23S-6}/_buildManifest.js +0 -0
  164. /package/dashboard/.next/standalone/dashboard/.next/static/{H-BGC5Yp6YmPEZGryV6bd → OfvwyqIJFP9N3Qdb23S-6}/_clientMiddlewareManifest.json +0 -0
  165. /package/dashboard/.next/standalone/dashboard/.next/static/{H-BGC5Yp6YmPEZGryV6bd → OfvwyqIJFP9N3Qdb23S-6}/_ssgManifest.js +0 -0
@@ -0,0 +1,188 @@
1
+ /**
2
+ * Feature Gating Tests
3
+ *
4
+ * Verifies tier-based feature access:
5
+ * - Free tier: isFeatureEnabled returns false, requireFeature throws FeatureGatedError
6
+ * - Pro tier: all Pro features enabled, requireFeature doesn't throw
7
+ * - FeatureGatedResponse contract matches frontend expectations
8
+ */
9
+ import { describe, it, expect, beforeEach, afterEach } from '@jest/globals';
10
+ // We test the gate module by temporarily removing the license file.
11
+ // getLicenseTier() → getLicense() reads from ~/.shieldcortex/license.json.
12
+ describe('Feature Gating', () => {
13
+ let originalEnv;
14
+ beforeEach(() => {
15
+ originalEnv = process.env.SHIELDCORTEX_LICENSE_TIER;
16
+ });
17
+ afterEach(() => {
18
+ if (originalEnv !== undefined) {
19
+ process.env.SHIELDCORTEX_LICENSE_TIER = originalEnv;
20
+ }
21
+ else {
22
+ delete process.env.SHIELDCORTEX_LICENSE_TIER;
23
+ }
24
+ });
25
+ describe('FeatureGatedError', () => {
26
+ it('should include feature name and required tier', async () => {
27
+ const { FeatureGatedError } = await import('../gate.js');
28
+ const err = new FeatureGatedError('custom_firewall_rules', 'pro');
29
+ expect(err.feature).toBe('custom_firewall_rules');
30
+ expect(err.requiredTier).toBe('pro');
31
+ expect(err.name).toBe('FeatureGatedError');
32
+ expect(err.message).toContain('Pro');
33
+ });
34
+ it('should include upgrade URL in message', async () => {
35
+ const { FeatureGatedError } = await import('../gate.js');
36
+ const err = new FeatureGatedError('audit_export', 'pro');
37
+ expect(err.message).toContain('shieldcortex.ai/pricing');
38
+ });
39
+ it('should include activate command hint', async () => {
40
+ const { FeatureGatedError } = await import('../gate.js');
41
+ const err = new FeatureGatedError('skill_scanner_deep', 'pro');
42
+ expect(err.message).toContain('license activate');
43
+ });
44
+ });
45
+ describe('isFeatureEnabled', () => {
46
+ it('should return false for Pro features on free tier', async () => {
47
+ const { isFeatureEnabled } = await import('../gate.js');
48
+ const { clearLicenseCache } = await import('../store.js');
49
+ const { existsSync, renameSync } = await import('fs');
50
+ const { join } = await import('path');
51
+ const { homedir } = await import('os');
52
+ const licensePath = join(homedir(), '.shieldcortex', 'license.json');
53
+ const backupPath = licensePath + '.test-backup-1';
54
+ let backed = false;
55
+ if (existsSync(licensePath)) {
56
+ renameSync(licensePath, backupPath);
57
+ backed = true;
58
+ }
59
+ clearLicenseCache();
60
+ try {
61
+ const proFeatures = [
62
+ 'custom_injection_patterns',
63
+ 'custom_iron_dome_policies',
64
+ 'custom_firewall_rules',
65
+ 'audit_export',
66
+ 'skill_scanner_deep',
67
+ ];
68
+ for (const feature of proFeatures) {
69
+ expect(isFeatureEnabled(feature)).toBe(false);
70
+ }
71
+ }
72
+ finally {
73
+ if (backed) {
74
+ renameSync(backupPath, licensePath);
75
+ }
76
+ clearLicenseCache();
77
+ }
78
+ });
79
+ });
80
+ describe('requireFeature', () => {
81
+ it('should throw FeatureGatedError for Pro features on free tier', async () => {
82
+ const { requireFeature, FeatureGatedError } = await import('../gate.js');
83
+ const { clearLicenseCache } = await import('../store.js');
84
+ const { existsSync, renameSync } = await import('fs');
85
+ const { join } = await import('path');
86
+ const { homedir } = await import('os');
87
+ const licensePath = join(homedir(), '.shieldcortex', 'license.json');
88
+ const backupPath = licensePath + '.test-backup-2';
89
+ let backed = false;
90
+ if (existsSync(licensePath)) {
91
+ renameSync(licensePath, backupPath);
92
+ backed = true;
93
+ }
94
+ clearLicenseCache();
95
+ try {
96
+ expect(() => requireFeature('custom_firewall_rules')).toThrow(FeatureGatedError);
97
+ expect(() => requireFeature('audit_export')).toThrow(FeatureGatedError);
98
+ expect(() => requireFeature('skill_scanner_deep')).toThrow(FeatureGatedError);
99
+ expect(() => requireFeature('custom_injection_patterns')).toThrow(FeatureGatedError);
100
+ expect(() => requireFeature('custom_iron_dome_policies')).toThrow(FeatureGatedError);
101
+ }
102
+ finally {
103
+ if (backed) {
104
+ renameSync(backupPath, licensePath);
105
+ }
106
+ clearLicenseCache();
107
+ }
108
+ });
109
+ it('should not throw for Pro features when Pro tier is active', async () => {
110
+ const { requireFeature } = await import('../gate.js');
111
+ const { clearLicenseCache } = await import('../store.js');
112
+ const { existsSync } = await import('fs');
113
+ const { join } = await import('path');
114
+ const { homedir } = await import('os');
115
+ const licensePath = join(homedir(), '.shieldcortex', 'license.json');
116
+ // This test only works if a valid Pro license is installed
117
+ if (!existsSync(licensePath)) {
118
+ // Skip - no license file available for Pro tier testing
119
+ return;
120
+ }
121
+ clearLicenseCache();
122
+ try {
123
+ // If the license is Pro, these should not throw
124
+ const { getLicenseTier } = await import('../store.js');
125
+ const tier = getLicenseTier();
126
+ if (tier === 'pro' || tier === 'team' || tier === 'enterprise') {
127
+ expect(() => requireFeature('custom_firewall_rules')).not.toThrow();
128
+ expect(() => requireFeature('audit_export')).not.toThrow();
129
+ expect(() => requireFeature('skill_scanner_deep')).not.toThrow();
130
+ }
131
+ }
132
+ finally {
133
+ clearLicenseCache();
134
+ }
135
+ });
136
+ });
137
+ describe('getRequiredTier', () => {
138
+ it('should return pro for all 5 Pro features', async () => {
139
+ const { getRequiredTier } = await import('../gate.js');
140
+ expect(getRequiredTier('custom_injection_patterns')).toBe('pro');
141
+ expect(getRequiredTier('custom_iron_dome_policies')).toBe('pro');
142
+ expect(getRequiredTier('custom_firewall_rules')).toBe('pro');
143
+ expect(getRequiredTier('audit_export')).toBe('pro');
144
+ expect(getRequiredTier('skill_scanner_deep')).toBe('pro');
145
+ });
146
+ it('should return team for team features', async () => {
147
+ const { getRequiredTier } = await import('../gate.js');
148
+ expect(getRequiredTier('cloud_sync')).toBe('team');
149
+ expect(getRequiredTier('team_management')).toBe('team');
150
+ });
151
+ });
152
+ describe('listFeatures', () => {
153
+ it('should list all features with tier, availability, and description', async () => {
154
+ const { listFeatures } = await import('../gate.js');
155
+ const features = listFeatures();
156
+ expect(features.length).toBeGreaterThanOrEqual(8);
157
+ for (const f of features) {
158
+ expect(f).toHaveProperty('feature');
159
+ expect(f).toHaveProperty('requiredTier');
160
+ expect(f).toHaveProperty('enabled');
161
+ expect(f).toHaveProperty('description');
162
+ expect(typeof f.description).toBe('string');
163
+ expect(f.description.length).toBeGreaterThan(0);
164
+ }
165
+ });
166
+ });
167
+ describe('FeatureGatedResponse contract', () => {
168
+ it('should match the shared type shape used by frontend gatedFetch', async () => {
169
+ const { FeatureGatedError } = await import('../gate.js');
170
+ const err = new FeatureGatedError('custom_firewall_rules', 'pro');
171
+ // Simulate what requireProFeature middleware builds
172
+ const body = {
173
+ error: 'Feature requires upgrade',
174
+ code: 'FEATURE_GATED',
175
+ feature: err.feature,
176
+ requiredTier: err.requiredTier,
177
+ upgradeUrl: 'https://shieldcortex.ai/pricing',
178
+ };
179
+ // Frontend gatedFetch checks: response.status === 403 && body.code === 'FEATURE_GATED'
180
+ expect(body.code).toBe('FEATURE_GATED');
181
+ expect(body.feature).toBe('custom_firewall_rules');
182
+ expect(body.requiredTier).toBe('pro');
183
+ expect(body.upgradeUrl).toContain('shieldcortex.ai');
184
+ expect(body.error).toBeTruthy();
185
+ });
186
+ });
187
+ });
188
+ //# sourceMappingURL=feature-gating.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-gating.test.js","sourceRoot":"","sources":["../../../src/license/__tests__/feature-gating.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * CLI commands for license management.
3
+ *
4
+ * shieldcortex license activate <key>
5
+ * shieldcortex license status
6
+ * shieldcortex license deactivate
7
+ */
8
+ export declare function handleLicenseCommand(args: string[]): Promise<void>;
9
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/license/cli.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAgIH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBxE"}
@@ -0,0 +1,141 @@
1
+ /**
2
+ * CLI commands for license management.
3
+ *
4
+ * shieldcortex license activate <key>
5
+ * shieldcortex license status
6
+ * shieldcortex license deactivate
7
+ */
8
+ import { activateLicense, deactivateLicense, getLicense, getLicenseFile } from './store.js';
9
+ import { listFeatures } from './gate.js';
10
+ import { validateOnceNow } from './validate.js';
11
+ const bold = '\x1b[1m';
12
+ const reset = '\x1b[0m';
13
+ const green = '\x1b[32m';
14
+ const red = '\x1b[31m';
15
+ const yellow = '\x1b[33m';
16
+ const cyan = '\x1b[36m';
17
+ const dim = '\x1b[2m';
18
+ function tierBadge(tier) {
19
+ switch (tier) {
20
+ case 'enterprise': return `${bold}${cyan}Enterprise${reset}`;
21
+ case 'team': return `${bold}${cyan}Team${reset}`;
22
+ case 'pro': return `${bold}${green}Pro${reset}`;
23
+ default: return `${dim}Free${reset}`;
24
+ }
25
+ }
26
+ // ── Activate ─────────────────────────────────────────────
27
+ async function handleActivate(key) {
28
+ if (!key) {
29
+ console.error('Usage: shieldcortex license activate <key>');
30
+ console.error('');
31
+ console.error('Get your licence key at https://shieldcortex.ai/pricing');
32
+ process.exit(1);
33
+ }
34
+ try {
35
+ const info = activateLicense(key);
36
+ console.log(`\n${bold}Licence Activated${reset}`);
37
+ console.log('═'.repeat(40));
38
+ console.log(` Tier: ${tierBadge(info.tier)}`);
39
+ console.log(` Email: ${info.email}`);
40
+ if (info.expiresAt) {
41
+ console.log(` Expires: ${info.expiresAt.toLocaleDateString()} (${info.daysUntilExpiry} days)`);
42
+ }
43
+ // Run one-time online validation
44
+ console.log(`\n ${dim}Validating online...${reset}`);
45
+ const status = await validateOnceNow();
46
+ if (status === 'valid') {
47
+ console.log(` ${green}✓${reset} Licence confirmed active`);
48
+ }
49
+ else if (status === 'revoked') {
50
+ console.log(` ${red}✗${reset} Licence has been revoked`);
51
+ }
52
+ else {
53
+ console.log(` ${yellow}!${reset} Could not reach validation server (licence works offline)`);
54
+ }
55
+ // Show unlocked features
56
+ console.log(`\n${bold}Features:${reset}`);
57
+ const features = listFeatures();
58
+ for (const f of features) {
59
+ const icon = f.enabled ? `${green}[✓]${reset}` : `${dim}[ ]${reset}`;
60
+ const tierLabel = f.enabled ? '' : ` ${dim}(${f.requiredTier})${reset}`;
61
+ console.log(` ${icon} ${f.description}${tierLabel}`);
62
+ }
63
+ console.log();
64
+ }
65
+ catch (err) {
66
+ const message = err instanceof Error ? err.message : String(err);
67
+ console.error(`\n${red}Activation failed:${reset} ${message}`);
68
+ process.exit(1);
69
+ }
70
+ }
71
+ // ── Status ───────────────────────────────────────────────
72
+ function handleStatus() {
73
+ const info = getLicense();
74
+ const file = getLicenseFile();
75
+ console.log(`\n${bold}ShieldCortex Licence${reset}`);
76
+ console.log('═'.repeat(40));
77
+ console.log(` Tier: ${tierBadge(info.tier)}`);
78
+ if (info.tier === 'free') {
79
+ console.log(`\n No licence activated.`);
80
+ console.log(` Upgrade at ${cyan}https://shieldcortex.ai/pricing${reset}`);
81
+ console.log(` Activate: shieldcortex license activate <key>\n`);
82
+ return;
83
+ }
84
+ console.log(` Email: ${info.email}`);
85
+ if (info.expiresAt) {
86
+ const daysStr = info.daysUntilExpiry !== null && info.daysUntilExpiry > 0
87
+ ? `(${info.daysUntilExpiry} days remaining)`
88
+ : info.daysUntilExpiry !== null && info.daysUntilExpiry <= 0
89
+ ? `${red}(expired)${reset}`
90
+ : '';
91
+ console.log(` Expires: ${info.expiresAt.toLocaleDateString()} ${daysStr}`);
92
+ }
93
+ if (file?.lastValidatedAt) {
94
+ console.log(` Validated: ${new Date(file.lastValidatedAt).toLocaleString()}`);
95
+ }
96
+ if (file?.validationStatus) {
97
+ const statusColor = file.validationStatus === 'valid' ? green :
98
+ file.validationStatus === 'revoked' ? red : yellow;
99
+ console.log(` Status: ${statusColor}${file.validationStatus}${reset}`);
100
+ }
101
+ console.log(`\n${bold}Features:${reset}`);
102
+ const features = listFeatures();
103
+ for (const f of features) {
104
+ const icon = f.enabled ? `${green}[✓]${reset}` : `${dim}[ ]${reset}`;
105
+ const tierLabel = f.enabled ? '' : ` ${dim}(${f.requiredTier})${reset}`;
106
+ console.log(` ${icon} ${f.description}${tierLabel}`);
107
+ }
108
+ console.log();
109
+ }
110
+ // ── Deactivate ───────────────────────────────────────────
111
+ function handleDeactivate() {
112
+ deactivateLicense();
113
+ console.log(`\n${bold}Licence deactivated.${reset}`);
114
+ console.log(`All features reverted to Free tier.\n`);
115
+ }
116
+ // ── Router ───────────────────────────────────────────────
117
+ export async function handleLicenseCommand(args) {
118
+ const subcommand = args[0];
119
+ switch (subcommand) {
120
+ case 'activate':
121
+ await handleActivate(args[1]);
122
+ break;
123
+ case 'status':
124
+ handleStatus();
125
+ break;
126
+ case 'deactivate':
127
+ handleDeactivate();
128
+ break;
129
+ default:
130
+ console.log(`\n${bold}ShieldCortex Licence${reset}`);
131
+ console.log('');
132
+ console.log(' shieldcortex license activate <key> Activate a licence key');
133
+ console.log(' shieldcortex license status Show current licence');
134
+ console.log(' shieldcortex license deactivate Remove licence');
135
+ console.log('');
136
+ console.log(` Get your key at ${cyan}https://shieldcortex.ai/pricing${reset}`);
137
+ console.log();
138
+ break;
139
+ }
140
+ }
141
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/license/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Feature gating — the central guard for Pro/Team features.
3
+ *
4
+ * Usage:
5
+ * requireFeature('custom_injection_patterns'); // throws FeatureGatedError if not Pro+
6
+ * isFeatureEnabled('cloud_sync'); // returns boolean (soft check)
7
+ */
8
+ import { type LicenseTier } from './keys.js';
9
+ export type GatedFeature = 'custom_injection_patterns' | 'custom_iron_dome_policies' | 'custom_firewall_rules' | 'audit_export' | 'skill_scanner_deep' | 'cloud_sync' | 'team_management' | 'shared_patterns';
10
+ export declare class FeatureGatedError extends Error {
11
+ feature: GatedFeature;
12
+ requiredTier: LicenseTier;
13
+ constructor(feature: GatedFeature, requiredTier: LicenseTier);
14
+ }
15
+ /**
16
+ * Check if a feature is enabled under the current licence tier.
17
+ * Use for soft checks (e.g. hiding UI elements, silent returns).
18
+ */
19
+ export declare function isFeatureEnabled(feature: GatedFeature): boolean;
20
+ /**
21
+ * Require a feature — throws FeatureGatedError if the current licence
22
+ * doesn't include it. Use at the entry point of gated features.
23
+ */
24
+ export declare function requireFeature(feature: GatedFeature): void;
25
+ /**
26
+ * Get the minimum tier required for a feature.
27
+ */
28
+ export declare function getRequiredTier(feature: GatedFeature): LicenseTier;
29
+ /**
30
+ * List all features with their required tier and current availability.
31
+ */
32
+ export declare function listFeatures(): Array<{
33
+ feature: GatedFeature;
34
+ requiredTier: LicenseTier;
35
+ enabled: boolean;
36
+ description: string;
37
+ }>;
38
+ //# sourceMappingURL=gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../src/license/gate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAa,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAIxD,MAAM,MAAM,YAAY,GACpB,2BAA2B,GAC3B,2BAA2B,GAC3B,uBAAuB,GACvB,cAAc,GACd,oBAAoB,GACpB,YAAY,GACZ,iBAAiB,GACjB,iBAAiB,CAAC;AA0BtB,qBAAa,iBAAkB,SAAQ,KAAK;IAEjC,OAAO,EAAE,YAAY;IACrB,YAAY,EAAE,WAAW;gBADzB,OAAO,EAAE,YAAY,EACrB,YAAY,EAAE,WAAW;CAYnC;AAID;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAI/D;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAI1D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,WAAW,CAElE;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,KAAK,CAAC;IACpC,OAAO,EAAE,YAAY,CAAC;IACtB,YAAY,EAAE,WAAW,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC,CAUD"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Feature gating — the central guard for Pro/Team features.
3
+ *
4
+ * Usage:
5
+ * requireFeature('custom_injection_patterns'); // throws FeatureGatedError if not Pro+
6
+ * isFeatureEnabled('cloud_sync'); // returns boolean (soft check)
7
+ */
8
+ import { getLicenseTier } from './store.js';
9
+ import { TIER_RANK } from './keys.js';
10
+ const FEATURE_TIERS = {
11
+ custom_injection_patterns: 'pro',
12
+ custom_iron_dome_policies: 'pro',
13
+ custom_firewall_rules: 'pro',
14
+ audit_export: 'pro',
15
+ skill_scanner_deep: 'pro',
16
+ cloud_sync: 'team',
17
+ team_management: 'team',
18
+ shared_patterns: 'team',
19
+ };
20
+ const FEATURE_DESCRIPTIONS = {
21
+ custom_injection_patterns: 'Define up to 50 custom regex patterns for detecting domain-specific threats.',
22
+ custom_iron_dome_policies: 'Create custom Iron Dome policies with tailored action gates and trust levels.',
23
+ custom_firewall_rules: 'Add custom firewall rules to block or allow specific content patterns.',
24
+ audit_export: 'Export your full audit trail as JSON or CSV for compliance reporting.',
25
+ skill_scanner_deep: 'Deep skill scanning with multi-file analysis and semantic intent detection.',
26
+ cloud_sync: 'Sync audit data across devices for centralised team visibility.',
27
+ team_management: 'Manage team members, invites, and shared security policies.',
28
+ shared_patterns: 'Share custom injection patterns and policies across your team.',
29
+ };
30
+ // ── Error class ──────────────────────────────────────────
31
+ export class FeatureGatedError extends Error {
32
+ feature;
33
+ requiredTier;
34
+ constructor(feature, requiredTier) {
35
+ const tierLabel = requiredTier.charAt(0).toUpperCase() + requiredTier.slice(1);
36
+ const desc = FEATURE_DESCRIPTIONS[feature];
37
+ super(`This feature requires a ${tierLabel} licence.\n\n` +
38
+ `${desc}\n\n` +
39
+ ` Upgrade: https://shieldcortex.ai/pricing\n` +
40
+ ` Activate: shieldcortex license activate <key>`);
41
+ this.feature = feature;
42
+ this.requiredTier = requiredTier;
43
+ this.name = 'FeatureGatedError';
44
+ }
45
+ }
46
+ // ── Guards ────────────────────────────────────────────────
47
+ /**
48
+ * Check if a feature is enabled under the current licence tier.
49
+ * Use for soft checks (e.g. hiding UI elements, silent returns).
50
+ */
51
+ export function isFeatureEnabled(feature) {
52
+ const requiredTier = FEATURE_TIERS[feature];
53
+ const currentTier = getLicenseTier();
54
+ return TIER_RANK[currentTier] >= TIER_RANK[requiredTier];
55
+ }
56
+ /**
57
+ * Require a feature — throws FeatureGatedError if the current licence
58
+ * doesn't include it. Use at the entry point of gated features.
59
+ */
60
+ export function requireFeature(feature) {
61
+ if (!isFeatureEnabled(feature)) {
62
+ throw new FeatureGatedError(feature, FEATURE_TIERS[feature]);
63
+ }
64
+ }
65
+ /**
66
+ * Get the minimum tier required for a feature.
67
+ */
68
+ export function getRequiredTier(feature) {
69
+ return FEATURE_TIERS[feature];
70
+ }
71
+ /**
72
+ * List all features with their required tier and current availability.
73
+ */
74
+ export function listFeatures() {
75
+ const currentTier = getLicenseTier();
76
+ const currentRank = TIER_RANK[currentTier];
77
+ return Object.keys(FEATURE_TIERS).map((feature) => ({
78
+ feature,
79
+ requiredTier: FEATURE_TIERS[feature],
80
+ enabled: currentRank >= TIER_RANK[FEATURE_TIERS[feature]],
81
+ description: FEATURE_DESCRIPTIONS[feature],
82
+ }));
83
+ }
84
+ //# sourceMappingURL=gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.js","sourceRoot":"","sources":["../../src/license/gate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAoB,MAAM,WAAW,CAAC;AAcxD,MAAM,aAAa,GAAsC;IACvD,yBAAyB,EAAE,KAAK;IAChC,yBAAyB,EAAE,KAAK;IAChC,qBAAqB,EAAE,KAAK;IAC5B,YAAY,EAAE,KAAK;IACnB,kBAAkB,EAAE,KAAK;IACzB,UAAU,EAAE,MAAM;IAClB,eAAe,EAAE,MAAM;IACvB,eAAe,EAAE,MAAM;CACxB,CAAC;AAEF,MAAM,oBAAoB,GAAiC;IACzD,yBAAyB,EAAE,8EAA8E;IACzG,yBAAyB,EAAE,+EAA+E;IAC1G,qBAAqB,EAAE,wEAAwE;IAC/F,YAAY,EAAE,uEAAuE;IACrF,kBAAkB,EAAE,6EAA6E;IACjG,UAAU,EAAE,iEAAiE;IAC7E,eAAe,EAAE,6DAA6D;IAC9E,eAAe,EAAE,gEAAgE;CAClF,CAAC;AAEF,4DAA4D;AAE5D,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAEjC;IACA;IAFT,YACS,OAAqB,EACrB,YAAyB;QAEhC,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC/E,MAAM,IAAI,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC3C,KAAK,CACH,2BAA2B,SAAS,eAAe;YACnD,GAAG,IAAI,MAAM;YACb,+CAA+C;YAC/C,iDAAiD,CAClD,CAAC;QAVK,YAAO,GAAP,OAAO,CAAc;QACrB,iBAAY,GAAZ,YAAY,CAAa;QAUhC,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,6DAA6D;AAE7D;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAqB;IACpD,MAAM,YAAY,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,OAAO,SAAS,CAAC,WAAW,CAAC,IAAI,SAAS,CAAC,YAAY,CAAC,CAAC;AAC3D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,OAAqB;IAClD,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,iBAAiB,CAAC,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAAqB;IACnD,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAM1B,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,WAAW,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;IAE3C,OAAQ,MAAM,CAAC,IAAI,CAAC,aAAa,CAAoB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACtE,OAAO;QACP,YAAY,EAAE,aAAa,CAAC,OAAO,CAAC;QACpC,OAAO,EAAE,WAAW,IAAI,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QACzD,WAAW,EAAE,oBAAoB,CAAC,OAAO,CAAC;KAC3C,CAAC,CAAC,CAAC;AACN,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * License module — re-exports for public API and internal use.
3
+ */
4
+ export { getLicense, getLicenseTier, getLicenseFile, clearLicenseCache } from './store.js';
5
+ export { verifyLicenseKey, parseLicensePayload } from './verify.js';
6
+ export { isFeatureEnabled, requireFeature, getRequiredTier, listFeatures, FeatureGatedError, } from './gate.js';
7
+ export { scheduleOnlineValidation } from './validate.js';
8
+ export type { LicenseTier, LicenseInfo, LicensePayload, LicenseFile } from './keys.js';
9
+ export type { GatedFeature } from './gate.js';
10
+ export type { FeatureGatedResponse } from './types.js';
11
+ export { TIER_RANK, KEY_PREFIXES, EXPIRY_GRACE_DAYS } from './keys.js';
12
+ export { handleLicenseCommand } from './cli.js';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/license/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC3F,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,YAAY,EACZ,iBAAiB,GAClB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAGzD,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACvF,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,YAAY,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAGvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * License module — re-exports for public API and internal use.
3
+ */
4
+ // ── Public API (exported from lib.ts) ────────────────────
5
+ export { getLicense, getLicenseTier, getLicenseFile, clearLicenseCache } from './store.js';
6
+ export { verifyLicenseKey, parseLicensePayload } from './verify.js';
7
+ export { isFeatureEnabled, requireFeature, getRequiredTier, listFeatures, FeatureGatedError, } from './gate.js';
8
+ export { scheduleOnlineValidation } from './validate.js';
9
+ export { TIER_RANK, KEY_PREFIXES, EXPIRY_GRACE_DAYS } from './keys.js';
10
+ // ── CLI (imported lazily from src/index.ts) ──────────────
11
+ export { handleLicenseCommand } from './cli.js';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/license/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,4DAA4D;AAC5D,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC3F,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,YAAY,EACZ,iBAAiB,GAClB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAMzD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAEvE,4DAA4D;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * License key types, constants, and the Ed25519 public key used to verify licence keys offline.
3
+ *
4
+ * The private key lives ONLY in the SaaS API (Fly.io secrets).
5
+ * This public key can verify signatures but cannot create them.
6
+ */
7
+ /**
8
+ * Ed25519 public key in DER (SPKI) hex format.
9
+ * Generated once; the matching private key is stored in Fly.io as LICENSE_SIGNING_KEY.
10
+ */
11
+ export declare const LICENSE_PUBLIC_KEY_HEX = "302a300506032b65700321005a6eff26e79a9010983cdb86dab56f26151110a870100608163441d7d71d7add";
12
+ export type LicenseTier = 'free' | 'pro' | 'team' | 'enterprise';
13
+ /** The signed payload embedded inside a license key. */
14
+ export interface LicensePayload {
15
+ tier: Exclude<LicenseTier, 'free'>;
16
+ teamId: number;
17
+ email: string;
18
+ /** Expiry — Unix seconds */
19
+ exp: number;
20
+ /** Issued-at — Unix seconds */
21
+ iat: number;
22
+ /** Stripe subscription ID — used for online revocation checks */
23
+ sid: string;
24
+ }
25
+ /** The result of verifying a license key. */
26
+ export interface LicenseInfo {
27
+ valid: boolean;
28
+ tier: LicenseTier;
29
+ email: string | null;
30
+ expiresAt: Date | null;
31
+ daysUntilExpiry: number | null;
32
+ teamId: number | null;
33
+ subscriptionId: string | null;
34
+ }
35
+ /** Stored in ~/.shieldcortex/license.json */
36
+ export interface LicenseFile {
37
+ key: string;
38
+ activatedAt: string;
39
+ lastValidatedAt: string | null;
40
+ validationStatus: 'valid' | 'expired' | 'revoked' | 'unvalidated';
41
+ }
42
+ /** Key prefix convention: sc_{tier}_ */
43
+ export declare const KEY_PREFIXES: Record<Exclude<LicenseTier, 'free'>, string>;
44
+ /** Tier rank for comparison (higher = more permissive) */
45
+ export declare const TIER_RANK: Record<LicenseTier, number>;
46
+ /** Grace period after expiry (days) — covers Stripe dunning retries */
47
+ export declare const EXPIRY_GRACE_DAYS = 7;
48
+ /** How often to run online validation (ms) */
49
+ export declare const ONLINE_VALIDATION_INTERVAL_MS: number;
50
+ //# sourceMappingURL=keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/license/keys.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,eAAO,MAAM,sBAAsB,6FACyD,CAAC;AAI7F,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,YAAY,CAAC;AAEjE,wDAAwD;AACxD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,4BAA4B;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,+BAA+B;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,iEAAiE;IACjE,GAAG,EAAE,MAAM,CAAC;CACb;AAED,6CAA6C;AAC7C,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,6CAA6C;AAC7C,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,gBAAgB,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,aAAa,CAAC;CACnE;AAID,wCAAwC;AACxC,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,MAAM,CAIrE,CAAC;AAEF,0DAA0D;AAC1D,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAKjD,CAAC;AAEF,uEAAuE;AACvE,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC,8CAA8C;AAC9C,eAAO,MAAM,6BAA6B,QAAsB,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * License key types, constants, and the Ed25519 public key used to verify licence keys offline.
3
+ *
4
+ * The private key lives ONLY in the SaaS API (Fly.io secrets).
5
+ * This public key can verify signatures but cannot create them.
6
+ */
7
+ /**
8
+ * Ed25519 public key in DER (SPKI) hex format.
9
+ * Generated once; the matching private key is stored in Fly.io as LICENSE_SIGNING_KEY.
10
+ */
11
+ export const LICENSE_PUBLIC_KEY_HEX = '302a300506032b65700321005a6eff26e79a9010983cdb86dab56f26151110a870100608163441d7d71d7add';
12
+ // ── Constants ────────────────────────────────────────────
13
+ /** Key prefix convention: sc_{tier}_ */
14
+ export const KEY_PREFIXES = {
15
+ pro: 'sc_pro_',
16
+ team: 'sc_team_',
17
+ enterprise: 'sc_ent_',
18
+ };
19
+ /** Tier rank for comparison (higher = more permissive) */
20
+ export const TIER_RANK = {
21
+ free: 0,
22
+ pro: 1,
23
+ team: 2,
24
+ enterprise: 3,
25
+ };
26
+ /** Grace period after expiry (days) — covers Stripe dunning retries */
27
+ export const EXPIRY_GRACE_DAYS = 7;
28
+ /** How often to run online validation (ms) */
29
+ export const ONLINE_VALIDATION_INTERVAL_MS = 24 * 60 * 60 * 1000; // 24 hours
30
+ //# sourceMappingURL=keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/license/keys.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GACjC,0FAA0F,CAAC;AAsC7F,4DAA4D;AAE5D,wCAAwC;AACxC,MAAM,CAAC,MAAM,YAAY,GAAiD;IACxE,GAAG,EAAE,SAAS;IACd,IAAI,EAAE,UAAU;IAChB,UAAU,EAAE,SAAS;CACtB,CAAC;AAEF,0DAA0D;AAC1D,MAAM,CAAC,MAAM,SAAS,GAAgC;IACpD,IAAI,EAAE,CAAC;IACP,GAAG,EAAE,CAAC;IACN,IAAI,EAAE,CAAC;IACP,UAAU,EAAE,CAAC;CACd,CAAC;AAEF,uEAAuE;AACvE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAEnC,8CAA8C;AAC9C,MAAM,CAAC,MAAM,6BAA6B,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW"}