crewly 1.4.1 → 1.4.3

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.
@@ -115,11 +115,11 @@ fi
115
115
 
116
116
  # Build JSON body
117
117
  if [ -n "$THREAD_NAME" ]; then
118
- BODY=$(jq -n --arg space "$SPACE" --arg text "$TEXT" --arg threadName "$THREAD_NAME" \
119
- '{space: $space, text: $text, threadName: $threadName}')
118
+ BODY=$(jq -n --arg channel "$SPACE" --arg text "$TEXT" --arg threadId "$THREAD_NAME" \
119
+ '{channel: $channel, text: $text, threadId: $threadId}')
120
120
  else
121
- BODY=$(jq -n --arg space "$SPACE" --arg text "$TEXT" \
122
- '{space: $space, text: $text}')
121
+ BODY=$(jq -n --arg channel "$SPACE" --arg text "$TEXT" \
122
+ '{channel: $channel, text: $text}')
123
123
  fi
124
124
 
125
125
  api_call POST "/messengers/google-chat/send" "$BODY"
@@ -1 +1 @@
1
- {"version":3,"file":"messenger.routes.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/controllers/messaging/messenger.routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAmC,MAAM,SAAS,CAAC;AA+ClE;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAiF9C"}
1
+ {"version":3,"file":"messenger.routes.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/controllers/messaging/messenger.routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAmC,MAAM,SAAS,CAAC;AA+ClE;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CA2K9C"}
@@ -112,19 +112,102 @@ export function createMessengerRouter() {
112
112
  res.status(404).json({ success: false, error: `Unsupported platform: ${platform}` });
113
113
  return;
114
114
  }
115
- const channel = String(req.body?.channel || '');
115
+ const channel = String(req.body?.channel || req.body?.space || '');
116
116
  const text = String(req.body?.text || '');
117
117
  if (!channel || !text) {
118
- res.status(400).json({ success: false, error: 'channel and text are required' });
118
+ res.status(400).json({ success: false, error: 'channel (or space) and text are required' });
119
119
  return;
120
120
  }
121
- await adapter.sendMessage(channel, text, { threadId: req.body?.threadId });
121
+ const threadId = req.body?.threadId || req.body?.threadName || undefined;
122
+ await adapter.sendMessage(channel, text, { threadId });
122
123
  res.json({ success: true, message: 'Message sent' });
123
124
  }
124
125
  catch (error) {
125
126
  next(error);
126
127
  }
127
128
  });
129
+ // ===========================================================================
130
+ // Google Chat–specific routes
131
+ // ===========================================================================
132
+ /**
133
+ * POST /google-chat/reaction
134
+ * Add an emoji reaction to a Google Chat message.
135
+ */
136
+ router.post('/google-chat/reaction', async (req, res, next) => {
137
+ try {
138
+ const adapter = registry.get('google-chat');
139
+ if (!adapter) {
140
+ res.status(404).json({ success: false, error: 'Google Chat adapter not registered' });
141
+ return;
142
+ }
143
+ const messageName = String(req.body?.messageName || '');
144
+ const emoji = String(req.body?.emoji || '');
145
+ if (!messageName || !emoji) {
146
+ res.status(400).json({ success: false, error: 'messageName and emoji are required' });
147
+ return;
148
+ }
149
+ await adapter.addReaction(messageName, emoji);
150
+ res.json({ success: true, message: 'Reaction added' });
151
+ }
152
+ catch (error) {
153
+ next(error);
154
+ }
155
+ });
156
+ /**
157
+ * GET /google-chat/status
158
+ * Get live Google Chat adapter status (Pub/Sub pull details).
159
+ */
160
+ router.get('/google-chat/status', (_req, res) => {
161
+ const adapter = registry.get('google-chat');
162
+ if (!adapter) {
163
+ res.status(404).json({ success: false, error: 'Google Chat adapter not registered' });
164
+ return;
165
+ }
166
+ const status = adapter.getStatus();
167
+ res.json({ success: true, data: status.details || {} });
168
+ });
169
+ /**
170
+ * POST /google-chat/pull
171
+ * Manually trigger a Pub/Sub pull (for debugging / UI).
172
+ */
173
+ router.post('/google-chat/pull', async (req, res, next) => {
174
+ try {
175
+ const adapter = registry.get('google-chat');
176
+ if (!adapter) {
177
+ res.status(404).json({ success: false, error: 'Google Chat adapter not registered' });
178
+ return;
179
+ }
180
+ const count = await adapter.pullMessages();
181
+ res.json({ success: true, messagesReceived: count });
182
+ }
183
+ catch (error) {
184
+ next(error);
185
+ }
186
+ });
187
+ /**
188
+ * POST /google-chat/test-send
189
+ * Send a test message to a Google Chat space (for connection verification).
190
+ */
191
+ router.post('/google-chat/test-send', async (req, res, next) => {
192
+ try {
193
+ const adapter = registry.get('google-chat');
194
+ if (!adapter) {
195
+ res.status(404).json({ success: false, error: 'Google Chat adapter not registered' });
196
+ return;
197
+ }
198
+ const space = String(req.body?.space || '');
199
+ const text = String(req.body?.text || 'Test message from Crewly');
200
+ if (!space) {
201
+ res.status(400).json({ success: false, error: 'space is required' });
202
+ return;
203
+ }
204
+ await adapter.sendMessage(space, text);
205
+ res.json({ success: true, message: 'Test message sent' });
206
+ }
207
+ catch (error) {
208
+ next(error);
209
+ }
210
+ });
128
211
  return router;
