@marktoflow/integrations 2.0.0-alpha.12

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 (181) hide show
  1. package/README.md +1341 -0
  2. package/dist/adapters/claude-agent-hooks.d.ts.map +1 -0
  3. package/dist/adapters/claude-agent-hooks.js +339 -0
  4. package/dist/adapters/claude-agent-hooks.js.map +1 -0
  5. package/dist/adapters/claude-agent-types.d.ts +426 -0
  6. package/dist/adapters/claude-agent-types.d.ts.map +1 -0
  7. package/dist/adapters/claude-agent-types.js +62 -0
  8. package/dist/adapters/claude-agent-types.js.map +1 -0
  9. package/dist/adapters/claude-agent-workflow.d.ts +393 -0
  10. package/dist/adapters/claude-agent-workflow.d.ts.map +1 -0
  11. package/dist/adapters/claude-agent-workflow.js +445 -0
  12. package/dist/adapters/claude-agent-workflow.js.map +1 -0
  13. package/dist/adapters/claude-agent.d.ts +189 -0
  14. package/dist/adapters/claude-agent.d.ts.map +1 -0
  15. package/dist/adapters/claude-agent.js +504 -0
  16. package/dist/adapters/claude-agent.js.map +1 -0
  17. package/dist/adapters/claude-code.d.ts +34 -0
  18. package/dist/adapters/claude-code.d.ts.map +1 -0
  19. package/dist/adapters/claude-code.js +89 -0
  20. package/dist/adapters/claude-code.js.map +1 -0
  21. package/dist/adapters/codex-types.d.ts +463 -0
  22. package/dist/adapters/codex-types.d.ts.map +1 -0
  23. package/dist/adapters/codex-types.js +53 -0
  24. package/dist/adapters/codex-types.js.map +1 -0
  25. package/dist/adapters/codex-workflow.d.ts +414 -0
  26. package/dist/adapters/codex-workflow.d.ts.map +1 -0
  27. package/dist/adapters/codex-workflow.js +470 -0
  28. package/dist/adapters/codex-workflow.js.map +1 -0
  29. package/dist/adapters/codex.d.ts +154 -0
  30. package/dist/adapters/codex.d.ts.map +1 -0
  31. package/dist/adapters/codex.js +416 -0
  32. package/dist/adapters/codex.js.map +1 -0
  33. package/dist/adapters/github-copilot-types.d.ts +1012 -0
  34. package/dist/adapters/github-copilot-types.d.ts.map +1 -0
  35. package/dist/adapters/github-copilot-types.js +80 -0
  36. package/dist/adapters/github-copilot-types.js.map +1 -0
  37. package/dist/adapters/github-copilot-workflow.d.ts +462 -0
  38. package/dist/adapters/github-copilot-workflow.d.ts.map +1 -0
  39. package/dist/adapters/github-copilot-workflow.js +473 -0
  40. package/dist/adapters/github-copilot-workflow.js.map +1 -0
  41. package/dist/adapters/github-copilot.d.ts +280 -0
  42. package/dist/adapters/github-copilot.d.ts.map +1 -0
  43. package/dist/adapters/github-copilot.js +468 -0
  44. package/dist/adapters/github-copilot.js.map +1 -0
  45. package/dist/adapters/ollama.d.ts.map +1 -0
  46. package/dist/adapters/ollama.js +9 -0
  47. package/dist/adapters/ollama.js.map +1 -0
  48. package/dist/adapters/opencode.d.ts +41 -0
  49. package/dist/adapters/opencode.d.ts.map +1 -0
  50. package/dist/adapters/opencode.js +148 -0
  51. package/dist/adapters/opencode.js.map +1 -0
  52. package/dist/index.d.ts +52 -0
  53. package/dist/index.d.ts.map +1 -0
  54. package/dist/index.js +161 -0
  55. package/dist/index.js.map +1 -0
  56. package/dist/services/ai-browser.d.ts +112 -0
  57. package/dist/services/ai-browser.d.ts.map +1 -0
  58. package/dist/services/ai-browser.js +363 -0
  59. package/dist/services/ai-browser.js.map +1 -0
  60. package/dist/services/airtable.d.ts.map +1 -0
  61. package/dist/services/airtable.js +295 -0
  62. package/dist/services/airtable.js.map +1 -0
  63. package/dist/services/asana.d.ts +159 -0
  64. package/dist/services/asana.d.ts.map +1 -0
  65. package/dist/services/asana.js +196 -0
  66. package/dist/services/asana.js.map +1 -0
  67. package/dist/services/aws-s3.d.ts +89 -0
  68. package/dist/services/aws-s3.d.ts.map +1 -0
  69. package/dist/services/aws-s3.js +154 -0
  70. package/dist/services/aws-s3.js.map +1 -0
  71. package/dist/services/confluence.d.ts.map +1 -0
  72. package/dist/services/confluence.js +356 -0
  73. package/dist/services/confluence.js.map +1 -0
  74. package/dist/services/discord.d.ts.map +1 -0
  75. package/dist/services/discord.js +279 -0
  76. package/dist/services/discord.js.map +1 -0
  77. package/dist/services/dropbox.d.ts +134 -0
  78. package/dist/services/dropbox.d.ts.map +1 -0
  79. package/dist/services/dropbox.js +190 -0
  80. package/dist/services/dropbox.js.map +1 -0
  81. package/dist/services/github.d.ts.map +1 -0
  82. package/dist/services/github.js +13 -0
  83. package/dist/services/github.js.map +1 -0
  84. package/dist/services/gmail-trigger.d.ts.map +1 -0
  85. package/dist/services/gmail-trigger.js +172 -0
  86. package/dist/services/gmail-trigger.js.map +1 -0
  87. package/dist/services/gmail.d.ts.map +1 -0
  88. package/dist/services/gmail.js +372 -0
  89. package/dist/services/gmail.js.map +1 -0
  90. package/dist/services/google-calendar.d.ts.map +1 -0
  91. package/dist/services/google-calendar.js +357 -0
  92. package/dist/services/google-calendar.js.map +1 -0
  93. package/dist/services/google-docs.d.ts.map +1 -0
  94. package/dist/services/google-docs.js +332 -0
  95. package/dist/services/google-docs.js.map +1 -0
  96. package/dist/services/google-drive.d.ts.map +1 -0
  97. package/dist/services/google-drive.js +327 -0
  98. package/dist/services/google-drive.js.map +1 -0
  99. package/dist/services/google-sheets.d.ts.map +1 -0
  100. package/dist/services/google-sheets.js +391 -0
  101. package/dist/services/google-sheets.js.map +1 -0
  102. package/dist/services/http.d.ts.map +1 -0
  103. package/dist/services/http.js +284 -0
  104. package/dist/services/http.js.map +1 -0
  105. package/dist/services/jira.d.ts.map +1 -0
  106. package/dist/services/jira.js +35 -0
  107. package/dist/services/jira.js.map +1 -0
  108. package/dist/services/linear.d.ts.map +1 -0
  109. package/dist/services/linear.js +326 -0
  110. package/dist/services/linear.js.map +1 -0
  111. package/dist/services/mailchimp.d.ts +169 -0
  112. package/dist/services/mailchimp.d.ts.map +1 -0
  113. package/dist/services/mailchimp.js +180 -0
  114. package/dist/services/mailchimp.js.map +1 -0
  115. package/dist/services/mysql.d.ts.map +1 -0
  116. package/dist/services/mysql.js +250 -0
  117. package/dist/services/mysql.js.map +1 -0
  118. package/dist/services/notion.d.ts.map +1 -0
  119. package/dist/services/notion.js +358 -0
  120. package/dist/services/notion.js.map +1 -0
  121. package/dist/services/outlook-trigger.d.ts.map +1 -0
  122. package/dist/services/outlook-trigger.js +204 -0
  123. package/dist/services/outlook-trigger.js.map +1 -0
  124. package/dist/services/outlook.d.ts.map +1 -0
  125. package/dist/services/outlook.js +486 -0
  126. package/dist/services/outlook.js.map +1 -0
  127. package/dist/services/playwright.d.ts +678 -0
  128. package/dist/services/playwright.d.ts.map +1 -0
  129. package/dist/services/playwright.js +1141 -0
  130. package/dist/services/playwright.js.map +1 -0
  131. package/dist/services/postgres.d.ts.map +1 -0
  132. package/dist/services/postgres.js +230 -0
  133. package/dist/services/postgres.js.map +1 -0
  134. package/dist/services/sendgrid.d.ts +43 -0
  135. package/dist/services/sendgrid.d.ts.map +1 -0
  136. package/dist/services/sendgrid.js +87 -0
  137. package/dist/services/sendgrid.js.map +1 -0
  138. package/dist/services/shopify.d.ts +160 -0
  139. package/dist/services/shopify.d.ts.map +1 -0
  140. package/dist/services/shopify.js +166 -0
  141. package/dist/services/shopify.js.map +1 -0
  142. package/dist/services/slack-socket.d.ts.map +1 -0
  143. package/dist/services/slack-socket.js +48 -0
  144. package/dist/services/slack-socket.js.map +1 -0
  145. package/dist/services/slack.d.ts.map +1 -0
  146. package/dist/services/slack.js +11 -0
  147. package/dist/services/slack.js.map +1 -0
  148. package/dist/services/stripe.d.ts +275 -0
  149. package/dist/services/stripe.d.ts.map +1 -0
  150. package/dist/services/stripe.js +229 -0
  151. package/dist/services/stripe.js.map +1 -0
  152. package/dist/services/supabase.d.ts.map +1 -0
  153. package/dist/services/supabase.js +328 -0
  154. package/dist/services/supabase.js.map +1 -0
  155. package/dist/services/teams.d.ts +224 -0
  156. package/dist/services/teams.d.ts.map +1 -0
  157. package/dist/services/teams.js +229 -0
  158. package/dist/services/teams.js.map +1 -0
  159. package/dist/services/telegram.d.ts.map +1 -0
  160. package/dist/services/telegram.js +247 -0
  161. package/dist/services/telegram.js.map +1 -0
  162. package/dist/services/trello.d.ts +160 -0
  163. package/dist/services/trello.d.ts.map +1 -0
  164. package/dist/services/trello.js +194 -0
  165. package/dist/services/trello.js.map +1 -0
  166. package/dist/services/twilio.d.ts +126 -0
  167. package/dist/services/twilio.d.ts.map +1 -0
  168. package/dist/services/twilio.js +153 -0
  169. package/dist/services/twilio.js.map +1 -0
  170. package/dist/services/whatsapp.d.ts.map +1 -0
  171. package/dist/services/whatsapp.js +253 -0
  172. package/dist/services/whatsapp.js.map +1 -0
  173. package/dist/services/zendesk.d.ts +134 -0
  174. package/dist/services/zendesk.d.ts.map +1 -0
  175. package/dist/services/zendesk.js +148 -0
  176. package/dist/services/zendesk.js.map +1 -0
  177. package/dist/tools/script.d.ts +21 -0
  178. package/dist/tools/script.d.ts.map +1 -0
  179. package/dist/tools/script.js +136 -0
  180. package/dist/tools/script.js.map +1 -0
  181. package/package.json +98 -0
