crewly 1.4.43 → 1.4.45

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.
Files changed (47) hide show
  1. package/config/constants.ts +4 -0
  2. package/config/skills/agent/core/schedule-check/execute.sh +43 -4
  3. package/config/skills/orchestrator/cancel-cron/execute.sh +13 -0
  4. package/config/skills/orchestrator/create-cron/execute.sh +26 -0
  5. package/config/skills/orchestrator/list-cron/execute.sh +17 -0
  6. package/config/skills/orchestrator/schedule-check/execute.sh +46 -7
  7. package/config/skills/orchestrator/update-cron/execute.sh +16 -0
  8. package/dist/backend/backend/src/constants.d.ts +2 -0
  9. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  10. package/dist/backend/backend/src/controllers/system/cron-task.controller.d.ts +25 -0
  11. package/dist/backend/backend/src/controllers/system/cron-task.controller.d.ts.map +1 -0
  12. package/dist/backend/backend/src/controllers/system/cron-task.controller.js +99 -0
  13. package/dist/backend/backend/src/controllers/system/cron-task.controller.js.map +1 -0
  14. package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
  15. package/dist/backend/backend/src/routes/api.routes.js +2 -0
  16. package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
  17. package/dist/backend/backend/src/routes/modules/cron-task.routes.d.ts +3 -0
  18. package/dist/backend/backend/src/routes/modules/cron-task.routes.d.ts.map +1 -0
  19. package/dist/backend/backend/src/routes/modules/cron-task.routes.js +8 -0
  20. package/dist/backend/backend/src/routes/modules/cron-task.routes.js.map +1 -0
  21. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +1 -0
  22. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  23. package/dist/backend/backend/src/services/agent/agent-registration.service.js +15 -5
  24. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  25. package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts +8 -0
  26. package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts.map +1 -1
  27. package/dist/backend/backend/src/services/agent/idle-detection.service.js +43 -13
  28. package/dist/backend/backend/src/services/agent/idle-detection.service.js.map +1 -1
  29. package/dist/backend/backend/src/services/workflow/cron-task.service.d.ts +114 -0
  30. package/dist/backend/backend/src/services/workflow/cron-task.service.d.ts.map +1 -0
  31. package/dist/backend/backend/src/services/workflow/cron-task.service.js +303 -0
  32. package/dist/backend/backend/src/services/workflow/cron-task.service.js.map +1 -0
  33. package/dist/backend/backend/src/types/cron-task.types.d.ts +63 -0
  34. package/dist/backend/backend/src/types/cron-task.types.d.ts.map +1 -0
  35. package/dist/backend/backend/src/types/cron-task.types.js +10 -0
  36. package/dist/backend/backend/src/types/cron-task.types.js.map +1 -0
  37. package/dist/backend/config/constants.d.ts +4 -0
  38. package/dist/backend/config/constants.d.ts.map +1 -1
  39. package/dist/backend/config/constants.js +4 -0
  40. package/dist/backend/config/constants.js.map +1 -1
  41. package/dist/cli/backend/src/constants.d.ts +2 -0
  42. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  43. package/dist/cli/config/constants.d.ts +4 -0
  44. package/dist/cli/config/constants.d.ts.map +1 -1
  45. package/dist/cli/config/constants.js +4 -0
  46. package/dist/cli/config/constants.js.map +1 -1
  47. package/package.json +1 -1
