devchain-cli 0.2.2 → 0.3.1

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 (146) hide show
  1. package/README.md +2 -0
  2. package/dist/drizzle/0018_whole_zodiak.sql +43 -0
  3. package/dist/drizzle/0019_flat_avengers.sql +3 -0
  4. package/dist/drizzle/0020_statuses_mcp_hidden.sql +1 -0
  5. package/dist/drizzle/meta/0018_snapshot.json +2920 -0
  6. package/dist/drizzle/meta/0019_snapshot.json +2943 -0
  7. package/dist/drizzle/meta/0020_snapshot.json +2951 -0
  8. package/dist/drizzle/meta/_journal.json +21 -0
  9. package/dist/server/app.module.js +11 -1
  10. package/dist/server/app.module.js.map +1 -1
  11. package/dist/server/common/config/env.config.d.ts +1 -0
  12. package/dist/server/common/config/env.config.js +4 -0
  13. package/dist/server/common/config/env.config.js.map +1 -1
  14. package/dist/server/common/filters/http-exception.filter.js +24 -1
  15. package/dist/server/common/filters/http-exception.filter.js.map +1 -1
  16. package/dist/server/common/logging/logger.js +4 -3
  17. package/dist/server/common/logging/logger.js.map +1 -1
  18. package/dist/server/main.js +0 -3
  19. package/dist/server/main.js.map +1 -1
  20. package/dist/server/modules/agents/agents.module.js +2 -1
  21. package/dist/server/modules/agents/agents.module.js.map +1 -1
  22. package/dist/server/modules/agents/controllers/agents.controller.d.ts +17 -2
  23. package/dist/server/modules/agents/controllers/agents.controller.js +84 -3
  24. package/dist/server/modules/agents/controllers/agents.controller.js.map +1 -1
  25. package/dist/server/modules/chat/dtos/chat.dto.d.ts +18 -18
  26. package/dist/server/modules/chat/services/invite-template.util.js +1 -1
  27. package/dist/server/modules/chat/services/invite-template.util.js.map +1 -1
  28. package/dist/server/modules/events/catalog/index.d.ts +40 -0
  29. package/dist/server/modules/events/catalog/index.js +2 -0
  30. package/dist/server/modules/events/catalog/index.js.map +1 -1
  31. package/dist/server/modules/events/catalog/terminal.watcher.triggered.d.ts +45 -0
  32. package/dist/server/modules/events/catalog/terminal.watcher.triggered.js +22 -0
  33. package/dist/server/modules/events/catalog/terminal.watcher.triggered.js.map +1 -0
  34. package/dist/server/modules/events/subscribers/chat-message-delivery.subscriber.d.ts +1 -0
  35. package/dist/server/modules/events/subscribers/chat-message-delivery.subscriber.js +30 -12
  36. package/dist/server/modules/events/subscribers/chat-message-delivery.subscriber.js.map +1 -1
  37. package/dist/server/modules/mcp/constants.js +5 -1
  38. package/dist/server/modules/mcp/constants.js.map +1 -1
  39. package/dist/server/modules/mcp/controllers/mcp-http.controller.js +78 -77
  40. package/dist/server/modules/mcp/controllers/mcp-http.controller.js.map +1 -1
  41. package/dist/server/modules/mcp/controllers/mcp-sdk.controller.js +78 -77
  42. package/dist/server/modules/mcp/controllers/mcp-sdk.controller.js.map +1 -1
  43. package/dist/server/modules/mcp/dtos/mcp.dto.d.ts +125 -97
  44. package/dist/server/modules/mcp/dtos/mcp.dto.js +23 -26
  45. package/dist/server/modules/mcp/dtos/mcp.dto.js.map +1 -1
  46. package/dist/server/modules/mcp/services/instructions-resolver.d.ts +3 -0
  47. package/dist/server/modules/mcp/services/instructions-resolver.js +83 -2
  48. package/dist/server/modules/mcp/services/instructions-resolver.js.map +1 -1
  49. package/dist/server/modules/mcp/services/mcp.service.d.ts +3 -2
  50. package/dist/server/modules/mcp/services/mcp.service.js +549 -263
  51. package/dist/server/modules/mcp/services/mcp.service.js.map +1 -1
  52. package/dist/server/modules/projects/controllers/projects.controller.d.ts +41 -0
  53. package/dist/server/modules/projects/projects.module.js +2 -1
  54. package/dist/server/modules/projects/projects.module.js.map +1 -1
  55. package/dist/server/modules/projects/services/projects.service.d.ts +46 -1
  56. package/dist/server/modules/projects/services/projects.service.js +243 -18
  57. package/dist/server/modules/projects/services/projects.service.js.map +1 -1
  58. package/dist/server/modules/prompts/controllers/prompts.controller.d.ts +1 -1
  59. package/dist/server/modules/prompts/controllers/prompts.controller.js +26 -4
  60. package/dist/server/modules/prompts/controllers/prompts.controller.js.map +1 -1
  61. package/dist/server/modules/sessions/utils/template-renderer.js +1 -0
  62. package/dist/server/modules/sessions/utils/template-renderer.js.map +1 -1
  63. package/dist/server/modules/statuses/controllers/statuses.controller.js +2 -0
  64. package/dist/server/modules/statuses/controllers/statuses.controller.js.map +1 -1
  65. package/dist/server/modules/storage/db/schema.d.ts +613 -0
  66. package/dist/server/modules/storage/db/schema.js +50 -1
  67. package/dist/server/modules/storage/db/schema.js.map +1 -1
  68. package/dist/server/modules/storage/interfaces/storage.interface.d.ts +40 -2
  69. package/dist/server/modules/storage/interfaces/storage.interface.js.map +1 -1
  70. package/dist/server/modules/storage/local/local-storage.service.d.ts +18 -3
  71. package/dist/server/modules/storage/local/local-storage.service.js +407 -11
  72. package/dist/server/modules/storage/local/local-storage.service.js.map +1 -1
  73. package/dist/server/modules/storage/models/domain.models.d.ts +59 -1
  74. package/dist/server/modules/subscribers/actions/action.interface.d.ts +67 -0
  75. package/dist/server/modules/subscribers/actions/action.interface.js +3 -0
  76. package/dist/server/modules/subscribers/actions/action.interface.js.map +1 -0
  77. package/dist/server/modules/subscribers/actions/actions.registry.d.ts +7 -0
  78. package/dist/server/modules/subscribers/actions/actions.registry.js +37 -0
  79. package/dist/server/modules/subscribers/actions/actions.registry.js.map +1 -0
  80. package/dist/server/modules/subscribers/actions/restart-agent.action.d.ts +8 -0
  81. package/dist/server/modules/subscribers/actions/restart-agent.action.js +119 -0
  82. package/dist/server/modules/subscribers/actions/restart-agent.action.js.map +1 -0
  83. package/dist/server/modules/subscribers/actions/send-message.action.d.ts +2 -0
  84. package/dist/server/modules/subscribers/actions/send-message.action.js +83 -0
  85. package/dist/server/modules/subscribers/actions/send-message.action.js.map +1 -0
  86. package/dist/server/modules/subscribers/controllers/actions.controller.d.ts +6 -0
  87. package/dist/server/modules/subscribers/controllers/actions.controller.js +51 -0
  88. package/dist/server/modules/subscribers/controllers/actions.controller.js.map +1 -0
  89. package/dist/server/modules/subscribers/controllers/subscribers.controller.d.ts +17 -0
  90. package/dist/server/modules/subscribers/controllers/subscribers.controller.js +178 -0
  91. package/dist/server/modules/subscribers/controllers/subscribers.controller.js.map +1 -0
  92. package/dist/server/modules/subscribers/dtos/subscriber.dto.d.ts +251 -0
  93. package/dist/server/modules/subscribers/dtos/subscriber.dto.js +68 -0
  94. package/dist/server/modules/subscribers/dtos/subscriber.dto.js.map +1 -0
  95. package/dist/server/modules/subscribers/events/event-fields-catalog.d.ts +19 -0
  96. package/dist/server/modules/subscribers/events/event-fields-catalog.js +98 -0
  97. package/dist/server/modules/subscribers/events/event-fields-catalog.js.map +1 -0
  98. package/dist/server/modules/subscribers/services/automation-scheduler.service.d.ts +49 -0
  99. package/dist/server/modules/subscribers/services/automation-scheduler.service.js +300 -0
  100. package/dist/server/modules/subscribers/services/automation-scheduler.service.js.map +1 -0
  101. package/dist/server/modules/subscribers/services/subscriber-executor.service.d.ts +77 -0
  102. package/dist/server/modules/subscribers/services/subscriber-executor.service.js +576 -0
  103. package/dist/server/modules/subscribers/services/subscriber-executor.service.js.map +1 -0
  104. package/dist/server/modules/subscribers/services/subscribers.service.d.ts +14 -0
  105. package/dist/server/modules/subscribers/services/subscribers.service.js +70 -0
  106. package/dist/server/modules/subscribers/services/subscribers.service.js.map +1 -0
  107. package/dist/server/modules/subscribers/subscribers.module.d.ts +2 -0
  108. package/dist/server/modules/subscribers/subscribers.module.js +36 -0
  109. package/dist/server/modules/subscribers/subscribers.module.js.map +1 -0
  110. package/dist/server/modules/terminal/services/tmux.service.js +9 -6
  111. package/dist/server/modules/terminal/services/tmux.service.js.map +1 -1
  112. package/dist/server/modules/watchers/controllers/watchers.controller.d.ts +16 -0
  113. package/dist/server/modules/watchers/controllers/watchers.controller.js +180 -0
  114. package/dist/server/modules/watchers/controllers/watchers.controller.js.map +1 -0
  115. package/dist/server/modules/watchers/dtos/watcher.dto.d.ts +206 -0
  116. package/dist/server/modules/watchers/dtos/watcher.dto.js +54 -0
  117. package/dist/server/modules/watchers/dtos/watcher.dto.js.map +1 -0
  118. package/dist/server/modules/watchers/services/watcher-runner.service.d.ts +68 -0
  119. package/dist/server/modules/watchers/services/watcher-runner.service.js +477 -0
  120. package/dist/server/modules/watchers/services/watcher-runner.service.js.map +1 -0
  121. package/dist/server/modules/watchers/services/watchers.service.d.ts +29 -0
  122. package/dist/server/modules/watchers/services/watchers.service.js +98 -0
  123. package/dist/server/modules/watchers/services/watchers.service.js.map +1 -0
  124. package/dist/server/modules/watchers/watchers.module.d.ts +2 -0
  125. package/dist/server/modules/watchers/watchers.module.js +34 -0
  126. package/dist/server/modules/watchers/watchers.module.js.map +1 -0
  127. package/dist/server/templates/claude-codex-advanced.json +377 -0
  128. package/dist/server/templates/claude-opus.json +29 -25
  129. package/dist/server/templates/simple-codex.json +29 -25
  130. package/dist/server/test-setup-node.d.ts +1 -0
  131. package/dist/server/test-setup-node.js +8 -0
  132. package/dist/server/test-setup-node.js.map +1 -0
  133. package/dist/server/test-setup.js +2 -0
  134. package/dist/server/test-setup.js.map +1 -1
  135. package/dist/server/tsconfig.tsbuildinfo +1 -1
  136. package/dist/server/ui/assets/index-C9GXCjnF.js +700 -0
  137. package/dist/server/ui/assets/index-o0FbZg-1.css +32 -0
  138. package/dist/server/ui/index.html +2 -2
  139. package/dist/templates/claude-codex-advanced.json +377 -0
  140. package/dist/templates/claude-opus.json +29 -25
  141. package/dist/templates/simple-codex.json +29 -25
  142. package/package.json +41 -27
  143. package/dist/server/templates/codex-claude.json +0 -178
  144. package/dist/server/ui/assets/index-CbYIbCQV.css +0 -32
  145. package/dist/server/ui/assets/index-sfYpjMjv.js +0 -641
  146. package/dist/templates/codex-claude.json +0 -178
