@straiffi/archon 1.4.9 → 1.4.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 (75) hide show
  1. package/dist/client/assets/GitHubActionsDialog-DcW7fUgz.js +1 -0
  2. package/dist/client/assets/{TestsDialog-Cp3Da2W0.js → TestsDialog-xNEttQOx.js} +2 -2
  3. package/dist/client/assets/{architectureDiagram-3BPJPVTR-CFEtd9pl.js → architectureDiagram-3BPJPVTR-DHADo63Y.js} +1 -1
  4. package/dist/client/assets/{blockDiagram-GPEHLZMM-9UsBOlSn.js → blockDiagram-GPEHLZMM-D_LqGLuD.js} +1 -1
  5. package/dist/client/assets/{c4Diagram-AAUBKEIU--TsvWn6X.js → c4Diagram-AAUBKEIU-mIqv7fCU.js} +1 -1
  6. package/dist/client/assets/channel-D7PWuiXU.js +1 -0
  7. package/dist/client/assets/{chunk-2J33WTMH-B3FphDWz.js → chunk-2J33WTMH-DP-b68f-.js} +1 -1
  8. package/dist/client/assets/{chunk-3OPIFGDE-CLbUIPKK.js → chunk-3OPIFGDE-D4GWQbqc.js} +1 -1
  9. package/dist/client/assets/{chunk-5ZQYHXKU-CUHKY5eH.js → chunk-5ZQYHXKU-HftAkT9j.js} +1 -1
  10. package/dist/client/assets/{chunk-727SXJPM-DfKJ4Ud0.js → chunk-727SXJPM-CvB0JQZP.js} +1 -1
  11. package/dist/client/assets/{chunk-AQP2D5EJ-B0oLVoZs.js → chunk-AQP2D5EJ-DSB28EAb.js} +1 -1
  12. package/dist/client/assets/{chunk-CSCIHK7Q-Czl8GWBW.js → chunk-CSCIHK7Q-DuSgBocb.js} +1 -1
  13. package/dist/client/assets/{chunk-KSCS5N6A-pOOnuun_.js → chunk-KSCS5N6A-cm_ppJ7v.js} +1 -1
  14. package/dist/client/assets/{chunk-L5ZTLDWV-DzRVeTqf.js → chunk-L5ZTLDWV-BzDHIV9v.js} +1 -1
  15. package/dist/client/assets/{chunk-LZXEDZCA-MVhzvLVp.js → chunk-LZXEDZCA-BruMwvko.js} +2 -2
  16. package/dist/client/assets/{chunk-ND2GUHAM-BeNiy3nE.js → chunk-ND2GUHAM-DrnvodkL.js} +1 -1
  17. package/dist/client/assets/{chunk-NZK2D7GU-CnENvQ9d.js → chunk-NZK2D7GU-QVsa0LuF.js} +1 -1
  18. package/dist/client/assets/{chunk-O5CBEL6O-CkqDMX_f.js → chunk-O5CBEL6O-DJFhq2gr.js} +1 -1
  19. package/dist/client/assets/{chunk-WU5MYG2G-sJ18xVVM.js → chunk-WU5MYG2G-ieLjE2uQ.js} +1 -1
  20. package/dist/client/assets/classDiagram-4FO5ZUOK-BNIT931s.js +1 -0
  21. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-TRtc0GGS.js +1 -0
  22. package/dist/client/assets/{dagre-BM42HDAG-BWnmF2aL.js → dagre-BM42HDAG-CFRh82aT.js} +1 -1
  23. package/dist/client/assets/{diagram-2AECGRRQ-CASRQI5Y.js → diagram-2AECGRRQ-CPk1WJvx.js} +1 -1
  24. package/dist/client/assets/{diagram-5GNKFQAL-CY8fXRrV.js → diagram-5GNKFQAL-DHMJ735r.js} +1 -1
  25. package/dist/client/assets/{diagram-KO2AKTUF-vtm-gqIm.js → diagram-KO2AKTUF-Cq9d2BWb.js} +1 -1
  26. package/dist/client/assets/{diagram-LMA3HP47-Ck-iA5q1.js → diagram-LMA3HP47-CgWJTR_b.js} +1 -1
  27. package/dist/client/assets/{diagram-OG6HWLK6-ALBEY2Nn.js → diagram-OG6HWLK6-HoFYGw81.js} +1 -1
  28. package/dist/client/assets/{erDiagram-TEJ5UH35-BAHPzYR7.js → erDiagram-TEJ5UH35-B7yuPZck.js} +1 -1
  29. package/dist/client/assets/{flowDiagram-I6XJVG4X-pUYj1KCo.js → flowDiagram-I6XJVG4X-DaXXRHQj.js} +1 -1
  30. package/dist/client/assets/{ganttDiagram-6RSMTGT7-zw-EKZcX.js → ganttDiagram-6RSMTGT7-pKsFmtHB.js} +1 -1
  31. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-DmPxQKXO.js → gitGraphDiagram-PVQCEYII-Dwx5kc1M.js} +1 -1
  32. package/dist/client/assets/index-5Eun897r.js +260 -0
  33. package/dist/client/assets/index-CWWEw76C.css +2 -0
  34. package/dist/client/assets/{infoDiagram-5YYISTIA-D0zuFK8l.js → infoDiagram-5YYISTIA-6Taupp-l.js} +1 -1
  35. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-BoNe_Ie6.js → ishikawaDiagram-YF4QCWOH-BBKjiFtW.js} +1 -1
  36. package/dist/client/assets/{journeyDiagram-JHISSGLW-ByAP1uL0.js → journeyDiagram-JHISSGLW-BQQ1EKJ3.js} +1 -1
  37. package/dist/client/assets/{kanban-definition-UN3LZRKU-CGXOqdl0.js → kanban-definition-UN3LZRKU-BvsroFzw.js} +1 -1
  38. package/dist/client/assets/{line-BZ3JWBtG.js → line-C6BHsie7.js} +1 -1
  39. package/dist/client/assets/{mermaid-parser.core-DuHIifHL.js → mermaid-parser.core-Cb4G8u3H.js} +1 -1
  40. package/dist/client/assets/{mermaid.core-Co8EqKSU.js → mermaid.core-NCO8Z4wR.js} +3 -3
  41. package/dist/client/assets/{mindmap-definition-RKZ34NQL-Cv3-5Q_b.js → mindmap-definition-RKZ34NQL-DYzSjAq3.js} +1 -1
  42. package/dist/client/assets/{pieDiagram-4H26LBE5-DziVyTJT.js → pieDiagram-4H26LBE5-CWMyFFuU.js} +1 -1
  43. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-DjNtV4An.js → quadrantDiagram-W4KKPZXB-D1ifIucc.js} +1 -1
  44. package/dist/client/assets/{requirementDiagram-4Y6WPE33-Cs3npD-z.js → requirementDiagram-4Y6WPE33-DW68fC21.js} +1 -1
  45. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-DxepDJwc.js → sankeyDiagram-5OEKKPKP-DnnV47BL.js} +1 -1
  46. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-DIPg-NEj.js → sequenceDiagram-3UESZ5HK-Dw-9ZBU_.js} +1 -1
  47. package/dist/client/assets/{stateDiagram-AJRCARHV-DUA-Ko9b.js → stateDiagram-AJRCARHV-C7dkf8nk.js} +1 -1
  48. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-BFmoroJA.js +1 -0
  49. package/dist/client/assets/{timeline-definition-PNZ67QCA-wvi8pREg.js → timeline-definition-PNZ67QCA-BmVfK_16.js} +1 -1
  50. package/dist/client/assets/{vennDiagram-CIIHVFJN-CabtIweB.js → vennDiagram-CIIHVFJN-B9j3QbmD.js} +1 -1
  51. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-BiOWydTY.js → wardleyDiagram-YWT4CUSO-C520auMy.js} +1 -1
  52. package/dist/client/assets/{xychartDiagram-2RQKCTM6-sWfRgDRl.js → xychartDiagram-2RQKCTM6-CPqUJuqs.js} +1 -1
  53. package/dist/client/index.html +2 -2
  54. package/dist/server/db.js +11 -3
  55. package/dist/server/db.js.map +1 -1
  56. package/dist/server/index.js +18 -1
  57. package/dist/server/index.js.map +1 -1
  58. package/dist/server/lib/integrations/importedIssueImages.js +302 -10
  59. package/dist/server/lib/integrations/importedIssueImages.js.map +1 -1
  60. package/dist/server/lib/integrations/jira.js +142 -16
  61. package/dist/server/lib/integrations/jira.js.map +1 -1
  62. package/dist/server/lib/projectMemory.js +38 -8
  63. package/dist/server/lib/projectMemory.js.map +1 -1
  64. package/dist/server/lib/specs.js +9 -0
  65. package/dist/server/lib/specs.js.map +1 -1
  66. package/dist/server/workers/specSession.js +4 -0
  67. package/dist/server/workers/specSession.js.map +1 -1
  68. package/package.json +1 -1
  69. package/dist/client/assets/GitHubActionsDialog-ln1X9xDf.js +0 -1
  70. package/dist/client/assets/channel-BjRPoR7Z.js +0 -1
  71. package/dist/client/assets/classDiagram-4FO5ZUOK-BjzBLL5f.js +0 -1
  72. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-BDLW6NLv.js +0 -1
  73. package/dist/client/assets/index-BokL1E46.css +0 -2
  74. package/dist/client/assets/index-WeECH1eZ.js +0 -260
  75. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-D6OlcyEp.js +0 -1
