@bubblelab/bubble-core 0.1.28 → 0.1.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bubble-bundle.d.ts +161 -92
- package/dist/bubble-factory.d.ts.map +1 -1
- package/dist/bubble-factory.js +4 -0
- package/dist/bubble-factory.js.map +1 -1
- package/dist/bubbles/service-bubble/agi-inc.d.ts +4 -4
- package/dist/bubbles/service-bubble/airtable.d.ts +94 -94
- package/dist/bubbles/service-bubble/apify/actors/google-maps-scraper.d.ts +2 -2
- package/dist/bubbles/service-bubble/apify/actors/instagram-hashtag-scraper.d.ts +20 -20
- package/dist/bubbles/service-bubble/apify/actors/instagram-scraper.d.ts +30 -30
- package/dist/bubbles/service-bubble/apify/actors/linkedin-posts-search.d.ts +26 -26
- package/dist/bubbles/service-bubble/apify/actors/linkedin-profile-posts.d.ts +56 -56
- package/dist/bubbles/service-bubble/apify/actors/tiktok-scraper.d.ts +16 -16
- package/dist/bubbles/service-bubble/apify/actors/twitter-scraper.d.ts +31 -31
- package/dist/bubbles/service-bubble/apify/actors/youtube-scraper.d.ts +8 -8
- package/dist/bubbles/service-bubble/apify/apify-scraper.schema.d.ts +153 -153
- package/dist/bubbles/service-bubble/apify/apify.d.ts +4 -4
- package/dist/bubbles/service-bubble/browserbase/browserbase.d.ts +1 -1
- package/dist/bubbles/service-bubble/crustdata/crustdata.d.ts +4 -4
- package/dist/bubbles/service-bubble/crustdata/crustdata.schema.d.ts +8 -8
- package/dist/bubbles/service-bubble/eleven-labs.d.ts +4 -4
- package/dist/bubbles/service-bubble/firecrawl.d.ts +132 -132
- package/dist/bubbles/service-bubble/followupboss.d.ts +34 -34
- package/dist/bubbles/service-bubble/github.d.ts +122 -122
- package/dist/bubbles/service-bubble/gmail.d.ts +391 -391
- package/dist/bubbles/service-bubble/google-calendar.d.ts +96 -96
- package/dist/bubbles/service-bubble/google-drive.d.ts +46 -46
- package/dist/bubbles/service-bubble/google-sheets/google-sheets.d.ts +41 -41
- package/dist/bubbles/service-bubble/google-sheets/google-sheets.integration.flow.d.ts +31 -0
- package/dist/bubbles/service-bubble/google-sheets/google-sheets.integration.flow.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/google-sheets/google-sheets.integration.flow.js +184 -0
- package/dist/bubbles/service-bubble/google-sheets/google-sheets.integration.flow.js.map +1 -0
- package/dist/bubbles/service-bubble/google-sheets/google-sheets.schema.d.ts +79 -79
- package/dist/bubbles/service-bubble/google-sheets.d.ts +1811 -0
- package/dist/bubbles/service-bubble/google-sheets.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/google-sheets.js +904 -0
- package/dist/bubbles/service-bubble/google-sheets.js.map +1 -0
- package/dist/bubbles/service-bubble/http.d.ts +12 -12
- package/dist/bubbles/service-bubble/insforge-db.d.ts +8 -8
- package/dist/bubbles/service-bubble/jira/index.d.ts +5 -0
- package/dist/bubbles/service-bubble/jira/index.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/jira/index.js +5 -0
- package/dist/bubbles/service-bubble/jira/index.js.map +1 -0
- package/dist/bubbles/service-bubble/jira/jira.d.ts +2695 -0
- package/dist/bubbles/service-bubble/jira/jira.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/jira/jira.integration.flow.d.ts +38 -0
- package/dist/bubbles/service-bubble/jira/jira.integration.flow.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/jira/jira.integration.flow.js +358 -0
- package/dist/bubbles/service-bubble/jira/jira.integration.flow.js.map +1 -0
- package/dist/bubbles/service-bubble/jira/jira.js +573 -0
- package/dist/bubbles/service-bubble/jira/jira.js.map +1 -0
- package/dist/bubbles/service-bubble/jira/jira.schema.d.ts +3660 -0
- package/dist/bubbles/service-bubble/jira/jira.schema.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/jira/jira.schema.js +499 -0
- package/dist/bubbles/service-bubble/jira/jira.schema.js.map +1 -0
- package/dist/bubbles/service-bubble/jira/jira.utils.d.ts +141 -0
- package/dist/bubbles/service-bubble/jira/jira.utils.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/jira/jira.utils.js +428 -0
- package/dist/bubbles/service-bubble/jira/jira.utils.js.map +1 -0
- package/dist/bubbles/service-bubble/notion/notion.d.ts +4 -4
- package/dist/bubbles/service-bubble/notion/property-schemas.d.ts +36 -36
- package/dist/bubbles/service-bubble/postgresql.d.ts +8 -8
- package/dist/bubbles/service-bubble/resend.d.ts +2 -2
- package/dist/bubbles/service-bubble/slack/slack.d.ts +114 -114
- package/dist/bubbles/service-bubble/slack.d.ts +5869 -0
- package/dist/bubbles/service-bubble/slack.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/slack.js +1536 -0
- package/dist/bubbles/service-bubble/slack.js.map +1 -0
- package/dist/bubbles/service-bubble/storage.d.ts +2 -2
- package/dist/bubbles/service-bubble/telegram.d.ts +6 -6
- package/dist/bubbles/tool-bubble/company-enrichment-tool.d.ts +4 -4
- package/dist/bubbles/tool-bubble/google-maps-tool.d.ts +4 -4
- package/dist/bubbles/tool-bubble/instagram-tool.d.ts +4 -4
- package/dist/bubbles/tool-bubble/linkedin-tool.d.ts +172 -172
- package/dist/bubbles/tool-bubble/people-search-tool.d.ts +4 -4
- package/dist/bubbles/tool-bubble/reddit-scrape-tool.d.ts +2 -2
- package/dist/bubbles/tool-bubble/research-agent-tool.d.ts +4 -4
- package/dist/bubbles/tool-bubble/sql-query-tool.d.ts +8 -8
- package/dist/bubbles/tool-bubble/tiktok-tool.d.ts +44 -44
- package/dist/bubbles/tool-bubble/twitter-tool.d.ts +60 -60
- package/dist/bubbles/tool-bubble/web-search-tool.d.ts +4 -4
- package/dist/bubbles/tool-bubble/youtube-tool.d.ts +10 -10
- package/dist/bubbles/workflow-bubble/pdf-form-operations.workflow.d.ts +18 -18
- package/dist/bubbles/workflow-bubble/slack-formatter-agent.d.ts +48 -48
- package/dist/bubbles.json +1795 -2
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,573 @@
|
|
|
1
|
+
import { ServiceBubble } from '../../../types/service-bubble-class.js';
|
|
2
|
+
import { CredentialType } from '@bubblelab/shared-schemas';
|
|
3
|
+
import { JiraParamsSchema, JiraResultSchema, } from './jira.schema.js';
|
|
4
|
+
import { textToADF, adfToText, enhanceErrorMessage, normalizeDate, findTransitionByStatus, } from './jira.utils.js';
|
|
5
|
+
/**
|
|
6
|
+
* Jira Service Bubble
|
|
7
|
+
*
|
|
8
|
+
* Agent-friendly Jira integration with minimal required parameters and smart defaults.
|
|
9
|
+
*
|
|
10
|
+
* Core Operations:
|
|
11
|
+
* - search: Find issues using JQL queries
|
|
12
|
+
* - get: Get details for a specific issue
|
|
13
|
+
* - create: Create new issues with automatic ADF conversion
|
|
14
|
+
* - update: Modify existing issues with flexible label operations
|
|
15
|
+
* - transition: Change issue status by name (no ID lookup needed)
|
|
16
|
+
*
|
|
17
|
+
* Supporting Operations:
|
|
18
|
+
* - list_transitions: Get available status transitions
|
|
19
|
+
* - list_projects: Discover available projects
|
|
20
|
+
* - list_issue_types: Get issue types for a project
|
|
21
|
+
* - add_comment: Add a comment to an issue
|
|
22
|
+
* - get_comments: Retrieve comments for an issue
|
|
23
|
+
*
|
|
24
|
+
* Features:
|
|
25
|
+
* - Markdown or plain text descriptions/comments auto-converted to Atlassian Document Format (ADF)
|
|
26
|
+
* - Supports markdown: **bold**, *italic*, `code`, [links](url), # headings, lists, > blockquotes, ``` code blocks ```, ~~strikethrough~~
|
|
27
|
+
* - Status transitions by name (e.g., "Done") instead of IDs
|
|
28
|
+
* - Flexible label operations (add/remove/set)
|
|
29
|
+
* - Smart defaults for 90% of use cases
|
|
30
|
+
*
|
|
31
|
+
* Security Features:
|
|
32
|
+
* - API token authentication via Jira Cloud
|
|
33
|
+
* - Secure credential injection at runtime
|
|
34
|
+
*/
|
|
35
|
+
export class JiraBubble extends ServiceBubble {
|
|
36
|
+
static type = 'service';
|
|
37
|
+
static service = 'jira';
|
|
38
|
+
static authType = 'oauth';
|
|
39
|
+
static bubbleName = 'jira';
|
|
40
|
+
static schema = JiraParamsSchema;
|
|
41
|
+
static resultSchema = JiraResultSchema;
|
|
42
|
+
static shortDescription = 'Jira integration for issue tracking and project management';
|
|
43
|
+
static longDescription = `
|
|
44
|
+
Agent-friendly Jira integration with minimal required parameters and smart defaults.
|
|
45
|
+
|
|
46
|
+
Core Operations:
|
|
47
|
+
- search: Find issues using JQL queries
|
|
48
|
+
- get: Get details for a specific issue
|
|
49
|
+
- create: Create new issues with automatic ADF conversion
|
|
50
|
+
- update: Modify existing issues with flexible label operations
|
|
51
|
+
- transition: Change issue status by name (no ID lookup needed)
|
|
52
|
+
|
|
53
|
+
Supporting Operations:
|
|
54
|
+
- list_transitions: Get available status transitions
|
|
55
|
+
- list_projects: Discover available projects
|
|
56
|
+
- list_issue_types: Get issue types for a project
|
|
57
|
+
- add_comment: Add a comment to an issue
|
|
58
|
+
- get_comments: Retrieve comments for an issue
|
|
59
|
+
|
|
60
|
+
Features:
|
|
61
|
+
- Markdown or plain text descriptions/comments auto-converted to Atlassian Document Format (ADF)
|
|
62
|
+
- Status transitions by name (e.g., "Done") instead of IDs
|
|
63
|
+
- Flexible label operations (add/remove/set)
|
|
64
|
+
- Smart defaults for 90% of use cases
|
|
65
|
+
|
|
66
|
+
Authentication:
|
|
67
|
+
- OAuth 2.0 (recommended): Connect via Atlassian OAuth for secure access
|
|
68
|
+
- API token (legacy): Use email + API token for Basic auth
|
|
69
|
+
- Secure credential injection at runtime
|
|
70
|
+
`;
|
|
71
|
+
static alias = 'jira';
|
|
72
|
+
constructor(params, context) {
|
|
73
|
+
super(params, context);
|
|
74
|
+
}
|
|
75
|
+
async testCredential() {
|
|
76
|
+
const apiToken = this.chooseCredential();
|
|
77
|
+
if (!apiToken) {
|
|
78
|
+
throw new Error('Jira credentials are required');
|
|
79
|
+
}
|
|
80
|
+
try {
|
|
81
|
+
// Test credentials by fetching user info
|
|
82
|
+
const response = await this.makeJiraApiRequest('/rest/api/3/myself', 'GET');
|
|
83
|
+
return Boolean(response && response.accountId);
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Jira credential types:
|
|
91
|
+
* 1. OAuth (recommended): { accessToken, cloudId, siteUrl } - Uses Bearer auth with Atlassian Cloud API
|
|
92
|
+
* 2. API Token (legacy): { accessToken, baseUrl, email } - Uses Basic auth with Jira instance
|
|
93
|
+
*/
|
|
94
|
+
parseCredentials() {
|
|
95
|
+
const { credentials } = this.params;
|
|
96
|
+
if (!credentials || typeof credentials !== 'object') {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
const jiraCredRaw = credentials[CredentialType.JIRA_CRED];
|
|
100
|
+
if (!jiraCredRaw) {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
// Decode base64-encoded JSON: { accessToken, cloudId, siteUrl }
|
|
104
|
+
try {
|
|
105
|
+
const decoded = Buffer.from(jiraCredRaw, 'base64').toString('utf-8');
|
|
106
|
+
const parsed = JSON.parse(decoded);
|
|
107
|
+
if (parsed.accessToken && parsed.cloudId) {
|
|
108
|
+
return {
|
|
109
|
+
accessToken: parsed.accessToken,
|
|
110
|
+
baseUrl: `https://api.atlassian.com/ex/jira/${parsed.cloudId}`,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// Invalid credential format
|
|
116
|
+
}
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
async makeJiraApiRequest(endpoint, method = 'GET', body) {
|
|
120
|
+
const creds = this.parseCredentials();
|
|
121
|
+
if (!creds) {
|
|
122
|
+
throw new Error('Invalid Jira credentials. Expected base64-encoded JSON with { accessToken, cloudId }.');
|
|
123
|
+
}
|
|
124
|
+
const url = `${creds.baseUrl}${endpoint}`;
|
|
125
|
+
const requestHeaders = {
|
|
126
|
+
Authorization: `Bearer ${creds.accessToken}`,
|
|
127
|
+
'Content-Type': 'application/json',
|
|
128
|
+
Accept: 'application/json',
|
|
129
|
+
};
|
|
130
|
+
const requestInit = {
|
|
131
|
+
method,
|
|
132
|
+
headers: requestHeaders,
|
|
133
|
+
};
|
|
134
|
+
if (body && method !== 'GET') {
|
|
135
|
+
requestInit.body = JSON.stringify(body);
|
|
136
|
+
}
|
|
137
|
+
const response = await fetch(url, requestInit);
|
|
138
|
+
if (!response.ok) {
|
|
139
|
+
const errorText = await response.text();
|
|
140
|
+
const enhancedError = enhanceErrorMessage(errorText, response.status, response.statusText);
|
|
141
|
+
throw new Error(enhancedError);
|
|
142
|
+
}
|
|
143
|
+
// Handle empty responses (204 No Content)
|
|
144
|
+
if (response.status === 204) {
|
|
145
|
+
return {};
|
|
146
|
+
}
|
|
147
|
+
const contentType = response.headers.get('content-type');
|
|
148
|
+
if (contentType && contentType.includes('application/json')) {
|
|
149
|
+
return (await response.json());
|
|
150
|
+
}
|
|
151
|
+
return {};
|
|
152
|
+
}
|
|
153
|
+
async performAction(context) {
|
|
154
|
+
void context;
|
|
155
|
+
const { operation } = this.params;
|
|
156
|
+
try {
|
|
157
|
+
const result = await (async () => {
|
|
158
|
+
const parsedParams = this.params;
|
|
159
|
+
switch (operation) {
|
|
160
|
+
case 'search':
|
|
161
|
+
return await this.search(parsedParams);
|
|
162
|
+
case 'get':
|
|
163
|
+
return await this.get(parsedParams);
|
|
164
|
+
case 'create':
|
|
165
|
+
return await this.create(parsedParams);
|
|
166
|
+
case 'update':
|
|
167
|
+
return await this.update(parsedParams);
|
|
168
|
+
case 'transition':
|
|
169
|
+
return await this.transition(parsedParams);
|
|
170
|
+
case 'list_transitions':
|
|
171
|
+
return await this.listTransitions(parsedParams);
|
|
172
|
+
case 'list_projects':
|
|
173
|
+
return await this.listProjects(parsedParams);
|
|
174
|
+
case 'list_issue_types':
|
|
175
|
+
return await this.listIssueTypes(parsedParams);
|
|
176
|
+
case 'add_comment':
|
|
177
|
+
return await this.addComment(parsedParams);
|
|
178
|
+
case 'get_comments':
|
|
179
|
+
return await this.getComments(parsedParams);
|
|
180
|
+
default:
|
|
181
|
+
throw new Error(`Unsupported operation: ${operation}`);
|
|
182
|
+
}
|
|
183
|
+
})();
|
|
184
|
+
return result;
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
return {
|
|
188
|
+
operation,
|
|
189
|
+
success: false,
|
|
190
|
+
error: error instanceof Error ? error.message : 'Unknown error occurred',
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
// -------------------------------------------------------------------------
|
|
195
|
+
// CORE OPERATION 1: search
|
|
196
|
+
// -------------------------------------------------------------------------
|
|
197
|
+
async search(params) {
|
|
198
|
+
const { jql, limit, offset, fields } = params;
|
|
199
|
+
const queryParams = new URLSearchParams({
|
|
200
|
+
jql,
|
|
201
|
+
startAt: String(offset ?? 0),
|
|
202
|
+
maxResults: String(limit ?? 50),
|
|
203
|
+
});
|
|
204
|
+
if (fields && fields.length > 0) {
|
|
205
|
+
queryParams.set('fields', fields.join(','));
|
|
206
|
+
}
|
|
207
|
+
// Use the new /search/jql endpoint (old /search was deprecated and returns 410)
|
|
208
|
+
const response = await this.makeJiraApiRequest(`/rest/api/3/search/jql?${queryParams.toString()}`, 'GET');
|
|
209
|
+
// Convert comment bodies from ADF to plain text if comments are present
|
|
210
|
+
if (Array.isArray(response.issues)) {
|
|
211
|
+
response.issues = response.issues.map((issue) => {
|
|
212
|
+
if (issue &&
|
|
213
|
+
typeof issue === 'object' &&
|
|
214
|
+
'fields' in issue &&
|
|
215
|
+
issue.fields &&
|
|
216
|
+
typeof issue.fields === 'object' &&
|
|
217
|
+
'comment' in issue.fields &&
|
|
218
|
+
issue.fields.comment &&
|
|
219
|
+
typeof issue.fields.comment === 'object' &&
|
|
220
|
+
'comments' in issue.fields.comment &&
|
|
221
|
+
Array.isArray(issue.fields.comment.comments)) {
|
|
222
|
+
const comments = issue.fields.comment.comments;
|
|
223
|
+
issue.fields.comment.comments = comments.map((c) => ({
|
|
224
|
+
...c,
|
|
225
|
+
body: adfToText(c.body),
|
|
226
|
+
renderedBody: adfToText(c.body),
|
|
227
|
+
}));
|
|
228
|
+
}
|
|
229
|
+
return issue;
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
return {
|
|
233
|
+
operation: 'search',
|
|
234
|
+
success: true,
|
|
235
|
+
issues: response.issues,
|
|
236
|
+
total: response.total,
|
|
237
|
+
offset: response.startAt,
|
|
238
|
+
limit: response.maxResults,
|
|
239
|
+
error: '',
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
// -------------------------------------------------------------------------
|
|
243
|
+
// CORE OPERATION 2: get
|
|
244
|
+
// -------------------------------------------------------------------------
|
|
245
|
+
async get(params) {
|
|
246
|
+
const { key, fields, expand } = params;
|
|
247
|
+
const queryParams = new URLSearchParams();
|
|
248
|
+
if (fields && fields.length > 0) {
|
|
249
|
+
queryParams.set('fields', fields.join(','));
|
|
250
|
+
}
|
|
251
|
+
if (expand && expand.length > 0) {
|
|
252
|
+
// Map expand options to Jira API expand values
|
|
253
|
+
const expandValues = expand.map((e) => {
|
|
254
|
+
switch (e) {
|
|
255
|
+
case 'comments':
|
|
256
|
+
return 'renderedFields';
|
|
257
|
+
case 'changelog':
|
|
258
|
+
return 'changelog';
|
|
259
|
+
case 'transitions':
|
|
260
|
+
return 'transitions';
|
|
261
|
+
default:
|
|
262
|
+
return e;
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
queryParams.set('expand', expandValues.join(','));
|
|
266
|
+
}
|
|
267
|
+
const queryString = queryParams.toString();
|
|
268
|
+
const endpoint = `/rest/api/3/issue/${encodeURIComponent(key)}${queryString ? `?${queryString}` : ''}`;
|
|
269
|
+
const response = await this.makeJiraApiRequest(endpoint, 'GET');
|
|
270
|
+
// Convert comment bodies from ADF to plain text if comments are present
|
|
271
|
+
if (response.fields &&
|
|
272
|
+
typeof response.fields === 'object' &&
|
|
273
|
+
'comment' in response.fields &&
|
|
274
|
+
response.fields.comment &&
|
|
275
|
+
typeof response.fields.comment === 'object' &&
|
|
276
|
+
'comments' in response.fields.comment &&
|
|
277
|
+
Array.isArray(response.fields.comment.comments)) {
|
|
278
|
+
const comments = response.fields.comment.comments;
|
|
279
|
+
response.fields.comment.comments = comments.map((c) => ({
|
|
280
|
+
...c,
|
|
281
|
+
body: adfToText(c.body),
|
|
282
|
+
renderedBody: adfToText(c.body),
|
|
283
|
+
}));
|
|
284
|
+
}
|
|
285
|
+
return {
|
|
286
|
+
operation: 'get',
|
|
287
|
+
success: true,
|
|
288
|
+
issue: response,
|
|
289
|
+
error: '',
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
// -------------------------------------------------------------------------
|
|
293
|
+
// CORE OPERATION 3: create
|
|
294
|
+
// -------------------------------------------------------------------------
|
|
295
|
+
async create(params) {
|
|
296
|
+
const { project, summary, type, description, assignee, priority, labels, parent, due_date, } = params;
|
|
297
|
+
const fields = {
|
|
298
|
+
project: { key: project },
|
|
299
|
+
summary,
|
|
300
|
+
issuetype: { name: type ?? 'Task' },
|
|
301
|
+
};
|
|
302
|
+
if (description) {
|
|
303
|
+
fields.description = textToADF(description);
|
|
304
|
+
}
|
|
305
|
+
if (assignee) {
|
|
306
|
+
// Try to determine if it's an account ID or email
|
|
307
|
+
// Account IDs typically don't contain @ symbol
|
|
308
|
+
if (assignee.includes('@')) {
|
|
309
|
+
// Will need to look up account ID by email - for now use accountId field
|
|
310
|
+
fields.assignee = { accountId: assignee };
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
fields.assignee = { accountId: assignee };
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
if (priority) {
|
|
317
|
+
fields.priority = { name: priority };
|
|
318
|
+
}
|
|
319
|
+
if (labels && labels.length > 0) {
|
|
320
|
+
fields.labels = labels;
|
|
321
|
+
}
|
|
322
|
+
if (parent) {
|
|
323
|
+
fields.parent = { key: parent };
|
|
324
|
+
}
|
|
325
|
+
if (due_date) {
|
|
326
|
+
const normalizedDate = normalizeDate(due_date);
|
|
327
|
+
if (normalizedDate) {
|
|
328
|
+
fields.duedate = normalizedDate;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
const response = await this.makeJiraApiRequest('/rest/api/3/issue', 'POST', { fields });
|
|
332
|
+
return {
|
|
333
|
+
operation: 'create',
|
|
334
|
+
success: true,
|
|
335
|
+
issue: {
|
|
336
|
+
id: response.id,
|
|
337
|
+
key: response.key,
|
|
338
|
+
self: response.self,
|
|
339
|
+
},
|
|
340
|
+
error: '',
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
// -------------------------------------------------------------------------
|
|
344
|
+
// CORE OPERATION 4: update
|
|
345
|
+
// -------------------------------------------------------------------------
|
|
346
|
+
async update(params) {
|
|
347
|
+
const { key, summary, description, assignee, priority, labels, due_date, comment, } = params;
|
|
348
|
+
const fields = {};
|
|
349
|
+
const update = {};
|
|
350
|
+
if (summary !== undefined) {
|
|
351
|
+
fields.summary = summary;
|
|
352
|
+
}
|
|
353
|
+
if (description !== undefined) {
|
|
354
|
+
fields.description = textToADF(description);
|
|
355
|
+
}
|
|
356
|
+
if (assignee !== undefined) {
|
|
357
|
+
if (assignee === null) {
|
|
358
|
+
fields.assignee = null;
|
|
359
|
+
}
|
|
360
|
+
else {
|
|
361
|
+
fields.assignee = { accountId: assignee };
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
if (priority !== undefined) {
|
|
365
|
+
fields.priority = { name: priority };
|
|
366
|
+
}
|
|
367
|
+
if (due_date !== undefined) {
|
|
368
|
+
if (due_date === null) {
|
|
369
|
+
fields.duedate = null;
|
|
370
|
+
}
|
|
371
|
+
else {
|
|
372
|
+
const normalizedDate = normalizeDate(due_date);
|
|
373
|
+
if (normalizedDate) {
|
|
374
|
+
fields.duedate = normalizedDate;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
// Handle labels modification
|
|
379
|
+
if (labels !== undefined) {
|
|
380
|
+
if (labels.set) {
|
|
381
|
+
// Replace all labels
|
|
382
|
+
fields.labels = labels.set;
|
|
383
|
+
}
|
|
384
|
+
else {
|
|
385
|
+
// Use update operations for add/remove
|
|
386
|
+
const labelOps = [];
|
|
387
|
+
if (labels.add) {
|
|
388
|
+
labels.add.forEach((label) => labelOps.push({ add: label }));
|
|
389
|
+
}
|
|
390
|
+
if (labels.remove) {
|
|
391
|
+
labels.remove.forEach((label) => labelOps.push({ remove: label }));
|
|
392
|
+
}
|
|
393
|
+
if (labelOps.length > 0) {
|
|
394
|
+
update.labels = labelOps;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
const body = {};
|
|
399
|
+
if (Object.keys(fields).length > 0) {
|
|
400
|
+
body.fields = fields;
|
|
401
|
+
}
|
|
402
|
+
if (Object.keys(update).length > 0) {
|
|
403
|
+
body.update = update;
|
|
404
|
+
}
|
|
405
|
+
// Update the issue
|
|
406
|
+
await this.makeJiraApiRequest(`/rest/api/3/issue/${encodeURIComponent(key)}`, 'PUT', body);
|
|
407
|
+
// Add comment if provided
|
|
408
|
+
if (comment) {
|
|
409
|
+
await this.makeJiraApiRequest(`/rest/api/3/issue/${encodeURIComponent(key)}/comment`, 'POST', { body: textToADF(comment) });
|
|
410
|
+
}
|
|
411
|
+
return {
|
|
412
|
+
operation: 'update',
|
|
413
|
+
success: true,
|
|
414
|
+
key,
|
|
415
|
+
error: '',
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
// -------------------------------------------------------------------------
|
|
419
|
+
// CORE OPERATION 5: transition
|
|
420
|
+
// -------------------------------------------------------------------------
|
|
421
|
+
async transition(params) {
|
|
422
|
+
const { key, status, transition_id, comment, resolution } = params;
|
|
423
|
+
let targetTransitionId = transition_id;
|
|
424
|
+
let targetStatusName;
|
|
425
|
+
// If status name is provided, find the matching transition
|
|
426
|
+
if (status && !transition_id) {
|
|
427
|
+
const transitionsResponse = await this.makeJiraApiRequest(`/rest/api/3/issue/${encodeURIComponent(key)}/transitions`, 'GET');
|
|
428
|
+
const transitions = transitionsResponse.transitions;
|
|
429
|
+
const matchingTransition = findTransitionByStatus(transitions, status);
|
|
430
|
+
if (!matchingTransition) {
|
|
431
|
+
const availableTransitions = transitions
|
|
432
|
+
.map((t) => `"${t.name}" → ${t.to?.name || 'unknown'}`)
|
|
433
|
+
.join(', ');
|
|
434
|
+
throw new Error(`No transition found to status "${status}". Available transitions: ${availableTransitions}`);
|
|
435
|
+
}
|
|
436
|
+
targetTransitionId = matchingTransition.id;
|
|
437
|
+
targetStatusName = matchingTransition.to?.name || matchingTransition.name;
|
|
438
|
+
}
|
|
439
|
+
if (!targetTransitionId) {
|
|
440
|
+
throw new Error('Either status or transition_id is required');
|
|
441
|
+
}
|
|
442
|
+
const body = {
|
|
443
|
+
transition: { id: targetTransitionId },
|
|
444
|
+
};
|
|
445
|
+
// Add fields if resolution is specified
|
|
446
|
+
if (resolution) {
|
|
447
|
+
body.fields = {
|
|
448
|
+
resolution: { name: resolution },
|
|
449
|
+
};
|
|
450
|
+
}
|
|
451
|
+
// Add update with comment if provided
|
|
452
|
+
if (comment) {
|
|
453
|
+
body.update = {
|
|
454
|
+
comment: [{ add: { body: textToADF(comment) } }],
|
|
455
|
+
};
|
|
456
|
+
}
|
|
457
|
+
await this.makeJiraApiRequest(`/rest/api/3/issue/${encodeURIComponent(key)}/transitions`, 'POST', body);
|
|
458
|
+
return {
|
|
459
|
+
operation: 'transition',
|
|
460
|
+
success: true,
|
|
461
|
+
key,
|
|
462
|
+
new_status: targetStatusName,
|
|
463
|
+
error: '',
|
|
464
|
+
};
|
|
465
|
+
}
|
|
466
|
+
// -------------------------------------------------------------------------
|
|
467
|
+
// SUPPORTING OPERATION: list_transitions
|
|
468
|
+
// -------------------------------------------------------------------------
|
|
469
|
+
async listTransitions(params) {
|
|
470
|
+
const { key } = params;
|
|
471
|
+
const response = await this.makeJiraApiRequest(`/rest/api/3/issue/${encodeURIComponent(key)}/transitions`, 'GET');
|
|
472
|
+
return {
|
|
473
|
+
operation: 'list_transitions',
|
|
474
|
+
success: true,
|
|
475
|
+
transitions: response.transitions,
|
|
476
|
+
error: '',
|
|
477
|
+
};
|
|
478
|
+
}
|
|
479
|
+
// -------------------------------------------------------------------------
|
|
480
|
+
// SUPPORTING OPERATION: list_projects
|
|
481
|
+
// -------------------------------------------------------------------------
|
|
482
|
+
async listProjects(params) {
|
|
483
|
+
const { limit, offset } = params;
|
|
484
|
+
const queryParams = new URLSearchParams({
|
|
485
|
+
startAt: String(offset ?? 0),
|
|
486
|
+
maxResults: String(limit ?? 50),
|
|
487
|
+
});
|
|
488
|
+
const response = await this.makeJiraApiRequest(`/rest/api/3/project/search?${queryParams.toString()}`, 'GET');
|
|
489
|
+
return {
|
|
490
|
+
operation: 'list_projects',
|
|
491
|
+
success: true,
|
|
492
|
+
projects: response.values,
|
|
493
|
+
total: response.total,
|
|
494
|
+
error: '',
|
|
495
|
+
};
|
|
496
|
+
}
|
|
497
|
+
// -------------------------------------------------------------------------
|
|
498
|
+
// SUPPORTING OPERATION: list_issue_types
|
|
499
|
+
// -------------------------------------------------------------------------
|
|
500
|
+
async listIssueTypes(params) {
|
|
501
|
+
const { project } = params;
|
|
502
|
+
const response = await this.makeJiraApiRequest(`/rest/api/3/project/${encodeURIComponent(project)}`, 'GET');
|
|
503
|
+
// Issue types are nested in the project response
|
|
504
|
+
const issueTypes = response.issueTypes;
|
|
505
|
+
return {
|
|
506
|
+
operation: 'list_issue_types',
|
|
507
|
+
success: true,
|
|
508
|
+
issue_types: issueTypes?.map((it) => ({
|
|
509
|
+
id: it.id,
|
|
510
|
+
name: it.name,
|
|
511
|
+
description: it.description,
|
|
512
|
+
subtask: it.subtask,
|
|
513
|
+
})),
|
|
514
|
+
error: '',
|
|
515
|
+
};
|
|
516
|
+
}
|
|
517
|
+
// -------------------------------------------------------------------------
|
|
518
|
+
// SUPPORTING OPERATION: add_comment
|
|
519
|
+
// -------------------------------------------------------------------------
|
|
520
|
+
async addComment(params) {
|
|
521
|
+
const { key, body } = params;
|
|
522
|
+
const response = await this.makeJiraApiRequest(`/rest/api/3/issue/${encodeURIComponent(key)}/comment`, 'POST', { body: textToADF(body) });
|
|
523
|
+
return {
|
|
524
|
+
operation: 'add_comment',
|
|
525
|
+
success: true,
|
|
526
|
+
comment: {
|
|
527
|
+
id: response.id,
|
|
528
|
+
body: body, // Return the original text for readability
|
|
529
|
+
created: response.created,
|
|
530
|
+
updated: response.updated,
|
|
531
|
+
author: response.author,
|
|
532
|
+
},
|
|
533
|
+
error: '',
|
|
534
|
+
};
|
|
535
|
+
}
|
|
536
|
+
// -------------------------------------------------------------------------
|
|
537
|
+
// SUPPORTING OPERATION: get_comments
|
|
538
|
+
// -------------------------------------------------------------------------
|
|
539
|
+
async getComments(params) {
|
|
540
|
+
const { key, limit, offset } = params;
|
|
541
|
+
const queryParams = new URLSearchParams({
|
|
542
|
+
startAt: String(offset ?? 0),
|
|
543
|
+
maxResults: String(limit ?? 50),
|
|
544
|
+
});
|
|
545
|
+
const response = await this.makeJiraApiRequest(`/rest/api/3/issue/${encodeURIComponent(key)}/comment?${queryParams.toString()}`, 'GET');
|
|
546
|
+
// Convert ADF body to plain text for readability
|
|
547
|
+
const rawComments = response.comments;
|
|
548
|
+
const comments = rawComments?.map((c) => ({
|
|
549
|
+
id: c.id,
|
|
550
|
+
author: c.author,
|
|
551
|
+
body: adfToText(c.body), // Convert ADF to plain text
|
|
552
|
+
renderedBody: adfToText(c.body), // Plain text version
|
|
553
|
+
created: c.created,
|
|
554
|
+
updated: c.updated,
|
|
555
|
+
}));
|
|
556
|
+
return {
|
|
557
|
+
operation: 'get_comments',
|
|
558
|
+
success: true,
|
|
559
|
+
comments: comments,
|
|
560
|
+
total: response.total,
|
|
561
|
+
error: '',
|
|
562
|
+
};
|
|
563
|
+
}
|
|
564
|
+
chooseCredential() {
|
|
565
|
+
const { credentials } = this.params;
|
|
566
|
+
if (!credentials || typeof credentials !== 'object') {
|
|
567
|
+
return undefined;
|
|
568
|
+
}
|
|
569
|
+
// Return the raw credential value - will be parsed in parseCredentials()
|
|
570
|
+
return credentials[CredentialType.JIRA_CRED];
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
//# sourceMappingURL=jira.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jira.js","sourceRoot":"","sources":["../../../../src/bubbles/service-bubble/jira/jira.ts"],"names":[],"mappings":"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"}
|