crewly 1.4.44 → 1.4.46
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config/constants.ts +4 -0
- package/config/skills/orchestrator/cancel-cron/execute.sh +13 -0
- package/config/skills/orchestrator/create-cron/execute.sh +26 -0
- package/config/skills/orchestrator/list-cron/execute.sh +17 -0
- package/config/skills/orchestrator/update-cron/execute.sh +16 -0
- package/dist/backend/backend/src/constants.d.ts +2 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts +16 -0
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.js +9 -0
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/system/cron-task.controller.d.ts +25 -0
- package/dist/backend/backend/src/controllers/system/cron-task.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/system/cron-task.controller.js +99 -0
- package/dist/backend/backend/src/controllers/system/cron-task.controller.js.map +1 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +7 -0
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.js +2 -0
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/routes/modules/cron-task.routes.d.ts +3 -0
- package/dist/backend/backend/src/routes/modules/cron-task.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/routes/modules/cron-task.routes.js +8 -0
- package/dist/backend/backend/src/routes/modules/cron-task.routes.js.map +1 -0
- package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts +8 -0
- package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/idle-detection.service.js +43 -13
- package/dist/backend/backend/src/services/agent/idle-detection.service.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts +27 -0
- package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-client.service.js +79 -0
- package/dist/backend/backend/src/services/cloud/cloud-client.service.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-initializer.d.ts +33 -0
- package/dist/backend/backend/src/services/cloud/cloud-initializer.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-initializer.js +68 -0
- package/dist/backend/backend/src/services/cloud/cloud-initializer.js.map +1 -0
- package/dist/backend/backend/src/services/workflow/cron-task.service.d.ts +114 -0
- package/dist/backend/backend/src/services/workflow/cron-task.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/workflow/cron-task.service.js +303 -0
- package/dist/backend/backend/src/services/workflow/cron-task.service.js.map +1 -0
- package/dist/backend/backend/src/types/cron-task.types.d.ts +63 -0
- package/dist/backend/backend/src/types/cron-task.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/cron-task.types.js +10 -0
- package/dist/backend/backend/src/types/cron-task.types.js.map +1 -0
- package/dist/backend/config/constants.d.ts +4 -0
- package/dist/backend/config/constants.d.ts.map +1 -1
- package/dist/backend/config/constants.js +4 -0
- package/dist/backend/config/constants.js.map +1 -1
- package/dist/cli/backend/src/constants.d.ts +2 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/config/constants.d.ts +4 -0
- package/dist/cli/config/constants.d.ts.map +1 -1
- package/dist/cli/config/constants.js +4 -0
- package/dist/cli/config/constants.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloud-client.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/cloud/cloud-client.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,aAAa,EAAwB,MAAM,2BAA2B,CAAC;AAChF,OAAO,EACL,eAAe,GAGhB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"cloud-client.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/cloud/cloud-client.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloud Initializer
|
|
3
|
+
*
|
|
4
|
+
* Handles automatic Cloud connection restoration on application startup.
|
|
5
|
+
* Reads persisted credentials from ~/.crewly/cloud/config.json and
|
|
6
|
+
* calls CloudClientService.connectLocal() to restore the connection.
|
|
7
|
+
*
|
|
8
|
+
* Non-blocking: failures are logged but do not prevent startup.
|
|
9
|
+
*
|
|
10
|
+
* @module services/cloud/cloud-initializer
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Result of the cloud initialization attempt.
|
|
14
|
+
*/
|
|
15
|
+
export interface CloudInitResult {
|
|
16
|
+
/** Whether initialization was attempted (config file exists) */
|
|
17
|
+
attempted: boolean;
|
|
18
|
+
/** Whether initialization succeeded */
|
|
19
|
+
success: boolean;
|
|
20
|
+
/** Error message if failed */
|
|
21
|
+
error?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Attempt to restore Cloud connection from persisted config.
|
|
25
|
+
*
|
|
26
|
+
* Called during backend startup. If ~/.crewly/cloud/config.json exists
|
|
27
|
+
* and contains valid credentials, calls connectLocal() to restore state.
|
|
28
|
+
* Also triggers relay auto-connect for device discovery.
|
|
29
|
+
*
|
|
30
|
+
* @returns Result indicating whether connection was restored
|
|
31
|
+
*/
|
|
32
|
+
export declare function initializeCloudIfConfigured(): Promise<CloudInitResult>;
|
|
33
|
+
//# sourceMappingURL=cloud-initializer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-initializer.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/cloud/cloud-initializer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAQH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC/B,gEAAgE;IAChE,SAAS,EAAE,OAAO,CAAC;IACnB,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;GAQG;AACH,wBAAsB,2BAA2B,IAAI,OAAO,CAAC,eAAe,CAAC,CAkD5E"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloud Initializer
|
|
3
|
+
*
|
|
4
|
+
* Handles automatic Cloud connection restoration on application startup.
|
|
5
|
+
* Reads persisted credentials from ~/.crewly/cloud/config.json and
|
|
6
|
+
* calls CloudClientService.connectLocal() to restore the connection.
|
|
7
|
+
*
|
|
8
|
+
* Non-blocking: failures are logged but do not prevent startup.
|
|
9
|
+
*
|
|
10
|
+
* @module services/cloud/cloud-initializer
|
|
11
|
+
*/
|
|
12
|
+
import { CloudClientService } from './cloud-client.service.js';
|
|
13
|
+
import { LoggerService } from '../core/logger.service.js';
|
|
14
|
+
import { CLOUD_CONSTANTS } from '../../constants.js';
|
|
15
|
+
const logger = LoggerService.getInstance().createComponentLogger('CloudInitializer');
|
|
16
|
+
/**
|
|
17
|
+
* Attempt to restore Cloud connection from persisted config.
|
|
18
|
+
*
|
|
19
|
+
* Called during backend startup. If ~/.crewly/cloud/config.json exists
|
|
20
|
+
* and contains valid credentials, calls connectLocal() to restore state.
|
|
21
|
+
* Also triggers relay auto-connect for device discovery.
|
|
22
|
+
*
|
|
23
|
+
* @returns Result indicating whether connection was restored
|
|
24
|
+
*/
|
|
25
|
+
export async function initializeCloudIfConfigured() {
|
|
26
|
+
const client = CloudClientService.getInstance();
|
|
27
|
+
// Skip if already connected (e.g. test environment)
|
|
28
|
+
if (client.isConnected()) {
|
|
29
|
+
logger.debug('Cloud already connected, skipping initialization');
|
|
30
|
+
return { attempted: false, success: true };
|
|
31
|
+
}
|
|
32
|
+
// Load persisted config
|
|
33
|
+
const config = await client.loadPersistedConfig();
|
|
34
|
+
if (!config) {
|
|
35
|
+
logger.debug('No persisted cloud config found, skipping');
|
|
36
|
+
return { attempted: false, success: false };
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
logger.info('Restoring cloud connection from persisted config', {
|
|
40
|
+
cloudUrl: config.cloudUrl,
|
|
41
|
+
tier: config.tier,
|
|
42
|
+
});
|
|
43
|
+
// Use connectLocal — no remote API call needed for restoration.
|
|
44
|
+
// The token was already validated when it was first stored.
|
|
45
|
+
client.connectLocal(config.cloudUrl, config.token, config.tier || CLOUD_CONSTANTS.TIERS.FREE);
|
|
46
|
+
// Trigger relay auto-connect (same as in cloud.controller.ts connectToCloud)
|
|
47
|
+
try {
|
|
48
|
+
const { autoConnectRelayFromToken } = await import('../../controllers/cloud/cloud.controller.js');
|
|
49
|
+
autoConnectRelayFromToken(config.token);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
logger.debug('Relay auto-connect not available during startup (non-fatal)');
|
|
53
|
+
}
|
|
54
|
+
logger.info('Cloud connection restored successfully', { tier: config.tier });
|
|
55
|
+
return { attempted: true, success: true };
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
logger.warn('Failed to restore cloud connection (non-fatal)', {
|
|
59
|
+
error: error instanceof Error ? error.message : String(error),
|
|
60
|
+
});
|
|
61
|
+
return {
|
|
62
|
+
attempted: true,
|
|
63
|
+
success: false,
|
|
64
|
+
error: error instanceof Error ? error.message : String(error),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=cloud-initializer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-initializer.js","sourceRoot":"","sources":["../../../../../../backend/src/services/cloud/cloud-initializer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAkB,MAAM,oBAAoB,CAAC;AAErE,MAAM,MAAM,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC,qBAAqB,CAAC,kBAAkB,CAAC,CAAC;AAcrF;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B;IAChD,MAAM,MAAM,GAAG,kBAAkB,CAAC,WAAW,EAAE,CAAC;IAEhD,oDAAoD;IACpD,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;QAC1B,MAAM,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACjE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC5C,CAAC;IAED,wBAAwB;IACxB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,mBAAmB,EAAE,CAAC;IAClD,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC1D,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC7C,CAAC;IAED,IAAI,CAAC;QACJ,MAAM,CAAC,IAAI,CAAC,kDAAkD,EAAE;YAC/D,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,IAAI,EAAE,MAAM,CAAC,IAAI;SACjB,CAAC,CAAC;QAEH,gEAAgE;QAChE,4DAA4D;QAC5D,MAAM,CAAC,YAAY,CAClB,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,KAAK,EACX,MAAM,CAAC,IAAkB,IAAI,eAAe,CAAC,KAAK,CAAC,IAAI,CACxD,CAAC;QAEF,6EAA6E;QAC7E,IAAI,CAAC;YACJ,MAAM,EAAE,yBAAyB,EAAE,GAAG,MAAM,MAAM,CAAC,6CAA6C,CAAC,CAAC;YAClG,yBAAyB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACR,MAAM,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;QAC7E,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7E,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,gDAAgD,EAAE;YAC7D,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC7D,CAAC,CAAC;QACH,OAAO;YACN,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC7D,CAAC;IACH,CAAC;AACF,CAAC"}
|
|
@@ -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
|