crewly 1.20.196 → 1.20.198
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/roles/orchestrator/prompt.md +8 -9
- package/config/roles/team-leader/prompt.md +6 -0
- package/config/skills/agent/computer-use/SKILL.md +16 -0
- package/config/skills/agent/core/ask-owner/SKILL.md +14 -0
- package/config/skills/agent/core/ask-owner/execute.sh +19 -1
- package/config/skills/agent/core/ask-owner/execute.test.sh +12 -0
- package/config/skills/agent/core/gmail-send/SKILL.md +16 -0
- package/config/skills/agent/core/reply-channel/SKILL.md +16 -0
- package/config/skills/agent/core/slack-post/SKILL.md +16 -0
- package/config/skills/agent/core/whatsapp-send/SKILL.md +16 -0
- package/config/skills/agent/remote-browser/SKILL.md +43 -7
- package/config/skills/registry.json +7 -7
- package/dist/backend/backend/src/constants.d.ts +143 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +159 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts +12 -1
- package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.controller.js +170 -9
- package/dist/backend/backend/src/controllers/browser/browser.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.routes.js +5 -1
- package/dist/backend/backend/src/controllers/browser/browser.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +37 -52
- package/dist/backend/backend/src/controllers/monitoring/terminal.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 +13 -0
- package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts +17 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +102 -0
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-heartbeat-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-heartbeat-monitor.service.js +5 -8
- package/dist/backend/backend/src/services/agent/agent-heartbeat-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +12 -0
- 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 +275 -241
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/context-window-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/context-window-monitor.service.js +5 -6
- package/dist/backend/backend/src/services/agent/context-window-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/control-plane-guard.service.d.ts +6 -0
- package/dist/backend/backend/src/services/agent/control-plane-guard.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/control-plane-guard.service.js +2 -1
- package/dist/backend/backend/src/services/agent/control-plane-guard.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.js +12 -8
- package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/gemini-runtime.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/gemini-runtime.service.js +32 -27
- package/dist/backend/backend/src/services/agent/gemini-runtime.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/owner-stopped.registry.d.ts +44 -0
- package/dist/backend/backend/src/services/agent/owner-stopped.registry.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/owner-stopped.registry.js +54 -0
- package/dist/backend/backend/src/services/agent/owner-stopped.registry.js.map +1 -0
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js +4 -4
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
- 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 +4 -8
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/decision-rights.module.d.ts +19 -4
- package/dist/backend/backend/src/services/ai/prompt-modules/decision-rights.module.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/decision-rights.module.js +28 -5
- package/dist/backend/backend/src/services/ai/prompt-modules/decision-rights.module.js.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-approval.service.d.ts +2 -2
- package/dist/backend/backend/src/services/browser/browser-approval.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-approval.service.js +13 -2
- package/dist/backend/backend/src/services/browser/browser-approval.service.js.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-outbound-guard.d.ts +214 -0
- package/dist/backend/backend/src/services/browser/browser-outbound-guard.d.ts.map +1 -0
- package/dist/backend/backend/src/services/browser/browser-outbound-guard.js +466 -0
- package/dist/backend/backend/src/services/browser/browser-outbound-guard.js.map +1 -0
- package/dist/backend/backend/src/services/browser/browser-session.service.d.ts +57 -3
- package/dist/backend/backend/src/services/browser/browser-session.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-session.service.js +148 -63
- package/dist/backend/backend/src/services/browser/browser-session.service.js.map +1 -1
- package/dist/backend/backend/src/services/browser/held-action-store.d.ts +4 -0
- package/dist/backend/backend/src/services/browser/held-action-store.d.ts.map +1 -1
- package/dist/backend/backend/src/services/browser/held-action-store.js.map +1 -1
- package/dist/backend/backend/src/services/browser/owner-browser-input.d.ts +98 -10
- package/dist/backend/backend/src/services/browser/owner-browser-input.d.ts.map +1 -1
- package/dist/backend/backend/src/services/browser/owner-browser-input.js +126 -11
- package/dist/backend/backend/src/services/browser/owner-browser-input.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-initializer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-initializer.js +6 -8
- package/dist/backend/backend/src/services/cloud/cloud-initializer.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/input-blocked-retry.service.d.ts +129 -0
- package/dist/backend/backend/src/services/messaging/input-blocked-retry.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/messaging/input-blocked-retry.service.js +196 -0
- package/dist/backend/backend/src/services/messaging/input-blocked-retry.service.js.map +1 -0
- package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +42 -0
- package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js +88 -10
- package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/agent-hook-state.d.ts.map +1 -1
- package/dist/backend/backend/src/services/monitoring/agent-hook-state.js +5 -0
- package/dist/backend/backend/src/services/monitoring/agent-hook-state.js.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.js +5 -9
- package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/session/pty/pty-session-backend.d.ts +11 -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 +14 -0
- package/dist/backend/backend/src/services/session/pty/pty-session-backend.js.map +1 -1
- package/dist/backend/backend/src/services/session/pty/pty-terminal-buffer.d.ts +37 -0
- package/dist/backend/backend/src/services/session/pty/pty-terminal-buffer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/session/pty/pty-terminal-buffer.js +78 -0
- package/dist/backend/backend/src/services/session/pty/pty-terminal-buffer.js.map +1 -1
- package/dist/backend/backend/src/services/session/session-backend.interface.d.ts +13 -0
- package/dist/backend/backend/src/services/session/session-backend.interface.d.ts.map +1 -1
- package/dist/backend/backend/src/services/session/session-backend.interface.js.map +1 -1
- package/dist/backend/backend/src/services/session/session-command-helper.d.ts +118 -105
- package/dist/backend/backend/src/services/session/session-command-helper.d.ts.map +1 -1
- package/dist/backend/backend/src/services/session/session-command-helper.js +267 -298
- package/dist/backend/backend/src/services/session/session-command-helper.js.map +1 -1
- package/dist/backend/backend/src/services/session/tui-input-guard.d.ts +144 -0
- package/dist/backend/backend/src/services/session/tui-input-guard.d.ts.map +1 -0
- package/dist/backend/backend/src/services/session/tui-input-guard.js +312 -0
- package/dist/backend/backend/src/services/session/tui-input-guard.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +14 -0
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +31 -0
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +82 -4
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/backend/backend/src/services/trace/trace.types.d.ts +2 -2
- package/dist/backend/backend/src/services/trace/trace.types.d.ts.map +1 -1
- package/dist/backend/backend/src/services/trace/trace.types.js +4 -0
- package/dist/backend/backend/src/services/trace/trace.types.js.map +1 -1
- package/dist/backend/backend/src/services/trace/turn-origin.d.ts +70 -0
- package/dist/backend/backend/src/services/trace/turn-origin.d.ts.map +1 -0
- package/dist/backend/backend/src/services/trace/turn-origin.js +198 -0
- package/dist/backend/backend/src/services/trace/turn-origin.js.map +1 -0
- package/dist/backend/backend/src/types/slack.types.d.ts +8 -0
- package/dist/backend/backend/src/types/slack.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/slack.types.js.map +1 -1
- package/dist/backend/backend/src/utils/terminal-string-ops.d.ts.map +1 -1
- package/dist/backend/backend/src/utils/terminal-string-ops.js +3 -2
- package/dist/backend/backend/src/utils/terminal-string-ops.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +143 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +159 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +12 -0
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.js +275 -241
- package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/context-window-monitor.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/context-window-monitor.service.js +5 -6
- package/dist/cli/backend/src/services/agent/context-window-monitor.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/control-plane-guard.service.d.ts +6 -0
- package/dist/cli/backend/src/services/agent/control-plane-guard.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/control-plane-guard.service.js +2 -1
- package/dist/cli/backend/src/services/agent/control-plane-guard.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.js +12 -8
- package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/gemini-runtime.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/gemini-runtime.service.js +32 -27
- package/dist/cli/backend/src/services/agent/gemini-runtime.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js +4 -4
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js +4 -8
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/decision-rights.module.d.ts +19 -4
- package/dist/cli/backend/src/services/ai/prompt-modules/decision-rights.module.d.ts.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/decision-rights.module.js +28 -5
- package/dist/cli/backend/src/services/ai/prompt-modules/decision-rights.module.js.map +1 -1
- package/dist/cli/backend/src/services/messaging/input-blocked-retry.service.d.ts +129 -0
- package/dist/cli/backend/src/services/messaging/input-blocked-retry.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/messaging/input-blocked-retry.service.js +196 -0
- package/dist/cli/backend/src/services/messaging/input-blocked-retry.service.js.map +1 -0
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +42 -0
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js +88 -10
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
- package/dist/cli/backend/src/services/session/pty/pty-session-backend.d.ts +11 -0
- package/dist/cli/backend/src/services/session/pty/pty-session-backend.d.ts.map +1 -1
- package/dist/cli/backend/src/services/session/pty/pty-session-backend.js +14 -0
- package/dist/cli/backend/src/services/session/pty/pty-session-backend.js.map +1 -1
- package/dist/cli/backend/src/services/session/pty/pty-terminal-buffer.d.ts +37 -0
- package/dist/cli/backend/src/services/session/pty/pty-terminal-buffer.d.ts.map +1 -1
- package/dist/cli/backend/src/services/session/pty/pty-terminal-buffer.js +78 -0
- package/dist/cli/backend/src/services/session/pty/pty-terminal-buffer.js.map +1 -1
- package/dist/cli/backend/src/services/session/session-backend.interface.d.ts +13 -0
- package/dist/cli/backend/src/services/session/session-backend.interface.d.ts.map +1 -1
- package/dist/cli/backend/src/services/session/session-backend.interface.js.map +1 -1
- package/dist/cli/backend/src/services/session/session-command-helper.d.ts +118 -105
- package/dist/cli/backend/src/services/session/session-command-helper.d.ts.map +1 -1
- package/dist/cli/backend/src/services/session/session-command-helper.js +267 -298
- package/dist/cli/backend/src/services/session/session-command-helper.js.map +1 -1
- package/dist/cli/backend/src/services/session/tui-input-guard.d.ts +144 -0
- package/dist/cli/backend/src/services/session/tui-input-guard.d.ts.map +1 -0
- package/dist/cli/backend/src/services/session/tui-input-guard.js +312 -0
- package/dist/cli/backend/src/services/session/tui-input-guard.js.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +14 -0
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +31 -0
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +82 -4
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/cli/backend/src/services/trace/trace.types.d.ts +2 -2
- package/dist/cli/backend/src/services/trace/trace.types.d.ts.map +1 -1
- package/dist/cli/backend/src/services/trace/trace.types.js +4 -0
- package/dist/cli/backend/src/services/trace/trace.types.js.map +1 -1
- package/dist/cli/backend/src/services/trace/turn-origin.d.ts +70 -0
- package/dist/cli/backend/src/services/trace/turn-origin.d.ts.map +1 -0
- package/dist/cli/backend/src/services/trace/turn-origin.js +198 -0
- package/dist/cli/backend/src/services/trace/turn-origin.js.map +1 -0
- package/dist/cli/backend/src/types/slack.types.d.ts +8 -0
- package/dist/cli/backend/src/types/slack.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/slack.types.js.map +1 -1
- package/dist/cli/backend/src/utils/terminal-string-ops.d.ts.map +1 -1
- package/dist/cli/backend/src/utils/terminal-string-ops.js +3 -2
- package/dist/cli/backend/src/utils/terminal-string-ops.js.map +1 -1
- package/frontend/dist/assets/index-5cbcf45b.css +42 -0
- package/frontend/dist/assets/{index-edfa8e04.js → index-63a33dbf.js} +283 -283
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
- package/dist/cli/backend/src/services/agent/agent-suspend.service.d.ts +0 -118
- package/dist/cli/backend/src/services/agent/agent-suspend.service.d.ts.map +0 -1
- package/dist/cli/backend/src/services/agent/agent-suspend.service.js +0 -304
- package/dist/cli/backend/src/services/agent/agent-suspend.service.js.map +0 -1
- package/dist/cli/backend/src/services/agent/disk-cleanup.service.d.ts +0 -100
- package/dist/cli/backend/src/services/agent/disk-cleanup.service.d.ts.map +0 -1
- package/dist/cli/backend/src/services/agent/disk-cleanup.service.js +0 -149
- package/dist/cli/backend/src/services/agent/disk-cleanup.service.js.map +0 -1
- package/frontend/dist/assets/index-bfa0e2e8.css +0 -42
package/frontend/dist/index.html
CHANGED
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
<meta name="color-scheme" content="dark" />
|
|
8
8
|
<!-- Nunito font is self-hosted via @fontsource/nunito (imported in main.tsx) -->
|
|
9
9
|
<title>Crewly AI Studio</title>
|
|
10
|
-
<script type="module" crossorigin src="/assets/index-
|
|
11
|
-
<link rel="stylesheet" href="/assets/index-
|
|
10
|
+
<script type="module" crossorigin src="/assets/index-63a33dbf.js"></script>
|
|
11
|
+
<link rel="stylesheet" href="/assets/index-5cbcf45b.css">
|
|
12
12
|
</head>
|
|
13
13
|
<body class="bg-background-dark font-display text-text-primary-dark">
|
|
14
14
|
<div id="root"></div>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "crewly",
|
|
3
|
-
"version": "1.20.
|
|
3
|
+
"version": "1.20.198",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Multi-agent orchestration platform for AI coding teams — coordinates Claude Code, Gemini CLI, and Codex agents with a real-time web dashboard",
|
|
6
6
|
"workspaces": [
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agent Suspend Service
|
|
3
|
-
*
|
|
4
|
-
* Central coordinator for the agent suspend/rehydrate lifecycle.
|
|
5
|
-
* Suspends idle agents to free resources (RAM/disk) and transparently
|
|
6
|
-
* rehydrates them when the orchestrator sends a message, using
|
|
7
|
-
* Claude Code's `--resume` flag to restore conversation context.
|
|
8
|
-
*
|
|
9
|
-
* @module agent-suspend-service
|
|
10
|
-
*/
|
|
11
|
-
import type { AgentRegistrationService } from './agent-registration.service.js';
|
|
12
|
-
/**
|
|
13
|
-
* Information stored for each suspended agent.
|
|
14
|
-
*/
|
|
15
|
-
export interface SuspendedAgentInfo {
|
|
16
|
-
/** PTY session name */
|
|
17
|
-
sessionName: string;
|
|
18
|
-
/** Team ID the agent belongs to */
|
|
19
|
-
teamId: string;
|
|
20
|
-
/** Member ID within the team */
|
|
21
|
-
memberId: string;
|
|
22
|
-
/** Agent role (developer, qa, etc.) */
|
|
23
|
-
role: string;
|
|
24
|
-
/** Claude conversation session ID for --resume */
|
|
25
|
-
claudeSessionId?: string;
|
|
26
|
-
/** ISO timestamp when the agent was suspended */
|
|
27
|
-
suspendedAt: string;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Manages suspension and rehydration of idle agents.
|
|
31
|
-
*
|
|
32
|
-
* Lifecycle:
|
|
33
|
-
* - `active → suspended`: Idle timeout triggers suspendAgent()
|
|
34
|
-
* - `suspended → starting → active`: Message triggers rehydrateAgent()
|
|
35
|
-
* - `suspended → inactive`: Manual stop by user
|
|
36
|
-
*/
|
|
37
|
-
export declare class AgentSuspendService {
|
|
38
|
-
private static instance;
|
|
39
|
-
private logger;
|
|
40
|
-
/** Map of sessionName → suspended agent metadata */
|
|
41
|
-
private suspendedAgents;
|
|
42
|
-
/** Set of sessionNames currently being rehydrated (dedup guard) */
|
|
43
|
-
private rehydratingSet;
|
|
44
|
-
/** Injected AgentRegistrationService (set via setDependencies) */
|
|
45
|
-
private agentRegistrationService;
|
|
46
|
-
private constructor();
|
|
47
|
-
/**
|
|
48
|
-
* Get the singleton instance.
|
|
49
|
-
*
|
|
50
|
-
* @returns The AgentSuspendService singleton
|
|
51
|
-
*/
|
|
52
|
-
static getInstance(): AgentSuspendService;
|
|
53
|
-
/**
|
|
54
|
-
* Reset the singleton (for testing).
|
|
55
|
-
*/
|
|
56
|
-
static resetInstance(): void;
|
|
57
|
-
/**
|
|
58
|
-
* Inject the AgentRegistrationService dependency.
|
|
59
|
-
* Must be called during server startup before rehydration can work.
|
|
60
|
-
*
|
|
61
|
-
* @param registrationService - The AgentRegistrationService instance
|
|
62
|
-
*/
|
|
63
|
-
setDependencies(registrationService: AgentRegistrationService): void;
|
|
64
|
-
/**
|
|
65
|
-
* Suspend an active agent, killing its process but preserving
|
|
66
|
-
* the Claude session ID so it can be rehydrated later.
|
|
67
|
-
*
|
|
68
|
-
* @param sessionName - PTY session name
|
|
69
|
-
* @param teamId - Team ID
|
|
70
|
-
* @param memberId - Member ID within the team
|
|
71
|
-
* @param role - Agent role
|
|
72
|
-
* @returns True if suspension was successful
|
|
73
|
-
*/
|
|
74
|
-
suspendAgent(sessionName: string, teamId: string, memberId: string, role: string): Promise<boolean>;
|
|
75
|
-
/**
|
|
76
|
-
* Rehydrate a suspended agent by recreating its session.
|
|
77
|
-
* Uses the saved Claude session ID for `--resume` to restore context.
|
|
78
|
-
*
|
|
79
|
-
* @param sessionName - PTY session name of the suspended agent
|
|
80
|
-
* @returns True if rehydration was initiated (not necessarily complete)
|
|
81
|
-
*/
|
|
82
|
-
rehydrateAgent(sessionName: string): Promise<boolean>;
|
|
83
|
-
/**
|
|
84
|
-
* Check if a session is currently suspended.
|
|
85
|
-
*
|
|
86
|
-
* @param sessionName - PTY session name
|
|
87
|
-
* @returns True if the agent is suspended
|
|
88
|
-
*/
|
|
89
|
-
isSuspended(sessionName: string): boolean;
|
|
90
|
-
/**
|
|
91
|
-
* Check if a session is currently being rehydrated.
|
|
92
|
-
*
|
|
93
|
-
* @param sessionName - PTY session name
|
|
94
|
-
* @returns True if rehydration is in progress
|
|
95
|
-
*/
|
|
96
|
-
isRehydrating(sessionName: string): boolean;
|
|
97
|
-
/**
|
|
98
|
-
* Get suspend information for a session.
|
|
99
|
-
*
|
|
100
|
-
* @param sessionName - PTY session name
|
|
101
|
-
* @returns Suspend info or null if not suspended
|
|
102
|
-
*/
|
|
103
|
-
getSuspendInfo(sessionName: string): SuspendedAgentInfo | null;
|
|
104
|
-
/**
|
|
105
|
-
* Remove an agent from the suspended map without rehydrating.
|
|
106
|
-
* Used when a suspended agent is manually stopped by the user.
|
|
107
|
-
*
|
|
108
|
-
* @param sessionName - PTY session name
|
|
109
|
-
*/
|
|
110
|
-
removeSuspended(sessionName: string): void;
|
|
111
|
-
/**
|
|
112
|
-
* Get the count of currently suspended agents.
|
|
113
|
-
*
|
|
114
|
-
* @returns Number of suspended agents
|
|
115
|
-
*/
|
|
116
|
-
getSuspendedCount(): number;
|
|
117
|
-
}
|
|
118
|
-
//# sourceMappingURL=agent-suspend.service.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent-suspend.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/agent-suspend.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAUH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAEhF;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAClC,uBAAuB;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,gCAAgC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iDAAiD;IACjD,WAAW,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,qBAAa,mBAAmB;IAC/B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAoC;IAC3D,OAAO,CAAC,MAAM,CAAkB;IAEhC,oDAAoD;IACpD,OAAO,CAAC,eAAe,CAA8C;IAErE,mEAAmE;IACnE,OAAO,CAAC,cAAc,CAA0B;IAEhD,kEAAkE;IAClE,OAAO,CAAC,wBAAwB,CAAyC;IAEzE,OAAO;IAIP;;;;OAIG;IACH,MAAM,CAAC,WAAW,IAAI,mBAAmB;IAOzC;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,IAAI;IAI5B;;;;;OAKG;IACH,eAAe,CAAC,mBAAmB,EAAE,wBAAwB,GAAG,IAAI;IAKpE;;;;;;;;;OASG;IACG,YAAY,CACjB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACV,OAAO,CAAC,OAAO,CAAC;IAoFnB;;;;;;OAMG;IACG,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAyH3D;;;;;OAKG;IACH,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAIzC;;;;;OAKG;IACH,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAI3C;;;;;OAKG;IACH,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;IAI9D;;;;;OAKG;IACH,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAI1C;;;;OAIG;IACH,iBAAiB,IAAI,MAAM;CAG3B"}
|
|
@@ -1,304 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agent Suspend Service
|
|
3
|
-
*
|
|
4
|
-
* Central coordinator for the agent suspend/rehydrate lifecycle.
|
|
5
|
-
* Suspends idle agents to free resources (RAM/disk) and transparently
|
|
6
|
-
* rehydrates them when the orchestrator sends a message, using
|
|
7
|
-
* Claude Code's `--resume` flag to restore conversation context.
|
|
8
|
-
*
|
|
9
|
-
* @module agent-suspend-service
|
|
10
|
-
*/
|
|
11
|
-
import { LoggerService } from '../core/logger.service.js';
|
|
12
|
-
import { StorageService } from '../core/storage.service.js';
|
|
13
|
-
import { CREWLY_CONSTANTS, AGENT_SUSPEND_CONSTANTS } from '../../constants.js';
|
|
14
|
-
import { PtyActivityTrackerService } from './pty-activity-tracker.service.js';
|
|
15
|
-
import { DiskCleanupService } from './disk-cleanup.service.js';
|
|
16
|
-
import { RuntimeExitMonitorService } from './runtime-exit-monitor.service.js';
|
|
17
|
-
import { getSessionBackendSync, getSessionStatePersistence } from '../session/index.js';
|
|
18
|
-
import { getTerminalGateway } from '../../websocket/terminal.gateway.js';
|
|
19
|
-
/**
|
|
20
|
-
* Manages suspension and rehydration of idle agents.
|
|
21
|
-
*
|
|
22
|
-
* Lifecycle:
|
|
23
|
-
* - `active → suspended`: Idle timeout triggers suspendAgent()
|
|
24
|
-
* - `suspended → starting → active`: Message triggers rehydrateAgent()
|
|
25
|
-
* - `suspended → inactive`: Manual stop by user
|
|
26
|
-
*/
|
|
27
|
-
export class AgentSuspendService {
|
|
28
|
-
static instance = null;
|
|
29
|
-
logger;
|
|
30
|
-
/** Map of sessionName → suspended agent metadata */
|
|
31
|
-
suspendedAgents = new Map();
|
|
32
|
-
/** Set of sessionNames currently being rehydrated (dedup guard) */
|
|
33
|
-
rehydratingSet = new Set();
|
|
34
|
-
/** Injected AgentRegistrationService (set via setDependencies) */
|
|
35
|
-
agentRegistrationService = null;
|
|
36
|
-
constructor() {
|
|
37
|
-
this.logger = LoggerService.getInstance().createComponentLogger('AgentSuspend');
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Get the singleton instance.
|
|
41
|
-
*
|
|
42
|
-
* @returns The AgentSuspendService singleton
|
|
43
|
-
*/
|
|
44
|
-
static getInstance() {
|
|
45
|
-
if (!AgentSuspendService.instance) {
|
|
46
|
-
AgentSuspendService.instance = new AgentSuspendService();
|
|
47
|
-
}
|
|
48
|
-
return AgentSuspendService.instance;
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Reset the singleton (for testing).
|
|
52
|
-
*/
|
|
53
|
-
static resetInstance() {
|
|
54
|
-
AgentSuspendService.instance = null;
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Inject the AgentRegistrationService dependency.
|
|
58
|
-
* Must be called during server startup before rehydration can work.
|
|
59
|
-
*
|
|
60
|
-
* @param registrationService - The AgentRegistrationService instance
|
|
61
|
-
*/
|
|
62
|
-
setDependencies(registrationService) {
|
|
63
|
-
this.agentRegistrationService = registrationService;
|
|
64
|
-
this.logger.info('AgentSuspendService dependencies set');
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Suspend an active agent, killing its process but preserving
|
|
68
|
-
* the Claude session ID so it can be rehydrated later.
|
|
69
|
-
*
|
|
70
|
-
* @param sessionName - PTY session name
|
|
71
|
-
* @param teamId - Team ID
|
|
72
|
-
* @param memberId - Member ID within the team
|
|
73
|
-
* @param role - Agent role
|
|
74
|
-
* @returns True if suspension was successful
|
|
75
|
-
*/
|
|
76
|
-
async suspendAgent(sessionName, teamId, memberId, role) {
|
|
77
|
-
// Guard: exempt roles
|
|
78
|
-
if (AGENT_SUSPEND_CONSTANTS.EXEMPT_ROLES.includes(role)) {
|
|
79
|
-
this.logger.warn('Cannot suspend exempt role', { sessionName, role });
|
|
80
|
-
return false;
|
|
81
|
-
}
|
|
82
|
-
// Guard: already suspended
|
|
83
|
-
if (this.suspendedAgents.has(sessionName)) {
|
|
84
|
-
this.logger.warn('Agent is already suspended', { sessionName });
|
|
85
|
-
return false;
|
|
86
|
-
}
|
|
87
|
-
try {
|
|
88
|
-
// Get Claude session ID from persistence before killing
|
|
89
|
-
let claudeSessionId;
|
|
90
|
-
try {
|
|
91
|
-
const persistence = getSessionStatePersistence();
|
|
92
|
-
claudeSessionId = persistence.getSessionId(sessionName);
|
|
93
|
-
}
|
|
94
|
-
catch {
|
|
95
|
-
this.logger.warn('Could not retrieve Claude session ID for suspend', { sessionName });
|
|
96
|
-
}
|
|
97
|
-
// Save suspend info
|
|
98
|
-
const info = {
|
|
99
|
-
sessionName,
|
|
100
|
-
teamId,
|
|
101
|
-
memberId,
|
|
102
|
-
role,
|
|
103
|
-
claudeSessionId,
|
|
104
|
-
suspendedAt: new Date().toISOString(),
|
|
105
|
-
};
|
|
106
|
-
this.suspendedAgents.set(sessionName, info);
|
|
107
|
-
// Stop runtime exit monitoring (don't trigger exit callbacks)
|
|
108
|
-
RuntimeExitMonitorService.getInstance().stopMonitoring(sessionName);
|
|
109
|
-
// Kill the PTY session
|
|
110
|
-
const backend = getSessionBackendSync();
|
|
111
|
-
if (backend && backend.sessionExists(sessionName)) {
|
|
112
|
-
await backend.killSession(sessionName);
|
|
113
|
-
}
|
|
114
|
-
// Clear PTY activity tracker
|
|
115
|
-
PtyActivityTrackerService.getInstance().clearSession(sessionName);
|
|
116
|
-
// Run disk cleanup
|
|
117
|
-
DiskCleanupService.getInstance().runSuspendCleanup();
|
|
118
|
-
// Update status to suspended
|
|
119
|
-
await StorageService.getInstance().updateAgentStatus(sessionName, CREWLY_CONSTANTS.AGENT_STATUSES.SUSPENDED);
|
|
120
|
-
// Broadcast status change to frontend
|
|
121
|
-
const terminalGateway = getTerminalGateway();
|
|
122
|
-
if (terminalGateway) {
|
|
123
|
-
terminalGateway.broadcastTeamMemberStatus({
|
|
124
|
-
teamId,
|
|
125
|
-
memberId,
|
|
126
|
-
sessionName,
|
|
127
|
-
agentStatus: CREWLY_CONSTANTS.AGENT_STATUSES.SUSPENDED,
|
|
128
|
-
});
|
|
129
|
-
}
|
|
130
|
-
this.logger.info('Agent suspended successfully', {
|
|
131
|
-
sessionName,
|
|
132
|
-
role,
|
|
133
|
-
claudeSessionId: claudeSessionId ? '(saved)' : '(none)',
|
|
134
|
-
});
|
|
135
|
-
return true;
|
|
136
|
-
}
|
|
137
|
-
catch (error) {
|
|
138
|
-
// Rollback: remove from suspended map on failure
|
|
139
|
-
this.suspendedAgents.delete(sessionName);
|
|
140
|
-
this.logger.error('Failed to suspend agent', {
|
|
141
|
-
sessionName,
|
|
142
|
-
error: error instanceof Error ? error.message : String(error),
|
|
143
|
-
});
|
|
144
|
-
return false;
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
/**
|
|
148
|
-
* Rehydrate a suspended agent by recreating its session.
|
|
149
|
-
* Uses the saved Claude session ID for `--resume` to restore context.
|
|
150
|
-
*
|
|
151
|
-
* @param sessionName - PTY session name of the suspended agent
|
|
152
|
-
* @returns True if rehydration was initiated (not necessarily complete)
|
|
153
|
-
*/
|
|
154
|
-
async rehydrateAgent(sessionName) {
|
|
155
|
-
// Guard: deduplicate concurrent calls
|
|
156
|
-
if (this.rehydratingSet.has(sessionName)) {
|
|
157
|
-
this.logger.debug('Rehydration already in progress', { sessionName });
|
|
158
|
-
return true;
|
|
159
|
-
}
|
|
160
|
-
const info = this.suspendedAgents.get(sessionName);
|
|
161
|
-
if (!info) {
|
|
162
|
-
this.logger.warn('Cannot rehydrate: agent not in suspended map', { sessionName });
|
|
163
|
-
return false;
|
|
164
|
-
}
|
|
165
|
-
this.rehydratingSet.add(sessionName);
|
|
166
|
-
try {
|
|
167
|
-
// Update status to starting
|
|
168
|
-
await StorageService.getInstance().updateAgentStatus(sessionName, CREWLY_CONSTANTS.AGENT_STATUSES.STARTING);
|
|
169
|
-
// Broadcast starting status
|
|
170
|
-
const terminalGateway = getTerminalGateway();
|
|
171
|
-
if (terminalGateway) {
|
|
172
|
-
terminalGateway.broadcastTeamMemberStatus({
|
|
173
|
-
teamId: info.teamId,
|
|
174
|
-
memberId: info.memberId,
|
|
175
|
-
sessionName,
|
|
176
|
-
agentStatus: CREWLY_CONSTANTS.AGENT_STATUSES.STARTING,
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
// Ensure session persistence has the saved claudeSessionId
|
|
180
|
-
// so createAgentSession's resume logic picks it up
|
|
181
|
-
if (info.claudeSessionId) {
|
|
182
|
-
try {
|
|
183
|
-
const persistence = getSessionStatePersistence();
|
|
184
|
-
const metadata = persistence.getSessionMetadata(sessionName);
|
|
185
|
-
if (metadata) {
|
|
186
|
-
persistence.updateSessionId(sessionName, info.claudeSessionId);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
catch {
|
|
190
|
-
this.logger.warn('Could not pre-set session ID for resume', { sessionName });
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
if (!this.agentRegistrationService) {
|
|
194
|
-
this.logger.error('Cannot rehydrate: AgentRegistrationService not set (call setDependencies first)');
|
|
195
|
-
return false;
|
|
196
|
-
}
|
|
197
|
-
// Recreate the agent session (this triggers the resume flow internally)
|
|
198
|
-
const result = await this.agentRegistrationService.createAgentSession({
|
|
199
|
-
sessionName,
|
|
200
|
-
role: info.role,
|
|
201
|
-
teamId: info.teamId,
|
|
202
|
-
memberId: info.memberId,
|
|
203
|
-
});
|
|
204
|
-
if (!result.success) {
|
|
205
|
-
this.logger.error('Rehydration createAgentSession failed', {
|
|
206
|
-
sessionName,
|
|
207
|
-
error: result.error,
|
|
208
|
-
});
|
|
209
|
-
// Revert to suspended status
|
|
210
|
-
await StorageService.getInstance().updateAgentStatus(sessionName, CREWLY_CONSTANTS.AGENT_STATUSES.SUSPENDED);
|
|
211
|
-
return false;
|
|
212
|
-
}
|
|
213
|
-
// Wait for agent to become active (poll with timeout)
|
|
214
|
-
const timeoutMs = AGENT_SUSPEND_CONSTANTS.REHYDRATION_TIMEOUT_MS;
|
|
215
|
-
const pollInterval = 2000;
|
|
216
|
-
const startTime = Date.now();
|
|
217
|
-
let active = false;
|
|
218
|
-
while (Date.now() - startTime < timeoutMs) {
|
|
219
|
-
const memberResult = await StorageService.getInstance().findMemberBySessionName(sessionName);
|
|
220
|
-
if (memberResult?.member.agentStatus === CREWLY_CONSTANTS.AGENT_STATUSES.ACTIVE) {
|
|
221
|
-
active = true;
|
|
222
|
-
break;
|
|
223
|
-
}
|
|
224
|
-
await new Promise(resolve => setTimeout(resolve, pollInterval));
|
|
225
|
-
}
|
|
226
|
-
if (active) {
|
|
227
|
-
// Success — remove from suspended map
|
|
228
|
-
this.suspendedAgents.delete(sessionName);
|
|
229
|
-
this.logger.info('Agent rehydrated successfully', { sessionName });
|
|
230
|
-
return true;
|
|
231
|
-
}
|
|
232
|
-
else {
|
|
233
|
-
this.logger.warn('Rehydration timed out waiting for active status', {
|
|
234
|
-
sessionName,
|
|
235
|
-
timeoutMs,
|
|
236
|
-
});
|
|
237
|
-
// Leave in suspended map — messages remain queued
|
|
238
|
-
return false;
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
catch (error) {
|
|
242
|
-
this.logger.error('Rehydration failed', {
|
|
243
|
-
sessionName,
|
|
244
|
-
error: error instanceof Error ? error.message : String(error),
|
|
245
|
-
});
|
|
246
|
-
// Revert to suspended status
|
|
247
|
-
try {
|
|
248
|
-
await StorageService.getInstance().updateAgentStatus(sessionName, CREWLY_CONSTANTS.AGENT_STATUSES.SUSPENDED);
|
|
249
|
-
}
|
|
250
|
-
catch {
|
|
251
|
-
// Best effort
|
|
252
|
-
}
|
|
253
|
-
return false;
|
|
254
|
-
}
|
|
255
|
-
finally {
|
|
256
|
-
this.rehydratingSet.delete(sessionName);
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
/**
|
|
260
|
-
* Check if a session is currently suspended.
|
|
261
|
-
*
|
|
262
|
-
* @param sessionName - PTY session name
|
|
263
|
-
* @returns True if the agent is suspended
|
|
264
|
-
*/
|
|
265
|
-
isSuspended(sessionName) {
|
|
266
|
-
return this.suspendedAgents.has(sessionName);
|
|
267
|
-
}
|
|
268
|
-
/**
|
|
269
|
-
* Check if a session is currently being rehydrated.
|
|
270
|
-
*
|
|
271
|
-
* @param sessionName - PTY session name
|
|
272
|
-
* @returns True if rehydration is in progress
|
|
273
|
-
*/
|
|
274
|
-
isRehydrating(sessionName) {
|
|
275
|
-
return this.rehydratingSet.has(sessionName);
|
|
276
|
-
}
|
|
277
|
-
/**
|
|
278
|
-
* Get suspend information for a session.
|
|
279
|
-
*
|
|
280
|
-
* @param sessionName - PTY session name
|
|
281
|
-
* @returns Suspend info or null if not suspended
|
|
282
|
-
*/
|
|
283
|
-
getSuspendInfo(sessionName) {
|
|
284
|
-
return this.suspendedAgents.get(sessionName) ?? null;
|
|
285
|
-
}
|
|
286
|
-
/**
|
|
287
|
-
* Remove an agent from the suspended map without rehydrating.
|
|
288
|
-
* Used when a suspended agent is manually stopped by the user.
|
|
289
|
-
*
|
|
290
|
-
* @param sessionName - PTY session name
|
|
291
|
-
*/
|
|
292
|
-
removeSuspended(sessionName) {
|
|
293
|
-
this.suspendedAgents.delete(sessionName);
|
|
294
|
-
}
|
|
295
|
-
/**
|
|
296
|
-
* Get the count of currently suspended agents.
|
|
297
|
-
*
|
|
298
|
-
* @returns Number of suspended agents
|
|
299
|
-
*/
|
|
300
|
-
getSuspendedCount() {
|
|
301
|
-
return this.suspendedAgents.size;
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
//# sourceMappingURL=agent-suspend.service.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent-suspend.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/agent-suspend.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Disk Cleanup Service
|
|
3
|
-
*
|
|
4
|
-
* Handles cleanup of temporary files when agents are suspended and
|
|
5
|
-
* system-level cleanup of Docker resources and log files.
|
|
6
|
-
*
|
|
7
|
-
* Agent cleanup targets:
|
|
8
|
-
* - `~/.claude/debug/` — debug log files
|
|
9
|
-
* - `~/.claude/shell-snapshots/` — shell state snapshots
|
|
10
|
-
*
|
|
11
|
-
* System cleanup targets:
|
|
12
|
-
* - Docker dangling images and build cache
|
|
13
|
-
* - Docker stopped containers and unused volumes
|
|
14
|
-
* - Crewly log files older than 7 days
|
|
15
|
-
*
|
|
16
|
-
* @module disk-cleanup-service
|
|
17
|
-
*/
|
|
18
|
-
/**
|
|
19
|
-
* Statistics returned after a cleanup run.
|
|
20
|
-
*/
|
|
21
|
-
export interface CleanupStats {
|
|
22
|
-
/** Number of debug log files deleted */
|
|
23
|
-
debugLogsDeleted: number;
|
|
24
|
-
/** Number of shell snapshot files deleted */
|
|
25
|
-
shellSnapshotsDeleted: number;
|
|
26
|
-
/** Total bytes freed (approximate) */
|
|
27
|
-
bytesFreed: number;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Statistics returned after a system-level cleanup run.
|
|
31
|
-
*/
|
|
32
|
-
export interface SystemCleanupStats {
|
|
33
|
-
/** Whether Docker cleanup was executed */
|
|
34
|
-
dockerCleaned: boolean;
|
|
35
|
-
/** Textual summary of Docker cleanup output */
|
|
36
|
-
dockerOutput: string;
|
|
37
|
-
/** Number of Crewly log files deleted */
|
|
38
|
-
crewlyLogsDeleted: number;
|
|
39
|
-
/** Total bytes freed from log cleanup (approximate) */
|
|
40
|
-
logBytesFreed: number;
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Handles disk cleanup on agent suspension.
|
|
44
|
-
*
|
|
45
|
-
* Targets the Claude Code data directories:
|
|
46
|
-
* - `~/.claude/debug/` — debug log files
|
|
47
|
-
* - `~/.claude/shell-snapshots/` — shell state snapshots
|
|
48
|
-
*/
|
|
49
|
-
export declare class DiskCleanupService {
|
|
50
|
-
private static instance;
|
|
51
|
-
private logger;
|
|
52
|
-
private claudeDir;
|
|
53
|
-
private constructor();
|
|
54
|
-
/**
|
|
55
|
-
* Get the singleton instance.
|
|
56
|
-
*
|
|
57
|
-
* @param claudeDir - Optional override for the Claude data directory (testing)
|
|
58
|
-
* @returns The DiskCleanupService singleton
|
|
59
|
-
*/
|
|
60
|
-
static getInstance(claudeDir?: string): DiskCleanupService;
|
|
61
|
-
/**
|
|
62
|
-
* Reset the singleton (for testing).
|
|
63
|
-
*/
|
|
64
|
-
static resetInstance(): void;
|
|
65
|
-
/**
|
|
66
|
-
* Purge debug log files older than the configured threshold.
|
|
67
|
-
*
|
|
68
|
-
* @param maxAgeHours - Maximum age in hours before deletion
|
|
69
|
-
* @returns Object with count of deleted files and bytes freed
|
|
70
|
-
*/
|
|
71
|
-
purgeDebugLogs(maxAgeHours?: number): {
|
|
72
|
-
deleted: number;
|
|
73
|
-
bytesFreed: number;
|
|
74
|
-
};
|
|
75
|
-
/**
|
|
76
|
-
* Clear shell snapshot files.
|
|
77
|
-
*
|
|
78
|
-
* @returns Object with count of deleted files and bytes freed
|
|
79
|
-
*/
|
|
80
|
-
clearShellSnapshots(): {
|
|
81
|
-
deleted: number;
|
|
82
|
-
bytesFreed: number;
|
|
83
|
-
};
|
|
84
|
-
/**
|
|
85
|
-
* Run the full suspend cleanup pipeline.
|
|
86
|
-
* Called by AgentSuspendService when suspending an agent.
|
|
87
|
-
*
|
|
88
|
-
* @returns Aggregate cleanup statistics
|
|
89
|
-
*/
|
|
90
|
-
runSuspendCleanup(): CleanupStats;
|
|
91
|
-
/**
|
|
92
|
-
* Delete files in a directory older than the given threshold.
|
|
93
|
-
*
|
|
94
|
-
* @param dirPath - Directory to scan
|
|
95
|
-
* @param maxAgeHours - Maximum file age in hours (0 = delete all)
|
|
96
|
-
* @returns Object with count and bytes
|
|
97
|
-
*/
|
|
98
|
-
private purgeOldFiles;
|
|
99
|
-
}
|
|
100
|
-
//# sourceMappingURL=disk-cleanup.service.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"disk-cleanup.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/disk-cleanup.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAeH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,wCAAwC;IACxC,gBAAgB,EAAE,MAAM,CAAC;IACzB,6CAA6C;IAC7C,qBAAqB,EAAE,MAAM,CAAC;IAC9B,sCAAsC;IACtC,UAAU,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAClC,0CAA0C;IAC1C,aAAa,EAAE,OAAO,CAAC;IACvB,+CAA+C;IAC/C,YAAY,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,uDAAuD;IACvD,aAAa,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;GAMG;AACH,qBAAa,kBAAkB;IAC9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAmC;IAC1D,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,SAAS,CAAS;IAE1B,OAAO;IAKP;;;;;OAKG;IACH,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,kBAAkB;IAO1D;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,IAAI;IAI5B;;;;;OAKG;IACH,cAAc,CACb,WAAW,GAAE,MAAwD,GACnE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;IAK1C;;;;OAIG;IACH,mBAAmB,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;IAM9D;;;;;OAKG;IACH,iBAAiB,IAAI,YAAY;IAqBjC;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;CA4CrB"}
|