129
212
  }
130
213
  //# sourceMappingURL=messenger.routes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"messenger.routes.js","sourceRoot":"","sources":["../../../../../../backend/src/controllers/messaging/messenger.routes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"messenger.routes.js","sourceRoot":"","sources":["../../../../../../backend/src/controllers/messaging/messenger.routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAmC,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,wDAAwD,CAAC;AAClG,OAAO,EAAE,qBAAqB,EAAE,MAAM,8DAA8D,CAAC;AACrG,OAAO,EAAE,wBAAwB,EAAE,MAAM,iEAAiE,CAAC;AAC3G,OAAO,EAAE,uBAAuB,EAAE,MAAM,gEAAgE,CAAC;AACzG,OAAO,EAAE,0BAA0B,EAAE,MAAM,oEAAoE,CAAC;AAGhH,sDAAsD;AACtD,MAAM,eAAe,GAAwB,IAAI,GAAG,CAAoB,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;AAEzH;;;;;GAKG;AACH,SAAS,gBAAgB,CAAC,KAAa;IACrC,OAAO,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAE,KAA2B,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1E,CAAC;AAED;;;;;GAKG;AACH,SAAS,iBAAiB,CAAC,QAA2B;IACpD,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,gBAAgB,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,QAAQ,mBAAmB,CAAC,CAAC;AACrG,CAAC;AAED;;;;GAIG;AACH,SAAS,uBAAuB,CAAC,QAAkC;IACjE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC;QAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,qBAAqB,EAAE,CAAC,CAAC;IAC3E,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,wBAAwB,EAAE,CAAC,CAAC;IACjF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC;QAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,uBAAuB,EAAE,CAAC,CAAC;IAC/E,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC;QAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,0BAA0B,EAAE,CAAC,CAAC;AACxF,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB;IACnC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,MAAM,QAAQ,GAAG,wBAAwB,CAAC,WAAW,EAAE,CAAC;IACxD,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IAElC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;QACrD,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;QAC1F,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACvD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBAC5F,OAAO;YACT,CAAC;YACD,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACvC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,yBAAyB,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACrF,OAAO;YACT,CAAC;YAED,MAAM,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YACzC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,gBAAgB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC9E,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/C,MAAM,EAAE,CAAC,SAAS,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;YACxG,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,GAAG,QAAQ,YAAY,EAAE,CAAC,CAAC;QAC3F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;QAC7F,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACvD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBAC5F,OAAO;YACT,CAAC;YACD,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACvC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,yBAAyB,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACrF,OAAO;YACT,CAAC;YAED,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;YAC3B,MAAM,EAAE,CAAC,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1D,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,QAAQ,eAAe,EAAE,CAAC,CAAC;QACnE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;QACvF,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACvD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBAC5F,OAAO;YACT,CAAC;YACD,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACvC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,yBAAyB,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACrF,OAAO;YACT,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;YACnE,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;YAC1C,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;gBACtB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,0CAA0C,EAAE,CAAC,CAAC;gBAC5F,OAAO;YACT,CAAC;YAED,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,EAAE,QAAQ,IAAI,GAAG,CAAC,IAAI,EAAE,UAAU,IAAI,SAAS,CAAC;YACzE,MAAM,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;YACvD,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,8EAA8E;IAC9E,8BAA8B;IAC9B,8EAA8E;IAE9E;;;OAGG;IACH,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;QAC7F,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,aAAa,CAA2C,CAAC;YACtF,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,oCAAoC,EAAE,CAAC,CAAC;gBACtF,OAAO;YACT,CAAC;YAED,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC;YACxD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;YAC5C,IAAI,CAAC,WAAW,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC3B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,oCAAoC,EAAE,CAAC,CAAC;gBACtF,OAAO;YACT,CAAC;YAED,MAAM,OAAO,CAAC,WAAW,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YAC9C,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;QACzD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;IAEH;;;OAGG;IACH,MAAM,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;QACjE,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,oCAAoC,EAAE,CAAC,CAAC;YACtF,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;QACnC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH;;;OAGG;IACH,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;QACzF,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,aAAa,CAA2C,CAAC;YACtF,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,oCAAoC,EAAE,CAAC,CAAC;gBACtF,OAAO;YACT,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC;YAC3C,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;IAEH;;;OAGG;IACH,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;QAC9F,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,oCAAoC,EAAE,CAAC,CAAC;gBACtF,OAAO;YACT,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;YAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,IAAI,0BAA0B,CAAC,CAAC;YAClE,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;gBACrE,OAAO;YACT,CAAC;YAED,MAAM,OAAO,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACvC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAC5D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1,47 +1,109 @@
