crewly 1.0.0 → 1.0.1
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/config/constants.ts +40 -2
- package/config/skills/_common/lib.sh +2 -1
- package/config/skills/agent/computer-use/execute.sh +151 -0
- package/config/skills/agent/computer-use/instructions.md +60 -0
- package/config/skills/agent/computer-use/skill.json +22 -0
- package/config/skills/agent/heartbeat/execute.sh +22 -0
- package/config/skills/agent/heartbeat/instructions.md +23 -0
- package/config/skills/agent/heartbeat/skill.json +20 -0
- package/config/skills/orchestrator/schedule-check/execute.sh +1 -1
- package/config/skills/orchestrator/send-pdf-to-slack/execute.sh +28 -5
- package/config/skills/orchestrator/send-pdf-to-slack/instructions.md +49 -10
- package/config/skills/orchestrator/send-pdf-to-slack/skill.json +1 -1
- package/config/skills/orchestrator/subscribe-event/execute.sh +2 -2
- package/dist/backend/backend/src/constants.d.ts +24 -2
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +13 -3
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/session/session.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/session/session.controller.js +16 -7
- package/dist/backend/backend/src/controllers/session/session.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.js +27 -0
- package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts +7 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +131 -0
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/middleware/agent-heartbeat.middleware.d.ts +3 -2
- package/dist/backend/backend/src/middleware/agent-heartbeat.middleware.d.ts.map +1 -1
- package/dist/backend/backend/src/middleware/agent-heartbeat.middleware.js +8 -2
- package/dist/backend/backend/src/middleware/agent-heartbeat.middleware.js.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-heartbeat-monitor.service.d.ts +185 -0
- package/dist/backend/backend/src/services/agent/agent-heartbeat-monitor.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/agent-heartbeat-monitor.service.js +508 -0
- package/dist/backend/backend/src/services/agent/agent-heartbeat-monitor.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/agent-heartbeat.service.d.ts +5 -5
- package/dist/backend/backend/src/services/agent/agent-heartbeat.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-heartbeat.service.js +3 -3
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.js +36 -13
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/disk-cleanup.service.d.ts +24 -3
- package/dist/backend/backend/src/services/agent/disk-cleanup.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/disk-cleanup.service.js +15 -3
- package/dist/backend/backend/src/services/agent/disk-cleanup.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/idle-detection.service.js +18 -0
- package/dist/backend/backend/src/services/agent/idle-detection.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/pty-activity-tracker.service.d.ts +7 -2
- package/dist/backend/backend/src/services/agent/pty-activity-tracker.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/pty-activity-tracker.service.js +11 -3
- package/dist/backend/backend/src/services/agent/pty-activity-tracker.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts +42 -0
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js +190 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/tmux.service.js +2 -2
- package/dist/backend/backend/src/services/agent/tmux.service.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js +13 -19
- package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.d.ts +129 -0
- package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.js +253 -0
- package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.js.map +1 -0
- package/dist/backend/backend/src/services/session/pty/pty-session-backend.d.ts.map +1 -1
- package/dist/backend/backend/src/services/session/pty/pty-session-backend.js +5 -1
- package/dist/backend/backend/src/services/session/pty/pty-session-backend.js.map +1 -1
- package/dist/backend/backend/src/services/session/session-state-persistence.d.ts +4 -1
- package/dist/backend/backend/src/services/session/session-state-persistence.d.ts.map +1 -1
- package/dist/backend/backend/src/services/session/session-state-persistence.js +3 -1
- package/dist/backend/backend/src/services/session/session-state-persistence.js.map +1 -1
- package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts +1 -0
- package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/workflow/scheduler.service.js +1 -0
- package/dist/backend/backend/src/services/workflow/scheduler.service.js.map +1 -1
- package/dist/backend/backend/src/types/index.d.ts +2 -0
- package/dist/backend/backend/src/types/index.d.ts.map +1 -1
- package/dist/backend/backend/src/types/index.js.map +1 -1
- package/dist/backend/backend/src/types/scheduler.types.d.ts +17 -0
- package/dist/backend/backend/src/types/scheduler.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/scheduler.types.js.map +1 -1
- package/dist/backend/config/constants.d.ts +36 -2
- package/dist/backend/config/constants.d.ts.map +1 -1
- package/dist/backend/config/constants.js +37 -2
- package/dist/backend/config/constants.js.map +1 -1
- package/dist/backend/config/index.d.ts +1 -1
- package/dist/cli/cli/src/constants.d.ts +1 -1
- package/dist/cli/cli/src/index.js +1 -1
- package/dist/cli/cli/src/index.js.map +1 -1
- package/dist/cli/config/constants.d.ts +36 -2
- package/dist/cli/config/constants.d.ts.map +1 -1
- package/dist/cli/config/constants.js +37 -2
- package/dist/cli/config/constants.js.map +1 -1
- package/dist/cli/config/index.d.ts +1 -1
- package/frontend/dist/assets/{index-77b6a2a0.js → index-4c56763b.js} +31 -31
- package/frontend/dist/assets/{index-5ddf71c8.css → index-c1dd0b10.css} +1 -1
- package/frontend/dist/index.html +2 -2
- package/package.json +8 -4
- package/config/constants.test.ts +0 -469
- package/config/quality-gates/default-gates.test.ts +0 -246
- package/config/skills/agent/nano-banana-image/.env +0 -2
- package/config/skills/agent/nano-banana-image/.env.example +0 -6
- package/config/skills/nano-banana-image/.env +0 -2
- package/config/skills/nano-banana-image/.env.example +0 -6
|
@@ -0,0 +1,508 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Heartbeat Monitor Service
|
|
3
|
+
*
|
|
4
|
+
* Monitors all non-orchestrator agents for responsiveness using a
|
|
5
|
+
* non-intrusive, server-side approach:
|
|
6
|
+
*
|
|
7
|
+
* 1. Dual idle detection: Checks BOTH PTY activity (via PtyActivityTrackerService)
|
|
8
|
+
* AND API activity (via AgentHeartbeatService lastActiveTime). An agent is only
|
|
9
|
+
* considered truly idle when both signals are stale.
|
|
10
|
+
*
|
|
11
|
+
* 2. Process liveness check: Instead of injecting heartbeat requests into the
|
|
12
|
+
* agent's PTY input (which corrupts the input buffer and conflicts with
|
|
13
|
+
* orchestrator task delivery), this service checks isChildProcessAlive()
|
|
14
|
+
* on the session backend to determine if the agent process is still running.
|
|
15
|
+
*
|
|
16
|
+
* 3. Progressive restart: After MAX_DEAD_CHECKS_BEFORE_RESTART consecutive
|
|
17
|
+
* checks finding the process dead, triggers agent restart with session ID
|
|
18
|
+
* preservation and task re-delivery.
|
|
19
|
+
*
|
|
20
|
+
* Interaction with other services:
|
|
21
|
+
* - IdleDetectionService (configurable timeout): Suspends idle but responsive agents
|
|
22
|
+
* - AgentHeartbeatMonitorService: Restarts crashed/unresponsive agents
|
|
23
|
+
* - RuntimeExitMonitorService: Detects exit patterns in PTY output (complementary)
|
|
24
|
+
*
|
|
25
|
+
* Key design principle: NEVER write to an agent's PTY input. All checks are
|
|
26
|
+
* performed server-side via process inspection and API activity timestamps.
|
|
27
|
+
*
|
|
28
|
+
* @module agent-heartbeat-monitor.service
|
|
29
|
+
*/
|
|
30
|
+
import * as fs from 'fs/promises';
|
|
31
|
+
import { LoggerService } from '../core/logger.service.js';
|
|
32
|
+
import { AGENT_HEARTBEAT_MONITOR_CONSTANTS, AGENT_SUSPEND_CONSTANTS, ORCHESTRATOR_ROLE } from '../../constants.js';
|
|
33
|
+
import { PtyActivityTrackerService } from './pty-activity-tracker.service.js';
|
|
34
|
+
import { AgentHeartbeatService } from './agent-heartbeat.service.js';
|
|
35
|
+
import { AgentSuspendService } from './agent-suspend.service.js';
|
|
36
|
+
import { RuntimeExitMonitorService } from './runtime-exit-monitor.service.js';
|
|
37
|
+
import { getSessionStatePersistence } from '../session/session-state-persistence.js';
|
|
38
|
+
import { getTerminalGateway } from '../../websocket/terminal.gateway.js';
|
|
39
|
+
/**
|
|
40
|
+
* Number of consecutive dead-process checks before triggering a restart.
|
|
41
|
+
* This prevents premature restarts from transient pgrep failures.
|
|
42
|
+
*/
|
|
43
|
+
const MAX_DEAD_CHECKS_BEFORE_RESTART = 3;
|
|
44
|
+
/**
|
|
45
|
+
* Monitors all non-orchestrator agents for responsiveness.
|
|
46
|
+
*
|
|
47
|
+
* Uses dual-signal idle detection (PTY activity + API heartbeat) and
|
|
48
|
+
* server-side process liveness checks to detect crashed agents without
|
|
49
|
+
* injecting into the agent's PTY input buffer.
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```typescript
|
|
53
|
+
* const monitor = AgentHeartbeatMonitorService.getInstance();
|
|
54
|
+
* monitor.setDependencies(sessionBackend, agentRegistrationService, storageService, taskTrackingService);
|
|
55
|
+
* monitor.start();
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export class AgentHeartbeatMonitorService {
|
|
59
|
+
static instance = null;
|
|
60
|
+
logger;
|
|
61
|
+
/** Interval timer handle */
|
|
62
|
+
checkTimer = null;
|
|
63
|
+
/** When monitoring started */
|
|
64
|
+
startedAt = null;
|
|
65
|
+
/** Per-agent monitoring state */
|
|
66
|
+
agentStates = new Map();
|
|
67
|
+
/** Dependencies (injected via setDependencies) */
|
|
68
|
+
sessionBackend = null;
|
|
69
|
+
agentRegistrationService = null;
|
|
70
|
+
storageService = null;
|
|
71
|
+
taskTrackingService = null;
|
|
72
|
+
constructor() {
|
|
73
|
+
this.logger = LoggerService.getInstance().createComponentLogger('AgentHeartbeatMonitor');
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Get the singleton instance.
|
|
77
|
+
*
|
|
78
|
+
* @returns The AgentHeartbeatMonitorService singleton
|
|
79
|
+
*/
|
|
80
|
+
static getInstance() {
|
|
81
|
+
if (!AgentHeartbeatMonitorService.instance) {
|
|
82
|
+
AgentHeartbeatMonitorService.instance = new AgentHeartbeatMonitorService();
|
|
83
|
+
}
|
|
84
|
+
return AgentHeartbeatMonitorService.instance;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Reset the singleton (for testing).
|
|
88
|
+
*/
|
|
89
|
+
static resetInstance() {
|
|
90
|
+
if (AgentHeartbeatMonitorService.instance) {
|
|
91
|
+
AgentHeartbeatMonitorService.instance.stop();
|
|
92
|
+
}
|
|
93
|
+
AgentHeartbeatMonitorService.instance = null;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Inject required dependencies.
|
|
97
|
+
*
|
|
98
|
+
* @param sessionBackend - Session backend for accessing agent PTY sessions
|
|
99
|
+
* @param agentRegistrationService - For recreating agent sessions on restart
|
|
100
|
+
* @param storageService - For querying teams and agent statuses
|
|
101
|
+
* @param taskTrackingService - For querying in-progress tasks for re-delivery
|
|
102
|
+
*/
|
|
103
|
+
setDependencies(sessionBackend, agentRegistrationService, storageService, taskTrackingService) {
|
|
104
|
+
this.sessionBackend = sessionBackend;
|
|
105
|
+
this.agentRegistrationService = agentRegistrationService;
|
|
106
|
+
this.storageService = storageService;
|
|
107
|
+
this.taskTrackingService = taskTrackingService;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Start the heartbeat monitoring loop.
|
|
111
|
+
* Applies a startup grace period before the first check.
|
|
112
|
+
*/
|
|
113
|
+
start() {
|
|
114
|
+
if (this.checkTimer) {
|
|
115
|
+
this.logger.warn('Agent heartbeat monitor already running');
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
this.startedAt = Date.now();
|
|
119
|
+
this.agentStates.clear();
|
|
120
|
+
this.logger.info('Starting agent heartbeat monitor', {
|
|
121
|
+
checkIntervalMs: AGENT_HEARTBEAT_MONITOR_CONSTANTS.CHECK_INTERVAL_MS,
|
|
122
|
+
heartbeatRequestThresholdMs: AGENT_HEARTBEAT_MONITOR_CONSTANTS.HEARTBEAT_REQUEST_THRESHOLD_MS,
|
|
123
|
+
startupGracePeriodMs: AGENT_HEARTBEAT_MONITOR_CONSTANTS.STARTUP_GRACE_PERIOD_MS,
|
|
124
|
+
maxDeadChecksBeforeRestart: MAX_DEAD_CHECKS_BEFORE_RESTART,
|
|
125
|
+
});
|
|
126
|
+
this.checkTimer = setInterval(() => {
|
|
127
|
+
this.performCheck().catch((err) => {
|
|
128
|
+
this.logger.error('Agent heartbeat check failed', {
|
|
129
|
+
error: err instanceof Error ? err.message : String(err),
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
}, AGENT_HEARTBEAT_MONITOR_CONSTANTS.CHECK_INTERVAL_MS);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Stop the heartbeat monitoring loop.
|
|
136
|
+
*/
|
|
137
|
+
stop() {
|
|
138
|
+
if (this.checkTimer) {
|
|
139
|
+
clearInterval(this.checkTimer);
|
|
140
|
+
this.checkTimer = null;
|
|
141
|
+
this.logger.info('Agent heartbeat monitor stopped');
|
|
142
|
+
}
|
|
143
|
+
this.agentStates.clear();
|
|
144
|
+
this.startedAt = null;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Check if the monitor is currently running.
|
|
148
|
+
*
|
|
149
|
+
* @returns True if the check loop is active
|
|
150
|
+
*/
|
|
151
|
+
isRunning() {
|
|
152
|
+
return this.checkTimer !== null;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Get monitoring state for all tracked agents.
|
|
156
|
+
*
|
|
157
|
+
* @returns Map of session name to agent monitor state
|
|
158
|
+
*/
|
|
159
|
+
getAgentStates() {
|
|
160
|
+
return new Map(this.agentStates);
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Perform a single heartbeat check cycle across all active agents.
|
|
164
|
+
*
|
|
165
|
+
* For each active non-orchestrator agent:
|
|
166
|
+
* 1. Skip if within startup grace period
|
|
167
|
+
* 2. Skip if session doesn't exist, or agent is suspended/rehydrating
|
|
168
|
+
* 3. Check dual idle signals (PTY + API). If either is recent → agent is alive → reset dead checks
|
|
169
|
+
* 4. If truly idle (both PTY and API stale for threshold), check process liveness
|
|
170
|
+
* 5. If process is alive → agent is idle but responsive → reset dead checks (let IdleDetectionService handle)
|
|
171
|
+
* 6. If process is dead → increment consecutiveDeadChecks
|
|
172
|
+
* 7. After MAX_DEAD_CHECKS_BEFORE_RESTART consecutive dead checks → restart agent
|
|
173
|
+
*/
|
|
174
|
+
async performCheck() {
|
|
175
|
+
// Guard: startup grace period
|
|
176
|
+
if (this.startedAt && (Date.now() - this.startedAt) < AGENT_HEARTBEAT_MONITOR_CONSTANTS.STARTUP_GRACE_PERIOD_MS) {
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
// Guard: dependencies not set
|
|
180
|
+
if (!this.sessionBackend || !this.storageService) {
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
// Get all teams and iterate over active non-orchestrator members
|
|
184
|
+
const teams = await this.storageService.getTeams();
|
|
185
|
+
const activityTracker = PtyActivityTrackerService.getInstance();
|
|
186
|
+
const suspendService = AgentSuspendService.getInstance();
|
|
187
|
+
for (const team of teams) {
|
|
188
|
+
for (const member of team.members || []) {
|
|
189
|
+
// Skip orchestrator
|
|
190
|
+
if (member.role === ORCHESTRATOR_ROLE) {
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
// Skip inactive agents
|
|
194
|
+
if (member.agentStatus !== 'active') {
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
// Skip suspended or rehydrating agents
|
|
198
|
+
if (suspendService.isSuspended(member.sessionName) || suspendService.isRehydrating(member.sessionName)) {
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
// Skip if session doesn't exist
|
|
202
|
+
if (!this.sessionBackend.sessionExists(member.sessionName)) {
|
|
203
|
+
// Clean up state for non-existent sessions
|
|
204
|
+
this.agentStates.delete(member.sessionName);
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
// Ensure state exists for this agent
|
|
208
|
+
if (!this.agentStates.has(member.sessionName)) {
|
|
209
|
+
this.agentStates.set(member.sessionName, {
|
|
210
|
+
sessionName: member.sessionName,
|
|
211
|
+
memberId: member.id,
|
|
212
|
+
teamId: team.id,
|
|
213
|
+
role: member.role,
|
|
214
|
+
consecutiveDeadChecks: 0,
|
|
215
|
+
restartTimestamps: [],
|
|
216
|
+
restartCount: 0,
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
const state = this.agentStates.get(member.sessionName);
|
|
220
|
+
// Check dual idle signals: PTY activity AND API heartbeat
|
|
221
|
+
const ptyIdleMs = activityTracker.getIdleTimeMs(member.sessionName);
|
|
222
|
+
const apiIdleMs = await this.getApiIdleTimeMs(member.id);
|
|
223
|
+
// If either signal shows recent activity, the agent is alive
|
|
224
|
+
const trulyIdle = ptyIdleMs >= AGENT_HEARTBEAT_MONITOR_CONSTANTS.HEARTBEAT_REQUEST_THRESHOLD_MS
|
|
225
|
+
&& apiIdleMs >= AGENT_HEARTBEAT_MONITOR_CONSTANTS.HEARTBEAT_REQUEST_THRESHOLD_MS;
|
|
226
|
+
if (!trulyIdle) {
|
|
227
|
+
// Agent has recent activity — reset dead checks
|
|
228
|
+
if (state.consecutiveDeadChecks > 0) {
|
|
229
|
+
this.logger.info('Agent activity detected, resetting dead check counter', {
|
|
230
|
+
sessionName: member.sessionName,
|
|
231
|
+
ptyIdleMs,
|
|
232
|
+
apiIdleMs,
|
|
233
|
+
previousDeadChecks: state.consecutiveDeadChecks,
|
|
234
|
+
});
|
|
235
|
+
state.consecutiveDeadChecks = 0;
|
|
236
|
+
}
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
// Agent is truly idle — check if the child process is still alive
|
|
240
|
+
const processAlive = this.isChildProcessAlive(member.sessionName);
|
|
241
|
+
if (processAlive) {
|
|
242
|
+
// Process is alive but idle — this is fine, IdleDetectionService handles suspension
|
|
243
|
+
if (state.consecutiveDeadChecks > 0) {
|
|
244
|
+
this.logger.debug('Agent process alive despite idle, resetting dead checks', {
|
|
245
|
+
sessionName: member.sessionName,
|
|
246
|
+
});
|
|
247
|
+
state.consecutiveDeadChecks = 0;
|
|
248
|
+
}
|
|
249
|
+
continue;
|
|
250
|
+
}
|
|
251
|
+
// Child process is dead — increment counter
|
|
252
|
+
state.consecutiveDeadChecks++;
|
|
253
|
+
this.logger.warn('Agent child process not alive', {
|
|
254
|
+
sessionName: member.sessionName,
|
|
255
|
+
consecutiveDeadChecks: state.consecutiveDeadChecks,
|
|
256
|
+
maxBeforeRestart: MAX_DEAD_CHECKS_BEFORE_RESTART,
|
|
257
|
+
ptyIdleMs,
|
|
258
|
+
apiIdleMs,
|
|
259
|
+
});
|
|
260
|
+
// After enough consecutive dead checks, trigger restart
|
|
261
|
+
if (state.consecutiveDeadChecks >= MAX_DEAD_CHECKS_BEFORE_RESTART) {
|
|
262
|
+
this.logger.warn('Agent unresponsive after multiple dead checks, triggering restart', {
|
|
263
|
+
sessionName: member.sessionName,
|
|
264
|
+
consecutiveDeadChecks: state.consecutiveDeadChecks,
|
|
265
|
+
});
|
|
266
|
+
state.consecutiveDeadChecks = 0;
|
|
267
|
+
await this.triggerAgentRestart(state);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Get the API idle time in milliseconds for a team member.
|
|
274
|
+
*
|
|
275
|
+
* Reads the agent's lastActiveTime from AgentHeartbeatService and
|
|
276
|
+
* calculates how long ago it was. Returns 0 if no heartbeat data
|
|
277
|
+
* exists (treat as "just started").
|
|
278
|
+
*
|
|
279
|
+
* @param memberId - Team member ID to check
|
|
280
|
+
* @returns Milliseconds since last API activity, or 0 if unknown
|
|
281
|
+
*/
|
|
282
|
+
async getApiIdleTimeMs(memberId) {
|
|
283
|
+
try {
|
|
284
|
+
const heartbeat = await AgentHeartbeatService.getInstance().getAgentHeartbeat(memberId);
|
|
285
|
+
if (!heartbeat || !heartbeat.lastActiveTime) {
|
|
286
|
+
return 0;
|
|
287
|
+
}
|
|
288
|
+
const lastActive = new Date(heartbeat.lastActiveTime).getTime();
|
|
289
|
+
if (isNaN(lastActive)) {
|
|
290
|
+
return 0;
|
|
291
|
+
}
|
|
292
|
+
return Math.max(0, Date.now() - lastActive);
|
|
293
|
+
}
|
|
294
|
+
catch {
|
|
295
|
+
// If heartbeat service fails, don't treat as idle
|
|
296
|
+
return 0;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Check if the child process (e.g. Claude Code) inside an agent's
|
|
301
|
+
* PTY shell is still alive.
|
|
302
|
+
*
|
|
303
|
+
* Uses the session backend's isChildProcessAlive() method which
|
|
304
|
+
* inspects the process tree via pgrep. This is a non-intrusive
|
|
305
|
+
* server-side check that does not write to the agent's PTY.
|
|
306
|
+
*
|
|
307
|
+
* @param sessionName - Session to check
|
|
308
|
+
* @returns true if child process is alive, false if dead or check unavailable
|
|
309
|
+
*/
|
|
310
|
+
isChildProcessAlive(sessionName) {
|
|
311
|
+
if (!this.sessionBackend) {
|
|
312
|
+
return true; // Assume alive if we can't check
|
|
313
|
+
}
|
|
314
|
+
try {
|
|
315
|
+
if (typeof this.sessionBackend.isChildProcessAlive === 'function') {
|
|
316
|
+
return this.sessionBackend.isChildProcessAlive(sessionName);
|
|
317
|
+
}
|
|
318
|
+
// If backend doesn't support process liveness check, assume alive
|
|
319
|
+
return true;
|
|
320
|
+
}
|
|
321
|
+
catch {
|
|
322
|
+
// On error, assume alive to avoid false restarts
|
|
323
|
+
return true;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Restart a crashed/unresponsive agent.
|
|
328
|
+
*
|
|
329
|
+
* Follows the AgentSuspendService.rehydrateAgent() pattern:
|
|
330
|
+
* 1. Check cooldown (max restarts per window)
|
|
331
|
+
* 2. Save Claude session ID for resume
|
|
332
|
+
* 3. Stop exit monitoring
|
|
333
|
+
* 4. Kill old PTY session
|
|
334
|
+
* 5. Pre-set session ID for resume
|
|
335
|
+
* 6. Recreate agent session via AgentRegistrationService
|
|
336
|
+
* 7. Re-deliver in-progress tasks
|
|
337
|
+
* 8. Broadcast WebSocket event
|
|
338
|
+
*
|
|
339
|
+
* @param state - Agent monitor state
|
|
340
|
+
*/
|
|
341
|
+
async triggerAgentRestart(state) {
|
|
342
|
+
if (!this.sessionBackend || !this.agentRegistrationService) {
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
// Check cooldown
|
|
346
|
+
const now = Date.now();
|
|
347
|
+
const windowStart = now - AGENT_HEARTBEAT_MONITOR_CONSTANTS.COOLDOWN_WINDOW_MS;
|
|
348
|
+
state.restartTimestamps = state.restartTimestamps.filter(ts => ts > windowStart);
|
|
349
|
+
if (state.restartTimestamps.length >= AGENT_HEARTBEAT_MONITOR_CONSTANTS.MAX_RESTARTS_PER_WINDOW) {
|
|
350
|
+
this.logger.warn('Agent restart cooldown active, skipping restart', {
|
|
351
|
+
sessionName: state.sessionName,
|
|
352
|
+
restartsInWindow: state.restartTimestamps.length,
|
|
353
|
+
maxRestartsPerWindow: AGENT_HEARTBEAT_MONITOR_CONSTANTS.MAX_RESTARTS_PER_WINDOW,
|
|
354
|
+
});
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
try {
|
|
358
|
+
// Save Claude session ID before killing
|
|
359
|
+
let claudeSessionId;
|
|
360
|
+
try {
|
|
361
|
+
const persistence = getSessionStatePersistence();
|
|
362
|
+
claudeSessionId = persistence.getSessionId(state.sessionName);
|
|
363
|
+
}
|
|
364
|
+
catch {
|
|
365
|
+
this.logger.warn('Could not retrieve Claude session ID for restart', {
|
|
366
|
+
sessionName: state.sessionName,
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
// Stop runtime exit monitoring to avoid triggering exit callbacks
|
|
370
|
+
RuntimeExitMonitorService.getInstance().stopMonitoring(state.sessionName);
|
|
371
|
+
// Kill old PTY session
|
|
372
|
+
if (this.sessionBackend.sessionExists(state.sessionName)) {
|
|
373
|
+
await this.sessionBackend.killSession(state.sessionName);
|
|
374
|
+
}
|
|
375
|
+
// Clear PTY activity tracker
|
|
376
|
+
PtyActivityTrackerService.getInstance().clearSession(state.sessionName);
|
|
377
|
+
// Pre-set session ID for resume
|
|
378
|
+
if (claudeSessionId) {
|
|
379
|
+
try {
|
|
380
|
+
const persistence = getSessionStatePersistence();
|
|
381
|
+
const metadata = persistence.getSessionMetadata(state.sessionName);
|
|
382
|
+
if (metadata) {
|
|
383
|
+
persistence.updateSessionId(state.sessionName, claudeSessionId);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
catch {
|
|
387
|
+
this.logger.warn('Could not pre-set session ID for resume', {
|
|
388
|
+
sessionName: state.sessionName,
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
// Recreate agent session
|
|
393
|
+
const result = await this.agentRegistrationService.createAgentSession({
|
|
394
|
+
sessionName: state.sessionName,
|
|
395
|
+
role: state.role,
|
|
396
|
+
teamId: state.teamId,
|
|
397
|
+
memberId: state.memberId,
|
|
398
|
+
});
|
|
399
|
+
if (!result.success) {
|
|
400
|
+
this.logger.error('Agent restart createAgentSession failed', {
|
|
401
|
+
sessionName: state.sessionName,
|
|
402
|
+
error: result.error,
|
|
403
|
+
});
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
406
|
+
// Track restart
|
|
407
|
+
state.restartTimestamps.push(now);
|
|
408
|
+
state.restartCount++;
|
|
409
|
+
// Broadcast agent restarted event
|
|
410
|
+
const terminalGateway = getTerminalGateway();
|
|
411
|
+
if (terminalGateway) {
|
|
412
|
+
terminalGateway.broadcastTeamMemberStatus({
|
|
413
|
+
teamId: state.teamId,
|
|
414
|
+
memberId: state.memberId,
|
|
415
|
+
sessionName: state.sessionName,
|
|
416
|
+
agentStatus: 'active',
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
this.logger.info('Agent restarted successfully', {
|
|
420
|
+
sessionName: state.sessionName,
|
|
421
|
+
restartCount: state.restartCount,
|
|
422
|
+
claudeSessionId: claudeSessionId ? '(resumed)' : '(fresh)',
|
|
423
|
+
});
|
|
424
|
+
// Re-deliver in-progress tasks (async, non-blocking)
|
|
425
|
+
this.redeliverTasks(state).catch((err) => {
|
|
426
|
+
this.logger.error('Task re-delivery failed after agent restart', {
|
|
427
|
+
sessionName: state.sessionName,
|
|
428
|
+
error: err instanceof Error ? err.message : String(err),
|
|
429
|
+
});
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
catch (err) {
|
|
433
|
+
this.logger.error('Failed to restart agent', {
|
|
434
|
+
sessionName: state.sessionName,
|
|
435
|
+
error: err instanceof Error ? err.message : String(err),
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
/**
|
|
440
|
+
* Re-deliver in-progress tasks to a restarted agent.
|
|
441
|
+
*
|
|
442
|
+
* Waits for the agent to initialize, queries TaskTrackingService for
|
|
443
|
+
* assigned/active tasks, reads task files, and writes summaries into
|
|
444
|
+
* the agent's PTY session.
|
|
445
|
+
*
|
|
446
|
+
* @param state - Agent monitor state
|
|
447
|
+
*/
|
|
448
|
+
async redeliverTasks(state) {
|
|
449
|
+
if (!this.taskTrackingService || !this.sessionBackend) {
|
|
450
|
+
return;
|
|
451
|
+
}
|
|
452
|
+
// Wait for agent initialization
|
|
453
|
+
await new Promise(resolve => setTimeout(resolve, AGENT_SUSPEND_CONSTANTS.REHYDRATION_TIMEOUT_MS));
|
|
454
|
+
// Verify agent session exists after waiting
|
|
455
|
+
if (!this.sessionBackend.sessionExists(state.sessionName)) {
|
|
456
|
+
this.logger.warn('Agent session not found after restart, skipping task re-delivery', {
|
|
457
|
+
sessionName: state.sessionName,
|
|
458
|
+
});
|
|
459
|
+
return;
|
|
460
|
+
}
|
|
461
|
+
// Query tasks for this team member
|
|
462
|
+
const tasks = await this.taskTrackingService.getTasksForTeamMember(state.memberId);
|
|
463
|
+
const activeTasks = tasks.filter(t => t.status === 'assigned' || t.status === 'active');
|
|
464
|
+
if (activeTasks.length === 0) {
|
|
465
|
+
this.logger.debug('No active tasks to re-deliver', { sessionName: state.sessionName });
|
|
466
|
+
return;
|
|
467
|
+
}
|
|
468
|
+
this.logger.info('Re-delivering tasks to restarted agent', {
|
|
469
|
+
sessionName: state.sessionName,
|
|
470
|
+
taskCount: activeTasks.length,
|
|
471
|
+
});
|
|
472
|
+
const session = this.sessionBackend.getSession(state.sessionName);
|
|
473
|
+
if (!session) {
|
|
474
|
+
return;
|
|
475
|
+
}
|
|
476
|
+
for (const task of activeTasks) {
|
|
477
|
+
// Read task file content
|
|
478
|
+
let taskContent = '';
|
|
479
|
+
try {
|
|
480
|
+
taskContent = await fs.readFile(task.taskFilePath, 'utf-8');
|
|
481
|
+
// Truncate to 2000 chars
|
|
482
|
+
if (taskContent.length > 2000) {
|
|
483
|
+
taskContent = taskContent.slice(0, 2000) + '\n... (truncated)';
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
catch {
|
|
487
|
+
taskContent = '(task file not found)';
|
|
488
|
+
}
|
|
489
|
+
const message = [
|
|
490
|
+
'[TASK RE-DELIVERY] You were working on this task before your session was restarted:',
|
|
491
|
+
`Task: ${task.taskName}`,
|
|
492
|
+
`File: ${task.taskFilePath}`,
|
|
493
|
+
'---',
|
|
494
|
+
taskContent,
|
|
495
|
+
'---',
|
|
496
|
+
'Please continue working on this task.',
|
|
497
|
+
].join('\n');
|
|
498
|
+
session.write(message + '\n');
|
|
499
|
+
// Delay between tasks to avoid flooding
|
|
500
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
501
|
+
}
|
|
502
|
+
this.logger.info('Task re-delivery complete', {
|
|
503
|
+
sessionName: state.sessionName,
|
|
504
|
+
tasksDelivered: activeTasks.length,
|
|
505
|
+
});
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
//# sourceMappingURL=agent-heartbeat-monitor.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-heartbeat-monitor.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/agent-heartbeat-monitor.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ import { type AgentStatus } from '../../constants.js';
|
|
|
5
5
|
export interface AgentHeartbeat {
|
|
6
6
|
/** Agent identifier (e.g., 'orchestrator' or team member ID) */
|
|
7
7
|
agentId: string;
|
|
8
|
-
/**
|
|
8
|
+
/** PTY session name */
|
|
9
9
|
sessionName: string;
|
|
10
10
|
/** Team member ID (only for team members, not orchestrator) */
|
|
11
11
|
teamMemberId?: string;
|
|
@@ -38,7 +38,7 @@ export interface TeamAgentStatusFile {
|
|
|
38
38
|
export interface BatchedStatusUpdate {
|
|
39
39
|
/** Agent identifier */
|
|
40
40
|
agentId: string;
|
|
41
|
-
/**
|
|
41
|
+
/** PTY session name */
|
|
42
42
|
sessionName: string;
|
|
43
43
|
/** Team member ID (optional, only for team members) */
|
|
44
44
|
teamMemberId?: string;
|
|
@@ -65,7 +65,7 @@ export declare class AgentStatusBatcher {
|
|
|
65
65
|
* Add an agent status update to the batch queue
|
|
66
66
|
*
|
|
67
67
|
* @param agentId - Agent identifier
|
|
68
|
-
* @param sessionName -
|
|
68
|
+
* @param sessionName - PTY session name
|
|
69
69
|
* @param agentStatus - New agent status
|
|
70
70
|
* @param teamMemberId - Team member ID (optional, only for team members)
|
|
71
71
|
*/
|
|
@@ -125,7 +125,7 @@ export declare class AgentHeartbeatService {
|
|
|
125
125
|
* This is the main entry point that transforms API calls into agent heartbeats.
|
|
126
126
|
* Uses batching for efficiency and error resilience.
|
|
127
127
|
*
|
|
128
|
-
* @param sessionName -
|
|
128
|
+
* @param sessionName - PTY session name from API call
|
|
129
129
|
* @param teamMemberId - Team member ID from API call (optional)
|
|
130
130
|
* @param agentStatus - Current agent status (defaults to 'active')
|
|
131
131
|
*
|
|
@@ -214,7 +214,7 @@ export declare class AgentHeartbeatService {
|
|
|
214
214
|
*
|
|
215
215
|
* This is the main function that all API handlers should call.
|
|
216
216
|
*
|
|
217
|
-
* @param sessionName -
|
|
217
|
+
* @param sessionName - PTY session name from API call
|
|
218
218
|
* @param teamMemberId - Team member ID from API call (optional)
|
|
219
219
|
* @param agentStatus - Current agent status (defaults to 'active')
|
|
220
220
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-heartbeat.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/agent-heartbeat.service.ts"],"names":[],"mappings":"AAKA,OAAO,EAIN,KAAK,WAAW,EAEhB,MAAM,oBAAoB,CAAC;AAE5B;;GAEG;AACH,MAAM,WAAW,cAAc;IAC9B,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAC;IAChB,
|
|
1
|
+
{"version":3,"file":"agent-heartbeat.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/agent-heartbeat.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,7 +25,7 @@ export class AgentStatusBatcher {
|
|
|
25
25
|
* Add an agent status update to the batch queue
|
|
26
26
|
*
|
|
27
27
|
* @param agentId - Agent identifier
|
|
28
|
-
* @param sessionName -
|
|
28
|
+
* @param sessionName - PTY session name
|
|
29
29
|
* @param agentStatus - New agent status
|
|
30
30
|
* @param teamMemberId - Team member ID (optional, only for team members)
|
|
31
31
|
*/
|
|
@@ -172,7 +172,7 @@ export class AgentHeartbeatService {
|
|
|
172
172
|
* This is the main entry point that transforms API calls into agent heartbeats.
|
|
173
173
|
* Uses batching for efficiency and error resilience.
|
|
174
174
|
*
|
|
175
|
-
* @param sessionName -
|
|
175
|
+
* @param sessionName - PTY session name from API call
|
|
176
176
|
* @param teamMemberId - Team member ID from API call (optional)
|
|
177
177
|
* @param agentStatus - Current agent status (defaults to 'active')
|
|
178
178
|
*
|
|
@@ -495,7 +495,7 @@ export class AgentHeartbeatService {
|
|
|
495
495
|
*
|
|
496
496
|
* This is the main function that all API handlers should call.
|
|
497
497
|
*
|
|
498
|
-
* @param sessionName -
|
|
498
|
+
* @param sessionName - PTY session name from API call
|
|
499
499
|
* @param teamMemberId - Team member ID from API call (optional)
|
|
500
500
|
* @param agentStatus - Current agent status (defaults to 'active')
|
|
501
501
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-registration.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/agent-registration.service.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"agent-registration.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/agent-registration.service.ts"],"names":[],"mappings":"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"}
|