@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 @@
1
+ {"version":3,"file":"hound-pool.d.ts","sourceRoot":"","sources":["../../src/core/hound-pool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAE7C,OAAO,EACL,iBAAiB,EAIjB,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EAC1B,MAAM,sBAAsB,CAAA;AAM7B;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAA;IACjB,uBAAuB;IACvB,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO,CAAA;IACzC,gCAAgC;IAChC,UAAU,EAAE,MAAM,CAAA;IAClB,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAA;IACjB,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,4CAA4C;IAC5C,eAAe,EAAE,MAAM,CAAA;IACvB,8BAA8B;IAC9B,cAAc,EAAE,MAAM,CAAA;IACtB,wBAAwB;IACxB,gBAAgB,EAAE,MAAM,CAAA;IACxB,qBAAqB;IACrB,aAAa,EAAE,MAAM,CAAA;IACrB,mBAAmB;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,oCAAoC;IACpC,eAAe,EAAE,MAAM,CAAA;CACxB;AAED;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,CAAA;AAE/D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,sCAAsC;IACtC,QAAQ,EAAE,MAAM,CAAA;IAChB,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAA;IACf,sCAAsC;IACtC,gBAAgB,EAAE,MAAM,CAAA;IACxB,mDAAmD;IACnD,eAAe,CAAC,EAAE,mBAAmB,CAAA;IACrC,uDAAuD;IACvD,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,qDAAqD;IACrD,kBAAkB,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,CAAA;IACrD,mCAAmC;IACnC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,2CAA2C;IAC3C,OAAO,CAAC,EAAE,oBAAoB,CAAA;CAC/B;AAED;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAA;IAElC;;;;OAIG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IAElC;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAA;IAExC;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,GAAG,IAAI,CAAA;IAEtD;;OAEG;IACH,QAAQ,IAAI,IAAI,CAAA;CACjB;AAmBD;;;;GAIG;AACH,qBAAa,SAAU,YAAW,UAAU;IAe9B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAdnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuC;IACjE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAiB;IAC9C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA2C;IAC1E,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAe;IAC/C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAQ;IAC1C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqB;IACrD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAQ;IAGxC,OAAO,CAAC,iBAAiB,CAAI;IAC7B,OAAO,CAAC,cAAc,CAAI;IAC1B,OAAO,CAAC,YAAY,CAAI;gBAEK,MAAM,EAAE,eAAe;IAcpD;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,mBAAmB,oCAAsB;IAEzD,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAelC,OAAO,CAAC,mBAAmB;IA2C3B,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IASlC,IAAI,KAAK,IAAI,QAAQ,CAAC,cAAc,CAAC,CAmBpC;IAED,QAAQ,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,GAAG,IAAI;IAItD,QAAQ,IAAI,IAAI;IAehB,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,eAAe;IAiDvB,OAAO,CAAC,oBAAoB;IAkB5B,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,gBAAgB;IA6CxB,OAAO,CAAC,kBAAkB;IAuC1B,OAAO,CAAC,kBAAkB;IAU1B,OAAO,CAAC,UAAU;CASnB;AAMD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,UAAU,CAEnE;AAGD,OAAO,EAAE,iBAAiB,EAAE,CAAA"}
@@ -0,0 +1,337 @@
1
+ /**
2
+ * Hound Pool - Process-based isolation pool for evidence processing.
3
+ *
4
+ * RFC-0000 CRITICAL INVARIANTS:
5
+ * - activate() returns void, NOT Promise (Agent NEVER awaits)
6
+ * - OS-level process isolation (child processes, not threads)
7
+ * - Pre-spawned processes with jittered rotation
8
+ * - Timeout + SIGKILL for stuck processes
9
+ * - Binary IPC over stdio (no JSON)
10
+ *
11
+ * INVARIANT: activeProcesses <= totalProcesses
12
+ * activeProcesses reflects OS-level active child processes
13
+ */
14
+ import { decodeHoundMessage } from './hound-ipc.js';
15
+ import { createMockAdapter, createProcessAdapter, DEFAULT_CONSTRAINTS, } from './process-adapter.js';
16
+ /**
17
+ * Hound Pool implementation.
18
+ *
19
+ * Uses child process isolation per RFC-0000 amendment.
20
+ */
21
+ export class HoundPool {
22
+ config;
23
+ processes = new Map();
24
+ pendingQueue = [];
25
+ resultHandlers = [];
26
+ processingTimes = [];
27
+ adapter;
28
+ processScriptPath;
29
+ onPoolExhausted;
30
+ deferQueueLimit;
31
+ // Statistics
32
+ _totalActivations = 0;
33
+ _totalTimeouts = 0;
34
+ _totalErrors = 0;
35
+ constructor(config) {
36
+ this.config = config;
37
+ // Use provided adapter or create real one
38
+ this.adapter = config.adapter ?? createProcessAdapter();
39
+ this.processScriptPath = config.processScriptPath ?? './hound-process.js';
40
+ this.onPoolExhausted = config.onPoolExhausted ?? 'drop';
41
+ this.deferQueueLimit = config.deferQueueLimit ?? 100;
42
+ // Pre-spawn process slots (lazy spawn)
43
+ for (let i = 0; i < config.poolSize; i++) {
44
+ const state = this.createProcessState(`hound-${i}`);
45
+ this.processes.set(state.id, state);
46
+ }
47
+ }
48
+ /**
49
+ * Process constraints (declarative, best-effort).
50
+ */
51
+ static DEFAULT_CONSTRAINTS = DEFAULT_CONSTRAINTS;
52
+ activate(evidence) {
53
+ this._totalActivations++;
54
+ // Find available process
55
+ const processState = this.findAvailableProcess();
56
+ if (processState) {
57
+ this.assignToProcess(processState, evidence);
58
+ }
59
+ else {
60
+ // Pool exhausted - apply configured action
61
+ this.handlePoolExhausted(evidence);
62
+ }
63
+ // Returns immediately - no Promise
64
+ }
65
+ handlePoolExhausted(evidence) {
66
+ switch (this.onPoolExhausted) {
67
+ case 'drop':
68
+ // Silently drop - emit error result
69
+ this.emitResult({
70
+ signature: evidence.signature,
71
+ status: 'error',
72
+ durationMs: 0,
73
+ processId: 'pool',
74
+ error: 'pool_exhausted',
75
+ });
76
+ break;
77
+ case 'escalate':
78
+ // Emit error and continue
79
+ this._totalErrors++;
80
+ this.emitResult({
81
+ signature: evidence.signature,
82
+ status: 'error',
83
+ durationMs: 0,
84
+ processId: 'pool',
85
+ error: 'pool_exhausted_escalated',
86
+ });
87
+ break;
88
+ case 'defer':
89
+ // Queue for later (bounded)
90
+ if (this.pendingQueue.length < this.deferQueueLimit) {
91
+ this.pendingQueue.push(evidence);
92
+ }
93
+ else {
94
+ // Queue full - drop
95
+ this.emitResult({
96
+ signature: evidence.signature,
97
+ status: 'error',
98
+ durationMs: 0,
99
+ processId: 'pool',
100
+ error: 'defer_queue_full',
101
+ });
102
+ }
103
+ break;
104
+ }
105
+ }
106
+ terminate(signature) {
107
+ for (const [, processState] of this.processes) {
108
+ if (processState.currentSignature === signature) {
109
+ this.terminateProcess(processState, 'forced_terminate');
110
+ return;
111
+ }
112
+ }
113
+ }
114
+ get stats() {
115
+ let activeCount = 0;
116
+ for (const [, processState] of this.processes) {
117
+ if (processState.busy)
118
+ activeCount++;
119
+ }
120
+ const avgProcessingMs = this.processingTimes.length > 0
121
+ ? this.processingTimes.reduce((a, b) => a + b, 0) / this.processingTimes.length
122
+ : 0;
123
+ return Object.freeze({
124
+ activeProcesses: activeCount,
125
+ totalProcesses: this.processes.size,
126
+ totalActivations: this._totalActivations,
127
+ totalTimeouts: this._totalTimeouts,
128
+ totalErrors: this._totalErrors,
129
+ avgProcessingMs,
130
+ });
131
+ }
132
+ onResult(handler) {
133
+ this.resultHandlers.push(handler);
134
+ }
135
+ shutdown() {
136
+ for (const [, processState] of this.processes) {
137
+ if (processState.timeoutId) {
138
+ clearTimeout(processState.timeoutId);
139
+ }
140
+ if (processState.handle) {
141
+ this.adapter.kill(processState.handle);
142
+ }
143
+ }
144
+ this.processes.clear();
145
+ this.pendingQueue.length = 0;
146
+ }
147
+ // ─── Private Methods ───────────────────────────────────────────────────────
148
+ createProcessState(id) {
149
+ return {
150
+ id,
151
+ pid: null,
152
+ handle: null,
153
+ busy: false,
154
+ currentSignature: null,
155
+ startTime: null,
156
+ timeoutId: null,
157
+ };
158
+ }
159
+ findAvailableProcess() {
160
+ for (const [, processState] of this.processes) {
161
+ if (!processState.busy) {
162
+ return processState;
163
+ }
164
+ }
165
+ return null;
166
+ }
167
+ assignToProcess(processState, evidence) {
168
+ processState.busy = true;
169
+ processState.currentSignature = evidence.signature;
170
+ processState.startTime = Date.now();
171
+ // Lazy spawn if needed
172
+ if (!processState.handle) {
173
+ try {
174
+ processState.handle = this.adapter.spawn(this.processScriptPath, this.config.processConstraints);
175
+ processState.pid = processState.handle.pid;
176
+ // Set up message handler
177
+ this.adapter.onMessage(processState.handle, (payload) => {
178
+ this.handleProcessMessage(processState, payload);
179
+ });
180
+ // Set up exit handler
181
+ this.adapter.onExit(processState.handle, (code) => {
182
+ this.handleProcessExit(processState, code);
183
+ });
184
+ }
185
+ catch (err) {
186
+ // Spawn failed
187
+ this._totalErrors++;
188
+ this.emitResult({
189
+ signature: evidence.signature,
190
+ status: 'error',
191
+ durationMs: 0,
192
+ processId: processState.id,
193
+ error: err instanceof Error ? err.message : 'spawn_failed',
194
+ });
195
+ processState.busy = false;
196
+ processState.currentSignature = null;
197
+ processState.startTime = null;
198
+ return;
199
+ }
200
+ }
201
+ // Set timeout
202
+ processState.timeoutId = setTimeout(() => {
203
+ this.handleTimeout(processState);
204
+ }, this.config.timeout);
205
+ // Send evidence to process
206
+ this.adapter.send(processState.handle, evidence.bytes);
207
+ }
208
+ handleProcessMessage(processState, payload) {
209
+ try {
210
+ const message = decodeHoundMessage(payload);
211
+ if (message.type === 'status' && message.state === 'complete') {
212
+ this.completeProcessing(processState, 'processed');
213
+ }
214
+ else if (message.type === 'status' && message.state === 'error') {
215
+ this._totalErrors++;
216
+ this.terminateProcess(processState, 'error', message.error);
217
+ }
218
+ // Ignore 'processing' status - just acknowledgment
219
+ }
220
+ catch {
221
+ // Decode error - terminate
222
+ this._totalErrors++;
223
+ this.terminateProcess(processState, 'error', 'ipc_decode_error');
224
+ }
225
+ }
226
+ handleProcessExit(processState, code) {
227
+ if (processState.busy) {
228
+ // Unexpected exit while busy
229
+ this._totalErrors++;
230
+ this.terminateProcess(processState, 'error', `process_exit_${code}`);
231
+ }
232
+ // Reset handle - will respawn on next use
233
+ processState.handle = null;
234
+ processState.pid = null;
235
+ }
236
+ handleTimeout(processState) {
237
+ this._totalTimeouts++;
238
+ this.terminateProcess(processState, 'timeout');
239
+ }
240
+ terminateProcess(processState, reason, errorMessage) {
241
+ const signature = processState.currentSignature;
242
+ const startTime = processState.startTime;
243
+ // Clear timeout
244
+ if (processState.timeoutId) {
245
+ clearTimeout(processState.timeoutId);
246
+ processState.timeoutId = null;
247
+ }
248
+ // Kill process if alive
249
+ if (processState.handle) {
250
+ this.adapter.kill(processState.handle);
251
+ processState.handle = null;
252
+ processState.pid = null;
253
+ }
254
+ // Reset state
255
+ processState.busy = false;
256
+ processState.currentSignature = null;
257
+ processState.startTime = null;
258
+ // Emit result
259
+ if (signature && startTime) {
260
+ const durationMs = Date.now() - startTime;
261
+ const result = {
262
+ signature,
263
+ status: reason === 'timeout' ? 'timeout' : 'error',
264
+ durationMs,
265
+ processId: processState.id,
266
+ error: errorMessage ?? reason,
267
+ };
268
+ this.emitResult(result);
269
+ }
270
+ // Process next in queue
271
+ this.processNextInQueue();
272
+ }
273
+ completeProcessing(processState, status) {
274
+ const signature = processState.currentSignature;
275
+ const startTime = processState.startTime;
276
+ // Clear timeout
277
+ if (processState.timeoutId) {
278
+ clearTimeout(processState.timeoutId);
279
+ processState.timeoutId = null;
280
+ }
281
+ // Reset state (keep handle alive for reuse)
282
+ processState.busy = false;
283
+ processState.currentSignature = null;
284
+ processState.startTime = null;
285
+ // Emit result
286
+ if (signature && startTime) {
287
+ const durationMs = Date.now() - startTime;
288
+ this.processingTimes.push(durationMs);
289
+ // Keep only last 100 times for avg calculation
290
+ if (this.processingTimes.length > 100) {
291
+ this.processingTimes.shift();
292
+ }
293
+ const result = {
294
+ signature,
295
+ status,
296
+ durationMs,
297
+ processId: processState.id,
298
+ };
299
+ this.emitResult(result);
300
+ }
301
+ // Process next in queue
302
+ this.processNextInQueue();
303
+ }
304
+ processNextInQueue() {
305
+ if (this.pendingQueue.length === 0)
306
+ return;
307
+ const processState = this.findAvailableProcess();
308
+ if (processState) {
309
+ const evidence = this.pendingQueue.shift();
310
+ this.assignToProcess(processState, evidence);
311
+ }
312
+ }
313
+ emitResult(result) {
314
+ for (const handler of this.resultHandlers) {
315
+ try {
316
+ handler(result);
317
+ }
318
+ catch {
319
+ this._totalErrors++;
320
+ }
321
+ }
322
+ }
323
+ }
324
+ // ─────────────────────────────────────────────────────────────────────────────
325
+ // Factory
326
+ // ─────────────────────────────────────────────────────────────────────────────
327
+ /**
328
+ * Create a Hound Pool instance.
329
+ *
330
+ * @param config - Pool configuration
331
+ */
332
+ export function createHoundPool(config) {
333
+ return new HoundPool(config);
334
+ }
335
+ // Re-export for testing
336
+ export { createMockAdapter };
337
+ //# sourceMappingURL=hound-pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hound-pool.js","sourceRoot":"","sources":["../../src/core/hound-pool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Hound Process - Child process entry point.
3
+ *
4
+ * RFC-0000 REQUIREMENTS:
5
+ * - Reads binary from stdin
6
+ * - Writes status to stdout
7
+ * - No dynamic require
8
+ * - No config from parent
9
+ * - Deterministic, single-purpose
10
+ *
11
+ * This script runs in an isolated child process.
12
+ */
13
+ export {};
14
+ //# sourceMappingURL=hound-process.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hound-process.d.ts","sourceRoot":"","sources":["../../src/core/hound-process.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Hound Process - Child process entry point.
3
+ *
4
+ * RFC-0000 REQUIREMENTS:
5
+ * - Reads binary from stdin
6
+ * - Writes status to stdout
7
+ * - No dynamic require
8
+ * - No config from parent
9
+ * - Deterministic, single-purpose
10
+ *
11
+ * This script runs in an isolated child process.
12
+ */
13
+ import { createMessageParser, encodeHoundMessage } from './hound-ipc.js';
14
+ // ─────────────────────────────────────────────────────────────────────────────
15
+ // Constants
16
+ // ─────────────────────────────────────────────────────────────────────────────
17
+ /** Processing simulation delay (will be replaced with real logic) */
18
+ const PROCESSING_DELAY_MS = 10;
19
+ // ─────────────────────────────────────────────────────────────────────────────
20
+ // State
21
+ // ─────────────────────────────────────────────────────────────────────────────
22
+ const parser = createMessageParser();
23
+ let isProcessing = false;
24
+ // ─────────────────────────────────────────────────────────────────────────────
25
+ // Message Sending
26
+ // ─────────────────────────────────────────────────────────────────────────────
27
+ function sendStatus(state, errorMsg) {
28
+ const message = { type: 'status', state };
29
+ if (errorMsg) {
30
+ message.error = errorMsg;
31
+ }
32
+ const encoded = encodeHoundMessage(message);
33
+ process.stdout.write(encoded);
34
+ }
35
+ function sendMetrics(processingTime) {
36
+ const memoryUsed = process.memoryUsage().heapUsed;
37
+ const encoded = encodeHoundMessage({ type: 'metrics', processingTime, memoryUsed });
38
+ process.stdout.write(encoded);
39
+ }
40
+ // ─────────────────────────────────────────────────────────────────────────────
41
+ // Processing
42
+ // ─────────────────────────────────────────────────────────────────────────────
43
+ /**
44
+ * Process evidence payload.
45
+ *
46
+ * Current implementation: simulation.
47
+ * Future: actual evidence analysis.
48
+ *
49
+ * @param payload - Evidence bytes
50
+ */
51
+ async function processPayload(_payload) {
52
+ if (isProcessing) {
53
+ // Already processing - drop (single request at a time)
54
+ return;
55
+ }
56
+ isProcessing = true;
57
+ const startTime = Date.now();
58
+ try {
59
+ sendStatus('processing');
60
+ // Simulate processing
61
+ // TODO: Replace with actual evidence analysis
62
+ await new Promise((resolve) => setTimeout(resolve, PROCESSING_DELAY_MS));
63
+ const processingTime = Date.now() - startTime;
64
+ sendMetrics(processingTime);
65
+ sendStatus('complete');
66
+ }
67
+ catch (err) {
68
+ const message = err instanceof Error ? err.message : 'Unknown error';
69
+ sendStatus('error', message);
70
+ }
71
+ finally {
72
+ isProcessing = false;
73
+ }
74
+ }
75
+ // ─────────────────────────────────────────────────────────────────────────────
76
+ // Stdin Handler
77
+ // ─────────────────────────────────────────────────────────────────────────────
78
+ process.stdin.on('data', (chunk) => {
79
+ const messages = parser.feed(chunk);
80
+ for (const payload of messages) {
81
+ // Process each message
82
+ processPayload(payload).catch((err) => {
83
+ sendStatus('error', err instanceof Error ? err.message : 'Unknown error');
84
+ });
85
+ }
86
+ });
87
+ process.stdin.on('end', () => {
88
+ // Parent closed stdin - exit gracefully
89
+ process.exit(0);
90
+ });
91
+ process.stdin.on('error', (err) => {
92
+ sendStatus('error', `stdin error: ${err.message}`);
93
+ process.exit(1);
94
+ });
95
+ // ─────────────────────────────────────────────────────────────────────────────
96
+ // Uncaught Exception Handler
97
+ // ─────────────────────────────────────────────────────────────────────────────
98
+ process.on('uncaughtException', (err) => {
99
+ sendStatus('error', `uncaught: ${err.message}`);
100
+ process.exit(1);
101
+ });
102
+ process.on('unhandledRejection', (reason) => {
103
+ const message = reason instanceof Error ? reason.message : String(reason);
104
+ sendStatus('error', `unhandled rejection: ${message}`);
105
+ process.exit(1);
106
+ });
107
+ // ─────────────────────────────────────────────────────────────────────────────
108
+ // Ready Signal
109
+ // ─────────────────────────────────────────────────────────────────────────────
110
+ // Signal that process is ready
111
+ sendStatus('processing'); // Initial "ready" state (processing = idle, waiting)
112
+ //# sourceMappingURL=hound-process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hound-process.js","sourceRoot":"","sources":["../../src/core/hound-process.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Hound Process - Child process entry point.
3
+ *
4
+ * RFC-0000 REQUIREMENTS:
5
+ * - Reads binary from stdin
6
+ * - Writes status to stdout
7
+ * - No dynamic require
8
+ * - No config from parent
9
+ * - Deterministic, single-purpose
10
+ *
11
+ * This script runs in an isolated child process.
12
+ */
13
+ export {};
14
+ //# sourceMappingURL=hound-worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hound-worker.d.ts","sourceRoot":"","sources":["../../src/core/hound-worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Hound Process - Child process entry point.
3
+ *
4
+ * RFC-0000 REQUIREMENTS:
5
+ * - Reads binary from stdin
6
+ * - Writes status to stdout
7
+ * - No dynamic require
8
+ * - No config from parent
9
+ * - Deterministic, single-purpose
10
+ *
11
+ * This script runs in an isolated child process.
12
+ */
13
+ import { createMessageParser, encodeHoundMessage } from './hound-ipc.js';
14
+ // ─────────────────────────────────────────────────────────────────────────────
15
+ // Constants
16
+ // ─────────────────────────────────────────────────────────────────────────────
17
+ /** Processing simulation delay (will be replaced with real logic) */
18
+ const PROCESSING_DELAY_MS = 10;
19
+ // ─────────────────────────────────────────────────────────────────────────────
20
+ // State
21
+ // ─────────────────────────────────────────────────────────────────────────────
22
+ const parser = createMessageParser();
23
+ let isProcessing = false;
24
+ // ─────────────────────────────────────────────────────────────────────────────
25
+ // Message Sending
26
+ // ─────────────────────────────────────────────────────────────────────────────
27
+ function sendStatus(state, errorMsg) {
28
+ const message = { type: 'status', state };
29
+ if (errorMsg) {
30
+ message.error = errorMsg;
31
+ }
32
+ const encoded = encodeHoundMessage(message);
33
+ process.stdout.write(encoded);
34
+ }
35
+ function sendMetrics(processingTime) {
36
+ const memoryUsed = process.memoryUsage().heapUsed;
37
+ const encoded = encodeHoundMessage({ type: 'metrics', processingTime, memoryUsed });
38
+ process.stdout.write(encoded);
39
+ }
40
+ // ─────────────────────────────────────────────────────────────────────────────
41
+ // Processing
42
+ // ─────────────────────────────────────────────────────────────────────────────
43
+ /**
44
+ * Process evidence payload.
45
+ *
46
+ * Current implementation: simulation.
47
+ * Future: actual evidence analysis.
48
+ *
49
+ * @param payload - Evidence bytes
50
+ */
51
+ async function processPayload(_payload) {
52
+ if (isProcessing) {
53
+ // Already processing - drop (single request at a time)
54
+ return;
55
+ }
56
+ isProcessing = true;
57
+ const startTime = Date.now();
58
+ try {
59
+ sendStatus('processing');
60
+ // Simulate processing
61
+ // TODO: Replace with actual evidence analysis
62
+ await new Promise((resolve) => setTimeout(resolve, PROCESSING_DELAY_MS));
63
+ const processingTime = Date.now() - startTime;
64
+ sendMetrics(processingTime);
65
+ sendStatus('complete');
66
+ }
67
+ catch (err) {
68
+ const message = err instanceof Error ? err.message : 'Unknown error';
69
+ sendStatus('error', message);
70
+ }
71
+ finally {
72
+ isProcessing = false;
73
+ }
74
+ }
75
+ // ─────────────────────────────────────────────────────────────────────────────
76
+ // Stdin Handler
77
+ // ─────────────────────────────────────────────────────────────────────────────
78
+ process.stdin.on('data', (chunk) => {
79
+ const messages = parser.feed(chunk);
80
+ for (const payload of messages) {
81
+ // Process each message
82
+ processPayload(payload).catch((err) => {
83
+ sendStatus('error', err instanceof Error ? err.message : 'Unknown error');
84
+ });
85
+ }
86
+ });
87
+ process.stdin.on('end', () => {
88
+ // Parent closed stdin - exit gracefully
89
+ process.exit(0);
90
+ });
91
+ process.stdin.on('error', (err) => {
92
+ sendStatus('error', `stdin error: ${err.message}`);
93
+ process.exit(1);
94
+ });
95
+ // ─────────────────────────────────────────────────────────────────────────────
96
+ // Uncaught Exception Handler
97
+ // ─────────────────────────────────────────────────────────────────────────────
98
+ process.on('uncaughtException', (err) => {
99
+ sendStatus('error', `uncaught: ${err.message}`);
100
+ process.exit(1);
101
+ });
102
+ process.on('unhandledRejection', (reason) => {
103
+ const message = reason instanceof Error ? reason.message : String(reason);
104
+ sendStatus('error', `unhandled rejection: ${message}`);
105
+ process.exit(1);
106
+ });
107
+ // ─────────────────────────────────────────────────────────────────────────────
108
+ // Ready Signal
109
+ // ─────────────────────────────────────────────────────────────────────────────
110
+ // Signal that process is ready
111
+ sendStatus('processing'); // Initial "ready" state (processing = idle, waiting)
112
+ //# sourceMappingURL=hound-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hound-worker.js","sourceRoot":"","sources":["../../src/core/hound-worker.ts"],"names":[],"mappings":"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"}