@@ -0,0 +1,576 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.SubscriberExecutorService = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const logger_1 = require("../../../common/logging/logger");
18
+ const event_emitter_1 = require("@nestjs/event-emitter");
19
+ const storage_interface_1 = require("../../storage/interfaces/storage.interface");
20
+ const tmux_service_1 = require("../../terminal/services/tmux.service");
21
+ const sessions_service_1 = require("../../sessions/services/sessions.service");
22
+ const session_coordinator_service_1 = require("../../sessions/services/session-coordinator.service");
23
+ const terminal_send_coordinator_service_1 = require("../../terminal/services/terminal-send-coordinator.service");
24
+ const actions_registry_1 = require("../actions/actions.registry");
25
+ const event_fields_catalog_1 = require("../events/event-fields-catalog");
26
+ const event_log_service_1 = require("../../events/services/event-log.service");
27
+ const events_service_1 = require("../../events/services/events.service");
28
+ const automation_scheduler_service_1 = require("./automation-scheduler.service");
29
+ let SubscriberExecutorService = class SubscriberExecutorService {
30
+ constructor(storage, tmuxService, sessionsService, sessionCoordinator, sendCoordinator, eventLogService, eventEmitter, scheduler) {
31
+ this.storage = storage;
32
+ this.tmuxService = tmuxService;
33
+ this.sessionsService = sessionsService;
34
+ this.sessionCoordinator = sessionCoordinator;
35
+ this.sendCoordinator = sendCoordinator;
36
+ this.eventLogService = eventLogService;
37
+ this.eventEmitter = eventEmitter;
38
+ this.scheduler = scheduler;
39
+ this.logger = (0, logger_1.createLogger)('SubscriberExecutorService');
40
+ this.subscriberLastExec = new Map();
41
+ this.eventHandler = null;
42
+ }
43
+ async onModuleInit() {
44
+ this.eventHandler = (eventName, ...args) => {
45
+ const name = Array.isArray(eventName) ? eventName[0] : eventName;
46
+ if (!name) {
47
+ return;
48
+ }
49
+ if (!(0, event_fields_catalog_1.isSubscribableEvent)(name)) {
50
+ return;
51
+ }
52
+ const payload = args[0];
53
+ if (!payload || typeof payload !== 'object') {
54
+ this.logger.warn({ eventName: name }, 'Event payload is not an object, skipping');
55
+ return;
56
+ }
57
+ void this.scheduleEventProcessing(name, payload).catch((error) => {
58
+ this.logger.error({ eventName: name, error: error instanceof Error ? error.message : String(error) }, 'Failed to schedule subscribers for event');
59
+ });
60
+ };
61
+ this.eventEmitter.onAny(this.eventHandler);
62
+ this.logger.info('SubscriberExecutorService initialized with onAny listener');
63
+ }
64
+ onModuleDestroy() {
65
+ if (this.eventHandler) {
66
+ this.eventEmitter.offAny(this.eventHandler);
67
+ this.eventHandler = null;
68
+ }
69
+ this.logger.info('SubscriberExecutorService destroyed');
70
+ }
71
+ async resolveProjectId(payload) {
72
+ if (payload.projectId) {
73
+ return payload.projectId;
74
+ }
75
+ if (payload.sessionId) {
76
+ try {
77
+ const session = this.sessionsService.getSession(payload.sessionId);
78
+ if (session?.agentId) {
79
+ const agent = await this.storage.getAgent(session.agentId);
80
+ if (agent?.projectId) {
81
+ this.logger.debug({
82
+ sessionId: payload.sessionId,
83
+ agentId: session.agentId,
84
+ projectId: agent.projectId,
85
+ }, 'Resolved projectId via session lookup');
86
+ return agent.projectId;
87
+ }
88
+ }
89
+ }
90
+ catch (error) {
91
+ this.logger.warn({ sessionId: payload.sessionId, error: String(error) }, 'Failed to resolve projectId via session lookup');
92
+ }
93
+ }
94
+ return null;
95
+ }
96
+ async scheduleEventProcessing(eventName, payload) {
97
+ const scheduleStartedAt = new Date().toISOString();
98
+ const metadata = (0, events_service_1.getEventMetadata)(payload);
99
+ if (!(0, event_fields_catalog_1.isSubscribableEvent)(eventName)) {
100
+ return null;
101
+ }
102
+ const projectId = await this.resolveProjectId(payload);
103
+ if (!projectId) {
104
+ this.logger.warn({ eventName }, 'Could not resolve projectId for event, skipping');
105
+ return null;
106
+ }
107
+ try {
108
+ const subscriberEventName = eventName === 'terminal.watcher.triggered' &&
109
+ payload.customEventName
110
+ ? payload.customEventName
111
+ : eventName;
112
+ const subscribers = await this.storage.findSubscribersByEventName(projectId, subscriberEventName);
113
+ const eventId = metadata?.id ?? `evt-${Date.now()}`;
114
+ const now = Date.now();
115
+ const scheduledAt = new Date(now).toISOString();
116
+ const scheduledTasks = [];
117
+ const skippedSubscribers = [];
118
+ for (const subscriber of subscribers) {
119
+ if (!subscriber.enabled) {
120
+ skippedSubscribers.push({
121
+ subscriberId: subscriber.id,
122
+ subscriberName: subscriber.name,
123
+ reason: 'disabled',
124
+ });
125
+ continue;
126
+ }
127
+ if (subscriber.eventFilter && !this.matchesFilter(subscriber.eventFilter, payload)) {
128
+ this.logger.debug({ subscriberId: subscriber.id, filter: subscriber.eventFilter }, 'Subscriber filtered out by event filter');
129
+ skippedSubscribers.push({
130
+ subscriberId: subscriber.id,
131
+ subscriberName: subscriber.name,
132
+ reason: 'filter_not_matched',
133
+ });
134
+ continue;
135
+ }
136
+ const groupKey = subscriber.groupName ?? `event:${subscriberEventName}`;
137
+ const delayMs = subscriber.delayMs ?? 0;
138
+ const runAt = now + delayMs;
139
+ const runAtIso = new Date(runAt).toISOString();
140
+ const priority = subscriber.priority ?? 0;
141
+ const position = subscriber.position ?? 0;
142
+ const subscriberId = subscriber.id;
143
+ const subscriberName = subscriber.name;
144
+ const actionType = subscriber.actionType;
145
+ const task = {
146
+ taskId: `${subscriberId}-${eventId}`,
147
+ subscriberId,
148
+ eventId,
149
+ runAt,
150
+ priority,
151
+ position,
152
+ createdAt: scheduledAt,
153
+ agentId: payload.agentId ?? undefined,
154
+ groupKey,
155
+ execute: async () => this.executeSubscriberForTask(subscriberId, subscriberName, actionType, eventName, payload, scheduledAt),
156
+ };
157
+ this.scheduler.schedule(task);
158
+ scheduledTasks.push({
159
+ subscriberId,
160
+ subscriberName,
161
+ runAtIso,
162
+ delayMs,
163
+ groupKey,
164
+ priority,
165
+ position,
166
+ });
167
+ }
168
+ if (metadata?.id && (scheduledTasks.length > 0 || skippedSubscribers.length > 0)) {
169
+ await this.eventLogService.recordHandledOk({
170
+ eventId: metadata.id,
171
+ handler: 'SubscriberExecutorService:schedule',
172
+ detail: {
173
+ matched: subscribers.length,
174
+ scheduled: scheduledTasks.length,
175
+ skipped: skippedSubscribers.length,
176
+ tasks: scheduledTasks,
177
+ skips: skippedSubscribers,
178
+ },
179
+ startedAt: scheduleStartedAt,
180
+ endedAt: new Date().toISOString(),
181
+ });
182
+ }
183
+ return {
184
+ eventName,
185
+ subscribersMatched: subscribers.length,
186
+ subscribersScheduled: scheduledTasks.length,
187
+ subscribersSkipped: skippedSubscribers.length,
188
+ scheduledTasks,
189
+ skippedSubscribers,
190
+ };
191
+ }
192
+ catch (error) {
193
+ if (metadata?.id) {
194
+ await this.eventLogService.recordHandledFail({
195
+ eventId: metadata.id,
196
+ handler: 'SubscriberExecutorService:schedule',
197
+ detail: {
198
+ error: error instanceof Error ? error.message : String(error),
199
+ },
200
+ startedAt: scheduleStartedAt,
201
+ endedAt: new Date().toISOString(),
202
+ });
203
+ }
204
+ throw error;
205
+ }
206
+ }
207
+ async executeSubscriberForTask(subscriberId, subscriberNameAtSchedule, actionTypeAtSchedule, eventName, payload, scheduledAt) {
208
+ const startTime = Date.now();
209
+ const executedAt = new Date(startTime).toISOString();
210
+ const metadata = (0, events_service_1.getEventMetadata)(payload);
211
+ const recordExecuteEntry = async (result, subscriberName, actionType) => {
212
+ if (!metadata?.id)
213
+ return;
214
+ const detail = {
215
+ subscriberId,
216
+ subscriberName,
217
+ actionType,
218
+ success: result.success,
219
+ message: result.message,
220
+ error: result.error,
221
+ skipped: result.skipped,
222
+ skipReason: result.skipReason,
223
+ scheduledAt,
224
+ executedAt,
225
+ durationMs: result.durationMs,
226
+ };
227
+ if (result.success) {
228
+ await this.eventLogService.recordHandledOk({
229
+ eventId: metadata.id,
230
+ handler: 'SubscriberExecutorService:execute',
231
+ detail,
232
+ startedAt: executedAt,
233
+ endedAt: new Date().toISOString(),
234
+ });
235
+ }
236
+ else {
237
+ await this.eventLogService.recordHandledFail({
238
+ eventId: metadata.id,
239
+ handler: 'SubscriberExecutorService:execute',
240
+ detail,
241
+ startedAt: executedAt,
242
+ endedAt: new Date().toISOString(),
243
+ });
244
+ }
245
+ };
246
+ const subscriber = await this.storage.getSubscriber(subscriberId);
247
+ if (!subscriber) {
248
+ this.logger.debug({ subscriberId }, 'Subscriber was deleted, skipping execution');
249
+ const result = {
250
+ subscriberId,
251
+ subscriberName: subscriberNameAtSchedule,
252
+ actionType: actionTypeAtSchedule,
253
+ success: false,
254
+ durationMs: Date.now() - startTime,
255
+ skipped: true,
256
+ skipReason: 'deleted',
257
+ };
258
+ await recordExecuteEntry(result, subscriberNameAtSchedule, actionTypeAtSchedule);
259
+ return result;
260
+ }
261
+ if (!subscriber.enabled) {
262
+ this.logger.debug({ subscriberId }, 'Subscriber is now disabled, skipping execution');
263
+ const result = {
264
+ subscriberId,
265
+ subscriberName: subscriber.name,
266
+ actionType: subscriber.actionType,
267
+ success: false,
268
+ durationMs: Date.now() - startTime,
269
+ skipped: true,
270
+ skipReason: 'disabled',
271
+ };
272
+ await recordExecuteEntry(result, subscriber.name, subscriber.actionType);
273
+ return result;
274
+ }
275
+ if (subscriber.eventFilter && !this.matchesFilter(subscriber.eventFilter, payload)) {
276
+ this.logger.debug({ subscriberId, filter: subscriber.eventFilter }, 'Subscriber no longer matches event filter, skipping execution');
277
+ const result = {
278
+ subscriberId,
279
+ subscriberName: subscriber.name,
280
+ actionType: subscriber.actionType,
281
+ success: false,
282
+ durationMs: Date.now() - startTime,
283
+ skipped: true,
284
+ skipReason: 'filter_not_matched',
285
+ };
286
+ await recordExecuteEntry(result, subscriber.name, subscriber.actionType);
287
+ return result;
288
+ }
289
+ const result = await this.executeSubscriber(subscriber, eventName, payload);
290
+ await recordExecuteEntry(result, subscriber.name, subscriber.actionType);
291
+ return result;
292
+ }
293
+ async handleEvent(eventName, payload) {
294
+ return this.scheduleEventProcessing(eventName, payload);
295
+ }
296
+ getSubscribableEventNames() {
297
+ return (0, event_fields_catalog_1.getSubscribableEvents)();
298
+ }
299
+ matchesFilter(filter, payload) {
300
+ const fieldValue = this.getPayloadField(payload, filter.field);
301
+ if (fieldValue === undefined || fieldValue === null) {
302
+ return false;
303
+ }
304
+ const stringValue = String(fieldValue);
305
+ switch (filter.operator) {
306
+ case 'equals':
307
+ return stringValue === filter.value;
308
+ case 'contains':
309
+ return stringValue.includes(filter.value);
310
+ case 'regex':
311
+ try {
312
+ const regex = new RegExp(filter.value);
313
+ return regex.test(stringValue);
314
+ }
315
+ catch {
316
+ this.logger.warn({ pattern: filter.value }, 'Invalid regex pattern in event filter');
317
+ return false;
318
+ }
319
+ default:
320
+ return false;
321
+ }
322
+ }
323
+ getPayloadField(payload, field) {
324
+ return this.getNestedValue(payload, field);
325
+ }
326
+ getNestedValue(obj, path) {
327
+ if (obj === null || obj === undefined) {
328
+ return undefined;
329
+ }
330
+ return path.split('.').reduce((current, key) => {
331
+ if (current === null || current === undefined) {
332
+ return undefined;
333
+ }
334
+ if (typeof current !== 'object') {
335
+ return undefined;
336
+ }
337
+ return current[key];
338
+ }, obj);
339
+ }
340
+ interpolateTemplate(template, templateContext) {
341
+ return template.replace(/\{\{(\w+(?:\.\w+)*)\}\}/g, (match, field) => {
342
+ const value = this.getNestedValue(templateContext, field);
343
+ if (value === undefined) {
344
+ return match;
345
+ }
346
+ if (value === null) {
347
+ return '';
348
+ }
349
+ return String(value);
350
+ });
351
+ }
352
+ resolveInputs(inputMappings, payload, templateVars) {
353
+ const resolved = {};
354
+ const context = templateVars ?? payload;
355
+ for (const [inputName, mapping] of Object.entries(inputMappings)) {
356
+ if (mapping.source === 'event_field') {
357
+ resolved[inputName] = mapping.eventField
358
+ ? this.getNestedValue(context, mapping.eventField)
359
+ : undefined;
360
+ }
361
+ else {
362
+ const customValue = mapping.customValue;
363
+ if (typeof customValue === 'string') {
364
+ resolved[inputName] = this.interpolateTemplate(customValue, context);
365
+ }
366
+ else {
367
+ resolved[inputName] = customValue;
368
+ }
369
+ }
370
+ }
371
+ return resolved;
372
+ }
373
+ async executeSubscriber(subscriber, eventName, payload) {
374
+ const startTime = Date.now();
375
+ const sessionId = payload.sessionId || '';
376
+ const projectId = await this.resolveProjectId(payload);
377
+ if (!projectId) {
378
+ this.logger.error({ subscriberId: subscriber.id, sessionId: sessionId || '(no session)' }, 'Could not resolve projectId for subscriber execution');
379
+ return {
380
+ subscriberId: subscriber.id,
381
+ subscriberName: subscriber.name,
382
+ actionType: subscriber.actionType,
383
+ success: false,
384
+ error: 'Could not resolve projectId',
385
+ durationMs: Date.now() - startTime,
386
+ skipped: true,
387
+ skipReason: 'session_error',
388
+ };
389
+ }
390
+ this.logger.debug({
391
+ subscriberId: subscriber.id,
392
+ subscriberName: subscriber.name,
393
+ actionType: subscriber.actionType,
394
+ sessionId: sessionId || '(no session)',
395
+ }, 'Executing subscriber');
396
+ const cooldownKey = sessionId || 'no-session';
397
+ if (this.isOnCooldown(subscriber.id, cooldownKey, subscriber.cooldownMs)) {
398
+ this.logger.debug({
399
+ subscriberId: subscriber.id,
400
+ sessionId: sessionId || '(no session)',
401
+ cooldownMs: subscriber.cooldownMs,
402
+ }, 'Subscriber is on cooldown, skipping execution');
403
+ return {
404
+ subscriberId: subscriber.id,
405
+ subscriberName: subscriber.name,
406
+ actionType: subscriber.actionType,
407
+ success: false,
408
+ durationMs: Date.now() - startTime,
409
+ skipped: true,
410
+ skipReason: 'cooldown',
411
+ };
412
+ }
413
+ const action = (0, actions_registry_1.getAction)(subscriber.actionType);
414
+ if (!action) {
415
+ this.logger.error({ actionType: subscriber.actionType }, 'Unknown action type');
416
+ return {
417
+ subscriberId: subscriber.id,
418
+ subscriberName: subscriber.name,
419
+ actionType: subscriber.actionType,
420
+ success: false,
421
+ error: `Unknown action type: ${subscriber.actionType}`,
422
+ durationMs: Date.now() - startTime,
423
+ skipped: true,
424
+ skipReason: 'action_not_found',
425
+ };
426
+ }
427
+ const metadata = (0, events_service_1.getEventMetadata)(payload);
428
+ const occurredAt = new Date().toISOString();
429
+ const event = {
430
+ eventName,
431
+ projectId,
432
+ agentId: payload.agentId ?? null,
433
+ sessionId: payload.sessionId,
434
+ occurredAt,
435
+ eventId: metadata?.id,
436
+ payload: payload,
437
+ };
438
+ const templateVars = {
439
+ ...payload,
440
+ eventName,
441
+ projectId,
442
+ agentId: payload.agentId ?? null,
443
+ sessionId: payload.sessionId,
444
+ sessionIdShort: payload.sessionId?.slice(0, 8) ?? '',
445
+ occurredAt,
446
+ eventId: metadata?.id,
447
+ };
448
+ const resolvedInputs = this.resolveInputs(subscriber.actionInputs, payload, templateVars);
449
+ if (subscriber.actionType === 'restart_agent' && 'agentId' in resolvedInputs) {
450
+ delete resolvedInputs.agentId;
451
+ this.logger.debug({ subscriberId: subscriber.id }, 'Ignoring legacy restart_agent input mapping: agentId');
452
+ }
453
+ let tmuxSessionName = '';
454
+ if (sessionId) {
455
+ const session = this.sessionsService.getSession(sessionId);
456
+ if (!session) {
457
+ this.logger.error({ sessionId }, 'Session not found');
458
+ return {
459
+ subscriberId: subscriber.id,
460
+ subscriberName: subscriber.name,
461
+ actionType: subscriber.actionType,
462
+ success: false,
463
+ error: `Session ${sessionId} not found`,
464
+ durationMs: Date.now() - startTime,
465
+ skipped: true,
466
+ skipReason: 'session_error',
467
+ };
468
+ }
469
+ if (!session.tmuxSessionId) {
470
+ this.logger.error({ sessionId }, 'Session has no tmux session');
471
+ return {
472
+ subscriberId: subscriber.id,
473
+ subscriberName: subscriber.name,
474
+ actionType: subscriber.actionType,
475
+ success: false,
476
+ error: `Session ${sessionId} has no tmux session`,
477
+ durationMs: Date.now() - startTime,
478
+ skipped: true,
479
+ skipReason: 'session_error',
480
+ };
481
+ }
482
+ tmuxSessionName = session.tmuxSessionId;
483
+ }
484
+ const context = {
485
+ tmuxService: this.tmuxService,
486
+ sessionsService: this.sessionsService,
487
+ sessionCoordinator: this.sessionCoordinator,
488
+ sendCoordinator: this.sendCoordinator,
489
+ storage: this.storage,
490
+ sessionId,
491
+ agentId: payload.agentId ?? null,
492
+ projectId,
493
+ tmuxSessionName,
494
+ event,
495
+ logger: this.logger,
496
+ };
497
+ let actionResult;
498
+ try {
499
+ actionResult = await action.execute(context, resolvedInputs);
500
+ }
501
+ catch (error) {
502
+ this.logger.error({ subscriberId: subscriber.id, error: String(error) }, 'Action execution threw an error');
503
+ this.setCooldown(subscriber.id, cooldownKey);
504
+ return {
505
+ subscriberId: subscriber.id,
506
+ subscriberName: subscriber.name,
507
+ actionType: subscriber.actionType,
508
+ success: false,
509
+ error: String(error),
510
+ durationMs: Date.now() - startTime,
511
+ };
512
+ }
513
+ this.setCooldown(subscriber.id, cooldownKey);
514
+ if (!actionResult.success && subscriber.retryOnError) {
515
+ this.logger.debug({ subscriberId: subscriber.id, error: actionResult.error }, 'Action failed, retrying after 1s delay');
516
+ await new Promise((resolve) => setTimeout(resolve, 1000));
517
+ try {
518
+ const retryResult = await action.execute(context, resolvedInputs);
519
+ if (!retryResult.success) {
520
+ this.logger.warn({ subscriberId: subscriber.id, error: retryResult.error }, 'Retry also failed');
521
+ }
522
+ else {
523
+ this.logger.debug({ subscriberId: subscriber.id }, 'Retry succeeded');
524
+ actionResult = retryResult;
525
+ }
526
+ }
527
+ catch (retryError) {
528
+ this.logger.error({ subscriberId: subscriber.id, error: String(retryError) }, 'Retry threw an error');
529
+ }
530
+ }
531
+ this.logger.info({
532
+ subscriberId: subscriber.id,
533
+ subscriberName: subscriber.name,
534
+ success: actionResult.success,
535
+ }, 'Subscriber execution completed');
536
+ return {
537
+ subscriberId: subscriber.id,
538
+ subscriberName: subscriber.name,
539
+ actionType: subscriber.actionType,
540
+ success: actionResult.success,
541
+ message: actionResult.message,
542
+ error: actionResult.error,
543
+ durationMs: Date.now() - startTime,
544
+ };
545
+ }
546
+ isOnCooldown(subscriberId, sessionId, cooldownMs) {
547
+ if (cooldownMs <= 0)
548
+ return false;
549
+ const key = `${subscriberId}:${sessionId}`;
550
+ const lastExec = this.subscriberLastExec.get(key);
551
+ if (!lastExec)
552
+ return false;
553
+ return Date.now() - lastExec < cooldownMs;
554
+ }
555
+ setCooldown(subscriberId, sessionId) {
556
+ const key = `${subscriberId}:${sessionId}`;
557
+ this.subscriberLastExec.set(key, Date.now());
558
+ }
559
+ clearCooldown(subscriberId, sessionId) {
560
+ const key = `${subscriberId}:${sessionId}`;
561
+ this.subscriberLastExec.delete(key);
562
+ }
563
+ };
564
+ exports.SubscriberExecutorService = SubscriberExecutorService;
565
+ exports.SubscriberExecutorService = SubscriberExecutorService = __decorate([
566
+ (0, common_1.Injectable)(),
567
+ __param(0, (0, common_1.Inject)(storage_interface_1.STORAGE_SERVICE)),
568
+ __metadata("design:paramtypes", [Object, tmux_service_1.TmuxService,
569
+ sessions_service_1.SessionsService,
570
+ session_coordinator_service_1.SessionCoordinatorService,
571
+ terminal_send_coordinator_service_1.TerminalSendCoordinatorService,
572
+ event_log_service_1.EventLogService,
573
+ event_emitter_1.EventEmitter2,
574
+ automation_scheduler_service_1.AutomationSchedulerService])
575
+ ], SubscriberExecutorService);
576
+ //# sourceMappingURL=subscriber-executor.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscriber-executor.service.js","sourceRoot":"","sources":["../../../../src/modules/subscribers/services/subscriber-executor.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { type StorageService } from '../../storage/interfaces/storage.interface';
2
+ import type { Subscriber, CreateSubscriber, UpdateSubscriber } from '../../storage/models/domain.models';
3
+ export declare class SubscribersService {
4
+ private readonly storage;
5
+ private readonly logger;
6
+ constructor(storage: StorageService);
7
+ listSubscribers(projectId: string): Promise<Subscriber[]>;
8
+ getSubscriber(id: string): Promise<Subscriber>;
9
+ createSubscriber(data: CreateSubscriber): Promise<Subscriber>;
10
+ updateSubscriber(id: string, data: UpdateSubscriber): Promise<Subscriber>;
11
+ deleteSubscriber(id: string): Promise<void>;
12
+ toggleSubscriber(id: string, enabled: boolean): Promise<Subscriber>;
13
+ findSubscribersByEventName(projectId: string, eventName: string): Promise<Subscriber[]>;
14
+ }