@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,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evidence Factory - creates Evidence instances with proper hash ownership.
|
|
3
|
+
*
|
|
4
|
+
* SECURITY INVARIANTS:
|
|
5
|
+
* - Factory owns all cryptographic operations
|
|
6
|
+
* - Agent MUST NOT compute hashes or signatures directly
|
|
7
|
+
* - Codec compression is internal to factory
|
|
8
|
+
* - Agent interface remains unchanged
|
|
9
|
+
*/
|
|
10
|
+
import type { TracehoundError } from '../types/errors.js';
|
|
11
|
+
import type { Scent, ThreatSignal } from '../types/scent.js';
|
|
12
|
+
import type { HotPathCodec } from '../utils/binary-codec.js';
|
|
13
|
+
import { Evidence } from './evidence.js';
|
|
14
|
+
/**
|
|
15
|
+
* Result of evidence creation.
|
|
16
|
+
*/
|
|
17
|
+
export type EvidenceCreationResult = {
|
|
18
|
+
ok: true;
|
|
19
|
+
/** Created evidence handle */
|
|
20
|
+
evidence: Evidence;
|
|
21
|
+
/** Generated signature */
|
|
22
|
+
signature: string;
|
|
23
|
+
/** Payload hash (of uncompressed canonical bytes) */
|
|
24
|
+
hash: string;
|
|
25
|
+
/** Size in bytes (compressed if codec provided) */
|
|
26
|
+
size: number;
|
|
27
|
+
/** Whether compression was applied */
|
|
28
|
+
compressed: boolean;
|
|
29
|
+
} | {
|
|
30
|
+
ok: false;
|
|
31
|
+
/** Error that prevented creation */
|
|
32
|
+
error: TracehoundError;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Evidence factory options.
|
|
36
|
+
*/
|
|
37
|
+
export interface EvidenceFactoryOptions {
|
|
38
|
+
/**
|
|
39
|
+
* Optional codec for compression.
|
|
40
|
+
* If provided, evidence bytes will be compressed.
|
|
41
|
+
* Use createHotPathCodec() - NO decode access.
|
|
42
|
+
*/
|
|
43
|
+
codec?: HotPathCodec;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Evidence factory interface.
|
|
47
|
+
*/
|
|
48
|
+
export interface IEvidenceFactory {
|
|
49
|
+
/**
|
|
50
|
+
* Create evidence from scent with threat signal.
|
|
51
|
+
*
|
|
52
|
+
* @param scent - The scent to create evidence from
|
|
53
|
+
* @param threat - Threat signal (category + severity)
|
|
54
|
+
* @param maxPayloadSize - Maximum allowed payload size (before compression)
|
|
55
|
+
* @returns Evidence creation result
|
|
56
|
+
*/
|
|
57
|
+
create(scent: Scent, threat: ThreatSignal, maxPayloadSize: number): EvidenceCreationResult;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Evidence factory implementation.
|
|
61
|
+
*
|
|
62
|
+
* Responsibilities:
|
|
63
|
+
* 1. Encode payload (validation + canonical bytes)
|
|
64
|
+
* 2. Compute SHA-256 hash of canonical bytes (BEFORE compression)
|
|
65
|
+
* 3. Optionally compress bytes
|
|
66
|
+
* 4. Generate collision-resistant signature
|
|
67
|
+
* 5. Create Evidence instance with computed values
|
|
68
|
+
*
|
|
69
|
+
* SECURITY: Hash is computed on uncompressed bytes.
|
|
70
|
+
* This ensures signature determinism regardless of compression.
|
|
71
|
+
*/
|
|
72
|
+
export declare class EvidenceFactory implements IEvidenceFactory {
|
|
73
|
+
private readonly codec;
|
|
74
|
+
constructor(options?: EvidenceFactoryOptions);
|
|
75
|
+
create(scent: Scent, threat: ThreatSignal, maxPayloadSize: number): EvidenceCreationResult;
|
|
76
|
+
private isTracehoundError;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Create an evidence factory instance.
|
|
80
|
+
* Factory function for dependency injection.
|
|
81
|
+
*
|
|
82
|
+
* @param options - Optional configuration including codec
|
|
83
|
+
*/
|
|
84
|
+
export declare function createEvidenceFactory(options?: EvidenceFactoryOptions): IEvidenceFactory;
|
|
85
|
+
//# sourceMappingURL=evidence-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence-factory.d.ts","sourceRoot":"","sources":["../../src/core/evidence-factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAG5D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAC9B;IACE,EAAE,EAAE,IAAI,CAAA;IACR,8BAA8B;IAC9B,QAAQ,EAAE,QAAQ,CAAA;IAClB,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAA;IACZ,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAA;IACZ,sCAAsC;IACtC,UAAU,EAAE,OAAO,CAAA;CACpB,GACD;IACE,EAAE,EAAE,KAAK,CAAA;IACT,oCAAoC;IACpC,KAAK,EAAE,eAAe,CAAA;CACvB,CAAA;AAEL;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,KAAK,CAAC,EAAE,YAAY,CAAA;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;;;OAOG;IACH,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,GAAG,sBAAsB,CAAA;CAC3F;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,eAAgB,YAAW,gBAAgB;IACtD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA0B;gBAEpC,OAAO,GAAE,sBAA2B;IAIhD,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,GAAG,sBAAsB;IAgE1F,OAAO,CAAC,iBAAiB;CAS1B;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,sBAA2B,GAAG,gBAAgB,CAE5F"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evidence Factory - creates Evidence instances with proper hash ownership.
|
|
3
|
+
*
|
|
4
|
+
* SECURITY INVARIANTS:
|
|
5
|
+
* - Factory owns all cryptographic operations
|
|
6
|
+
* - Agent MUST NOT compute hashes or signatures directly
|
|
7
|
+
* - Codec compression is internal to factory
|
|
8
|
+
* - Agent interface remains unchanged
|
|
9
|
+
*/
|
|
10
|
+
import { encodePayload } from '../utils/encode.js';
|
|
11
|
+
import { hashBuffer } from '../utils/hash.js';
|
|
12
|
+
import { Evidence } from './evidence.js';
|
|
13
|
+
/**
|
|
14
|
+
* Evidence factory implementation.
|
|
15
|
+
*
|
|
16
|
+
* Responsibilities:
|
|
17
|
+
* 1. Encode payload (validation + canonical bytes)
|
|
18
|
+
* 2. Compute SHA-256 hash of canonical bytes (BEFORE compression)
|
|
19
|
+
* 3. Optionally compress bytes
|
|
20
|
+
* 4. Generate collision-resistant signature
|
|
21
|
+
* 5. Create Evidence instance with computed values
|
|
22
|
+
*
|
|
23
|
+
* SECURITY: Hash is computed on uncompressed bytes.
|
|
24
|
+
* This ensures signature determinism regardless of compression.
|
|
25
|
+
*/
|
|
26
|
+
export class EvidenceFactory {
|
|
27
|
+
codec;
|
|
28
|
+
constructor(options = {}) {
|
|
29
|
+
this.codec = options.codec;
|
|
30
|
+
}
|
|
31
|
+
create(scent, threat, maxPayloadSize) {
|
|
32
|
+
try {
|
|
33
|
+
// Step 1: Encode payload with validation
|
|
34
|
+
const encoded = encodePayload(scent.payload, maxPayloadSize);
|
|
35
|
+
// Step 2: Compute hash of canonical bytes (BEFORE compression)
|
|
36
|
+
// This ensures signature determinism
|
|
37
|
+
const hash = hashBuffer(encoded.bytes);
|
|
38
|
+
// Step 3: Generate signature (category + hash)
|
|
39
|
+
const signature = `${threat.category}:${hash}`;
|
|
40
|
+
// Step 4: Optionally compress bytes
|
|
41
|
+
let finalBytes;
|
|
42
|
+
let compressed = false;
|
|
43
|
+
if (this.codec) {
|
|
44
|
+
finalBytes = this.codec.encode(encoded.bytes);
|
|
45
|
+
compressed = true;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
finalBytes = encoded.bytes;
|
|
49
|
+
}
|
|
50
|
+
// Step 5: Create Evidence instance
|
|
51
|
+
const evidence = new Evidence(finalBytes.buffer.slice(finalBytes.byteOffset, finalBytes.byteOffset + finalBytes.byteLength), signature, hash, threat.severity, scent.timestamp, compressed);
|
|
52
|
+
return {
|
|
53
|
+
ok: true,
|
|
54
|
+
evidence,
|
|
55
|
+
signature,
|
|
56
|
+
hash,
|
|
57
|
+
size: finalBytes.length,
|
|
58
|
+
compressed,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
// Convert to TracehoundError if not already
|
|
63
|
+
if (this.isTracehoundError(error)) {
|
|
64
|
+
return { ok: false, error };
|
|
65
|
+
}
|
|
66
|
+
// Wrap unknown error
|
|
67
|
+
return {
|
|
68
|
+
ok: false,
|
|
69
|
+
error: {
|
|
70
|
+
state: 'agent',
|
|
71
|
+
code: 'EVIDENCE_CREATION_FAILED',
|
|
72
|
+
message: error instanceof Error ? error.message : 'Unknown error',
|
|
73
|
+
context: { scentId: scent.id },
|
|
74
|
+
recoverable: false,
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
isTracehoundError(error) {
|
|
80
|
+
return (typeof error === 'object' &&
|
|
81
|
+
error !== null &&
|
|
82
|
+
'state' in error &&
|
|
83
|
+
'code' in error &&
|
|
84
|
+
'message' in error);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Create an evidence factory instance.
|
|
89
|
+
* Factory function for dependency injection.
|
|
90
|
+
*
|
|
91
|
+
* @param options - Optional configuration including codec
|
|
92
|
+
*/
|
|
93
|
+
export function createEvidenceFactory(options = {}) {
|
|
94
|
+
return new EvidenceFactory(options);
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=evidence-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence-factory.js","sourceRoot":"","sources":["../../src/core/evidence-factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAoDxC;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,eAAe;IACT,KAAK,CAA0B;IAEhD,YAAY,UAAkC,EAAE;QAC9C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAA;IAC5B,CAAC;IAED,MAAM,CAAC,KAAY,EAAE,MAAoB,EAAE,cAAsB;QAC/D,IAAI,CAAC;YACH,yCAAyC;YACzC,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,cAAc,CAAC,CAAA;YAE5D,+DAA+D;YAC/D,qCAAqC;YACrC,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YAEtC,+CAA+C;YAC/C,MAAM,SAAS,GAAG,GAAG,MAAM,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAA;YAE9C,oCAAoC;YACpC,IAAI,UAAsB,CAAA;YAC1B,IAAI,UAAU,GAAG,KAAK,CAAA;YAEtB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;gBAC7C,UAAU,GAAG,IAAI,CAAA;YACnB,CAAC;iBAAM,CAAC;gBACN,UAAU,GAAG,OAAO,CAAC,KAAK,CAAA;YAC5B,CAAC;YAED,mCAAmC;YACnC,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAC3B,UAAU,CAAC,MAAM,CAAC,KAAK,CACrB,UAAU,CAAC,UAAU,EACrB,UAAU,CAAC,UAAU,GAAG,UAAU,CAAC,UAAU,CAC/B,EAChB,SAAS,EACT,IAAI,EACJ,MAAM,CAAC,QAAQ,EACf,KAAK,CAAC,SAAS,EACf,UAAU,CACX,CAAA;YAED,OAAO;gBACL,EAAE,EAAE,IAAI;gBACR,QAAQ;gBACR,SAAS;gBACT,IAAI;gBACJ,IAAI,EAAE,UAAU,CAAC,MAAM;gBACvB,UAAU;aACX,CAAA;QACH,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,4CAA4C;YAC5C,IAAI,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;YAC7B,CAAC;YAED,qBAAqB;YACrB,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE;oBACL,KAAK,EAAE,OAAO;oBACd,IAAI,EAAE,0BAA0B;oBAChC,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;oBACjE,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE;oBAC9B,WAAW,EAAE,KAAK;iBACnB;aACF,CAAA;QACH,CAAC;IACH,CAAC;IAEO,iBAAiB,CAAC,KAAc;QACtC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;YACzB,KAAK,KAAK,IAAI;YACd,OAAO,IAAI,KAAK;YAChB,MAAM,IAAI,KAAK;YACf,SAAS,IAAI,KAAK,CACnB,CAAA;IACH,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,UAAkC,EAAE;IACxE,OAAO,IAAI,eAAe,CAAC,OAAO,CAAC,CAAA;AACrC,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evidence class - quarantined threat evidence with ownership semantics.
|
|
3
|
+
*
|
|
4
|
+
* Phase 2 implementation.
|
|
5
|
+
*/
|
|
6
|
+
import type { Severity } from '../types/common.js';
|
|
7
|
+
import type { EvacuateRecord, EvidenceHandle, NeutralizationRecord } from '../types/evidence.js';
|
|
8
|
+
/**
|
|
9
|
+
* Evidence class implementing EvidenceHandle interface.
|
|
10
|
+
* Provides ownership-based access to quarantined threat data.
|
|
11
|
+
*/
|
|
12
|
+
export declare class Evidence implements EvidenceHandle {
|
|
13
|
+
private readonly _signature;
|
|
14
|
+
private readonly _expectedHash;
|
|
15
|
+
private readonly _severity;
|
|
16
|
+
private readonly _captured;
|
|
17
|
+
private _bytes;
|
|
18
|
+
private _disposed;
|
|
19
|
+
private readonly _compressed;
|
|
20
|
+
constructor(bytes: ArrayBuffer, _signature: string, _expectedHash: string, _severity: Severity, _captured: number, compressed?: boolean);
|
|
21
|
+
get bytes(): ArrayBuffer;
|
|
22
|
+
get size(): number;
|
|
23
|
+
get hash(): string;
|
|
24
|
+
get signature(): string;
|
|
25
|
+
get captured(): number;
|
|
26
|
+
get severity(): Severity;
|
|
27
|
+
get disposed(): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Transfer ownership of bytes.
|
|
30
|
+
* Handle becomes disposed after transfer.
|
|
31
|
+
*/
|
|
32
|
+
transfer(): ArrayBuffer;
|
|
33
|
+
/**
|
|
34
|
+
* Atomically snapshot and destroy evidence.
|
|
35
|
+
* Returns neutralization record for audit chain.
|
|
36
|
+
*
|
|
37
|
+
* @param previousHash - Last hash in audit chain
|
|
38
|
+
*/
|
|
39
|
+
neutralize(previousHash: string): NeutralizationRecord;
|
|
40
|
+
/**
|
|
41
|
+
* Move evidence to cold storage.
|
|
42
|
+
* Returns evacuation record.
|
|
43
|
+
*
|
|
44
|
+
* @param destination - Cold storage URL
|
|
45
|
+
*/
|
|
46
|
+
evacuate(destination: string): EvacuateRecord;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=evidence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence.d.ts","sourceRoot":"","sources":["../../src/core/evidence.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAElD,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAIhG;;;GAGG;AACH,qBAAa,QAAS,YAAW,cAAc;IAO3C,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAT5B,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAGnC,KAAK,EAAE,WAAW,EACD,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,QAAQ,EACnB,SAAS,EAAE,MAAM,EAClC,UAAU,GAAE,OAAe;IA2B7B,IAAI,KAAK,IAAI,WAAW,CAKvB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,IAAI,QAAQ,IAAI,QAAQ,CAEvB;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAID;;;OAGG;IACH,QAAQ,IAAI,WAAW;IAYvB;;;;;OAKG;IACH,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,oBAAoB;IAwBtD;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc;CAqB9C"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evidence class - quarantined threat evidence with ownership semantics.
|
|
3
|
+
*
|
|
4
|
+
* Phase 2 implementation.
|
|
5
|
+
*/
|
|
6
|
+
import { Errors } from '../types/errors.js';
|
|
7
|
+
import { hashBuffer } from '../utils/hash.js';
|
|
8
|
+
import { generateSecureId } from '../utils/id.js';
|
|
9
|
+
/**
|
|
10
|
+
* Evidence class implementing EvidenceHandle interface.
|
|
11
|
+
* Provides ownership-based access to quarantined threat data.
|
|
12
|
+
*/
|
|
13
|
+
export class Evidence {
|
|
14
|
+
_signature;
|
|
15
|
+
_expectedHash;
|
|
16
|
+
_severity;
|
|
17
|
+
_captured;
|
|
18
|
+
_bytes;
|
|
19
|
+
_disposed = false;
|
|
20
|
+
_compressed;
|
|
21
|
+
constructor(bytes, _signature, _expectedHash, _severity, _captured, compressed = false) {
|
|
22
|
+
this._signature = _signature;
|
|
23
|
+
this._expectedHash = _expectedHash;
|
|
24
|
+
this._severity = _severity;
|
|
25
|
+
this._captured = _captured;
|
|
26
|
+
// Validate bytes type
|
|
27
|
+
if (!(bytes instanceof ArrayBuffer)) {
|
|
28
|
+
throw Errors.invalidBytesType();
|
|
29
|
+
}
|
|
30
|
+
// Validate non-empty
|
|
31
|
+
if (bytes.byteLength === 0) {
|
|
32
|
+
throw Errors.emptyEvidence();
|
|
33
|
+
}
|
|
34
|
+
// Verify hash matches bytes ONLY for uncompressed evidence
|
|
35
|
+
// For compressed evidence, hash is of uncompressed content (per RFC)
|
|
36
|
+
if (!compressed) {
|
|
37
|
+
const actualHash = hashBuffer(bytes);
|
|
38
|
+
if (actualHash !== _expectedHash) {
|
|
39
|
+
throw Errors.hashMismatch(_expectedHash, actualHash);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
this._bytes = bytes;
|
|
43
|
+
this._compressed = compressed;
|
|
44
|
+
}
|
|
45
|
+
// ─── Getters ────────────────────────────────────────────────────────────────
|
|
46
|
+
get bytes() {
|
|
47
|
+
if (this._disposed) {
|
|
48
|
+
throw Errors.evidenceAlreadyDisposed(this._signature);
|
|
49
|
+
}
|
|
50
|
+
return this._bytes;
|
|
51
|
+
}
|
|
52
|
+
get size() {
|
|
53
|
+
return this._bytes?.byteLength ?? 0;
|
|
54
|
+
}
|
|
55
|
+
get hash() {
|
|
56
|
+
return this._expectedHash;
|
|
57
|
+
}
|
|
58
|
+
get signature() {
|
|
59
|
+
return this._signature;
|
|
60
|
+
}
|
|
61
|
+
get captured() {
|
|
62
|
+
return this._captured;
|
|
63
|
+
}
|
|
64
|
+
get severity() {
|
|
65
|
+
return this._severity;
|
|
66
|
+
}
|
|
67
|
+
get disposed() {
|
|
68
|
+
return this._disposed;
|
|
69
|
+
}
|
|
70
|
+
// ─── Operations ─────────────────────────────────────────────────────────────
|
|
71
|
+
/**
|
|
72
|
+
* Transfer ownership of bytes.
|
|
73
|
+
* Handle becomes disposed after transfer.
|
|
74
|
+
*/
|
|
75
|
+
transfer() {
|
|
76
|
+
if (this._disposed) {
|
|
77
|
+
throw Errors.evidenceAlreadyDisposed(this._signature);
|
|
78
|
+
}
|
|
79
|
+
const bytes = this._bytes;
|
|
80
|
+
this._bytes = null;
|
|
81
|
+
this._disposed = true;
|
|
82
|
+
return bytes;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Atomically snapshot and destroy evidence.
|
|
86
|
+
* Returns neutralization record for audit chain.
|
|
87
|
+
*
|
|
88
|
+
* @param previousHash - Last hash in audit chain
|
|
89
|
+
*/
|
|
90
|
+
neutralize(previousHash) {
|
|
91
|
+
if (this._disposed) {
|
|
92
|
+
throw Errors.evidenceAlreadyDisposed(this._signature);
|
|
93
|
+
}
|
|
94
|
+
// ATOMIC: Snapshot BEFORE any mutation
|
|
95
|
+
const record = {
|
|
96
|
+
id: generateSecureId(),
|
|
97
|
+
signature: this._signature,
|
|
98
|
+
hash: this._expectedHash,
|
|
99
|
+
size: this._bytes.byteLength,
|
|
100
|
+
status: 'neutralized',
|
|
101
|
+
timestamp: Date.now(),
|
|
102
|
+
previousHash,
|
|
103
|
+
};
|
|
104
|
+
// ATOMIC: Destroy immediately (no async, no gaps)
|
|
105
|
+
this._bytes = null;
|
|
106
|
+
this._disposed = true;
|
|
107
|
+
// Return snapshot
|
|
108
|
+
return record;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Move evidence to cold storage.
|
|
112
|
+
* Returns evacuation record.
|
|
113
|
+
*
|
|
114
|
+
* @param destination - Cold storage URL
|
|
115
|
+
*/
|
|
116
|
+
evacuate(destination) {
|
|
117
|
+
if (this._disposed) {
|
|
118
|
+
throw Errors.evidenceAlreadyDisposed(this._signature);
|
|
119
|
+
}
|
|
120
|
+
// ATOMIC: Snapshot BEFORE any mutation
|
|
121
|
+
const record = {
|
|
122
|
+
id: generateSecureId(),
|
|
123
|
+
signature: this._signature,
|
|
124
|
+
destination,
|
|
125
|
+
timestamp: Date.now(),
|
|
126
|
+
compressed: false, // TODO: Phase 3 compression
|
|
127
|
+
size: this._bytes.byteLength,
|
|
128
|
+
};
|
|
129
|
+
// ATOMIC: Destroy immediately
|
|
130
|
+
this._bytes = null;
|
|
131
|
+
this._disposed = true;
|
|
132
|
+
return record;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=evidence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence.js","sourceRoot":"","sources":["../../src/core/evidence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fail-Safe Panic - Threshold-triggered emergency callbacks.
|
|
3
|
+
*
|
|
4
|
+
* Provides hooks for emergency situations:
|
|
5
|
+
* - Memory threshold exceeded
|
|
6
|
+
* - Quarantine capacity critical
|
|
7
|
+
* - Error rate exceeded
|
|
8
|
+
* - Manual panic trigger
|
|
9
|
+
*
|
|
10
|
+
* DESIGN:
|
|
11
|
+
* - Panic levels: warning, critical, emergency
|
|
12
|
+
* - Each level can have multiple callbacks
|
|
13
|
+
* - Emergency triggers immediate flush and cleanup
|
|
14
|
+
* - All callbacks are non-blocking (fire-and-forget)
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Panic levels.
|
|
18
|
+
*/
|
|
19
|
+
export type PanicLevel = 'warning' | 'critical' | 'emergency';
|
|
20
|
+
/**
|
|
21
|
+
* Panic trigger reasons.
|
|
22
|
+
*/
|
|
23
|
+
export type PanicReason = 'memory_threshold' | 'quarantine_capacity' | 'error_rate' | 'process_exhaustion' | 'manual';
|
|
24
|
+
/**
|
|
25
|
+
* Panic event payload.
|
|
26
|
+
*/
|
|
27
|
+
export interface PanicEvent {
|
|
28
|
+
/** Panic level */
|
|
29
|
+
level: PanicLevel;
|
|
30
|
+
/** Trigger reason */
|
|
31
|
+
reason: PanicReason;
|
|
32
|
+
/** Event timestamp */
|
|
33
|
+
timestamp: number;
|
|
34
|
+
/** Additional context */
|
|
35
|
+
context: {
|
|
36
|
+
/** Current value that triggered panic */
|
|
37
|
+
current?: number;
|
|
38
|
+
/** Threshold that was exceeded */
|
|
39
|
+
threshold?: number;
|
|
40
|
+
/** Additional details */
|
|
41
|
+
details?: string;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Panic callback signature.
|
|
46
|
+
*/
|
|
47
|
+
export type PanicCallback = (event: PanicEvent) => void | Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Threshold configuration.
|
|
50
|
+
*/
|
|
51
|
+
export interface ThresholdConfig {
|
|
52
|
+
/** Warning threshold (0-1, percentage) */
|
|
53
|
+
warning: number;
|
|
54
|
+
/** Critical threshold (0-1, percentage) */
|
|
55
|
+
critical: number;
|
|
56
|
+
/** Emergency threshold (0-1, percentage) */
|
|
57
|
+
emergency: number;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Fail-safe configuration.
|
|
61
|
+
*/
|
|
62
|
+
export interface FailSafeConfig {
|
|
63
|
+
/** Memory usage thresholds */
|
|
64
|
+
memory: ThresholdConfig;
|
|
65
|
+
/** Quarantine capacity thresholds */
|
|
66
|
+
quarantine: ThresholdConfig;
|
|
67
|
+
/** Error rate thresholds (errors per minute) */
|
|
68
|
+
errorRate: ThresholdConfig;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Default thresholds.
|
|
72
|
+
*/
|
|
73
|
+
export declare const DEFAULT_FAIL_SAFE_CONFIG: FailSafeConfig;
|
|
74
|
+
/**
|
|
75
|
+
* Fail-Safe Panic system.
|
|
76
|
+
*/
|
|
77
|
+
export declare class FailSafe {
|
|
78
|
+
private config;
|
|
79
|
+
private callbacks;
|
|
80
|
+
private panicHistory;
|
|
81
|
+
private readonly maxHistory;
|
|
82
|
+
constructor(config?: FailSafeConfig);
|
|
83
|
+
/**
|
|
84
|
+
* Register a callback for a panic level.
|
|
85
|
+
*
|
|
86
|
+
* @param level - Panic level to listen for
|
|
87
|
+
* @param callback - Callback function
|
|
88
|
+
*/
|
|
89
|
+
on(level: PanicLevel, callback: PanicCallback): void;
|
|
90
|
+
/**
|
|
91
|
+
* Register a callback for all panic levels.
|
|
92
|
+
*
|
|
93
|
+
* @param callback - Callback function
|
|
94
|
+
*/
|
|
95
|
+
onAny(callback: PanicCallback): void;
|
|
96
|
+
/**
|
|
97
|
+
* Check memory usage and trigger panic if needed.
|
|
98
|
+
*
|
|
99
|
+
* @param usedBytes - Current memory usage
|
|
100
|
+
* @param totalBytes - Total available memory
|
|
101
|
+
*/
|
|
102
|
+
checkMemory(usedBytes: number, totalBytes: number): void;
|
|
103
|
+
/**
|
|
104
|
+
* Check quarantine capacity and trigger panic if needed.
|
|
105
|
+
*
|
|
106
|
+
* @param current - Current quarantine count
|
|
107
|
+
* @param max - Maximum quarantine capacity
|
|
108
|
+
*/
|
|
109
|
+
checkQuarantine(current: number, max: number): void;
|
|
110
|
+
/**
|
|
111
|
+
* Check error rate and trigger panic if needed.
|
|
112
|
+
*
|
|
113
|
+
* @param errorsPerMinute - Current error rate
|
|
114
|
+
*/
|
|
115
|
+
checkErrorRate(errorsPerMinute: number): void;
|
|
116
|
+
/**
|
|
117
|
+
* Manually trigger a panic.
|
|
118
|
+
*
|
|
119
|
+
* @param level - Panic level
|
|
120
|
+
* @param details - Optional details
|
|
121
|
+
*/
|
|
122
|
+
panic(level: PanicLevel, details?: string): void;
|
|
123
|
+
/**
|
|
124
|
+
* Trigger a panic event.
|
|
125
|
+
*
|
|
126
|
+
* @param event - Panic event
|
|
127
|
+
*/
|
|
128
|
+
trigger(event: PanicEvent): void;
|
|
129
|
+
/**
|
|
130
|
+
* Get panic history.
|
|
131
|
+
*/
|
|
132
|
+
get history(): readonly PanicEvent[];
|
|
133
|
+
/**
|
|
134
|
+
* Get last panic event.
|
|
135
|
+
*/
|
|
136
|
+
get lastPanic(): PanicEvent | undefined;
|
|
137
|
+
/**
|
|
138
|
+
* Determine panic level based on value and thresholds.
|
|
139
|
+
*/
|
|
140
|
+
private determineLevel;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Create a fail-safe instance.
|
|
144
|
+
*
|
|
145
|
+
* @param config - Optional configuration
|
|
146
|
+
* @returns FailSafe instance
|
|
147
|
+
*/
|
|
148
|
+
export declare function createFailSafe(config?: Partial<FailSafeConfig>): FailSafe;
|
|
149
|
+
//# sourceMappingURL=fail-safe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fail-safe.d.ts","sourceRoot":"","sources":["../../src/core/fail-safe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,WAAW,CAAA;AAE7D;;GAEG;AACH,MAAM,MAAM,WAAW,GACnB,kBAAkB,GAClB,qBAAqB,GACrB,YAAY,GACZ,oBAAoB,GACpB,QAAQ,CAAA;AAEZ;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,kBAAkB;IAClB,KAAK,EAAE,UAAU,CAAA;IACjB,qBAAqB;IACrB,MAAM,EAAE,WAAW,CAAA;IACnB,sBAAsB;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,yBAAyB;IACzB,OAAO,EAAE;QACP,yCAAyC;QACzC,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,kCAAkC;QAClC,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,yBAAyB;QACzB,OAAO,CAAC,EAAE,MAAM,CAAA;KACjB,CAAA;CACF;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;AAEvE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAA;IACf,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,CAAA;IAChB,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,8BAA8B;IAC9B,MAAM,EAAE,eAAe,CAAA;IACvB,qCAAqC;IACrC,UAAU,EAAE,eAAe,CAAA;IAC3B,gDAAgD;IAChD,SAAS,EAAE,eAAe,CAAA;CAC3B;AAED;;GAEG;AACH,eAAO,MAAM,wBAAwB,EAAE,cAgBtC,CAAA;AAMD;;GAEG;AACH,qBAAa,QAAQ;IAUP,OAAO,CAAC,MAAM;IAT1B,OAAO,CAAC,SAAS,CAIf;IAEF,OAAO,CAAC,YAAY,CAAmB;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAM;gBAEb,MAAM,GAAE,cAAyC;IAErE;;;;;OAKG;IACH,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI;IAIpD;;;;OAIG;IACH,KAAK,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAMpC;;;;;OAKG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAkBxD;;;;;OAKG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAkBnD;;;;OAIG;IACH,cAAc,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI;IAiB7C;;;;;OAKG;IACH,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAShD;;;;OAIG;IACH,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAuBhC;;OAEG;IACH,IAAI,OAAO,IAAI,SAAS,UAAU,EAAE,CAEnC;IAED;;OAEG;IACH,IAAI,SAAS,IAAI,UAAU,GAAG,SAAS,CAEtC;IAED;;OAEG;IACH,OAAO,CAAC,cAAc;CAMvB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,QAAQ,CAQzE"}
|