@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.
Files changed (166) hide show
  1. package/README.md +125 -0
  2. package/dist/core/agent.d.ts +89 -0
  3. package/dist/core/agent.d.ts.map +1 -0
  4. package/dist/core/agent.js +141 -0
  5. package/dist/core/agent.js.map +1 -0
  6. package/dist/core/audit-chain.d.ts +39 -0
  7. package/dist/core/audit-chain.d.ts.map +1 -0
  8. package/dist/core/audit-chain.js +87 -0
  9. package/dist/core/audit-chain.js.map +1 -0
  10. package/dist/core/cold-storage.d.ts +87 -0
  11. package/dist/core/cold-storage.d.ts.map +1 -0
  12. package/dist/core/cold-storage.js +53 -0
  13. package/dist/core/cold-storage.js.map +1 -0
  14. package/dist/core/evidence-factory.d.ts +85 -0
  15. package/dist/core/evidence-factory.d.ts.map +1 -0
  16. package/dist/core/evidence-factory.js +96 -0
  17. package/dist/core/evidence-factory.js.map +1 -0
  18. package/dist/core/evidence.d.ts +48 -0
  19. package/dist/core/evidence.d.ts.map +1 -0
  20. package/dist/core/evidence.js +135 -0
  21. package/dist/core/evidence.js.map +1 -0
  22. package/dist/core/fail-safe.d.ts +149 -0
  23. package/dist/core/fail-safe.d.ts.map +1 -0
  24. package/dist/core/fail-safe.js +217 -0
  25. package/dist/core/fail-safe.js.map +1 -0
  26. package/dist/core/hound-ipc.d.ts +91 -0
  27. package/dist/core/hound-ipc.d.ts.map +1 -0
  28. package/dist/core/hound-ipc.js +196 -0
  29. package/dist/core/hound-ipc.js.map +1 -0
  30. package/dist/core/hound-pool.d.ts +157 -0
  31. package/dist/core/hound-pool.d.ts.map +1 -0
  32. package/dist/core/hound-pool.js +337 -0
  33. package/dist/core/hound-pool.js.map +1 -0
  34. package/dist/core/hound-process.d.ts +14 -0
  35. package/dist/core/hound-process.d.ts.map +1 -0
  36. package/dist/core/hound-process.js +112 -0
  37. package/dist/core/hound-process.js.map +1 -0
  38. package/dist/core/hound-worker.d.ts +14 -0
  39. package/dist/core/hound-worker.d.ts.map +1 -0
  40. package/dist/core/hound-worker.js +112 -0
  41. package/dist/core/hound-worker.js.map +1 -0
  42. package/dist/core/lane-queue.d.ts +121 -0
  43. package/dist/core/lane-queue.d.ts.map +1 -0
  44. package/dist/core/lane-queue.js +181 -0
  45. package/dist/core/lane-queue.js.map +1 -0
  46. package/dist/core/license-manager.d.ts +128 -0
  47. package/dist/core/license-manager.d.ts.map +1 -0
  48. package/dist/core/license-manager.js +219 -0
  49. package/dist/core/license-manager.js.map +1 -0
  50. package/dist/core/notification-emitter.d.ts +140 -0
  51. package/dist/core/notification-emitter.d.ts.map +1 -0
  52. package/dist/core/notification-emitter.js +197 -0
  53. package/dist/core/notification-emitter.js.map +1 -0
  54. package/dist/core/process-adapter.d.ts +146 -0
  55. package/dist/core/process-adapter.d.ts.map +1 -0
  56. package/dist/core/process-adapter.js +174 -0
  57. package/dist/core/process-adapter.js.map +1 -0
  58. package/dist/core/quarantine.d.ts +95 -0
  59. package/dist/core/quarantine.d.ts.map +1 -0
  60. package/dist/core/quarantine.js +221 -0
  61. package/dist/core/quarantine.js.map +1 -0
  62. package/dist/core/rate-limiter.d.ts +94 -0
  63. package/dist/core/rate-limiter.d.ts.map +1 -0
  64. package/dist/core/rate-limiter.js +156 -0
  65. package/dist/core/rate-limiter.js.map +1 -0
  66. package/dist/core/s3-cold-storage.d.ts +116 -0
  67. package/dist/core/s3-cold-storage.d.ts.map +1 -0
  68. package/dist/core/s3-cold-storage.js +198 -0
  69. package/dist/core/s3-cold-storage.js.map +1 -0
  70. package/dist/core/scheduler.d.ts +126 -0
  71. package/dist/core/scheduler.d.ts.map +1 -0
  72. package/dist/core/scheduler.js +138 -0
  73. package/dist/core/scheduler.js.map +1 -0
  74. package/dist/core/security-state.d.ts +170 -0
  75. package/dist/core/security-state.d.ts.map +1 -0
  76. package/dist/core/security-state.js +156 -0
  77. package/dist/core/security-state.js.map +1 -0
  78. package/dist/core/tier-capacity.d.ts +58 -0
  79. package/dist/core/tier-capacity.d.ts.map +1 -0
  80. package/dist/core/tier-capacity.js +89 -0
  81. package/dist/core/tier-capacity.js.map +1 -0
  82. package/dist/core/tracehound.d.ts +85 -0
  83. package/dist/core/tracehound.d.ts.map +1 -0
  84. package/dist/core/tracehound.js +90 -0
  85. package/dist/core/tracehound.js.map +1 -0
  86. package/dist/core/trust-boundary.d.ts +85 -0
  87. package/dist/core/trust-boundary.d.ts.map +1 -0
  88. package/dist/core/trust-boundary.js +71 -0
  89. package/dist/core/trust-boundary.js.map +1 -0
  90. package/dist/core/watcher.d.ts +153 -0
  91. package/dist/core/watcher.d.ts.map +1 -0
  92. package/dist/core/watcher.js +141 -0
  93. package/dist/core/watcher.js.map +1 -0
  94. package/dist/index.d.ts +53 -0
  95. package/dist/index.d.ts.map +1 -0
  96. package/dist/index.js +112 -0
  97. package/dist/index.js.map +1 -0
  98. package/dist/types/audit.d.ts +45 -0
  99. package/dist/types/audit.d.ts.map +1 -0
  100. package/dist/types/audit.js +5 -0
  101. package/dist/types/audit.js.map +1 -0
  102. package/dist/types/common.d.ts +12 -0
  103. package/dist/types/common.d.ts.map +1 -0
  104. package/dist/types/common.js +5 -0
  105. package/dist/types/common.js.map +1 -0
  106. package/dist/types/config.d.ts +98 -0
  107. package/dist/types/config.d.ts.map +1 -0
  108. package/dist/types/config.js +58 -0
  109. package/dist/types/config.js.map +1 -0
  110. package/dist/types/errors.d.ts +118 -0
  111. package/dist/types/errors.d.ts.map +1 -0
  112. package/dist/types/errors.js +266 -0
  113. package/dist/types/errors.js.map +1 -0
  114. package/dist/types/evidence.d.ts +102 -0
  115. package/dist/types/evidence.d.ts.map +1 -0
  116. package/dist/types/evidence.js +5 -0
  117. package/dist/types/evidence.js.map +1 -0
  118. package/dist/types/index.d.ts +18 -0
  119. package/dist/types/index.d.ts.map +1 -0
  120. package/dist/types/index.js +9 -0
  121. package/dist/types/index.js.map +1 -0
  122. package/dist/types/result.d.ts +62 -0
  123. package/dist/types/result.d.ts.map +1 -0
  124. package/dist/types/result.js +34 -0
  125. package/dist/types/result.js.map +1 -0
  126. package/dist/types/scent.d.ts +55 -0
  127. package/dist/types/scent.d.ts.map +1 -0
  128. package/dist/types/scent.js +5 -0
  129. package/dist/types/scent.js.map +1 -0
  130. package/dist/types/signature.d.ts +47 -0
  131. package/dist/types/signature.d.ts.map +1 -0
  132. package/dist/types/signature.js +68 -0
  133. package/dist/types/signature.js.map +1 -0
  134. package/dist/types/threat.d.ts +38 -0
  135. package/dist/types/threat.d.ts.map +1 -0
  136. package/dist/types/threat.js +18 -0
  137. package/dist/types/threat.js.map +1 -0
  138. package/dist/utils/binary-codec.d.ts +225 -0
  139. package/dist/utils/binary-codec.d.ts.map +1 -0
  140. package/dist/utils/binary-codec.js +266 -0
  141. package/dist/utils/binary-codec.js.map +1 -0
  142. package/dist/utils/compare.d.ts +26 -0
  143. package/dist/utils/compare.d.ts.map +1 -0
  144. package/dist/utils/compare.js +44 -0
  145. package/dist/utils/compare.js.map +1 -0
  146. package/dist/utils/encode.d.ts +39 -0
  147. package/dist/utils/encode.d.ts.map +1 -0
  148. package/dist/utils/encode.js +124 -0
  149. package/dist/utils/encode.js.map +1 -0
  150. package/dist/utils/hash.d.ts +19 -0
  151. package/dist/utils/hash.d.ts.map +1 -0
  152. package/dist/utils/hash.js +25 -0
  153. package/dist/utils/hash.js.map +1 -0
  154. package/dist/utils/id.d.ts +20 -0
  155. package/dist/utils/id.d.ts.map +1 -0
  156. package/dist/utils/id.js +47 -0
  157. package/dist/utils/id.js.map +1 -0
  158. package/dist/utils/runtime.d.ts +24 -0
  159. package/dist/utils/runtime.d.ts.map +1 -0
  160. package/dist/utils/runtime.js +68 -0
  161. package/dist/utils/runtime.js.map +1 -0
  162. package/dist/utils/serialize.d.ts +14 -0
  163. package/dist/utils/serialize.d.ts.map +1 -0
  164. package/dist/utils/serialize.js +27 -0
  165. package/dist/utils/serialize.js.map +1 -0
  166. 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"}