crewly 1.20.67 → 1.20.69

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 (84) hide show
  1. package/config/skills/agent/core/drive-read/SKILL.md +1 -10
  2. package/config/skills/agent/core/drive-search/SKILL.md +0 -9
  3. package/config/skills/agent/core/drive-upload/SKILL.md +0 -9
  4. package/config/skills/agent/core/google-connect/SKILL.md +44 -0
  5. package/config/skills/agent/core/google-connect/execute.sh +49 -0
  6. package/dist/backend/backend/src/constants.d.ts +53 -0
  7. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  8. package/dist/backend/backend/src/constants.js +53 -0
  9. package/dist/backend/backend/src/constants.js.map +1 -1
  10. package/dist/backend/backend/src/controllers/google/google-connect-card.d.ts +64 -0
  11. package/dist/backend/backend/src/controllers/google/google-connect-card.d.ts.map +1 -0
  12. package/dist/backend/backend/src/controllers/google/google-connect-card.js +122 -0
  13. package/dist/backend/backend/src/controllers/google/google-connect-card.js.map +1 -0
  14. package/dist/backend/backend/src/controllers/google/google.routes.d.ts.map +1 -1
  15. package/dist/backend/backend/src/controllers/google/google.routes.js +4 -0
  16. package/dist/backend/backend/src/controllers/google/google.routes.js.map +1 -1
  17. package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
  18. package/dist/backend/backend/src/controllers/team/team.controller.js +6 -19
  19. package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
  20. package/dist/backend/backend/src/index.d.ts +16 -0
  21. package/dist/backend/backend/src/index.d.ts.map +1 -1
  22. package/dist/backend/backend/src/index.js +32 -0
  23. package/dist/backend/backend/src/index.js.map +1 -1
  24. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +17 -0
  25. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  26. package/dist/backend/backend/src/services/agent/agent-registration.service.js +57 -9
  27. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  28. package/dist/backend/backend/src/services/google/google-workspace-token.service.d.ts +23 -0
  29. package/dist/backend/backend/src/services/google/google-workspace-token.service.d.ts.map +1 -1
  30. package/dist/backend/backend/src/services/google/google-workspace-token.service.js +22 -0
  31. package/dist/backend/backend/src/services/google/google-workspace-token.service.js.map +1 -1
  32. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +23 -0
  33. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
  34. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js +50 -0
  35. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
  36. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.d.ts +11 -0
  37. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
  38. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js +13 -0
  39. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
  40. package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
  41. package/dist/backend/backend/src/services/slack/slack-initializer.js +62 -1
  42. package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
  43. package/dist/backend/backend/src/services/slack/slack.service.d.ts +17 -0
  44. package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -1
  45. package/dist/backend/backend/src/services/slack/slack.service.js +41 -0
  46. package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
  47. package/dist/backend/backend/src/services/v3/trigger-engine.service.d.ts +28 -1
  48. package/dist/backend/backend/src/services/v3/trigger-engine.service.d.ts.map +1 -1
  49. package/dist/backend/backend/src/services/v3/trigger-engine.service.js +66 -30
  50. package/dist/backend/backend/src/services/v3/trigger-engine.service.js.map +1 -1
  51. package/dist/backend/backend/src/services/workflow/cron-task.service.d.ts +11 -1
  52. package/dist/backend/backend/src/services/workflow/cron-task.service.d.ts.map +1 -1
  53. package/dist/backend/backend/src/services/workflow/cron-task.service.js +68 -18
  54. package/dist/backend/backend/src/services/workflow/cron-task.service.js.map +1 -1
  55. package/dist/backend/build-info.json +2 -2
  56. package/dist/cli/backend/src/constants.d.ts +53 -0
  57. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  58. package/dist/cli/backend/src/constants.js +53 -0
  59. package/dist/cli/backend/src/constants.js.map +1 -1
  60. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +17 -0
  61. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  62. package/dist/cli/backend/src/services/agent/agent-registration.service.js +57 -9
  63. package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
  64. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +23 -0
  65. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
  66. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js +50 -0
  67. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
  68. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.d.ts +162 -0
  69. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -0
  70. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.js +708 -0
  71. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.js.map +1 -0
  72. package/dist/cli/backend/src/services/monitoring/runtime-token-parser.service.d.ts +73 -0
  73. package/dist/cli/backend/src/services/monitoring/runtime-token-parser.service.d.ts.map +1 -0
  74. package/dist/cli/backend/src/services/monitoring/runtime-token-parser.service.js +199 -0
  75. package/dist/cli/backend/src/services/monitoring/runtime-token-parser.service.js.map +1 -0
  76. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.d.ts +11 -0
  77. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
  78. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js +13 -0
  79. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
  80. package/dist/cli/backend/src/services/slack/slack.service.d.ts +17 -0
  81. package/dist/cli/backend/src/services/slack/slack.service.d.ts.map +1 -1
  82. package/dist/cli/backend/src/services/slack/slack.service.js +41 -0
  83. package/dist/cli/backend/src/services/slack/slack.service.js.map +1 -1
  84. package/package.json +1 -1
