wolverine-ai 3.9.1 → 3.9.2

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 (2) hide show
  1. package/package.json +1 -1
  2. package/src/core/runner.js +11 -5
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wolverine-ai",
3
- "version": "3.9.1",
3
+ "version": "3.9.2",
4
4
  "description": "Self-healing Node.js server framework powered by AI. Catches crashes, diagnoses errors, generates fixes, verifies, and restarts — automatically.",
5
5
  "main": "src/index.js",
6
6
  "bin": {
@@ -289,14 +289,17 @@ class WolverineRunner {
289
289
  if (this.child) {
290
290
  const oldChild = this.child;
291
291
  this.child = null;
292
+ let spawned = false;
292
293
 
293
294
  // Wait for old process to actually exit before spawning new one
294
295
  const onExit = () => {
296
+ if (spawned) return; // Prevent double-spawn from exit + force-kill timeout
297
+ spawned = true;
295
298
  // Give port time to fully release (TIME_WAIT)
296
299
  setTimeout(() => {
297
300
  this._ensurePortFree();
298
- setTimeout(() => this._spawn(), 200);
299
- }, 300);
301
+ setTimeout(() => this._spawn(), 500);
302
+ }, 500);
300
303
  };
301
304
 
302
305
  oldChild.removeAllListeners("exit");
@@ -305,8 +308,10 @@ class WolverineRunner {
305
308
 
306
309
  // Force kill if it doesn't exit in 3s
307
310
  setTimeout(() => {
308
- this._killProcessTree(oldChild.pid, "SIGKILL");
309
- onExit();
311
+ if (!spawned) {
312
+ this._killProcessTree(oldChild.pid, "SIGKILL");
313
+ onExit();
314
+ }
310
315
  }, 3000);
311
316
  } else {
312
317
  this._ensurePortFree();
@@ -579,7 +584,8 @@ class WolverineRunner {
579
584
  this._healStatus = null;
580
585
  // Clear pending errors — the heal fixed the root cause, stale errors are irrelevant
581
586
  this._pendingErrorHeal = null;
582
- this._spawn();
587
+ // Use restart() to properly kill old child before spawning — prevents EADDRINUSE
588
+ this.restart();
583
589
  } else {
584
590
  console.log(chalk.red(`\n🐺 Wolverine could not heal: ${result.explanation}`));
585
591