@@ -47,6 +47,16 @@ const buildNotice = ({ importedCount, skippedCounts, }) => {
47
47
  const normalizeImageMimeType = (value) => {
48
48
  return value?.split(';')[0]?.trim().toLowerCase() ?? '';
49
49
  };
50
+ const resolveCandidateMimeType = (responseMimeType, candidate) => {
51
+ if (responseMimeType.startsWith('image/')) {
52
+ return responseMimeType;
53
+ }
54
+ const declaredMimeType = normalizeImageMimeType(candidate.jira_declared_mime_type);
55
+ if ((responseMimeType === '' || responseMimeType === 'application/octet-stream') && declaredMimeType.startsWith('image/')) {
56
+ return declaredMimeType;
57
+ }
58
+ return responseMimeType;
59
+ };
50
60
  const resolveImportedImageExtension = (mimeType) => {
51
61
  return SUPPORTED_IMAGE_EXTENSIONS.get(mimeType) ?? null;
52
62
  };
@@ -105,12 +115,221 @@ const isGitHubHostedImageUrl = (url) => {
105
115
  || host === 'objects.githubusercontent.com'
106
116
  || host.endsWith('.githubusercontent.com');
107
117
  };
108
- const fetchJiraHostedImage = async (config, url) => {
109
- return fetch(url, {
110
- headers: {
111
- Accept: 'image/*,application/octet-stream',
112
- Authorization: `Basic ${Buffer.from(`${config.email}:${config.api_token}`).toString('base64')}`,
113
- },
118
+ const normalizeJiraBaseUrl = (value) => value.trim().replace(/\/+$/, '');
119
+ const getJiraAssetAuthHeader = (config) => {
120
+ return `Basic ${Buffer.from(`${config.email}:${config.api_token}`).toString('base64')}`;
121
+ };
122
+ const getJiraAssetHeaders = (config, parsedUrl) => {
123
+ const headers = {
124
+ Accept: '*/*',
125
+ };
126
+ if (isJiraHostedImageUrl(parsedUrl, config)) {
127
+ headers.Authorization = getJiraAssetAuthHeader(config);
128
+ }
129
+ return headers;
130
+ };
131
+ const isRedirectResponse = (response) => {
132
+ return response.status === 301
133
+ || response.status === 302
134
+ || response.status === 303
135
+ || response.status === 307
136
+ || response.status === 308;
137
+ };
138
+ const buildJiraAttachmentContentUrl = (config, attachmentId) => {
139
+ return `${normalizeJiraBaseUrl(config.base_url)}/rest/api/3/attachment/content/${encodeURIComponent(attachmentId)}?redirect=false`;
140
+ };
141
+ const isJiraAttachmentDownloadApiUrl = (url) => {
142
+ return /\/rest\/api\/[23]\/attachment\/(?:content|thumbnail)\/[^/]+\/?$/.test(url.pathname);
143
+ };
144
+ const normalizeJiraAttachmentDownloadUrl = (value) => {
145
+ try {
146
+ const url = new URL(value);
147
+ if (isJiraAttachmentDownloadApiUrl(url)) {
148
+ url.searchParams.set('redirect', 'false');
149
+ }
150
+ return url.toString();
151
+ }
152
+ catch {
153
+ return value;
154
+ }
155
+ };
156
+ const appendUniqueUrl = (urls, url) => {
157
+ if (!url || urls.includes(url)) {
158
+ return;
159
+ }
160
+ urls.push(url);
161
+ };
162
+ const buildJiraCandidateDownloadUrls = (config, candidate, parsedUrl) => {
163
+ const urls = [];
164
+ if (candidate.jira_content_url) {
165
+ appendUniqueUrl(urls, normalizeJiraAttachmentDownloadUrl(candidate.jira_content_url));
166
+ }
167
+ appendUniqueUrl(urls, normalizeJiraAttachmentDownloadUrl(parsedUrl.toString()));
168
+ const attachmentId = candidate.jira_attachment_id?.trim();
169
+ if (attachmentId) {
170
+ appendUniqueUrl(urls, buildJiraAttachmentContentUrl(config, attachmentId));
171
+ }
172
+ if (candidate.jira_thumbnail_url) {
173
+ appendUniqueUrl(urls, normalizeJiraAttachmentDownloadUrl(candidate.jira_thumbnail_url));
174
+ }
175
+ return urls;
176
+ };
177
+ const fetchJiraUrlWithAutomaticRedirects = async (config, url, attempts, followedManualRedirect) => {
178
+ const parsedUrl = new URL(url);
179
+ const response = await fetch(parsedUrl.toString(), {
180
+ headers: getJiraAssetHeaders(config, parsedUrl),
181
+ redirect: 'follow',
182
+ });
183
+ attempts.push({
184
+ requestedUrl: parsedUrl.toString(),
185
+ status: response.status,
186
+ contentType: normalizeImageMimeType(response.headers.get('content-type')) || null,
187
+ autoRedirectFallbackUsed: true,
188
+ followedManualRedirect,
189
+ });
190
+ return response;
191
+ };
192
+ const fetchJiraUrlFollowingRedirects = async (config, url, attempts, redirectCount = 0) => {
193
+ const parsedUrl = new URL(url);
194
+ const response = await fetch(parsedUrl.toString(), {
195
+ headers: getJiraAssetHeaders(config, parsedUrl),
196
+ redirect: 'manual',
197
+ });
198
+ attempts.push({
199
+ requestedUrl: parsedUrl.toString(),
200
+ status: response.status,
201
+ contentType: normalizeImageMimeType(response.headers.get('content-type')) || null,
202
+ autoRedirectFallbackUsed: false,
203
+ followedManualRedirect: redirectCount > 0,
204
+ });
205
+ if (!isRedirectResponse(response) || redirectCount >= 5) {
206
+ return {
207
+ response,
208
+ requestedUrl: parsedUrl.toString(),
209
+ autoRedirectFallbackUsed: false,
210
+ followedManualRedirect: redirectCount > 0,
211
+ attempts,
212
+ };
213
+ }
214
+ const location = response.headers.get('location');
215
+ if (!location) {
216
+ if (isJiraHostedImageUrl(parsedUrl, config)) {
217
+ return {
218
+ response: await fetchJiraUrlWithAutomaticRedirects(config, parsedUrl.toString(), attempts, redirectCount > 0),
219
+ requestedUrl: parsedUrl.toString(),
220
+ autoRedirectFallbackUsed: true,
221
+ followedManualRedirect: redirectCount > 0,
222
+ attempts,
223
+ };
224
+ }
225
+ return {
226
+ response,
227
+ requestedUrl: parsedUrl.toString(),
228
+ autoRedirectFallbackUsed: false,
229
+ followedManualRedirect: redirectCount > 0,
230
+ attempts,
231
+ };
232
+ }
233
+ const redirected = await fetchJiraUrlFollowingRedirects(config, new URL(location, parsedUrl).toString(), attempts, redirectCount + 1);
234
+ return {
235
+ ...redirected,
236
+ followedManualRedirect: true,
237
+ };
238
+ };
239
+ const isRetryableJiraDownloadResponse = (response) => {
240
+ return response.status !== 401 && response.status !== 403 && !response.ok;
241
+ };
242
+ const fetchJiraHostedImage = async (config, candidate, parsedUrl) => {
243
+ const urls = buildJiraCandidateDownloadUrls(config, candidate, parsedUrl);
244
+ let lastResult = null;
245
+ const attempts = [];
246
+ for (const url of urls) {
247
+ const result = await fetchJiraUrlFollowingRedirects(config, url, attempts);
248
+ if (!isRetryableJiraDownloadResponse(result.response)) {
249
+ return result;
250
+ }
251
+ if (result.followedManualRedirect && isJiraHostedImageUrl(new URL(url), config)) {
252
+ const automaticResponse = await fetchJiraUrlWithAutomaticRedirects(config, url, attempts, result.followedManualRedirect);
253
+ const automaticResult = {
254
+ response: automaticResponse,
255
+ requestedUrl: url,
256
+ autoRedirectFallbackUsed: true,
257
+ followedManualRedirect: result.followedManualRedirect,
258
+ attempts,
259
+ };
260
+ if (!isRetryableJiraDownloadResponse(automaticResult.response)) {
261
+ return automaticResult;
262
+ }
263
+ lastResult = automaticResult;
264
+ continue;
265
+ }
266
+ lastResult = result;
267
+ }
268
+ if (lastResult) {
269
+ return lastResult;
270
+ }
271
+ throw new Error('No Jira image download URL was available.');
272
+ };
273
+ const sanitizeUrlForLog = (value) => {
274
+ try {
275
+ const url = new URL(value);
276
+ return `${url.protocol}//${url.host}${url.pathname}`;
277
+ }
278
+ catch {
279
+ return 'invalid-url';
280
+ }
281
+ };
282
+ const sanitizeJiraFetchAttemptsForLog = (attempts) => {
283
+ return attempts.map(attempt => ({
284
+ requested_url: sanitizeUrlForLog(attempt.requestedUrl),
285
+ status: attempt.status,
286
+ content_type: attempt.contentType,
287
+ auto_redirect_fallback_used: attempt.autoRedirectFallbackUsed,
288
+ followed_manual_redirect: attempt.followedManualRedirect,
289
+ }));
290
+ };
291
+ const getProblemString = (value) => {
292
+ return typeof value === 'string' && value.trim() ? value.trim() : null;
293
+ };
294
+ const readJiraProblemDetails = async (response) => {
295
+ if (!response) {
296
+ return null;
297
+ }
298
+ const contentType = normalizeImageMimeType(response.headers.get('content-type'));
299
+ if (contentType !== 'application/problem+json' && contentType !== 'application/json') {
300
+ return null;
301
+ }
302
+ const clone = response.clone?.();
303
+ if (!clone) {
304
+ return null;
305
+ }
306
+ try {
307
+ const body = await clone.json();
308
+ return {
309
+ title: getProblemString(body.title),
310
+ detail: getProblemString(body.detail),
311
+ message: getProblemString(body.message),
312
+ };
313
+ }
314
+ catch {
315
+ return null;
316
+ }
317
+ };
318
+ const logJiraImageImportSkip = async ({ candidate, parsedUrl, skipCode, response, requestedUrl, responseMimeType, resolvedMimeType, autoRedirectFallbackUsed, attempts, error, }) => {
319
+ const problem = await readJiraProblemDetails(response);
320
+ console.warn('[integrations] jira image import skipped', {
321
+ skip_code: skipCode,
322
+ candidate_url: parsedUrl ? sanitizeUrlForLog(parsedUrl.toString()) : 'invalid-url',
323
+ requested_url: requestedUrl ? sanitizeUrlForLog(requestedUrl) : null,
324
+ attempts: attempts ? sanitizeJiraFetchAttemptsForLog(attempts) : [],
325
+ jira_attachment_id: candidate.jira_attachment_id ?? null,
326
+ response_status: response?.status ?? null,
327
+ response_content_type: responseMimeType ?? null,
328
+ resolved_mime_type: resolvedMimeType ?? null,
329
+ declared_mime_type: candidate.jira_declared_mime_type ?? null,
330
+ auto_redirect_fallback_used: autoRedirectFallbackUsed ?? false,
331
+ problem,
332
+ error: error instanceof Error ? error.message : null,
114
333
  });
115
334
  };
116
335
  const fetchGitHubHostedImage = async (config, url) => {
@@ -139,6 +358,13 @@ export const importProviderHostedIssueImages = async (options) => {
139
358
  }
140
359
  catch {
141
360
  countSkipped(skippedCounts, 'download_failed');
361
+ if (options.provider === 'jira') {
362
+ await logJiraImageImportSkip({
363
+ candidate,
364
+ parsedUrl: null,
365
+ skipCode: 'download_failed',
366
+ });
367
+ }
142
368
  continue;
143
369
  }
144
370
  const providerHosted = options.provider === 'jira'
@@ -149,10 +375,15 @@ export const importProviderHostedIssueImages = async (options) => {
149
375
  continue;
150
376
  }
151
377
  let response;
378
+ let jiraFetchResult = null;
152
379
  try {
153
- response = options.provider === 'jira'
154
- ? await fetchJiraHostedImage(options.config, parsedUrl.toString())
155
- : await fetchGitHubHostedImage(options.config, parsedUrl.toString());
380
+ if (options.provider === 'jira') {
381
+ jiraFetchResult = await fetchJiraHostedImage(options.config, candidate, parsedUrl);
382
+ response = jiraFetchResult.response;
383
+ }
384
+ else {
385
+ response = await fetchGitHubHostedImage(options.config, parsedUrl.toString());
386
+ }
156
387
  }
157
388
  catch (error) {
158
389
  if (error instanceof GitHubApiError && (error.status === 401 || error.status === 403)) {
@@ -161,23 +392,84 @@ export const importProviderHostedIssueImages = async (options) => {
161
392
  else {
162
393
  countSkipped(skippedCounts, 'download_failed');
163
394
  }
395
+ if (options.provider === 'jira') {
396
+ await logJiraImageImportSkip({
397
+ candidate,
398
+ parsedUrl,
399
+ skipCode: 'download_failed',
400
+ error,
401
+ });
402
+ }
164
403
  continue;
165
404
  }
166
405
  if (response.status === 401 || response.status === 403) {
167
406
  countSkipped(skippedCounts, 'permission_denied');
407
+ if (options.provider === 'jira') {
408
+ await logJiraImageImportSkip({
409
+ candidate,
410
+ parsedUrl,
411
+ skipCode: 'permission_denied',
412
+ response,
413
+ requestedUrl: jiraFetchResult?.requestedUrl,
414
+ responseMimeType: normalizeImageMimeType(response.headers.get('content-type')),
415
+ autoRedirectFallbackUsed: jiraFetchResult?.autoRedirectFallbackUsed,
416
+ attempts: jiraFetchResult?.attempts,
417
+ });
418
+ }
168
419
  continue;
169
420
  }
170
421
  if (!response.ok) {
171
422
  countSkipped(skippedCounts, 'download_failed');
423
+ if (options.provider === 'jira') {
424
+ await logJiraImageImportSkip({
425
+ candidate,
426
+ parsedUrl,
427
+ skipCode: 'download_failed',
428
+ response,
429
+ requestedUrl: jiraFetchResult?.requestedUrl,
430
+ responseMimeType: normalizeImageMimeType(response.headers.get('content-type')),
431
+ autoRedirectFallbackUsed: jiraFetchResult?.autoRedirectFallbackUsed,
432
+ attempts: jiraFetchResult?.attempts,
433
+ });
434
+ }
172
435
  continue;
173
436
  }
174
- const mimeType = normalizeImageMimeType(response.headers.get('content-type'));
437
+ const responseMimeType = normalizeImageMimeType(response.headers.get('content-type'));
438
+ const mimeType = options.provider === 'jira'
439
+ ? resolveCandidateMimeType(responseMimeType, candidate)
440
+ : responseMimeType;
175
441
  if (!mimeType.startsWith('image/')) {
176
442
  countSkipped(skippedCounts, 'non_image_content');
443
+ if (options.provider === 'jira') {
444
+ await logJiraImageImportSkip({
445
+ candidate,
446
+ parsedUrl,
447
+ skipCode: 'non_image_content',
448
+ response,
449
+ requestedUrl: jiraFetchResult?.requestedUrl,
450
+ responseMimeType,
451
+ resolvedMimeType: mimeType,
452
+ autoRedirectFallbackUsed: jiraFetchResult?.autoRedirectFallbackUsed,
453
+ attempts: jiraFetchResult?.attempts,
454
+ });
455
+ }
177
456
  continue;
178
457
  }
179
458
  if (!resolveImportedImageExtension(mimeType)) {
180
459
  countSkipped(skippedCounts, 'unsupported_type');
460
+ if (options.provider === 'jira') {
461
+ await logJiraImageImportSkip({
462
+ candidate,
463
+ parsedUrl,
464
+ skipCode: 'unsupported_type',
465
+ response,
466
+ requestedUrl: jiraFetchResult?.requestedUrl,
467
+ responseMimeType,
468
+ resolvedMimeType: mimeType,
469
+ autoRedirectFallbackUsed: jiraFetchResult?.autoRedirectFallbackUsed,
470
+ attempts: jiraFetchResult?.attempts,
471
+ });
472
+ }
181
473
  continue;
182
474
  }
183
475
  const contentLength = Number.parseInt(response.headers.get('content-length') ?? '', 10);
@@ -1 +1 @@
1
- {"version":3,"file":"importedIssueImages.js","sourceRoot":"","sources":["../../../../server/lib/integrations/importedIssueImages.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"importedIssueImages.js","sourceRoot":"","sources":["../../../../server/lib/integrations/importedIssueImages.ts"],"names":[],"mappings":"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"}
@@ -303,33 +303,158 @@ const collectJiraImageCandidates = (node, nextSourceOrder) => {
303
303
  }
304
304
  return candidates;
305
305
  };
306
- const collectJiraAttachmentImageCandidates = (attachments, nextSourceOrder) => {
306
+ const collectJiraAttachmentImageCandidates = (config, attachments, nextSourceOrder) => {
307
307
  return (attachments ?? []).flatMap(attachment => {
308
- const mimeType = attachment.mimeType?.trim().toLowerCase() ?? '';
308
+ const mimeType = normalizeJiraAttachmentMimeType(attachment.mimeType);
309
+ const attachmentId = normalizeJiraAttachmentId(attachment.id);
309
310
  const contentUrl = attachment.content?.trim() ?? '';
310
- if (!mimeType.startsWith('image/') || !contentUrl) {
311
+ const thumbnailUrl = attachment.thumbnail?.trim() ?? '';
312
+ if (!mimeType.startsWith('image/') || (!attachmentId && !contentUrl)) {
313
+ return [];
314
+ }
315
+ const canonicalUrl = buildJiraAttachmentContentUrl({
316
+ config,
317
+ attachmentId,
318
+ contentUrl,
319
+ });
320
+ if (!canonicalUrl) {
311
321
  return [];
312
322
  }
313
323
  const candidate = {
314
- url: contentUrl,
324
+ url: canonicalUrl,
315
325
  source_order: nextSourceOrder.value,
316
- original_name: attachment.filename?.trim() || getOriginalNameFromUrl(contentUrl),
317
- strip_texts: [],
326
+ original_name: attachment.filename?.trim() || getOriginalNameFromUrl(contentUrl || canonicalUrl),
327
+ strip_texts: contentUrl ? [contentUrl] : [],
328
+ jira_attachment_id: attachmentId || null,
329
+ jira_declared_mime_type: mimeType || null,
330
+ jira_content_url: contentUrl || null,
331
+ jira_thumbnail_url: thumbnailUrl || null,
318
332
  };
319
333
  nextSourceOrder.value += 1;
320
334
  return [candidate];
321
335
  });
322
336
  };
337
+ const normalizeJiraAttachmentId = (value) => {
338
+ return value === null || value === undefined ? '' : String(value).trim();
339
+ };
340
+ const normalizeJiraAttachmentMimeType = (value) => {
341
+ return value?.trim().toLowerCase() ?? '';
342
+ };
343
+ const isJiraAttachmentContentUrl = (url) => {
344
+ return /\/rest\/api\/[23]\/attachment\/content\/[^/]+\/?$/.test(url.pathname);
345
+ };
346
+ const buildJiraAttachmentContentUrl = ({ config, attachmentId, contentUrl, }) => {
347
+ if (contentUrl) {
348
+ try {
349
+ const url = new URL(contentUrl);
350
+ if (isJiraAttachmentContentUrl(url)) {
351
+ url.searchParams.set('redirect', 'false');
352
+ return url.toString();
353
+ }
354
+ if (!attachmentId) {
355
+ return url.toString();
356
+ }
357
+ }
358
+ catch {
359
+ // Fall back to the attachment id route when Jira returned a malformed content URL.
360
+ }
361
+ }
362
+ if (!attachmentId) {
363
+ return '';
364
+ }
365
+ return `${normalizeBaseUrl(config.base_url)}/rest/api/3/attachment/content/${encodeURIComponent(attachmentId)}?redirect=false`;
366
+ };
367
+ const buildJiraAttachmentUrlMatchMap = (config, attachments) => {
368
+ const matches = new Map();
369
+ for (const attachment of attachments ?? []) {
370
+ const mimeType = normalizeJiraAttachmentMimeType(attachment.mimeType);
371
+ const attachmentId = normalizeJiraAttachmentId(attachment.id);
372
+ if (!mimeType.startsWith('image/') || !attachmentId) {
373
+ continue;
374
+ }
375
+ const contentUrl = attachment.content?.trim() ?? '';
376
+ const thumbnailUrl = attachment.thumbnail?.trim() ?? '';
377
+ const canonicalUrl = buildJiraAttachmentContentUrl({
378
+ config,
379
+ attachmentId,
380
+ contentUrl,
381
+ });
382
+ if (!canonicalUrl) {
383
+ continue;
384
+ }
385
+ const originalName = attachment.filename?.trim() || getOriginalNameFromUrl(attachment.content?.trim() ?? canonicalUrl);
386
+ const aliases = [
387
+ contentUrl,
388
+ attachment.thumbnail?.trim() ?? '',
389
+ canonicalUrl,
390
+ ];
391
+ for (const alias of aliases) {
392
+ if (!alias) {
393
+ continue;
394
+ }
395
+ matches.set(alias, {
396
+ attachmentId,
397
+ canonicalUrl,
398
+ originalName,
399
+ declaredMimeType: mimeType || null,
400
+ contentUrl: contentUrl || null,
401
+ thumbnailUrl: thumbnailUrl || null,
402
+ });
403
+ }
404
+ }
405
+ return matches;
406
+ };
407
+ const normalizeJiraAttachmentBackedCandidates = (candidates, attachmentUrlMatchMap) => {
408
+ return candidates.map(candidate => {
409
+ const matchedAttachment = attachmentUrlMatchMap.get(candidate.url.trim());
410
+ if (!matchedAttachment) {
411
+ return candidate;
412
+ }
413
+ return {
414
+ ...candidate,
415
+ url: matchedAttachment.canonicalUrl,
416
+ original_name: candidate.original_name ?? matchedAttachment.originalName,
417
+ jira_attachment_id: matchedAttachment.attachmentId,
418
+ jira_declared_mime_type: matchedAttachment.declaredMimeType,
419
+ jira_content_url: matchedAttachment.contentUrl,
420
+ jira_thumbnail_url: matchedAttachment.thumbnailUrl,
421
+ };
422
+ });
423
+ };
323
424
  const dedupeImportedIssueImageCandidates = (candidates) => {
324
- const seenUrls = new Set();
325
- return candidates.filter(candidate => {
425
+ const deduped = [];
426
+ const dedupedByKey = new Map();
427
+ for (const candidate of candidates) {
326
428
  const normalizedUrl = candidate.url.trim();
327
- if (!normalizedUrl || seenUrls.has(normalizedUrl)) {
328
- return false;
429
+ if (!normalizedUrl) {
430
+ continue;
329
431
  }
330
- seenUrls.add(normalizedUrl);
331
- return true;
332
- });
432
+ const normalizedAttachmentId = candidate.jira_attachment_id?.trim() ?? '';
433
+ const dedupeKey = normalizedAttachmentId
434
+ ? `jira:${normalizedAttachmentId}`
435
+ : `url:${normalizedUrl}`;
436
+ const existingIndex = dedupedByKey.get(dedupeKey);
437
+ if (existingIndex === undefined) {
438
+ dedupedByKey.set(dedupeKey, deduped.length);
439
+ deduped.push({
440
+ ...candidate,
441
+ url: normalizedUrl,
442
+ jira_attachment_id: normalizedAttachmentId || null,
443
+ jira_declared_mime_type: candidate.jira_declared_mime_type?.trim().toLowerCase() || null,
444
+ jira_content_url: candidate.jira_content_url?.trim() || null,
445
+ jira_thumbnail_url: candidate.jira_thumbnail_url?.trim() || null,
446
+ strip_texts: Array.from(new Set(candidate.strip_texts.filter(Boolean))),
447
+ });
448
+ continue;
449
+ }
450
+ const existing = deduped[existingIndex];
451
+ existing.original_name = existing.original_name ?? candidate.original_name;
452
+ existing.jira_declared_mime_type = existing.jira_declared_mime_type ?? candidate.jira_declared_mime_type?.trim().toLowerCase() ?? null;
453
+ existing.jira_content_url = existing.jira_content_url ?? candidate.jira_content_url?.trim() ?? null;
454
+ existing.jira_thumbnail_url = existing.jira_thumbnail_url ?? candidate.jira_thumbnail_url?.trim() ?? null;
455
+ existing.strip_texts = Array.from(new Set([...existing.strip_texts, ...candidate.strip_texts.filter(Boolean)]));
456
+ }
457
+ return deduped;
333
458
  };
334
459
  const buildJiraImportedDraft = (issue, config, allowlistedFields = [], fallbackIssueKey = '') => {
335
460
  const issueId = typeof issue.id === 'string' ? issue.id : '';
@@ -343,13 +468,14 @@ const buildJiraImportedDraft = (issue, config, allowlistedFields = [], fallbackI
343
468
  const description = normalizeJiraDescription(issue.fields?.description);
344
469
  const comments = normalizeJiraComments(issue.fields?.comment?.comments);
345
470
  const nextSourceOrder = { value: 0 };
471
+ const attachmentUrlMatchMap = buildJiraAttachmentUrlMatchMap(config, issue.fields?.attachment);
346
472
  const imageCandidates = dedupeImportedIssueImageCandidates([
347
- ...collectJiraImageCandidates(issue.fields?.description, nextSourceOrder),
473
+ ...normalizeJiraAttachmentBackedCandidates(collectJiraImageCandidates(issue.fields?.description, nextSourceOrder), attachmentUrlMatchMap),
348
474
  ...((issue.fields?.comment?.comments ?? [])
349
475
  .filter(comment => isHumanJiraCommentAuthor(comment.author))
350
476
  .slice(-10)
351
- .flatMap(comment => collectJiraImageCandidates(comment.body, nextSourceOrder))),
352
- ...collectJiraAttachmentImageCandidates(issue.fields?.attachment, nextSourceOrder),
477
+ .flatMap(comment => normalizeJiraAttachmentBackedCandidates(collectJiraImageCandidates(comment.body, nextSourceOrder), attachmentUrlMatchMap))),
478
+ ...collectJiraAttachmentImageCandidates(config, issue.fields?.attachment, nextSourceOrder),
353
479
  ]);
354
480
  const issueUrl = buildIssueUrl(config.base_url, issueKey);
355
481
  const additionalFieldSections = allowlistedFields