1
1
  /**
2
2
  * Google Chat Messenger Adapter
3
3
  *
4
- * Messenger adapter for Google Chat using the Google Chat API (webhook or service account).
5
- * Supports sending messages to Google Chat spaces via incoming webhooks or
6
- * the Chat API with a service account.
4
+ * Messenger adapter for Google Chat supporting three connection modes:
5
+ * 1. **Webhook mode** post messages via an incoming webhook URL (send-only)
6
+ * 2. **Service account mode** — send messages via the Chat API (send-only)
7
+ * 3. **Pub/Sub mode** — pull incoming messages from a Cloud Pub/Sub subscription
8
+ * and reply via the Chat API (bidirectional, thread-aware)
9
+ *
10
+ * In Pub/Sub mode, a Google Chat App is configured to publish events to a
11
+ * Pub/Sub topic. Crewly pulls from the subscription, processes MESSAGE events,
12
+ * and replies in the same thread via the Chat API.
7
13
  *
8
14
  * @module services/messaging/adapters/google-chat-messenger.adapter
9
15
  */
10
- import { MessengerAdapter, MessengerPlatform } from '../messenger-adapter.interface.js';
16
+ import { MessengerAdapter, MessengerPlatform, IncomingMessage } from '../messenger-adapter.interface.js';
17
+ /** Authentication mode — how OAuth2 tokens are obtained */
18
+ export type GoogleChatAuthMode = 'service_account' | 'adc';
11
19
  /**
12
- * Messenger adapter for Google Chat.
13
- *
14
- * Supports two modes:
15
- * 1. **Webhook mode** (simpler): uses an incoming webhook URL to post messages
16
- * 2. **Service account mode**: uses a service account key to call the Chat API
20
+ * ADC (Application Default Credentials) JSON file shape.
21
+ * Created by `gcloud auth application-default login`.
22
+ */
23
+ interface AdcCredentials {
24
+ client_id: string;
25
+ client_secret: string;
26
+ refresh_token: string;
27
+ type: string;
28
+ }
29
+ /**
30
+ * Callback type for incoming messages from Pub/Sub pull.
31
+ */
32
+ export type GoogleChatIncomingCallback = (msg: IncomingMessage) => void;
33
+ /**
34
+ * Messenger adapter for Google Chat with Pub/Sub support.
17
35
  *
18
- * Webhook mode is used when `webhookUrl` is provided in config.
19
- * Service account mode is used when `serviceAccountKey` is provided.
36
+ * Supports webhook, service-account, and pubsub modes.
37
+ * Pub/Sub mode enables bidirectional communication with thread tracking.
20
38
  */
