@tracehound/core 1.2.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/README.md +125 -0
- package/dist/core/agent.d.ts +89 -0
- package/dist/core/agent.d.ts.map +1 -0
- package/dist/core/agent.js +141 -0
- package/dist/core/agent.js.map +1 -0
- package/dist/core/audit-chain.d.ts +39 -0
- package/dist/core/audit-chain.d.ts.map +1 -0
- package/dist/core/audit-chain.js +87 -0
- package/dist/core/audit-chain.js.map +1 -0
- package/dist/core/cold-storage.d.ts +87 -0
- package/dist/core/cold-storage.d.ts.map +1 -0
- package/dist/core/cold-storage.js +53 -0
- package/dist/core/cold-storage.js.map +1 -0
- package/dist/core/evidence-factory.d.ts +85 -0
- package/dist/core/evidence-factory.d.ts.map +1 -0
- package/dist/core/evidence-factory.js +96 -0
- package/dist/core/evidence-factory.js.map +1 -0
- package/dist/core/evidence.d.ts +48 -0
- package/dist/core/evidence.d.ts.map +1 -0
- package/dist/core/evidence.js +135 -0
- package/dist/core/evidence.js.map +1 -0
- package/dist/core/fail-safe.d.ts +149 -0
- package/dist/core/fail-safe.d.ts.map +1 -0
- package/dist/core/fail-safe.js +217 -0
- package/dist/core/fail-safe.js.map +1 -0
- package/dist/core/hound-ipc.d.ts +91 -0
- package/dist/core/hound-ipc.d.ts.map +1 -0
- package/dist/core/hound-ipc.js +196 -0
- package/dist/core/hound-ipc.js.map +1 -0
- package/dist/core/hound-pool.d.ts +157 -0
- package/dist/core/hound-pool.d.ts.map +1 -0
- package/dist/core/hound-pool.js +337 -0
- package/dist/core/hound-pool.js.map +1 -0
- package/dist/core/hound-process.d.ts +14 -0
- package/dist/core/hound-process.d.ts.map +1 -0
- package/dist/core/hound-process.js +112 -0
- package/dist/core/hound-process.js.map +1 -0
- package/dist/core/hound-worker.d.ts +14 -0
- package/dist/core/hound-worker.d.ts.map +1 -0
- package/dist/core/hound-worker.js +112 -0
- package/dist/core/hound-worker.js.map +1 -0
- package/dist/core/lane-queue.d.ts +121 -0
- package/dist/core/lane-queue.d.ts.map +1 -0
- package/dist/core/lane-queue.js +181 -0
- package/dist/core/lane-queue.js.map +1 -0
- package/dist/core/license-manager.d.ts +128 -0
- package/dist/core/license-manager.d.ts.map +1 -0
- package/dist/core/license-manager.js +219 -0
- package/dist/core/license-manager.js.map +1 -0
- package/dist/core/notification-emitter.d.ts +140 -0
- package/dist/core/notification-emitter.d.ts.map +1 -0
- package/dist/core/notification-emitter.js +197 -0
- package/dist/core/notification-emitter.js.map +1 -0
- package/dist/core/process-adapter.d.ts +146 -0
- package/dist/core/process-adapter.d.ts.map +1 -0
- package/dist/core/process-adapter.js +174 -0
- package/dist/core/process-adapter.js.map +1 -0
- package/dist/core/quarantine.d.ts +95 -0
- package/dist/core/quarantine.d.ts.map +1 -0
- package/dist/core/quarantine.js +221 -0
- package/dist/core/quarantine.js.map +1 -0
- package/dist/core/rate-limiter.d.ts +94 -0
- package/dist/core/rate-limiter.d.ts.map +1 -0
- package/dist/core/rate-limiter.js +156 -0
- package/dist/core/rate-limiter.js.map +1 -0
- package/dist/core/s3-cold-storage.d.ts +116 -0
- package/dist/core/s3-cold-storage.d.ts.map +1 -0
- package/dist/core/s3-cold-storage.js +198 -0
- package/dist/core/s3-cold-storage.js.map +1 -0
- package/dist/core/scheduler.d.ts +126 -0
- package/dist/core/scheduler.d.ts.map +1 -0
- package/dist/core/scheduler.js +138 -0
- package/dist/core/scheduler.js.map +1 -0
- package/dist/core/security-state.d.ts +170 -0
- package/dist/core/security-state.d.ts.map +1 -0
- package/dist/core/security-state.js +156 -0
- package/dist/core/security-state.js.map +1 -0
- package/dist/core/tier-capacity.d.ts +58 -0
- package/dist/core/tier-capacity.d.ts.map +1 -0
- package/dist/core/tier-capacity.js +89 -0
- package/dist/core/tier-capacity.js.map +1 -0
- package/dist/core/tracehound.d.ts +85 -0
- package/dist/core/tracehound.d.ts.map +1 -0
- package/dist/core/tracehound.js +90 -0
- package/dist/core/tracehound.js.map +1 -0
- package/dist/core/trust-boundary.d.ts +85 -0
- package/dist/core/trust-boundary.d.ts.map +1 -0
- package/dist/core/trust-boundary.js +71 -0
- package/dist/core/trust-boundary.js.map +1 -0
- package/dist/core/watcher.d.ts +153 -0
- package/dist/core/watcher.d.ts.map +1 -0
- package/dist/core/watcher.js +141 -0
- package/dist/core/watcher.js.map +1 -0
- package/dist/index.d.ts +53 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +112 -0
- package/dist/index.js.map +1 -0
- package/dist/types/audit.d.ts +45 -0
- package/dist/types/audit.d.ts.map +1 -0
- package/dist/types/audit.js +5 -0
- package/dist/types/audit.js.map +1 -0
- package/dist/types/common.d.ts +12 -0
- package/dist/types/common.d.ts.map +1 -0
- package/dist/types/common.js +5 -0
- package/dist/types/common.js.map +1 -0
- package/dist/types/config.d.ts +98 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +58 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/errors.d.ts +118 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +266 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/evidence.d.ts +102 -0
- package/dist/types/evidence.d.ts.map +1 -0
- package/dist/types/evidence.js +5 -0
- package/dist/types/evidence.js.map +1 -0
- package/dist/types/index.d.ts +18 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +9 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/result.d.ts +62 -0
- package/dist/types/result.d.ts.map +1 -0
- package/dist/types/result.js +34 -0
- package/dist/types/result.js.map +1 -0
- package/dist/types/scent.d.ts +55 -0
- package/dist/types/scent.d.ts.map +1 -0
- package/dist/types/scent.js +5 -0
- package/dist/types/scent.js.map +1 -0
- package/dist/types/signature.d.ts +47 -0
- package/dist/types/signature.d.ts.map +1 -0
- package/dist/types/signature.js +68 -0
- package/dist/types/signature.js.map +1 -0
- package/dist/types/threat.d.ts +38 -0
- package/dist/types/threat.d.ts.map +1 -0
- package/dist/types/threat.js +18 -0
- package/dist/types/threat.js.map +1 -0
- package/dist/utils/binary-codec.d.ts +225 -0
- package/dist/utils/binary-codec.d.ts.map +1 -0
- package/dist/utils/binary-codec.js +266 -0
- package/dist/utils/binary-codec.js.map +1 -0
- package/dist/utils/compare.d.ts +26 -0
- package/dist/utils/compare.d.ts.map +1 -0
- package/dist/utils/compare.js +44 -0
- package/dist/utils/compare.js.map +1 -0
- package/dist/utils/encode.d.ts +39 -0
- package/dist/utils/encode.d.ts.map +1 -0
- package/dist/utils/encode.js +124 -0
- package/dist/utils/encode.js.map +1 -0
- package/dist/utils/hash.d.ts +19 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +25 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/id.d.ts +20 -0
- package/dist/utils/id.d.ts.map +1 -0
- package/dist/utils/id.js +47 -0
- package/dist/utils/id.js.map +1 -0
- package/dist/utils/runtime.d.ts +24 -0
- package/dist/utils/runtime.d.ts.map +1 -0
- package/dist/utils/runtime.js +68 -0
- package/dist/utils/runtime.js.map +1 -0
- package/dist/utils/serialize.d.ts +14 -0
- package/dist/utils/serialize.d.ts.map +1 -0
- package/dist/utils/serialize.js +27 -0
- package/dist/utils/serialize.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracehound.js","sourceRoot":"","sources":["../../src/core/tracehound.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAe,MAAM,YAAY,CAAA;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,eAAe,EAAyB,MAAM,uBAAuB,CAAA;AAC9E,OAAO,EAAE,eAAe,EAAyC,MAAM,iBAAiB,CAAA;AACxF,OAAO,EAAE,yBAAyB,EAA6B,MAAM,2BAA2B,CAAA;AAChG,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,iBAAiB,EAAqB,MAAM,mBAAmB,CAAA;AACxE,OAAO,EAAE,aAAa,EAAiB,MAAM,cAAc,CAAA;AAoE3D,gFAAgF;AAChF,iBAAiB;AACjB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,mBAAmB,GAAoB;IAC3C,QAAQ,EAAE,CAAC;IACX,OAAO,EAAE,MAAM;IACf,gBAAgB,EAAE,IAAI;IACtB,eAAe,EAAE,OAAO;IACxB,eAAe,EAAE,GAAG;CACrB,CAAA;AAED;;GAEG;AACH,MAAM,UAAU;IACL,KAAK,CAAQ;IACb,UAAU,CAAY;IACtB,WAAW,CAAc;IACzB,OAAO,CAAU;IACjB,UAAU,CAAY;IACtB,aAAa,CAAsB;IACnC,SAAS,CAAY;IAEb,eAAe,CAAkB;IAElD,YAAY,UAA6B,EAAE;QACzC,wBAAwB;QACxB,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,EAAE,CAAA;QAClC,IAAI,CAAC,aAAa,GAAG,yBAAyB,EAAE,CAAA;QAEhD,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAC9B;YACE,QAAQ,EAAE,OAAO,CAAC,UAAU,EAAE,QAAQ,IAAI,MAAM;YAChD,QAAQ,EAAE,OAAO,CAAC,UAAU,EAAE,QAAQ,IAAI,WAAW;YACrD,cAAc,EAAE,UAAU;SAC3B,EACD,IAAI,CAAC,UAAU,CAChB,CAAA;QAED,IAAI,CAAC,WAAW,GAAG,iBAAiB,CAAC;YACnC,QAAQ,EAAE,OAAO,CAAC,SAAS,EAAE,QAAQ,IAAI,MAAM;YAC/C,WAAW,EAAE,OAAO,CAAC,SAAS,EAAE,WAAW,IAAI,GAAG;YAClD,eAAe,EAAE,OAAO,CAAC,SAAS,EAAE,eAAe,IAAI,OAAO;SAC/D,CAAC,CAAA;QAEF,IAAI,CAAC,OAAO,GAAG,aAAa,CAAC;YAC3B,kBAAkB,EAAE,OAAO,CAAC,OAAO,EAAE,kBAAkB,IAAI,EAAE;YAC7D,aAAa,EAAE,OAAO,CAAC,OAAO,EAAE,aAAa,IAAI,MAAM;YACvD,uBAAuB,EAAE,OAAO,CAAC,OAAO,EAAE,uBAAuB,IAAI,GAAG;SACzE,CAAC,CAAA;QAEF,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,EAAE,CAAA;QAE5C,eAAe;QACf,IAAI,CAAC,KAAK,GAAG,WAAW,CACtB,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,SAAS,EAAE,EACvD,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,eAAe,CACrB,CAAA;QAED,mBAAmB;QACnB,MAAM,UAAU,GAAoB;YAClC,GAAG,mBAAmB;YACtB,GAAG,OAAO,CAAC,SAAS;SACrB,CAAA;QACD,IAAI,CAAC,SAAS,GAAG,eAAe,CAAC,UAAU,CAAC,CAAA;IAC9C,CAAC;CACF;AAED,gFAAgF;AAChF,UAAU;AACV,gFAAgF;AAEhF;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,gBAAgB,CAAC,UAA6B,EAAE;IAC9D,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC,CAAA;AAChC,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trust Boundary Configuration
|
|
3
|
+
*
|
|
4
|
+
* Developer-defined trust levels for external integrations.
|
|
5
|
+
* RFC-0000: "Biz default'ları sağlıyoruz, sınırları developer çiziyor."
|
|
6
|
+
*
|
|
7
|
+
* SECURITY MODEL:
|
|
8
|
+
* - 'trusted': No additional verification
|
|
9
|
+
* - 'verify': Cross-check with internal state
|
|
10
|
+
* - 'untrusted': Full validation, limited access
|
|
11
|
+
* - 'write-only': Can only receive, cannot query
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Trust level for cluster/shared state.
|
|
15
|
+
*/
|
|
16
|
+
export type ClusterTrustLevel = 'trusted' | 'untrusted';
|
|
17
|
+
/**
|
|
18
|
+
* Trust level for cold storage.
|
|
19
|
+
*/
|
|
20
|
+
export type ColdStorageTrustLevel = 'write-only' | 'untrusted';
|
|
21
|
+
/**
|
|
22
|
+
* Trust level for external detectors.
|
|
23
|
+
*/
|
|
24
|
+
export type DetectorTrustLevel = 'trusted' | 'verify';
|
|
25
|
+
/**
|
|
26
|
+
* Cluster configuration.
|
|
27
|
+
*/
|
|
28
|
+
export interface ClusterBoundaryConfig {
|
|
29
|
+
/** Shared state backend */
|
|
30
|
+
sharedState: 'redis' | 'memory' | 'none';
|
|
31
|
+
/** Trust level for cluster peers. Default: 'untrusted' */
|
|
32
|
+
trustLevel: ClusterTrustLevel;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Cold storage boundary configuration.
|
|
36
|
+
*/
|
|
37
|
+
export interface ColdStorageBoundaryConfig {
|
|
38
|
+
/** Storage endpoint URL */
|
|
39
|
+
endpoint: string;
|
|
40
|
+
/** Trust level. Default: 'write-only' */
|
|
41
|
+
trustLevel: ColdStorageTrustLevel;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Detector boundary configuration.
|
|
45
|
+
*/
|
|
46
|
+
export interface DetectorBoundaryConfig {
|
|
47
|
+
/** Detector source */
|
|
48
|
+
source: 'external' | 'internal';
|
|
49
|
+
/** Trust level. Default: 'trusted' for internal, 'verify' for external */
|
|
50
|
+
trustLevel: DetectorTrustLevel;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Complete trust boundary configuration.
|
|
54
|
+
*/
|
|
55
|
+
export interface TrustBoundaryConfig {
|
|
56
|
+
/** Cluster/shared state boundaries */
|
|
57
|
+
cluster?: ClusterBoundaryConfig;
|
|
58
|
+
/** Cold storage boundaries */
|
|
59
|
+
coldStorage?: ColdStorageBoundaryConfig;
|
|
60
|
+
/** Detector boundaries */
|
|
61
|
+
detector?: DetectorBoundaryConfig;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Default trust boundary configuration.
|
|
65
|
+
* Conservative defaults: assume untrusted.
|
|
66
|
+
*/
|
|
67
|
+
export declare const DEFAULT_TRUST_BOUNDARY: Required<TrustBoundaryConfig>;
|
|
68
|
+
/**
|
|
69
|
+
* Merge partial trust boundary with defaults.
|
|
70
|
+
*/
|
|
71
|
+
export declare function mergeTrustBoundary(partial?: Partial<TrustBoundaryConfig>): Required<TrustBoundaryConfig>;
|
|
72
|
+
/**
|
|
73
|
+
* Validate trust boundary configuration.
|
|
74
|
+
* Returns array of validation errors, empty if valid.
|
|
75
|
+
*/
|
|
76
|
+
export declare function validateTrustBoundary(config: TrustBoundaryConfig): string[];
|
|
77
|
+
/**
|
|
78
|
+
* Check if a detector result should be verified based on trust boundary.
|
|
79
|
+
*/
|
|
80
|
+
export declare function shouldVerifyDetector(config: TrustBoundaryConfig): boolean;
|
|
81
|
+
/**
|
|
82
|
+
* Check if cluster state should be treated as untrusted.
|
|
83
|
+
*/
|
|
84
|
+
export declare function isClusterUntrusted(config: TrustBoundaryConfig): boolean;
|
|
85
|
+
//# sourceMappingURL=trust-boundary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trust-boundary.d.ts","sourceRoot":"","sources":["../../src/core/trust-boundary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,WAAW,CAAA;AAEvD;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,YAAY,GAAG,WAAW,CAAA;AAE9D;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,QAAQ,CAAA;AAErD;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,2BAA2B;IAC3B,WAAW,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAA;IACxC,0DAA0D;IAC1D,UAAU,EAAE,iBAAiB,CAAA;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,2BAA2B;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB,yCAAyC;IACzC,UAAU,EAAE,qBAAqB,CAAA;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,sBAAsB;IACtB,MAAM,EAAE,UAAU,GAAG,UAAU,CAAA;IAC/B,0EAA0E;IAC1E,UAAU,EAAE,kBAAkB,CAAA;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,sCAAsC;IACtC,OAAO,CAAC,EAAE,qBAAqB,CAAA;IAC/B,8BAA8B;IAC9B,WAAW,CAAC,EAAE,yBAAyB,CAAA;IACvC,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,sBAAsB,CAAA;CAClC;AAED;;;GAGG;AACH,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAAC,mBAAmB,CAahE,CAAA;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,GACrC,QAAQ,CAAC,mBAAmB,CAAC,CAQ/B;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,EAAE,CAc3E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAEzE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAEvE"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trust Boundary Configuration
|
|
3
|
+
*
|
|
4
|
+
* Developer-defined trust levels for external integrations.
|
|
5
|
+
* RFC-0000: "Biz default'ları sağlıyoruz, sınırları developer çiziyor."
|
|
6
|
+
*
|
|
7
|
+
* SECURITY MODEL:
|
|
8
|
+
* - 'trusted': No additional verification
|
|
9
|
+
* - 'verify': Cross-check with internal state
|
|
10
|
+
* - 'untrusted': Full validation, limited access
|
|
11
|
+
* - 'write-only': Can only receive, cannot query
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Default trust boundary configuration.
|
|
15
|
+
* Conservative defaults: assume untrusted.
|
|
16
|
+
*/
|
|
17
|
+
export const DEFAULT_TRUST_BOUNDARY = {
|
|
18
|
+
cluster: {
|
|
19
|
+
sharedState: 'none',
|
|
20
|
+
trustLevel: 'untrusted',
|
|
21
|
+
},
|
|
22
|
+
coldStorage: {
|
|
23
|
+
endpoint: '',
|
|
24
|
+
trustLevel: 'write-only',
|
|
25
|
+
},
|
|
26
|
+
detector: {
|
|
27
|
+
source: 'internal',
|
|
28
|
+
trustLevel: 'trusted',
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Merge partial trust boundary with defaults.
|
|
33
|
+
*/
|
|
34
|
+
export function mergeTrustBoundary(partial) {
|
|
35
|
+
if (!partial)
|
|
36
|
+
return { ...DEFAULT_TRUST_BOUNDARY };
|
|
37
|
+
return {
|
|
38
|
+
cluster: { ...DEFAULT_TRUST_BOUNDARY.cluster, ...partial.cluster },
|
|
39
|
+
coldStorage: { ...DEFAULT_TRUST_BOUNDARY.coldStorage, ...partial.coldStorage },
|
|
40
|
+
detector: { ...DEFAULT_TRUST_BOUNDARY.detector, ...partial.detector },
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Validate trust boundary configuration.
|
|
45
|
+
* Returns array of validation errors, empty if valid.
|
|
46
|
+
*/
|
|
47
|
+
export function validateTrustBoundary(config) {
|
|
48
|
+
const errors = [];
|
|
49
|
+
// Cold storage endpoint required if configured
|
|
50
|
+
if (config.coldStorage && config.coldStorage.endpoint === '') {
|
|
51
|
+
errors.push('coldStorage.endpoint is required when coldStorage is configured');
|
|
52
|
+
}
|
|
53
|
+
// External detector requires 'verify' trust level
|
|
54
|
+
if (config.detector?.source === 'external' && config.detector.trustLevel === 'trusted') {
|
|
55
|
+
errors.push("External detector should use 'verify' trust level, not 'trusted'");
|
|
56
|
+
}
|
|
57
|
+
return errors;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Check if a detector result should be verified based on trust boundary.
|
|
61
|
+
*/
|
|
62
|
+
export function shouldVerifyDetector(config) {
|
|
63
|
+
return config.detector?.trustLevel === 'verify';
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Check if cluster state should be treated as untrusted.
|
|
67
|
+
*/
|
|
68
|
+
export function isClusterUntrusted(config) {
|
|
69
|
+
return config.cluster?.trustLevel === 'untrusted';
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=trust-boundary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trust-boundary.js","sourceRoot":"","sources":["../../src/core/trust-boundary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA2DH;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAkC;IACnE,OAAO,EAAE;QACP,WAAW,EAAE,MAAM;QACnB,UAAU,EAAE,WAAW;KACxB;IACD,WAAW,EAAE;QACX,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,YAAY;KACzB;IACD,QAAQ,EAAE;QACR,MAAM,EAAE,UAAU;QAClB,UAAU,EAAE,SAAS;KACtB;CACF,CAAA;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAAsC;IAEtC,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,GAAG,sBAAsB,EAAE,CAAA;IAElD,OAAO;QACL,OAAO,EAAE,EAAE,GAAG,sBAAsB,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE;QAClE,WAAW,EAAE,EAAE,GAAG,sBAAsB,CAAC,WAAW,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE;QAC9E,QAAQ,EAAE,EAAE,GAAG,sBAAsB,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE;KACtE,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAA2B;IAC/D,MAAM,MAAM,GAAa,EAAE,CAAA;IAE3B,+CAA+C;IAC/C,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,CAAC,QAAQ,KAAK,EAAE,EAAE,CAAC;QAC7D,MAAM,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAA;IAChF,CAAC;IAED,kDAAkD;IAClD,IAAI,MAAM,CAAC,QAAQ,EAAE,MAAM,KAAK,UAAU,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACvF,MAAM,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAA;IACjF,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAA2B;IAC9D,OAAO,MAAM,CAAC,QAAQ,EAAE,UAAU,KAAK,QAAQ,CAAA;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAA2B;IAC5D,OAAO,MAAM,CAAC,OAAO,EAAE,UAAU,KAAK,WAAW,CAAA;AACnD,CAAC"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Watcher - pull-based observability for system state.
|
|
3
|
+
*
|
|
4
|
+
* RFC-0000 CRITICAL INVARIANTS:
|
|
5
|
+
* - NO EventEmitter pattern (pull-based only)
|
|
6
|
+
* - snapshot() returns immutable state
|
|
7
|
+
* - alert() is internal, rate-limited
|
|
8
|
+
* - Watcher is an observer, not a controller
|
|
9
|
+
*/
|
|
10
|
+
import type { Severity } from '../types/common.js';
|
|
11
|
+
/**
|
|
12
|
+
* Alert severity levels.
|
|
13
|
+
*/
|
|
14
|
+
export type AlertSeverity = 'info' | 'warning' | 'critical';
|
|
15
|
+
/**
|
|
16
|
+
* Alert definition.
|
|
17
|
+
*/
|
|
18
|
+
export interface Alert {
|
|
19
|
+
/** Alert ID */
|
|
20
|
+
id: string;
|
|
21
|
+
/** Alert type */
|
|
22
|
+
type: AlertType;
|
|
23
|
+
/** Alert severity */
|
|
24
|
+
severity: AlertSeverity;
|
|
25
|
+
/** Human-readable message */
|
|
26
|
+
message: string;
|
|
27
|
+
/** Timestamp of alert */
|
|
28
|
+
timestamp: number;
|
|
29
|
+
/** Additional context */
|
|
30
|
+
context?: Record<string, unknown>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Alert types.
|
|
34
|
+
*/
|
|
35
|
+
export type AlertType = 'threat_detected' | 'evidence_neutralized' | 'quarantine_full' | 'quarantine_high' | 'rate_limit_exceeded' | 'hound_timeout' | 'system_overload';
|
|
36
|
+
/**
|
|
37
|
+
* Threat statistics.
|
|
38
|
+
*/
|
|
39
|
+
export interface ThreatStats {
|
|
40
|
+
/** Total threats detected */
|
|
41
|
+
total: number;
|
|
42
|
+
/** Threats by category */
|
|
43
|
+
byCategory: Record<string, number>;
|
|
44
|
+
/** Threats by severity */
|
|
45
|
+
bySeverity: Record<Severity, number>;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Quarantine statistics (from Watcher perspective).
|
|
49
|
+
*/
|
|
50
|
+
export interface WatcherQuarantineStats {
|
|
51
|
+
/** Current count */
|
|
52
|
+
count: number;
|
|
53
|
+
/** Current bytes */
|
|
54
|
+
bytes: number;
|
|
55
|
+
/** Capacity percentage */
|
|
56
|
+
capacityPercent: number;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Watcher snapshot (immutable).
|
|
60
|
+
*/
|
|
61
|
+
export interface WatcherSnapshot {
|
|
62
|
+
/** System uptime in ms */
|
|
63
|
+
uptimeMs: number;
|
|
64
|
+
/** Threat statistics */
|
|
65
|
+
threats: ThreatStats;
|
|
66
|
+
/** Quarantine statistics */
|
|
67
|
+
quarantine: WatcherQuarantineStats;
|
|
68
|
+
/** Total alerts emitted */
|
|
69
|
+
totalAlerts: number;
|
|
70
|
+
/** Alerts in current window */
|
|
71
|
+
alertsInWindow: number;
|
|
72
|
+
/** Last alert (if any) */
|
|
73
|
+
lastAlert: Alert | null;
|
|
74
|
+
/** Whether system is in overload state */
|
|
75
|
+
overloaded: boolean;
|
|
76
|
+
/** Timestamp of snapshot */
|
|
77
|
+
snapshotTime: number;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Watcher configuration.
|
|
81
|
+
*/
|
|
82
|
+
export interface WatcherConfig {
|
|
83
|
+
/** Maximum alerts per window (rate limiting) */
|
|
84
|
+
maxAlertsPerWindow: number;
|
|
85
|
+
/** Alert window in ms */
|
|
86
|
+
alertWindowMs: number;
|
|
87
|
+
/** Quarantine high watermark (0-1) */
|
|
88
|
+
quarantineHighWatermark: number;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Watcher interface.
|
|
92
|
+
*
|
|
93
|
+
* CRITICAL: NO EventEmitter. Pull-based only.
|
|
94
|
+
*/
|
|
95
|
+
export interface IWatcher {
|
|
96
|
+
/**
|
|
97
|
+
* Get current state snapshot.
|
|
98
|
+
* External consumers poll this.
|
|
99
|
+
*/
|
|
100
|
+
snapshot(): Readonly<WatcherSnapshot>;
|
|
101
|
+
/**
|
|
102
|
+
* Record a threat detection.
|
|
103
|
+
* Internal use only.
|
|
104
|
+
*/
|
|
105
|
+
recordThreat(category: string, severity: Severity): void;
|
|
106
|
+
/**
|
|
107
|
+
* Update quarantine stats.
|
|
108
|
+
* Internal use only.
|
|
109
|
+
*/
|
|
110
|
+
updateQuarantine(count: number, bytes: number, maxBytes: number): void;
|
|
111
|
+
/**
|
|
112
|
+
* Emit an alert (rate-limited).
|
|
113
|
+
* Internal use only.
|
|
114
|
+
*/
|
|
115
|
+
alert(alert: Omit<Alert, 'id' | 'timestamp'>): boolean;
|
|
116
|
+
/**
|
|
117
|
+
* Mark system as overloaded.
|
|
118
|
+
*/
|
|
119
|
+
setOverloaded(overloaded: boolean): void;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Watcher implementation.
|
|
123
|
+
*
|
|
124
|
+
* Pull-based observability. No EventEmitter.
|
|
125
|
+
*/
|
|
126
|
+
export declare class Watcher implements IWatcher {
|
|
127
|
+
private readonly config;
|
|
128
|
+
private readonly startTime;
|
|
129
|
+
private readonly alerts;
|
|
130
|
+
private alertWindowStart;
|
|
131
|
+
private alertsInCurrentWindow;
|
|
132
|
+
private _totalThreats;
|
|
133
|
+
private readonly threatsByCategory;
|
|
134
|
+
private readonly threatsBySeverity;
|
|
135
|
+
private _quarantineCount;
|
|
136
|
+
private _quarantineBytes;
|
|
137
|
+
private _quarantineCapacity;
|
|
138
|
+
private _overloaded;
|
|
139
|
+
private _lastAlert;
|
|
140
|
+
constructor(config: WatcherConfig);
|
|
141
|
+
snapshot(): Readonly<WatcherSnapshot>;
|
|
142
|
+
recordThreat(category: string, severity: Severity): void;
|
|
143
|
+
updateQuarantine(count: number, bytes: number, maxBytes: number): void;
|
|
144
|
+
alert(alertInput: Omit<Alert, 'id' | 'timestamp'>): boolean;
|
|
145
|
+
setOverloaded(overloaded: boolean): void;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Create a Watcher instance.
|
|
149
|
+
*
|
|
150
|
+
* @param config - Watcher configuration
|
|
151
|
+
*/
|
|
152
|
+
export declare function createWatcher(config: WatcherConfig): IWatcher;
|
|
153
|
+
//# sourceMappingURL=watcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/core/watcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Watcher - pull-based observability for system state.
|
|
3
|
+
*
|
|
4
|
+
* RFC-0000 CRITICAL INVARIANTS:
|
|
5
|
+
* - NO EventEmitter pattern (pull-based only)
|
|
6
|
+
* - snapshot() returns immutable state
|
|
7
|
+
* - alert() is internal, rate-limited
|
|
8
|
+
* - Watcher is an observer, not a controller
|
|
9
|
+
*/
|
|
10
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
11
|
+
// Implementation
|
|
12
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
13
|
+
/**
|
|
14
|
+
* Watcher implementation.
|
|
15
|
+
*
|
|
16
|
+
* Pull-based observability. No EventEmitter.
|
|
17
|
+
*/
|
|
18
|
+
export class Watcher {
|
|
19
|
+
config;
|
|
20
|
+
startTime;
|
|
21
|
+
alerts = [];
|
|
22
|
+
alertWindowStart;
|
|
23
|
+
alertsInCurrentWindow = 0;
|
|
24
|
+
// Threat tracking
|
|
25
|
+
_totalThreats = 0;
|
|
26
|
+
threatsByCategory = new Map();
|
|
27
|
+
threatsBySeverity = new Map();
|
|
28
|
+
// Quarantine tracking
|
|
29
|
+
_quarantineCount = 0;
|
|
30
|
+
_quarantineBytes = 0;
|
|
31
|
+
_quarantineCapacity = 0;
|
|
32
|
+
// State
|
|
33
|
+
_overloaded = false;
|
|
34
|
+
_lastAlert = null;
|
|
35
|
+
constructor(config) {
|
|
36
|
+
this.config = config;
|
|
37
|
+
this.startTime = Date.now();
|
|
38
|
+
this.alertWindowStart = this.startTime;
|
|
39
|
+
}
|
|
40
|
+
snapshot() {
|
|
41
|
+
const now = Date.now();
|
|
42
|
+
// Build threat stats
|
|
43
|
+
const byCategory = {};
|
|
44
|
+
for (const [cat, count] of this.threatsByCategory) {
|
|
45
|
+
byCategory[cat] = count;
|
|
46
|
+
}
|
|
47
|
+
const bySeverity = {
|
|
48
|
+
low: this.threatsBySeverity.get('low') ?? 0,
|
|
49
|
+
medium: this.threatsBySeverity.get('medium') ?? 0,
|
|
50
|
+
high: this.threatsBySeverity.get('high') ?? 0,
|
|
51
|
+
critical: this.threatsBySeverity.get('critical') ?? 0,
|
|
52
|
+
};
|
|
53
|
+
return Object.freeze({
|
|
54
|
+
uptimeMs: now - this.startTime,
|
|
55
|
+
threats: {
|
|
56
|
+
total: this._totalThreats,
|
|
57
|
+
byCategory,
|
|
58
|
+
bySeverity,
|
|
59
|
+
},
|
|
60
|
+
quarantine: {
|
|
61
|
+
count: this._quarantineCount,
|
|
62
|
+
bytes: this._quarantineBytes,
|
|
63
|
+
capacityPercent: this._quarantineCapacity,
|
|
64
|
+
},
|
|
65
|
+
totalAlerts: this.alerts.length,
|
|
66
|
+
alertsInWindow: this.alertsInCurrentWindow,
|
|
67
|
+
lastAlert: this._lastAlert,
|
|
68
|
+
overloaded: this._overloaded,
|
|
69
|
+
snapshotTime: now,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
recordThreat(category, severity) {
|
|
73
|
+
this._totalThreats++;
|
|
74
|
+
// Update by category
|
|
75
|
+
const catCount = this.threatsByCategory.get(category) ?? 0;
|
|
76
|
+
this.threatsByCategory.set(category, catCount + 1);
|
|
77
|
+
// Update by severity
|
|
78
|
+
const sevCount = this.threatsBySeverity.get(severity) ?? 0;
|
|
79
|
+
this.threatsBySeverity.set(severity, sevCount + 1);
|
|
80
|
+
}
|
|
81
|
+
updateQuarantine(count, bytes, maxBytes) {
|
|
82
|
+
this._quarantineCount = count;
|
|
83
|
+
this._quarantineBytes = bytes;
|
|
84
|
+
this._quarantineCapacity = maxBytes > 0 ? (bytes / maxBytes) * 100 : 0;
|
|
85
|
+
// Check high watermark
|
|
86
|
+
if (this._quarantineCapacity >= this.config.quarantineHighWatermark * 100) {
|
|
87
|
+
this.alert({
|
|
88
|
+
type: 'quarantine_high',
|
|
89
|
+
severity: 'warning',
|
|
90
|
+
message: `Quarantine at ${this._quarantineCapacity.toFixed(1)}% capacity`,
|
|
91
|
+
context: { count, bytes, maxBytes },
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
alert(alertInput) {
|
|
96
|
+
const now = Date.now();
|
|
97
|
+
// Check if we need to reset the window
|
|
98
|
+
if (now - this.alertWindowStart >= this.config.alertWindowMs) {
|
|
99
|
+
this.alertWindowStart = now;
|
|
100
|
+
this.alertsInCurrentWindow = 0;
|
|
101
|
+
}
|
|
102
|
+
// Rate limit check
|
|
103
|
+
if (this.alertsInCurrentWindow >= this.config.maxAlertsPerWindow) {
|
|
104
|
+
return false; // Rate limited
|
|
105
|
+
}
|
|
106
|
+
// Create alert
|
|
107
|
+
const alert = {
|
|
108
|
+
...alertInput,
|
|
109
|
+
id: `alert-${this.alerts.length + 1}`,
|
|
110
|
+
timestamp: now,
|
|
111
|
+
};
|
|
112
|
+
this.alerts.push(alert);
|
|
113
|
+
this.alertsInCurrentWindow++;
|
|
114
|
+
this._lastAlert = alert;
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
setOverloaded(overloaded) {
|
|
118
|
+
const wasOverloaded = this._overloaded;
|
|
119
|
+
this._overloaded = overloaded;
|
|
120
|
+
// Emit alert on transition to overloaded
|
|
121
|
+
if (overloaded && !wasOverloaded) {
|
|
122
|
+
this.alert({
|
|
123
|
+
type: 'system_overload',
|
|
124
|
+
severity: 'critical',
|
|
125
|
+
message: 'System is overloaded',
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
131
|
+
// Factory
|
|
132
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
133
|
+
/**
|
|
134
|
+
* Create a Watcher instance.
|
|
135
|
+
*
|
|
136
|
+
* @param config - Watcher configuration
|
|
137
|
+
*/
|
|
138
|
+
export function createWatcher(config) {
|
|
139
|
+
return new Watcher(config);
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=watcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/core/watcher.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @tracehound/core
|
|
3
|
+
*
|
|
4
|
+
* Security buffer system with immune system architecture.
|
|
5
|
+
*/
|
|
6
|
+
export type { AlertConfig, AuditConfig, ColdStorageConfig, ErrorState, EvacuateRecord, EvidenceHandle, GenerateSignatureOptions, HoundConfig, InterceptResult, JsonPrimitive, JsonSerializable, NeutralizationRecord, PurgeRecord, QuarantineConfig, RateLimitConfig, RuntimeConfig, Scent, SchedulerConfig, Severity, Threat, ThreatCategory, ThreatInput, ThreatSignal, TracehoundConfig, TracehoundError, } from './types/index.js';
|
|
7
|
+
export { DEFAULT_CONFIG, mergeWithDefaults } from './types/index.js';
|
|
8
|
+
export { createError, Errors } from './types/index.js';
|
|
9
|
+
export { isClean, isError, isIgnored, isQuarantined, isRateLimited } from './types/index.js';
|
|
10
|
+
export { createThreatInput } from './types/index.js';
|
|
11
|
+
export { compareSignatures, generateSignature, validateSignature } from './types/index.js';
|
|
12
|
+
export { AuditChain, GENESIS_HASH } from './core/audit-chain.js';
|
|
13
|
+
export { Evidence } from './core/evidence.js';
|
|
14
|
+
export { Quarantine } from './core/quarantine.js';
|
|
15
|
+
export type { InsertResult, QuarantineStats } from './core/quarantine.js';
|
|
16
|
+
export { createRateLimiter, RateLimiter } from './core/rate-limiter.js';
|
|
17
|
+
export type { IRateLimiter, RateLimiterStats, RateLimitResult } from './core/rate-limiter.js';
|
|
18
|
+
export { createEvidenceFactory, EvidenceFactory } from './core/evidence-factory.js';
|
|
19
|
+
export type { EvidenceCreationResult, EvidenceFactoryOptions, IEvidenceFactory, } from './core/evidence-factory.js';
|
|
20
|
+
export { Agent, createAgent } from './core/agent.js';
|
|
21
|
+
export type { AgentConfig, AgentStats, IAgent } from './core/agent.js';
|
|
22
|
+
export { createHoundPool, createMockAdapter, HoundPool } from './core/hound-pool.js';
|
|
23
|
+
export type { HoundPoolConfig, HoundPoolStats, HoundResult, IHoundPool, PoolExhaustedAction, } from './core/hound-pool.js';
|
|
24
|
+
export type { HoundProcessConstraints } from './core/process-adapter.js';
|
|
25
|
+
export { createScheduler, Scheduler } from './core/scheduler.js';
|
|
26
|
+
export type { BusyChecker, IScheduler, ScheduledTask, SchedulerStats, TickSchedulerConfig, } from './core/scheduler.js';
|
|
27
|
+
export { createWatcher, Watcher } from './core/watcher.js';
|
|
28
|
+
export type { Alert, AlertSeverity, AlertType, IWatcher, ThreatStats, WatcherConfig, WatcherQuarantineStats, WatcherSnapshot, } from './core/watcher.js';
|
|
29
|
+
export { hash, hashBuffer } from './utils/hash.js';
|
|
30
|
+
export { generateSecureId, isValidSecureId } from './utils/id.js';
|
|
31
|
+
export { serialize } from './utils/serialize.js';
|
|
32
|
+
export { AsyncGzipCodec, createAsyncColdPathCodec, createColdPathCodec, createHotPathCodec, decodeWithIntegrityAsync, encodeWithIntegrityAsync, GzipCodec, } from './utils/binary-codec.js';
|
|
33
|
+
export type { AsyncColdPathCodec, AsyncHotPathCodec, CodecStats, ColdPathCodec, HotPathCodec, } from './utils/binary-codec.js';
|
|
34
|
+
export { constantTimeBufferEqual, constantTimeEqual } from './utils/compare.js';
|
|
35
|
+
export { encodePayload, estimatePayloadSize } from './utils/encode.js';
|
|
36
|
+
export type { EncodeResult } from './utils/encode.js';
|
|
37
|
+
export { createMemoryColdStorage, MemoryColdStorage } from './core/cold-storage.js';
|
|
38
|
+
export type { ColdStorageReadResult, ColdStorageWriteResult, IColdStorageAdapter, } from './core/cold-storage.js';
|
|
39
|
+
export { createS3ColdStorage, S3ColdStorage } from './core/s3-cold-storage.js';
|
|
40
|
+
export type { S3ColdStorageConfig, S3LikeClient } from './core/s3-cold-storage.js';
|
|
41
|
+
export { DEFAULT_TRUST_BOUNDARY, isClusterUntrusted, mergeTrustBoundary, shouldVerifyDetector, validateTrustBoundary, } from './core/trust-boundary.js';
|
|
42
|
+
export type { ClusterBoundaryConfig, ClusterTrustLevel, ColdStorageBoundaryConfig, ColdStorageTrustLevel, DetectorBoundaryConfig, DetectorTrustLevel, TrustBoundaryConfig, } from './core/trust-boundary.js';
|
|
43
|
+
export { createLaneQueue, DEFAULT_LANE_CONFIG, LaneQueue } from './core/lane-queue.js';
|
|
44
|
+
export type { Alert as LaneAlert, LaneConfig, LaneQueueConfig, LaneStats, } from './core/lane-queue.js';
|
|
45
|
+
export { createFailSafe, DEFAULT_FAIL_SAFE_CONFIG, FailSafe } from './core/fail-safe.js';
|
|
46
|
+
export type { FailSafeConfig, PanicCallback, PanicEvent, PanicLevel, PanicReason, ThresholdConfig, } from './core/fail-safe.js';
|
|
47
|
+
export { createTracehound } from './core/tracehound.js';
|
|
48
|
+
export type { ITracehound, TracehoundOptions } from './core/tracehound.js';
|
|
49
|
+
export { createNotificationEmitter, NotificationEmitter } from './core/notification-emitter.js';
|
|
50
|
+
export type { EventCallback, EventType, EvidenceEvictedPayload, EvidenceQuarantinedPayload, INotificationEmitter, LicenseExpiredPayload, LicenseValidatedPayload, NotificationEmitterStats, RateLimitExceededPayload, SystemPanicPayload, ThreatDetectedPayload, TracehoundEvent, WebhookConfig, } from './core/notification-emitter.js';
|
|
51
|
+
export { createSecurityState, SecurityState } from './core/security-state.js';
|
|
52
|
+
export type { ISecurityState, LicenseState, QuarantineStateStats, RateLimitStats, SecurityHistoryEntry, SecuritySnapshot, SecurityStateConfig, SecurityStateStats, } from './core/security-state.js';
|
|
53
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|