fix: respawn disabled state not persisted across server restarts

When /respawn/stop was called, the controller was stopped but remained
in the respawnControllers map. This caused persistSessionState() to
still read config.enabled=true and save respawnEnabled=true to state.json.

On server restart, the respawn controller would be re-enabled because
state.json had respawnEnabled=true.

Fix: Remove controller from map and clear any timed respawn when
/respawn/stop is called, so persistSessionState() correctly sets
respawnEnabled=false.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
arkon
2026-01-25 08:01:57 +01:00
co-authored by Claude Opus 4.5
parent 044021953a
commit 3455b27f6f
3 changed files with 12 additions and 2 deletions
+1 -1
View File
@@ -17,7 +17,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
Claudeman is a Claude Code session manager with a web interface and autonomous Ralph Loop. It spawns Claude CLI processes via PTY, streams output in real-time via SSE, and supports scheduled/timed runs.
**Version**: 0.1347
**Version**: 0.1348
**Tech Stack**: TypeScript (ES2022/NodeNext, strict mode), Node.js, Fastify, Server-Sent Events, node-pty
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "claudeman",
"version": "0.1347",
"version": "0.1348",
"description": "The missing control plane for Claude Code - run 20 autonomous agents with real-time monitoring and session persistence",
"type": "module",
"main": "dist/index.js",
+10
View File
@@ -790,6 +790,16 @@ export class WebServer extends EventEmitter {
controller.stop();
// Remove controller from map so persistSessionState doesn't save respawnEnabled: true
this.respawnControllers.delete(id);
// Clear any timed respawn
const timerInfo = this.respawnTimers.get(id);
if (timerInfo) {
clearTimeout(timerInfo.timer);
this.respawnTimers.delete(id);
}
// Clear persisted respawn config
this.screenManager.clearRespawnConfig(id);