crewly 1.4.70 → 1.4.71
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/backend/backend/src/services/messaging/response-router.service.d.ts +21 -3
- package/dist/backend/backend/src/services/messaging/response-router.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/response-router.service.js +68 -5
- package/dist/backend/backend/src/services/messaging/response-router.service.js.map +1 -1
- package/package.json +1 -1
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Routes orchestrator responses back to the correct source.
|
|
5
5
|
* - Web chat: no-op (existing TerminalGateway -> ChatGateway -> WebSocket pipeline handles it)
|
|
6
|
-
* - Slack: resolves
|
|
6
|
+
* - Slack: resolves via slackResolve callback, or falls back to direct Slack API reply
|
|
7
7
|
*
|
|
8
8
|
* @module services/messaging/response-router
|
|
9
9
|
*/
|
|
@@ -38,13 +38,31 @@ export declare class ResponseRouterService {
|
|
|
38
38
|
*/
|
|
39
39
|
private routeToWebChat;
|
|
40
40
|
/**
|
|
41
|
-
* Route response to Slack
|
|
42
|
-
*
|
|
41
|
+
* Route response to Slack.
|
|
42
|
+
*
|
|
43
|
+
* First tries the slackResolve callback (blocking promise pattern).
|
|
44
|
+
* If no callback exists (fire-and-forget orchestrator path), falls back
|
|
45
|
+
* to sending directly via the Slack API using channelId/threadTs from
|
|
46
|
+
* sourceMetadata. This ensures orchestrator replies always reach Slack
|
|
47
|
+
* even when the fire-and-forget enqueue pattern is used.
|
|
43
48
|
*
|
|
44
49
|
* @param message - The completed QueuedMessage
|
|
45
50
|
* @param response - The response content
|
|
46
51
|
*/
|
|
47
52
|
private routeToSlack;
|
|
53
|
+
/**
|
|
54
|
+
* Send a reply directly to Slack using the Slack API.
|
|
55
|
+
*
|
|
56
|
+
* Used as a fallback when the fire-and-forget enqueue pattern
|
|
57
|
+
* doesn't include a slackResolve callback. Dynamically imports
|
|
58
|
+
* SlackService to avoid circular dependencies.
|
|
59
|
+
*
|
|
60
|
+
* @param messageId - Message ID for logging
|
|
61
|
+
* @param channelId - Slack channel to reply in
|
|
62
|
+
* @param text - Reply text
|
|
63
|
+
* @param threadTs - Optional thread timestamp for threaded reply
|
|
64
|
+
*/
|
|
65
|
+
private sendSlackDirectReply;
|
|
48
66
|
/**
|
|
49
67
|
* Route response to Google Chat by calling the googleChatResolve callback.
|
|
50
68
|
* This unblocks the promise that sends the reply back to the Chat thread.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response-router.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/messaging/response-router.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAEpE;;;;;;;;;GASG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAAkB;;IAMhC;;;;;OAKG;IACH,aAAa,CAAC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IA2B7D;;;;;;;OAOG;IACH,OAAO,CAAC,cAAc;IAQtB
|
|
1
|
+
{"version":3,"file":"response-router.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/messaging/response-router.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAEpE;;;;;;;;;GASG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAAkB;;IAMhC;;;;;OAKG;IACH,aAAa,CAAC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IA2B7D;;;;;;;OAOG;IACH,OAAO,CAAC,cAAc;IAQtB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,YAAY;IA2BpB;;;;;;;;;;;OAWG;YACW,oBAAoB;IA0BlC;;;;;;OAMG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;;;;;OAMG;IACH,OAAO,CAAC,eAAe;IAIvB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,eAAe;IAwBvB;;;;;OAKG;IACH,UAAU,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;CA8BxD"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Routes orchestrator responses back to the correct source.
|
|
5
5
|
* - Web chat: no-op (existing TerminalGateway -> ChatGateway -> WebSocket pipeline handles it)
|
|
6
|
-
* - Slack: resolves
|
|
6
|
+
* - Slack: resolves via slackResolve callback, or falls back to direct Slack API reply
|
|
7
7
|
*
|
|
8
8
|
* @module services/messaging/response-router
|
|
9
9
|
*/
|
|
@@ -72,14 +72,77 @@ export class ResponseRouterService {
|
|
|
72
72
|
});
|
|
73
73
|
}
|
|
74
74
|
/**
|
|
75
|
-
* Route response to Slack
|
|
76
|
-
*
|
|
75
|
+
* Route response to Slack.
|
|
76
|
+
*
|
|
77
|
+
* First tries the slackResolve callback (blocking promise pattern).
|
|
78
|
+
* If no callback exists (fire-and-forget orchestrator path), falls back
|
|
79
|
+
* to sending directly via the Slack API using channelId/threadTs from
|
|
80
|
+
* sourceMetadata. This ensures orchestrator replies always reach Slack
|
|
81
|
+
* even when the fire-and-forget enqueue pattern is used.
|
|
77
82
|
*
|
|
78
83
|
* @param message - The completed QueuedMessage
|
|
79
84
|
* @param response - The response content
|
|
80
85
|
*/
|
|
81
86
|
routeToSlack(message, response) {
|
|
82
|
-
|
|
87
|
+
const resolve = message.sourceMetadata?.['slackResolve'];
|
|
88
|
+
if (typeof resolve === 'function') {
|
|
89
|
+
this.resolveCallback(message, response, 'slackResolve', 'Slack');
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
// Fallback: send directly via Slack API using channelId + threadTs
|
|
93
|
+
const channelId = message.sourceMetadata?.['channelId'];
|
|
94
|
+
const threadTs = message.sourceMetadata?.['threadTs'];
|
|
95
|
+
if (channelId) {
|
|
96
|
+
this.sendSlackDirectReply(message.id, channelId, response, threadTs).catch((err) => {
|
|
97
|
+
this.logger.error('Failed to send direct Slack reply fallback', {
|
|
98
|
+
messageId: message.id,
|
|
99
|
+
channelId,
|
|
100
|
+
error: formatError(err),
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
this.logger.warn('Slack message has no slackResolve callback and no channelId for fallback', {
|
|
106
|
+
messageId: message.id,
|
|
107
|
+
conversationId: message.conversationId,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Send a reply directly to Slack using the Slack API.
|
|
113
|
+
*
|
|
114
|
+
* Used as a fallback when the fire-and-forget enqueue pattern
|
|
115
|
+
* doesn't include a slackResolve callback. Dynamically imports
|
|
116
|
+
* SlackService to avoid circular dependencies.
|
|
117
|
+
*
|
|
118
|
+
* @param messageId - Message ID for logging
|
|
119
|
+
* @param channelId - Slack channel to reply in
|
|
120
|
+
* @param text - Reply text
|
|
121
|
+
* @param threadTs - Optional thread timestamp for threaded reply
|
|
122
|
+
*/
|
|
123
|
+
async sendSlackDirectReply(messageId, channelId, text, threadTs) {
|
|
124
|
+
try {
|
|
125
|
+
const { getSlackService } = await import('../slack/index.js');
|
|
126
|
+
const slackService = getSlackService();
|
|
127
|
+
if (!slackService?.isConnected()) {
|
|
128
|
+
this.logger.warn('Slack not connected, cannot send direct reply', { messageId });
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
await slackService.sendMessage({ channelId, text, threadTs });
|
|
132
|
+
this.logger.info('Slack direct reply sent (fallback)', {
|
|
133
|
+
messageId,
|
|
134
|
+
channelId,
|
|
135
|
+
responseLength: text.length,
|
|
136
|
+
threaded: !!threadTs,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
this.logger.error('Slack direct reply failed', {
|
|
141
|
+
messageId,
|
|
142
|
+
channelId,
|
|
143
|
+
error: formatError(error),
|
|
144
|
+
});
|
|
145
|
+
}
|
|
83
146
|
}
|
|
84
147
|
/**
|
|
85
148
|
* Route response to Google Chat by calling the googleChatResolve callback.
|
|
@@ -152,7 +215,7 @@ export class ResponseRouterService {
|
|
|
152
215
|
});
|
|
153
216
|
break;
|
|
154
217
|
case 'slack':
|
|
155
|
-
this.
|
|
218
|
+
this.routeToSlack(message, `Error: ${error}`);
|
|
156
219
|
break;
|
|
157
220
|
case 'google_chat':
|
|
158
221
|
this.resolveCallback(message, `Error: ${error}`, 'googleChatResolve', 'Google Chat');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response-router.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/messaging/response-router.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,aAAa,EAAmB,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAG1D;;;;;;;;;GASG;AACH,MAAM,OAAO,qBAAqB;IACxB,MAAM,CAAkB;IAEhC;QACE,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;IACpF,CAAC;IAED;;;;;OAKG;IACH,aAAa,CAAC,OAAsB,EAAE,QAAgB;QACpD,QAAQ,OAAO,CAAC,MAAM,EAAE,CAAC;YACvB,KAAK,UAAU;gBACb,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBACvC,MAAM;YACR,KAAK,OAAO;gBACV,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBACrC,MAAM;YACR,KAAK,aAAa;gBAChB,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBAC1C,MAAM;YACR,KAAK,UAAU;gBACb,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBACxC,MAAM;YACR,KAAK,cAAc;gBACjB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,sCAAsC,EAAE;oBACxD,SAAS,EAAE,OAAO,CAAC,EAAE;iBACtB,CAAC,CAAC;gBACH,MAAM;YACR;gBACE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oCAAoC,EAAE;oBACrD,SAAS,EAAE,OAAO,CAAC,EAAE;oBACrB,MAAM,EAAE,OAAO,CAAC,MAAM;iBACvB,CAAC,CAAC;QACP,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACK,cAAc,CAAC,OAAsB,EAAE,QAAgB;QAC7D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,4DAA4D,EAAE;YAC9E,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,cAAc,EAAE,QAAQ,CAAC,MAAM;SAChC,CAAC,CAAC;IACL,CAAC;IAED
|
|
1
|
+
{"version":3,"file":"response-router.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/messaging/response-router.service.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "crewly",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.71",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Multi-agent orchestration platform for AI coding teams — coordinates Claude Code, Gemini CLI, and Codex agents with a real-time web dashboard",
|
|
6
6
|
"main": "dist/cli/cli/src/index.js",
|