crewly 1.20.197 → 1.20.199
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 +159 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +175 -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 +118 -3
- 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/system/usage.controller.d.ts +14 -0
- package/dist/backend/backend/src/controllers/system/usage.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/system/usage.controller.js +35 -1
- package/dist/backend/backend/src/controllers/system/usage.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 +113 -2
- 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 +23 -2
- 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 +110 -62
- 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/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/experiments/experiment.service.d.ts +15 -1
- package/dist/backend/backend/src/services/experiments/experiment.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/experiments/experiment.service.js +41 -12
- package/dist/backend/backend/src/services/experiments/experiment.service.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/message-queue.service.d.ts +21 -0
- package/dist/backend/backend/src/services/messaging/message-queue.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/message-queue.service.js +86 -11
- package/dist/backend/backend/src/services/messaging/message-queue.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +46 -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 +143 -22
- 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/monitoring/antigravity-usage-sync.service.d.ts +7 -0
- package/dist/backend/backend/src/services/monitoring/antigravity-usage-sync.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/monitoring/antigravity-usage-sync.service.js +21 -6
- package/dist/backend/backend/src/services/monitoring/antigravity-usage-sync.service.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.d.ts +49 -2
- package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.js +160 -55
- package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/codex-rollout-sync.service.d.ts +7 -0
- package/dist/backend/backend/src/services/monitoring/codex-rollout-sync.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/monitoring/codex-rollout-sync.service.js +21 -7
- package/dist/backend/backend/src/services/monitoring/codex-rollout-sync.service.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts +71 -1
- package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/monitoring/token-usage.service.js +193 -20
- package/dist/backend/backend/src/services/monitoring/token-usage.service.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-agent-identity.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-agent-identity.service.js +5 -0
- package/dist/backend/backend/src/services/slack/slack-agent-identity.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-cloud-config.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-cloud-config.service.js +5 -0
- package/dist/backend/backend/src/services/slack/slack-cloud-config.service.js.map +1 -1
- 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 +87 -4
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/backend/backend/src/services/spend/spend-cap.service.d.ts +24 -1
- package/dist/backend/backend/src/services/spend/spend-cap.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/spend/spend-cap.service.js +57 -0
- package/dist/backend/backend/src/services/spend/spend-cap.service.js.map +1 -1
- package/dist/backend/backend/src/services/spend/spend-cap.store.d.ts +37 -1
- package/dist/backend/backend/src/services/spend/spend-cap.store.d.ts.map +1 -1
- package/dist/backend/backend/src/services/spend/spend-cap.store.js +85 -14
- package/dist/backend/backend/src/services/spend/spend-cap.store.js.map +1 -1
- package/dist/backend/backend/src/services/spend/spend-cap.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/spend/spend-cap.wiring.js +1 -1
- package/dist/backend/backend/src/services/spend/spend-cap.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/trace/trace-store.d.ts +3 -1
- package/dist/backend/backend/src/services/trace/trace-store.d.ts.map +1 -1
- package/dist/backend/backend/src/services/trace/trace-store.js +27 -15
- package/dist/backend/backend/src/services/trace/trace-store.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/services/usage/usage-backfill.service.d.ts +96 -0
- package/dist/backend/backend/src/services/usage/usage-backfill.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage/usage-backfill.service.js +257 -0
- package/dist/backend/backend/src/services/usage/usage-backfill.service.js.map +1 -0
- package/dist/backend/backend/src/services/v3/kr-tracking.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/kr-tracking.service.js +2 -1
- package/dist/backend/backend/src/services/v3/kr-tracking.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/okr-cascade.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/okr-cascade.service.js +2 -1
- package/dist/backend/backend/src/services/v3/okr-cascade.service.js.map +1 -1
- package/dist/backend/backend/src/services/workflow/cron-task.service.d.ts +28 -0
- package/dist/backend/backend/src/services/workflow/cron-task.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/workflow/cron-task.service.js +121 -68
- package/dist/backend/backend/src/services/workflow/cron-task.service.js.map +1 -1
- 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/file-io.utils.d.ts +114 -1
- package/dist/backend/backend/src/utils/file-io.utils.d.ts.map +1 -1
- package/dist/backend/backend/src/utils/file-io.utils.js +236 -6
- package/dist/backend/backend/src/utils/file-io.utils.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 +159 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +175 -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/message-queue.service.d.ts +21 -0
- package/dist/cli/backend/src/services/messaging/message-queue.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/messaging/message-queue.service.js +86 -11
- package/dist/cli/backend/src/services/messaging/message-queue.service.js.map +1 -1
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +46 -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 +143 -22
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
- package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts +71 -1
- package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/monitoring/token-usage.service.js +193 -20
- package/dist/cli/backend/src/services/monitoring/token-usage.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-agent-identity.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-agent-identity.service.js +5 -0
- package/dist/cli/backend/src/services/slack/slack-agent-identity.service.js.map +1 -1
- 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 +87 -4
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/cli/backend/src/services/trace/trace-store.d.ts +3 -1
- package/dist/cli/backend/src/services/trace/trace-store.d.ts.map +1 -1
- package/dist/cli/backend/src/services/trace/trace-store.js +27 -15
- package/dist/cli/backend/src/services/trace/trace-store.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/services/v3/kr-tracking.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/v3/kr-tracking.service.js +2 -1
- package/dist/cli/backend/src/services/v3/kr-tracking.service.js.map +1 -1
- package/dist/cli/backend/src/services/workflow/cron-task.service.d.ts +28 -0
- package/dist/cli/backend/src/services/workflow/cron-task.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/workflow/cron-task.service.js +121 -68
- package/dist/cli/backend/src/services/workflow/cron-task.service.js.map +1 -1
- 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/file-io.utils.d.ts +114 -1
- package/dist/cli/backend/src/utils/file-io.utils.d.ts.map +1 -1
- package/dist/cli/backend/src/utils/file-io.utils.js +236 -6
- package/dist/cli/backend/src/utils/file-io.utils.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/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
|
@@ -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"}
|
|
@@ -1,149 +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
|
-
import * as fs from 'fs';
|
|
19
|
-
import * as path from 'path';
|
|
20
|
-
import * as os from 'os';
|
|
21
|
-
import { LoggerService } from '../core/logger.service.js';
|
|
22
|
-
import { AGENT_SUSPEND_CONSTANTS } from '../../constants.js';
|
|
23
|
-
/** Maximum age (in hours) for Crewly log files before cleanup */
|
|
24
|
-
const CREWLY_LOG_MAX_AGE_HOURS = 168; // 7 days
|
|
25
|
-
/** Timeout for Docker CLI commands in milliseconds */
|
|
26
|
-
const DOCKER_COMMAND_TIMEOUT_MS = 30_000;
|
|
27
|
-
/**
|
|
28
|
-
* Handles disk cleanup on agent suspension.
|
|
29
|
-
*
|
|
30
|
-
* Targets the Claude Code data directories:
|
|
31
|
-
* - `~/.claude/debug/` — debug log files
|
|
32
|
-
* - `~/.claude/shell-snapshots/` — shell state snapshots
|
|
33
|
-
*/
|
|
34
|
-
export class DiskCleanupService {
|
|
35
|
-
static instance = null;
|
|
36
|
-
logger;
|
|
37
|
-
claudeDir;
|
|
38
|
-
constructor(claudeDir) {
|
|
39
|
-
this.logger = LoggerService.getInstance().createComponentLogger('DiskCleanup');
|
|
40
|
-
this.claudeDir = claudeDir ?? path.join(os.homedir(), '.claude');
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Get the singleton instance.
|
|
44
|
-
*
|
|
45
|
-
* @param claudeDir - Optional override for the Claude data directory (testing)
|
|
46
|
-
* @returns The DiskCleanupService singleton
|
|
47
|
-
*/
|
|
48
|
-
static getInstance(claudeDir) {
|
|
49
|
-
if (!DiskCleanupService.instance) {
|
|
50
|
-
DiskCleanupService.instance = new DiskCleanupService(claudeDir);
|
|
51
|
-
}
|
|
52
|
-
return DiskCleanupService.instance;
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Reset the singleton (for testing).
|
|
56
|
-
*/
|
|
57
|
-
static resetInstance() {
|
|
58
|
-
DiskCleanupService.instance = null;
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Purge debug log files older than the configured threshold.
|
|
62
|
-
*
|
|
63
|
-
* @param maxAgeHours - Maximum age in hours before deletion
|
|
64
|
-
* @returns Object with count of deleted files and bytes freed
|
|
65
|
-
*/
|
|
66
|
-
purgeDebugLogs(maxAgeHours = AGENT_SUSPEND_CONSTANTS.DEBUG_LOG_MAX_AGE_HOURS) {
|
|
67
|
-
const debugDir = path.join(this.claudeDir, 'debug');
|
|
68
|
-
return this.purgeOldFiles(debugDir, maxAgeHours);
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Clear shell snapshot files.
|
|
72
|
-
*
|
|
73
|
-
* @returns Object with count of deleted files and bytes freed
|
|
74
|
-
*/
|
|
75
|
-
clearShellSnapshots() {
|
|
76
|
-
const snapshotsDir = path.join(this.claudeDir, 'shell-snapshots');
|
|
77
|
-
// Shell snapshots are ephemeral — clear all of them on suspend
|
|
78
|
-
return this.purgeOldFiles(snapshotsDir, 0);
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Run the full suspend cleanup pipeline.
|
|
82
|
-
* Called by AgentSuspendService when suspending an agent.
|
|
83
|
-
*
|
|
84
|
-
* @returns Aggregate cleanup statistics
|
|
85
|
-
*/
|
|
86
|
-
runSuspendCleanup() {
|
|
87
|
-
this.logger.info('Running suspend disk cleanup...');
|
|
88
|
-
const debugResult = this.purgeDebugLogs();
|
|
89
|
-
const snapshotResult = this.clearShellSnapshots();
|
|
90
|
-
const stats = {
|
|
91
|
-
debugLogsDeleted: debugResult.deleted,
|
|
92
|
-
shellSnapshotsDeleted: snapshotResult.deleted,
|
|
93
|
-
bytesFreed: debugResult.bytesFreed + snapshotResult.bytesFreed,
|
|
94
|
-
};
|
|
95
|
-
this.logger.info('Suspend disk cleanup complete', {
|
|
96
|
-
debugLogsDeleted: stats.debugLogsDeleted,
|
|
97
|
-
shellSnapshotsDeleted: stats.shellSnapshotsDeleted,
|
|
98
|
-
bytesFreedMB: (stats.bytesFreed / (1024 * 1024)).toFixed(2),
|
|
99
|
-
});
|
|
100
|
-
return stats;
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Delete files in a directory older than the given threshold.
|
|
104
|
-
*
|
|
105
|
-
* @param dirPath - Directory to scan
|
|
106
|
-
* @param maxAgeHours - Maximum file age in hours (0 = delete all)
|
|
107
|
-
* @returns Object with count and bytes
|
|
108
|
-
*/
|
|
109
|
-
purgeOldFiles(dirPath, maxAgeHours) {
|
|
110
|
-
let deleted = 0;
|
|
111
|
-
let bytesFreed = 0;
|
|
112
|
-
if (!fs.existsSync(dirPath)) {
|
|
113
|
-
return { deleted, bytesFreed };
|
|
114
|
-
}
|
|
115
|
-
const cutoffMs = maxAgeHours * 60 * 60 * 1000;
|
|
116
|
-
const now = Date.now();
|
|
117
|
-
try {
|
|
118
|
-
const entries = fs.readdirSync(dirPath);
|
|
119
|
-
for (const entry of entries) {
|
|
120
|
-
const filePath = path.join(dirPath, entry);
|
|
121
|
-
try {
|
|
122
|
-
const stat = fs.statSync(filePath);
|
|
123
|
-
if (!stat.isFile())
|
|
124
|
-
continue;
|
|
125
|
-
// When maxAgeHours is 0, delete all files regardless of timing precision
|
|
126
|
-
if (cutoffMs === 0 || (now - stat.mtimeMs) >= cutoffMs) {
|
|
127
|
-
fs.unlinkSync(filePath);
|
|
128
|
-
deleted++;
|
|
129
|
-
bytesFreed += stat.size;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
catch (fileErr) {
|
|
133
|
-
this.logger.debug('Failed to process file during cleanup', {
|
|
134
|
-
filePath,
|
|
135
|
-
error: fileErr instanceof Error ? fileErr.message : String(fileErr),
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
catch (err) {
|
|
141
|
-
this.logger.warn('Failed to read directory for cleanup', {
|
|
142
|
-
dirPath,
|
|
143
|
-
error: err instanceof Error ? err.message : String(err),
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
return { deleted, bytesFreed };
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
//# sourceMappingURL=disk-cleanup.service.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"disk-cleanup.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/disk-cleanup.service.ts"],"names":[],"mappings":"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"}
|