();
constructor() {
@@ -115,8 +115,8 @@ export class SubagentWatcher extends EventEmitter {
* Start watching for subagent activity
*/
start(): void {
- if (this.isRunning) return;
- this.isRunning = true;
+ if (this._isRunning) return;
+ this._isRunning = true;
// Initial scan
this.scanForSubagents();
@@ -177,11 +177,18 @@ export class SubagentWatcher extends EventEmitter {
return false;
}
+ /**
+ * Check if the watcher is currently running
+ */
+ isRunning(): boolean {
+ return this._isRunning;
+ }
+
/**
* Stop watching
*/
stop(): void {
- this.isRunning = false;
+ this._isRunning = false;
if (this.pollInterval) {
clearInterval(this.pollInterval);
diff --git a/src/web/public/app.js b/src/web/public/app.js
index 6118373b..8617acd1 100644
--- a/src/web/public/app.js
+++ b/src/web/public/app.js
@@ -2964,6 +2964,7 @@ class ClaudemanApp {
document.getElementById('appSettingsShowSystemStats').checked = settings.showSystemStats ?? true;
document.getElementById('appSettingsShowTokenCount').checked = settings.showTokenCount ?? true;
document.getElementById('appSettingsShowMonitor').checked = settings.showMonitor ?? true;
+ document.getElementById('appSettingsSubagentTracking').checked = settings.subagentTrackingEnabled ?? true;
// Claude CLI settings
const claudeModeSelect = document.getElementById('appSettingsClaudeMode');
const allowedToolsRow = document.getElementById('allowedToolsRow');
@@ -3023,6 +3024,7 @@ class ClaudemanApp {
showSystemStats: document.getElementById('appSettingsShowSystemStats').checked,
showTokenCount: document.getElementById('appSettingsShowTokenCount').checked,
showMonitor: document.getElementById('appSettingsShowMonitor').checked,
+ subagentTrackingEnabled: document.getElementById('appSettingsSubagentTracking').checked,
// Claude CLI settings
claudeMode: document.getElementById('appSettingsClaudeMode').value,
allowedTools: document.getElementById('appSettingsAllowedTools').value.trim(),
diff --git a/src/web/public/index.html b/src/web/public/index.html
index 6be125d4..5bd3156a 100644
--- a/src/web/public/index.html
+++ b/src/web/public/index.html
@@ -536,6 +536,22 @@
Show Monitor panel at bottom right
+
+
+
+ Monitor Claude Code background agents in real-time
+
+
+
+
+ Show the Subagents panel (independent from Monitor)
+
diff --git a/src/web/server.ts b/src/web/server.ts
index 43595e4f..5e3ea1af 100644
--- a/src/web/server.ts
+++ b/src/web/server.ts
@@ -1454,6 +1454,17 @@ export class WebServer extends EventEmitter {
mkdirSync(dir, { recursive: true });
}
writeFileSync(settingsPath, JSON.stringify(settings, null, 2));
+
+ // Handle subagent tracking toggle dynamically
+ const subagentEnabled = settings.subagentTrackingEnabled ?? true;
+ if (subagentEnabled && !subagentWatcher.isRunning()) {
+ subagentWatcher.start();
+ console.log('Subagent watcher started via settings change');
+ } else if (!subagentEnabled && subagentWatcher.isRunning()) {
+ subagentWatcher.stop();
+ console.log('Subagent watcher stopped via settings change');
+ }
+
return { success: true };
} catch (err) {
return createErrorResponse(ApiErrorCode.OPERATION_FAILED, getErrorMessage(err));
@@ -2627,9 +2638,31 @@ export class WebServer extends EventEmitter {
// Restore screen sessions from previous run
await this.restoreScreenSessions();
- // Start subagent watcher for Claude Code background agent visibility
- subagentWatcher.start();
- console.log('Subagent watcher started - monitoring ~/.claude/projects for background agent activity');
+ // Start subagent watcher for Claude Code background agent visibility (if enabled)
+ if (this.isSubagentTrackingEnabled()) {
+ subagentWatcher.start();
+ console.log('Subagent watcher started - monitoring ~/.claude/projects for background agent activity');
+ } else {
+ console.log('Subagent watcher disabled by user settings');
+ }
+ }
+
+ /**
+ * Check if subagent tracking is enabled in settings (default: true)
+ */
+ private isSubagentTrackingEnabled(): boolean {
+ const settingsPath = join(homedir(), '.claudeman', 'settings.json');
+ try {
+ if (existsSync(settingsPath)) {
+ const content = readFileSync(settingsPath, 'utf-8');
+ const settings = JSON.parse(content);
+ // Default to true if not explicitly set
+ return settings.subagentTrackingEnabled ?? true;
+ }
+ } catch (err) {
+ console.error('Failed to read subagent tracking setting:', err);
+ }
+ return true; // Default enabled
}
private async restoreScreenSessions(): Promise {