crewly 1.20.133 → 1.20.134
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/dist/backend/backend/src/constants.d.ts +82 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +87 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/bundle/bundle.controller.d.ts +44 -0
- package/dist/backend/backend/src/controllers/bundle/bundle.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/bundle/bundle.controller.js +122 -0
- package/dist/backend/backend/src/controllers/bundle/bundle.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/bundle/bundle.routes.d.ts +25 -0
- package/dist/backend/backend/src/controllers/bundle/bundle.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/bundle/bundle.routes.js +33 -0
- package/dist/backend/backend/src/controllers/bundle/bundle.routes.js.map +1 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +14 -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 +4 -0
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/services/bundle/bundle-apply.factory.d.ts +62 -0
- package/dist/backend/backend/src/services/bundle/bundle-apply.factory.d.ts.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-apply.factory.js +173 -0
- package/dist/backend/backend/src/services/bundle/bundle-apply.factory.js.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-apply.service.d.ts +359 -0
- package/dist/backend/backend/src/services/bundle/bundle-apply.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-apply.service.js +888 -0
- package/dist/backend/backend/src/services/bundle/bundle-apply.service.js.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-catalog.d.ts +167 -0
- package/dist/backend/backend/src/services/bundle/bundle-catalog.d.ts.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-catalog.js +248 -0
- package/dist/backend/backend/src/services/bundle/bundle-catalog.js.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-connectors.d.ts +43 -0
- package/dist/backend/backend/src/services/bundle/bundle-connectors.d.ts.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-connectors.js +57 -0
- package/dist/backend/backend/src/services/bundle/bundle-connectors.js.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-deps.d.ts +37 -0
- package/dist/backend/backend/src/services/bundle/bundle-deps.d.ts.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-deps.js +60 -0
- package/dist/backend/backend/src/services/bundle/bundle-deps.js.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-manifest.d.ts +93 -0
- package/dist/backend/backend/src/services/bundle/bundle-manifest.d.ts.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-manifest.js +532 -0
- package/dist/backend/backend/src/services/bundle/bundle-manifest.js.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-placeholders.d.ts +100 -0
- package/dist/backend/backend/src/services/bundle/bundle-placeholders.d.ts.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-placeholders.js +183 -0
- package/dist/backend/backend/src/services/bundle/bundle-placeholders.js.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-runtime.d.ts +36 -0
- package/dist/backend/backend/src/services/bundle/bundle-runtime.d.ts.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-runtime.js +38 -0
- package/dist/backend/backend/src/services/bundle/bundle-runtime.js.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-skill-installer.d.ts +105 -0
- package/dist/backend/backend/src/services/bundle/bundle-skill-installer.d.ts.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-skill-installer.js +144 -0
- package/dist/backend/backend/src/services/bundle/bundle-skill-installer.js.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-state.store.d.ts +48 -0
- package/dist/backend/backend/src/services/bundle/bundle-state.store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-state.store.js +90 -0
- package/dist/backend/backend/src/services/bundle/bundle-state.store.js.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-team.builder.d.ts +81 -0
- package/dist/backend/backend/src/services/bundle/bundle-team.builder.d.ts.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-team.builder.js +172 -0
- package/dist/backend/backend/src/services/bundle/bundle-team.builder.js.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-time.d.ts +59 -0
- package/dist/backend/backend/src/services/bundle/bundle-time.d.ts.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-time.js +98 -0
- package/dist/backend/backend/src/services/bundle/bundle-time.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js +5 -0
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js.map +1 -1
- package/dist/backend/backend/src/services/core/storage.service.js +1 -1
- package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
- package/dist/backend/backend/src/services/core/teams-backup.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/core/teams-backup.service.js +4 -2
- package/dist/backend/backend/src/services/core/teams-backup.service.js.map +1 -1
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.factory.d.ts.map +1 -1
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.factory.js +2 -0
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.factory.js.map +1 -1
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.d.ts +14 -2
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.js +37 -1
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +21 -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 +85 -0
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/backend/backend/src/services/template/template.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/template/template.service.js +5 -2
- package/dist/backend/backend/src/services/template/template.service.js.map +1 -1
- 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 +4 -2
- package/dist/backend/backend/src/services/workflow/cron-task.service.js.map +1 -1
- package/dist/backend/backend/src/types/solution-bundle.types.d.ts +367 -0
- package/dist/backend/backend/src/types/solution-bundle.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/solution-bundle.types.js +17 -0
- package/dist/backend/backend/src/types/solution-bundle.types.js.map +1 -0
- package/dist/backend/backend/src/types/team-template.types.d.ts +8 -0
- package/dist/backend/backend/src/types/team-template.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/team-template.types.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +82 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +87 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/bundle/bundle-apply.service.d.ts +359 -0
- package/dist/cli/backend/src/services/bundle/bundle-apply.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-apply.service.js +888 -0
- package/dist/cli/backend/src/services/bundle/bundle-apply.service.js.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-catalog.d.ts +167 -0
- package/dist/cli/backend/src/services/bundle/bundle-catalog.d.ts.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-catalog.js +248 -0
- package/dist/cli/backend/src/services/bundle/bundle-catalog.js.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-deps.d.ts +37 -0
- package/dist/cli/backend/src/services/bundle/bundle-deps.d.ts.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-deps.js +60 -0
- package/dist/cli/backend/src/services/bundle/bundle-deps.js.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-manifest.d.ts +93 -0
- package/dist/cli/backend/src/services/bundle/bundle-manifest.d.ts.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-manifest.js +532 -0
- package/dist/cli/backend/src/services/bundle/bundle-manifest.js.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-placeholders.d.ts +100 -0
- package/dist/cli/backend/src/services/bundle/bundle-placeholders.d.ts.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-placeholders.js +183 -0
- package/dist/cli/backend/src/services/bundle/bundle-placeholders.js.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-runtime.d.ts +36 -0
- package/dist/cli/backend/src/services/bundle/bundle-runtime.d.ts.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-runtime.js +38 -0
- package/dist/cli/backend/src/services/bundle/bundle-runtime.js.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-skill-installer.d.ts +105 -0
- package/dist/cli/backend/src/services/bundle/bundle-skill-installer.d.ts.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-skill-installer.js +144 -0
- package/dist/cli/backend/src/services/bundle/bundle-skill-installer.js.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-state.store.d.ts +48 -0
- package/dist/cli/backend/src/services/bundle/bundle-state.store.d.ts.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-state.store.js +90 -0
- package/dist/cli/backend/src/services/bundle/bundle-state.store.js.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-team.builder.d.ts +81 -0
- package/dist/cli/backend/src/services/bundle/bundle-team.builder.d.ts.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-team.builder.js +172 -0
- package/dist/cli/backend/src/services/bundle/bundle-team.builder.js.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-time.d.ts +59 -0
- package/dist/cli/backend/src/services/bundle/bundle-time.d.ts.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-time.js +98 -0
- package/dist/cli/backend/src/services/bundle/bundle-time.js.map +1 -0
- package/dist/cli/backend/src/services/core/storage.service.js +1 -1
- package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
- package/dist/cli/backend/src/services/core/teams-backup.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/core/teams-backup.service.js +4 -2
- package/dist/cli/backend/src/services/core/teams-backup.service.js.map +1 -1
- package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.d.ts +72 -0
- package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.js +389 -0
- package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.js.map +1 -0
- package/dist/cli/backend/src/services/messaging/index.d.ts +15 -0
- package/dist/cli/backend/src/services/messaging/index.d.ts.map +1 -0
- package/dist/cli/backend/src/services/messaging/index.js +20 -0
- package/dist/cli/backend/src/services/messaging/index.js.map +1 -0
- package/dist/cli/backend/src/services/messaging/queue-processor.service.d.ts +224 -0
- package/dist/cli/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/messaging/queue-processor.service.js +969 -0
- package/dist/cli/backend/src/services/messaging/queue-processor.service.js.map +1 -0
- package/dist/cli/backend/src/services/messaging/response-router.service.d.ts +110 -0
- package/dist/cli/backend/src/services/messaging/response-router.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/messaging/response-router.service.js +268 -0
- package/dist/cli/backend/src/services/messaging/response-router.service.js.map +1 -0
- package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.d.ts +14 -2
- package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.js +37 -1
- package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.js.map +1 -1
- package/dist/cli/backend/src/services/orchestrator/commitment-approval-guard.d.ts +133 -0
- package/dist/cli/backend/src/services/orchestrator/commitment-approval-guard.d.ts.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/commitment-approval-guard.js +232 -0
- package/dist/cli/backend/src/services/orchestrator/commitment-approval-guard.js.map +1 -0
- package/dist/cli/backend/src/services/skill/skill-catalog.service.d.ts +277 -0
- package/dist/cli/backend/src/services/skill/skill-catalog.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/skill/skill-catalog.service.js +708 -0
- package/dist/cli/backend/src/services/skill/skill-catalog.service.js.map +1 -0
- package/dist/cli/backend/src/services/skill-setup/skill-install-job.service.d.ts +243 -0
- package/dist/cli/backend/src/services/skill-setup/skill-install-job.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/skill-setup/skill-install-job.service.js +439 -0
- package/dist/cli/backend/src/services/skill-setup/skill-install-job.service.js.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +21 -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 +85 -0
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/cli/backend/src/services/template/template.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/template/template.service.js +5 -2
- package/dist/cli/backend/src/services/template/template.service.js.map +1 -1
- package/dist/cli/backend/src/services/workflow/cron-task.service.d.ts +316 -0
- package/dist/cli/backend/src/services/workflow/cron-task.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/workflow/cron-task.service.js +1043 -0
- package/dist/cli/backend/src/services/workflow/cron-task.service.js.map +1 -0
- package/dist/cli/backend/src/types/cron-task.types.d.ts +95 -0
- package/dist/cli/backend/src/types/cron-task.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/cron-task.types.js +10 -0
- package/dist/cli/backend/src/types/cron-task.types.js.map +1 -0
- package/dist/cli/backend/src/types/solution-bundle.types.d.ts +367 -0
- package/dist/cli/backend/src/types/solution-bundle.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/solution-bundle.types.js +17 -0
- package/dist/cli/backend/src/types/solution-bundle.types.js.map +1 -0
- package/dist/cli/backend/src/types/team-template.types.d.ts +8 -0
- package/dist/cli/backend/src/types/team-template.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/team-template.types.js.map +1 -1
- package/dist/cli/cli/src/commands/deploy-bundle.d.ts +160 -0
- package/dist/cli/cli/src/commands/deploy-bundle.d.ts.map +1 -0
- package/dist/cli/cli/src/commands/deploy-bundle.js +386 -0
- package/dist/cli/cli/src/commands/deploy-bundle.js.map +1 -0
- package/dist/cli/cli/src/commands/onboard.d.ts +32 -1
- package/dist/cli/cli/src/commands/onboard.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/onboard.js +80 -3
- package/dist/cli/cli/src/commands/onboard.js.map +1 -1
- package/dist/cli/cli/src/constants.d.ts +5 -0
- package/dist/cli/cli/src/constants.d.ts.map +1 -1
- package/dist/cli/cli/src/constants.js +5 -0
- package/dist/cli/cli/src/constants.js.map +1 -1
- package/dist/cli/cli/src/index.js +15 -0
- package/dist/cli/cli/src/index.js.map +1 -1
- package/frontend/dist/assets/{index-e6c403b6.js → index-97bb17d4.js} +274 -274
- package/frontend/dist/index.html +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,316 @@
|
|
|
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: Per-team at ~/.crewly/teams/{teamId}/cron-tasks.json
|
|
9
|
+
* Migration: Global ~/.crewly/cron-tasks.json is auto-migrated on first startup.
|
|
10
|
+
*
|
|
11
|
+
* @module services/workflow/cron-task.service
|
|
12
|
+
*/
|
|
13
|
+
import type { CronTask, CreateCronTaskRequest, UpdateCronTaskRequest } from '../../types/cron-task.types.js';
|
|
14
|
+
/**
|
|
15
|
+
* Extract date/time parts from a Date in a specific IANA timezone.
|
|
16
|
+
*
|
|
17
|
+
* Uses Intl.DateTimeFormat to convert the UTC instant into the target
|
|
18
|
+
* timezone, then extracts numeric minute, hour, dayOfWeek, dayOfMonth,
|
|
19
|
+
* and month fields.
|
|
20
|
+
*
|
|
21
|
+
* @param date - The Date object (represents a UTC instant)
|
|
22
|
+
* @param tz - IANA timezone string (e.g. "America/New_York", "Asia/Shanghai")
|
|
23
|
+
* @returns Object with minute, hour, dayOfWeek (0=Sun), dayOfMonth, month (1-12)
|
|
24
|
+
*/
|
|
25
|
+
export declare function getDatePartsInTimezone(date: Date, tz: string): {
|
|
26
|
+
minute: number;
|
|
27
|
+
hour: number;
|
|
28
|
+
dayOfWeek: number;
|
|
29
|
+
dayOfMonth: number;
|
|
30
|
+
month: number;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Validate an IANA timezone, falling back to UTC for an invalid/empty one.
|
|
34
|
+
*
|
|
35
|
+
* `new Intl.DateTimeFormat(..., { timeZone })` THROWS `RangeError` on a bad
|
|
36
|
+
* tz. That throw was previously uncaught inside `getNextRunTime`'s minute scan,
|
|
37
|
+
* so a single cron task with a malformed/empty timezone would crash the whole
|
|
38
|
+
* `evaluateTasks` tick and stall EVERY cron. Defaulting to UTC (with a one-time
|
|
39
|
+
* warn) keeps the scheduler resilient to one bad task.
|
|
40
|
+
*
|
|
41
|
+
* @param tz - Candidate IANA timezone
|
|
42
|
+
* @returns The tz if valid, otherwise 'UTC'
|
|
43
|
+
*/
|
|
44
|
+
export declare function safeTimezone(tz: string | undefined | null): string;
|
|
45
|
+
/**
|
|
46
|
+
* Parse a single cron field spec into a set of allowed values.
|
|
47
|
+
* Supports: `*`, single number, ranges (`1-5`), lists (`1,3,5`),
|
|
48
|
+
* and step values (`*\/5`, `10-30/5`).
|
|
49
|
+
*
|
|
50
|
+
* @param spec - The cron field string (e.g. "*", "5", "1-5", "1,3,5", "*\/10")
|
|
51
|
+
* @param min - Minimum allowed value for this field (inclusive)
|
|
52
|
+
* @param max - Maximum allowed value for this field (inclusive)
|
|
53
|
+
* @returns Set of matching integer values, or null for wildcard (match any)
|
|
54
|
+
*/
|
|
55
|
+
export declare function parseCronField(spec: string, min: number, max: number): Set<number> | null;
|
|
56
|
+
/**
|
|
57
|
+
* Parse a cron expression and calculate the next run time.
|
|
58
|
+
* Supports standard 5-field cron: minute hour day-of-month month day-of-week.
|
|
59
|
+
* Each field supports: `*`, numbers, ranges (`1-5`), lists (`1,3,5`),
|
|
60
|
+
* and step values (`*\/5`).
|
|
61
|
+
*
|
|
62
|
+
* All field matching is done in the specified timezone so that a cron like
|
|
63
|
+
* "0 9 * * *" in Asia/Shanghai fires at 09:00 Shanghai time regardless of
|
|
64
|
+
* the server's local timezone.
|
|
65
|
+
*
|
|
66
|
+
* The search covers `CRON_SCHEDULE_CONSTANTS.NEXT_RUN_HORIZON_DAYS` (a full
|
|
67
|
+
* year) without stepping every minute: a day whose date fields do not match
|
|
68
|
+
* is skipped in one hop (to just before its end, then hour-by-hour to the
|
|
69
|
+
* boundary), and an hour that does not match is skipped to the next hour
|
|
70
|
+
* boundary. Every hop stays inside the unit it is skipping, so no matching
|
|
71
|
+
* minute can be jumped over — including across DST transitions.
|
|
72
|
+
*
|
|
73
|
+
* @param cronExpression - Standard 5-field cron expression
|
|
74
|
+
* @param timezone - IANA timezone (e.g. "UTC", "America/New_York")
|
|
75
|
+
* @param after - Calculate next run after this date (defaults to now)
|
|
76
|
+
* @returns ISO string of next run time (always UTC). For an expression with
|
|
77
|
+
* no match inside the horizon (e.g. "0 0 31 2 *") returns now+24h,
|
|
78
|
+
* which is NOT schedule-aligned, and logs a WARN naming the expression
|
|
79
|
+
* @throws Error if the expression does not have exactly 5 fields
|
|
80
|
+
*/
|
|
81
|
+
export declare function getNextRunTime(cronExpression: string, timezone: string, after?: Date): string;
|
|
82
|
+
/**
|
|
83
|
+
* Callback type for checking whether an agent is online.
|
|
84
|
+
* Should return true if the agent is reachable and can receive tasks.
|
|
85
|
+
*
|
|
86
|
+
* @param sessionName - The agent's PTY session name
|
|
87
|
+
* @param teamId - The team ID the agent belongs to
|
|
88
|
+
* @returns True if the agent is online and ready
|
|
89
|
+
*/
|
|
90
|
+
export type AgentStatusCallback = (sessionName: string, teamId: string) => Promise<boolean>;
|
|
91
|
+
/**
|
|
92
|
+
* Callback type for auto-starting an offline agent.
|
|
93
|
+
*
|
|
94
|
+
* @param sessionName - The agent's PTY session name
|
|
95
|
+
* @param teamId - The team ID the agent belongs to
|
|
96
|
+
* @returns True if the agent was successfully started
|
|
97
|
+
*/
|
|
98
|
+
export type AgentStartCallback = (sessionName: string, teamId: string) => Promise<boolean>;
|
|
99
|
+
/**
|
|
100
|
+
* Service for managing cron tasks with per-team scoped storage.
|
|
101
|
+
*
|
|
102
|
+
* Storage layout:
|
|
103
|
+
* ~/.crewly/teams/{teamId}/cron-tasks.json
|
|
104
|
+
*
|
|
105
|
+
* On first startup, migrates the legacy global file
|
|
106
|
+
* (~/.crewly/cron-tasks.json) by grouping tasks by targetTeamId
|
|
107
|
+
* and writing per-team files. The global file is renamed to
|
|
108
|
+
* cron-tasks.json.migrated to prevent re-migration.
|
|
109
|
+
*
|
|
110
|
+
* Lifecycle:
|
|
111
|
+
* 1. Get singleton via `getInstance()`
|
|
112
|
+
* 2. Wire callbacks: `setExecutionCallback()`, `setAgentStatusCallback()`, `setAgentStartCallback()`
|
|
113
|
+
* 3. Call `migrateGlobalToTeamScoped()` to auto-migrate legacy storage
|
|
114
|
+
* 4. Call `start()` to begin the evaluation loop
|
|
115
|
+
* 5. On startup, call `recalculateAllNextRunTimes()` to self-heal stale values
|
|
116
|
+
*/
|
|
117
|
+
export declare class CronTaskService {
|
|
118
|
+
private static instance;
|
|
119
|
+
private logger;
|
|
120
|
+
/** Root crewly home directory (e.g. ~/.crewly) */
|
|
121
|
+
private crewlyHome;
|
|
122
|
+
private timer;
|
|
123
|
+
private executionCallback;
|
|
124
|
+
private agentStatusCallback;
|
|
125
|
+
private agentStartCallback;
|
|
126
|
+
constructor(crewlyHome?: string);
|
|
127
|
+
/**
|
|
128
|
+
* Get singleton instance.
|
|
129
|
+
*/
|
|
130
|
+
static getInstance(): CronTaskService;
|
|
131
|
+
/**
|
|
132
|
+
* Reset singleton (for testing).
|
|
133
|
+
*/
|
|
134
|
+
static resetInstance(): void;
|
|
135
|
+
/**
|
|
136
|
+
* Get the store file path for a specific team.
|
|
137
|
+
*
|
|
138
|
+
* @param teamId - Team ID
|
|
139
|
+
* @returns Absolute path to the team's cron-tasks.json
|
|
140
|
+
*/
|
|
141
|
+
getStoreFile(teamId: string): string;
|
|
142
|
+
/**
|
|
143
|
+
* Get the legacy global store file path.
|
|
144
|
+
*
|
|
145
|
+
* @returns Absolute path to the global cron-tasks.json
|
|
146
|
+
*/
|
|
147
|
+
private getGlobalStoreFile;
|
|
148
|
+
/**
|
|
149
|
+
* Migrate legacy global cron-tasks.json to per-team files.
|
|
150
|
+
*
|
|
151
|
+
* Orchestrator-targeted tasks (targetTeamId === 'orchestrator') are kept
|
|
152
|
+
* in the global file since they don't belong to any specific team.
|
|
153
|
+
* All other tasks are grouped by targetTeamId and written to per-team files.
|
|
154
|
+
*
|
|
155
|
+
* After migration, the global file is rewritten to contain only orchestrator
|
|
156
|
+
* tasks, and a .migrated marker is created to prevent re-running.
|
|
157
|
+
*
|
|
158
|
+
* Idempotent: skips if the .migrated marker already exists or no global file exists.
|
|
159
|
+
*
|
|
160
|
+
* @returns Number of tasks migrated to per-team files (excludes orchestrator tasks kept in global)
|
|
161
|
+
*/
|
|
162
|
+
migrateGlobalToTeamScoped(): Promise<number>;
|
|
163
|
+
/**
|
|
164
|
+
* Set the callback invoked when a cron task is due for execution.
|
|
165
|
+
* The callback receives the task and should delegate it to the target agent.
|
|
166
|
+
*
|
|
167
|
+
* @param callback - Async function that executes a cron task
|
|
168
|
+
*/
|
|
169
|
+
setExecutionCallback(callback: (task: CronTask) => Promise<void>): void;
|
|
170
|
+
/**
|
|
171
|
+
* Set the callback for checking agent online status.
|
|
172
|
+
* Called before executing a task to verify the target agent is reachable.
|
|
173
|
+
* Should treat both 'active' and 'started' states as online.
|
|
174
|
+
*
|
|
175
|
+
* @param callback - Async function returning true if agent is online
|
|
176
|
+
*/
|
|
177
|
+
setAgentStatusCallback(callback: AgentStatusCallback): void;
|
|
178
|
+
/**
|
|
179
|
+
* Set the callback for auto-starting an offline agent.
|
|
180
|
+
* Called when a cron task fires but the target agent is offline.
|
|
181
|
+
*
|
|
182
|
+
* @param callback - Async function that starts an agent, returns true on success
|
|
183
|
+
*/
|
|
184
|
+
setAgentStartCallback(callback: AgentStartCallback): void;
|
|
185
|
+
/**
|
|
186
|
+
* Start the cron task evaluation loop.
|
|
187
|
+
* Checks every minute for tasks whose nextRunAt has passed.
|
|
188
|
+
*/
|
|
189
|
+
start(): void;
|
|
190
|
+
/**
|
|
191
|
+
* Stop the cron task evaluation loop.
|
|
192
|
+
*/
|
|
193
|
+
stop(): void;
|
|
194
|
+
/**
|
|
195
|
+
* Whether the service is running.
|
|
196
|
+
*/
|
|
197
|
+
isRunning(): boolean;
|
|
198
|
+
/**
|
|
199
|
+
* Recalculate nextRunAt for all enabled tasks using the stored timezone.
|
|
200
|
+
* This self-heals stale values from older versions that computed nextRunAt
|
|
201
|
+
* in the server's local timezone instead of the task's specified timezone.
|
|
202
|
+
*
|
|
203
|
+
* Should be called once on backend startup, before start().
|
|
204
|
+
*
|
|
205
|
+
* @returns Number of tasks whose nextRunAt was updated
|
|
206
|
+
*/
|
|
207
|
+
recalculateAllNextRunTimes(): Promise<number>;
|
|
208
|
+
/**
|
|
209
|
+
* Create a new cron task.
|
|
210
|
+
*
|
|
211
|
+
* @param request - Cron task creation parameters
|
|
212
|
+
* @returns The created cron task
|
|
213
|
+
*/
|
|
214
|
+
create(request: CreateCronTaskRequest): Promise<CronTask>;
|
|
215
|
+
/**
|
|
216
|
+
* List all cron tasks across all teams, optionally filtered.
|
|
217
|
+
*
|
|
218
|
+
* @param filter - Optional filter criteria
|
|
219
|
+
* @returns Array of matching cron tasks
|
|
220
|
+
*/
|
|
221
|
+
list(filter?: {
|
|
222
|
+
targetAgent?: string;
|
|
223
|
+
enabled?: boolean;
|
|
224
|
+
}): Promise<CronTask[]>;
|
|
225
|
+
/**
|
|
226
|
+
* List cron tasks for a specific team.
|
|
227
|
+
*
|
|
228
|
+
* @param teamId - Team ID to filter by
|
|
229
|
+
* @param filter - Optional additional filter criteria
|
|
230
|
+
* @returns Array of matching cron tasks for the team
|
|
231
|
+
*/
|
|
232
|
+
getByTeam(teamId: string, filter?: {
|
|
233
|
+
targetAgent?: string;
|
|
234
|
+
enabled?: boolean;
|
|
235
|
+
}): Promise<CronTask[]>;
|
|
236
|
+
/**
|
|
237
|
+
* Get a single cron task by ID. Searches across all teams.
|
|
238
|
+
*
|
|
239
|
+
* @param id - Cron task ID
|
|
240
|
+
* @returns The cron task or null
|
|
241
|
+
*/
|
|
242
|
+
get(id: string): Promise<CronTask | null>;
|
|
243
|
+
/**
|
|
244
|
+
* Update a cron task. Searches across all teams to find the task.
|
|
245
|
+
*
|
|
246
|
+
* @param id - Cron task ID
|
|
247
|
+
* @param updates - Fields to update
|
|
248
|
+
* @returns Updated task or null if not found
|
|
249
|
+
*/
|
|
250
|
+
update(id: string, updates: UpdateCronTaskRequest): Promise<CronTask | null>;
|
|
251
|
+
/**
|
|
252
|
+
* Delete a cron task. Searches across all teams to find and remove it.
|
|
253
|
+
*
|
|
254
|
+
* @param id - Cron task ID
|
|
255
|
+
* @returns true if deleted, false if not found
|
|
256
|
+
*/
|
|
257
|
+
delete(id: string): Promise<boolean>;
|
|
258
|
+
/**
|
|
259
|
+
* Evaluate all enabled tasks and execute those whose nextRunAt has passed.
|
|
260
|
+
* If an agentStatusCallback is set, checks whether the target agent is online
|
|
261
|
+
* before execution. If the agent is offline and an agentStartCallback is set,
|
|
262
|
+
* attempts to auto-start the agent before executing.
|
|
263
|
+
*/
|
|
264
|
+
evaluateTasks(): Promise<void>;
|
|
265
|
+
/**
|
|
266
|
+
* Evaluate a single cron task: check if due, verify agent status, execute.
|
|
267
|
+
* Mutates the task in-place (lastRunAt, nextRunAt).
|
|
268
|
+
*
|
|
269
|
+
* @param task - The cron task to evaluate
|
|
270
|
+
* @param now - Current time for comparison
|
|
271
|
+
* @returns true if the task was modified (needs saving)
|
|
272
|
+
*/
|
|
273
|
+
private evaluateSingleTask;
|
|
274
|
+
/**
|
|
275
|
+
* Load cron task store for a specific team.
|
|
276
|
+
*
|
|
277
|
+
* @param teamId - Team ID
|
|
278
|
+
* @returns Team's cron task store (empty if file doesn't exist)
|
|
279
|
+
*/
|
|
280
|
+
private loadTeamStore;
|
|
281
|
+
/**
|
|
282
|
+
* Save cron task store for a specific team.
|
|
283
|
+
*
|
|
284
|
+
* @param teamId - Team ID
|
|
285
|
+
* @param store - Store data to persist
|
|
286
|
+
*/
|
|
287
|
+
private saveTeamStore;
|
|
288
|
+
/**
|
|
289
|
+
* Load the global cron task store (orchestrator tasks only).
|
|
290
|
+
*
|
|
291
|
+
* @returns Global store (empty if file doesn't exist)
|
|
292
|
+
*/
|
|
293
|
+
private loadGlobalStore;
|
|
294
|
+
/**
|
|
295
|
+
* Save the global cron task store (orchestrator tasks only).
|
|
296
|
+
*
|
|
297
|
+
* @param store - Store data to persist
|
|
298
|
+
*/
|
|
299
|
+
private saveGlobalStore;
|
|
300
|
+
/**
|
|
301
|
+
* Load all tasks from all team stores plus the global store,
|
|
302
|
+
* aggregated into a single array.
|
|
303
|
+
*
|
|
304
|
+
* @returns All cron tasks across all teams and the global orchestrator store
|
|
305
|
+
*/
|
|
306
|
+
private loadAllTasks;
|
|
307
|
+
/**
|
|
308
|
+
* Discover all team IDs that have cron task files.
|
|
309
|
+
*
|
|
310
|
+
* Scans ~/.crewly/teams/ for directories containing cron-tasks.json.
|
|
311
|
+
*
|
|
312
|
+
* @returns Array of team IDs
|
|
313
|
+
*/
|
|
314
|
+
private getTeamIds;
|
|
315
|
+
}
|
|
316
|
+
//# 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;;;;;;;;;;;GAWG;AASH,OAAO,KAAK,EACX,QAAQ,EAER,qBAAqB,EACrB,qBAAqB,EACrB,MAAM,gCAAgC,CAAC;AAqDxC;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CACrC,IAAI,EAAE,IAAI,EACV,EAAE,EAAE,MAAM,GACR;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CA8BxF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAUlE;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAwCzF;AAuBD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,cAAc,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,IAAI,GAAG,MAAM,CA2E7F;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAE5F;;;;;;GAMG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAE3F;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,eAAe;IAC3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAgC;IACvD,OAAO,CAAC,MAAM,CAAkB;IAChC,kDAAkD;IAClD,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,iBAAiB,CAAoD;IAC7E,OAAO,CAAC,mBAAmB,CAAoC;IAC/D,OAAO,CAAC,kBAAkB,CAAmC;gBAEjD,UAAU,CAAC,EAAE,MAAM;IAO/B;;OAEG;IACH,MAAM,CAAC,WAAW,IAAI,eAAe;IAOrC;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,IAAI;IAO5B;;;;;OAKG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAIpC;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAI1B;;;;;;;;;;;;;OAaG;IACG,yBAAyB,IAAI,OAAO,CAAC,MAAM,CAAC;IAsElD;;;;;OAKG;IACH,oBAAoB,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAIvE;;;;;;OAMG;IACH,sBAAsB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI;IAI3D;;;;;OAKG;IACH,qBAAqB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI;IAIzD;;;OAGG;IACH,KAAK,IAAI,IAAI;IAgBb;;OAEG;IACH,IAAI,IAAI,IAAI;IAQZ;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;;;;;;;OAQG;IACG,0BAA0B,IAAI,OAAO,CAAC,MAAM,CAAC;IAiDnD;;;;;OAKG;IACG,MAAM,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAmE/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;IAarF;;;;;;OAMG;IACG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAc1G;;;;;OAKG;IACG,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAK/C;;;;;;OAMG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IA6ClF;;;;;OAKG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA2B1C;;;;;OAKG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAgCpC;;;;;;;OAOG;YACW,kBAAkB;IA6KhC;;;;;OAKG;YACW,aAAa;IAU3B;;;;;OAKG;YACW,aAAa;IAO3B;;;;OAIG;YACW,eAAe;IAS7B;;;;OAIG;YACW,eAAe;IAO7B;;;;;OAKG;YACW,YAAY;IAiB1B;;;;;;OAMG;YACW,UAAU;CAoBxB"}
|