crewly 1.20.169 → 1.20.171

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 (151) hide show
  1. package/config/skills/agent/core/reply/SKILL.md +71 -0
  2. package/config/skills/agent/core/reply/execute.sh +81 -0
  3. package/config/skills/agent/core/reply/execute.test.sh +87 -0
  4. package/config/skills/agent/core/schedule-followup/execute.sh +1 -1
  5. package/config/skills/agent/core/watch-for-event/execute.sh +1 -1
  6. package/config/skills/orchestrator/delegate-task/execute.sh +1 -0
  7. package/dist/backend/backend/src/constants.d.ts +70 -0
  8. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  9. package/dist/backend/backend/src/constants.js +76 -0
  10. package/dist/backend/backend/src/constants.js.map +1 -1
  11. package/dist/backend/backend/src/controllers/chat/agent-reply.controller.d.ts +36 -0
  12. package/dist/backend/backend/src/controllers/chat/agent-reply.controller.d.ts.map +1 -0
  13. package/dist/backend/backend/src/controllers/chat/agent-reply.controller.js +182 -0
  14. package/dist/backend/backend/src/controllers/chat/agent-reply.controller.js.map +1 -0
  15. package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts +30 -0
  16. package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
  17. package/dist/backend/backend/src/controllers/chat/chat.controller.js +171 -0
  18. package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
  19. package/dist/backend/backend/src/controllers/chat/chat.routes.d.ts.map +1 -1
  20. package/dist/backend/backend/src/controllers/chat/chat.routes.js +4 -0
  21. package/dist/backend/backend/src/controllers/chat/chat.routes.js.map +1 -1
  22. package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts +55 -0
  23. package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
  24. package/dist/backend/backend/src/controllers/slack/slack.controller.js +1 -1
  25. package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
  26. package/dist/backend/backend/src/controllers/trigger/trigger.controller.d.ts +13 -2
  27. package/dist/backend/backend/src/controllers/trigger/trigger.controller.d.ts.map +1 -1
  28. package/dist/backend/backend/src/controllers/trigger/trigger.controller.js +31 -8
  29. package/dist/backend/backend/src/controllers/trigger/trigger.controller.js.map +1 -1
  30. package/dist/backend/backend/src/index.d.ts +10 -0
  31. package/dist/backend/backend/src/index.d.ts.map +1 -1
  32. package/dist/backend/backend/src/index.js +143 -1
  33. package/dist/backend/backend/src/index.js.map +1 -1
  34. package/dist/backend/backend/src/routes/modules/system.routes.d.ts.map +1 -1
  35. package/dist/backend/backend/src/routes/modules/system.routes.js +6 -0
  36. package/dist/backend/backend/src/routes/modules/system.routes.js.map +1 -1
  37. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +18 -0
  38. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  39. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +48 -3
  40. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  41. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.d.ts +271 -0
  42. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.d.ts.map +1 -0
  43. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.js +605 -0
  44. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.js.map +1 -0
  45. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.d.ts +179 -0
  46. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.d.ts.map +1 -0
  47. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.js +327 -0
  48. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.js.map +1 -0
  49. package/dist/backend/backend/src/services/orc/agent-reply-target.d.ts +95 -0
  50. package/dist/backend/backend/src/services/orc/agent-reply-target.d.ts.map +1 -0
  51. package/dist/backend/backend/src/services/orc/agent-reply-target.js +85 -0
  52. package/dist/backend/backend/src/services/orc/agent-reply-target.js.map +1 -0
  53. package/dist/backend/backend/src/services/orc/orc-reply-route.service.d.ts +20 -0
  54. package/dist/backend/backend/src/services/orc/orc-reply-route.service.d.ts.map +1 -1
  55. package/dist/backend/backend/src/services/orc/orc-reply-route.service.js +34 -1
  56. package/dist/backend/backend/src/services/orc/orc-reply-route.service.js.map +1 -1
  57. package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
  58. package/dist/backend/backend/src/services/slack/slack-initializer.js +5 -0
  59. package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
  60. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +13 -0
  61. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  62. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +40 -0
  63. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  64. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  65. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +2 -0
  66. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  67. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts +33 -0
  68. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
  69. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js +68 -0
  70. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
  71. package/dist/backend/backend/src/services/slack/slack.service.d.ts +16 -0
  72. package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -1
  73. package/dist/backend/backend/src/services/slack/slack.service.js +22 -5
  74. package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
  75. package/dist/backend/backend/src/services/v3/escalation.service.d.ts.map +1 -1
  76. package/dist/backend/backend/src/services/v3/escalation.service.js +4 -2
  77. package/dist/backend/backend/src/services/v3/escalation.service.js.map +1 -1
  78. package/dist/backend/backend/src/services/v3/team-trigger-reconciler.service.d.ts.map +1 -1
  79. package/dist/backend/backend/src/services/v3/team-trigger-reconciler.service.js +4 -1
  80. package/dist/backend/backend/src/services/v3/team-trigger-reconciler.service.js.map +1 -1
  81. package/dist/backend/backend/src/services/v3/trigger-classification.d.ts +87 -0
  82. package/dist/backend/backend/src/services/v3/trigger-classification.d.ts.map +1 -0
  83. package/dist/backend/backend/src/services/v3/trigger-classification.js +120 -0
  84. package/dist/backend/backend/src/services/v3/trigger-classification.js.map +1 -0
  85. package/dist/backend/backend/src/services/v3/trigger-engine.service.d.ts +50 -2
  86. package/dist/backend/backend/src/services/v3/trigger-engine.service.d.ts.map +1 -1
  87. package/dist/backend/backend/src/services/v3/trigger-engine.service.js +101 -4
  88. package/dist/backend/backend/src/services/v3/trigger-engine.service.js.map +1 -1
  89. package/dist/backend/backend/src/services/v3/trigger-expiry.d.ts +70 -0
  90. package/dist/backend/backend/src/services/v3/trigger-expiry.d.ts.map +1 -0
  91. package/dist/backend/backend/src/services/v3/trigger-expiry.js +136 -0
  92. package/dist/backend/backend/src/services/v3/trigger-expiry.js.map +1 -0
  93. package/dist/backend/backend/src/types/slack.types.d.ts +6 -0
  94. package/dist/backend/backend/src/types/slack.types.d.ts.map +1 -1
  95. package/dist/backend/backend/src/types/slack.types.js.map +1 -1
  96. package/dist/backend/backend/src/types/v2/index.d.ts +2 -2
  97. package/dist/backend/backend/src/types/v2/index.d.ts.map +1 -1
  98. package/dist/backend/backend/src/types/v2/index.js +1 -1
  99. package/dist/backend/backend/src/types/v2/index.js.map +1 -1
  100. package/dist/backend/backend/src/types/v2/trigger.types.d.ts +80 -4
  101. package/dist/backend/backend/src/types/v2/trigger.types.d.ts.map +1 -1
  102. package/dist/backend/backend/src/types/v2/trigger.types.js +35 -0
  103. package/dist/backend/backend/src/types/v2/trigger.types.js.map +1 -1
  104. package/dist/backend/build-info.json +2 -2
  105. package/dist/cli/backend/src/constants.d.ts +70 -0
  106. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  107. package/dist/cli/backend/src/constants.js +76 -0
  108. package/dist/cli/backend/src/constants.js.map +1 -1
  109. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +18 -0
  110. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  111. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +48 -3
  112. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  113. package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.d.ts +271 -0
  114. package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.d.ts.map +1 -0
  115. package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.js +605 -0
  116. package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.js.map +1 -0
  117. package/dist/cli/backend/src/services/orc/orc-reply-route.service.d.ts +20 -0
  118. package/dist/cli/backend/src/services/orc/orc-reply-route.service.d.ts.map +1 -1
  119. package/dist/cli/backend/src/services/orc/orc-reply-route.service.js +34 -1
  120. package/dist/cli/backend/src/services/orc/orc-reply-route.service.js.map +1 -1
  121. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts +13 -0
  122. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  123. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +40 -0
  124. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  125. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  126. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +2 -0
  127. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  128. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts +33 -0
  129. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
  130. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js +68 -0
  131. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
  132. package/dist/cli/backend/src/services/slack/slack.service.d.ts +16 -0
  133. package/dist/cli/backend/src/services/slack/slack.service.d.ts.map +1 -1
  134. package/dist/cli/backend/src/services/slack/slack.service.js +22 -5
  135. package/dist/cli/backend/src/services/slack/slack.service.js.map +1 -1
  136. package/dist/cli/backend/src/types/slack.types.d.ts +6 -0
  137. package/dist/cli/backend/src/types/slack.types.d.ts.map +1 -1
  138. package/dist/cli/backend/src/types/slack.types.js.map +1 -1
  139. package/dist/cli/backend/src/types/v2/index.d.ts +2 -2
  140. package/dist/cli/backend/src/types/v2/index.d.ts.map +1 -1
  141. package/dist/cli/backend/src/types/v2/index.js +1 -1
  142. package/dist/cli/backend/src/types/v2/index.js.map +1 -1
  143. package/dist/cli/backend/src/types/v2/trigger.types.d.ts +80 -4
  144. package/dist/cli/backend/src/types/v2/trigger.types.d.ts.map +1 -1
  145. package/dist/cli/backend/src/types/v2/trigger.types.js +35 -0
  146. package/dist/cli/backend/src/types/v2/trigger.types.js.map +1 -1
  147. package/frontend/dist/assets/{index-9153caca.js → index-212a6639.js} +291 -290
  148. package/frontend/dist/assets/index-769ba7ac.css +42 -0
  149. package/frontend/dist/index.html +2 -2
  150. package/package.json +1 -1
  151. package/frontend/dist/assets/index-0707e2ac.css +0 -42