21
39
  export declare class GoogleChatMessengerAdapter implements MessengerAdapter {
22
40
  readonly platform: MessengerPlatform;
41
+ /** Current connection mode */
42
+ private mode;
23
43
  /** Webhook URL for posting messages (webhook mode) */
24
44
  private webhookUrl;
25
- /** Service account key JSON (service account mode) */
45
+ /** Service account key JSON string */
26
46
  private serviceAccountKey;
27
- /** Access token obtained from service account (cached) */
47
+ /** Authentication mode: service_account (JWT) or adc (refresh token) */
48
+ private authMode;
49
+ /** ADC credentials (parsed from application_default_credentials.json) */
50
+ private adcCredentials;
51
+ /** Access token obtained from service account or ADC (cached) */
28
52
  private accessToken;
29
53
  /** Access token expiry timestamp */
30
54
  private tokenExpiresAt;
55
+ /** OAuth2 scopes for the current mode */
56
+ private tokenScopes;
57
+ /** Pending token refresh promise to deduplicate concurrent requests (RL2) */
58
+ private pendingTokenRefresh;
59
+ /** Full Pub/Sub subscription resource name (e.g. projects/PROJECT/subscriptions/SUB) */
60
+ private subscriptionName;
61
+ /** GCP project ID (for Pub/Sub mode) */
62
+ private projectId;
63
+ /** Pub/Sub pull interval timer */
64
+ private pullIntervalTimer;
65
+ /** Callback for incoming messages */
66
+ private onIncomingMessage;
67
+ /** Service account email for impersonation (ADC mode) */
68
+ private serviceAccountEmail;
69
+ /** Impersonated SA token (separate from user ADC token) */
70
+ private saAccessToken;
71
+ /** Impersonated SA token expiry timestamp */
72
+ private saTokenExpiresAt;
31
73
  /**
32
- * Initialize the adapter by validating credentials.
74
+ * Recent send deduplication cache.
75
+ * Key: `${space}:${threadId}:${contentPrefix}`, value: timestamp (epoch ms).
76
+ * Prevents the same message being sent twice within DEDUP_WINDOW_MS (e.g. when
77
+ * both the auto-route and a manual reply-gchat call fire for the same response).
78
+ */
79
+ private recentSends;
80
+ /** Deduplication window in milliseconds */
81
+ private static readonly DEDUP_WINDOW_MS;
82
+ /** Consecutive pull failure count */
83
+ private consecutiveFailures;
84
+ /** Whether the pull loop is paused due to failures */
85
+ private pullPaused;
86
+ /** Timestamp of the last successful pull (epoch ms) */
87
+ private lastPullAt;
88
+ /**
89
+ * Initialize the adapter with the provided credentials.
90
+ *
91
+ * Detects mode based on provided config fields:
92
+ * - `webhookUrl` → webhook mode
93
+ * - `serviceAccountKey` + `projectId` + `subscriptionName` → pubsub mode
94
+ * - `serviceAccountKey` alone → service-account mode
33
95
  *
34
- * @param config - Must contain either `webhookUrl` string or `serviceAccountKey` string
35
- * @throws Error if neither credential is provided or validation fails
96
+ * @param config - Configuration object with credentials
97
+ * @throws Error if credentials are invalid or missing
36
98
  */
37
99
  initialize(config: Record<string, unknown>): Promise<void>;
38
100
  /**
39
101
  * Send a text message to a Google Chat space.
40
102
  *
41
103
  * In webhook mode, the `channel` parameter is ignored (webhook URL determines the space).
42
- * In service account mode, `channel` is the space name (e.g., "spaces/AAAA...").
104
+ * In service-account/pubsub mode, `channel` is the space name (e.g., "spaces/AAAA...").
43
105
  *
44
- * @param channel - Google Chat space name (used in service account mode)
106
+ * @param channel - Google Chat space name (used in service-account/pubsub mode)
45
107
  * @param text - Message content
46
108
  * @param options - Optional send options (threadId for threaded replies)
47
109
  * @throws Error if adapter is not initialized or send fails
@@ -52,7 +114,7 @@ export declare class GoogleChatMessengerAdapter implements MessengerAdapter {
52
114
  /**
53
115
  * Get the current connection status.
54
116
  *
55
- * @returns Status object with connected flag and platform identifier
117
+ * @returns Status object with connected flag, platform, and mode details
56
118
  */
57
119
  getStatus(): {
58
120
  connected: boolean;
@@ -60,19 +122,53 @@ export declare class GoogleChatMessengerAdapter implements MessengerAdapter {
60
122
  details?: Record<string, unknown>;
61
123
  };
62
124
  /**
63
- * Disconnect by clearing stored credentials.
125
+ * Disconnect by clearing stored credentials and stopping the pull loop.
64
126
  */
65
127
  disconnect(): Promise<void>;
66
128
  /**
67
129
  * Add an emoji reaction to a Google Chat message.
68
130
  *
69
- * Only works in service account mode — webhook mode does not support the
131
+ * Only works in service-account/pubsub mode — webhook mode does not support the
70
132
  * reactions API. Calls `spaces.messages.reactions.create`.
71
133
  *
72
134
  * @param messageName - Full message resource name (e.g., "spaces/xxx/messages/yyy")
73
135
  * @param emoji - Unicode emoji character (e.g., "👀", "✅")
74
136
  */
75
137
  addReaction(messageName: string, emoji: string): Promise<void>;
138
+ /**
139
+ * Start the Pub/Sub pull loop that periodically fetches messages.
140
+ */
141
+ private startPubSubPull;
142
+ /**
143
+ * Stop the Pub/Sub pull loop.
144
+ */
145
+ private stopPubSubPull;
146
+ /**
147
+ * Pull messages from the Pub/Sub subscription, process them, and acknowledge.
148
+ *
149
+ * Each message is a base64-encoded Google Chat event JSON. Only MESSAGE-type
150
+ * events are forwarded to the incoming message callback. All messages are
151
+ * acknowledged regardless of type to prevent redelivery.
152
+ */
153
+ pullMessages(): Promise<number>;
154
+ /**
155
+ * Process a Google Chat event and forward MESSAGE events to the callback.
156
+ *
157
+ * Supports two payload formats:
158
+ * - **Legacy (v1)**: `{ type: 'MESSAGE', message: { text, sender, thread }, space }`
159
+ * - **v2**: `{ commonEventObject: {...}, chat: { messagePayload: { message: {...}, space: {...} } } }`
160
+ *
161
+ * Both formats are normalized into the same IncomingMessage shape.
162
+ *
163
+ * @param event - Parsed Google Chat event payload (legacy or v2)
164
+ */
165
+ private processChatEvent;
166
+ /**
167
+ * Acknowledge processed messages to prevent redelivery.
168
+ *
169
+ * @param ackIds - Array of ack IDs from the pull response
170
+ */
171
+ private acknowledgeMessages;
76
172
  /**
77
173
  * Send a message via incoming webhook URL.
78
174
  *
@@ -83,18 +179,110 @@ export declare class GoogleChatMessengerAdapter implements MessengerAdapter {
83
179
  /**
84
180
  * Send a message via the Google Chat REST API using service account credentials.
85
181
  *
182
+ * When a threadId (thread name) is provided, the reply is posted to the same
183
+ * thread. This enables conversational thread tracking for Pub/Sub mode.
184
+ *
86
185
  * @param space - Space name (e.g., "spaces/AAAA...")
87
186
  * @param text - Message text
88
- * @param threadKey - Optional thread key for threaded replies
187
+ * @param threadName - Optional full thread name (e.g., "spaces/SPACE/threads/THREAD")
89
188
  */
90
189
  private sendViaApi;
190
+ /**
191
+ * Split a message into chunks that fit within Google Chat's character limit.
192
+ *
193
+ * Splits on double-newline paragraph boundaries when possible. Falls back to
194
+ * single-newline, then hard truncation at maxLength.
195
+ *
196
+ * @param text - The full message text to split
197
+ * @param maxLength - Maximum characters per chunk (default 4000)
198
+ * @returns Array of text chunks, each within maxLength
199
+ */
200
+ static splitMessage(text: string, maxLength?: number): string[];
91
201
  /**
92
202
  * Get a valid access token, refreshing if needed.
93
203
  *
94
- * Uses a simplified JWT-based OAuth2 flow for service accounts.
204
+ * Uses JWT-based OAuth2 for service accounts, or refresh_token flow for ADC.
205
+ * The scope includes Pub/Sub when in pubsub mode.
95
206
  *
96
207
  * @returns Valid access token string
97
208
  */
98
- private getAccessToken;
209
+ getAccessToken(): Promise<string>;
210
+ /**
211
+ * Perform the actual token refresh.
212
+ *
213
+ * Dispatches to the appropriate flow based on authMode:
214
+ * - `service_account`: JWT-based OAuth2 flow with SA private key
215
+ * - `adc`: Refresh token flow using ADC credentials
216
+ *
217
+ * @returns Fresh access token string
218
+ */
219
+ private refreshAccessToken;
220
+ /**
221
+ * Refresh access token via JWT-based OAuth2 flow (service account).
222
+ *
223
+ * @returns Fresh access token string
224
+ */
225
+ private refreshAccessTokenViaJwt;
226
+ /**
227
+ * Refresh access token via ADC (Application Default Credentials).
228
+ *
229
+ * Uses the refresh_token from the ADC JSON file to obtain a new access token
230
+ * from Google's OAuth2 token endpoint. This supports credentials created by
231
+ * `gcloud auth application-default login`.
232
+ *
233
+ * When `serviceAccountEmail` is configured, the ADC user token is used to
234
+ * impersonate the service account via the IAM Credentials API, producing a
235
+ * token with `chat.bot` and `pubsub` scopes that the Chat API accepts.
236
+ *
237
+ * @returns Fresh access token string (impersonated SA token if configured, else user token)
238
+ */
239
+ private refreshAccessTokenViaAdc;
240
+ /**
241
+ * Impersonate a service account using the IAM Credentials API.
242
+ *
243
+ * Uses the user's ADC access token to call `generateAccessToken` on the
244
+ * target service account, producing a token with `chat.bot` and `pubsub`
245
+ * scopes. The user must have the `Service Account Token Creator` IAM role.
246
+ *
247
+ * @param userToken - ADC user access token for authorization
248
+ * @returns Impersonated service account access token
249
+ * @throws Error if impersonation fails (e.g., missing IAM role)
250
+ */
251
+ private impersonateServiceAccount;
252
+ /**
253
+ * Build auth headers for Google API requests.
254
+ *
255
+ * When using ADC auth mode, adds x-goog-user-project header to set the
256
+ * billing/quota project. Without this header, ADC requests fail with
257
+ * 403 PERMISSION_DENIED because Google cannot determine which project
258
+ * should be billed for the API usage.
259
+ *
260
+ * @param token - OAuth2 access token
261
+ * @returns Headers object with Authorization, Content-Type, and optional quota project
262
+ */
263
+ private getAuthHeaders;
264
+ /**
265
+ * Validate a service account key JSON string.
266
+ *
267
+ * @param key - JSON string of the service account key
268
+ * @throws Error if the key is invalid
269
+ */
270
+ private validateServiceAccountKey;
271
+ /**
272
+ * Load ADC (Application Default Credentials) from the filesystem.
273
+ *
274
+ * Checks (in order):
275
+ * 1. `GOOGLE_APPLICATION_CREDENTIALS` environment variable (custom path)
276
+ * 2. Default gcloud ADC path: `~/.config/gcloud/application_default_credentials.json`
277
+ *
278
+ * @returns Parsed ADC credentials
279
+ * @throws Error if the ADC file is not found or invalid
280
+ */
281
+ loadAdcCredentials(): Promise<AdcCredentials>;
282
+ /**
283
+ * Reset all internal state to defaults.
284
+ */
285
+ private resetState;
99
286
  }
287
+ export {};
100
288
  //# sourceMappingURL=google-chat-messenger.adapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"google-chat-messenger.adapter.d.ts","sourceRoot":"","sources":["../../../../../../../backend/src/services/messaging/adapters/google-chat-messenger.adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAKxF;;;;;;;;;GASG;AACH,qBAAa,0BAA2B,YAAW,gBAAgB;IACjE,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAiB;IAErD,sDAAsD;IACtD,OAAO,CAAC,UAAU,CAAuB;IAEzC,sDAAsD;IACtD,OAAO,CAAC,iBAAiB,CAAuB;IAEhD,0DAA0D;IAC1D,OAAO,CAAC,WAAW,CAAuB;IAE1C,oCAAoC;IACpC,OAAO,CAAC,cAAc,CAAK;IAE3B;;;;;OAKG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAyChE;;;;;;;;;;OAUG;IACG,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAchG;;;;OAIG;IACH,SAAS,IAAI;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,iBAAiB,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE;IAWnG;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAOjC;;;;;;;;OAQG;IACG,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoCpE;;;;;OAKG;YACW,cAAc;IA8B5B;;;;;;OAMG;YACW,UAAU;IAmCxB;;;;;;OAMG;YACW,cAAc;CAkD7B"}
1
+ {"version":3,"file":"google-chat-messenger.adapter.d.ts","sourceRoot":"","sources":["../../../../../../../backend/src/services/messaging/adapters/google-chat-messenger.adapter.ts"],"names":[],"mappings":"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"}