@@ -27,9 +27,18 @@ export class IdleDetectionService {
27
27
  static instance = null;
28
28
  logger;
29
29
  timer = null;
30
+ agentRegistrationService = null;
30
31
  constructor() {
31
32
  this.logger = LoggerService.getInstance().createComponentLogger('IdleDetection');
32
33
  }
34
+ /**
35
+ * Inject AgentRegistrationService for auto-stop capability.
36
+ *
37
+ * @param service - AgentRegistrationService instance
38
+ */
39
+ setAgentRegistrationService(service) {
40
+ this.agentRegistrationService = service;
41
+ }
33
42
  /**
34
43
  * Get the singleton instance.
35
44
  *
@@ -128,8 +137,8 @@ export class IdleDetectionService {
128
137
  if (!isActive && !isStarted) {
129
138
  continue;
130
139
  }
131
- // Skip exempt roles
132
- if (AGENT_SUSPEND_CONSTANTS.EXEMPT_ROLES.includes(member.role)) {
140
+ // Skip always-on roles (orchestrator, auditor)
141
+ if (AGENT_SUSPEND_CONSTANTS.ALWAYS_ON_ROLES.includes(member.role)) {
133
142
  continue;
134
143
  }
135
144
  // Skip agents already being suspended or rehydrated
@@ -187,20 +196,41 @@ export class IdleDetectionService {
187
196
  }
188
197
  }
189
198
  else {
190
- this.logger.info('Agent idle timeout reached, suspending', {
191
- sessionName: member.sessionName,
192
- role: member.role,
193
- idleMinutes: effectiveTimeoutMs / 60000,
194
- agentStatus: member.agentStatus,
195
- });
196
- try {
197
- await suspendService.suspendAgent(member.sessionName, team.id, member.id, member.role);
199
+ // Auto-stop: terminate idle agents to free resources
200
+ if (this.agentRegistrationService) {
201
+ this.logger.info('Agent idle timeout reached, stopping', {
202
+ sessionName: member.sessionName,
203
+ role: member.role,
204
+ idleMinutes: effectiveTimeoutMs / 60000,
205
+ agentStatus: member.agentStatus,
206
+ });
207
+ try {
208
+ await this.agentRegistrationService.terminateAgentSession(member.sessionName, member.role);
209
+ await StorageService.getInstance().updateAgentStatus(member.sessionName, CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE, 'idle_exit');
210
+ }
211
+ catch (err) {
212
+ this.logger.error('Failed to stop idle agent', {
213
+ sessionName: member.sessionName,
214
+ error: err instanceof Error ? err.message : String(err),
215
+ });
216
+ }
198
217
  }
199
- catch (err) {
200
- this.logger.error('Failed to suspend idle agent', {
218
+ else {
219
+ // Fallback: suspend if registration service not available
220
+ this.logger.info('Agent idle timeout reached, suspending (no registration service)', {
201
221
  sessionName: member.sessionName,
202
- error: err instanceof Error ? err.message : String(err),
222
+ role: member.role,
223
+ idleMinutes: effectiveTimeoutMs / 60000,
203
224
  });
225
+ try {
226
+ await suspendService.suspendAgent(member.sessionName, team.id, member.id, member.role);
227
+ }
228
+ catch (err) {
229
+ this.logger.error('Failed to suspend idle agent', {
230
+ sessionName: member.sessionName,
231
+ error: err instanceof Error ? err.message : String(err),
232
+ });
233
+ }
204
234
  }
205
235
  }
206
236
  }
@@ -1 +1 @@
1
- {"version":3,"file":"idle-detection.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/idle-detection.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,aAAa,EAAmB,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,2CAA2C,CAAC;AACnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D;;;;;;;GAOG;AACH,MAAM,OAAO,oBAAoB;IACxB,MAAM,CAAC,QAAQ,GAAgC,IAAI,CAAC;IACpD,MAAM,CAAkB;IACxB,KAAK,GAA0C,IAAI,CAAC;IAE5D;QACC,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC,qBAAqB,CAAC,eAAe,CAAC,CAAC;IAClF,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,WAAW;QACjB,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,CAAC;YACpC,oBAAoB,CAAC,QAAQ,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC5D,CAAC;QACD,OAAO,oBAAoB,CAAC,QAAQ,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,aAAa;QACnB,IAAI,oBAAoB,CAAC,QAAQ,EAAE,CAAC;YACnC,oBAAoB,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACtC,CAAC;QACD,oBAAoB,CAAC,QAAQ,GAAG,IAAI,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,KAAK;QACJ,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;YACnD,OAAO;QACR,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE;YACnD,eAAe,EAAE,uBAAuB,CAAC,sBAAsB;SAC/D,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC7B,IAAI,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;gBAC/B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE;oBAC5C,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACvD,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;QACJ,CAAC,EAAE,uBAAuB,CAAC,sBAAsB,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,IAAI;QACH,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;IACF,CAAC;IAED;;;;OAIG;IACH,SAAS;QACR,OAAO,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC;IAC5B,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,YAAY;QACjB,0CAA0C;QAC1C,IAAI,cAAsB,CAAC;QAC3B,IAAI,CAAC;YACJ,MAAM,QAAQ,GAAG,MAAM,kBAAkB,EAAE,CAAC,WAAW,EAAE,CAAC;YAC1D,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,uBAAuB,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACR,cAAc,GAAG,uBAAuB,CAAC,4BAA4B,CAAC;QACvE,CAAC;QAED,eAAe;QACf,IAAI,cAAc,IAAI,CAAC,EAAE,CAAC;YACzB,OAAO;QACR,CAAC;QAED,MAAM,SAAS,GAAG,cAAc,GAAG,EAAE,GAAG,IAAI,CAAC;QAC7C,MAAM,eAAe,GAAG,yBAAyB,CAAC,WAAW,EAAE,CAAC;QAChE,MAAM,cAAc,GAAG,mBAAmB,CAAC,WAAW,EAAE,CAAC;QAEzD,kCAAkC;QAClC,IAAI,KAAK,CAAC;QACV,IAAI,CAAC;YACJ,KAAK,GAAG,MAAM,cAAc,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAC;QACvD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE;gBACvD,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACvD,CAAC,CAAC;YACH,OAAO;QACR,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YAC1B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;gBACzC,gEAAgE;gBAChE,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,KAAK,gBAAgB,CAAC,cAAc,CAAC,MAAM,CAAC;gBAC/E,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,KAAK,gBAAgB,CAAC,cAAc,CAAC,OAAO,CAAC;gBACjF,IAAI,CAAC,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;oBAC7B,SAAS;gBACV,CAAC;gBAED,oBAAoB;gBACpB,IAAI,uBAAuB,CAAC,YAAY,CAAC,QAAQ,CAChD,MAAM,CAAC,IAA2D,CAClE,EAAE,CAAC;oBACH,SAAS;gBACV,CAAC;gBAED,oDAAoD;gBACpD,IAAI,cAAc,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,cAAc,CAAC,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;oBACxG,SAAS;gBACV,CAAC;gBAED,8EAA8E;gBAC9E,MAAM,kBAAkB,GAAG,SAAS;oBACnC,CAAC,CAAC,uBAAuB,CAAC,kCAAkC,GAAG,EAAE,GAAG,IAAI;oBACxE,CAAC,CAAC,SAAS,CAAC;gBAEb,gBAAgB;gBAChB,IAAI,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,EAAE,kBAAkB,CAAC,EAAE,CAAC;oBACvE,qEAAqE;oBACrE,kEAAkE;oBAClE,4DAA4D;oBAC5D,IAAI,CAAC;wBACJ,MAAM,aAAa,GAAG,MAAM,sBAAsB,CAAC,WAAW,EAAE;6BAC9D,0BAA0B,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;wBACjD,IAAI,aAAa,KAAK,aAAa,EAAE,CAAC;4BACrC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mEAAmE,EAAE;gCACtF,WAAW,EAAE,MAAM,CAAC,WAAW;gCAC/B,IAAI,EAAE,MAAM,CAAC,IAAI;6BACjB,CAAC,CAAC;4BACH,SAAS;wBACV,CAAC;oBACF,CAAC;oBAAC,MAAM,CAAC;wBACR,kEAAkE;oBACnE,CAAC;oBAED,mEAAmE;oBACnE,2DAA2D;oBAC3D,oCAAoC;oBACpC,IAAI,SAAS,EAAE,CAAC;wBACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gDAAgD,EAAE;4BAClE,WAAW,EAAE,MAAM,CAAC,WAAW;4BAC/B,IAAI,EAAE,MAAM,CAAC,IAAI;4BACjB,WAAW,EAAE,kBAAkB,GAAG,KAAK;yBACvC,CAAC,CAAC;wBAEH,IAAI,CAAC;4BACJ,gCAAgC;4BAChC,MAAM,OAAO,GAAG,qBAAqB,EAAE,CAAC;4BACxC,IAAI,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;gCAC1D,MAAM,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;4BAC/C,CAAC;4BAED,yBAAyB;4BACzB,yBAAyB,CAAC,WAAW,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;4BAEzE,mBAAmB;4BACnB,MAAM,cAAc,CAAC,WAAW,EAAE,CAAC,iBAAiB,CACnD,MAAM,CAAC,WAAW,EAClB,gBAAgB,CAAC,cAAc,CAAC,QAAe,CAC/C,CAAC;wBACH,CAAC;wBAAC,OAAO,GAAG,EAAE,CAAC;4BACd,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gDAAgD,EAAE;gCACnE,WAAW,EAAE,MAAM,CAAC,WAAW;gCAC/B,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;6BACvD,CAAC,CAAC;wBACJ,CAAC;oBACF,CAAC;yBAAM,CAAC;wBACP,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE;4BAC1D,WAAW,EAAE,MAAM,CAAC,WAAW;4BAC/B,IAAI,EAAE,MAAM,CAAC,IAAI;4BACjB,WAAW,EAAE,kBAAkB,GAAG,KAAK;4BACvC,WAAW,EAAE,MAAM,CAAC,WAAW;yBAC/B,CAAC,CAAC;wBAEH,IAAI,CAAC;4BACJ,MAAM,cAAc,CAAC,YAAY,CAChC,MAAM,CAAC,WAAW,EAClB,IAAI,CAAC,EAAE,EACP,MAAM,CAAC,EAAE,EACT,MAAM,CAAC,IAAI,CACX,CAAC;wBACH,CAAC;wBAAC,OAAO,GAAG,EAAE,CAAC;4BACd,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE;gCACjD,WAAW,EAAE,MAAM,CAAC,WAAW;gCAC/B,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;6BACvD,CAAC,CAAC;wBACJ,CAAC;oBACF,CAAC;gBACF,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC"}
1
+ {"version":3,"file":"idle-detection.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/idle-detection.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Cron Task Service
3
+ *
4
+ * Manages user-defined recurring tasks that run on cron schedules.
5
+ * Unlike scheduled messages (agent-created/cancellable), cron tasks
6
+ * can only be cancelled by user or orchestrator.
7
+ *
8
+ * Storage: ~/.crewly/cron-tasks.json
9
+ *
10
+ * @module services/workflow/cron-task.service
11
+ */
12
+ import type { CronTask, CreateCronTaskRequest, UpdateCronTaskRequest } from '../../types/cron-task.types.js';
13
+ /**
14
+ * Parse a cron expression and calculate the next run time.
15
+ * Supports standard 5-field cron: minute hour day-of-month month day-of-week.
16
+ *
17
+ * @param cronExpression - Standard 5-field cron expression
18
+ * @param timezone - IANA timezone
19
+ * @param after - Calculate next run after this date (defaults to now)
20
+ * @returns ISO string of next run time
21
+ */
22
+ export declare function getNextRunTime(cronExpression: string, timezone: string, after?: Date): string;
23
+ /**
24
+ * Service for managing cron tasks.
25
+ */
26
+ export declare class CronTaskService {
27
+ private static instance;
28
+ private logger;
29
+ private storeFile;
30
+ private timer;
31
+ private executionCallback;
32
+ constructor(crewlyHome?: string);
33
+ /**
34
+ * Get singleton instance.
35
+ */
36
+ static getInstance(): CronTaskService;
37
+ /**
38
+ * Reset singleton (for testing).
39
+ */
40
+ static resetInstance(): void;
41
+ /**
42
+ * Set the callback invoked when a cron task is due for execution.
43
+ * The callback receives the task and should delegate it to the target agent.
44
+ *
45
+ * @param callback - Async function that executes a cron task
46
+ */
47
+ setExecutionCallback(callback: (task: CronTask) => Promise<void>): void;
48
+ /**
49
+ * Start the cron task evaluation loop.
50
+ * Checks every minute for tasks whose nextRunAt has passed.
51
+ */
52
+ start(): void;
53
+ /**
54
+ * Stop the cron task evaluation loop.
55
+ */
56
+ stop(): void;
57
+ /**
58
+ * Whether the service is running.
59
+ */
60
+ isRunning(): boolean;
61
+ /**
62
+ * Create a new cron task.
63
+ *
64
+ * @param request - Cron task creation parameters
65
+ * @returns The created cron task
66
+ */
67
+ create(request: CreateCronTaskRequest): Promise<CronTask>;
68
+ /**
69
+ * List all cron tasks, optionally filtered.
70
+ *
71
+ * @param filter - Optional filter criteria
72
+ * @returns Array of matching cron tasks
73
+ */
74
+ list(filter?: {
75
+ targetAgent?: string;
76
+ enabled?: boolean;
77
+ }): Promise<CronTask[]>;
78
+ /**
79
+ * Get a single cron task by ID.
80
+ *
81
+ * @param id - Cron task ID
82
+ * @returns The cron task or null
83
+ */
84
+ get(id: string): Promise<CronTask | null>;
85
+ /**
86
+ * Update a cron task. Agents can update description/expression/enabled
87
+ * but cannot delete.
88
+ *
89
+ * @param id - Cron task ID
90
+ * @param updates - Fields to update
91
+ * @returns Updated task or null if not found
92
+ */
93
+ update(id: string, updates: UpdateCronTaskRequest): Promise<CronTask | null>;
94
+ /**
95
+ * Delete a cron task. Only user/orchestrator should call this.
96
+ *
97
+ * @param id - Cron task ID
98
+ * @returns true if deleted, false if not found
99
+ */
100
+ delete(id: string): Promise<boolean>;
101
+ /**
102
+ * Evaluate all enabled tasks and execute those whose nextRunAt has passed.
103
+ */
104
+ evaluateTasks(): Promise<void>;
105
+ /**
106
+ * Load the cron task store from disk.
107
+ */
108
+ private loadStore;
109
+ /**
110
+ * Save the cron task store to disk.
111
+ */
112
+ private saveStore;
113
+ }
114
+ //# sourceMappingURL=cron-task.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron-task.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/workflow/cron-task.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,OAAO,KAAK,EACX,QAAQ,EAER,qBAAqB,EACrB,qBAAqB,EACrB,MAAM,gCAAgC,CAAC;AAOxC;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,IAAI,GAAG,MAAM,CA0C7F;AAED;;GAEG;AACH,qBAAa,eAAe;IAC3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAgC;IACvD,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,iBAAiB,CAAoD;gBAEjE,UAAU,CAAC,EAAE,MAAM;IAM/B;;OAEG;IACH,MAAM,CAAC,WAAW,IAAI,eAAe;IAOrC;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,IAAI;IAO5B;;;;;OAKG;IACH,oBAAoB,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAIvE;;;OAGG;IACH,KAAK,IAAI,IAAI;IAgBb;;OAEG;IACH,IAAI,IAAI,IAAI;IAQZ;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;;;;OAKG;IACG,MAAM,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,QAAQ,CAAC;IA0B/D;;;;;OAKG;IACG,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAcrF;;;;;OAKG;IACG,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAK/C;;;;;;;OAOG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAyBlF;;;;;OAKG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW1C;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAwCpC;;OAEG;YACW,SAAS;IASvB;;OAEG;YACW,SAAS;CAKvB"}
@@ -0,0 +1,303 @@
1
+ /**
2
+ * Cron Task Service
3
+ *
4
+ * Manages user-defined recurring tasks that run on cron schedules.
5
+ * Unlike scheduled messages (agent-created/cancellable), cron tasks
6
+ * can only be cancelled by user or orchestrator.
7
+ *
8
+ * Storage: ~/.crewly/cron-tasks.json
9
+ *
10
+ * @module services/workflow/cron-task.service
11
+ */
12
+ import * as os from 'os';
13
+ import * as path from 'path';
14
+ import { readFile, writeFile, mkdir } from 'fs/promises';
15
+ import { v4 as uuidv4 } from 'uuid';
16
+ import { LoggerService } from '../core/logger.service.js';
17
+ /**
18
+ * Check interval for cron task evaluation (60 seconds).
19
+ */
20
+ const CRON_CHECK_INTERVAL_MS = 60_000;
21
+ /**
22
+ * Parse a cron expression and calculate the next run time.
23
+ * Supports standard 5-field cron: minute hour day-of-month month day-of-week.
24
+ *
25
+ * @param cronExpression - Standard 5-field cron expression
26
+ * @param timezone - IANA timezone
27
+ * @param after - Calculate next run after this date (defaults to now)
28
+ * @returns ISO string of next run time
29
+ */
30
+ export function getNextRunTime(cronExpression, timezone, after) {
31
+ const now = after || new Date();
32
+ const parts = cronExpression.trim().split(/\s+/);
33
+ if (parts.length !== 5) {
34
+ throw new Error(`Invalid cron expression: expected 5 fields, got ${parts.length}`);
35
+ }
36
+ const [minuteSpec, hourSpec] = parts;
37
+ // Simple implementation: parse minute and hour for common daily/hourly crons
38
+ // For complex expressions, iterate minute-by-minute up to 48 hours
39
+ const minute = minuteSpec === '*' ? -1 : parseInt(minuteSpec, 10);
40
+ const hour = hourSpec === '*' ? -1 : parseInt(hourSpec, 10);
41
+ const candidate = new Date(now.getTime());
42
+ // Advance by 1 minute minimum to avoid re-triggering
43
+ candidate.setSeconds(0, 0);
44
+ candidate.setMinutes(candidate.getMinutes() + 1);
45
+ // Try up to 48 hours of minutes
46
+ for (let i = 0; i < 48 * 60; i++) {
47
+ const m = candidate.getMinutes();
48
+ const h = candidate.getHours();
49
+ const dayOfWeek = candidate.getDay(); // 0=Sun
50
+ const dayOfMonth = candidate.getDate();
51
+ const month = candidate.getMonth() + 1;
52
+ const minuteMatch = minute === -1 || m === minute;
53
+ const hourMatch = hour === -1 || h === hour;
54
+ const domMatch = parts[2] === '*' || parseInt(parts[2], 10) === dayOfMonth;
55
+ const monthMatch = parts[3] === '*' || parseInt(parts[3], 10) === month;
56
+ const dowMatch = parts[4] === '*' || parseInt(parts[4], 10) === dayOfWeek;
57
+ if (minuteMatch && hourMatch && domMatch && monthMatch && dowMatch) {
58
+ return candidate.toISOString();
59
+ }
60
+ candidate.setMinutes(candidate.getMinutes() + 1);
61
+ }
62
+ // Fallback: 24 hours from now
63
+ return new Date(now.getTime() + 24 * 60 * 60 * 1000).toISOString();
64
+ }
65
+ /**
66
+ * Service for managing cron tasks.
67
+ */
68
+ export class CronTaskService {
69
+ static instance = null;
70
+ logger;
71
+ storeFile;
72
+ timer = null;
73
+ executionCallback = null;
74
+ constructor(crewlyHome) {
75
+ this.logger = LoggerService.getInstance().createComponentLogger('CronTaskService');
76
+ const home = crewlyHome || path.join(os.homedir(), '.crewly');
77
+ this.storeFile = path.join(home, 'cron-tasks.json');
78
+ }
79
+ /**
80
+ * Get singleton instance.
81
+ */
82
+ static getInstance() {
83
+ if (!CronTaskService.instance) {
84
+ CronTaskService.instance = new CronTaskService();
85
+ }
86
+ return CronTaskService.instance;
87
+ }
88
+ /**
89
+ * Reset singleton (for testing).
90
+ */
91
+ static resetInstance() {
92
+ if (CronTaskService.instance) {
93
+ CronTaskService.instance.stop();
94
+ }
95
+ CronTaskService.instance = null;
96
+ }
97
+ /**
98
+ * Set the callback invoked when a cron task is due for execution.
99
+ * The callback receives the task and should delegate it to the target agent.
100
+ *
101
+ * @param callback - Async function that executes a cron task
102
+ */
103
+ setExecutionCallback(callback) {
104
+ this.executionCallback = callback;
105
+ }
106
+ /**
107
+ * Start the cron task evaluation loop.
108
+ * Checks every minute for tasks whose nextRunAt has passed.
109
+ */
110
+ start() {
111
+ if (this.timer)
112
+ return;
113
+ this.logger.info('Starting cron task service', { intervalMs: CRON_CHECK_INTERVAL_MS });
114
+ this.timer = setInterval(async () => {
115
+ try {
116
+ await this.evaluateTasks();
117
+ }
118
+ catch (error) {
119
+ this.logger.error('Cron task evaluation error', {
120
+ error: error instanceof Error ? error.message : String(error),
121
+ });
122
+ }
123
+ }, CRON_CHECK_INTERVAL_MS);
124
+ }
125
+ /**
126
+ * Stop the cron task evaluation loop.
127
+ */
128
+ stop() {
129
+ if (this.timer) {
130
+ clearInterval(this.timer);
131
+ this.timer = null;
132
+ this.logger.info('Stopped cron task service');
133
+ }
134
+ }
135
+ /**
136
+ * Whether the service is running.
137
+ */
138
+ isRunning() {
139
+ return this.timer !== null;
140
+ }
141
+ /**
142
+ * Create a new cron task.
143
+ *
144
+ * @param request - Cron task creation parameters
145
+ * @returns The created cron task
146
+ */
147
+ async create(request) {
148
+ const timezone = request.timezone || 'UTC';
149
+ const nextRunAt = getNextRunTime(request.cronExpression, timezone);
150
+ const task = {
151
+ id: `cron-${uuidv4().slice(0, 8)}`,
152
+ cronExpression: request.cronExpression,
153
+ timezone,
154
+ targetAgent: request.targetAgent,
155
+ targetTeamId: request.targetTeamId,
156
+ taskDescription: request.taskDescription,
157
+ createdBy: request.createdBy || 'user',
158
+ createdAt: new Date().toISOString(),
159
+ enabled: true,
160
+ lastRunAt: null,
161
+ nextRunAt,
162
+ };
163
+ const store = await this.loadStore();
164
+ store.tasks.push(task);
165
+ await this.saveStore(store);
166
+ this.logger.info('Cron task created', { id: task.id, cron: task.cronExpression, target: task.targetAgent });
167
+ return task;
168
+ }
169
+ /**
170
+ * List all cron tasks, optionally filtered.
171
+ *
172
+ * @param filter - Optional filter criteria
173
+ * @returns Array of matching cron tasks
174
+ */
175
+ async list(filter) {
176
+ const store = await this.loadStore();
177
+ let tasks = store.tasks;
178
+ if (filter?.targetAgent) {
179
+ tasks = tasks.filter(t => t.targetAgent === filter.targetAgent);
180
+ }
181
+ if (filter?.enabled !== undefined) {
182
+ tasks = tasks.filter(t => t.enabled === filter.enabled);
183
+ }
184
+ return tasks;
185
+ }
186
+ /**
187
+ * Get a single cron task by ID.
188
+ *
189
+ * @param id - Cron task ID
190
+ * @returns The cron task or null
191
+ */
192
+ async get(id) {
193
+ const store = await this.loadStore();
194
+ return store.tasks.find(t => t.id === id) || null;
195
+ }
196
+ /**
197
+ * Update a cron task. Agents can update description/expression/enabled
198
+ * but cannot delete.
199
+ *
200
+ * @param id - Cron task ID
201
+ * @param updates - Fields to update
202
+ * @returns Updated task or null if not found
203
+ */
204
+ async update(id, updates) {
205
+ const store = await this.loadStore();
206
+ const task = store.tasks.find(t => t.id === id);
207
+ if (!task)
208
+ return null;
209
+ if (updates.cronExpression !== undefined) {
210
+ task.cronExpression = updates.cronExpression;
211
+ task.nextRunAt = getNextRunTime(updates.cronExpression, task.timezone);
212
+ }
213
+ if (updates.timezone !== undefined) {
214
+ task.timezone = updates.timezone;
215
+ task.nextRunAt = getNextRunTime(task.cronExpression, task.timezone);
216
+ }
217
+ if (updates.taskDescription !== undefined) {
218
+ task.taskDescription = updates.taskDescription;
219
+ }
220
+ if (updates.enabled !== undefined) {
221
+ task.enabled = updates.enabled;
222
+ }
223
+ await this.saveStore(store);
224
+ this.logger.info('Cron task updated', { id, updates: Object.keys(updates) });
225
+ return task;
226
+ }
227
+ /**
228
+ * Delete a cron task. Only user/orchestrator should call this.
229
+ *
230
+ * @param id - Cron task ID
231
+ * @returns true if deleted, false if not found
232
+ */
233
+ async delete(id) {
234
+ const store = await this.loadStore();
235
+ const index = store.tasks.findIndex(t => t.id === id);
236
+ if (index === -1)
237
+ return false;
238
+ store.tasks.splice(index, 1);
239
+ await this.saveStore(store);
240
+ this.logger.info('Cron task deleted', { id });
241
+ return true;
242
+ }
243
+ /**
244
+ * Evaluate all enabled tasks and execute those whose nextRunAt has passed.
245
+ */
246
+ async evaluateTasks() {
247
+ const store = await this.loadStore();
248
+ const now = new Date();
249
+ let updated = false;
250
+ for (const task of store.tasks) {
251
+ if (!task.enabled || !task.nextRunAt)
252
+ continue;
253
+ const nextRun = new Date(task.nextRunAt);
254
+ if (nextRun > now)
255
+ continue;
256
+ // Task is due — execute it
257
+ this.logger.info('Cron task due, executing', {
258
+ id: task.id,
259
+ target: task.targetAgent,
260
+ nextRunAt: task.nextRunAt,
261
+ });
262
+ try {
263
+ if (this.executionCallback) {
264
+ await this.executionCallback(task);
265
+ }
266
+ }
267
+ catch (error) {
268
+ this.logger.error('Cron task execution failed', {
269
+ id: task.id,
270
+ error: error instanceof Error ? error.message : String(error),
271
+ });
272
+ }
273
+ // Update run times regardless of execution success
274
+ task.lastRunAt = now.toISOString();
275
+ task.nextRunAt = getNextRunTime(task.cronExpression, task.timezone, now);
276
+ updated = true;
277
+ }
278
+ if (updated) {
279
+ await this.saveStore(store);
280
+ }
281
+ }
282
+ /**
283
+ * Load the cron task store from disk.
284
+ */
285
+ async loadStore() {
286
+ try {
287
+ const data = await readFile(this.storeFile, 'utf-8');
288
+ return JSON.parse(data);
289
+ }
290
+ catch {
291
+ return { tasks: [] };
292
+ }
293
+ }
294
+ /**
295
+ * Save the cron task store to disk.
296
+ */
297
+ async saveStore(store) {
298
+ const dir = path.dirname(this.storeFile);
299
+ await mkdir(dir, { recursive: true });
300
+ await writeFile(this.storeFile, JSON.stringify(store, null, 2), 'utf-8');
301
+ }
302
+ }
303
+ //# sourceMappingURL=cron-task.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron-task.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/workflow/cron-task.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Cron Task types — user-defined recurring tasks that agents cannot cancel.
3
+ *
4
+ * Part of the three-layer scheduling model:
5
+ * 1. Scheduled Messages — agent-created, agent-cancellable
6
+ * 2. Cron Tasks — user-created, only user/orchestrator can cancel
7
+ * 3. Heartbeat — reserved for always-on roles (orchestrator/auditor)
8
+ */
9
+ /**
10
+ * A cron task definition stored in ~/.crewly/cron-tasks.json.
11
+ */
12
+ export interface CronTask {
13
+ /** Unique identifier (cron-xxxx) */
14
+ id: string;
15
+ /** Standard cron expression (e.g. "0 9 * * *" = daily at 9am) */
16
+ cronExpression: string;
17
+ /** IANA timezone for cron evaluation (e.g. "Asia/Shanghai") */
18
+ timezone: string;
19
+ /** Target agent session name to receive the task */
20
+ targetAgent: string;
21
+ /** Team ID the target agent belongs to */
22
+ targetTeamId: string;
23
+ /** Task description to send to the agent */
24
+ taskDescription: string;
25
+ /** Who created this cron task */
26
+ createdBy: 'user' | 'orchestrator';
27
+ /** ISO timestamp when created */
28
+ createdAt: string;
29
+ /** Whether this cron task is active */
30
+ enabled: boolean;
31
+ /** ISO timestamp of last execution (null if never run) */
32
+ lastRunAt: string | null;
33
+ /** ISO timestamp of next scheduled run */
34
+ nextRunAt: string | null;
35
+ }
36
+ /**
37
+ * Storage format for cron-tasks.json.
38
+ */
39
+ export interface CronTaskStore {
40
+ tasks: CronTask[];
41
+ }
42
+ /**
43
+ * Request body for creating a cron task.
44
+ */
45
+ export interface CreateCronTaskRequest {
46
+ cronExpression: string;
47
+ timezone?: string;
48
+ targetAgent: string;
49
+ targetTeamId: string;
50
+ taskDescription: string;
51
+ createdBy?: 'user' | 'orchestrator';
52
+ }
53
+ /**
54
+ * Request body for updating a cron task.
55
+ * Agents can update taskDescription and cronExpression but not delete.
56
+ */
57
+ export interface UpdateCronTaskRequest {
58
+ cronExpression?: string;
59
+ timezone?: string;
60
+ taskDescription?: string;
61
+ enabled?: boolean;
62
+ }
63
+ //# sourceMappingURL=cron-task.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron-task.types.d.ts","sourceRoot":"","sources":["../../../../../backend/src/types/cron-task.types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;GAEG;AACH,MAAM,WAAW,QAAQ;IACxB,oCAAoC;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,iEAAiE;IACjE,cAAc,EAAE,MAAM,CAAC;IACvB,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,CAAC;IACjB,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,0CAA0C;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,eAAe,EAAE,MAAM,CAAC;IACxB,iCAAiC;IACjC,SAAS,EAAE,MAAM,GAAG,cAAc,CAAC;IACnC,iCAAiC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,0DAA0D;IAC1D,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,0CAA0C;IAC1C,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,KAAK,EAAE,QAAQ,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC;CACpC;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Cron Task types — user-defined recurring tasks that agents cannot cancel.
3
+ *
4
+ * Part of the three-layer scheduling model:
5
+ * 1. Scheduled Messages — agent-created, agent-cancellable
6
+ * 2. Cron Tasks — user-created, only user/orchestrator can cancel
7
+ * 3. Heartbeat — reserved for always-on roles (orchestrator/auditor)
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=cron-task.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron-task.types.js","sourceRoot":"","sources":["../../../../../backend/src/types/cron-task.types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -765,6 +765,10 @@ export declare const AGENT_SUSPEND_CONSTANTS: {
765
765
  readonly EXEMPT_ROLES: readonly ["orchestrator"];
766
766
  /** Idle timeout for agents stuck in 'started' status (minutes) */
767
767
  readonly STARTED_AGENT_IDLE_TIMEOUT_MINUTES: 15;
768
+ /** Roles that should never be auto-stopped (always-on) */
769
+ readonly ALWAYS_ON_ROLES: readonly ["orchestrator", "auditor"];
770
+ /** Idle timeout in ms before a worker agent is stopped (default 10 min) */
771
+ readonly AGENT_IDLE_STOP_TIMEOUT_MS: 600000;
768
772
  };
769
773
  /**
770
774
  * Server process configuration for Node.js heap sizing and resource management.