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.
Files changed (219) hide show
  1. package/dist/backend/backend/src/constants.d.ts +82 -0
  2. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  3. package/dist/backend/backend/src/constants.js +87 -0
  4. package/dist/backend/backend/src/constants.js.map +1 -1
  5. package/dist/backend/backend/src/controllers/bundle/bundle.controller.d.ts +44 -0
  6. package/dist/backend/backend/src/controllers/bundle/bundle.controller.d.ts.map +1 -0
  7. package/dist/backend/backend/src/controllers/bundle/bundle.controller.js +122 -0
  8. package/dist/backend/backend/src/controllers/bundle/bundle.controller.js.map +1 -0
  9. package/dist/backend/backend/src/controllers/bundle/bundle.routes.d.ts +25 -0
  10. package/dist/backend/backend/src/controllers/bundle/bundle.routes.d.ts.map +1 -0
  11. package/dist/backend/backend/src/controllers/bundle/bundle.routes.js +33 -0
  12. package/dist/backend/backend/src/controllers/bundle/bundle.routes.js.map +1 -0
  13. package/dist/backend/backend/src/index.d.ts.map +1 -1
  14. package/dist/backend/backend/src/index.js +14 -0
  15. package/dist/backend/backend/src/index.js.map +1 -1
  16. package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
  17. package/dist/backend/backend/src/routes/api.routes.js +4 -0
  18. package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
  19. package/dist/backend/backend/src/services/bundle/bundle-apply.factory.d.ts +62 -0
  20. package/dist/backend/backend/src/services/bundle/bundle-apply.factory.d.ts.map +1 -0
  21. package/dist/backend/backend/src/services/bundle/bundle-apply.factory.js +173 -0
  22. package/dist/backend/backend/src/services/bundle/bundle-apply.factory.js.map +1 -0
  23. package/dist/backend/backend/src/services/bundle/bundle-apply.service.d.ts +359 -0
  24. package/dist/backend/backend/src/services/bundle/bundle-apply.service.d.ts.map +1 -0
  25. package/dist/backend/backend/src/services/bundle/bundle-apply.service.js +888 -0
  26. package/dist/backend/backend/src/services/bundle/bundle-apply.service.js.map +1 -0
  27. package/dist/backend/backend/src/services/bundle/bundle-catalog.d.ts +167 -0
  28. package/dist/backend/backend/src/services/bundle/bundle-catalog.d.ts.map +1 -0
  29. package/dist/backend/backend/src/services/bundle/bundle-catalog.js +248 -0
  30. package/dist/backend/backend/src/services/bundle/bundle-catalog.js.map +1 -0
  31. package/dist/backend/backend/src/services/bundle/bundle-connectors.d.ts +43 -0
  32. package/dist/backend/backend/src/services/bundle/bundle-connectors.d.ts.map +1 -0
  33. package/dist/backend/backend/src/services/bundle/bundle-connectors.js +57 -0
  34. package/dist/backend/backend/src/services/bundle/bundle-connectors.js.map +1 -0
  35. package/dist/backend/backend/src/services/bundle/bundle-deps.d.ts +37 -0
  36. package/dist/backend/backend/src/services/bundle/bundle-deps.d.ts.map +1 -0
  37. package/dist/backend/backend/src/services/bundle/bundle-deps.js +60 -0
  38. package/dist/backend/backend/src/services/bundle/bundle-deps.js.map +1 -0
  39. package/dist/backend/backend/src/services/bundle/bundle-manifest.d.ts +93 -0
  40. package/dist/backend/backend/src/services/bundle/bundle-manifest.d.ts.map +1 -0
  41. package/dist/backend/backend/src/services/bundle/bundle-manifest.js +532 -0
  42. package/dist/backend/backend/src/services/bundle/bundle-manifest.js.map +1 -0
  43. package/dist/backend/backend/src/services/bundle/bundle-placeholders.d.ts +100 -0
  44. package/dist/backend/backend/src/services/bundle/bundle-placeholders.d.ts.map +1 -0
  45. package/dist/backend/backend/src/services/bundle/bundle-placeholders.js +183 -0
  46. package/dist/backend/backend/src/services/bundle/bundle-placeholders.js.map +1 -0
  47. package/dist/backend/backend/src/services/bundle/bundle-runtime.d.ts +36 -0
  48. package/dist/backend/backend/src/services/bundle/bundle-runtime.d.ts.map +1 -0
  49. package/dist/backend/backend/src/services/bundle/bundle-runtime.js +38 -0
  50. package/dist/backend/backend/src/services/bundle/bundle-runtime.js.map +1 -0
  51. package/dist/backend/backend/src/services/bundle/bundle-skill-installer.d.ts +105 -0
  52. package/dist/backend/backend/src/services/bundle/bundle-skill-installer.d.ts.map +1 -0
  53. package/dist/backend/backend/src/services/bundle/bundle-skill-installer.js +144 -0
  54. package/dist/backend/backend/src/services/bundle/bundle-skill-installer.js.map +1 -0
  55. package/dist/backend/backend/src/services/bundle/bundle-state.store.d.ts +48 -0
  56. package/dist/backend/backend/src/services/bundle/bundle-state.store.d.ts.map +1 -0
  57. package/dist/backend/backend/src/services/bundle/bundle-state.store.js +90 -0
  58. package/dist/backend/backend/src/services/bundle/bundle-state.store.js.map +1 -0
  59. package/dist/backend/backend/src/services/bundle/bundle-team.builder.d.ts +81 -0
  60. package/dist/backend/backend/src/services/bundle/bundle-team.builder.d.ts.map +1 -0
  61. package/dist/backend/backend/src/services/bundle/bundle-team.builder.js +172 -0
  62. package/dist/backend/backend/src/services/bundle/bundle-team.builder.js.map +1 -0
  63. package/dist/backend/backend/src/services/bundle/bundle-time.d.ts +59 -0
  64. package/dist/backend/backend/src/services/bundle/bundle-time.d.ts.map +1 -0
  65. package/dist/backend/backend/src/services/bundle/bundle-time.js +98 -0
  66. package/dist/backend/backend/src/services/bundle/bundle-time.js.map +1 -0
  67. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.d.ts.map +1 -1
  68. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js +5 -0
  69. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js.map +1 -1
  70. package/dist/backend/backend/src/services/core/storage.service.js +1 -1
  71. package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
  72. package/dist/backend/backend/src/services/core/teams-backup.service.d.ts.map +1 -1
  73. package/dist/backend/backend/src/services/core/teams-backup.service.js +4 -2
  74. package/dist/backend/backend/src/services/core/teams-backup.service.js.map +1 -1
  75. package/dist/backend/backend/src/services/onboarding/onboarding-checklist.factory.d.ts.map +1 -1
  76. package/dist/backend/backend/src/services/onboarding/onboarding-checklist.factory.js +2 -0
  77. package/dist/backend/backend/src/services/onboarding/onboarding-checklist.factory.js.map +1 -1
  78. package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.d.ts +14 -2
  79. package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.d.ts.map +1 -1
  80. package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.js +37 -1
  81. package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.js.map +1 -1
  82. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +21 -0
  83. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  84. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +85 -0
  85. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  86. package/dist/backend/backend/src/services/template/template.service.d.ts.map +1 -1
  87. package/dist/backend/backend/src/services/template/template.service.js +5 -2
  88. package/dist/backend/backend/src/services/template/template.service.js.map +1 -1
  89. package/dist/backend/backend/src/services/workflow/cron-task.service.d.ts.map +1 -1
  90. package/dist/backend/backend/src/services/workflow/cron-task.service.js +4 -2
  91. package/dist/backend/backend/src/services/workflow/cron-task.service.js.map +1 -1
  92. package/dist/backend/backend/src/types/solution-bundle.types.d.ts +367 -0
  93. package/dist/backend/backend/src/types/solution-bundle.types.d.ts.map +1 -0
  94. package/dist/backend/backend/src/types/solution-bundle.types.js +17 -0
  95. package/dist/backend/backend/src/types/solution-bundle.types.js.map +1 -0
  96. package/dist/backend/backend/src/types/team-template.types.d.ts +8 -0
  97. package/dist/backend/backend/src/types/team-template.types.d.ts.map +1 -1
  98. package/dist/backend/backend/src/types/team-template.types.js.map +1 -1
  99. package/dist/backend/build-info.json +2 -2
  100. package/dist/cli/backend/src/constants.d.ts +82 -0
  101. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  102. package/dist/cli/backend/src/constants.js +87 -0
  103. package/dist/cli/backend/src/constants.js.map +1 -1
  104. package/dist/cli/backend/src/services/bundle/bundle-apply.service.d.ts +359 -0
  105. package/dist/cli/backend/src/services/bundle/bundle-apply.service.d.ts.map +1 -0
  106. package/dist/cli/backend/src/services/bundle/bundle-apply.service.js +888 -0
  107. package/dist/cli/backend/src/services/bundle/bundle-apply.service.js.map +1 -0
  108. package/dist/cli/backend/src/services/bundle/bundle-catalog.d.ts +167 -0
  109. package/dist/cli/backend/src/services/bundle/bundle-catalog.d.ts.map +1 -0
  110. package/dist/cli/backend/src/services/bundle/bundle-catalog.js +248 -0
  111. package/dist/cli/backend/src/services/bundle/bundle-catalog.js.map +1 -0
  112. package/dist/cli/backend/src/services/bundle/bundle-deps.d.ts +37 -0
  113. package/dist/cli/backend/src/services/bundle/bundle-deps.d.ts.map +1 -0
  114. package/dist/cli/backend/src/services/bundle/bundle-deps.js +60 -0
  115. package/dist/cli/backend/src/services/bundle/bundle-deps.js.map +1 -0
  116. package/dist/cli/backend/src/services/bundle/bundle-manifest.d.ts +93 -0
  117. package/dist/cli/backend/src/services/bundle/bundle-manifest.d.ts.map +1 -0
  118. package/dist/cli/backend/src/services/bundle/bundle-manifest.js +532 -0
  119. package/dist/cli/backend/src/services/bundle/bundle-manifest.js.map +1 -0
  120. package/dist/cli/backend/src/services/bundle/bundle-placeholders.d.ts +100 -0
  121. package/dist/cli/backend/src/services/bundle/bundle-placeholders.d.ts.map +1 -0
  122. package/dist/cli/backend/src/services/bundle/bundle-placeholders.js +183 -0
  123. package/dist/cli/backend/src/services/bundle/bundle-placeholders.js.map +1 -0
  124. package/dist/cli/backend/src/services/bundle/bundle-runtime.d.ts +36 -0
  125. package/dist/cli/backend/src/services/bundle/bundle-runtime.d.ts.map +1 -0
  126. package/dist/cli/backend/src/services/bundle/bundle-runtime.js +38 -0
  127. package/dist/cli/backend/src/services/bundle/bundle-runtime.js.map +1 -0
  128. package/dist/cli/backend/src/services/bundle/bundle-skill-installer.d.ts +105 -0
  129. package/dist/cli/backend/src/services/bundle/bundle-skill-installer.d.ts.map +1 -0
  130. package/dist/cli/backend/src/services/bundle/bundle-skill-installer.js +144 -0
  131. package/dist/cli/backend/src/services/bundle/bundle-skill-installer.js.map +1 -0
  132. package/dist/cli/backend/src/services/bundle/bundle-state.store.d.ts +48 -0
  133. package/dist/cli/backend/src/services/bundle/bundle-state.store.d.ts.map +1 -0
  134. package/dist/cli/backend/src/services/bundle/bundle-state.store.js +90 -0
  135. package/dist/cli/backend/src/services/bundle/bundle-state.store.js.map +1 -0
  136. package/dist/cli/backend/src/services/bundle/bundle-team.builder.d.ts +81 -0
  137. package/dist/cli/backend/src/services/bundle/bundle-team.builder.d.ts.map +1 -0
  138. package/dist/cli/backend/src/services/bundle/bundle-team.builder.js +172 -0
  139. package/dist/cli/backend/src/services/bundle/bundle-team.builder.js.map +1 -0
  140. package/dist/cli/backend/src/services/bundle/bundle-time.d.ts +59 -0
  141. package/dist/cli/backend/src/services/bundle/bundle-time.d.ts.map +1 -0
  142. package/dist/cli/backend/src/services/bundle/bundle-time.js +98 -0
  143. package/dist/cli/backend/src/services/bundle/bundle-time.js.map +1 -0
  144. package/dist/cli/backend/src/services/core/storage.service.js +1 -1
  145. package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
  146. package/dist/cli/backend/src/services/core/teams-backup.service.d.ts.map +1 -1
  147. package/dist/cli/backend/src/services/core/teams-backup.service.js +4 -2
  148. package/dist/cli/backend/src/services/core/teams-backup.service.js.map +1 -1
  149. package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.d.ts +72 -0
  150. package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.d.ts.map +1 -0
  151. package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.js +389 -0
  152. package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.js.map +1 -0
  153. package/dist/cli/backend/src/services/messaging/index.d.ts +15 -0
  154. package/dist/cli/backend/src/services/messaging/index.d.ts.map +1 -0
  155. package/dist/cli/backend/src/services/messaging/index.js +20 -0
  156. package/dist/cli/backend/src/services/messaging/index.js.map +1 -0
  157. package/dist/cli/backend/src/services/messaging/queue-processor.service.d.ts +224 -0
  158. package/dist/cli/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -0
  159. package/dist/cli/backend/src/services/messaging/queue-processor.service.js +969 -0
  160. package/dist/cli/backend/src/services/messaging/queue-processor.service.js.map +1 -0
  161. package/dist/cli/backend/src/services/messaging/response-router.service.d.ts +110 -0
  162. package/dist/cli/backend/src/services/messaging/response-router.service.d.ts.map +1 -0
  163. package/dist/cli/backend/src/services/messaging/response-router.service.js +268 -0
  164. package/dist/cli/backend/src/services/messaging/response-router.service.js.map +1 -0
  165. package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.d.ts +14 -2
  166. package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.d.ts.map +1 -1
  167. package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.js +37 -1
  168. package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.js.map +1 -1
  169. package/dist/cli/backend/src/services/orchestrator/commitment-approval-guard.d.ts +133 -0
  170. package/dist/cli/backend/src/services/orchestrator/commitment-approval-guard.d.ts.map +1 -0
  171. package/dist/cli/backend/src/services/orchestrator/commitment-approval-guard.js +232 -0
  172. package/dist/cli/backend/src/services/orchestrator/commitment-approval-guard.js.map +1 -0
  173. package/dist/cli/backend/src/services/skill/skill-catalog.service.d.ts +277 -0
  174. package/dist/cli/backend/src/services/skill/skill-catalog.service.d.ts.map +1 -0
  175. package/dist/cli/backend/src/services/skill/skill-catalog.service.js +708 -0
  176. package/dist/cli/backend/src/services/skill/skill-catalog.service.js.map +1 -0
  177. package/dist/cli/backend/src/services/skill-setup/skill-install-job.service.d.ts +243 -0
  178. package/dist/cli/backend/src/services/skill-setup/skill-install-job.service.d.ts.map +1 -0
  179. package/dist/cli/backend/src/services/skill-setup/skill-install-job.service.js +439 -0
  180. package/dist/cli/backend/src/services/skill-setup/skill-install-job.service.js.map +1 -0
  181. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +21 -0
  182. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  183. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +85 -0
  184. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  185. package/dist/cli/backend/src/services/template/template.service.d.ts.map +1 -1
  186. package/dist/cli/backend/src/services/template/template.service.js +5 -2
  187. package/dist/cli/backend/src/services/template/template.service.js.map +1 -1
  188. package/dist/cli/backend/src/services/workflow/cron-task.service.d.ts +316 -0
  189. package/dist/cli/backend/src/services/workflow/cron-task.service.d.ts.map +1 -0
  190. package/dist/cli/backend/src/services/workflow/cron-task.service.js +1043 -0
  191. package/dist/cli/backend/src/services/workflow/cron-task.service.js.map +1 -0
  192. package/dist/cli/backend/src/types/cron-task.types.d.ts +95 -0
  193. package/dist/cli/backend/src/types/cron-task.types.d.ts.map +1 -0
  194. package/dist/cli/backend/src/types/cron-task.types.js +10 -0
  195. package/dist/cli/backend/src/types/cron-task.types.js.map +1 -0
  196. package/dist/cli/backend/src/types/solution-bundle.types.d.ts +367 -0
  197. package/dist/cli/backend/src/types/solution-bundle.types.d.ts.map +1 -0
  198. package/dist/cli/backend/src/types/solution-bundle.types.js +17 -0
  199. package/dist/cli/backend/src/types/solution-bundle.types.js.map +1 -0
  200. package/dist/cli/backend/src/types/team-template.types.d.ts +8 -0
  201. package/dist/cli/backend/src/types/team-template.types.d.ts.map +1 -1
  202. package/dist/cli/backend/src/types/team-template.types.js.map +1 -1
  203. package/dist/cli/cli/src/commands/deploy-bundle.d.ts +160 -0
  204. package/dist/cli/cli/src/commands/deploy-bundle.d.ts.map +1 -0
  205. package/dist/cli/cli/src/commands/deploy-bundle.js +386 -0
  206. package/dist/cli/cli/src/commands/deploy-bundle.js.map +1 -0
  207. package/dist/cli/cli/src/commands/onboard.d.ts +32 -1
  208. package/dist/cli/cli/src/commands/onboard.d.ts.map +1 -1
  209. package/dist/cli/cli/src/commands/onboard.js +80 -3
  210. package/dist/cli/cli/src/commands/onboard.js.map +1 -1
  211. package/dist/cli/cli/src/constants.d.ts +5 -0
  212. package/dist/cli/cli/src/constants.d.ts.map +1 -1
  213. package/dist/cli/cli/src/constants.js +5 -0
  214. package/dist/cli/cli/src/constants.js.map +1 -1
  215. package/dist/cli/cli/src/index.js +15 -0
  216. package/dist/cli/cli/src/index.js.map +1 -1
  217. package/frontend/dist/assets/{index-e6c403b6.js → index-97bb17d4.js} +274 -274
  218. package/frontend/dist/index.html +1 -1
  219. 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":"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"}