@tracehound/core 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +125 -0
- package/dist/core/agent.d.ts +89 -0
- package/dist/core/agent.d.ts.map +1 -0
- package/dist/core/agent.js +141 -0
- package/dist/core/agent.js.map +1 -0
- package/dist/core/audit-chain.d.ts +39 -0
- package/dist/core/audit-chain.d.ts.map +1 -0
- package/dist/core/audit-chain.js +87 -0
- package/dist/core/audit-chain.js.map +1 -0
- package/dist/core/cold-storage.d.ts +87 -0
- package/dist/core/cold-storage.d.ts.map +1 -0
- package/dist/core/cold-storage.js +53 -0
- package/dist/core/cold-storage.js.map +1 -0
- package/dist/core/evidence-factory.d.ts +85 -0
- package/dist/core/evidence-factory.d.ts.map +1 -0
- package/dist/core/evidence-factory.js +96 -0
- package/dist/core/evidence-factory.js.map +1 -0
- package/dist/core/evidence.d.ts +48 -0
- package/dist/core/evidence.d.ts.map +1 -0
- package/dist/core/evidence.js +135 -0
- package/dist/core/evidence.js.map +1 -0
- package/dist/core/fail-safe.d.ts +149 -0
- package/dist/core/fail-safe.d.ts.map +1 -0
- package/dist/core/fail-safe.js +217 -0
- package/dist/core/fail-safe.js.map +1 -0
- package/dist/core/hound-ipc.d.ts +91 -0
- package/dist/core/hound-ipc.d.ts.map +1 -0
- package/dist/core/hound-ipc.js +196 -0
- package/dist/core/hound-ipc.js.map +1 -0
- package/dist/core/hound-pool.d.ts +157 -0
- package/dist/core/hound-pool.d.ts.map +1 -0
- package/dist/core/hound-pool.js +337 -0
- package/dist/core/hound-pool.js.map +1 -0
- package/dist/core/hound-process.d.ts +14 -0
- package/dist/core/hound-process.d.ts.map +1 -0
- package/dist/core/hound-process.js +112 -0
- package/dist/core/hound-process.js.map +1 -0
- package/dist/core/hound-worker.d.ts +14 -0
- package/dist/core/hound-worker.d.ts.map +1 -0
- package/dist/core/hound-worker.js +112 -0
- package/dist/core/hound-worker.js.map +1 -0
- package/dist/core/lane-queue.d.ts +121 -0
- package/dist/core/lane-queue.d.ts.map +1 -0
- package/dist/core/lane-queue.js +181 -0
- package/dist/core/lane-queue.js.map +1 -0
- package/dist/core/license-manager.d.ts +128 -0
- package/dist/core/license-manager.d.ts.map +1 -0
- package/dist/core/license-manager.js +219 -0
- package/dist/core/license-manager.js.map +1 -0
- package/dist/core/notification-emitter.d.ts +140 -0
- package/dist/core/notification-emitter.d.ts.map +1 -0
- package/dist/core/notification-emitter.js +197 -0
- package/dist/core/notification-emitter.js.map +1 -0
- package/dist/core/process-adapter.d.ts +146 -0
- package/dist/core/process-adapter.d.ts.map +1 -0
- package/dist/core/process-adapter.js +174 -0
- package/dist/core/process-adapter.js.map +1 -0
- package/dist/core/quarantine.d.ts +95 -0
- package/dist/core/quarantine.d.ts.map +1 -0
- package/dist/core/quarantine.js +221 -0
- package/dist/core/quarantine.js.map +1 -0
- package/dist/core/rate-limiter.d.ts +94 -0
- package/dist/core/rate-limiter.d.ts.map +1 -0
- package/dist/core/rate-limiter.js +156 -0
- package/dist/core/rate-limiter.js.map +1 -0
- package/dist/core/s3-cold-storage.d.ts +116 -0
- package/dist/core/s3-cold-storage.d.ts.map +1 -0
- package/dist/core/s3-cold-storage.js +198 -0
- package/dist/core/s3-cold-storage.js.map +1 -0
- package/dist/core/scheduler.d.ts +126 -0
- package/dist/core/scheduler.d.ts.map +1 -0
- package/dist/core/scheduler.js +138 -0
- package/dist/core/scheduler.js.map +1 -0
- package/dist/core/security-state.d.ts +170 -0
- package/dist/core/security-state.d.ts.map +1 -0
- package/dist/core/security-state.js +156 -0
- package/dist/core/security-state.js.map +1 -0
- package/dist/core/tier-capacity.d.ts +58 -0
- package/dist/core/tier-capacity.d.ts.map +1 -0
- package/dist/core/tier-capacity.js +89 -0
- package/dist/core/tier-capacity.js.map +1 -0
- package/dist/core/tracehound.d.ts +85 -0
- package/dist/core/tracehound.d.ts.map +1 -0
- package/dist/core/tracehound.js +90 -0
- package/dist/core/tracehound.js.map +1 -0
- package/dist/core/trust-boundary.d.ts +85 -0
- package/dist/core/trust-boundary.d.ts.map +1 -0
- package/dist/core/trust-boundary.js +71 -0
- package/dist/core/trust-boundary.js.map +1 -0
- package/dist/core/watcher.d.ts +153 -0
- package/dist/core/watcher.d.ts.map +1 -0
- package/dist/core/watcher.js +141 -0
- package/dist/core/watcher.js.map +1 -0
- package/dist/index.d.ts +53 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +112 -0
- package/dist/index.js.map +1 -0
- package/dist/types/audit.d.ts +45 -0
- package/dist/types/audit.d.ts.map +1 -0
- package/dist/types/audit.js +5 -0
- package/dist/types/audit.js.map +1 -0
- package/dist/types/common.d.ts +12 -0
- package/dist/types/common.d.ts.map +1 -0
- package/dist/types/common.js +5 -0
- package/dist/types/common.js.map +1 -0
- package/dist/types/config.d.ts +98 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +58 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/errors.d.ts +118 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +266 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/evidence.d.ts +102 -0
- package/dist/types/evidence.d.ts.map +1 -0
- package/dist/types/evidence.js +5 -0
- package/dist/types/evidence.js.map +1 -0
- package/dist/types/index.d.ts +18 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +9 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/result.d.ts +62 -0
- package/dist/types/result.d.ts.map +1 -0
- package/dist/types/result.js +34 -0
- package/dist/types/result.js.map +1 -0
- package/dist/types/scent.d.ts +55 -0
- package/dist/types/scent.d.ts.map +1 -0
- package/dist/types/scent.js +5 -0
- package/dist/types/scent.js.map +1 -0
- package/dist/types/signature.d.ts +47 -0
- package/dist/types/signature.d.ts.map +1 -0
- package/dist/types/signature.js +68 -0
- package/dist/types/signature.js.map +1 -0
- package/dist/types/threat.d.ts +38 -0
- package/dist/types/threat.d.ts.map +1 -0
- package/dist/types/threat.js +18 -0
- package/dist/types/threat.js.map +1 -0
- package/dist/utils/binary-codec.d.ts +225 -0
- package/dist/utils/binary-codec.d.ts.map +1 -0
- package/dist/utils/binary-codec.js +266 -0
- package/dist/utils/binary-codec.js.map +1 -0
- package/dist/utils/compare.d.ts +26 -0
- package/dist/utils/compare.d.ts.map +1 -0
- package/dist/utils/compare.js +44 -0
- package/dist/utils/compare.js.map +1 -0
- package/dist/utils/encode.d.ts +39 -0
- package/dist/utils/encode.d.ts.map +1 -0
- package/dist/utils/encode.js +124 -0
- package/dist/utils/encode.js.map +1 -0
- package/dist/utils/hash.d.ts +19 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +25 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/id.d.ts +20 -0
- package/dist/utils/id.d.ts.map +1 -0
- package/dist/utils/id.js +47 -0
- package/dist/utils/id.js.map +1 -0
- package/dist/utils/runtime.d.ts +24 -0
- package/dist/utils/runtime.d.ts.map +1 -0
- package/dist/utils/runtime.js +68 -0
- package/dist/utils/runtime.js.map +1 -0
- package/dist/utils/serialize.d.ts +14 -0
- package/dist/utils/serialize.d.ts.map +1 -0
- package/dist/utils/serialize.js +27 -0
- package/dist/utils/serialize.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hound-pool.d.ts","sourceRoot":"","sources":["../../src/core/hound-pool.ts"],"names":[],"mappings":"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"}
|
|
@@ -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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"}
|