@@ -0,0 +1,284 @@
1
+ /**
2
+ * HTTP Integration
3
+ *
4
+ * Generic REST API client for calling any HTTP endpoint.
5
+ * Essential for APIs without dedicated integrations.
6
+ */
7
+ function buildUrl(base, path, query) {
8
+ // Handle absolute URLs
9
+ let url;
10
+ if (path.startsWith('http://') || path.startsWith('https://')) {
11
+ url = new URL(path);
12
+ }
13
+ else {
14
+ const baseWithSlash = base.endsWith('/') ? base : `${base}/`;
15
+ const pathWithoutSlash = path.startsWith('/') ? path.slice(1) : path;
16
+ url = new URL(pathWithoutSlash, baseWithSlash);
17
+ }
18
+ if (query) {
19
+ for (const [key, value] of Object.entries(query)) {
20
+ url.searchParams.set(key, String(value));
21
+ }
22
+ }
23
+ return url.toString();
24
+ }
25
+ /**
26
+ * Generic HTTP client for workflow integration
27
+ */
28
+ export class HttpClient {
29
+ baseUrl;
30
+ defaultHeaders;
31
+ defaultTimeout;
32
+ constructor(config = {}) {
33
+ this.baseUrl = config.baseUrl ?? '';
34
+ this.defaultTimeout = config.timeout ?? 30000;
35
+ this.defaultHeaders = {
36
+ 'Content-Type': 'application/json',
37
+ Accept: 'application/json',
38
+ ...(config.headers ?? {}),
39
+ };
40
+ // Set up authentication
41
+ if (config.auth) {
42
+ switch (config.auth.type) {
43
+ case 'bearer':
44
+ if (config.auth.token) {
45
+ this.defaultHeaders.Authorization = `Bearer ${config.auth.token}`;
46
+ }
47
+ break;
48
+ case 'basic':
49
+ if (config.auth.username && config.auth.password) {
50
+ const credentials = Buffer.from(`${config.auth.username}:${config.auth.password}`).toString('base64');
51
+ this.defaultHeaders.Authorization = `Basic ${credentials}`;
52
+ }
53
+ break;
54
+ case 'api-key':
55
+ if (config.auth.apiKey) {
56
+ const header = config.auth.apiKeyHeader ?? 'X-API-Key';
57
+ this.defaultHeaders[header] = config.auth.apiKey;
58
+ }
59
+ break;
60
+ }
61
+ }
62
+ }
63
+ /**
64
+ * Make an HTTP request
65
+ */
66
+ async request(path, options = {}) {
67
+ const { method = 'GET', headers = {}, query, body, timeout = this.defaultTimeout, validateStatus = (status) => status >= 200 && status < 300, } = options;
68
+ const url = buildUrl(this.baseUrl, path, query);
69
+ const controller = new AbortController();
70
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
71
+ try {
72
+ const requestHeaders = { ...this.defaultHeaders, ...headers };
73
+ // Handle body serialization
74
+ let requestBody;
75
+ if (body !== undefined) {
76
+ if (typeof body === 'string') {
77
+ requestBody = body;
78
+ }
79
+ else {
80
+ requestBody = JSON.stringify(body);
81
+ }
82
+ }
83
+ const response = await fetch(url, {
84
+ method,
85
+ headers: requestHeaders,
86
+ body: requestBody,
87
+ signal: controller.signal,
88
+ redirect: options.followRedirects === false ? 'manual' : 'follow',
89
+ });
90
+ clearTimeout(timeoutId);
91
+ // Parse response headers
92
+ const responseHeaders = {};
93
+ response.headers.forEach((value, key) => {
94
+ responseHeaders[key] = value;
95
+ });
96
+ // Parse response body
97
+ let data;
98
+ const contentType = response.headers.get('content-type') ?? '';
99
+ if (contentType.includes('application/json')) {
100
+ data = (await response.json());
101
+ }
102
+ else if (contentType.includes('text/')) {
103
+ data = (await response.text());
104
+ }
105
+ else {
106
+ // Return raw buffer for binary data
107
+ const buffer = await response.arrayBuffer();
108
+ data = Buffer.from(buffer);
109
+ }
110
+ const result = {
111
+ status: response.status,
112
+ statusText: response.statusText,
113
+ headers: responseHeaders,
114
+ data,
115
+ ok: validateStatus(response.status),
116
+ url: response.url,
117
+ };
118
+ if (!result.ok) {
119
+ throw new HttpError(result);
120
+ }
121
+ return result;
122
+ }
123
+ catch (error) {
124
+ clearTimeout(timeoutId);
125
+ if (error instanceof HttpError)
126
+ throw error;
127
+ if (error.name === 'AbortError') {
128
+ throw new Error(`Request timeout after ${timeout}ms: ${url}`);
129
+ }
130
+ throw error;
131
+ }
132
+ }
133
+ /**
134
+ * GET request
135
+ */
136
+ async get(path, options) {
137
+ return this.request(path, { ...options, method: 'GET' });
138
+ }
139
+ /**
140
+ * POST request
141
+ */
142
+ async post(path, body, options) {
143
+ return this.request(path, { ...options, method: 'POST', body });
144
+ }
145
+ /**
146
+ * PUT request
147
+ */
148
+ async put(path, body, options) {
149
+ return this.request(path, { ...options, method: 'PUT', body });
150
+ }
151
+ /**
152
+ * PATCH request
153
+ */
154
+ async patch(path, body, options) {
155
+ return this.request(path, { ...options, method: 'PATCH', body });
156
+ }
157
+ /**
158
+ * DELETE request
159
+ */
160
+ async delete(path, options) {
161
+ return this.request(path, { ...options, method: 'DELETE' });
162
+ }
163
+ /**
164
+ * HEAD request
165
+ */
166
+ async head(path, options) {
167
+ return this.request(path, { ...options, method: 'HEAD' });
168
+ }
169
+ /**
170
+ * Set a default header
171
+ */
172
+ setHeader(name, value) {
173
+ this.defaultHeaders[name] = value;
174
+ }
175
+ /**
176
+ * Remove a default header
177
+ */
178
+ removeHeader(name) {
179
+ delete this.defaultHeaders[name];
180
+ }
181
+ /**
182
+ * Set bearer token
183
+ */
184
+ setBearerToken(token) {
185
+ this.defaultHeaders.Authorization = `Bearer ${token}`;
186
+ }
187
+ /**
188
+ * Set base URL
189
+ */
190
+ setBaseUrl(url) {
191
+ this.baseUrl = url;
192
+ }
193
+ }
194
+ /**
195
+ * HTTP error with response details
196
+ */
197
+ export class HttpError extends Error {
198
+ status;
199
+ statusText;
200
+ headers;
201
+ data;
202
+ url;
203
+ constructor(response) {
204
+ super(`HTTP ${response.status}: ${response.statusText}`);
205
+ this.name = 'HttpError';
206
+ this.status = response.status;
207
+ this.statusText = response.statusText;
208
+ this.headers = response.headers;
209
+ this.data = response.data;
210
+ this.url = response.url;
211
+ }
212
+ }
213
+ /**
214
+ * Convenience function to make a one-off request
215
+ */
216
+ export async function httpRequest(url, options) {
217
+ const client = new HttpClient();
218
+ return client.request(url, options);
219
+ }
220
+ /**
221
+ * GraphQL client helper
222
+ */
223
+ export class GraphQLClient {
224
+ http;
225
+ constructor(endpoint, config = {}) {
226
+ this.http = new HttpClient({ ...config, baseUrl: endpoint });
227
+ }
228
+ /**
229
+ * Execute a GraphQL query or mutation
230
+ */
231
+ async query(query, variables, operationName) {
232
+ const response = await this.http.post('', {
233
+ query,
234
+ variables,
235
+ operationName,
236
+ });
237
+ if (response.data.errors?.length) {
238
+ throw new Error(`GraphQL error: ${response.data.errors.map((e) => e.message).join(', ')}`);
239
+ }
240
+ return response.data.data;
241
+ }
242
+ }
243
+ export const HttpInitializer = {
244
+ async initialize(_module, config) {
245
+ const baseUrl = config.options?.['base_url'];
246
+ const timeout = config.options?.['timeout'];
247
+ const headers = config.options?.['headers'];
248
+ // Extract auth configuration
249
+ let auth;
250
+ if (config.auth) {
251
+ const authType = config.auth['type'];
252
+ if (authType === 'bearer' || !authType) {
253
+ const token = config.auth['token'];
254
+ if (token)
255
+ auth = { type: 'bearer', token };
256
+ }
257
+ else if (authType === 'basic') {
258
+ auth = {
259
+ type: 'basic',
260
+ username: config.auth['username'],
261
+ password: config.auth['password'],
262
+ };
263
+ }
264
+ else if (authType === 'api-key') {
265
+ auth = {
266
+ type: 'api-key',
267
+ apiKey: config.auth['api_key'],
268
+ apiKeyHeader: config.auth['api_key_header'],
269
+ };
270
+ }
271
+ }
272
+ const client = new HttpClient({ baseUrl, timeout, headers, auth });
273
+ return {
274
+ client,
275
+ actions: client,
276
+ graphql: (endpoint) => new GraphQLClient(endpoint, {
277
+ timeout,
278
+ headers,
279
+ auth,
280
+ }),
281
+ };
282
+ },
283
+ };
284
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/services/http.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAqCH,SAAS,QAAQ,CAAC,IAAY,EAAE,IAAY,EAAE,KAAiD;IAC7F,uBAAuB;IACvB,IAAI,GAAQ,CAAC;IACb,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9D,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;SAAM,CAAC;QACN,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC;QAC7D,MAAM,gBAAgB,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACrE,GAAG,GAAG,IAAI,GAAG,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACjD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,UAAU;IACb,OAAO,CAAS;IAChB,cAAc,CAAyB;IACvC,cAAc,CAAS;IAE/B,YAAY,SAA2B,EAAE;QACvC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;QACpC,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,OAAO,IAAI,KAAK,CAAC;QAC9C,IAAI,CAAC,cAAc,GAAG;YACpB,cAAc,EAAE,kBAAkB;YAClC,MAAM,EAAE,kBAAkB;YAC1B,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;SAC1B,CAAC;QAEF,wBAAwB;QACxB,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,QAAQ,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACzB,KAAK,QAAQ;oBACX,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;wBACtB,IAAI,CAAC,cAAc,CAAC,aAAa,GAAG,UAAU,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;oBACpE,CAAC;oBACD,MAAM;gBACR,KAAK,OAAO;oBACV,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACjD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;wBACtG,IAAI,CAAC,cAAc,CAAC,aAAa,GAAG,SAAS,WAAW,EAAE,CAAC;oBAC7D,CAAC;oBACD,MAAM;gBACR,KAAK,SAAS;oBACZ,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;wBACvB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,IAAI,WAAW,CAAC;wBACvD,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;oBACnD,CAAC;oBACD,MAAM;YACV,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAc,IAAY,EAAE,UAA8B,EAAE;QACvE,MAAM,EACJ,MAAM,GAAG,KAAK,EACd,OAAO,GAAG,EAAE,EACZ,KAAK,EACL,IAAI,EACJ,OAAO,GAAG,IAAI,CAAC,cAAc,EAC7B,cAAc,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG,GAC3D,GAAG,OAAO,CAAC;QAEZ,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAChD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;QAEhE,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,GAAG,OAAO,EAAE,CAAC;YAE9D,4BAA4B;YAC5B,IAAI,WAA+B,CAAC;YACpC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC7B,WAAW,GAAG,IAAI,CAAC;gBACrB,CAAC;qBAAM,CAAC;oBACN,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAChC,MAAM;gBACN,OAAO,EAAE,cAAc;gBACvB,IAAI,EAAE,WAAW;gBACjB,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,QAAQ,EAAE,OAAO,CAAC,eAAe,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;aAClE,CAAC,CAAC;YAEH,YAAY,CAAC,SAAS,CAAC,CAAC;YAExB,yBAAyB;YACzB,MAAM,eAAe,GAA2B,EAAE,CAAC;YACnD,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;gBACtC,eAAe,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YAC/B,CAAC,CAAC,CAAC;YAEH,sBAAsB;YACtB,IAAI,IAAO,CAAC;YACZ,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;YAC/D,IAAI,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBAC7C,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAM,CAAC;YACtC,CAAC;iBAAM,IAAI,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzC,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAM,CAAC;YACtC,CAAC;iBAAM,CAAC;gBACN,oCAAoC;gBACpC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;gBAC5C,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAM,CAAC;YAClC,CAAC;YAED,MAAM,MAAM,GAAoB;gBAC9B,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,OAAO,EAAE,eAAe;gBACxB,IAAI;gBACJ,EAAE,EAAE,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACnC,GAAG,EAAE,QAAQ,CAAC,GAAG;aAClB,CAAC;YAEF,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gBACf,MAAM,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;YAC9B,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,YAAY,CAAC,SAAS,CAAC,CAAC;YACxB,IAAI,KAAK,YAAY,SAAS;gBAAE,MAAM,KAAK,CAAC;YAC5C,IAAK,KAAe,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC3C,MAAM,IAAI,KAAK,CAAC,yBAAyB,OAAO,OAAO,GAAG,EAAE,CAAC,CAAC;YAChE,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAc,IAAY,EAAE,OAAqD;QACxF,OAAO,IAAI,CAAC,OAAO,CAAI,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAc,IAAY,EAAE,IAAc,EAAE,OAAqD;QACzG,OAAO,IAAI,CAAC,OAAO,CAAI,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACrE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAc,IAAY,EAAE,IAAc,EAAE,OAAqD;QACxG,OAAO,IAAI,CAAC,OAAO,CAAI,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAc,IAAY,EAAE,IAAc,EAAE,OAAqD;QAC1G,OAAO,IAAI,CAAC,OAAO,CAAI,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACtE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAc,IAAY,EAAE,OAA4C;QAClF,OAAO,IAAI,CAAC,OAAO,CAAI,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IACjE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,IAAY,EAAE,OAAqD;QAC5E,OAAO,IAAI,CAAC,OAAO,CAAY,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACvE,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,IAAY,EAAE,KAAa;QACnC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,IAAY;QACvB,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,KAAa;QAC1B,IAAI,CAAC,cAAc,CAAC,aAAa,GAAG,UAAU,KAAK,EAAE,CAAC;IACxD,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,GAAW;QACpB,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;IACrB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,SAAU,SAAQ,KAAK;IACzB,MAAM,CAAS;IACf,UAAU,CAAS;IACnB,OAAO,CAAyB;IAChC,IAAI,CAAU;IACd,GAAG,CAAS;IAErB,YAAY,QAAsB;QAChC,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;QACxB,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QAC9B,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC;QACtC,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;QAChC,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC1B,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;IAC1B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,GAAW,EACX,OAAmE;IAEnE,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;IAChC,OAAO,MAAM,CAAC,OAAO,CAAI,GAAG,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,aAAa;IAChB,IAAI,CAAa;IAEzB,YAAY,QAAgB,EAAE,SAA4C,EAAE;QAC1E,IAAI,CAAC,IAAI,GAAG,IAAI,UAAU,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CACT,KAAa,EACb,SAAmC,EACnC,aAAsB;QAEtB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAA+C,EAAE,EAAE;YACtF,KAAK;YACL,SAAS;YACT,aAAa;SACd,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,kBAAkB,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7F,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAS,CAAC;IACjC,CAAC;CACF;AAED,MAAM,CAAC,MAAM,eAAe,GAAmB;IAC7C,KAAK,CAAC,UAAU,CAAC,OAAgB,EAAE,MAAkB;QACnD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,UAAU,CAAuB,CAAC;QACnE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,SAAS,CAAuB,CAAC;QAClE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,SAAS,CAAuC,CAAC;QAElF,6BAA6B;QAC7B,IAAI,IAA8B,CAAC;QACnC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAuB,CAAC;YAC3D,IAAI,QAAQ,KAAK,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACvC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAuB,CAAC;gBACzD,IAAI,KAAK;oBAAE,IAAI,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;YAC9C,CAAC;iBAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;gBAChC,IAAI,GAAG;oBACL,IAAI,EAAE,OAAO;oBACb,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAW;oBAC3C,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAW;iBAC5C,CAAC;YACJ,CAAC;iBAAM,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAClC,IAAI,GAAG;oBACL,IAAI,EAAE,SAAS;oBACf,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAW;oBACxC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAuB;iBAClE,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACnE,OAAO;YACL,MAAM;YACN,OAAO,EAAE,MAAM;YACf,OAAO,EAAE,CAAC,QAAgB,EAAE,EAAE,CAC5B,IAAI,aAAa,CAAC,QAAQ,EAAE;gBAC1B,OAAO;gBACP,OAAO;gBACP,IAAI;aACL,CAAC;SACL,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jira.d.ts","sourceRoot":"","sources":["../../src/services/jira.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAE9D,eAAO,MAAM,eAAe,EAAE,cAoC7B,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { Version2Client, Version3Client } from 'jira.js';
2
+ export const JiraInitializer = {
3
+ async initialize(_module, config) {
4
+ const host = config.auth?.['host'];
5
+ const email = config.auth?.['email'];
6
+ const apiToken = config.auth?.['api_token'];
7
+ const apiVersion = config.auth?.['api_version'] || 'auto';
8
+ if (!host || !email || !apiToken) {
9
+ throw new Error('Jira SDK requires auth.host, auth.email, and auth.api_token');
10
+ }
11
+ // Determine which API version to use
12
+ // - 'auto': detect based on host (Cloud uses v3, self-hosted uses v2)
13
+ // - '2' or 'v2': force Version2Client
14
+ // - '3' or 'v3': force Version3Client
15
+ let useVersion3 = true;
16
+ if (apiVersion === 'auto') {
17
+ // Jira Cloud uses .atlassian.net domain
18
+ useVersion3 = host.includes('.atlassian.net');
19
+ }
20
+ else {
21
+ useVersion3 = apiVersion === '3' || apiVersion === 'v3';
22
+ }
23
+ const authConfig = {
24
+ host,
25
+ authentication: {
26
+ basic: {
27
+ email,
28
+ apiToken,
29
+ },
30
+ },
31
+ };
32
+ return useVersion3 ? new Version3Client(authConfig) : new Version2Client(authConfig);
33
+ },
34
+ };
35
+ //# sourceMappingURL=jira.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jira.js","sourceRoot":"","sources":["../../src/services/jira.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGzD,MAAM,CAAC,MAAM,eAAe,GAAmB;IAC7C,KAAK,CAAC,UAAU,CAAC,OAAgB,EAAE,MAAkB;QACnD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,CAAW,CAAC;QAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,OAAO,CAAW,CAAC;QAC/C,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,CAAW,CAAC;QACtD,MAAM,UAAU,GAAI,MAAM,CAAC,IAAI,EAAE,CAAC,aAAa,CAAY,IAAI,MAAM,CAAC;QAEtE,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;QACjF,CAAC;QAED,qCAAqC;QACrC,sEAAsE;QACtE,sCAAsC;QACtC,sCAAsC;QACtC,IAAI,WAAW,GAAG,IAAI,CAAC;QAEvB,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;YAC1B,wCAAwC;YACxC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,WAAW,GAAG,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,IAAI,CAAC;QAC1D,CAAC;QAED,MAAM,UAAU,GAAG;YACjB,IAAI;YACJ,cAAc,EAAE;gBACd,KAAK,EAAE;oBACL,KAAK;oBACL,QAAQ;iBACT;aACF;SACF,CAAC;QAEF,OAAO,WAAW,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC,UAAU,CAAC,CAAC;IACvF,CAAC;CACF,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linear.d.ts","sourceRoot":"","sources":["../../src/services/linear.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,326 @@
1
+ /**
2
+ * Linear Integration
3
+ *
4
+ * Modern issue tracking for development teams.
5
+ * API Docs: https://developers.linear.app/docs/graphql/working-with-the-graphql-api
6
+ */
7
+ const LINEAR_API_URL = 'https://api.linear.app/graphql';
8
+ /**
9
+ * Linear GraphQL client for workflow integration
10
+ */
11
+ export class LinearClient {
12
+ apiKey;
13
+ constructor(apiKey) {
14
+ this.apiKey = apiKey;
15
+ }
16
+ async query(query, variables) {
17
+ const response = await fetch(LINEAR_API_URL, {
18
+ method: 'POST',
19
+ headers: {
20
+ 'Content-Type': 'application/json',
21
+ Authorization: this.apiKey,
22
+ },
23
+ body: JSON.stringify({ query, variables }),
24
+ });
25
+ if (!response.ok) {
26
+ throw new Error(`Linear API error: ${response.status} ${response.statusText}`);
27
+ }
28
+ const result = (await response.json());
29
+ if (result.errors?.length) {
30
+ throw new Error(`Linear GraphQL error: ${result.errors.map((e) => e.message).join(', ')}`);
31
+ }
32
+ return result.data;
33
+ }
34
+ /**
35
+ * Get the current user
36
+ */
37
+ async getViewer() {
38
+ const data = await this.query(`
39
+ query {
40
+ viewer {
41
+ id
42
+ name
43
+ email
44
+ }
45
+ }
46
+ `);
47
+ return data.viewer;
48
+ }
49
+ /**
50
+ * List teams
51
+ */
52
+ async listTeams() {
53
+ const data = await this.query(`
54
+ query {
55
+ teams {
56
+ nodes {
57
+ id
58
+ name
59
+ key
60
+ description
61
+ issueCount
62
+ }
63
+ }
64
+ }
65
+ `);
66
+ return data.teams.nodes;
67
+ }
68
+ /**
69
+ * Get an issue by ID or identifier
70
+ */
71
+ async getIssue(idOrIdentifier) {
72
+ const isIdentifier = idOrIdentifier.includes('-');
73
+ const queryField = isIdentifier ? 'issueVcsBranchSearch' : 'issue';
74
+ const queryArg = isIdentifier ? 'branchName' : 'id';
75
+ const data = await this.query(`
76
+ query GetIssue($id: String!) {
77
+ ${queryField}(${queryArg}: $id) {
78
+ id
79
+ identifier
80
+ title
81
+ description
82
+ priority
83
+ priorityLabel
84
+ state { id name type }
85
+ assignee { id name email }
86
+ team { id name key }
87
+ project { id name }
88
+ labels { nodes { id name color } }
89
+ createdAt
90
+ updatedAt
91
+ url
92
+ }
93
+ }
94
+ `, { id: idOrIdentifier });
95
+ const issue = data.issue ?? data.issueVcsBranchSearch;
96
+ if (!issue) {
97
+ throw new Error(`Issue not found: ${idOrIdentifier}`);
98
+ }
99
+ // Flatten labels
100
+ return {
101
+ ...issue,
102
+ labels: issue.labels?.nodes ?? [],
103
+ };
104
+ }
105
+ /**
106
+ * Create an issue
107
+ */
108
+ async createIssue(options) {
109
+ const data = await this.query(`
110
+ mutation CreateIssue($input: IssueCreateInput!) {
111
+ issueCreate(input: $input) {
112
+ success
113
+ issue {
114
+ id
115
+ identifier
116
+ title
117
+ description
118
+ priority
119
+ priorityLabel
120
+ state { id name type }
121
+ assignee { id name email }
122
+ team { id name key }
123
+ project { id name }
124
+ labels { nodes { id name color } }
125
+ createdAt
126
+ updatedAt
127
+ url
128
+ }
129
+ }
130
+ }
131
+ `, { input: options });
132
+ if (!data.issueCreate.success) {
133
+ throw new Error('Failed to create issue');
134
+ }
135
+ const issue = data.issueCreate.issue;
136
+ return {
137
+ ...issue,
138
+ labels: issue.labels?.nodes ?? [],
139
+ };
140
+ }
141
+ /**
142
+ * Update an issue
143
+ */
144
+ async updateIssue(issueId, options) {
145
+ const data = await this.query(`
146
+ mutation UpdateIssue($id: String!, $input: IssueUpdateInput!) {
147
+ issueUpdate(id: $id, input: $input) {
148
+ success
149
+ issue {
150
+ id
151
+ identifier
152
+ title
153
+ description
154
+ priority
155
+ priorityLabel
156
+ state { id name type }
157
+ assignee { id name email }
158
+ team { id name key }
159
+ project { id name }
160
+ labels { nodes { id name color } }
161
+ createdAt
162
+ updatedAt
163
+ url
164
+ }
165
+ }
166
+ }
167
+ `, { id: issueId, input: options });
168
+ if (!data.issueUpdate.success) {
169
+ throw new Error('Failed to update issue');
170
+ }
171
+ const issue = data.issueUpdate.issue;
172
+ return {
173
+ ...issue,
174
+ labels: issue.labels?.nodes ?? [],
175
+ };
176
+ }
177
+ /**
178
+ * Search issues
179
+ */
180
+ async searchIssues(options = {}) {
181
+ const { query, teamId, assigneeId, projectId, priority, first = 25, after } = options;
182
+ // Build filter
183
+ const filters = [];
184
+ if (teamId)
185
+ filters.push(`team: { id: { eq: "${teamId}" } }`);
186
+ if (assigneeId)
187
+ filters.push(`assignee: { id: { eq: "${assigneeId}" } }`);
188
+ if (projectId)
189
+ filters.push(`project: { id: { eq: "${projectId}" } }`);
190
+ if (priority !== undefined)
191
+ filters.push(`priority: { eq: ${priority} }`);
192
+ const filterArg = filters.length > 0 ? `filter: { ${filters.join(', ')} }` : '';
193
+ const queryArg = query ? `query: "${query}"` : '';
194
+ const paginationArgs = `first: ${first}${after ? `, after: "${after}"` : ''}`;
195
+ const allArgs = [queryArg, filterArg, paginationArgs].filter(Boolean).join(', ');
196
+ const data = await this.query(`
197
+ query {
198
+ issues(${allArgs}) {
199
+ nodes {
200
+ id
201
+ identifier
202
+ title
203
+ description
204
+ priority
205
+ priorityLabel
206
+ state { id name type }
207
+ assignee { id name email }
208
+ team { id name key }
209
+ project { id name }
210
+ labels { nodes { id name color } }
211
+ createdAt
212
+ updatedAt
213
+ url
214
+ }
215
+ pageInfo {
216
+ hasNextPage
217
+ endCursor
218
+ }
219
+ }
220
+ }
221
+ `);
222
+ return {
223
+ issues: data.issues.nodes.map((issue) => ({
224
+ ...issue,
225
+ labels: issue.labels?.nodes ?? [],
226
+ })),
227
+ hasMore: data.issues.pageInfo.hasNextPage,
228
+ endCursor: data.issues.pageInfo.endCursor,
229
+ };
230
+ }
231
+ /**
232
+ * List projects
233
+ */
234
+ async listProjects(teamId) {
235
+ const filter = teamId ? `filter: { accessibleTeams: { id: { eq: "${teamId}" } } }` : '';
236
+ const data = await this.query(`
237
+ query {
238
+ projects(${filter}) {
239
+ nodes {
240
+ id
241
+ name
242
+ description
243
+ state
244
+ progress
245
+ targetDate
246
+ teams { nodes { id name } }
247
+ }
248
+ }
249
+ }
250
+ `);
251
+ return data.projects.nodes.map((project) => ({
252
+ ...project,
253
+ teams: project.teams?.nodes ?? [],
254
+ }));
255
+ }
256
+ /**
257
+ * Get workflow states for a team
258
+ */
259
+ async getWorkflowStates(teamId) {
260
+ const data = await this.query(`
261
+ query GetStates($teamId: String!) {
262
+ team(id: $teamId) {
263
+ states {
264
+ nodes {
265
+ id
266
+ name
267
+ type
268
+ position
269
+ }
270
+ }
271
+ }
272
+ }
273
+ `, { teamId });
274
+ return data.team.states.nodes;
275
+ }
276
+ /**
277
+ * Add a comment to an issue
278
+ */
279
+ async addComment(issueId, body) {
280
+ const data = await this.query(`
281
+ mutation AddComment($issueId: String!, $body: String!) {
282
+ commentCreate(input: { issueId: $issueId, body: $body }) {
283
+ success
284
+ comment {
285
+ id
286
+ body
287
+ createdAt
288
+ }
289
+ }
290
+ }
291
+ `, { issueId, body });
292
+ if (!data.commentCreate.success) {
293
+ throw new Error('Failed to add comment');
294
+ }
295
+ return data.commentCreate.comment;
296
+ }
297
+ /**
298
+ * Archive an issue
299
+ */
300
+ async archiveIssue(issueId) {
301
+ const data = await this.query(`
302
+ mutation ArchiveIssue($id: String!) {
303
+ issueArchive(id: $id) {
304
+ success
305
+ }
306
+ }
307
+ `, { id: issueId });
308
+ if (!data.issueArchive.success) {
309
+ throw new Error('Failed to archive issue');
310
+ }
311
+ }
312
+ }
313
+ export const LinearInitializer = {
314
+ async initialize(_module, config) {
315
+ const apiKey = config.auth?.['api_key'];
316
+ if (!apiKey) {
317
+ throw new Error('Linear SDK requires auth.api_key');
318
+ }
319
+ const client = new LinearClient(apiKey);
320
+ return {
321
+ client,
322
+ actions: client,
323
+ };
324
+ },
325
+ };
326
+ //# sourceMappingURL=linear.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linear.js","sourceRoot":"","sources":["../../src/services/linear.ts"],"names":[],"mappings":"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"}