github-issue-tower-defence-management 1.173.2 → 1.174.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +15 -0
  3. package/bin/adapter/entry-points/cli/index.js +5 -3
  4. package/bin/adapter/entry-points/cli/index.js.map +1 -1
  5. package/bin/adapter/entry-points/console/consoleGithubTokenResolver.js +16 -5
  6. package/bin/adapter/entry-points/console/consoleGithubTokenResolver.js.map +1 -1
  7. package/bin/adapter/entry-points/console/ui-dist/assets/{index-BcnLfodS.js → index-g4SqIzCh.js} +2 -2
  8. package/bin/adapter/entry-points/console/ui-dist/index.html +1 -1
  9. package/bin/adapter/entry-points/console/webServer.js +16 -2
  10. package/bin/adapter/entry-points/console/webServer.js.map +1 -1
  11. package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js +3 -1
  12. package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js.map +1 -1
  13. package/bin/adapter/entry-points/handlers/notifySilentTmuxSessions.js +1 -1
  14. package/bin/adapter/entry-points/handlers/notifySilentTmuxSessions.js.map +1 -1
  15. package/bin/adapter/repositories/LocalCommandIssueAttachmentRepository.js +7 -12
  16. package/bin/adapter/repositories/LocalCommandIssueAttachmentRepository.js.map +1 -1
  17. package/bin/adapter/repositories/TranscriptSessionSubAgentActivityRepository.js +26 -3
  18. package/bin/adapter/repositories/TranscriptSessionSubAgentActivityRepository.js.map +1 -1
  19. package/bin/domain/usecases/HandleScheduledEventUseCase.js +10 -5
  20. package/bin/domain/usecases/HandleScheduledEventUseCase.js.map +1 -1
  21. package/bin/domain/usecases/TriagerApprovalDispatchUseCase.js +142 -0
  22. package/bin/domain/usecases/TriagerApprovalDispatchUseCase.js.map +1 -0
  23. package/bin/domain/usecases/agentReportPrefix.js +5 -0
  24. package/bin/domain/usecases/agentReportPrefix.js.map +1 -0
  25. package/bin/domain/usecases/isPullRequestDeclaredUnnecessary.js +2 -2
  26. package/bin/domain/usecases/isPullRequestDeclaredUnnecessary.js.map +1 -1
  27. package/bin/domain/usecases/isRecord.js +6 -0
  28. package/bin/domain/usecases/isRecord.js.map +1 -0
  29. package/package.json +1 -1
  30. package/src/adapter/entry-points/cli/index.ts +8 -4
  31. package/src/adapter/entry-points/console/consoleGithubTokenResolver.test.ts +29 -2
  32. package/src/adapter/entry-points/console/consoleGithubTokenResolver.ts +21 -4
  33. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMarkdownContent.stories.tsx +5 -1
  34. package/src/adapter/entry-points/console/ui/src/features/console/lib/imageProxy.test.ts +8 -5
  35. package/src/adapter/entry-points/console/ui/src/features/console/lib/imageProxy.ts +2 -2
  36. package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsoleItemDetailContainer.tsx +2 -2
  37. package/src/adapter/entry-points/console/ui-dist/assets/{index-BcnLfodS.js → index-g4SqIzCh.js} +2 -2
  38. package/src/adapter/entry-points/console/ui-dist/index.html +1 -1
  39. package/src/adapter/entry-points/console/webServer.test.ts +56 -5
  40. package/src/adapter/entry-points/console/webServer.ts +20 -3
  41. package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts +7 -0
  42. package/src/adapter/entry-points/handlers/notifySilentTmuxSessions.ts +1 -0
  43. package/src/adapter/repositories/LocalCommandIssueAttachmentRepository.test.ts +53 -70
  44. package/src/adapter/repositories/LocalCommandIssueAttachmentRepository.ts +10 -13
  45. package/src/adapter/repositories/TranscriptSessionSubAgentActivityRepository.test.ts +142 -0
  46. package/src/adapter/repositories/TranscriptSessionSubAgentActivityRepository.ts +41 -0
  47. package/src/domain/usecases/HandleScheduledEventUseCase.test.ts +27 -0
  48. package/src/domain/usecases/HandleScheduledEventUseCase.ts +7 -3
  49. package/src/domain/usecases/TriagerApprovalDispatchUseCase.test.ts +879 -0
  50. package/src/domain/usecases/TriagerApprovalDispatchUseCase.ts +247 -0
  51. package/src/domain/usecases/agentReportPrefix.ts +1 -0
  52. package/src/domain/usecases/isPullRequestDeclaredUnnecessary.ts +1 -1
  53. package/src/domain/usecases/isRecord.ts +2 -0
  54. package/types/adapter/entry-points/cli/index.d.ts.map +1 -1
  55. package/types/adapter/entry-points/console/consoleGithubTokenResolver.d.ts +1 -0
  56. package/types/adapter/entry-points/console/consoleGithubTokenResolver.d.ts.map +1 -1
  57. package/types/adapter/entry-points/console/webServer.d.ts +2 -1
  58. package/types/adapter/entry-points/console/webServer.d.ts.map +1 -1
  59. package/types/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.d.ts.map +1 -1
  60. package/types/adapter/entry-points/handlers/notifySilentTmuxSessions.d.ts.map +1 -1
  61. package/types/adapter/repositories/LocalCommandIssueAttachmentRepository.d.ts +3 -2
  62. package/types/adapter/repositories/LocalCommandIssueAttachmentRepository.d.ts.map +1 -1
  63. package/types/adapter/repositories/TranscriptSessionSubAgentActivityRepository.d.ts +3 -1
  64. package/types/adapter/repositories/TranscriptSessionSubAgentActivityRepository.d.ts.map +1 -1
  65. package/types/domain/usecases/HandleScheduledEventUseCase.d.ts +3 -1
  66. package/types/domain/usecases/HandleScheduledEventUseCase.d.ts.map +1 -1
  67. package/types/domain/usecases/TriagerApprovalDispatchUseCase.d.ts +15 -0
  68. package/types/domain/usecases/TriagerApprovalDispatchUseCase.d.ts.map +1 -0
  69. package/types/domain/usecases/agentReportPrefix.d.ts +2 -0
  70. package/types/domain/usecases/agentReportPrefix.d.ts.map +1 -0
  71. package/types/domain/usecases/isRecord.d.ts +2 -0
  72. package/types/domain/usecases/isRecord.d.ts.map +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TriagerApprovalDispatchUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/TriagerApprovalDispatchUseCase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AGENT_REPORT_PREFIX = void 0;