@@ -60,6 +60,29 @@ export declare class SubAgentMessageQueue {
60
60
  * @returns Array of queued messages in insertion order, or empty array
61
61
  */
62
62
  dequeueAll(sessionName: string): QueuedAgentMessage[];
63
+ /**
64
+ * Hand every queued message to `send`, one at a time.
65
+ *
66
+ * `sendMessageToAgent` answers `{ success: true, queued: true }` when it
67
+ * finds the agent busy and puts the message back — so a caller that only
68
+ * checked for a thrown error logged "Delivered" in the same millisecond
69
+ * as the re-queue, and reading the log pointed at the agent when the
70
+ * message had never reached it. Both call sites had their own copy of
71
+ * this loop; this is the shared one, and it distinguishes the two
72
+ * outcomes (2026-09-21, Ella).
73
+ *
74
+ * @param sessionName - The agent session name
75
+ * @param send - Delivers one message; `queued` means it went back on the queue
76
+ * @param gapMs - Pause between messages so the agent can process each
77
+ * @returns How many were delivered, deferred again, and failed
78
+ */
79
+ flush(sessionName: string, send: (data: string) => Promise<{
80
+ queued?: boolean;
81
+ }>, gapMs?: number): Promise<{
82
+ delivered: number;
83
+ deferred: number;
84
+ failed: number;
85
+ }>;
63
86
  /**
64
87
  * Check if there are pending messages for a session.
65
88
  *
@@ -1 +1 @@
1
- {"version":3,"file":"sub-agent-message-queue.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/messaging/sub-agent-message-queue.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAClC,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,WAAW,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,qBAAa,oBAAoB;IAChC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAqC;IAC5D,OAAO,CAAC,eAAe,CAA2C;IAClE,OAAO,CAAC,MAAM,CAAkB;IAEhC,OAAO;IAIP;;;;OAIG;IACH,MAAM,CAAC,WAAW,IAAI,oBAAoB;IAO1C;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,IAAI;IAI5B;;;;;;OAMG;IACH,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IA8BhD;;;;;;OAMG;IACH,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,kBAAkB,EAAE;IAiBrD;;;;;OAKG;IACH,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAKxC;;;;OAIG;IACH,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAWhC;;;;;OAKG;IACH,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;CAIzC"}
1
+ {"version":3,"file":"sub-agent-message-queue.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/messaging/sub-agent-message-queue.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAClC,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,WAAW,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,qBAAa,oBAAoB;IAChC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAqC;IAC5D,OAAO,CAAC,eAAe,CAA2C;IAClE,OAAO,CAAC,MAAM,CAAkB;IAEhC,OAAO;IAIP;;;;OAIG;IACH,MAAM,CAAC,WAAW,IAAI,oBAAoB;IAO1C;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,IAAI;IAI5B;;;;;;OAMG;IACH,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IA8BhD;;;;;;OAMG;IACH,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,kBAAkB,EAAE;IAiBrD;;;;;;;;;;;;;;;OAeG;IACG,KAAK,CACV,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,EACrD,KAAK,SAAI,GACP,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAiCnE;;;;;OAKG;IACH,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAKxC;;;;OAIG;IACH,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAWhC;;;;;OAKG;IACH,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;CAIzC"}
@@ -97,6 +97,56 @@ export class SubAgentMessageQueue {
97
97
  });
98
98
  return messages;
99
99
  }
100
+ /**
101
+ * Hand every queued message to `send`, one at a time.
102
+ *
103
+ * `sendMessageToAgent` answers `{ success: true, queued: true }` when it
104
+ * finds the agent busy and puts the message back — so a caller that only
105
+ * checked for a thrown error logged "Delivered" in the same millisecond
106
+ * as the re-queue, and reading the log pointed at the agent when the
107
+ * message had never reached it. Both call sites had their own copy of
108
+ * this loop; this is the shared one, and it distinguishes the two
109
+ * outcomes (2026-09-21, Ella).
110
+ *
111
+ * @param sessionName - The agent session name
112
+ * @param send - Delivers one message; `queued` means it went back on the queue
113
+ * @param gapMs - Pause between messages so the agent can process each
114
+ * @returns How many were delivered, deferred again, and failed
115
+ */
116
+ async flush(sessionName, send, gapMs = 0) {
117
+ const pending = this.dequeueAll(sessionName);
118
+ const out = { delivered: 0, deferred: 0, failed: 0 };
119
+ for (const [i, queued] of pending.entries()) {
120
+ try {
121
+ const result = await send(queued.data);
122
+ if (result?.queued) {
123
+ out.deferred += 1;
124
+ this.logger.info('Queued message deferred again — agent still busy', {
125
+ sessionName,
126
+ queuedAt: new Date(queued.queuedAt).toISOString(),
127
+ });
128
+ }
129
+ else {
130
+ out.delivered += 1;
131
+ this.logger.info('Queued message delivered', {
132
+ sessionName,
133
+ queuedAt: new Date(queued.queuedAt).toISOString(),
134
+ });
135
+ }
136
+ }
137
+ catch (err) {
138
+ out.failed += 1;
139
+ this.logger.error('Failed to deliver a queued message', {
140
+ sessionName,
141
+ error: err instanceof Error ? err.message : String(err),
142
+ });
143
+ }
144
+ if (gapMs > 0 && i < pending.length - 1) {
145
+ await new Promise((r) => setTimeout(r, gapMs));
146
+ }
147
+ }
148
+ return out;
149
+ }
100
150
  /**
101
151
  * Check if there are pending messages for a session.
102
152
  *
@@ -1 +1 @@
1
- {"version":3,"file":"sub-agent-message-queue.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/messaging/sub-agent-message-queue.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sub-agent-message-queue.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/messaging/sub-agent-message-queue.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,aAAa,EAAmB,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAc/D;;;;;;;GAOG;AACH,MAAM,OAAO,oBAAoB;IACxB,MAAM,CAAC,QAAQ,GAAgC,IAAI,CAAC;IACpD,eAAe,GAAG,IAAI,GAAG,EAAgC,CAAC;IAC1D,MAAM,CAAkB;IAEhC;QACC,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC,qBAAqB,CAAC,sBAAsB,CAAC,CAAC;IACzF,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,WAAW;QACjB,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,CAAC;YACpC,oBAAoB,CAAC,QAAQ,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC5D,CAAC;QACD,OAAO,oBAAoB,CAAC,QAAQ,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,aAAa;QACnB,oBAAoB,CAAC,QAAQ,GAAG,IAAI,CAAC;IACtC,CAAC;IAED;;;;;;OAMG;IACH,OAAO,CAAC,WAAmB,EAAE,IAAY;QACxC,IAAI,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,KAAK,GAAG,EAAE,CAAC;YACX,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAC9C,CAAC;QAED,6BAA6B;QAC7B,IAAI,KAAK,CAAC,MAAM,IAAI,yBAAyB,CAAC,cAAc,EAAE,CAAC;YAC9D,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4CAA4C,EAAE;gBAC9D,WAAW;gBACX,SAAS,EAAE,OAAO,EAAE,QAAQ;gBAC5B,SAAS,EAAE,KAAK,CAAC,MAAM;aACvB,CAAC,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,IAAI,CAAC;YACV,IAAI;YACJ,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE;YACpB,WAAW;SACX,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE;YAChD,WAAW;YACX,SAAS,EAAE,KAAK,CAAC,MAAM;YACvB,UAAU,EAAE,IAAI,CAAC,MAAM;SACvB,CAAC,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACH,UAAU,CAAC,WAAmB;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACpD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO,EAAE,CAAC;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;QAC5B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAEzC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE;YACvD,WAAW;YACX,KAAK,EAAE,QAAQ,CAAC,MAAM;SACtB,CAAC,CAAC;QAEH,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED;;;;;;;;;;;;;;;OAeG;IACH,KAAK,CAAC,KAAK,CACV,WAAmB,EACnB,IAAqD,EACrD,KAAK,GAAG,CAAC;QAET,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAC7C,MAAM,GAAG,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QACrD,KAAK,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YAC7C,IAAI,CAAC;gBACJ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACvC,IAAI,MAAM,EAAE,MAAM,EAAE,CAAC;oBACpB,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC;oBAClB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kDAAkD,EAAE;wBACpE,WAAW;wBACX,QAAQ,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE;qBACjD,CAAC,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACP,GAAG,CAAC,SAAS,IAAI,CAAC,CAAC;oBACnB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE;wBAC5C,WAAW;wBACX,QAAQ,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE;qBACjD,CAAC,CAAC;gBACJ,CAAC;YACF,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;gBAChB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE;oBACvD,WAAW;oBACX,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACvD,CAAC,CAAC;YACJ,CAAC;YACD,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;YAChD,CAAC;QACF,CAAC;QACD,OAAO,GAAG,CAAC;IACZ,CAAC;IAED;;;;;OAKG;IACH,UAAU,CAAC,WAAmB;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACpD,OAAO,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IACpC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,WAAmB;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACpD,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sCAAsC,EAAE;gBACxD,WAAW;gBACX,YAAY,EAAE,KAAK,CAAC,MAAM;aAC1B,CAAC,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC1C,CAAC;IAED;;;;;OAKG;IACH,YAAY,CAAC,WAAmB;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACpD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC"}
@@ -0,0 +1,162 @@
1
+ import { type WorkingStatus } from '../../constants.js';
2
+ import type { EventBusService } from '../event-bus/event-bus.service.js';
3
+ /**
4
+ * Team Working Status File Structure
5
+ * Tracks ONLY workingStatus (idle vs in_progress) based on terminal activity
6
+ * agentStatus is now managed by AgentHeartbeatService via MCP calls
7
+ */
8
+ export interface TeamWorkingStatusFile {
9
+ /** Orchestrator working status */
10
+ orchestrator: {
11
+ sessionName: string;
12
+ workingStatus: WorkingStatus;
13
+ lastActivityCheck: string;
14
+ updatedAt: string;
15
+ };
16
+ /** Team member working statuses indexed by sessionName */
17
+ teamMembers: Record<string, {
18
+ sessionName: string;
19
+ teamMemberId: string;
20
+ workingStatus: WorkingStatus;
21
+ lastActivityCheck: string;
22
+ updatedAt: string;
23
+ }>;
24
+ /** File metadata */
25
+ metadata: {
26
+ lastUpdated: string;
27
+ version: string;
28
+ };
29
+ }
30
+ /**
31
+ * Activity Monitor Service - NEW ARCHITECTURE
32
+ *
33
+ * Responsibilities:
34
+ * - Track ONLY workingStatus (idle vs in_progress) based on terminal activity
35
+ * - Create and manage teamWorkingStatus.json file
36
+ * - Integrate with AgentHeartbeatService for stale agent detection
37
+ * - Remove ALL agentStatus management (now owned by AgentHeartbeatService)
38
+ *
39
+ * Key Changes:
40
+ * - No more agentStatus updates to teams.json
41
+ * - Simple activity detection: output changed = in_progress, else = idle
42
+ * - Integration with stale detection (30-minute threshold)
43
+ * - Separate teamWorkingStatus.json file for working statuses
44
+ */
45
+ export declare class ActivityMonitorService {
46
+ private static instance;
47
+ private logger;
48
+ private storageService;
49
+ private _sessionBackend;
50
+ private agentHeartbeatService;
51
+ private intervalId;
52
+ private readonly POLLING_INTERVAL;
53
+ private lastTerminalOutputs;
54
+ private readonly MAX_OUTPUT_SIZE;
55
+ private readonly ACTIVITY_CHECK_TIMEOUT;
56
+ private lastCleanup;
57
+ private crewlyHome;
58
+ private teamWorkingStatusFile;
59
+ private eventBusService;
60
+ /** Tracks when each session entered in_progress (epoch ms) */
61
+ private busyTransitionTimestamps;
62
+ /** Tracks which sessions have had their agent:busy event emitted */
63
+ private busyEventEmitted;
64
+ /** Tracks last recorded token counts per session to avoid duplicate recording */
65
+ private lastRecordedTokens;
66
+ /** Cached tokenTracking setting, refreshed periodically to avoid async reads in hot path */
67
+ private tokenTrackingEnabled;
68
+ private tokenTrackingLastCheck;
69
+ private constructor();
70
+ /**
71
+ * Get the session backend, lazily initializing if needed.
72
+ */
73
+ private getBackend;
74
+ static getInstance(): ActivityMonitorService;
75
+ /**
76
+ * Inject the EventBusService for direct event publishing on status transitions.
77
+ *
78
+ * @param service - The EventBusService instance
79
+ */
80
+ setEventBusService(service: EventBusService): void;
81
+ /**
82
+ * Build an AgentEvent for a working status transition.
83
+ *
84
+ * @param type - The event type ('agent:busy' or 'agent:idle')
85
+ * @param timestamp - ISO timestamp for the event
86
+ * @param identity - Agent identity fields (team/member/session)
87
+ * @param previousValue - The previous working status
88
+ * @param newValue - The new working status
89
+ * @returns A fully-formed AgentEvent
90
+ */
91
+ private buildAgentEvent;
92
+ /**
93
+ * Handle duration-gated event emission for a session status transition.
94
+ * Suppresses spurious idle→busy→idle cycles by requiring a minimum
95
+ * busy duration (MIN_BUSY_DURATION_MS) before emitting events.
96
+ *
97
+ * @param key - Unique key for tracking (e.g. 'orchestrator' or session name)
98
+ * @param newStatus - The new working status
99
+ * @param previousStatus - The previous working status
100
+ * @param statusChanged - Whether the status actually changed this poll
101
+ * @param identity - Agent identity fields for building the event
102
+ * @param now - ISO timestamp for the event
103
+ */
104
+ private handleDurationGatedEmission;
105
+ startPolling(): void;
106
+ stopPolling(): void;
107
+ private performActivityCheck;
108
+ /**
109
+ * NEW ARCHITECTURE: Simplified activity checking
110
+ *
111
+ * This method now:
112
+ * 1. Detects stale agents via AgentHeartbeatService (30-minute threshold)
113
+ * 2. Checks terminal activity for working status (ONLY)
114
+ * 3. Updates teamWorkingStatus.json (separate from teams.json)
115
+ * 4. Removes ALL agentStatus logic (handled by AgentHeartbeatService)
116
+ */
117
+ private performActivityCheckInternal;
118
+ /**
119
+ * Load teamWorkingStatus.json file with proper initialization
120
+ */
121
+ private loadTeamWorkingStatusFile;
122
+ /**
123
+ * Save teamWorkingStatus.json file with atomic write
124
+ */
125
+ private saveTeamWorkingStatusFile;
126
+ /**
127
+ * Create default teamWorkingStatus.json structure
128
+ */
129
+ private createDefaultTeamWorkingStatusFile;
130
+ /**
131
+ * Cleanup old terminal outputs and perform garbage collection
132
+ */
133
+ private performPeriodicCleanup;
134
+ /**
135
+ * Attempt to parse and record token usage from PTY terminal output.
136
+ *
137
+ * Only records when token tracking is enabled in settings and when the
138
+ * parsed token counts differ from the last recorded values (to avoid
139
+ * duplicate recording from the same output being captured multiple times).
140
+ *
141
+ * @param sessionName - Agent session name
142
+ * @param output - Captured terminal output
143
+ * @param runtimeType - Runtime type hint for parser selection
144
+ */
145
+ private tryRecordPtyTokenUsage;
146
+ /**
147
+ * Get terminal output with size limits for activity detection
148
+ */
149
+ private getTerminalOutput;
150
+ isRunning(): boolean;
151
+ getPollingInterval(): number;
152
+ /**
153
+ * Get current team working status data
154
+ * Useful for external services that need to check working statuses
155
+ */
156
+ getTeamWorkingStatus(): Promise<TeamWorkingStatusFile>;
157
+ /**
158
+ * Get working status for a specific session
159
+ */
160
+ getWorkingStatusForSession(sessionName: string): Promise<WorkingStatus | null>;
161
+ }
162
+ //# sourceMappingURL=activity-monitor.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity-monitor.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/monitoring/activity-monitor.service.ts"],"names":[],"mappings":"AAQA,OAAO,EAAgI,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGtL,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAMzE;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,kCAAkC;IAClC,YAAY,EAAE;QACZ,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,aAAa,CAAC;QAC7B,iBAAiB,EAAE,MAAM,CAAC;QAC1B,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,0DAA0D;IAC1D,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE;QAC1B,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,aAAa,CAAC;QAC7B,iBAAiB,EAAE,MAAM,CAAC;QAC1B,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;IACH,oBAAoB;IACpB,QAAQ,EAAE;QACR,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAyB;IAChD,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,qBAAqB,CAAwB;IACrD,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAkD;IACnF,OAAO,CAAC,mBAAmB,CAAkC;IAC7D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAO;IACvC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAQ;IAC/C,OAAO,CAAC,WAAW,CAAsB;IACzC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,qBAAqB,CAAS;IACtC,OAAO,CAAC,eAAe,CAAgC;IACvD,8DAA8D;IAC9D,OAAO,CAAC,wBAAwB,CAAkC;IAClE,oEAAoE;IACpE,OAAO,CAAC,gBAAgB,CAA0B;IAClD,iFAAiF;IACjF,OAAO,CAAC,kBAAkB,CAA6D;IACvF,4FAA4F;IAC5F,OAAO,CAAC,oBAAoB,CAAS;IACrC,OAAO,CAAC,sBAAsB,CAAK;IAEnC,OAAO;IAQP;;OAEG;YACW,UAAU;WAUV,WAAW,IAAI,sBAAsB;IAOnD;;;;OAIG;IACH,kBAAkB,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAIlD;;;;;;;;;OASG;IACH,OAAO,CAAC,eAAe;IAsBvB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,2BAA2B;IAmD5B,YAAY,IAAI,IAAI;IAiBpB,WAAW,IAAI,IAAI;YAQZ,oBAAoB;IAoBlC;;;;;;;;OAQG;YACW,4BAA4B;IA+U1C;;OAEG;YACW,yBAAyB;IA+BvC;;OAEG;YACW,yBAAyB;IAiBvC;;OAEG;IACH,OAAO,CAAC,kCAAkC;IAiB1C;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAiC9B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,sBAAsB;IAmD9B;;OAEG;YACW,iBAAiB;IAuBxB,SAAS,IAAI,OAAO;IAIpB,kBAAkB,IAAI,MAAM;IAInC;;;OAGG;IACU,oBAAoB,IAAI,OAAO,CAAC,qBAAqB,CAAC;IAInE;;OAEG;IACU,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;CAiB5F"}