@aligndottech/connector-core 0.1.0
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/LICENSE +21 -0
- package/dist/fetchers/confluence.d.ts +9 -0
- package/dist/fetchers/confluence.d.ts.map +1 -0
- package/dist/fetchers/confluence.js +89 -0
- package/dist/fetchers/confluence.js.map +1 -0
- package/dist/fetchers/errors.d.ts +11 -0
- package/dist/fetchers/errors.d.ts.map +1 -0
- package/dist/fetchers/errors.js +15 -0
- package/dist/fetchers/errors.js.map +1 -0
- package/dist/fetchers/git.d.ts +23 -0
- package/dist/fetchers/git.d.ts.map +1 -0
- package/dist/fetchers/git.js +27 -0
- package/dist/fetchers/git.js.map +1 -0
- package/dist/fetchers/github.d.ts +9 -0
- package/dist/fetchers/github.d.ts.map +1 -0
- package/dist/fetchers/github.js +53 -0
- package/dist/fetchers/github.js.map +1 -0
- package/dist/fetchers/gitlab.d.ts +9 -0
- package/dist/fetchers/gitlab.d.ts.map +1 -0
- package/dist/fetchers/gitlab.js +33 -0
- package/dist/fetchers/gitlab.js.map +1 -0
- package/dist/fetchers/index.d.ts +20 -0
- package/dist/fetchers/index.d.ts.map +1 -0
- package/dist/fetchers/index.js +38 -0
- package/dist/fetchers/index.js.map +1 -0
- package/dist/fetchers/jira.d.ts +9 -0
- package/dist/fetchers/jira.d.ts.map +1 -0
- package/dist/fetchers/jira.js +73 -0
- package/dist/fetchers/jira.js.map +1 -0
- package/dist/fetchers/linear.d.ts +9 -0
- package/dist/fetchers/linear.d.ts.map +1 -0
- package/dist/fetchers/linear.js +71 -0
- package/dist/fetchers/linear.js.map +1 -0
- package/dist/fetchers/notion.d.ts +9 -0
- package/dist/fetchers/notion.d.ts.map +1 -0
- package/dist/fetchers/notion.js +85 -0
- package/dist/fetchers/notion.js.map +1 -0
- package/dist/fetchers/slack.d.ts +10 -0
- package/dist/fetchers/slack.d.ts.map +1 -0
- package/dist/fetchers/slack.js +103 -0
- package/dist/fetchers/slack.js.map +1 -0
- package/dist/fetchers/teams.d.ts +10 -0
- package/dist/fetchers/teams.d.ts.map +1 -0
- package/dist/fetchers/teams.js +76 -0
- package/dist/fetchers/teams.js.map +1 -0
- package/dist/fetchers/util/git.d.ts +22 -0
- package/dist/fetchers/util/git.d.ts.map +1 -0
- package/dist/fetchers/util/git.js +50 -0
- package/dist/fetchers/util/git.js.map +1 -0
- package/dist/fetchers/zoom.d.ts +9 -0
- package/dist/fetchers/zoom.d.ts.map +1 -0
- package/dist/fetchers/zoom.js +72 -0
- package/dist/fetchers/zoom.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/parsers/CommandParser.d.ts +69 -0
- package/dist/parsers/CommandParser.d.ts.map +1 -0
- package/dist/parsers/CommandParser.js +233 -0
- package/dist/parsers/CommandParser.js.map +1 -0
- package/dist/services/GatewayClient.d.ts +147 -0
- package/dist/services/GatewayClient.d.ts.map +1 -0
- package/dist/services/GatewayClient.js +411 -0
- package/dist/services/GatewayClient.js.map +1 -0
- package/dist/services/StreamingResponseConsumer.d.ts +28 -0
- package/dist/services/StreamingResponseConsumer.d.ts.map +1 -0
- package/dist/services/StreamingResponseConsumer.js +58 -0
- package/dist/services/StreamingResponseConsumer.js.map +1 -0
- package/dist/services/TelemetryClient.d.ts +116 -0
- package/dist/services/TelemetryClient.d.ts.map +1 -0
- package/dist/services/TelemetryClient.js +234 -0
- package/dist/services/TelemetryClient.js.map +1 -0
- package/dist/testing/MockGatewayClient.d.ts +51 -0
- package/dist/testing/MockGatewayClient.d.ts.map +1 -0
- package/dist/testing/MockGatewayClient.js +84 -0
- package/dist/testing/MockGatewayClient.js.map +1 -0
- package/dist/testing/fixtures.d.ts +49 -0
- package/dist/testing/fixtures.d.ts.map +1 -0
- package/dist/testing/fixtures.js +59 -0
- package/dist/testing/fixtures.js.map +1 -0
- package/dist/tiers/capabilities.d.ts +18 -0
- package/dist/tiers/capabilities.d.ts.map +1 -0
- package/dist/tiers/capabilities.js +99 -0
- package/dist/tiers/capabilities.js.map +1 -0
- package/dist/types/fetcher.d.ts +59 -0
- package/dist/types/fetcher.d.ts.map +1 -0
- package/dist/types/fetcher.js +15 -0
- package/dist/types/fetcher.js.map +1 -0
- package/dist/types/flow.d.ts +190 -0
- package/dist/types/flow.d.ts.map +1 -0
- package/dist/types/flow.js +24 -0
- package/dist/types/flow.js.map +1 -0
- package/dist/types/index.d.ts +707 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +13 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/requestContext.d.ts +42 -0
- package/dist/utils/requestContext.d.ts.map +1 -0
- package/dist/utils/requestContext.js +56 -0
- package/dist/utils/requestContext.js.map +1 -0
- package/dist/utils/validation.d.ts +25 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +31 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Gateway API client for all communication connectors
|
|
3
|
+
* Provides consistent API access to the Align Gateway service
|
|
4
|
+
*
|
|
5
|
+
* This is the SINGLE SOURCE OF TRUTH for Gateway API access.
|
|
6
|
+
* DO NOT create duplicate GatewayRepository implementations in connector packages.
|
|
7
|
+
*/
|
|
8
|
+
import { fetch } from 'undici';
|
|
9
|
+
/**
|
|
10
|
+
* Parse an SSE stream into typed StreamEvent objects.
|
|
11
|
+
*/
|
|
12
|
+
async function* parseSSEStream(body) {
|
|
13
|
+
if (!body) {
|
|
14
|
+
yield { type: 'error', data: { error: 'No response body' } };
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const reader = body.getReader();
|
|
18
|
+
const decoder = new TextDecoder();
|
|
19
|
+
let buffer = '';
|
|
20
|
+
function* parseBuffer(raw) {
|
|
21
|
+
const parts = raw.split('\n\n');
|
|
22
|
+
for (const part of parts) {
|
|
23
|
+
if (!part.trim())
|
|
24
|
+
continue;
|
|
25
|
+
let eventType = '';
|
|
26
|
+
let eventData = '';
|
|
27
|
+
for (const line of part.split('\n')) {
|
|
28
|
+
if (line.startsWith('event: '))
|
|
29
|
+
eventType = line.slice(7).trim();
|
|
30
|
+
else if (line.startsWith('data: '))
|
|
31
|
+
eventData = line.slice(6);
|
|
32
|
+
}
|
|
33
|
+
if (eventType && eventData) {
|
|
34
|
+
try {
|
|
35
|
+
yield { type: eventType, data: JSON.parse(eventData) };
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// skip malformed JSON
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
while (true) {
|
|
45
|
+
const { done, value } = await reader.read();
|
|
46
|
+
if (done)
|
|
47
|
+
break;
|
|
48
|
+
buffer += decoder.decode(value, { stream: true });
|
|
49
|
+
const parts = buffer.split('\n\n');
|
|
50
|
+
buffer = parts.pop() || '';
|
|
51
|
+
yield* parseBuffer(parts.join('\n\n'));
|
|
52
|
+
}
|
|
53
|
+
// Parse any remaining buffer after stream ends
|
|
54
|
+
if (buffer.trim()) {
|
|
55
|
+
yield* parseBuffer(buffer);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
finally {
|
|
59
|
+
reader.releaseLock();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Shared client for Gateway API operations
|
|
64
|
+
*/
|
|
65
|
+
export class GatewayClient {
|
|
66
|
+
gatewayUrl;
|
|
67
|
+
bearerToken;
|
|
68
|
+
constructor(config) {
|
|
69
|
+
this.gatewayUrl = config.gatewayUrl;
|
|
70
|
+
this.bearerToken = config.bearerToken;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Create from environment variables
|
|
74
|
+
*/
|
|
75
|
+
static fromEnv() {
|
|
76
|
+
return new GatewayClient({
|
|
77
|
+
gatewayUrl: process.env.GATEWAY_URL || 'http://gateway:8080',
|
|
78
|
+
bearerToken: process.env.GATEWAY_BEARER_TOKEN,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Make authenticated request to Gateway
|
|
83
|
+
*/
|
|
84
|
+
async request(path, options = {}) {
|
|
85
|
+
const headers = {};
|
|
86
|
+
if (options.body) {
|
|
87
|
+
headers['content-type'] = 'application/json';
|
|
88
|
+
}
|
|
89
|
+
if (this.bearerToken) {
|
|
90
|
+
headers['authorization'] = `Bearer ${this.bearerToken}`;
|
|
91
|
+
}
|
|
92
|
+
if (options.tenantId) {
|
|
93
|
+
headers['x-tenant-id'] = options.tenantId;
|
|
94
|
+
}
|
|
95
|
+
const response = await fetch(`${this.gatewayUrl}${path}`, {
|
|
96
|
+
method: options.method || 'GET',
|
|
97
|
+
headers,
|
|
98
|
+
body: options.body ? JSON.stringify(options.body) : undefined,
|
|
99
|
+
});
|
|
100
|
+
if (!response.ok) {
|
|
101
|
+
const text = await response.text();
|
|
102
|
+
throw new Error(`gateway_request_failed ${path} ${response.status}: ${text}`);
|
|
103
|
+
}
|
|
104
|
+
// Handle void responses (204 No Content or empty body)
|
|
105
|
+
const contentType = response.headers.get('content-type');
|
|
106
|
+
if (response.status === 204 || !contentType?.includes('application/json')) {
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
return (await response.json());
|
|
110
|
+
}
|
|
111
|
+
// ===========================================================================
|
|
112
|
+
// Decision Operations
|
|
113
|
+
// ===========================================================================
|
|
114
|
+
/**
|
|
115
|
+
* Send ingest payload to Gateway for decision extraction
|
|
116
|
+
*/
|
|
117
|
+
async ingest(tenantId, payload) {
|
|
118
|
+
return this.request('/ingest', {
|
|
119
|
+
method: 'POST',
|
|
120
|
+
body: payload,
|
|
121
|
+
tenantId,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Send payload to Gateway for consensus analysis of a debate
|
|
126
|
+
*/
|
|
127
|
+
async consensus(tenantId, payload) {
|
|
128
|
+
return this.request('/ingest/consensus', {
|
|
129
|
+
method: 'POST',
|
|
130
|
+
body: payload,
|
|
131
|
+
tenantId,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Send payload to Gateway for conversational AI processing
|
|
136
|
+
* Detects intent (decision, consensus, question, etc.) and returns appropriate response
|
|
137
|
+
*/
|
|
138
|
+
async conversational(tenantId, payload) {
|
|
139
|
+
return this.request('/ingest/conversational', {
|
|
140
|
+
method: 'POST',
|
|
141
|
+
body: payload,
|
|
142
|
+
tenantId,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Stream conversational AI response via SSE.
|
|
147
|
+
* Yields events: { type: 'token', data: { text: string } }
|
|
148
|
+
* or { type: 'complete', data: ConversationalResponse }
|
|
149
|
+
* or { type: 'error', data: { error: string } }
|
|
150
|
+
*/
|
|
151
|
+
async *streamConversational(tenantId, payload) {
|
|
152
|
+
const url = `${this.gatewayUrl}/ingest/conversational/stream`;
|
|
153
|
+
const headers = {
|
|
154
|
+
'Content-Type': 'application/json',
|
|
155
|
+
'x-tenant-id': tenantId,
|
|
156
|
+
'Accept': 'text/event-stream',
|
|
157
|
+
};
|
|
158
|
+
if (this.bearerToken) {
|
|
159
|
+
headers['Authorization'] = `Bearer ${this.bearerToken}`;
|
|
160
|
+
}
|
|
161
|
+
const response = await fetch(url, {
|
|
162
|
+
method: 'POST',
|
|
163
|
+
headers,
|
|
164
|
+
body: JSON.stringify(payload),
|
|
165
|
+
});
|
|
166
|
+
if (!response.ok) {
|
|
167
|
+
const errorText = await response.text();
|
|
168
|
+
yield { type: 'error', data: { error: `Gateway error ${response.status}: ${errorText}` } };
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
yield* parseSSEStream(response.body ?? null);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Fetch decision details by ID
|
|
175
|
+
*/
|
|
176
|
+
async getDecision(tenantId, decisionId) {
|
|
177
|
+
return this.request(`/snapshots/${decisionId}`, { tenantId });
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Search decisions using smart search (auto-selects semantic vs keyword)
|
|
181
|
+
*/
|
|
182
|
+
async searchDecisions(tenantId, query, options) {
|
|
183
|
+
return this.request('/decisions/smart-search', {
|
|
184
|
+
method: 'POST',
|
|
185
|
+
body: {
|
|
186
|
+
query,
|
|
187
|
+
limit: options?.limit ?? 5,
|
|
188
|
+
exclude_superseded: options?.exclude_superseded ?? true,
|
|
189
|
+
},
|
|
190
|
+
tenantId,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Fetch multiple decisions by IDs in a single request
|
|
195
|
+
*/
|
|
196
|
+
async getDecisions(tenantId, decisionIds) {
|
|
197
|
+
if (decisionIds.length === 0)
|
|
198
|
+
return [];
|
|
199
|
+
return this.request('/snapshots/batch', {
|
|
200
|
+
method: 'POST',
|
|
201
|
+
body: { ids: decisionIds },
|
|
202
|
+
tenantId,
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
// ===========================================================================
|
|
206
|
+
// Issue Operations
|
|
207
|
+
// ===========================================================================
|
|
208
|
+
/**
|
|
209
|
+
* Search for issues across enabled connectors
|
|
210
|
+
*/
|
|
211
|
+
async searchIssues(tenantId, keywords, sourceText) {
|
|
212
|
+
return this.request('/issues/search', {
|
|
213
|
+
method: 'POST',
|
|
214
|
+
body: { keywords, sourceText },
|
|
215
|
+
tenantId,
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Create an issue in the specified connector
|
|
220
|
+
*/
|
|
221
|
+
async createIssue(tenantId, params) {
|
|
222
|
+
return this.request('/issues/create', {
|
|
223
|
+
method: 'POST',
|
|
224
|
+
body: {
|
|
225
|
+
connector: params.connector,
|
|
226
|
+
project_key: params.projectKey,
|
|
227
|
+
summary: params.summary,
|
|
228
|
+
description: params.description,
|
|
229
|
+
issue_type: params.issueType,
|
|
230
|
+
labels: params.labels?.length ? params.labels : undefined,
|
|
231
|
+
components: params.components?.length ? params.components : undefined,
|
|
232
|
+
priority: params.priority || undefined,
|
|
233
|
+
epic_key: params.epicKey || undefined,
|
|
234
|
+
},
|
|
235
|
+
tenantId,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Link a decision to an issue
|
|
240
|
+
*/
|
|
241
|
+
async linkDecisionToIssue(tenantId, decisionId, issue) {
|
|
242
|
+
await this.request(`/decisions/${decisionId}/link-issue`, {
|
|
243
|
+
method: 'POST',
|
|
244
|
+
body: {
|
|
245
|
+
connector: issue.connector,
|
|
246
|
+
external_id: issue.issueKey,
|
|
247
|
+
external_url: issue.url,
|
|
248
|
+
reference_type: 'tracks',
|
|
249
|
+
metadata: {
|
|
250
|
+
title: issue.title,
|
|
251
|
+
status: issue.status,
|
|
252
|
+
project_key: issue.projectKey,
|
|
253
|
+
},
|
|
254
|
+
},
|
|
255
|
+
tenantId,
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
// ===========================================================================
|
|
259
|
+
// JIRA-specific Operations
|
|
260
|
+
// ===========================================================================
|
|
261
|
+
/**
|
|
262
|
+
* Fetch JIRA tenant settings
|
|
263
|
+
*/
|
|
264
|
+
async getJiraSettings(tenantId) {
|
|
265
|
+
try {
|
|
266
|
+
return await this.request('/integrations/jira/settings', { tenantId });
|
|
267
|
+
}
|
|
268
|
+
catch {
|
|
269
|
+
return { configured: false };
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Save JIRA tenant settings (e.g. default project key)
|
|
274
|
+
*/
|
|
275
|
+
async saveJiraSettings(tenantId, settings) {
|
|
276
|
+
await this.request('/integrations/jira/settings', {
|
|
277
|
+
method: 'PUT',
|
|
278
|
+
body: settings,
|
|
279
|
+
tenantId,
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Fetch available JIRA projects
|
|
284
|
+
*/
|
|
285
|
+
async getJiraProjects(tenantId) {
|
|
286
|
+
const result = await this.request('/integrations/jira/projects', { tenantId });
|
|
287
|
+
return result.projects || [];
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Get AI-suggested epic for a decision
|
|
291
|
+
*/
|
|
292
|
+
async suggestEpic(tenantId, projectKey, title, description, goals) {
|
|
293
|
+
try {
|
|
294
|
+
const result = await this.request('/integrations/jira/suggest-epic', {
|
|
295
|
+
method: 'POST',
|
|
296
|
+
body: { projectKey, title, description, goals },
|
|
297
|
+
tenantId,
|
|
298
|
+
});
|
|
299
|
+
return result.suggestion || null;
|
|
300
|
+
}
|
|
301
|
+
catch {
|
|
302
|
+
return null;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
// ===========================================================================
|
|
306
|
+
// Snapshot Operations (used by Slack)
|
|
307
|
+
// ===========================================================================
|
|
308
|
+
/**
|
|
309
|
+
* Get a decision snapshot by ID
|
|
310
|
+
*/
|
|
311
|
+
async getSnapshot(tenantId, decisionId) {
|
|
312
|
+
return this.request(`/snapshots/${decisionId}`, { tenantId });
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Update decision source URL
|
|
316
|
+
*/
|
|
317
|
+
async updateDecisionSourceUrl(tenantId, decisionId, sourceUrl) {
|
|
318
|
+
return this.request(`/snapshots/${decisionId}/update-source-url`, {
|
|
319
|
+
method: 'PATCH',
|
|
320
|
+
body: { source_url: sourceUrl },
|
|
321
|
+
tenantId,
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
// ===========================================================================
|
|
325
|
+
// Issue Operations (extended - used by Slack)
|
|
326
|
+
// ===========================================================================
|
|
327
|
+
/**
|
|
328
|
+
* Fetch a single issue by key
|
|
329
|
+
*/
|
|
330
|
+
async fetchIssue(tenantId, issueKey) {
|
|
331
|
+
return this.request(`/issues/${issueKey}`, { tenantId });
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Add a comment to an issue
|
|
335
|
+
*/
|
|
336
|
+
async addCommentToIssue(tenantId, issueKey, comment) {
|
|
337
|
+
await this.request(`/issues/${issueKey}/comment`, {
|
|
338
|
+
method: 'POST',
|
|
339
|
+
body: comment,
|
|
340
|
+
tenantId,
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
// ===========================================================================
|
|
344
|
+
// Slack-specific Conversation State (platform adapter)
|
|
345
|
+
// ===========================================================================
|
|
346
|
+
/**
|
|
347
|
+
* Get Slack conversation state
|
|
348
|
+
*/
|
|
349
|
+
async getSlackConversationState(tenantId, channelId, threadTs) {
|
|
350
|
+
try {
|
|
351
|
+
return await this.request(`/slack/conversation-state?channel_id=${channelId}&thread_ts=${threadTs}`, { tenantId });
|
|
352
|
+
}
|
|
353
|
+
catch {
|
|
354
|
+
return null;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Save Slack conversation state
|
|
359
|
+
*/
|
|
360
|
+
async saveSlackConversationState(tenantId, data) {
|
|
361
|
+
await this.request('/slack/conversation-state', {
|
|
362
|
+
method: 'POST',
|
|
363
|
+
body: data,
|
|
364
|
+
tenantId,
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
// ===========================================================================
|
|
368
|
+
// Brain Operations (AI queries)
|
|
369
|
+
// ===========================================================================
|
|
370
|
+
/**
|
|
371
|
+
* Query the Brain service
|
|
372
|
+
*/
|
|
373
|
+
async queryBrain(tenantId, question, context) {
|
|
374
|
+
return this.request('/brain/query', {
|
|
375
|
+
method: 'POST',
|
|
376
|
+
body: { question, context },
|
|
377
|
+
tenantId,
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
// ===========================================================================
|
|
381
|
+
// Jira Credentials (used by mcp-jira)
|
|
382
|
+
// ===========================================================================
|
|
383
|
+
/**
|
|
384
|
+
* Fetch Jira credentials for a tenant
|
|
385
|
+
*/
|
|
386
|
+
async fetchJiraCredentials(tenantId) {
|
|
387
|
+
const result = await this.request('/integrations/jira/credentials', { tenantId });
|
|
388
|
+
if (!result.token) {
|
|
389
|
+
throw new Error('jira_creds_missing');
|
|
390
|
+
}
|
|
391
|
+
return {
|
|
392
|
+
base: result.base || '',
|
|
393
|
+
token: result.token,
|
|
394
|
+
cloudId: result.cloudId,
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
// ===========================================================================
|
|
398
|
+
// Slack Shortcuts
|
|
399
|
+
// ===========================================================================
|
|
400
|
+
/**
|
|
401
|
+
* Trigger a Slack shortcut
|
|
402
|
+
*/
|
|
403
|
+
async triggerSlackShortcut(tenantId, data) {
|
|
404
|
+
await this.request('/slack/shortcuts', {
|
|
405
|
+
method: 'POST',
|
|
406
|
+
body: data,
|
|
407
|
+
tenantId,
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
//# sourceMappingURL=GatewayClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GatewayClient.js","sourceRoot":"","sources":["../../src/services/GatewayClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared streaming response consumer for all connectors.
|
|
3
|
+
*
|
|
4
|
+
* Consumes SSE events from GatewayClient.streamConversational(),
|
|
5
|
+
* buffers text chunks, and calls a platform-specific MessageUpdater
|
|
6
|
+
* at a configurable interval to progressively update the user's
|
|
7
|
+
* placeholder message.
|
|
8
|
+
*/
|
|
9
|
+
import type { ConversationalResponse, StreamEvent } from '../types/index.js';
|
|
10
|
+
/**
|
|
11
|
+
* Platform-specific message updater.
|
|
12
|
+
* Each connector provides its own implementation (3-5 lines).
|
|
13
|
+
*/
|
|
14
|
+
export interface MessageUpdater {
|
|
15
|
+
/** Update the placeholder message with the current accumulated text */
|
|
16
|
+
update(text: string): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
export interface StreamConsumerOptions {
|
|
19
|
+
/** Minimum milliseconds between message updates (default: 800ms) */
|
|
20
|
+
intervalMs?: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Consume a streaming AI response and progressively update a message.
|
|
24
|
+
*
|
|
25
|
+
* @returns The final ConversationalResponse when the stream completes
|
|
26
|
+
*/
|
|
27
|
+
export declare function consumeStreamWithProgressiveUpdates(stream: AsyncIterable<StreamEvent>, updater: MessageUpdater, options?: StreamConsumerOptions): Promise<ConversationalResponse>;
|
|
28
|
+
//# sourceMappingURL=StreamingResponseConsumer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StreamingResponseConsumer.d.ts","sourceRoot":"","sources":["../../src/services/StreamingResponseConsumer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE7E;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,uEAAuE;IACvE,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,qBAAqB;IACpC,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAsB,mCAAmC,CACvD,MAAM,EAAE,aAAa,CAAC,WAAW,CAAC,EAClC,OAAO,EAAE,cAAc,EACvB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,sBAAsB,CAAC,CA+CjC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared streaming response consumer for all connectors.
|
|
3
|
+
*
|
|
4
|
+
* Consumes SSE events from GatewayClient.streamConversational(),
|
|
5
|
+
* buffers text chunks, and calls a platform-specific MessageUpdater
|
|
6
|
+
* at a configurable interval to progressively update the user's
|
|
7
|
+
* placeholder message.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Consume a streaming AI response and progressively update a message.
|
|
11
|
+
*
|
|
12
|
+
* @returns The final ConversationalResponse when the stream completes
|
|
13
|
+
*/
|
|
14
|
+
export async function consumeStreamWithProgressiveUpdates(stream, updater, options) {
|
|
15
|
+
const intervalMs = options?.intervalMs ?? 800;
|
|
16
|
+
let accumulated = '';
|
|
17
|
+
let lastUpdateTime = 0;
|
|
18
|
+
let completeResponse = null;
|
|
19
|
+
let hadError = false;
|
|
20
|
+
for await (const event of stream) {
|
|
21
|
+
if (event.type === 'token' && event.data.text) {
|
|
22
|
+
accumulated += event.data.text;
|
|
23
|
+
const now = Date.now();
|
|
24
|
+
if (now - lastUpdateTime >= intervalMs) {
|
|
25
|
+
lastUpdateTime = now;
|
|
26
|
+
await updater.update(`${accumulated} ...`).catch(() => { });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
else if (event.type === 'complete') {
|
|
30
|
+
completeResponse = event.data;
|
|
31
|
+
}
|
|
32
|
+
else if (event.type === 'error') {
|
|
33
|
+
// If no tokens accumulated yet, throw so caller can fall back to non-streaming
|
|
34
|
+
if (!accumulated) {
|
|
35
|
+
throw new Error(event.data?.error || 'Stream error');
|
|
36
|
+
}
|
|
37
|
+
hadError = true;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// Final update with complete text (no trailing ellipsis)
|
|
41
|
+
if (accumulated) {
|
|
42
|
+
const finalText = completeResponse?.response_text || accumulated;
|
|
43
|
+
await updater.update(finalText).catch(() => { });
|
|
44
|
+
}
|
|
45
|
+
if (completeResponse) {
|
|
46
|
+
return completeResponse;
|
|
47
|
+
}
|
|
48
|
+
// Fallback: construct response from accumulated text
|
|
49
|
+
return {
|
|
50
|
+
intent: 'clarify',
|
|
51
|
+
response_text: hadError
|
|
52
|
+
? (accumulated || 'I encountered an error processing your request.')
|
|
53
|
+
: (accumulated || 'No response received.'),
|
|
54
|
+
follow_up_prompts: [],
|
|
55
|
+
confidence: 0,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=StreamingResponseConsumer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StreamingResponseConsumer.js","sourceRoot":"","sources":["../../src/services/StreamingResponseConsumer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAkBH;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,mCAAmC,CACvD,MAAkC,EAClC,OAAuB,EACvB,OAA+B;IAE/B,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,GAAG,CAAC;IAE9C,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,gBAAgB,GAAkC,IAAI,CAAC;IAC3D,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACjC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAC9C,WAAW,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YAE/B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,IAAI,GAAG,GAAG,cAAc,IAAI,UAAU,EAAE,CAAC;gBACvC,cAAc,GAAG,GAAG,CAAC;gBACrB,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,WAAW,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACrC,gBAAgB,GAAG,KAAK,CAAC,IAAyC,CAAC;QACrE,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAClC,+EAA+E;YAC/E,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,IAAI,cAAc,CAAC,CAAC;YACvD,CAAC;YACD,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;IACH,CAAC;IAED,yDAAyD;IACzD,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,SAAS,GAAG,gBAAgB,EAAE,aAAa,IAAI,WAAW,CAAC;QACjE,MAAM,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,qDAAqD;IACrD,OAAO;QACL,MAAM,EAAE,SAAS;QACjB,aAAa,EAAE,QAAQ;YACrB,CAAC,CAAC,CAAC,WAAW,IAAI,iDAAiD,CAAC;YACpE,CAAC,CAAC,CAAC,WAAW,IAAI,uBAAuB,CAAC;QAC5C,iBAAiB,EAAE,EAAE;QACrB,UAAU,EAAE,CAAC;KACY,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telemetry Client for Connectors
|
|
3
|
+
*
|
|
4
|
+
* HTTP client for sending telemetry events to the Gateway.
|
|
5
|
+
* Used by connectors that run in separate processes.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Telemetry event categories
|
|
9
|
+
*/
|
|
10
|
+
export type TelemetryCategory = 'engagement' | 'value' | 'quality' | 'system' | 'connector';
|
|
11
|
+
/**
|
|
12
|
+
* Supported platforms
|
|
13
|
+
*/
|
|
14
|
+
export type TelemetryPlatform = 'web' | 'slack' | 'teams' | 'github' | 'jira' | 'confluence' | 'linear' | 'api' | 'system';
|
|
15
|
+
/**
|
|
16
|
+
* Telemetry event structure
|
|
17
|
+
*/
|
|
18
|
+
export interface TelemetryEvent {
|
|
19
|
+
eventName: string;
|
|
20
|
+
category: TelemetryCategory;
|
|
21
|
+
platform?: TelemetryPlatform;
|
|
22
|
+
connectorKey?: string;
|
|
23
|
+
userId?: string;
|
|
24
|
+
properties?: Record<string, unknown>;
|
|
25
|
+
metrics?: Record<string, number>;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Configuration for the telemetry client
|
|
29
|
+
*/
|
|
30
|
+
export interface TelemetryClientConfig {
|
|
31
|
+
/** Gateway URL (e.g., http://gateway:8080) */
|
|
32
|
+
gatewayUrl: string;
|
|
33
|
+
/** Default platform for all events */
|
|
34
|
+
defaultPlatform?: TelemetryPlatform;
|
|
35
|
+
/** Default connector key */
|
|
36
|
+
defaultConnectorKey?: string;
|
|
37
|
+
/** Whether telemetry is enabled (default: true) */
|
|
38
|
+
enabled?: boolean;
|
|
39
|
+
/** Batch size before auto-flush (default: 10) */
|
|
40
|
+
batchSize?: number;
|
|
41
|
+
/** Flush interval in ms (default: 5000) */
|
|
42
|
+
flushIntervalMs?: number;
|
|
43
|
+
/** Request timeout in ms (default: 5000) */
|
|
44
|
+
timeoutMs?: number;
|
|
45
|
+
/** Logger function */
|
|
46
|
+
logger?: (level: 'info' | 'warn' | 'error', message: string, meta?: Record<string, unknown>) => void;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Telemetry client for sending events to the Gateway.
|
|
50
|
+
*/
|
|
51
|
+
export declare class TelemetryClient {
|
|
52
|
+
private readonly gatewayUrl;
|
|
53
|
+
private readonly defaultPlatform?;
|
|
54
|
+
private readonly defaultConnectorKey?;
|
|
55
|
+
private readonly enabled;
|
|
56
|
+
private readonly batchSize;
|
|
57
|
+
private readonly flushIntervalMs;
|
|
58
|
+
private readonly timeoutMs;
|
|
59
|
+
private readonly log;
|
|
60
|
+
private eventBuffer;
|
|
61
|
+
private flushTimer;
|
|
62
|
+
private currentTenantId;
|
|
63
|
+
constructor(config: TelemetryClientConfig);
|
|
64
|
+
/**
|
|
65
|
+
* Set the current tenant ID for subsequent events.
|
|
66
|
+
* Should be called when processing requests with tenant context.
|
|
67
|
+
*/
|
|
68
|
+
setTenantId(tenantId: string): void;
|
|
69
|
+
/**
|
|
70
|
+
* Track a telemetry event.
|
|
71
|
+
*/
|
|
72
|
+
track(event: TelemetryEvent, tenantId?: string): Promise<void>;
|
|
73
|
+
/**
|
|
74
|
+
* Track immediately without batching.
|
|
75
|
+
*/
|
|
76
|
+
trackImmediate(event: TelemetryEvent, tenantId?: string): Promise<void>;
|
|
77
|
+
/**
|
|
78
|
+
* Flush all buffered events.
|
|
79
|
+
*/
|
|
80
|
+
flush(): Promise<void>;
|
|
81
|
+
/**
|
|
82
|
+
* Shutdown the client, flushing remaining events.
|
|
83
|
+
*/
|
|
84
|
+
shutdown(): Promise<void>;
|
|
85
|
+
/**
|
|
86
|
+
* Track a webhook event.
|
|
87
|
+
*/
|
|
88
|
+
trackWebhook(webhookId: string, eventType: string, success: boolean, durationMs: number, tenantId?: string): Promise<void>;
|
|
89
|
+
/**
|
|
90
|
+
* Track a command execution.
|
|
91
|
+
*/
|
|
92
|
+
trackCommand(command: string, success: boolean, durationMs: number, tenantId?: string, properties?: Record<string, unknown>): Promise<void>;
|
|
93
|
+
/**
|
|
94
|
+
* Track a decision capture.
|
|
95
|
+
*/
|
|
96
|
+
trackDecisionCaptured(decisionId: string, captureMethod: 'slash_command' | 'auto_capture' | 'manual' | 'webhook', tenantId?: string, properties?: Record<string, unknown>): Promise<void>;
|
|
97
|
+
/**
|
|
98
|
+
* Track a conflict detection.
|
|
99
|
+
*/
|
|
100
|
+
trackConflictDetected(decisionId: string, conflictingDecisionId: string, severity: 'low' | 'medium' | 'high' | 'critical', tenantId?: string): Promise<void>;
|
|
101
|
+
/**
|
|
102
|
+
* Track a Jira comment processed.
|
|
103
|
+
*/
|
|
104
|
+
trackJiraComment(issueKey: string, commentId: string, hasDecision: boolean, durationMs: number, tenantId?: string): Promise<void>;
|
|
105
|
+
/**
|
|
106
|
+
* Track a Jira issue linked.
|
|
107
|
+
*/
|
|
108
|
+
trackJiraIssueLinked(decisionId: string, issueKey: string, linkType: string, tenantId?: string): Promise<void>;
|
|
109
|
+
private sendEvents;
|
|
110
|
+
private startFlushTimer;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Create a telemetry client with standard configuration.
|
|
114
|
+
*/
|
|
115
|
+
export declare function createTelemetryClient(gatewayUrl: string, platform: TelemetryPlatform, options?: Partial<Omit<TelemetryClientConfig, 'gatewayUrl' | 'defaultPlatform'>>): TelemetryClient;
|
|
116
|
+
//# sourceMappingURL=TelemetryClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TelemetryClient.d.ts","sourceRoot":"","sources":["../../src/services/TelemetryClient.ts"],"names":[],"mappings":"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"}
|