@tracehound/core 1.3.0 → 1.4.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 +190 -0
- package/README.md +17 -30
- package/dist/core/agent.d.ts +8 -2
- package/dist/core/agent.d.ts.map +1 -1
- package/dist/core/agent.js +35 -7
- package/dist/core/agent.js.map +1 -1
- package/dist/core/evidence-worker-pool.d.ts +27 -0
- package/dist/core/evidence-worker-pool.d.ts.map +1 -0
- package/dist/core/evidence-worker-pool.js +87 -0
- package/dist/core/evidence-worker-pool.js.map +1 -0
- package/dist/core/evidence-worker.d.ts +20 -0
- package/dist/core/evidence-worker.d.ts.map +1 -0
- package/dist/core/evidence-worker.js +32 -0
- package/dist/core/evidence-worker.js.map +1 -0
- package/dist/core/hound-ipc.d.ts.map +1 -1
- package/dist/core/hound-ipc.js +14 -6
- package/dist/core/hound-ipc.js.map +1 -1
- package/dist/core/hound-pool.d.ts.map +1 -1
- package/dist/core/hound-pool.js +7 -1
- package/dist/core/hound-pool.js.map +1 -1
- package/dist/core/hound-process.js +2 -2
- package/dist/core/hound-process.js.map +1 -1
- package/dist/core/quarantine.d.ts +5 -0
- package/dist/core/quarantine.d.ts.map +1 -1
- package/dist/core/quarantine.js +7 -0
- package/dist/core/quarantine.js.map +1 -1
- package/dist/core/rate-limiter.d.ts +3 -0
- package/dist/core/rate-limiter.d.ts.map +1 -1
- package/dist/core/rate-limiter.js +21 -1
- package/dist/core/rate-limiter.js.map +1 -1
- package/dist/core/tracehound.d.ts.map +1 -1
- package/dist/core/tracehound.js +33 -3
- package/dist/core/tracehound.js.map +1 -1
- package/dist/index.d.ts +14 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -13
- package/dist/index.js.map +1 -1
- package/dist/types/config.d.ts +2 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js.map +1 -1
- package/package.json +4 -2
- package/dist/core/hound-worker.d.ts +0 -14
- package/dist/core/hound-worker.d.ts.map +0 -1
- package/dist/core/hound-worker.js +0 -112
- package/dist/core/hound-worker.js.map +0 -1
- package/dist/core/license-manager.d.ts +0 -128
- package/dist/core/license-manager.d.ts.map +0 -1
- package/dist/core/license-manager.js +0 -219
- package/dist/core/license-manager.js.map +0 -1
- package/dist/core/tier-capacity.d.ts +0 -58
- package/dist/core/tier-capacity.d.ts.map +0 -1
- package/dist/core/tier-capacity.js +0 -89
- package/dist/core/tier-capacity.js.map +0 -1
package/dist/types/config.d.ts
CHANGED
|
@@ -9,6 +9,8 @@ export interface RateLimitConfig {
|
|
|
9
9
|
maxRequests: number;
|
|
10
10
|
/** Block duration after limit exceeded */
|
|
11
11
|
blockDurationMs: number;
|
|
12
|
+
/** Maximum sources to track before LRU eviction (default: 100,000) */
|
|
13
|
+
maxSources?: number;
|
|
12
14
|
}
|
|
13
15
|
/** Quarantine storage configuration */
|
|
14
16
|
export interface QuarantineConfig {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,iCAAiC;AACjC,MAAM,WAAW,eAAe;IAC9B,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAA;IAChB,8BAA8B;IAC9B,WAAW,EAAE,MAAM,CAAA;IACnB,0CAA0C;IAC1C,eAAe,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,iCAAiC;AACjC,MAAM,WAAW,eAAe;IAC9B,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAA;IAChB,8BAA8B;IAC9B,WAAW,EAAE,MAAM,CAAA;IACnB,0CAA0C;IAC1C,eAAe,EAAE,MAAM,CAAA;IACvB,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,uCAAuC;AACvC,MAAM,WAAW,gBAAgB;IAC/B,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAA;IAChB,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAA;IAChB,wBAAwB;IACxB,cAAc,EAAE,KAAK,GAAG,UAAU,CAAA;CACnC;AAED,+BAA+B;AAC/B,MAAM,WAAW,WAAW;IAC1B,6BAA6B;IAC7B,cAAc,EAAE,MAAM,CAAA;IACtB,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,qCAAqC;IACrC,gBAAgB,EAAE,MAAM,CAAA;IACxB,yCAAyC;IACzC,iBAAiB,EAAE,MAAM,CAAA;IACzB,qCAAqC;IACrC,cAAc,EAAE,MAAM,CAAA;CACvB;AAED,8BAA8B;AAC9B,MAAM,WAAW,eAAe;IAC9B,6BAA6B;IAC7B,gBAAgB,EAAE,MAAM,CAAA;IACxB,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAA;IACjB,4BAA4B;IAC5B,UAAU,EAAE,OAAO,CAAA;CACpB;AAED,0BAA0B;AAC1B,MAAM,WAAW,WAAW;IAC1B,gCAAgC;IAChC,kBAAkB,EAAE,MAAM,CAAA;IAC1B,mCAAmC;IACnC,QAAQ,EAAE,MAAM,CAAA;IAChB,+BAA+B;IAC/B,mBAAmB,EAAE,MAAM,CAAA;CAC5B;AAED,iCAAiC;AACjC,MAAM,WAAW,iBAAiB;IAChC,mBAAmB;IACnB,IAAI,EAAE,KAAK,CAAA;IACX,uBAAuB;IACvB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,0BAA0B;AAC1B,MAAM,WAAW,WAAW;IAC1B,kCAAkC;IAClC,YAAY,EAAE,OAAO,CAAA;IACrB,gCAAgC;IAChC,WAAW,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAA;CAC5C;AAED,4BAA4B;AAC5B,MAAM,WAAW,aAAa;IAC5B,8CAA8C;IAC9C,kBAAkB,EAAE,OAAO,CAAA;CAC5B;AAED,wCAAwC;AACxC,MAAM,WAAW,gBAAgB;IAC/B,oCAAoC;IACpC,cAAc,EAAE,MAAM,CAAA;IACtB,6BAA6B;IAC7B,SAAS,EAAE,eAAe,CAAA;IAC1B,0BAA0B;IAC1B,UAAU,EAAE,gBAAgB,CAAA;IAC5B,0BAA0B;IAC1B,KAAK,EAAE,WAAW,CAAA;IAClB,yBAAyB;IACzB,SAAS,EAAE,eAAe,CAAA;IAC1B,qBAAqB;IACrB,MAAM,EAAE,WAAW,CAAA;IACnB,qBAAqB;IACrB,KAAK,EAAE,WAAW,CAAA;IAClB,uBAAuB;IACvB,OAAO,EAAE,aAAa,CAAA;CACvB;AAED,mCAAmC;AACnC,eAAO,MAAM,cAAc,EAAE,gBAmC5B,CAAA;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,CAYtF"}
|
package/dist/types/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoGH,mCAAmC;AACnC,MAAM,CAAC,MAAM,cAAc,GAAqB;IAC9C,cAAc,EAAE,SAAS;IACzB,SAAS,EAAE;QACT,QAAQ,EAAE,MAAM;QAChB,WAAW,EAAE,GAAG;QAChB,eAAe,EAAE,OAAO;KACzB;IACD,UAAU,EAAE;QACV,QAAQ,EAAE,MAAM;QAChB,QAAQ,EAAE,WAAW;QACrB,cAAc,EAAE,UAAU;KAC3B;IACD,KAAK,EAAE;QACL,cAAc,EAAE,CAAC;QACjB,SAAS,EAAE,CAAC;QACZ,gBAAgB,EAAE,IAAI;QACtB,iBAAiB,EAAE,KAAK;QACxB,cAAc,EAAE,GAAG;KACpB;IACD,SAAS,EAAE;QACT,gBAAgB,EAAE,MAAM;QACxB,SAAS,EAAE,MAAM;QACjB,UAAU,EAAE,IAAI;KACjB;IACD,MAAM,EAAE;QACN,kBAAkB,EAAE,EAAE;QACtB,QAAQ,EAAE,MAAM;QAChB,mBAAmB,EAAE,CAAC;KACvB;IACD,KAAK,EAAE;QACL,YAAY,EAAE,IAAI;KACnB;IACD,OAAO,EAAE;QACP,kBAAkB,EAAE,IAAI;KACzB;CACF,CAAA;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAkC;IAClE,OAAO;QACL,GAAG,cAAc;QACjB,GAAG,OAAO;QACV,SAAS,EAAE,EAAE,GAAG,cAAc,CAAC,SAAS,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE;QAChE,UAAU,EAAE,EAAE,GAAG,cAAc,CAAC,UAAU,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE;QACnE,KAAK,EAAE,EAAE,GAAG,cAAc,CAAC,KAAK,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE;QACpD,SAAS,EAAE,EAAE,GAAG,cAAc,CAAC,SAAS,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE;QAChE,MAAM,EAAE,EAAE,GAAG,cAAc,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE;QACvD,KAAK,EAAE,EAAE,GAAG,cAAc,CAAC,KAAK,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE;QACpD,OAAO,EAAE,EAAE,GAAG,cAAc,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE;KAC3D,CAAA;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tracehound/core",
|
|
3
|
-
"version": "1.3
|
|
3
|
+
"version": "1.4.3",
|
|
4
4
|
"description": "Deterministic runtime security buffer for high-velocity APIs",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Erdem Arslan <me@erdem.work>",
|
|
@@ -49,6 +49,8 @@
|
|
|
49
49
|
"test": "vitest run",
|
|
50
50
|
"test:watch": "vitest",
|
|
51
51
|
"lint": "tsc --noEmit",
|
|
52
|
-
"clean": "rm -rf dist"
|
|
52
|
+
"clean": "rm -rf dist",
|
|
53
|
+
"test:fuzz:regression": "vitest run tests/fuzz/replay-corpus.test.ts",
|
|
54
|
+
"test:fuzz:assurance": "vitest run tests/fuzz/*.property.test.ts tests/fuzz/replay-corpus.test.ts"
|
|
53
55
|
}
|
|
54
56
|
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Hound Process - Child process entry point.
|
|
3
|
-
*
|
|
4
|
-
* RFC-0000 REQUIREMENTS:
|
|
5
|
-
* - Reads binary from stdin
|
|
6
|
-
* - Writes status to stdout
|
|
7
|
-
* - No dynamic require
|
|
8
|
-
* - No config from parent
|
|
9
|
-
* - Deterministic, single-purpose
|
|
10
|
-
*
|
|
11
|
-
* This script runs in an isolated child process.
|
|
12
|
-
*/
|
|
13
|
-
export {};
|
|
14
|
-
//# sourceMappingURL=hound-worker.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hound-worker.d.ts","sourceRoot":"","sources":["../../src/core/hound-worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Hound Process - Child process entry point.
|
|
3
|
-
*
|
|
4
|
-
* RFC-0000 REQUIREMENTS:
|
|
5
|
-
* - Reads binary from stdin
|
|
6
|
-
* - Writes status to stdout
|
|
7
|
-
* - No dynamic require
|
|
8
|
-
* - No config from parent
|
|
9
|
-
* - Deterministic, single-purpose
|
|
10
|
-
*
|
|
11
|
-
* This script runs in an isolated child process.
|
|
12
|
-
*/
|
|
13
|
-
import { createMessageParser, encodeHoundMessage } from './hound-ipc.js';
|
|
14
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
15
|
-
// Constants
|
|
16
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
17
|
-
/** Processing simulation delay (will be replaced with real logic) */
|
|
18
|
-
const PROCESSING_DELAY_MS = 10;
|
|
19
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
20
|
-
// State
|
|
21
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
22
|
-
const parser = createMessageParser();
|
|
23
|
-
let isProcessing = false;
|
|
24
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
25
|
-
// Message Sending
|
|
26
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
27
|
-
function sendStatus(state, errorMsg) {
|
|
28
|
-
const message = { type: 'status', state };
|
|
29
|
-
if (errorMsg) {
|
|
30
|
-
message.error = errorMsg;
|
|
31
|
-
}
|
|
32
|
-
const encoded = encodeHoundMessage(message);
|
|
33
|
-
process.stdout.write(encoded);
|
|
34
|
-
}
|
|
35
|
-
function sendMetrics(processingTime) {
|
|
36
|
-
const memoryUsed = process.memoryUsage().heapUsed;
|
|
37
|
-
const encoded = encodeHoundMessage({ type: 'metrics', processingTime, memoryUsed });
|
|
38
|
-
process.stdout.write(encoded);
|
|
39
|
-
}
|
|
40
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
41
|
-
// Processing
|
|
42
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
43
|
-
/**
|
|
44
|
-
* Process evidence payload.
|
|
45
|
-
*
|
|
46
|
-
* Current implementation: simulation.
|
|
47
|
-
* Future: actual evidence analysis.
|
|
48
|
-
*
|
|
49
|
-
* @param payload - Evidence bytes
|
|
50
|
-
*/
|
|
51
|
-
async function processPayload(_payload) {
|
|
52
|
-
if (isProcessing) {
|
|
53
|
-
// Already processing - drop (single request at a time)
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
isProcessing = true;
|
|
57
|
-
const startTime = Date.now();
|
|
58
|
-
try {
|
|
59
|
-
sendStatus('processing');
|
|
60
|
-
// Simulate processing
|
|
61
|
-
// TODO: Replace with actual evidence analysis
|
|
62
|
-
await new Promise((resolve) => setTimeout(resolve, PROCESSING_DELAY_MS));
|
|
63
|
-
const processingTime = Date.now() - startTime;
|
|
64
|
-
sendMetrics(processingTime);
|
|
65
|
-
sendStatus('complete');
|
|
66
|
-
}
|
|
67
|
-
catch (err) {
|
|
68
|
-
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
69
|
-
sendStatus('error', message);
|
|
70
|
-
}
|
|
71
|
-
finally {
|
|
72
|
-
isProcessing = false;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
76
|
-
// Stdin Handler
|
|
77
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
78
|
-
process.stdin.on('data', (chunk) => {
|
|
79
|
-
const messages = parser.feed(chunk);
|
|
80
|
-
for (const payload of messages) {
|
|
81
|
-
// Process each message
|
|
82
|
-
processPayload(payload).catch((err) => {
|
|
83
|
-
sendStatus('error', err instanceof Error ? err.message : 'Unknown error');
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
});
|
|
87
|
-
process.stdin.on('end', () => {
|
|
88
|
-
// Parent closed stdin - exit gracefully
|
|
89
|
-
process.exit(0);
|
|
90
|
-
});
|
|
91
|
-
process.stdin.on('error', (err) => {
|
|
92
|
-
sendStatus('error', `stdin error: ${err.message}`);
|
|
93
|
-
process.exit(1);
|
|
94
|
-
});
|
|
95
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
96
|
-
// Uncaught Exception Handler
|
|
97
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
98
|
-
process.on('uncaughtException', (err) => {
|
|
99
|
-
sendStatus('error', `uncaught: ${err.message}`);
|
|
100
|
-
process.exit(1);
|
|
101
|
-
});
|
|
102
|
-
process.on('unhandledRejection', (reason) => {
|
|
103
|
-
const message = reason instanceof Error ? reason.message : String(reason);
|
|
104
|
-
sendStatus('error', `unhandled rejection: ${message}`);
|
|
105
|
-
process.exit(1);
|
|
106
|
-
});
|
|
107
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
108
|
-
// Ready Signal
|
|
109
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
110
|
-
// Signal that process is ready
|
|
111
|
-
sendStatus('processing'); // Initial "ready" state (processing = idle, waiting)
|
|
112
|
-
//# sourceMappingURL=hound-worker.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hound-worker.js","sourceRoot":"","sources":["../../src/core/hound-worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* License Manager - JWT-based license validation for commercial tiers.
|
|
3
|
-
*
|
|
4
|
-
* CRITICAL INVARIANTS:
|
|
5
|
-
* - Soft Lock: Never crash or block production due to license issues
|
|
6
|
-
* - Offline: Public key embedded, no network required
|
|
7
|
-
* - Grace Period: 7 days tolerance for expired licenses
|
|
8
|
-
*/
|
|
9
|
-
/**
|
|
10
|
-
* License tiers.
|
|
11
|
-
*/
|
|
12
|
-
export type LicenseTier = 'starter' | 'pro' | 'enterprise';
|
|
13
|
-
/**
|
|
14
|
-
* License validation status.
|
|
15
|
-
*/
|
|
16
|
-
export type LicenseStatus = 'valid' | 'expired' | 'grace' | 'invalid' | 'none';
|
|
17
|
-
/**
|
|
18
|
-
* JWT payload for Tracehound licenses.
|
|
19
|
-
*/
|
|
20
|
-
export interface LicensePayload {
|
|
21
|
-
/** Licensee ID (customer identifier) */
|
|
22
|
-
sub: string;
|
|
23
|
-
/** Issuer (must be "tracehound.io") */
|
|
24
|
-
iss: string;
|
|
25
|
-
/** Audience (product identifier) */
|
|
26
|
-
aud: string;
|
|
27
|
-
/** Expiration timestamp (Unix seconds) */
|
|
28
|
-
exp: number;
|
|
29
|
-
/** Issued at timestamp (Unix seconds) */
|
|
30
|
-
iat: number;
|
|
31
|
-
/** License tier */
|
|
32
|
-
tier: LicenseTier;
|
|
33
|
-
/** Enabled features */
|
|
34
|
-
features: string[];
|
|
35
|
-
/**
|
|
36
|
-
* Maximum concurrent instances allowed.
|
|
37
|
-
* - Pro: 1 (single instance, trust-based)
|
|
38
|
-
* - Enterprise: unlimited (-1) or specific count
|
|
39
|
-
*/
|
|
40
|
-
maxInstances?: number;
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* License validation result.
|
|
44
|
-
*/
|
|
45
|
-
export interface LicenseValidationResult {
|
|
46
|
-
/** Whether validation succeeded */
|
|
47
|
-
valid: boolean;
|
|
48
|
-
/** Resulting tier */
|
|
49
|
-
tier: LicenseTier;
|
|
50
|
-
/** Validation status */
|
|
51
|
-
status: LicenseStatus;
|
|
52
|
-
/** Error message if invalid */
|
|
53
|
-
error?: string;
|
|
54
|
-
/** Days until expiration (negative if expired) */
|
|
55
|
-
daysRemaining?: number;
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* License Manager configuration.
|
|
59
|
-
*/
|
|
60
|
-
export interface LicenseManagerConfig {
|
|
61
|
-
/** Public key for signature verification (PEM format) */
|
|
62
|
-
publicKey: string;
|
|
63
|
-
/** Expected issuer */
|
|
64
|
-
issuer?: string;
|
|
65
|
-
/** Expected audience */
|
|
66
|
-
audience?: string;
|
|
67
|
-
/** Grace period in days for expired licenses */
|
|
68
|
-
gracePeriodDays?: number;
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* License Manager interface.
|
|
72
|
-
*/
|
|
73
|
-
export interface ILicenseManager {
|
|
74
|
-
/**
|
|
75
|
-
* Validate a license key.
|
|
76
|
-
* @param key - JWT license key
|
|
77
|
-
*/
|
|
78
|
-
validate(key: string): LicenseValidationResult;
|
|
79
|
-
/**
|
|
80
|
-
* Check if a feature is enabled.
|
|
81
|
-
* @param feature - Feature name
|
|
82
|
-
*/
|
|
83
|
-
isFeatureEnabled(feature: string): boolean;
|
|
84
|
-
/**
|
|
85
|
-
* Current license tier.
|
|
86
|
-
*/
|
|
87
|
-
readonly tier: LicenseTier;
|
|
88
|
-
/**
|
|
89
|
-
* Current license status.
|
|
90
|
-
*/
|
|
91
|
-
readonly status: LicenseStatus;
|
|
92
|
-
/**
|
|
93
|
-
* Current license payload (if valid).
|
|
94
|
-
*/
|
|
95
|
-
readonly payload: LicensePayload | null;
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Features available per tier.
|
|
99
|
-
*/
|
|
100
|
-
export declare const TIER_FEATURES: Record<LicenseTier, readonly string[]>;
|
|
101
|
-
/**
|
|
102
|
-
* License Manager implementation.
|
|
103
|
-
*/
|
|
104
|
-
export declare class LicenseManager implements ILicenseManager {
|
|
105
|
-
private readonly config;
|
|
106
|
-
private _tier;
|
|
107
|
-
private _status;
|
|
108
|
-
private _payload;
|
|
109
|
-
private _features;
|
|
110
|
-
constructor(config: LicenseManagerConfig);
|
|
111
|
-
get tier(): LicenseTier;
|
|
112
|
-
get status(): LicenseStatus;
|
|
113
|
-
get payload(): LicensePayload | null;
|
|
114
|
-
validate(key: string): LicenseValidationResult;
|
|
115
|
-
isFeatureEnabled(feature: string): boolean;
|
|
116
|
-
private verifySignature;
|
|
117
|
-
private decodePayload;
|
|
118
|
-
private base64UrlDecode;
|
|
119
|
-
private setCommunity;
|
|
120
|
-
private setValid;
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* Create a License Manager instance.
|
|
124
|
-
*
|
|
125
|
-
* @param config - License manager configuration
|
|
126
|
-
*/
|
|
127
|
-
export declare function createLicenseManager(config: LicenseManagerConfig): ILicenseManager;
|
|
128
|
-
//# sourceMappingURL=license-manager.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"license-manager.d.ts","sourceRoot":"","sources":["../../src/core/license-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,KAAK,GAAG,YAAY,CAAA;AAE1D;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAA;AAE9E;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,wCAAwC;IACxC,GAAG,EAAE,MAAM,CAAA;IACX,uCAAuC;IACvC,GAAG,EAAE,MAAM,CAAA;IACX,oCAAoC;IACpC,GAAG,EAAE,MAAM,CAAA;IACX,0CAA0C;IAC1C,GAAG,EAAE,MAAM,CAAA;IACX,yCAAyC;IACzC,GAAG,EAAE,MAAM,CAAA;IACX,mBAAmB;IACnB,IAAI,EAAE,WAAW,CAAA;IACjB,uBAAuB;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,mCAAmC;IACnC,KAAK,EAAE,OAAO,CAAA;IACd,qBAAqB;IACrB,IAAI,EAAE,WAAW,CAAA;IACjB,wBAAwB;IACxB,MAAM,EAAE,aAAa,CAAA;IACrB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,kDAAkD;IAClD,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,yDAAyD;IACzD,SAAS,EAAE,MAAM,CAAA;IACjB,sBAAsB;IACtB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,wBAAwB;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,gDAAgD;IAChD,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,uBAAuB,CAAA;IAE9C;;;OAGG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAA;IAE1C;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;IAE1B;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAA;IAE9B;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAAA;CACxC;AAWD;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAyBvD,CAAA;AAMV;;GAEG;AACH,qBAAa,cAAe,YAAW,eAAe;IACpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgC;IACvD,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,SAAS,CAA8C;gBAEnD,MAAM,EAAE,oBAAoB;IASxC,IAAI,IAAI,IAAI,WAAW,CAEtB;IAED,IAAI,MAAM,IAAI,aAAa,CAE1B;IAED,IAAI,OAAO,IAAI,cAAc,GAAG,IAAI,CAEnC;IAED,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,uBAAuB;IA6D9C,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAM1C,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,aAAa;IA6BrB,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,YAAY;IAmBpB,OAAO,CAAC,QAAQ;CAoBjB;AAMD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,oBAAoB,GAAG,eAAe,CAElF"}
|
|
@@ -1,219 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* License Manager - JWT-based license validation for commercial tiers.
|
|
3
|
-
*
|
|
4
|
-
* CRITICAL INVARIANTS:
|
|
5
|
-
* - Soft Lock: Never crash or block production due to license issues
|
|
6
|
-
* - Offline: Public key embedded, no network required
|
|
7
|
-
* - Grace Period: 7 days tolerance for expired licenses
|
|
8
|
-
*/
|
|
9
|
-
import { createVerify } from 'node:crypto';
|
|
10
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
11
|
-
// Constants
|
|
12
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
13
|
-
const DEFAULT_ISSUER = 'tracehound.io';
|
|
14
|
-
const DEFAULT_AUDIENCE = 'tracehound-core';
|
|
15
|
-
const DEFAULT_GRACE_PERIOD_DAYS = 7;
|
|
16
|
-
const MS_PER_DAY = 24 * 60 * 60 * 1000;
|
|
17
|
-
/**
|
|
18
|
-
* Features available per tier.
|
|
19
|
-
*/
|
|
20
|
-
export const TIER_FEATURES = {
|
|
21
|
-
starter: ['agent', 'quarantine', 'rate-limiter', 'watcher', 'scheduler'],
|
|
22
|
-
pro: [
|
|
23
|
-
'agent',
|
|
24
|
-
'quarantine',
|
|
25
|
-
'rate-limiter',
|
|
26
|
-
'watcher',
|
|
27
|
-
'scheduler',
|
|
28
|
-
'cold-storage',
|
|
29
|
-
'notification-api',
|
|
30
|
-
'async-codec',
|
|
31
|
-
],
|
|
32
|
-
enterprise: [
|
|
33
|
-
'agent',
|
|
34
|
-
'quarantine',
|
|
35
|
-
'rate-limiter',
|
|
36
|
-
'watcher',
|
|
37
|
-
'scheduler',
|
|
38
|
-
'cold-storage',
|
|
39
|
-
'notification-api',
|
|
40
|
-
'async-codec',
|
|
41
|
-
'redis',
|
|
42
|
-
'siem-export',
|
|
43
|
-
'compliance-reports',
|
|
44
|
-
],
|
|
45
|
-
};
|
|
46
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
47
|
-
// Implementation
|
|
48
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
49
|
-
/**
|
|
50
|
-
* License Manager implementation.
|
|
51
|
-
*/
|
|
52
|
-
export class LicenseManager {
|
|
53
|
-
config;
|
|
54
|
-
_tier = 'starter';
|
|
55
|
-
_status = 'none';
|
|
56
|
-
_payload = null;
|
|
57
|
-
_features = new Set(TIER_FEATURES.starter);
|
|
58
|
-
constructor(config) {
|
|
59
|
-
this.config = {
|
|
60
|
-
publicKey: config.publicKey,
|
|
61
|
-
issuer: config.issuer ?? DEFAULT_ISSUER,
|
|
62
|
-
audience: config.audience ?? DEFAULT_AUDIENCE,
|
|
63
|
-
gracePeriodDays: config.gracePeriodDays ?? DEFAULT_GRACE_PERIOD_DAYS,
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
get tier() {
|
|
67
|
-
return this._tier;
|
|
68
|
-
}
|
|
69
|
-
get status() {
|
|
70
|
-
return this._status;
|
|
71
|
-
}
|
|
72
|
-
get payload() {
|
|
73
|
-
return this._payload;
|
|
74
|
-
}
|
|
75
|
-
validate(key) {
|
|
76
|
-
// Empty key = community mode
|
|
77
|
-
if (!key || key.trim() === '') {
|
|
78
|
-
return this.setCommunity('none');
|
|
79
|
-
}
|
|
80
|
-
try {
|
|
81
|
-
// Parse JWT
|
|
82
|
-
const parts = key.split('.');
|
|
83
|
-
if (parts.length !== 3) {
|
|
84
|
-
return this.setCommunity('invalid', 'Invalid JWT format');
|
|
85
|
-
}
|
|
86
|
-
const [headerB64, payloadB64, signatureB64] = parts;
|
|
87
|
-
// Verify signature
|
|
88
|
-
if (!this.verifySignature(headerB64, payloadB64, signatureB64)) {
|
|
89
|
-
return this.setCommunity('invalid', 'Invalid signature');
|
|
90
|
-
}
|
|
91
|
-
// Decode payload
|
|
92
|
-
const payload = this.decodePayload(payloadB64);
|
|
93
|
-
if (!payload) {
|
|
94
|
-
return this.setCommunity('invalid', 'Invalid payload');
|
|
95
|
-
}
|
|
96
|
-
// Validate issuer
|
|
97
|
-
if (payload.iss !== this.config.issuer) {
|
|
98
|
-
return this.setCommunity('invalid', `Invalid issuer: ${payload.iss}`);
|
|
99
|
-
}
|
|
100
|
-
// Validate audience
|
|
101
|
-
if (payload.aud !== this.config.audience) {
|
|
102
|
-
return this.setCommunity('invalid', `Invalid audience: ${payload.aud}`);
|
|
103
|
-
}
|
|
104
|
-
// Check expiration
|
|
105
|
-
const now = Date.now();
|
|
106
|
-
const expMs = payload.exp * 1000;
|
|
107
|
-
const daysRemaining = Math.floor((expMs - now) / MS_PER_DAY);
|
|
108
|
-
if (now > expMs) {
|
|
109
|
-
// Expired - check grace period
|
|
110
|
-
const daysSinceExpiry = Math.floor((now - expMs) / MS_PER_DAY);
|
|
111
|
-
if (daysSinceExpiry <= this.config.gracePeriodDays) {
|
|
112
|
-
// Grace period - still allow full features
|
|
113
|
-
return this.setValid(payload, 'grace', daysRemaining);
|
|
114
|
-
}
|
|
115
|
-
else {
|
|
116
|
-
// Beyond grace period - community mode
|
|
117
|
-
return this.setCommunity('expired', 'License expired beyond grace period');
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
// Valid license
|
|
121
|
-
return this.setValid(payload, 'valid', daysRemaining);
|
|
122
|
-
}
|
|
123
|
-
catch (err) {
|
|
124
|
-
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
125
|
-
return this.setCommunity('invalid', message);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
isFeatureEnabled(feature) {
|
|
129
|
-
return this._features.has(feature);
|
|
130
|
-
}
|
|
131
|
-
// ─── Private Methods ─────────────────────────────────────────────────────────
|
|
132
|
-
verifySignature(headerB64, payloadB64, signatureB64) {
|
|
133
|
-
try {
|
|
134
|
-
const signatureInput = `${headerB64}.${payloadB64}`;
|
|
135
|
-
const signature = Buffer.from(this.base64UrlDecode(signatureB64), 'base64');
|
|
136
|
-
const verifier = createVerify('RSA-SHA256');
|
|
137
|
-
verifier.update(signatureInput);
|
|
138
|
-
return verifier.verify(this.config.publicKey, signature);
|
|
139
|
-
}
|
|
140
|
-
catch {
|
|
141
|
-
return false;
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
decodePayload(payloadB64) {
|
|
145
|
-
try {
|
|
146
|
-
const json = Buffer.from(this.base64UrlDecode(payloadB64), 'base64').toString('utf8');
|
|
147
|
-
const payload = JSON.parse(json);
|
|
148
|
-
// Validate required fields
|
|
149
|
-
if (typeof payload.sub !== 'string' ||
|
|
150
|
-
typeof payload.iss !== 'string' ||
|
|
151
|
-
typeof payload.aud !== 'string' ||
|
|
152
|
-
typeof payload.exp !== 'number' ||
|
|
153
|
-
typeof payload.iat !== 'number' ||
|
|
154
|
-
typeof payload.tier !== 'string' ||
|
|
155
|
-
!Array.isArray(payload.features)) {
|
|
156
|
-
return null;
|
|
157
|
-
}
|
|
158
|
-
// Validate tier
|
|
159
|
-
if (!['starter', 'pro', 'enterprise'].includes(payload.tier)) {
|
|
160
|
-
return null;
|
|
161
|
-
}
|
|
162
|
-
return payload;
|
|
163
|
-
}
|
|
164
|
-
catch {
|
|
165
|
-
return null;
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
base64UrlDecode(str) {
|
|
169
|
-
// Convert base64url to base64
|
|
170
|
-
let base64 = str.replace(/-/g, '+').replace(/_/g, '/');
|
|
171
|
-
// Add padding if needed
|
|
172
|
-
const padding = 4 - (base64.length % 4);
|
|
173
|
-
if (padding !== 4) {
|
|
174
|
-
base64 += '='.repeat(padding);
|
|
175
|
-
}
|
|
176
|
-
return base64;
|
|
177
|
-
}
|
|
178
|
-
setCommunity(status, error) {
|
|
179
|
-
this._tier = 'starter';
|
|
180
|
-
this._status = status;
|
|
181
|
-
this._payload = null;
|
|
182
|
-
this._features = new Set(TIER_FEATURES.starter);
|
|
183
|
-
const result = {
|
|
184
|
-
valid: false,
|
|
185
|
-
tier: 'starter',
|
|
186
|
-
status,
|
|
187
|
-
};
|
|
188
|
-
if (error !== undefined) {
|
|
189
|
-
result.error = error;
|
|
190
|
-
}
|
|
191
|
-
return result;
|
|
192
|
-
}
|
|
193
|
-
setValid(payload, status, daysRemaining) {
|
|
194
|
-
this._tier = payload.tier;
|
|
195
|
-
this._status = status;
|
|
196
|
-
this._payload = payload;
|
|
197
|
-
// Set features from tier + any additional from payload
|
|
198
|
-
const tierFeatures = TIER_FEATURES[payload.tier] ?? TIER_FEATURES.starter;
|
|
199
|
-
this._features = new Set([...tierFeatures, ...payload.features]);
|
|
200
|
-
return {
|
|
201
|
-
valid: true,
|
|
202
|
-
tier: payload.tier,
|
|
203
|
-
status,
|
|
204
|
-
daysRemaining,
|
|
205
|
-
};
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
209
|
-
// Factory
|
|
210
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
211
|
-
/**
|
|
212
|
-
* Create a License Manager instance.
|
|
213
|
-
*
|
|
214
|
-
* @param config - License manager configuration
|
|
215
|
-
*/
|
|
216
|
-
export function createLicenseManager(config) {
|
|
217
|
-
return new LicenseManager(config);
|
|
218
|
-
}
|
|
219
|
-
//# sourceMappingURL=license-manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"license-manager.js","sourceRoot":"","sources":["../../src/core/license-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tier-Aware Capacity Configuration
|
|
3
|
-
*
|
|
4
|
-
* Maps license tiers to HoundPool capacity constraints.
|
|
5
|
-
* This enforces the pricing model's capacity-gating strategy.
|
|
6
|
-
*
|
|
7
|
-
* INVARIANT: Security features are identical across all tiers.
|
|
8
|
-
* Only capacity (poolSize, memory, timeout) varies.
|
|
9
|
-
*/
|
|
10
|
-
import type { HoundPoolConfig, PoolExhaustedAction } from './hound-pool.js';
|
|
11
|
-
import type { LicenseTier } from './license-manager.js';
|
|
12
|
-
/**
|
|
13
|
-
* Capacity limits per tier.
|
|
14
|
-
*/
|
|
15
|
-
export interface TierCapacityLimits {
|
|
16
|
-
/** Max concurrent processes */
|
|
17
|
-
poolSize: number;
|
|
18
|
-
/** Max memory per process in MB */
|
|
19
|
-
maxMemoryMB: number;
|
|
20
|
-
/** Process timeout in ms */
|
|
21
|
-
timeoutMs: number;
|
|
22
|
-
/** Action when pool exhausted */
|
|
23
|
-
onPoolExhausted: PoolExhaustedAction;
|
|
24
|
-
/** Defer queue limit */
|
|
25
|
-
deferQueueLimit: number;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Tier capacity definitions.
|
|
29
|
-
*
|
|
30
|
-
* | Tier | Processes | Memory | Timeout |
|
|
31
|
-
* |------------|-----------|--------|---------|
|
|
32
|
-
* | Starter | 1 | 64MB | 5s |
|
|
33
|
-
* | Pro | 8 | 512MB | 30s |
|
|
34
|
-
* | Enterprise | 32 | 2048MB | 60s |
|
|
35
|
-
*/
|
|
36
|
-
export declare const TIER_CAPACITY_LIMITS: Record<LicenseTier, TierCapacityLimits>;
|
|
37
|
-
/**
|
|
38
|
-
* Create tier-aware HoundPool configuration.
|
|
39
|
-
*
|
|
40
|
-
* @param tier - License tier
|
|
41
|
-
* @param overrides - Optional overrides (Enterprise can customize)
|
|
42
|
-
* @returns HoundPool configuration
|
|
43
|
-
*
|
|
44
|
-
* @example
|
|
45
|
-
* ```ts
|
|
46
|
-
* const config = createTierAwarePoolConfig('pro')
|
|
47
|
-
* const pool = createHoundPool(config)
|
|
48
|
-
* ```
|
|
49
|
-
*/
|
|
50
|
-
export declare function createTierAwarePoolConfig(tier: LicenseTier, overrides?: Partial<HoundPoolConfig>): HoundPoolConfig;
|
|
51
|
-
/**
|
|
52
|
-
* Get capacity limits for a tier (read-only).
|
|
53
|
-
*
|
|
54
|
-
* @param tier - License tier
|
|
55
|
-
* @returns Capacity limits
|
|
56
|
-
*/
|
|
57
|
-
export declare function getTierCapacityLimits(tier: LicenseTier): Readonly<TierCapacityLimits>;
|
|
58
|
-
//# sourceMappingURL=tier-capacity.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tier-capacity.d.ts","sourceRoot":"","sources":["../../src/core/tier-capacity.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAC3E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAOvD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAChB,mCAAmC;IACnC,WAAW,EAAE,MAAM,CAAA;IACnB,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,iCAAiC;IACjC,eAAe,EAAE,mBAAmB,CAAA;IACpC,wBAAwB;IACxB,eAAe,EAAE,MAAM,CAAA;CACxB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,WAAW,EAAE,kBAAkB,CAsB/D,CAAA;AAMV;;;;;;;;;;;;GAYG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,WAAW,EACjB,SAAS,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GACnC,eAAe,CAyBjB;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,WAAW,GAAG,QAAQ,CAAC,kBAAkB,CAAC,CAErF"}
|