@@ -1 +1 @@
1
- {"version":3,"file":"team-trigger-reconciler.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/team-trigger-reconciler.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"team-trigger-reconciler.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/team-trigger-reconciler.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Trigger classification — who created a trigger and whether it is
3
+ * harness-internal plumbing the owner should not have to look at.
4
+ *
5
+ * Until 2026-09-30 the agent skills (`schedule-followup`, `watch-for-event`)
6
+ * stamped every trigger `createdBy: 'system'`, and the Schedules page hid
7
+ * everything `system`. The owner's own nightly report — an agent created it
8
+ * for them — was therefore invisible. Two fixes live here:
9
+ *
10
+ * 1. {@link resolveTriggerCreator}: the API decides `createdBy` from the
11
+ * caller (the `X-Agent-Session` header, or the owner's dashboard) instead
12
+ * of trusting the body.
13
+ * 2. {@link classifyTriggerOnLoad}: a one-time, per-row migration that fills
14
+ * the new explicit `internal` flag for rows persisted before it existed.
15
+ *
16
+ * @module services/v3/trigger-classification
17
+ */
18
+ import { type Trigger, type TriggerCreator } from '../../types/v2/trigger.types.js';
19
+ /** Name prefix of the harness's own named triggers (e.g. `system:escalation`). */
20
+ export declare const SYSTEM_TRIGGER_NAME_PREFIX = "system:";
21
+ /** The creator fields the API stamps on a new trigger. */
22
+ export interface ResolvedTriggerCreator {
23
+ createdBy: TriggerCreator;
24
+ createdBySession?: string;
25
+ internal: boolean;
26
+ }
27
+ /** What the API knows about the request when it creates a trigger. */
28
+ export interface TriggerCreatorContext {
29
+ /** `createdBy` as sent in the body (untrusted) */
30
+ requestedCreatedBy?: TriggerCreator;
31
+ /** `internal` as sent in the body */
32
+ requestedInternal?: boolean;
33
+ /** `X-Agent-Session`, when an agent made the call */
34
+ callerSession?: string;
35
+ /** Whether the caller session is the orchestrator */
36
+ callerIsOrchestrator?: boolean;
37
+ /** Whether the call carried the owner-dashboard marker (and no agent session) */
38
+ isOwnerDashboard?: boolean;
39
+ }
40
+ /**
41
+ * Decide `createdBy` / `createdBySession` / `internal` for a trigger created
42
+ * through the API.
43
+ *
44
+ * - An agent session header wins: the trigger belongs to that agent
45
+ * (`orchestrator` for the orc, `agent` otherwise), and it is owner-facing
46
+ * unless the body explicitly marks it internal. delegate-task's fallback
47
+ * check keeps `createdBy: 'delegate-task'` and is internal.
48
+ * - The owner's dashboard is always `user` and never internal.
49
+ * - Any other caller (server-to-server, curl without headers) keeps what it
50
+ * sent, defaulting to `user`.
51
+ *
52
+ * @param ctx - Request facts
53
+ * @returns The creator fields to store
54
+ */
55
+ export declare function resolveTriggerCreator(ctx: TriggerCreatorContext): ResolvedTriggerCreator;
56
+ /**
57
+ * Whether a trigger is unmistakably harness plumbing: the escalation sweep
58
+ * (`runReconciler` / `system:*` names) or a delegate-task fallback check.
59
+ *
60
+ * A `fallback-*` name alone is not enough: team leads schedule their own
61
+ * "fallback check on X" follow-ups through schedule-followup, and those are
62
+ * reminders the owner may want to see. Only delegate-task's own rows
63
+ * (`createdBy: 'delegate-task'`) are plumbing.
64
+ *
65
+ * @param trigger - Trigger to inspect
66
+ * @returns True for harness-internal plumbing
67
+ */
68
+ export declare function isHarnessPlumbing(trigger: Pick<Trigger, 'createdBy' | 'name' | 'action'>): boolean;
69
+ /**
70
+ * One-time migration for a row persisted before `internal` existed. Mutates
71
+ * the trigger in place and reports whether it changed; rows that already
72
+ * carry `internal` are left alone, which is what makes it one-time.
73
+ *
74
+ * Rules, in order:
75
+ * 1. Harness plumbing ({@link isHarnessPlumbing}) → `internal: true`.
76
+ * 2. A trigger with a `name`, a recurring cron, or a `teamId` plus a
77
+ * createWorkItem action is someone's real schedule or reminder →
78
+ * `internal: false`. If it was mislabelled `system` it becomes `user`
79
+ * (team-spec rows — the owner's team config) or `agent` (everything else:
80
+ * the agent skills were the only other writers of `system`).
81
+ * 3. Anything else keeps its `createdBy` and gets the creator's default.
82
+ *
83
+ * @param trigger - Trigger loaded from disk (mutated)
84
+ * @returns True when the row was changed and should be persisted
85
+ */
86
+ export declare function classifyTriggerOnLoad(trigger: Trigger): boolean;
87
+ //# sourceMappingURL=trigger-classification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trigger-classification.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/trigger-classification.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,cAAc,EAGpB,MAAM,iCAAiC,CAAC;AAEzC,kFAAkF;AAClF,eAAO,MAAM,0BAA0B,YAAY,CAAC;AAEpD,0DAA0D;AAC1D,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,cAAc,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,sEAAsE;AACtE,MAAM,WAAW,qBAAqB;IACpC,kDAAkD;IAClD,kBAAkB,CAAC,EAAE,cAAc,CAAC;IACpC,qCAAqC;IACrC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,qDAAqD;IACrD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qDAAqD;IACrD,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,iFAAiF;IACjF,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,qBAAqB,GAAG,sBAAsB,CA2BxF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,GAAG,QAAQ,CAAC,GACtD,OAAO,CAIT;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAsB/D"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Trigger classification — who created a trigger and whether it is
3
+ * harness-internal plumbing the owner should not have to look at.
4
+ *
5
+ * Until 2026-09-30 the agent skills (`schedule-followup`, `watch-for-event`)
6
+ * stamped every trigger `createdBy: 'system'`, and the Schedules page hid
7
+ * everything `system`. The owner's own nightly report — an agent created it
8
+ * for them — was therefore invisible. Two fixes live here:
9
+ *
10
+ * 1. {@link resolveTriggerCreator}: the API decides `createdBy` from the
11
+ * caller (the `X-Agent-Session` header, or the owner's dashboard) instead
12
+ * of trusting the body.
13
+ * 2. {@link classifyTriggerOnLoad}: a one-time, per-row migration that fills
14
+ * the new explicit `internal` flag for rows persisted before it existed.
15
+ *
16
+ * @module services/v3/trigger-classification
17
+ */
18
+ import { isInternalByDefault, isRecurringTrigger, } from '../../types/v2/trigger.types.js';
19
+ /** Name prefix of the harness's own named triggers (e.g. `system:escalation`). */
20
+ export const SYSTEM_TRIGGER_NAME_PREFIX = 'system:';
21
+ /**
22
+ * Decide `createdBy` / `createdBySession` / `internal` for a trigger created
23
+ * through the API.
24
+ *
25
+ * - An agent session header wins: the trigger belongs to that agent
26
+ * (`orchestrator` for the orc, `agent` otherwise), and it is owner-facing
27
+ * unless the body explicitly marks it internal. delegate-task's fallback
28
+ * check keeps `createdBy: 'delegate-task'` and is internal.
29
+ * - The owner's dashboard is always `user` and never internal.
30
+ * - Any other caller (server-to-server, curl without headers) keeps what it
31
+ * sent, defaulting to `user`.
32
+ *
33
+ * @param ctx - Request facts
34
+ * @returns The creator fields to store
35
+ */
36
+ export function resolveTriggerCreator(ctx) {
37
+ const requested = ctx.requestedCreatedBy;
38
+ if (ctx.callerSession) {
39
+ if (requested === 'delegate-task') {
40
+ return {
41
+ createdBy: 'delegate-task',
42
+ createdBySession: ctx.callerSession,
43
+ internal: ctx.requestedInternal ?? true,
44
+ };
45
+ }
46
+ if (ctx.requestedInternal === true) {
47
+ return {
48
+ createdBy: requested ?? 'system',
49
+ createdBySession: ctx.callerSession,
50
+ internal: true,
51
+ };
52
+ }
53
+ const createdBy = requested === 'mission'
54
+ ? 'mission'
55
+ : ctx.callerIsOrchestrator ? 'orchestrator' : 'agent';
56
+ return { createdBy, createdBySession: ctx.callerSession, internal: false };
57
+ }
58
+ if (ctx.isOwnerDashboard) {
59
+ return { createdBy: 'user', internal: false };
60
+ }
61
+ const createdBy = requested ?? 'user';
62
+ return { createdBy, internal: ctx.requestedInternal ?? isInternalByDefault(createdBy) };
63
+ }
64
+ /**
65
+ * Whether a trigger is unmistakably harness plumbing: the escalation sweep
66
+ * (`runReconciler` / `system:*` names) or a delegate-task fallback check.
67
+ *
68
+ * A `fallback-*` name alone is not enough: team leads schedule their own
69
+ * "fallback check on X" follow-ups through schedule-followup, and those are
70
+ * reminders the owner may want to see. Only delegate-task's own rows
71
+ * (`createdBy: 'delegate-task'`) are plumbing.
72
+ *
73
+ * @param trigger - Trigger to inspect
74
+ * @returns True for harness-internal plumbing
75
+ */
76
+ export function isHarnessPlumbing(trigger) {
77
+ if (trigger.createdBy === 'delegate-task')
78
+ return true;
79
+ if (trigger.action?.runReconciler)
80
+ return true;
81
+ return (trigger.name ?? '').startsWith(SYSTEM_TRIGGER_NAME_PREFIX);
82
+ }
83
+ /**
84
+ * One-time migration for a row persisted before `internal` existed. Mutates
85
+ * the trigger in place and reports whether it changed; rows that already
86
+ * carry `internal` are left alone, which is what makes it one-time.
87
+ *
88
+ * Rules, in order:
89
+ * 1. Harness plumbing ({@link isHarnessPlumbing}) → `internal: true`.
90
+ * 2. A trigger with a `name`, a recurring cron, or a `teamId` plus a
91
+ * createWorkItem action is someone's real schedule or reminder →
92
+ * `internal: false`. If it was mislabelled `system` it becomes `user`
93
+ * (team-spec rows — the owner's team config) or `agent` (everything else:
94
+ * the agent skills were the only other writers of `system`).
95
+ * 3. Anything else keeps its `createdBy` and gets the creator's default.
96
+ *
97
+ * @param trigger - Trigger loaded from disk (mutated)
98
+ * @returns True when the row was changed and should be persisted
99
+ */
100
+ export function classifyTriggerOnLoad(trigger) {
101
+ if (typeof trigger.internal === 'boolean')
102
+ return false;
103
+ if (isHarnessPlumbing(trigger)) {
104
+ trigger.internal = true;
105
+ return true;
106
+ }
107
+ const ownerFacing = !!trigger.name ||
108
+ isRecurringTrigger(trigger) ||
109
+ (!!trigger.teamId && !!trigger.action?.createWorkItem);
110
+ if (ownerFacing) {
111
+ trigger.internal = false;
112
+ if (trigger.createdBy === 'system') {
113
+ trigger.createdBy = trigger.managedBy === 'team-spec' ? 'user' : 'agent';
114
+ }
115
+ return true;
116
+ }
117
+ trigger.internal = isInternalByDefault(trigger.createdBy);
118
+ return true;
119
+ }
120
+ //# sourceMappingURL=trigger-classification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trigger-classification.js","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/trigger-classification.ts"],"names":[],"mappings":"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"}
@@ -13,15 +13,29 @@
13
13
  *
14
14
  * @module services/v3/trigger-engine.service
15
15
  */
16
- import { type Trigger, type TriggerStatus, type TriggerAction, type CreateTriggerInput } from '../../types/v2/index.js';
16
+ import { type Trigger, type TriggerStatus, type TriggerAction, type CreateTriggerInput, type TriggerFireOutcome } from '../../types/v2/index.js';
17
17
  import type { EventBusService } from '../event-bus/event-bus.service.js';
18
18
  /**
19
19
  * Callback invoked when a trigger fires and produces an action.
20
20
  *
21
+ * It may report what the fire did; the engine stores that as the trigger's
22
+ * `lastFireResult` so the owner can see it. Returning nothing is fine.
23
+ *
21
24
  * @param trigger - The trigger that fired
22
25
  * @param action - The action to execute
26
+ * @returns Optional outcome of the fire
23
27
  */
24
- export type TriggerActionHandler = (trigger: Trigger, action: TriggerAction) => Promise<void>;
28
+ export type TriggerActionHandler = (trigger: Trigger, action: TriggerAction) => Promise<void | TriggerFireOutcome>;
29
+ /**
30
+ * Callback that tells a trigger's team lead it is about to run out of fires.
31
+ * Resolves true once the heads-up was delivered (the engine then records it
32
+ * and does not send it again), false to retry on a later fire.
33
+ *
34
+ * @param trigger - The trigger close to exhaustion
35
+ * @param remaining - Fires left
36
+ * @param lastFireAt - Projected final fire time, when computable
37
+ */
38
+ export type TriggerExpiryNotifier = (trigger: Trigger, remaining: number, lastFireAt: string | undefined) => Promise<boolean>;
25
39
  /**
26
40
  * Result of a trigger fire attempt — indicates whether the fire was productive.
27
41
  */
@@ -67,6 +81,8 @@ export declare class TriggerEngine {
67
81
  private signalListener;
68
82
  /** Callback for executing trigger actions. */
69
83
  private actionHandler;
84
+ /** Callback for the expiry heads-up (see {@link TriggerExpiryNotifier}). */
85
+ private expiryNotifier;
70
86
  /** Interval handle for time trigger polling. */
71
87
  private timeCheckInterval;
72
88
  /** Timeout handles for one-shot delay/fireAt triggers, keyed by trigger ID. */
@@ -117,6 +133,13 @@ export declare class TriggerEngine {
117
133
  * @param handler - Callback invoked when a trigger fires
118
134
  */
119
135
  setActionHandler(handler: TriggerActionHandler): void;
136
+ /**
137
+ * Sets the callback that warns a team lead before a recurring trigger
138
+ * exhausts its `maxFires`. Without one, no heads-up is sent.
139
+ *
140
+ * @param notifier - Delivery callback
141
+ */
142
+ setExpiryNotifier(notifier: TriggerExpiryNotifier): void;
120
143
  /**
121
144
  * Starts the TriggerEngine: loads persisted triggers from disk,
122
145
  * sets up time polling interval, and registers signal listeners.
@@ -199,6 +222,29 @@ export declare class TriggerEngine {
199
222
  * @returns The fire result
200
223
  */
201
224
  fire(trigger: Trigger, productive?: boolean): Promise<TriggerFireResult>;
225
+ /**
226
+ * Projected time of a recurring trigger's final fire (for display).
227
+ *
228
+ * @param id - Trigger UUID
229
+ * @returns ISO time, or undefined when unlimited/unknown
230
+ */
231
+ projectLastFireAt(id: string): string | undefined;
232
+ /**
233
+ * Sends the expiry heads-up for every trigger that is inside the warning
234
+ * window and has not had one yet. Runs at start; fire() covers the rest.
235
+ *
236
+ * @returns Number of heads-ups delivered
237
+ */
238
+ checkExpiringTriggers(): Promise<number>;
239
+ /**
240
+ * Deliver the heads-up for one trigger if it is due. Marks
241
+ * `expiryNoticeSentAt` only on success; never changes `maxFires`.
242
+ * The caller persists.
243
+ *
244
+ * @param trigger - Trigger to check
245
+ * @returns True if a heads-up was delivered
246
+ */
247
+ private maybeSendExpiryNotice;
202
248
  /**
203
249
  * Sets up the polling interval for cron-based time triggers.
204
250
  */
@@ -458,6 +504,8 @@ export declare class TriggerEngine {
458
504
  total: number;
459
505
  byStatus: Record<TriggerStatus, number>;
460
506
  byType: Record<string, number>;
507
+ /** Active, owner-facing, recurring (cron) triggers — the Schedules badge */
508
+ recurringActive: number;
461
509
  };
462
510
  }
463
511
  //# sourceMappingURL=trigger-engine.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"trigger-engine.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/trigger-engine.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAUH,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,aAAa,EAClB,KAAK,aAAa,EAIlB,KAAK,kBAAkB,EAGxB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAqBzE;;;;;GAKG;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAE9F;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,UAAU,EAAE,OAAO,CAAC;IACpB,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD;;;;;;;;;;;;;;GAcG;AACH,qBAAa,aAAa;IAqDJ,OAAO,CAAC,QAAQ,CAAC,WAAW;IApDhD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA8B;IAErD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IAEtC,oDAAoD;IACpD,OAAO,CAAC,QAAQ,CAAmC;IAEnD,8CAA8C;IAC9C,OAAO,CAAC,QAAQ,CAAgC;IAChD;;;;;OAKG;IACH,OAAO,CAAC,cAAc,CAAmG;IAEzH,8CAA8C;IAC9C,OAAO,CAAC,aAAa,CAAqC;IAE1D,gDAAgD;IAChD,OAAO,CAAC,iBAAiB,CAA+C;IAExE,+EAA+E;IAC/E,OAAO,CAAC,aAAa,CAAyD;IAE9E,+CAA+C;IAC/C,OAAO,CAAC,OAAO,CAAS;IAExB;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,oBAAoB,CAAK;IAEjC;;;;OAIG;IACH,OAAO;IAMP;;;;;OAKG;WACW,WAAW,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,aAAa;IAQ9D;;OAEG;WACW,aAAa,IAAI,IAAI;IAWnC;;;;OAIG;IACI,WAAW,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI;IAInD;;;;OAIG;IACI,gBAAgB,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI;IAQ5D;;;OAGG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAcnC;;OAEG;IACI,IAAI,IAAI,IAAI;IAiBnB;;;;OAIG;IACI,SAAS,IAAI,OAAO;IAQ3B;;;;;;OAMG;IACU,MAAM,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC;IAiDhE;;;;;OAKG;IACI,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAI3C;;;;;OAKG;IACI,IAAI,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,EAAE;IAQ9C;;;;;OAKG;IACU,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAYhD;;;;;;;OAOG;IACU,sBAAsB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWjF;;;;;OAKG;IACU,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAoBjD;;;;;OAKG;IACU,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAYjD;;;;;OAKG;IACU,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAejD;;;;;;OAMG;IACU,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,UAAO,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA6DlF;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAUxB;;OAEG;IACU,oBAAoB,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAuBjE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;IACH,OAAO,CAAC,SAAS;IAmBjB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAU1B;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,eAAe;IAoCvB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,sBAAsB;IAY9B;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,mBAAmB;IAsB3B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAsB5B;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAO/B;;;;OAIG;IACU,iBAAiB,CAAC,SAAS,EAAE;QACxC,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;KACrB,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAsBhC;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;IAoBrB;;;;;;;OAOG;IACH,OAAO,CAAC,qBAAqB;IAqB7B;;;;;;;;;;;;;;;;OAgBG;YACW,YAAY;IA4B1B;;;;;;;;;;;;;;;;;;;;;;OAsBG;YACW,oBAAoB;IA0ClC;;;;;;;;;;;;OAYG;YACW,mBAAmB;IAyCjC;;;;;;;;;;;;;;;;;;;;OAoBG;IACI,WAAW,IAAI;QACpB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/B,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;KACtC;IAUD;;;;;OAKG;IACH,OAAO,CAAC,uBAAuB;IAwC/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;YACW,eAAe;IAoD7B;;;;OAIG;IACI,SAAS,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QACxC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAChC;CAqBF"}
1
+ {"version":3,"file":"trigger-engine.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/trigger-engine.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAUH,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,aAAa,EAClB,KAAK,aAAa,EAIlB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EAIxB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAuBzE;;;;;;;;;GASG;AACH,MAAM,MAAM,oBAAoB,GAAG,CACjC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,aAAa,KAClB,OAAO,CAAC,IAAI,GAAG,kBAAkB,CAAC,CAAC;AAExC;;;;;;;;GAQG;AACH,MAAM,MAAM,qBAAqB,GAAG,CAClC,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GAAG,SAAS,KAC3B,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,UAAU,EAAE,OAAO,CAAC;IACpB,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD;;;;;;;;;;;;;;GAcG;AACH,qBAAa,aAAa;IAwDJ,OAAO,CAAC,QAAQ,CAAC,WAAW;IAvDhD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA8B;IAErD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IAEtC,oDAAoD;IACpD,OAAO,CAAC,QAAQ,CAAmC;IAEnD,8CAA8C;IAC9C,OAAO,CAAC,QAAQ,CAAgC;IAChD;;;;;OAKG;IACH,OAAO,CAAC,cAAc,CAAmG;IAEzH,8CAA8C;IAC9C,OAAO,CAAC,aAAa,CAAqC;IAE1D,4EAA4E;IAC5E,OAAO,CAAC,cAAc,CAAsC;IAE5D,gDAAgD;IAChD,OAAO,CAAC,iBAAiB,CAA+C;IAExE,+EAA+E;IAC/E,OAAO,CAAC,aAAa,CAAyD;IAE9E,+CAA+C;IAC/C,OAAO,CAAC,OAAO,CAAS;IAExB;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,oBAAoB,CAAK;IAEjC;;;;OAIG;IACH,OAAO;IAMP;;;;;OAKG;WACW,WAAW,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,aAAa;IAQ9D;;OAEG;WACW,aAAa,IAAI,IAAI;IAWnC;;;;OAIG;IACI,WAAW,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI;IAInD;;;;OAIG;IACI,gBAAgB,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI;IAI5D;;;;;OAKG;IACI,iBAAiB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,IAAI;IAQ/D;;;OAGG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBnC;;OAEG;IACI,IAAI,IAAI,IAAI;IAiBnB;;;;OAIG;IACI,SAAS,IAAI,OAAO;IAQ3B;;;;;;OAMG;IACU,MAAM,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC;IAiDhE;;;;;OAKG;IACI,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAI3C;;;;;OAKG;IACI,IAAI,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,EAAE;IAQ9C;;;;;OAKG;IACU,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAYhD;;;;;;;OAOG;IACU,sBAAsB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWjF;;;;;OAKG;IACU,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAoBjD;;;;;OAKG;IACU,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAYjD;;;;;OAKG;IACU,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAejD;;;;;;OAMG;IACU,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,UAAO,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAqElF;;;;;OAKG;IACI,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAKxD;;;;;OAKG;IACU,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC;IAWrD;;;;;;;OAOG;YACW,qBAAqB;IAsBnC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAUxB;;OAEG;IACU,oBAAoB,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAuBjE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;IACH,OAAO,CAAC,SAAS;IAmBjB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAU1B;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,eAAe;IAoCvB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,sBAAsB;IAY9B;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,mBAAmB;IAsB3B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAsB5B;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAO/B;;;;OAIG;IACU,iBAAiB,CAAC,SAAS,EAAE;QACxC,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;KACrB,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAsBhC;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;IAoBrB;;;;;;;OAOG;IACH,OAAO,CAAC,qBAAqB;IAqB7B;;;;;;;;;;;;;;;;OAgBG;YACW,YAAY;IAqC1B;;;;;;;;;;;;;;;;;;;;;;OAsBG;YACW,oBAAoB;IA0ClC;;;;;;;;;;;;OAYG;YACW,mBAAmB;IAyCjC;;;;;;;;;;;;;;;;;;;;OAoBG;IACI,WAAW,IAAI;QACpB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/B,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;KACtC;IAUD;;;;;OAKG;IACH,OAAO,CAAC,uBAAuB;IAwC/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;YACW,eAAe;IAoD7B;;;;OAIG;IACI,SAAS,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QACxC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/B,4EAA4E;QAC5E,eAAe,EAAE,MAAM,CAAC;KACzB;CA0BF"}
@@ -18,10 +18,12 @@ import * as path from 'path';
18
18
  import { LoggerService } from '../core/logger.service.js';
19
19
  import { ensureDir } from '../../utils/file-io.utils.js';
20
20
  import { atomicWriteJsonWithGuard, IntegrityViolationError, } from '../../utils/integrity-guarded-write.utils.js';
21
- import { createTrigger, validateCreateTriggerInput, } from '../../types/v2/index.js';
21
+ import { createTrigger, validateCreateTriggerInput, isRecurringTrigger, } from '../../types/v2/index.js';
22
22
  import { getNextRunTime } from '../workflow/cron-task.service.js';
23
23
  import { resolveProjectDataDir } from '../core/crewly-home.utils.js';
24
24
  import { TRIGGER_ENGINE_CONSTANTS } from '../../constants.js';
25
+ import { classifyTriggerOnLoad } from './trigger-classification.js';
26
+ import { needsExpiryNotice, projectLastFireAt, remainingFires } from './trigger-expiry.js';
25
27
  // ---------------------------------------------------------------------------
26
28
  // Constants
27
29
  // ---------------------------------------------------------------------------
@@ -68,6 +70,8 @@ export class TriggerEngine {
68
70
  signalListener = null;
69
71
  /** Callback for executing trigger actions. */
70
72
  actionHandler = null;
73
+ /** Callback for the expiry heads-up (see {@link TriggerExpiryNotifier}). */
74
+ expiryNotifier = null;
71
75
  /** Interval handle for time trigger polling. */
72
76
  timeCheckInterval = null;
73
77
  /** Timeout handles for one-shot delay/fireAt triggers, keyed by trigger ID. */
@@ -141,6 +145,15 @@ export class TriggerEngine {
141
145
  setActionHandler(handler) {
142
146
  this.actionHandler = handler;
143
147
  }
148
+ /**
149
+ * Sets the callback that warns a team lead before a recurring trigger
150
+ * exhausts its `maxFires`. Without one, no heads-up is sent.
151
+ *
152
+ * @param notifier - Delivery callback
153
+ */
154
+ setExpiryNotifier(notifier) {
155
+ this.expiryNotifier = notifier;
156
+ }
144
157
  // ---------------------------------------------------------------------------
145
158
  // Lifecycle
146
159
  // ---------------------------------------------------------------------------
@@ -159,6 +172,9 @@ export class TriggerEngine {
159
172
  this.setupOneShotTimers();
160
173
  this.running = true;
161
174
  this.logger.info('TriggerEngine started', { triggerCount: this.triggers.size });
175
+ // Triggers already inside the warning window at boot (e.g. after an
176
+ // upgrade) get their heads-up now rather than at their next fire.
177
+ await this.checkExpiringTriggers();
162
178
  }
163
179
  /**
164
180
  * Stops the TriggerEngine: clears intervals, timers, and signal listeners.
@@ -379,12 +395,20 @@ export class TriggerEngine {
379
395
  // Execute action
380
396
  if (this.actionHandler) {
381
397
  try {
382
- await this.actionHandler(trigger, trigger.action);
398
+ const outcome = await this.actionHandler(trigger, trigger.action);
399
+ if (outcome && typeof outcome === 'object' && 'status' in outcome) {
400
+ trigger.lastFireResult = { ...outcome, at: now };
401
+ }
402
+ else {
403
+ delete trigger.lastFireResult;
404
+ }
383
405
  }
384
406
  catch (err) {
407
+ const message = err instanceof Error ? err.message : String(err);
408
+ trigger.lastFireResult = { status: 'failed', detail: message, at: now };
385
409
  this.logger.error('Action handler failed', {
386
410
  triggerId: trigger.id,
387
- error: err instanceof Error ? err.message : String(err),
411
+ error: message,
388
412
  });
389
413
  }
390
414
  }
@@ -409,10 +433,69 @@ export class TriggerEngine {
409
433
  // Recalculate next fire for cron triggers
410
434
  trigger.nextFireAt = this.calculateNextFireAt(trigger.config, trigger.createdAt);
411
435
  }
436
+ await this.maybeSendExpiryNotice(trigger);
412
437
  await this.persistTriggers();
413
438
  return { triggerId: trigger.id, productive, firedAt: now };
414
439
  }
415
440
  // ---------------------------------------------------------------------------
441
+ // Expiry heads-up
442
+ // ---------------------------------------------------------------------------
443
+ /**
444
+ * Projected time of a recurring trigger's final fire (for display).
445
+ *
446
+ * @param id - Trigger UUID
447
+ * @returns ISO time, or undefined when unlimited/unknown
448
+ */
449
+ projectLastFireAt(id) {
450
+ const trigger = this.triggers.get(id);
451
+ return trigger ? projectLastFireAt(trigger) : undefined;
452
+ }
453
+ /**
454
+ * Sends the expiry heads-up for every trigger that is inside the warning
455
+ * window and has not had one yet. Runs at start; fire() covers the rest.
456
+ *
457
+ * @returns Number of heads-ups delivered
458
+ */
459
+ async checkExpiringTriggers() {
460
+ let sent = 0;
461
+ for (const trigger of this.triggers.values()) {
462
+ if (await this.maybeSendExpiryNotice(trigger))
463
+ sent += 1;
464
+ }
465
+ if (sent > 0) {
466
+ await this.persistTriggers();
467
+ }
468
+ return sent;
469
+ }
470
+ /**
471
+ * Deliver the heads-up for one trigger if it is due. Marks
472
+ * `expiryNoticeSentAt` only on success; never changes `maxFires`.
473
+ * The caller persists.
474
+ *
475
+ * @param trigger - Trigger to check
476
+ * @returns True if a heads-up was delivered
477
+ */
478
+ async maybeSendExpiryNotice(trigger) {
479
+ if (!this.expiryNotifier || !needsExpiryNotice(trigger))
480
+ return false;
481
+ const remaining = remainingFires(trigger) ?? 0;
482
+ try {
483
+ const delivered = await this.expiryNotifier(trigger, remaining, projectLastFireAt(trigger));
484
+ if (!delivered)
485
+ return false;
486
+ trigger.expiryNoticeSentAt = new Date().toISOString();
487
+ this.logger.info('Trigger expiry heads-up sent', { id: trigger.id, remaining });
488
+ return true;
489
+ }
490
+ catch (err) {
491
+ this.logger.warn('Trigger expiry heads-up failed; will retry on the next fire', {
492
+ id: trigger.id,
493
+ error: err instanceof Error ? err.message : String(err),
494
+ });
495
+ return false;
496
+ }
497
+ }
498
+ // ---------------------------------------------------------------------------
416
499
  // Time Trigger Handling
417
500
  // ---------------------------------------------------------------------------
418
501
  /**
@@ -755,14 +838,23 @@ export class TriggerEngine {
755
838
  // would see lastKnownActiveCount=0 and incorrectly suppress its warn,
756
839
  // even when the loaded state had legitimate active triggers.
757
840
  this.lastKnownActiveCount = Array.from(this.triggers.values()).filter((t) => t.status === 'active').length;
841
+ // One-time classification of rows persisted before `internal` existed
842
+ // (see trigger-classification.ts). Rows that already carry the flag are
843
+ // untouched, so this is a no-op after the first boot.
844
+ let classified = 0;
845
+ for (const trigger of this.triggers.values()) {
846
+ if (classifyTriggerOnLoad(trigger))
847
+ classified += 1;
848
+ }
758
849
  const cancelledDuplicates = this.dedupeDuplicateTriggers();
759
- if (cancelledDuplicates > 0) {
850
+ if (cancelledDuplicates > 0 || classified > 0) {
760
851
  await this.persistTriggers();
761
852
  }
762
853
  this.logger.info('Loaded triggers from disk', {
763
854
  count: this.triggers.size,
764
855
  activeCount: this.lastKnownActiveCount,
765
856
  cancelledDuplicates,
857
+ classified,
766
858
  });
767
859
  }
768
860
  /**
@@ -1047,15 +1139,20 @@ export class TriggerEngine {
1047
1139
  cancelled: 0,
1048
1140
  };
1049
1141
  const byType = {};
1142
+ let recurringActive = 0;
1050
1143
  for (const trigger of this.triggers.values()) {
1051
1144
  byStatus[trigger.status] = (byStatus[trigger.status] || 0) + 1;
1052
1145
  byType[trigger.type] = (byType[trigger.type] || 0) + 1;
1146
+ if (trigger.status === 'active' && trigger.internal !== true && isRecurringTrigger(trigger)) {
1147
+ recurringActive += 1;
1148
+ }
1053
1149
  }
1054
1150
  return {
1055
1151
  running: this.running,
1056
1152
  total: this.triggers.size,
1057
1153
  byStatus,
1058
1154
  byType,
1155
+ recurringActive,
1059
1156
  };
1060
1157
  }
1061
1158
  }