@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.
Files changed (106) hide show
  1. package/LICENSE +21 -0
  2. package/dist/fetchers/confluence.d.ts +9 -0
  3. package/dist/fetchers/confluence.d.ts.map +1 -0
  4. package/dist/fetchers/confluence.js +89 -0
  5. package/dist/fetchers/confluence.js.map +1 -0
  6. package/dist/fetchers/errors.d.ts +11 -0
  7. package/dist/fetchers/errors.d.ts.map +1 -0
  8. package/dist/fetchers/errors.js +15 -0
  9. package/dist/fetchers/errors.js.map +1 -0
  10. package/dist/fetchers/git.d.ts +23 -0
  11. package/dist/fetchers/git.d.ts.map +1 -0
  12. package/dist/fetchers/git.js +27 -0
  13. package/dist/fetchers/git.js.map +1 -0
  14. package/dist/fetchers/github.d.ts +9 -0
  15. package/dist/fetchers/github.d.ts.map +1 -0
  16. package/dist/fetchers/github.js +53 -0
  17. package/dist/fetchers/github.js.map +1 -0
  18. package/dist/fetchers/gitlab.d.ts +9 -0
  19. package/dist/fetchers/gitlab.d.ts.map +1 -0
  20. package/dist/fetchers/gitlab.js +33 -0
  21. package/dist/fetchers/gitlab.js.map +1 -0
  22. package/dist/fetchers/index.d.ts +20 -0
  23. package/dist/fetchers/index.d.ts.map +1 -0
  24. package/dist/fetchers/index.js +38 -0
  25. package/dist/fetchers/index.js.map +1 -0
  26. package/dist/fetchers/jira.d.ts +9 -0
  27. package/dist/fetchers/jira.d.ts.map +1 -0
  28. package/dist/fetchers/jira.js +73 -0
  29. package/dist/fetchers/jira.js.map +1 -0
  30. package/dist/fetchers/linear.d.ts +9 -0
  31. package/dist/fetchers/linear.d.ts.map +1 -0
  32. package/dist/fetchers/linear.js +71 -0
  33. package/dist/fetchers/linear.js.map +1 -0
  34. package/dist/fetchers/notion.d.ts +9 -0
  35. package/dist/fetchers/notion.d.ts.map +1 -0
  36. package/dist/fetchers/notion.js +85 -0
  37. package/dist/fetchers/notion.js.map +1 -0
  38. package/dist/fetchers/slack.d.ts +10 -0
  39. package/dist/fetchers/slack.d.ts.map +1 -0
  40. package/dist/fetchers/slack.js +103 -0
  41. package/dist/fetchers/slack.js.map +1 -0
  42. package/dist/fetchers/teams.d.ts +10 -0
  43. package/dist/fetchers/teams.d.ts.map +1 -0
  44. package/dist/fetchers/teams.js +76 -0
  45. package/dist/fetchers/teams.js.map +1 -0
  46. package/dist/fetchers/util/git.d.ts +22 -0
  47. package/dist/fetchers/util/git.d.ts.map +1 -0
  48. package/dist/fetchers/util/git.js +50 -0
  49. package/dist/fetchers/util/git.js.map +1 -0
  50. package/dist/fetchers/zoom.d.ts +9 -0
  51. package/dist/fetchers/zoom.d.ts.map +1 -0
  52. package/dist/fetchers/zoom.js +72 -0
  53. package/dist/fetchers/zoom.js.map +1 -0
  54. package/dist/index.d.ts +25 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +33 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/parsers/CommandParser.d.ts +69 -0
  59. package/dist/parsers/CommandParser.d.ts.map +1 -0
  60. package/dist/parsers/CommandParser.js +233 -0
  61. package/dist/parsers/CommandParser.js.map +1 -0
  62. package/dist/services/GatewayClient.d.ts +147 -0
  63. package/dist/services/GatewayClient.d.ts.map +1 -0
  64. package/dist/services/GatewayClient.js +411 -0
  65. package/dist/services/GatewayClient.js.map +1 -0
  66. package/dist/services/StreamingResponseConsumer.d.ts +28 -0
  67. package/dist/services/StreamingResponseConsumer.d.ts.map +1 -0
  68. package/dist/services/StreamingResponseConsumer.js +58 -0
  69. package/dist/services/StreamingResponseConsumer.js.map +1 -0
  70. package/dist/services/TelemetryClient.d.ts +116 -0
  71. package/dist/services/TelemetryClient.d.ts.map +1 -0
  72. package/dist/services/TelemetryClient.js +234 -0
  73. package/dist/services/TelemetryClient.js.map +1 -0
  74. package/dist/testing/MockGatewayClient.d.ts +51 -0
  75. package/dist/testing/MockGatewayClient.d.ts.map +1 -0
  76. package/dist/testing/MockGatewayClient.js +84 -0
  77. package/dist/testing/MockGatewayClient.js.map +1 -0
  78. package/dist/testing/fixtures.d.ts +49 -0
  79. package/dist/testing/fixtures.d.ts.map +1 -0
  80. package/dist/testing/fixtures.js +59 -0
  81. package/dist/testing/fixtures.js.map +1 -0
  82. package/dist/tiers/capabilities.d.ts +18 -0
  83. package/dist/tiers/capabilities.d.ts.map +1 -0
  84. package/dist/tiers/capabilities.js +99 -0
  85. package/dist/tiers/capabilities.js.map +1 -0
  86. package/dist/types/fetcher.d.ts +59 -0
  87. package/dist/types/fetcher.d.ts.map +1 -0
  88. package/dist/types/fetcher.js +15 -0
  89. package/dist/types/fetcher.js.map +1 -0
  90. package/dist/types/flow.d.ts +190 -0
  91. package/dist/types/flow.d.ts.map +1 -0
  92. package/dist/types/flow.js +24 -0
  93. package/dist/types/flow.js.map +1 -0
  94. package/dist/types/index.d.ts +707 -0
  95. package/dist/types/index.d.ts.map +1 -0
  96. package/dist/types/index.js +13 -0
  97. package/dist/types/index.js.map +1 -0
  98. package/dist/utils/requestContext.d.ts +42 -0
  99. package/dist/utils/requestContext.d.ts.map +1 -0
  100. package/dist/utils/requestContext.js +56 -0
  101. package/dist/utils/requestContext.js.map +1 -0
  102. package/dist/utils/validation.d.ts +25 -0
  103. package/dist/utils/validation.d.ts.map +1 -0
  104. package/dist/utils/validation.js +31 -0
  105. package/dist/utils/validation.js.map +1 -0
  106. 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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"}