4
+ exports.AGENT_REPORT_PREFIX = 'From: :robot:';
5
+ //# sourceMappingURL=agentReportPrefix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentReportPrefix.js","sourceRoot":"","sources":["../../../src/domain/usecases/agentReportPrefix.ts"],"names":[],"mappings":";;;AAAa,QAAA,mBAAmB,GAAG,eAAe,CAAC"}
@@ -1,12 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.isPullRequestDeclaredUnnecessary = void 0;
4
- const AGENT_REPORT_PREFIX = 'From: :robot:';
4
+ const agentReportPrefix_1 = require("./agentReportPrefix");
5
5
  const isPullRequestDeclaredUnnecessary = (comments, isTrustedAuthor) => {
6
6
  const lastComment = comments[comments.length - 1];
7
7
  if (!lastComment ||
8
8
  !isTrustedAuthor(lastComment.author) ||
9
- !lastComment.content.startsWith(AGENT_REPORT_PREFIX)) {
9
+ !lastComment.content.startsWith(agentReportPrefix_1.AGENT_REPORT_PREFIX)) {
10
10
  return false;
11
11
  }
12
12
  const reportMatch = lastComment.content.match(/```json\n([\s\S]*?)\n```/);
@@ -1 +1 @@
1
- {"version":3,"file":"isPullRequestDeclaredUnnecessary.js","sourceRoot":"","sources":["../../../src/domain/usecases/isPullRequestDeclaredUnnecessary.ts"],"names":[],"mappings":";;;AAAA,MAAM,mBAAmB,GAAG,eAAe,CAAC;AAErC,MAAM,gCAAgC,GAAG,CAC9C,QAA+C,EAC/C,eAA4C,EACnC,EAAE;IACX,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAClD,IACE,CAAC,WAAW;QACZ,CAAC,eAAe,CAAC,WAAW,CAAC,MAAM,CAAC;QACpC,CAAC,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,mBAAmB,CAAC,EACpD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC1E,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,UAAmB,CAAC;IACxB,IAAI,CAAC;QACH,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CACV,iEAAiE,EACjE,KAAK,CACN,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QAC1D,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,MAAM,GAA4B,EAAE,GAAG,UAAU,EAAE,CAAC;IAC1D,OAAO,MAAM,CAAC,mBAAmB,KAAK,KAAK,CAAC;AAC9C,CAAC,CAAC;AA/BW,QAAA,gCAAgC,oCA+B3C"}
1
+ {"version":3,"file":"isPullRequestDeclaredUnnecessary.js","sourceRoot":"","sources":["../../../src/domain/usecases/isPullRequestDeclaredUnnecessary.ts"],"names":[],"mappings":";;;AAAA,2DAA0D;AAEnD,MAAM,gCAAgC,GAAG,CAC9C,QAA+C,EAC/C,eAA4C,EACnC,EAAE;IACX,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAClD,IACE,CAAC,WAAW;QACZ,CAAC,eAAe,CAAC,WAAW,CAAC,MAAM,CAAC;QACpC,CAAC,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,uCAAmB,CAAC,EACpD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC1E,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,UAAmB,CAAC;IACxB,IAAI,CAAC;QACH,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CACV,iEAAiE,EACjE,KAAK,CACN,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QAC1D,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,MAAM,GAA4B,EAAE,GAAG,UAAU,EAAE,CAAC;IAC1D,OAAO,MAAM,CAAC,mBAAmB,KAAK,KAAK,CAAC;AAC9C,CAAC,CAAC;AA/BW,QAAA,gCAAgC,oCA+B3C"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isRecord = void 0;
4
+ const isRecord = (value) => typeof value === 'object' && value !== null;
5
+ exports.isRecord = isRecord;
6
+ //# sourceMappingURL=isRecord.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isRecord.js","sourceRoot":"","sources":["../../../src/domain/usecases/isRecord.ts"],"names":[],"mappings":";;;AAAO,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAoC,EAAE,CAC3E,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AADjC,QAAA,QAAQ,YACyB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "github-issue-tower-defence-management",
3
- "version": "1.173.2",
3
+ "version": "1.174.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "scripts": {
@@ -54,6 +54,7 @@ import {
54
54
  } from '../console/consoleProjectResolver';
55
55
  import {
56
56
  createConsoleGithubTokenResolver,
57
+ createConsoleGithubTokenResolverByItemUrl,
57
58
  createConsoleIssueRepositoryResolver,
58
59
  createConsoleProjectRepositoryResolver,
59
60
  } from '../console/consoleGithubTokenResolver';
@@ -825,9 +826,11 @@ const runServeWeb = async (options: ServeWebOptions): Promise<void> => {
825
826
  ...githubRepositoryParams,
826
827
  );
827
828
 
829
+ const consoleGithubTokenFilesByRepositoryOwner =
830
+ config.consoleGithubTokenFilesByRepositoryOwner ?? null;
828
831
  const resolveGithubToken = createConsoleGithubTokenResolver(
829
832
  token,
830
- config.consoleGithubTokenFilesByRepositoryOwner ?? null,
833
+ consoleGithubTokenFilesByRepositoryOwner,
831
834
  (filePath: string) => fs.readFileSync(filePath, 'utf8'),
832
835
  );
833
836
  const issueRepositoryByToken = new Map<string, IssueRepository>();
@@ -863,6 +866,8 @@ const runServeWeb = async (options: ServeWebOptions): Promise<void> => {
863
866
  resolveGithubToken,
864
867
  buildIssueRepositoryForToken,
865
868
  );
869
+ const resolveGithubTokenForItemUrl =
870
+ createConsoleGithubTokenResolverByItemUrl(resolveGithubToken);
866
871
  const projectRepositoryByToken = new Map<string, GraphqlProjectRepository>();
867
872
  projectRepositoryByToken.set(token, projectRepository);
868
873
  const buildProjectRepositoryForToken = (
@@ -916,15 +921,14 @@ const runServeWeb = async (options: ServeWebOptions): Promise<void> => {
916
921
  dashboardDir,
917
922
  dashboardDataDir,
918
923
  dashboardProjectNames,
919
- githubToken: token,
924
+ resolveGithubToken,
920
925
  issueRepository,
921
926
  resolveIssueRepository,
922
927
  resolveProject,
923
928
  isPjcodeConfigured,
924
929
  issueAttachmentRepository: new LocalCommandIssueAttachmentRepository(
925
930
  new NodeLocalCommandRunner(),
926
- undefined,
927
- resolveGithubToken,
931
+ resolveGithubTokenForItemUrl,
928
932
  ),
929
933
  issueTitleStateCache: new IssueTitleStateCache(),
930
934
  pullRequestStatusCache: new PullRequestStatusCache(),
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  createConsoleGithubTokenResolver,
3
+ createConsoleGithubTokenResolverByItemUrl,
3
4
  createConsoleIssueRepositoryResolver,
4
5
  createConsoleProjectRepositoryResolver,
5
6
  extractProjectOwner,
@@ -50,6 +51,30 @@ describe('createConsoleProjectRepositoryResolver', () => {
50
51
  });
51
52
  });
52
53
 
54
+ describe('createConsoleGithubTokenResolverByItemUrl', () => {
55
+ it('returns the token for the owner of the given item url', () => {
56
+ const resolve = createConsoleGithubTokenResolverByItemUrl(
57
+ (repositoryOwner) => `token-of-${repositoryOwner}`,
58
+ );
59
+
60
+ expect(
61
+ resolve('https://github.com/acme-labs/acme-portal-mock/issues/178'),
62
+ ).toBe('token-of-acme-labs');
63
+ });
64
+
65
+ it('throws when the repository owner cannot be read from the url', () => {
66
+ const resolve = createConsoleGithubTokenResolverByItemUrl(
67
+ (repositoryOwner) => `token-of-${repositoryOwner}`,
68
+ );
69
+
70
+ expect(() =>
71
+ resolve('https://github.com/acme-labs/acme-portal-mock'),
72
+ ).toThrow(
73
+ 'The repository owner cannot be read from the url: https://github.com/acme-labs/acme-portal-mock',
74
+ );
75
+ });
76
+ });
77
+
53
78
  describe('createConsoleIssueRepositoryResolver', () => {
54
79
  it('builds the issue repository from the token of the owner in the url', () => {
55
80
  const resolve = createConsoleIssueRepositoryResolver<string>(
@@ -128,14 +153,16 @@ describe('createConsoleGithubTokenResolver', () => {
128
153
  expect(resolve('acme-labs')).toBe('fine-grained-token');
129
154
  });
130
155
 
131
- it('should keep using the default token for the other owners when one owner has a token file', () => {
156
+ it('should throw when the per-owner token map is provided but the owner has no entry in it', () => {
132
157
  const resolve = createConsoleGithubTokenResolver(
133
158
  'default-token',
134
159
  { 'acme-labs': '/creds/acme-labs-token.txt' },
135
160
  () => 'fine-grained-token',
136
161
  );
137
162
 
138
- expect(resolve('globex-inc')).toBe('default-token');
163
+ expect(() => resolve('globex-inc')).toThrow(
164
+ 'No GitHub token file is configured for repository owner "globex-inc". Add an entry for this owner in consoleGithubTokenFilesByRepositoryOwner.',
165
+ );
139
166
  });
140
167
 
141
168
  it('should read the token file only once per owner', () => {
@@ -50,6 +50,20 @@ export const createConsoleProjectRepositoryResolver = <ProjectRepositoryType>(
50
50
  };
51
51
  };
52
52
 
53
+ export const createConsoleGithubTokenResolverByItemUrl = (
54
+ resolveGithubToken: ConsoleGithubTokenResolver,
55
+ ): ((itemUrl: string) => string) => {
56
+ return (itemUrl: string): string => {
57
+ const owner = extractRepositoryOwner(itemUrl);
58
+ if (owner === null) {
59
+ throw new Error(
60
+ `The repository owner cannot be read from the url: ${itemUrl}`,
61
+ );
62
+ }
63
+ return resolveGithubToken(owner);
64
+ };
65
+ };
66
+
53
67
  export const createConsoleGithubTokenResolver = (
54
68
  defaultToken: string,
55
69
  githubTokenFilePathByRepositoryOwner: Record<string, string> | null,
@@ -61,12 +75,15 @@ export const createConsoleGithubTokenResolver = (
61
75
  if (alreadyResolved !== undefined) {
62
76
  return alreadyResolved;
63
77
  }
64
- const filePath = githubTokenFilePathByRepositoryOwner
65
- ? githubTokenFilePathByRepositoryOwner[repositoryOwner]
66
- : undefined;
67
- if (filePath === undefined) {
78
+ if (githubTokenFilePathByRepositoryOwner === null) {
68
79
  return defaultToken;
69
80
  }
81
+ const filePath = githubTokenFilePathByRepositoryOwner[repositoryOwner];
82
+ if (filePath === undefined) {
83
+ throw new Error(
84
+ `No GitHub token file is configured for repository owner "${repositoryOwner}". Add an entry for this owner in consoleGithubTokenFilesByRepositoryOwner.`,
85
+ );
86
+ }
70
87
  const token = readTokenFile(filePath).trim();
71
88
  if (token.length === 0) {
72
89
  throw new Error(
@@ -35,7 +35,11 @@ export const WithCodeFence: Story = {
35
35
  export const WithProxiedGitHubImages: Story = {
36
36
  args: {
37
37
  body: consoleMarkdownImageBodyFixture,
38
- buildImageProxyUrl: (src) => buildImageProxyUrl(src),
38
+ buildImageProxyUrl: (src) =>
39
+ buildImageProxyUrl(
40
+ src,
41
+ 'https://github.com/example-owner/example-repo/issues/1',
42
+ ),
39
43
  },
40
44
  };
41
45
 
@@ -4,6 +4,8 @@ import {
4
4
  rewriteGitHubImageSources,
5
5
  } from './imageProxy';
6
6
 
7
+ const itemUrl = 'https://github.com/example-owner/example-repo/issues/1';
8
+
7
9
  describe('isProxyableImageUrl', () => {
8
10
  it('matches github user-attachments urls', () => {
9
11
  expect(
@@ -27,21 +29,22 @@ describe('isProxyableImageUrl', () => {
27
29
  });
28
30
 
29
31
  describe('buildImageProxyUrl', () => {
30
- it('encodes the source url without appending a token', () => {
32
+ it('encodes the source url and the item url without appending a token', () => {
31
33
  const src = 'https://github.com/user-attachments/assets/abc?x=1';
32
- expect(buildImageProxyUrl(src)).toBe(
33
- `/api/img?url=${encodeURIComponent(src)}`,
34
+ expect(buildImageProxyUrl(src, itemUrl)).toBe(
35
+ `/api/img?url=${encodeURIComponent(src)}&itemUrl=${encodeURIComponent(itemUrl)}`,
34
36
  );
35
37
  });
36
38
 
37
39
  it('does not include a token query parameter', () => {
38
40
  const src = 'https://github.com/user-attachments/assets/abc';
39
- expect(buildImageProxyUrl(src)).not.toContain('k=');
41
+ expect(buildImageProxyUrl(src, itemUrl)).not.toContain('k=');
40
42
  });
41
43
  });
42
44
 
43
45
  describe('rewriteGitHubImageSources', () => {
44
- const buildProxyUrl = (src: string): string => buildImageProxyUrl(src);
46
+ const buildProxyUrl = (src: string): string =>
47
+ buildImageProxyUrl(src, itemUrl);
45
48
 
46
49
  it('rewrites an allow-listed github image src to the proxy url', () => {
47
50
  const githubSrc = 'https://github.com/user-attachments/assets/abc';
@@ -6,8 +6,8 @@ export const isProxyableImageUrl = (src: string): boolean =>
6
6
 
7
7
  export type ImageProxyUrlBuilder = (src: string) => string;
8
8
 
9
- export const buildImageProxyUrl = (src: string): string =>
10
- `/api/img?url=${encodeURIComponent(src)}`;
9
+ export const buildImageProxyUrl = (src: string, itemUrl: string): string =>
10
+ `/api/img?url=${encodeURIComponent(src)}&itemUrl=${encodeURIComponent(itemUrl)}`;
11
11
 
12
12
  export const rewriteGitHubImageSources = (
13
13
  html: string,
@@ -60,8 +60,8 @@ export const ConsoleItemDetailContainer = ({
60
60
  }: ConsoleItemDetailContainerProps) => {
61
61
  const detail = useConsoleItemDetailData(caches, item);
62
62
  const resolveImageProxyUrl = useCallback(
63
- (src: string): string => buildImageProxyUrl(src),
64
- [],
63
+ (src: string): string => buildImageProxyUrl(src, item.url),
64
+ [item.url],
65
65
  );
66
66
  const renderReferenceLink = useCallback(
67
67
  (href: string, fallbackText: string) => (