@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,234 @@
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
+ import { fetch } from 'undici';
8
+ /**
9
+ * Telemetry client for sending events to the Gateway.
10
+ */
11
+ export class TelemetryClient {
12
+ gatewayUrl;
13
+ defaultPlatform;
14
+ defaultConnectorKey;
15
+ enabled;
16
+ batchSize;
17
+ flushIntervalMs;
18
+ timeoutMs;
19
+ log;
20
+ eventBuffer = [];
21
+ flushTimer = null;
22
+ currentTenantId = null;
23
+ constructor(config) {
24
+ this.gatewayUrl = config.gatewayUrl.replace(/\/$/, ''); // Remove trailing slash
25
+ this.defaultPlatform = config.defaultPlatform;
26
+ this.defaultConnectorKey = config.defaultConnectorKey;
27
+ this.enabled = config.enabled ?? true;
28
+ this.batchSize = config.batchSize ?? 10;
29
+ this.flushIntervalMs = config.flushIntervalMs ?? 5000;
30
+ this.timeoutMs = config.timeoutMs ?? 5000;
31
+ this.log = config.logger ?? (() => { });
32
+ // Start flush timer
33
+ if (this.flushIntervalMs > 0) {
34
+ this.startFlushTimer();
35
+ }
36
+ }
37
+ /**
38
+ * Set the current tenant ID for subsequent events.
39
+ * Should be called when processing requests with tenant context.
40
+ */
41
+ setTenantId(tenantId) {
42
+ this.currentTenantId = tenantId;
43
+ }
44
+ /**
45
+ * Track a telemetry event.
46
+ */
47
+ async track(event, tenantId) {
48
+ if (!this.enabled)
49
+ return;
50
+ const effectiveTenantId = tenantId ?? this.currentTenantId;
51
+ if (!effectiveTenantId) {
52
+ this.log('warn', 'Cannot track telemetry event without tenant ID', { eventName: event.eventName });
53
+ return;
54
+ }
55
+ const fullEvent = {
56
+ ...event,
57
+ tenantId: effectiveTenantId,
58
+ platform: event.platform ?? this.defaultPlatform,
59
+ connectorKey: event.connectorKey ?? this.defaultConnectorKey,
60
+ };
61
+ this.eventBuffer.push(fullEvent);
62
+ // Flush if buffer is full
63
+ if (this.eventBuffer.length >= this.batchSize) {
64
+ await this.flush();
65
+ }
66
+ }
67
+ /**
68
+ * Track immediately without batching.
69
+ */
70
+ async trackImmediate(event, tenantId) {
71
+ if (!this.enabled)
72
+ return;
73
+ const effectiveTenantId = tenantId ?? this.currentTenantId;
74
+ if (!effectiveTenantId) {
75
+ this.log('warn', 'Cannot track telemetry event without tenant ID', { eventName: event.eventName });
76
+ return;
77
+ }
78
+ const fullEvent = {
79
+ ...event,
80
+ platform: event.platform ?? this.defaultPlatform,
81
+ connectorKey: event.connectorKey ?? this.defaultConnectorKey,
82
+ };
83
+ await this.sendEvents([fullEvent], effectiveTenantId);
84
+ }
85
+ /**
86
+ * Flush all buffered events.
87
+ */
88
+ async flush() {
89
+ if (this.eventBuffer.length === 0)
90
+ return;
91
+ // Group events by tenant
92
+ const eventsByTenant = new Map();
93
+ for (const event of this.eventBuffer) {
94
+ const { tenantId, ...eventData } = event;
95
+ if (!eventsByTenant.has(tenantId)) {
96
+ eventsByTenant.set(tenantId, []);
97
+ }
98
+ eventsByTenant.get(tenantId).push(eventData);
99
+ }
100
+ this.eventBuffer = [];
101
+ // Send events for each tenant
102
+ const promises = Array.from(eventsByTenant.entries()).map(([tenantId, events]) => this.sendEvents(events, tenantId));
103
+ await Promise.all(promises);
104
+ }
105
+ /**
106
+ * Shutdown the client, flushing remaining events.
107
+ */
108
+ async shutdown() {
109
+ if (this.flushTimer) {
110
+ clearInterval(this.flushTimer);
111
+ this.flushTimer = null;
112
+ }
113
+ await this.flush();
114
+ }
115
+ // ==========================================================================
116
+ // Convenience Methods
117
+ // ==========================================================================
118
+ /**
119
+ * Track a webhook event.
120
+ */
121
+ async trackWebhook(webhookId, eventType, success, durationMs, tenantId) {
122
+ await this.track({
123
+ eventName: success ? 'webhook.processed' : 'webhook.failed',
124
+ category: 'connector',
125
+ properties: { webhookId, eventType, success },
126
+ metrics: { durationMs },
127
+ }, tenantId);
128
+ }
129
+ /**
130
+ * Track a command execution.
131
+ */
132
+ async trackCommand(command, success, durationMs, tenantId, properties) {
133
+ await this.track({
134
+ eventName: success ? 'command.completed' : 'command.failed',
135
+ category: 'engagement',
136
+ properties: { command, success, ...properties },
137
+ metrics: { durationMs },
138
+ }, tenantId);
139
+ }
140
+ /**
141
+ * Track a decision capture.
142
+ */
143
+ async trackDecisionCaptured(decisionId, captureMethod, tenantId, properties) {
144
+ await this.track({
145
+ eventName: 'decision.captured',
146
+ category: 'engagement',
147
+ properties: { decisionId, captureMethod, ...properties },
148
+ }, tenantId);
149
+ }
150
+ /**
151
+ * Track a conflict detection.
152
+ */
153
+ async trackConflictDetected(decisionId, conflictingDecisionId, severity, tenantId) {
154
+ await this.track({
155
+ eventName: 'conflict.detected',
156
+ category: 'value',
157
+ properties: { decisionId, conflictingDecisionId, severity },
158
+ }, tenantId);
159
+ }
160
+ /**
161
+ * Track a Jira comment processed.
162
+ */
163
+ async trackJiraComment(issueKey, commentId, hasDecision, durationMs, tenantId) {
164
+ await this.track({
165
+ eventName: 'jira.comment',
166
+ category: 'connector',
167
+ platform: 'jira',
168
+ properties: { issueKey, commentId, hasDecision },
169
+ metrics: { durationMs },
170
+ }, tenantId);
171
+ }
172
+ /**
173
+ * Track a Jira issue linked.
174
+ */
175
+ async trackJiraIssueLinked(decisionId, issueKey, linkType, tenantId) {
176
+ await this.track({
177
+ eventName: 'jira.issue_linked',
178
+ category: 'connector',
179
+ platform: 'jira',
180
+ properties: { decisionId, issueKey, linkType },
181
+ }, tenantId);
182
+ }
183
+ // ==========================================================================
184
+ // Private Methods
185
+ // ==========================================================================
186
+ async sendEvents(events, tenantId) {
187
+ try {
188
+ const response = await fetch(`${this.gatewayUrl}/telemetry/ingest`, {
189
+ method: 'POST',
190
+ headers: {
191
+ 'Content-Type': 'application/json',
192
+ 'X-Tenant-Id': tenantId,
193
+ },
194
+ body: JSON.stringify({ events }),
195
+ signal: AbortSignal.timeout(this.timeoutMs),
196
+ });
197
+ if (!response.ok) {
198
+ this.log('warn', 'Failed to send telemetry events', {
199
+ status: response.status,
200
+ tenantId,
201
+ count: events.length,
202
+ });
203
+ }
204
+ }
205
+ catch (error) {
206
+ this.log('error', 'Error sending telemetry events', {
207
+ error: error instanceof Error ? error.message : String(error),
208
+ tenantId,
209
+ count: events.length,
210
+ });
211
+ }
212
+ }
213
+ startFlushTimer() {
214
+ this.flushTimer = setInterval(() => {
215
+ void this.flush();
216
+ }, this.flushIntervalMs);
217
+ // Don't block process exit
218
+ if (this.flushTimer.unref) {
219
+ this.flushTimer.unref();
220
+ }
221
+ }
222
+ }
223
+ /**
224
+ * Create a telemetry client with standard configuration.
225
+ */
226
+ export function createTelemetryClient(gatewayUrl, platform, options) {
227
+ return new TelemetryClient({
228
+ gatewayUrl,
229
+ defaultPlatform: platform,
230
+ defaultConnectorKey: platform,
231
+ ...options,
232
+ });
233
+ }
234
+ //# sourceMappingURL=TelemetryClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TelemetryClient.js","sourceRoot":"","sources":["../../src/services/TelemetryClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import type { DecisionSearchOptions, DecisionSearchResponse } from '../types/index.js';
2
+ interface IngestCall {
3
+ tenantId: string;
4
+ payload: Record<string, unknown>;
5
+ }
6
+ interface SearchCall {
7
+ tenantId: string;
8
+ query: string;
9
+ options?: DecisionSearchOptions;
10
+ }
11
+ interface CredentialCall {
12
+ tenantId: string;
13
+ platform: string;
14
+ }
15
+ interface CallLog {
16
+ ingest: IngestCall[];
17
+ ingestBatch: IngestCall[];
18
+ credentials: CredentialCall[];
19
+ searchDecisions: SearchCall[];
20
+ }
21
+ type IngestHandler = (tenantId: string, payload: Record<string, unknown>) => Record<string, unknown>;
22
+ type CredentialHandler = (tenantId: string) => Record<string, string>;
23
+ /**
24
+ * Mock implementation of GatewayClient for unit testing connectors.
25
+ * Tracks all calls for assertions and supports configurable responses.
26
+ */
27
+ export declare class MockGatewayClient {
28
+ calls: CallLog;
29
+ private ingestHandler;
30
+ private ingestBatchHandler;
31
+ private credentialHandlers;
32
+ /** Override the ingest response */
33
+ onIngest(handler: IngestHandler): void;
34
+ /** Override the ingestBatch response */
35
+ onIngestBatch(handler: IngestHandler): void;
36
+ /** Override credential fetch for a specific platform */
37
+ onFetchCredentials(platform: string, handler: CredentialHandler): void;
38
+ ingest(tenantId: string, payload: Record<string, unknown>): Promise<Record<string, unknown>>;
39
+ ingestBatch(tenantId: string, payload: Record<string, unknown>): Promise<Record<string, unknown>>;
40
+ fetchJiraCredentials(tenantId: string): Promise<Record<string, string>>;
41
+ fetchSlackCredentials(tenantId: string): Promise<Record<string, string>>;
42
+ fetchGitHubCredentials(tenantId: string): Promise<Record<string, string>>;
43
+ fetchConfluenceCredentials(tenantId: string): Promise<Record<string, string>>;
44
+ fetchTeamsCredentials(tenantId: string): Promise<Record<string, string>>;
45
+ private fetchCredentials;
46
+ searchDecisions(tenantId: string, query: string, options?: DecisionSearchOptions): Promise<DecisionSearchResponse>;
47
+ /** Reset all call logs */
48
+ reset(): void;
49
+ }
50
+ export {};
51
+ //# sourceMappingURL=MockGatewayClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MockGatewayClient.d.ts","sourceRoot":"","sources":["../../src/testing/MockGatewayClient.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAEvF,UAAU,UAAU;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,UAAU,UAAU;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,qBAAqB,CAAC;CACjC;AAED,UAAU,cAAc;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,OAAO;IACf,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,eAAe,EAAE,UAAU,EAAE,CAAC;CAC/B;AAED,KAAK,aAAa,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACrG,KAAK,iBAAiB,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEtE;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B,KAAK,EAAE,OAAO,CAAyE;IAEvF,OAAO,CAAC,aAAa,CAIlB;IAEH,OAAO,CAAC,kBAAkB,CAEvB;IAEH,OAAO,CAAC,kBAAkB,CAAyC;IAEnE,mCAAmC;IACnC,QAAQ,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAItC,wCAAwC;IACxC,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAI3C,wDAAwD;IACxD,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAIhE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAK5F,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAKjG,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAIvE,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAIxE,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAIzE,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAI7E,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAIhE,gBAAgB;IAOxB,eAAe,CACnB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,sBAAsB,CAAC;IAqBlC,0BAA0B;IAC1B,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,84 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ /**
3
+ * Mock implementation of GatewayClient for unit testing connectors.
4
+ * Tracks all calls for assertions and supports configurable responses.
5
+ */
6
+ export class MockGatewayClient {
7
+ calls = { ingest: [], ingestBatch: [], credentials: [], searchDecisions: [] };
8
+ ingestHandler = () => ({
9
+ id: randomUUID(),
10
+ title: 'Mock Decision',
11
+ status: 'active',
12
+ });
13
+ ingestBatchHandler = () => ({
14
+ results: [{ id: randomUUID(), title: 'Mock Decision', status: 'active' }],
15
+ });
16
+ credentialHandlers = {};
17
+ /** Override the ingest response */
18
+ onIngest(handler) {
19
+ this.ingestHandler = handler;
20
+ }
21
+ /** Override the ingestBatch response */
22
+ onIngestBatch(handler) {
23
+ this.ingestBatchHandler = handler;
24
+ }
25
+ /** Override credential fetch for a specific platform */
26
+ onFetchCredentials(platform, handler) {
27
+ this.credentialHandlers[platform] = handler;
28
+ }
29
+ async ingest(tenantId, payload) {
30
+ this.calls.ingest.push({ tenantId, payload });
31
+ return this.ingestHandler(tenantId, payload);
32
+ }
33
+ async ingestBatch(tenantId, payload) {
34
+ this.calls.ingestBatch.push({ tenantId, payload });
35
+ return this.ingestBatchHandler(tenantId, payload);
36
+ }
37
+ async fetchJiraCredentials(tenantId) {
38
+ return this.fetchCredentials('jira', tenantId);
39
+ }
40
+ async fetchSlackCredentials(tenantId) {
41
+ return this.fetchCredentials('slack', tenantId);
42
+ }
43
+ async fetchGitHubCredentials(tenantId) {
44
+ return this.fetchCredentials('github', tenantId);
45
+ }
46
+ async fetchConfluenceCredentials(tenantId) {
47
+ return this.fetchCredentials('confluence', tenantId);
48
+ }
49
+ async fetchTeamsCredentials(tenantId) {
50
+ return this.fetchCredentials('teams', tenantId);
51
+ }
52
+ async fetchCredentials(platform, tenantId) {
53
+ this.calls.credentials.push({ tenantId, platform });
54
+ const handler = this.credentialHandlers[platform];
55
+ if (handler)
56
+ return handler(tenantId);
57
+ return { token: `mock-${platform}-token-${tenantId}` };
58
+ }
59
+ async searchDecisions(tenantId, query, options) {
60
+ this.calls.searchDecisions.push({ tenantId, query, options });
61
+ return {
62
+ query,
63
+ results: [
64
+ {
65
+ id: randomUUID(),
66
+ source_url: 'https://example.com',
67
+ platform: 'slack',
68
+ title: 'Mock Decision',
69
+ summary: 'A mock decision for testing',
70
+ created_at: new Date().toISOString(),
71
+ status: 'active',
72
+ similarity: 0.95,
73
+ },
74
+ ],
75
+ count: 1,
76
+ strategy: 'semantic',
77
+ };
78
+ }
79
+ /** Reset all call logs */
80
+ reset() {
81
+ this.calls = { ingest: [], ingestBatch: [], credentials: [], searchDecisions: [] };
82
+ }
83
+ }
84
+ //# sourceMappingURL=MockGatewayClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MockGatewayClient.js","sourceRoot":"","sources":["../../src/testing/MockGatewayClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /** Common test fixtures for connector development */
2
+ export declare const fixtures: {
3
+ /** A sample decision snapshot */
4
+ decision(overrides?: Record<string, unknown>): {
5
+ id: `${string}-${string}-${string}-${string}-${string}`;
6
+ title: string;
7
+ description: string;
8
+ status: string;
9
+ created_at: string;
10
+ updated_at: string;
11
+ };
12
+ /** A sample ingest response from the gateway */
13
+ ingestResponse(overrides?: Record<string, unknown>): {
14
+ id: `${string}-${string}-${string}-${string}-${string}`;
15
+ title: string;
16
+ status: string;
17
+ confidence: number;
18
+ };
19
+ /** A sample batch ingest response */
20
+ ingestBatchResponse(count?: number): {
21
+ results: {
22
+ id: `${string}-${string}-${string}-${string}-${string}`;
23
+ title: string;
24
+ status: string;
25
+ confidence: number;
26
+ }[];
27
+ };
28
+ /** A sample webhook payload (generic) */
29
+ webhookPayload(overrides?: Record<string, unknown>): {
30
+ event_id: `${string}-${string}-${string}-${string}-${string}`;
31
+ event_type: string;
32
+ timestamp: string;
33
+ data: {
34
+ content: string;
35
+ };
36
+ };
37
+ /** A sample tenant context */
38
+ tenantContext(overrides?: Record<string, unknown>): {
39
+ tenantId: `${string}-${string}-${string}-${string}-${string}`;
40
+ bearer: string;
41
+ };
42
+ /** Sample OAuth credentials */
43
+ oauthCredentials(platform: string): {
44
+ token: string;
45
+ refresh_token: string;
46
+ expires_at: string;
47
+ };
48
+ };
49
+ //# sourceMappingURL=fixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../../src/testing/fixtures.ts"],"names":[],"mappings":"AAEA,qDAAqD;AACrD,eAAO,MAAM,QAAQ;IACnB,iCAAiC;yBACZ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;;;IAY5C,gDAAgD;+BACrB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;IAUlD,qCAAqC;;;;;;;;;IAOrC,yCAAyC;+BACd,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;;;IAUlD,8BAA8B;8BACJ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;IAQjD,+BAA+B;+BACJ,MAAM;;;;;CAOlC,CAAC"}
@@ -0,0 +1,59 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ /** Common test fixtures for connector development */
3
+ export const fixtures = {
4
+ /** A sample decision snapshot */
5
+ decision(overrides) {
6
+ return {
7
+ id: randomUUID(),
8
+ title: 'Use Express for all connectors',
9
+ description: 'Standardize on Express framework for consistency and shared middleware.',
10
+ status: 'active',
11
+ created_at: new Date().toISOString(),
12
+ updated_at: new Date().toISOString(),
13
+ ...overrides,
14
+ };
15
+ },
16
+ /** A sample ingest response from the gateway */
17
+ ingestResponse(overrides) {
18
+ return {
19
+ id: randomUUID(),
20
+ title: 'Sample Decision',
21
+ status: 'active',
22
+ confidence: 0.85,
23
+ ...overrides,
24
+ };
25
+ },
26
+ /** A sample batch ingest response */
27
+ ingestBatchResponse(count = 2) {
28
+ return {
29
+ results: Array.from({ length: count }, () => fixtures.ingestResponse()),
30
+ };
31
+ },
32
+ /** A sample webhook payload (generic) */
33
+ webhookPayload(overrides) {
34
+ return {
35
+ event_id: randomUUID(),
36
+ event_type: 'message.created',
37
+ timestamp: new Date().toISOString(),
38
+ data: { content: 'We decided to use TypeScript for all services.' },
39
+ ...overrides,
40
+ };
41
+ },
42
+ /** A sample tenant context */
43
+ tenantContext(overrides) {
44
+ return {
45
+ tenantId: randomUUID(),
46
+ bearer: `test-bearer-${randomUUID().slice(0, 8)}`,
47
+ ...overrides,
48
+ };
49
+ },
50
+ /** Sample OAuth credentials */
51
+ oauthCredentials(platform) {
52
+ return {
53
+ token: `mock-${platform}-token`,
54
+ refresh_token: `mock-${platform}-refresh`,
55
+ expires_at: new Date(Date.now() + 3600000).toISOString(),
56
+ };
57
+ },
58
+ };
59
+ //# sourceMappingURL=fixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixtures.js","sourceRoot":"","sources":["../../src/testing/fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,qDAAqD;AACrD,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,iCAAiC;IACjC,QAAQ,CAAC,SAAmC;QAC1C,OAAO;YACL,EAAE,EAAE,UAAU,EAAE;YAChB,KAAK,EAAE,gCAAgC;YACvC,WAAW,EAAE,yEAAyE;YACtF,MAAM,EAAE,QAAQ;YAChB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACpC,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACpC,GAAG,SAAS;SACb,CAAC;IACJ,CAAC;IAED,gDAAgD;IAChD,cAAc,CAAC,SAAmC;QAChD,OAAO;YACL,EAAE,EAAE,UAAU,EAAE;YAChB,KAAK,EAAE,iBAAiB;YACxB,MAAM,EAAE,QAAQ;YAChB,UAAU,EAAE,IAAI;YAChB,GAAG,SAAS;SACb,CAAC;IACJ,CAAC;IAED,qCAAqC;IACrC,mBAAmB,CAAC,KAAK,GAAG,CAAC;QAC3B,OAAO;YACL,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;SACxE,CAAC;IACJ,CAAC;IAED,yCAAyC;IACzC,cAAc,CAAC,SAAmC;QAChD,OAAO;YACL,QAAQ,EAAE,UAAU,EAAE;YACtB,UAAU,EAAE,iBAAiB;YAC7B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,IAAI,EAAE,EAAE,OAAO,EAAE,gDAAgD,EAAE;YACnE,GAAG,SAAS;SACb,CAAC;IACJ,CAAC;IAED,8BAA8B;IAC9B,aAAa,CAAC,SAAmC;QAC/C,OAAO;YACL,QAAQ,EAAE,UAAU,EAAE;YACtB,MAAM,EAAE,eAAe,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;YACjD,GAAG,SAAS;SACb,CAAC;IACJ,CAAC;IAED,+BAA+B;IAC/B,gBAAgB,CAAC,QAAgB;QAC/B,OAAO;YACL,KAAK,EAAE,QAAQ,QAAQ,QAAQ;YAC/B,aAAa,EAAE,QAAQ,QAAQ,UAAU;YACzC,UAAU,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC,WAAW,EAAE;SACzD,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -0,0 +1,18 @@
1
+ export declare const CONNECTOR_TIERS: readonly ["communication", "project_management", "code", "documentation", "cicd", "observability", "intelligence"];
2
+ export type ConnectorTier = (typeof CONNECTOR_TIERS)[number];
3
+ export interface TierCapabilities {
4
+ tier: ConnectorTier;
5
+ supportsWebhooks: boolean;
6
+ supportsTranscripts: boolean;
7
+ supportsMultiDecision: boolean;
8
+ supportsIssueCreation: boolean;
9
+ supportsHistoricalImport: boolean;
10
+ supportsDecisionComments: boolean;
11
+ supportsReadOnlyTools: boolean;
12
+ supportsInteractiveCommands: boolean;
13
+ /** Whether this connector receives proactive conflict/supersession notifications from gateway deferred analysis */
14
+ supportsProactiveNotifications: boolean;
15
+ }
16
+ export declare const TIER_CAPABILITIES: Record<ConnectorTier, TierCapabilities>;
17
+ export declare function getTierCapabilities(tier: ConnectorTier): TierCapabilities;
18
+ //# sourceMappingURL=capabilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../src/tiers/capabilities.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,oHAQlB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,aAAa,CAAC;IACpB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,wBAAwB,EAAE,OAAO,CAAC;IAClC,wBAAwB,EAAE,OAAO,CAAC;IAClC,qBAAqB,EAAE,OAAO,CAAC;IAC/B,2BAA2B,EAAE,OAAO,CAAC;IACrC,mHAAmH;IACnH,8BAA8B,EAAE,OAAO,CAAC;CACzC;AAED,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAqFrE,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,aAAa,GAAG,gBAAgB,CAEzE"}
@@ -0,0 +1,99 @@
1
+ export const CONNECTOR_TIERS = [
2
+ 'communication',
3
+ 'project_management',
4
+ 'code',
5
+ 'documentation',
6
+ 'cicd',
7
+ 'observability',
8
+ 'intelligence',
9
+ ];
10
+ export const TIER_CAPABILITIES = {
11
+ communication: {
12
+ tier: 'communication',
13
+ supportsWebhooks: true,
14
+ supportsTranscripts: true,
15
+ supportsMultiDecision: true,
16
+ supportsIssueCreation: true,
17
+ supportsHistoricalImport: true,
18
+ supportsDecisionComments: true,
19
+ supportsReadOnlyTools: true,
20
+ supportsInteractiveCommands: true,
21
+ supportsProactiveNotifications: true,
22
+ },
23
+ project_management: {
24
+ tier: 'project_management',
25
+ supportsWebhooks: true,
26
+ supportsTranscripts: false,
27
+ supportsMultiDecision: false,
28
+ supportsIssueCreation: false,
29
+ supportsHistoricalImport: true,
30
+ supportsDecisionComments: true,
31
+ supportsReadOnlyTools: true,
32
+ supportsInteractiveCommands: true,
33
+ supportsProactiveNotifications: false,
34
+ },
35
+ code: {
36
+ tier: 'code',
37
+ supportsWebhooks: true,
38
+ supportsTranscripts: false,
39
+ supportsMultiDecision: false,
40
+ supportsIssueCreation: false,
41
+ supportsHistoricalImport: true,
42
+ supportsDecisionComments: true,
43
+ supportsReadOnlyTools: true,
44
+ supportsInteractiveCommands: true,
45
+ supportsProactiveNotifications: false,
46
+ },
47
+ documentation: {
48
+ tier: 'documentation',
49
+ supportsWebhooks: true,
50
+ supportsTranscripts: false,
51
+ supportsMultiDecision: false,
52
+ supportsIssueCreation: false,
53
+ supportsHistoricalImport: true,
54
+ supportsDecisionComments: true,
55
+ supportsReadOnlyTools: true,
56
+ supportsInteractiveCommands: true,
57
+ supportsProactiveNotifications: false,
58
+ },
59
+ cicd: {
60
+ tier: 'cicd',
61
+ supportsWebhooks: false,
62
+ supportsTranscripts: false,
63
+ supportsMultiDecision: false,
64
+ supportsIssueCreation: false,
65
+ supportsHistoricalImport: true,
66
+ supportsDecisionComments: false,
67
+ supportsReadOnlyTools: true,
68
+ supportsInteractiveCommands: false,
69
+ supportsProactiveNotifications: false,
70
+ },
71
+ observability: {
72
+ tier: 'observability',
73
+ supportsWebhooks: false,
74
+ supportsTranscripts: false,
75
+ supportsMultiDecision: false,
76
+ supportsIssueCreation: false,
77
+ supportsHistoricalImport: false,
78
+ supportsDecisionComments: false,
79
+ supportsReadOnlyTools: true,
80
+ supportsInteractiveCommands: false,
81
+ supportsProactiveNotifications: false,
82
+ },
83
+ intelligence: {
84
+ tier: 'intelligence',
85
+ supportsWebhooks: false,
86
+ supportsTranscripts: false,
87
+ supportsMultiDecision: false,
88
+ supportsIssueCreation: false,
89
+ supportsHistoricalImport: false,
90
+ supportsDecisionComments: false,
91
+ supportsReadOnlyTools: true,
92
+ supportsInteractiveCommands: false,
93
+ supportsProactiveNotifications: false,
94
+ },
95
+ };
96
+ export function getTierCapabilities(tier) {
97
+ return TIER_CAPABILITIES[tier];
98
+ }
99
+ //# sourceMappingURL=capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/tiers/capabilities.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,eAAe;IACf,oBAAoB;IACpB,MAAM;IACN,eAAe;IACf,MAAM;IACN,eAAe;IACf,cAAc;CACN,CAAC;AAkBX,MAAM,CAAC,MAAM,iBAAiB,GAA4C;IACxE,aAAa,EAAE;QACb,IAAI,EAAE,eAAe;QACrB,gBAAgB,EAAE,IAAI;QACtB,mBAAmB,EAAE,IAAI;QACzB,qBAAqB,EAAE,IAAI;QAC3B,qBAAqB,EAAE,IAAI;QAC3B,wBAAwB,EAAE,IAAI;QAC9B,wBAAwB,EAAE,IAAI;QAC9B,qBAAqB,EAAE,IAAI;QAC3B,2BAA2B,EAAE,IAAI;QACjC,8BAA8B,EAAE,IAAI;KACrC;IACD,kBAAkB,EAAE;QAClB,IAAI,EAAE,oBAAoB;QAC1B,gBAAgB,EAAE,IAAI;QACtB,mBAAmB,EAAE,KAAK;QAC1B,qBAAqB,EAAE,KAAK;QAC5B,qBAAqB,EAAE,KAAK;QAC5B,wBAAwB,EAAE,IAAI;QAC9B,wBAAwB,EAAE,IAAI;QAC9B,qBAAqB,EAAE,IAAI;QAC3B,2BAA2B,EAAE,IAAI;QACjC,8BAA8B,EAAE,KAAK;KACtC;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,gBAAgB,EAAE,IAAI;QACtB,mBAAmB,EAAE,KAAK;QAC1B,qBAAqB,EAAE,KAAK;QAC5B,qBAAqB,EAAE,KAAK;QAC5B,wBAAwB,EAAE,IAAI;QAC9B,wBAAwB,EAAE,IAAI;QAC9B,qBAAqB,EAAE,IAAI;QAC3B,2BAA2B,EAAE,IAAI;QACjC,8BAA8B,EAAE,KAAK;KACtC;IACD,aAAa,EAAE;QACb,IAAI,EAAE,eAAe;QACrB,gBAAgB,EAAE,IAAI;QACtB,mBAAmB,EAAE,KAAK;QAC1B,qBAAqB,EAAE,KAAK;QAC5B,qBAAqB,EAAE,KAAK;QAC5B,wBAAwB,EAAE,IAAI;QAC9B,wBAAwB,EAAE,IAAI;QAC9B,qBAAqB,EAAE,IAAI;QAC3B,2BAA2B,EAAE,IAAI;QACjC,8BAA8B,EAAE,KAAK;KACtC;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,gBAAgB,EAAE,KAAK;QACvB,mBAAmB,EAAE,KAAK;QAC1B,qBAAqB,EAAE,KAAK;QAC5B,qBAAqB,EAAE,KAAK;QAC5B,wBAAwB,EAAE,IAAI;QAC9B,wBAAwB,EAAE,KAAK;QAC/B,qBAAqB,EAAE,IAAI;QAC3B,2BAA2B,EAAE,KAAK;QAClC,8BAA8B,EAAE,KAAK;KACtC;IACD,aAAa,EAAE;QACb,IAAI,EAAE,eAAe;QACrB,gBAAgB,EAAE,KAAK;QACvB,mBAAmB,EAAE,KAAK;QAC1B,qBAAqB,EAAE,KAAK;QAC5B,qBAAqB,EAAE,KAAK;QAC5B,wBAAwB,EAAE,KAAK;QAC/B,wBAAwB,EAAE,KAAK;QAC/B,qBAAqB,EAAE,IAAI;QAC3B,2BAA2B,EAAE,KAAK;QAClC,8BAA8B,EAAE,KAAK;KACtC;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,cAAc;QACpB,gBAAgB,EAAE,KAAK;QACvB,mBAAmB,EAAE,KAAK;QAC1B,qBAAqB,EAAE,KAAK;QAC5B,qBAAqB,EAAE,KAAK;QAC5B,wBAAwB,EAAE,KAAK;QAC/B,wBAAwB,EAAE,KAAK;QAC/B,qBAAqB,EAAE,IAAI;QAC3B,2BAA2B,EAAE,KAAK;QAClC,8BAA8B,EAAE,KAAK;KACtC;CACF,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,IAAmB;IACrD,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC"}