github-issue-tower-defence-management 1.74.0 → 1.75.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.
- package/CHANGELOG.md +14 -0
- package/README.md +10 -0
- package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js +66 -25
- package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js.map +1 -1
- package/bin/adapter/repositories/KyHttpRepository.js +16 -0
- package/bin/adapter/repositories/KyHttpRepository.js.map +1 -0
- package/bin/domain/usecases/DailySecurityScanUseCase.js +108 -0
- package/bin/domain/usecases/DailySecurityScanUseCase.js.map +1 -0
- package/bin/domain/usecases/HandleScheduledEventUseCase.js +18 -3
- package/bin/domain/usecases/HandleScheduledEventUseCase.js.map +1 -1
- package/bin/domain/usecases/RevertNotReadyAwaitingQualityCheckUseCase.js +1 -1
- package/bin/domain/usecases/RevertNotReadyAwaitingQualityCheckUseCase.js.map +1 -1
- package/bin/domain/usecases/adapter-interfaces/HttpRepository.js +3 -0
- package/bin/domain/usecases/adapter-interfaces/HttpRepository.js.map +1 -0
- package/bin/domain/usecases/resolveLabelsAsLlmAgentName.js +8 -0
- package/bin/domain/usecases/resolveLabelsAsLlmAgentName.js.map +1 -0
- package/package.json +1 -1
- package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts +11 -0
- package/src/adapter/repositories/KyHttpRepository.ts +8 -0
- package/src/domain/usecases/DailySecurityScanUseCase.test.ts +412 -0
- package/src/domain/usecases/DailySecurityScanUseCase.ts +200 -0
- package/src/domain/usecases/HandleScheduledEventUseCase.test.ts +3 -0
- package/src/domain/usecases/HandleScheduledEventUseCase.ts +23 -4
- package/src/domain/usecases/RevertNotReadyAwaitingQualityCheckUseCase.test.ts +93 -0
- package/src/domain/usecases/RevertNotReadyAwaitingQualityCheckUseCase.ts +5 -1
- package/src/domain/usecases/adapter-interfaces/HttpRepository.ts +3 -0
- package/src/domain/usecases/resolveLabelsAsLlmAgentName.test.ts +42 -0
- package/src/domain/usecases/resolveLabelsAsLlmAgentName.ts +6 -0
- package/types/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.d.ts.map +1 -1
- package/types/adapter/repositories/KyHttpRepository.d.ts +5 -0
- package/types/adapter/repositories/KyHttpRepository.d.ts.map +1 -0
- package/types/domain/usecases/DailySecurityScanUseCase.d.ts +25 -0
- package/types/domain/usecases/DailySecurityScanUseCase.d.ts.map +1 -0
- package/types/domain/usecases/HandleScheduledEventUseCase.d.ts +5 -1
- package/types/domain/usecases/HandleScheduledEventUseCase.d.ts.map +1 -1
- package/types/domain/usecases/RevertNotReadyAwaitingQualityCheckUseCase.d.ts +1 -0
- package/types/domain/usecases/RevertNotReadyAwaitingQualityCheckUseCase.d.ts.map +1 -1
- package/types/domain/usecases/adapter-interfaces/HttpRepository.d.ts +4 -0
- package/types/domain/usecases/adapter-interfaces/HttpRepository.d.ts.map +1 -0
- package/types/domain/usecases/resolveLabelsAsLlmAgentName.d.ts +5 -0
- package/types/domain/usecases/resolveLabelsAsLlmAgentName.d.ts.map +1 -0
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { LocalCommandRunner } from './adapter-interfaces/LocalCommandRunner';
|
|
2
|
+
import { IssueRepository } from './adapter-interfaces/IssueRepository';
|
|
3
|
+
import { HttpRepository } from './adapter-interfaces/HttpRepository';
|
|
4
|
+
import { Member } from '../entities/Member';
|
|
5
|
+
|
|
6
|
+
export type DailySecurityScanConfig = {
|
|
7
|
+
scanBaseDirectory: string;
|
|
8
|
+
targetHourUtc: number;
|
|
9
|
+
enableKevNvdReport?: boolean;
|
|
10
|
+
kevReportRepo?: string;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
type KevVulnerability = {
|
|
14
|
+
cveID: string;
|
|
15
|
+
vulnerabilityName: string;
|
|
16
|
+
dateAdded: string;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
type KevCatalog = {
|
|
20
|
+
vulnerabilities: KevVulnerability[];
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const isKevVulnerability = (value: unknown): value is KevVulnerability => {
|
|
24
|
+
if (typeof value !== 'object' || value === null) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
const record: Record<string, unknown> = { ...value };
|
|
28
|
+
return (
|
|
29
|
+
typeof record.cveID === 'string' &&
|
|
30
|
+
typeof record.vulnerabilityName === 'string' &&
|
|
31
|
+
typeof record.dateAdded === 'string'
|
|
32
|
+
);
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const isKevCatalog = (value: unknown): value is KevCatalog => {
|
|
36
|
+
if (typeof value !== 'object' || value === null) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
const record: Record<string, unknown> = { ...value };
|
|
40
|
+
return (
|
|
41
|
+
Array.isArray(record.vulnerabilities) &&
|
|
42
|
+
record.vulnerabilities.every(isKevVulnerability)
|
|
43
|
+
);
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const KEV_CATALOG_URL =
|
|
47
|
+
'https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json';
|
|
48
|
+
|
|
49
|
+
export class DailySecurityScanUseCase {
|
|
50
|
+
constructor(
|
|
51
|
+
readonly localCommandRunner: LocalCommandRunner,
|
|
52
|
+
readonly issueRepository: Pick<IssueRepository, 'createNewIssue'>,
|
|
53
|
+
readonly httpRepository: HttpRepository,
|
|
54
|
+
) {}
|
|
55
|
+
|
|
56
|
+
run = async (input: {
|
|
57
|
+
targetDates: Date[];
|
|
58
|
+
org: string;
|
|
59
|
+
manager: Member['name'];
|
|
60
|
+
dailySecurityScan: DailySecurityScanConfig;
|
|
61
|
+
}): Promise<void> => {
|
|
62
|
+
const shouldRun = input.targetDates.some(
|
|
63
|
+
(targetDate) =>
|
|
64
|
+
targetDate.getUTCHours() === input.dailySecurityScan.targetHourUtc &&
|
|
65
|
+
targetDate.getUTCMinutes() === 0,
|
|
66
|
+
);
|
|
67
|
+
if (!shouldRun) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const lastTargetDate = input.targetDates[input.targetDates.length - 1];
|
|
72
|
+
const today = lastTargetDate.toISOString().slice(0, 10);
|
|
73
|
+
|
|
74
|
+
await this.scanRepositories(
|
|
75
|
+
input.org,
|
|
76
|
+
input.manager,
|
|
77
|
+
today,
|
|
78
|
+
input.dailySecurityScan,
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
await this.reportKevAdditions(
|
|
82
|
+
input.org,
|
|
83
|
+
input.manager,
|
|
84
|
+
lastTargetDate,
|
|
85
|
+
input.dailySecurityScan,
|
|
86
|
+
);
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
private scanRepositories = async (
|
|
90
|
+
org: string,
|
|
91
|
+
manager: Member['name'],
|
|
92
|
+
today: string,
|
|
93
|
+
config: DailySecurityScanConfig,
|
|
94
|
+
): Promise<void> => {
|
|
95
|
+
const { stdout: findOutput } = await this.localCommandRunner.runCommand(
|
|
96
|
+
'find',
|
|
97
|
+
[
|
|
98
|
+
config.scanBaseDirectory,
|
|
99
|
+
'-mindepth',
|
|
100
|
+
'4',
|
|
101
|
+
'-maxdepth',
|
|
102
|
+
'4',
|
|
103
|
+
'-name',
|
|
104
|
+
'.git',
|
|
105
|
+
'-type',
|
|
106
|
+
'd',
|
|
107
|
+
],
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
const repositoryDirectories = findOutput
|
|
111
|
+
.split('\n')
|
|
112
|
+
.filter((line) => line.length > 0)
|
|
113
|
+
.map((gitDirectory) => gitDirectory.replace(/\/\.git$/, ''));
|
|
114
|
+
|
|
115
|
+
for (const repositoryDirectory of repositoryDirectories) {
|
|
116
|
+
const { stdout: remoteUrl, exitCode: remoteExitCode } =
|
|
117
|
+
await this.localCommandRunner.runCommand('git', [
|
|
118
|
+
'-C',
|
|
119
|
+
repositoryDirectory,
|
|
120
|
+
'remote',
|
|
121
|
+
'get-url',
|
|
122
|
+
'origin',
|
|
123
|
+
]);
|
|
124
|
+
if (remoteExitCode !== 0) {
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const remoteMatch = remoteUrl
|
|
129
|
+
.trim()
|
|
130
|
+
.match(/github\.com[:/]([^/]+)\/([^/.]+)/);
|
|
131
|
+
if (!remoteMatch || remoteMatch[1] !== org) {
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
const repositoryOrg = remoteMatch[1];
|
|
135
|
+
const repositoryName = remoteMatch[2];
|
|
136
|
+
|
|
137
|
+
const { stdout: scanOutput, exitCode: scanExitCode } =
|
|
138
|
+
await this.localCommandRunner.runCommand('osv-scanner', [
|
|
139
|
+
'scan',
|
|
140
|
+
'source',
|
|
141
|
+
'-r',
|
|
142
|
+
repositoryDirectory,
|
|
143
|
+
]);
|
|
144
|
+
if (scanExitCode !== 1) {
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
await this.issueRepository.createNewIssue(
|
|
149
|
+
repositoryOrg,
|
|
150
|
+
repositoryName,
|
|
151
|
+
`Daily security scan findings: ${today}`,
|
|
152
|
+
`## OSV-Scanner findings\n\n\`\`\`\n${scanOutput}\n\`\`\``,
|
|
153
|
+
[manager],
|
|
154
|
+
[],
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
private reportKevAdditions = async (
|
|
160
|
+
org: string,
|
|
161
|
+
manager: Member['name'],
|
|
162
|
+
lastTargetDate: Date,
|
|
163
|
+
config: DailySecurityScanConfig,
|
|
164
|
+
): Promise<void> => {
|
|
165
|
+
if (!config.enableKevNvdReport || !config.kevReportRepo) {
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
const yesterday = new Date(lastTargetDate);
|
|
170
|
+
yesterday.setUTCDate(yesterday.getUTCDate() - 1);
|
|
171
|
+
const yesterdayYmd = yesterday.toISOString().slice(0, 10);
|
|
172
|
+
|
|
173
|
+
const kevJson = await this.httpRepository.get(KEV_CATALOG_URL);
|
|
174
|
+
const parsedKev: unknown = JSON.parse(kevJson);
|
|
175
|
+
if (!isKevCatalog(parsedKev)) {
|
|
176
|
+
throw new Error(
|
|
177
|
+
`Unexpected CISA KEV catalog format from ${KEV_CATALOG_URL}`,
|
|
178
|
+
);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
const newKevEntries = parsedKev.vulnerabilities
|
|
182
|
+
.filter((vulnerability) => vulnerability.dateAdded >= yesterdayYmd)
|
|
183
|
+
.map(
|
|
184
|
+
(vulnerability) =>
|
|
185
|
+
`- ${vulnerability.dateAdded} ${vulnerability.cveID} ${vulnerability.vulnerabilityName}`,
|
|
186
|
+
);
|
|
187
|
+
if (newKevEntries.length === 0) {
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
await this.issueRepository.createNewIssue(
|
|
192
|
+
org,
|
|
193
|
+
config.kevReportRepo,
|
|
194
|
+
`CISA KEV new additions since ${yesterdayYmd}`,
|
|
195
|
+
newKevEntries.join('\n'),
|
|
196
|
+
[manager],
|
|
197
|
+
[],
|
|
198
|
+
);
|
|
199
|
+
};
|
|
200
|
+
}
|
|
@@ -25,6 +25,7 @@ import { RevertOrphanedPreparationUseCase } from './RevertOrphanedPreparationUse
|
|
|
25
25
|
import { RevertNotReadyAwaitingQualityCheckUseCase } from './RevertNotReadyAwaitingQualityCheckUseCase';
|
|
26
26
|
import { SetupTowerDefenceProjectUseCase } from './SetupTowerDefenceProjectUseCase';
|
|
27
27
|
import { UpdateRateLimitCacheUseCase } from './UpdateRateLimitCacheUseCase';
|
|
28
|
+
import { DailySecurityScanUseCase } from './DailySecurityScanUseCase';
|
|
28
29
|
|
|
29
30
|
describe('HandleScheduledEventUseCase', () => {
|
|
30
31
|
describe('createTargetDateTimes', () => {
|
|
@@ -117,6 +118,7 @@ describe('HandleScheduledEventUseCase', () => {
|
|
|
117
118
|
const mockRevertNotReadyAwaitingQualityCheckUseCase =
|
|
118
119
|
mock<RevertNotReadyAwaitingQualityCheckUseCase>();
|
|
119
120
|
const mockUpdateRateLimitCacheUseCase = mock<UpdateRateLimitCacheUseCase>();
|
|
121
|
+
const mockDailySecurityScanUseCase = mock<DailySecurityScanUseCase>();
|
|
120
122
|
const mockDateRepository = mock<DateRepository>();
|
|
121
123
|
const mockSpreadsheetRepository = mock<SpreadsheetRepository>();
|
|
122
124
|
const mockProjectRepository = mock<ProjectRepository>();
|
|
@@ -142,6 +144,7 @@ describe('HandleScheduledEventUseCase', () => {
|
|
|
142
144
|
mockRevertOrphanedPreparationUseCase,
|
|
143
145
|
mockRevertNotReadyAwaitingQualityCheckUseCase,
|
|
144
146
|
mockUpdateRateLimitCacheUseCase,
|
|
147
|
+
mockDailySecurityScanUseCase,
|
|
145
148
|
mockDateRepository,
|
|
146
149
|
mockSpreadsheetRepository,
|
|
147
150
|
mockProjectRepository,
|
|
@@ -26,8 +26,13 @@ import {
|
|
|
26
26
|
} from './StartPreparationUseCase';
|
|
27
27
|
import { RevertOrphanedPreparationUseCase } from './RevertOrphanedPreparationUseCase';
|
|
28
28
|
import { RevertNotReadyAwaitingQualityCheckUseCase } from './RevertNotReadyAwaitingQualityCheckUseCase';
|
|
29
|
+
import { resolveLabelsAsLlmAgentName } from './resolveLabelsAsLlmAgentName';
|
|
29
30
|
import { SetupTowerDefenceProjectUseCase } from './SetupTowerDefenceProjectUseCase';
|
|
30
31
|
import { UpdateRateLimitCacheUseCase } from './UpdateRateLimitCacheUseCase';
|
|
32
|
+
import {
|
|
33
|
+
DailySecurityScanConfig,
|
|
34
|
+
DailySecurityScanUseCase,
|
|
35
|
+
} from './DailySecurityScanUseCase';
|
|
31
36
|
|
|
32
37
|
export class ProjectNotFoundError extends Error {
|
|
33
38
|
constructor(message: string) {
|
|
@@ -59,6 +64,7 @@ export class HandleScheduledEventUseCase {
|
|
|
59
64
|
readonly revertOrphanedPreparationUseCase: RevertOrphanedPreparationUseCase,
|
|
60
65
|
readonly revertNotReadyAwaitingQualityCheckUseCase: RevertNotReadyAwaitingQualityCheckUseCase,
|
|
61
66
|
readonly updateRateLimitCacheUseCase: UpdateRateLimitCacheUseCase | null,
|
|
67
|
+
readonly dailySecurityScanUseCase: DailySecurityScanUseCase | null,
|
|
62
68
|
readonly dateRepository: DateRepository,
|
|
63
69
|
readonly spreadsheetRepository: SpreadsheetRepository,
|
|
64
70
|
readonly projectRepository: ProjectRepository,
|
|
@@ -78,6 +84,7 @@ export class HandleScheduledEventUseCase {
|
|
|
78
84
|
urlOfStoryView: string;
|
|
79
85
|
disabled: boolean;
|
|
80
86
|
allowIssueCacheMinutes: number;
|
|
87
|
+
labelsAsLlmAgentName?: string[] | null;
|
|
81
88
|
startPreparation?: {
|
|
82
89
|
defaultAgentName: string;
|
|
83
90
|
defaultLlmModelName?: string | null;
|
|
@@ -95,6 +102,7 @@ export class HandleScheduledEventUseCase {
|
|
|
95
102
|
labelsAsLlmAgentName?: string[] | null;
|
|
96
103
|
} | null;
|
|
97
104
|
thresholdForAutoReject?: number;
|
|
105
|
+
dailySecurityScan?: DailySecurityScanConfig | null;
|
|
98
106
|
}): Promise<{
|
|
99
107
|
project: Project;
|
|
100
108
|
issues: Issue[];
|
|
@@ -280,10 +288,23 @@ ${JSON.stringify(e)}
|
|
|
280
288
|
storyObjectMap,
|
|
281
289
|
);
|
|
282
290
|
}
|
|
291
|
+
const labelsAsLlmAgentName = resolveLabelsAsLlmAgentName({
|
|
292
|
+
topLevel: input.labelsAsLlmAgentName,
|
|
293
|
+
startPreparation: input.startPreparation?.labelsAsLlmAgentName,
|
|
294
|
+
});
|
|
283
295
|
await this.revertNotReadyAwaitingQualityCheckUseCase.run({
|
|
284
296
|
projectUrl: input.projectUrl,
|
|
285
297
|
allowIssueCacheMinutes: input.allowIssueCacheMinutes,
|
|
298
|
+
labelsAsLlmAgentName,
|
|
286
299
|
});
|
|
300
|
+
if (this.dailySecurityScanUseCase !== null && input.dailySecurityScan) {
|
|
301
|
+
await this.dailySecurityScanUseCase.run({
|
|
302
|
+
targetDates: targetDateTimes,
|
|
303
|
+
org: input.org,
|
|
304
|
+
manager: input.manager,
|
|
305
|
+
dailySecurityScan: input.dailySecurityScan,
|
|
306
|
+
});
|
|
307
|
+
}
|
|
287
308
|
if (input.startPreparation) {
|
|
288
309
|
if (this.updateRateLimitCacheUseCase !== null) {
|
|
289
310
|
await this.updateRateLimitCacheUseCase.run({
|
|
@@ -302,8 +323,7 @@ ${JSON.stringify(e)}
|
|
|
302
323
|
input.startPreparation.awLogStaleThresholdMinutes,
|
|
303
324
|
awaitingQualityCheckStatus:
|
|
304
325
|
input.startPreparation.awaitingQualityCheckStatus ?? undefined,
|
|
305
|
-
labelsAsLlmAgentName
|
|
306
|
-
input.startPreparation.labelsAsLlmAgentName ?? null,
|
|
326
|
+
labelsAsLlmAgentName,
|
|
307
327
|
});
|
|
308
328
|
}
|
|
309
329
|
const preparationResult = await this.startPreparationUseCase.run({
|
|
@@ -321,8 +341,7 @@ ${JSON.stringify(e)}
|
|
|
321
341
|
allowedIssueAuthors: input.startPreparation.allowedIssueAuthors ?? null,
|
|
322
342
|
codexHomeCandidates: input.startPreparation.codexHomeCandidates ?? null,
|
|
323
343
|
allowIssueCacheMinutes: input.allowIssueCacheMinutes,
|
|
324
|
-
labelsAsLlmAgentName
|
|
325
|
-
input.startPreparation.labelsAsLlmAgentName ?? null,
|
|
344
|
+
labelsAsLlmAgentName,
|
|
326
345
|
});
|
|
327
346
|
return { rotationOrder: preparationResult.rotationOrder };
|
|
328
347
|
}
|
|
@@ -189,6 +189,99 @@ describe('RevertNotReadyAwaitingQualityCheckUseCase', () => {
|
|
|
189
189
|
);
|
|
190
190
|
});
|
|
191
191
|
|
|
192
|
+
it('should not revert a story-labeled issue with no linked PR when story is in labelsAsLlmAgentName', async () => {
|
|
193
|
+
const issue = createMockIssue({
|
|
194
|
+
status: 'Awaiting Quality Check',
|
|
195
|
+
labels: ['story'],
|
|
196
|
+
});
|
|
197
|
+
mockIssueRepository.getAllIssues.mockResolvedValue({
|
|
198
|
+
issues: [issue],
|
|
199
|
+
cacheUsed: false,
|
|
200
|
+
});
|
|
201
|
+
mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([]);
|
|
202
|
+
|
|
203
|
+
await useCase.run({
|
|
204
|
+
projectUrl: 'https://github.com/users/user/projects/1',
|
|
205
|
+
allowIssueCacheMinutes: 10,
|
|
206
|
+
labelsAsLlmAgentName: ['story', 'chore', 'accounting'],
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
expect(mockIssueRepository.updateStatus).not.toHaveBeenCalled();
|
|
210
|
+
expect(mockIssueCommentRepository.createComment).not.toHaveBeenCalled();
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
it('should not revert a chore-labeled issue with no linked PR when chore is in labelsAsLlmAgentName', async () => {
|
|
214
|
+
const issue = createMockIssue({
|
|
215
|
+
status: 'Awaiting Quality Check',
|
|
216
|
+
labels: ['chore'],
|
|
217
|
+
});
|
|
218
|
+
mockIssueRepository.getAllIssues.mockResolvedValue({
|
|
219
|
+
issues: [issue],
|
|
220
|
+
cacheUsed: false,
|
|
221
|
+
});
|
|
222
|
+
mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([]);
|
|
223
|
+
|
|
224
|
+
await useCase.run({
|
|
225
|
+
projectUrl: 'https://github.com/users/user/projects/1',
|
|
226
|
+
allowIssueCacheMinutes: 10,
|
|
227
|
+
labelsAsLlmAgentName: ['story', 'chore'],
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
expect(mockIssueRepository.updateStatus).not.toHaveBeenCalled();
|
|
231
|
+
expect(mockIssueCommentRepository.createComment).not.toHaveBeenCalled();
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
it('should still revert a story-labeled issue with no linked PR when labelsAsLlmAgentName is not provided', async () => {
|
|
235
|
+
const issue = createMockIssue({
|
|
236
|
+
status: 'Awaiting Quality Check',
|
|
237
|
+
labels: ['story'],
|
|
238
|
+
});
|
|
239
|
+
mockIssueRepository.getAllIssues.mockResolvedValue({
|
|
240
|
+
issues: [issue],
|
|
241
|
+
cacheUsed: false,
|
|
242
|
+
});
|
|
243
|
+
mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([]);
|
|
244
|
+
|
|
245
|
+
await useCase.run({
|
|
246
|
+
projectUrl: 'https://github.com/users/user/projects/1',
|
|
247
|
+
allowIssueCacheMinutes: 10,
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
expect(mockIssueRepository.updateStatus).toHaveBeenCalledWith(
|
|
251
|
+
mockProject,
|
|
252
|
+
issue,
|
|
253
|
+
'awaiting-workspace-id',
|
|
254
|
+
);
|
|
255
|
+
expect(mockIssueCommentRepository.createComment).toHaveBeenCalledWith(
|
|
256
|
+
issue,
|
|
257
|
+
expect.stringContaining('PULL_REQUEST_NOT_FOUND'),
|
|
258
|
+
);
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
it('should not revert a story-labeled issue with no linked PR when labelsAsLlmAgentName is null', async () => {
|
|
262
|
+
const issue = createMockIssue({
|
|
263
|
+
status: 'Awaiting Quality Check',
|
|
264
|
+
labels: ['story'],
|
|
265
|
+
});
|
|
266
|
+
mockIssueRepository.getAllIssues.mockResolvedValue({
|
|
267
|
+
issues: [issue],
|
|
268
|
+
cacheUsed: false,
|
|
269
|
+
});
|
|
270
|
+
mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([]);
|
|
271
|
+
|
|
272
|
+
await useCase.run({
|
|
273
|
+
projectUrl: 'https://github.com/users/user/projects/1',
|
|
274
|
+
allowIssueCacheMinutes: 10,
|
|
275
|
+
labelsAsLlmAgentName: null,
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
expect(mockIssueRepository.updateStatus).toHaveBeenCalledWith(
|
|
279
|
+
mockProject,
|
|
280
|
+
issue,
|
|
281
|
+
'awaiting-workspace-id',
|
|
282
|
+
);
|
|
283
|
+
});
|
|
284
|
+
|
|
192
285
|
it('should not revert issue when PR is ready', async () => {
|
|
193
286
|
const issue = createMockIssue({
|
|
194
287
|
status: 'Awaiting Quality Check',
|
|
@@ -40,6 +40,7 @@ export class RevertNotReadyAwaitingQualityCheckUseCase {
|
|
|
40
40
|
run = async (params: {
|
|
41
41
|
projectUrl: string;
|
|
42
42
|
allowIssueCacheMinutes: number;
|
|
43
|
+
labelsAsLlmAgentName?: string[] | null;
|
|
43
44
|
}): Promise<void> => {
|
|
44
45
|
const projectId = await this.projectRepository.findProjectIdByUrl(
|
|
45
46
|
params.projectUrl,
|
|
@@ -79,7 +80,10 @@ export class RevertNotReadyAwaitingQualityCheckUseCase {
|
|
|
79
80
|
}
|
|
80
81
|
|
|
81
82
|
const { rejections, approvedPrUrl } =
|
|
82
|
-
await this.issueRejectionEvaluator.evaluate(
|
|
83
|
+
await this.issueRejectionEvaluator.evaluate(
|
|
84
|
+
issue,
|
|
85
|
+
params.labelsAsLlmAgentName ?? [],
|
|
86
|
+
);
|
|
83
87
|
if (rejections.length > 0) {
|
|
84
88
|
await this.issueRepository.updateStatus(
|
|
85
89
|
project,
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { resolveLabelsAsLlmAgentName } from './resolveLabelsAsLlmAgentName';
|
|
2
|
+
|
|
3
|
+
describe('resolveLabelsAsLlmAgentName', () => {
|
|
4
|
+
it('returns the top-level value when it is present', () => {
|
|
5
|
+
expect(
|
|
6
|
+
resolveLabelsAsLlmAgentName({
|
|
7
|
+
topLevel: ['story', 'chore'],
|
|
8
|
+
startPreparation: ['accounting'],
|
|
9
|
+
}),
|
|
10
|
+
).toEqual(['story', 'chore']);
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
it('falls back to the startPreparation value when the top-level value is null', () => {
|
|
14
|
+
expect(
|
|
15
|
+
resolveLabelsAsLlmAgentName({
|
|
16
|
+
topLevel: null,
|
|
17
|
+
startPreparation: ['story', 'chore'],
|
|
18
|
+
}),
|
|
19
|
+
).toEqual(['story', 'chore']);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it('falls back to the startPreparation value when the top-level value is undefined', () => {
|
|
23
|
+
expect(
|
|
24
|
+
resolveLabelsAsLlmAgentName({
|
|
25
|
+
startPreparation: ['story'],
|
|
26
|
+
}),
|
|
27
|
+
).toEqual(['story']);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it('returns an empty array when neither value is present', () => {
|
|
31
|
+
expect(resolveLabelsAsLlmAgentName({})).toEqual([]);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('prefers an empty top-level array over the startPreparation fallback', () => {
|
|
35
|
+
expect(
|
|
36
|
+
resolveLabelsAsLlmAgentName({
|
|
37
|
+
topLevel: [],
|
|
38
|
+
startPreparation: ['story'],
|
|
39
|
+
}),
|
|
40
|
+
).toEqual([]);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HandleScheduledEventUseCaseHandler.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"HandleScheduledEventUseCaseHandler.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AA8B3D,qBAAa,kCAAkC;IAC7C,MAAM,GACJ,gBAAgB,MAAM,EACtB,UAAU,OAAO,KAChB,OAAO,CAAC;QACT,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,EAAE,KAAK,EAAE,CAAC;QAChB,SAAS,EAAE,OAAO,CAAC;QACnB,eAAe,EAAE,IAAI,EAAE,CAAC;KACzB,GAAG,IAAI,CAAC,CAkTP;CACH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KyHttpRepository.d.ts","sourceRoot":"","sources":["../../../src/adapter/repositories/KyHttpRepository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,yDAAyD,CAAC;AAEzF,qBAAa,gBAAiB,YAAW,cAAc;IACrD,GAAG,GAAU,KAAK,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC,CAExC;CACH"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { LocalCommandRunner } from './adapter-interfaces/LocalCommandRunner';
|
|
2
|
+
import { IssueRepository } from './adapter-interfaces/IssueRepository';
|
|
3
|
+
import { HttpRepository } from './adapter-interfaces/HttpRepository';
|
|
4
|
+
import { Member } from '../entities/Member';
|
|
5
|
+
export type DailySecurityScanConfig = {
|
|
6
|
+
scanBaseDirectory: string;
|
|
7
|
+
targetHourUtc: number;
|
|
8
|
+
enableKevNvdReport?: boolean;
|
|
9
|
+
kevReportRepo?: string;
|
|
10
|
+
};
|
|
11
|
+
export declare class DailySecurityScanUseCase {
|
|
12
|
+
readonly localCommandRunner: LocalCommandRunner;
|
|
13
|
+
readonly issueRepository: Pick<IssueRepository, 'createNewIssue'>;
|
|
14
|
+
readonly httpRepository: HttpRepository;
|
|
15
|
+
constructor(localCommandRunner: LocalCommandRunner, issueRepository: Pick<IssueRepository, 'createNewIssue'>, httpRepository: HttpRepository);
|
|
16
|
+
run: (input: {
|
|
17
|
+
targetDates: Date[];
|
|
18
|
+
org: string;
|
|
19
|
+
manager: Member["name"];
|
|
20
|
+
dailySecurityScan: DailySecurityScanConfig;
|
|
21
|
+
}) => Promise<void>;
|
|
22
|
+
private scanRepositories;
|
|
23
|
+
private reportKevAdditions;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=DailySecurityScanUseCase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DailySecurityScanUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/DailySecurityScanUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,MAAM,uBAAuB,GAAG;IACpC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAsCF,qBAAa,wBAAwB;IAEjC,QAAQ,CAAC,kBAAkB,EAAE,kBAAkB;IAC/C,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,gBAAgB,CAAC;IACjE,QAAQ,CAAC,cAAc,EAAE,cAAc;gBAF9B,kBAAkB,EAAE,kBAAkB,EACtC,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,gBAAgB,CAAC,EACxD,cAAc,EAAE,cAAc;IAGzC,GAAG,GAAU,OAAO;QAClB,WAAW,EAAE,IAAI,EAAE,CAAC;QACpB,GAAG,EAAE,MAAM,CAAC;QACZ,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACxB,iBAAiB,EAAE,uBAAuB,CAAC;KAC5C,KAAG,OAAO,CAAC,IAAI,CAAC,CA0Bf;IAEF,OAAO,CAAC,gBAAgB,CAoEtB;IAEF,OAAO,CAAC,kBAAkB,CAwCxB;CACH"}
|
|
@@ -25,6 +25,7 @@ import { RevertOrphanedPreparationUseCase } from './RevertOrphanedPreparationUse
|
|
|
25
25
|
import { RevertNotReadyAwaitingQualityCheckUseCase } from './RevertNotReadyAwaitingQualityCheckUseCase';
|
|
26
26
|
import { SetupTowerDefenceProjectUseCase } from './SetupTowerDefenceProjectUseCase';
|
|
27
27
|
import { UpdateRateLimitCacheUseCase } from './UpdateRateLimitCacheUseCase';
|
|
28
|
+
import { DailySecurityScanConfig, DailySecurityScanUseCase } from './DailySecurityScanUseCase';
|
|
28
29
|
export declare class ProjectNotFoundError extends Error {
|
|
29
30
|
constructor(message: string);
|
|
30
31
|
}
|
|
@@ -48,11 +49,12 @@ export declare class HandleScheduledEventUseCase {
|
|
|
48
49
|
readonly revertOrphanedPreparationUseCase: RevertOrphanedPreparationUseCase;
|
|
49
50
|
readonly revertNotReadyAwaitingQualityCheckUseCase: RevertNotReadyAwaitingQualityCheckUseCase;
|
|
50
51
|
readonly updateRateLimitCacheUseCase: UpdateRateLimitCacheUseCase | null;
|
|
52
|
+
readonly dailySecurityScanUseCase: DailySecurityScanUseCase | null;
|
|
51
53
|
readonly dateRepository: DateRepository;
|
|
52
54
|
readonly spreadsheetRepository: SpreadsheetRepository;
|
|
53
55
|
readonly projectRepository: ProjectRepository;
|
|
54
56
|
readonly issueRepository: IssueRepository;
|
|
55
|
-
constructor(setupTowerDefenceProjectUseCase: SetupTowerDefenceProjectUseCase, actionAnnouncementUseCase: ActionAnnouncementUseCase, setWorkflowManagementIssueToStoryUseCase: SetWorkflowManagementIssueToStoryUseCase, clearPastNextActionUseCase: ClearPastNextActionDateHourUseCase, analyzeProblemByIssueUseCase: AnalyzeProblemByIssueUseCase, analyzeStoriesUseCase: AnalyzeStoriesUseCase, clearDependedIssueURLUseCase: ClearDependedIssueURLUseCase, setDependedIssueUrlForOpenTaskPRsUseCase: SetDependedIssueUrlForOpenTaskPRsUseCase, createEstimationIssueUseCase: CreateEstimationIssueUseCase, convertCheckboxToIssueInStoryIssueUseCase: ConvertCheckboxToIssueInStoryIssueUseCase, changeStatusByStoryColorUseCase: ChangeStatusByStoryColorUseCase, setNoStoryIssueToStoryUseCase: SetNoStoryIssueToStoryUseCase, createNewStoryByLabelUseCase: CreateNewStoryByLabelUseCase, assignNoAssigneeIssueToManagerUseCase: AssignNoAssigneeIssueToManagerUseCase, updateIssueStatusByLabelUseCase: UpdateIssueStatusByLabelUseCase, startPreparationUseCase: StartPreparationUseCase, revertOrphanedPreparationUseCase: RevertOrphanedPreparationUseCase, revertNotReadyAwaitingQualityCheckUseCase: RevertNotReadyAwaitingQualityCheckUseCase, updateRateLimitCacheUseCase: UpdateRateLimitCacheUseCase | null, dateRepository: DateRepository, spreadsheetRepository: SpreadsheetRepository, projectRepository: ProjectRepository, issueRepository: IssueRepository);
|
|
57
|
+
constructor(setupTowerDefenceProjectUseCase: SetupTowerDefenceProjectUseCase, actionAnnouncementUseCase: ActionAnnouncementUseCase, setWorkflowManagementIssueToStoryUseCase: SetWorkflowManagementIssueToStoryUseCase, clearPastNextActionUseCase: ClearPastNextActionDateHourUseCase, analyzeProblemByIssueUseCase: AnalyzeProblemByIssueUseCase, analyzeStoriesUseCase: AnalyzeStoriesUseCase, clearDependedIssueURLUseCase: ClearDependedIssueURLUseCase, setDependedIssueUrlForOpenTaskPRsUseCase: SetDependedIssueUrlForOpenTaskPRsUseCase, createEstimationIssueUseCase: CreateEstimationIssueUseCase, convertCheckboxToIssueInStoryIssueUseCase: ConvertCheckboxToIssueInStoryIssueUseCase, changeStatusByStoryColorUseCase: ChangeStatusByStoryColorUseCase, setNoStoryIssueToStoryUseCase: SetNoStoryIssueToStoryUseCase, createNewStoryByLabelUseCase: CreateNewStoryByLabelUseCase, assignNoAssigneeIssueToManagerUseCase: AssignNoAssigneeIssueToManagerUseCase, updateIssueStatusByLabelUseCase: UpdateIssueStatusByLabelUseCase, startPreparationUseCase: StartPreparationUseCase, revertOrphanedPreparationUseCase: RevertOrphanedPreparationUseCase, revertNotReadyAwaitingQualityCheckUseCase: RevertNotReadyAwaitingQualityCheckUseCase, updateRateLimitCacheUseCase: UpdateRateLimitCacheUseCase | null, dailySecurityScanUseCase: DailySecurityScanUseCase | null, dateRepository: DateRepository, spreadsheetRepository: SpreadsheetRepository, projectRepository: ProjectRepository, issueRepository: IssueRepository);
|
|
56
58
|
run: (input: {
|
|
57
59
|
projectName: string;
|
|
58
60
|
org: string;
|
|
@@ -66,6 +68,7 @@ export declare class HandleScheduledEventUseCase {
|
|
|
66
68
|
urlOfStoryView: string;
|
|
67
69
|
disabled: boolean;
|
|
68
70
|
allowIssueCacheMinutes: number;
|
|
71
|
+
labelsAsLlmAgentName?: string[] | null;
|
|
69
72
|
startPreparation?: {
|
|
70
73
|
defaultAgentName: string;
|
|
71
74
|
defaultLlmModelName?: string | null;
|
|
@@ -83,6 +86,7 @@ export declare class HandleScheduledEventUseCase {
|
|
|
83
86
|
labelsAsLlmAgentName?: string[] | null;
|
|
84
87
|
} | null;
|
|
85
88
|
thresholdForAutoReject?: number;
|
|
89
|
+
dailySecurityScan?: DailySecurityScanConfig | null;
|
|
86
90
|
}) => Promise<{
|
|
87
91
|
project: Project;
|
|
88
92
|
issues: Issue[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HandleScheduledEventUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/HandleScheduledEventUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AACnF,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,wCAAwC,EAAE,MAAM,4CAA4C,CAAC;AACtG,OAAO,EAAE,kCAAkC,EAAE,MAAM,sCAAsC,CAAC;AAC1F,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,wCAAwC,EAAE,MAAM,4CAA4C,CAAC;AACtG,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,yCAAyC,EAAE,MAAM,6CAA6C,CAAC;AACxG,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AACpF,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,qCAAqC,EAAE,MAAM,yCAAyC,CAAC;AAChG,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AACpF,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACxB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,gCAAgC,EAAE,MAAM,oCAAoC,CAAC;AACtF,OAAO,EAAE,yCAAyC,EAAE,MAAM,6CAA6C,CAAC;
|
|
1
|
+
{"version":3,"file":"HandleScheduledEventUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/HandleScheduledEventUseCase.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,7 @@ export declare class RevertNotReadyAwaitingQualityCheckUseCase {
|
|
|
11
11
|
run: (params: {
|
|
12
12
|
projectUrl: string;
|
|
13
13
|
allowIssueCacheMinutes: number;
|
|
14
|
+
labelsAsLlmAgentName?: string[] | null;
|
|
14
15
|
}) => Promise<void>;
|
|
15
16
|
}
|
|
16
17
|
//# sourceMappingURL=RevertNotReadyAwaitingQualityCheckUseCase.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RevertNotReadyAwaitingQualityCheckUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/RevertNotReadyAwaitingQualityCheckUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AAQrF,qBAAa,yCAAyC;IAKlD,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAIlC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAShC,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IAjBzC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAA0B;IAClE,OAAO,CAAC,QAAQ,CAAC,+BAA+B,CAAkC;gBAG/D,iBAAiB,EAAE,IAAI,CACtC,iBAAiB,EACjB,oBAAoB,GAAG,YAAY,CACpC,EACgB,eAAe,EAAE,IAAI,CACpC,eAAe,EACb,cAAc,GACd,cAAc,GACd,oBAAoB,GACpB,oBAAoB,GACpB,gCAAgC,GAChC,oBAAoB,CACvB,EACgB,sBAAsB,EAAE,IAAI,CAC3C,sBAAsB,EACtB,eAAe,CAChB;IAQH,GAAG,GAAU,QAAQ;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,sBAAsB,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"RevertNotReadyAwaitingQualityCheckUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/RevertNotReadyAwaitingQualityCheckUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AAQrF,qBAAa,yCAAyC;IAKlD,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAIlC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAShC,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IAjBzC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAA0B;IAClE,OAAO,CAAC,QAAQ,CAAC,+BAA+B,CAAkC;gBAG/D,iBAAiB,EAAE,IAAI,CACtC,iBAAiB,EACjB,oBAAoB,GAAG,YAAY,CACpC,EACgB,eAAe,EAAE,IAAI,CACpC,eAAe,EACb,cAAc,GACd,cAAc,GACd,oBAAoB,GACpB,oBAAoB,GACpB,gCAAgC,GAChC,oBAAoB,CACvB,EACgB,sBAAsB,EAAE,IAAI,CAC3C,sBAAsB,EACtB,eAAe,CAChB;IAQH,GAAG,GAAU,QAAQ;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,sBAAsB,EAAE,MAAM,CAAC;QAC/B,oBAAoB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;KACxC,KAAG,OAAO,CAAC,IAAI,CAAC,CA6Df;CACH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HttpRepository.d.ts","sourceRoot":"","sources":["../../../../src/domain/usecases/adapter-interfaces/HttpRepository.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACvC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveLabelsAsLlmAgentName.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/resolveLabelsAsLlmAgentName.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,2BAA2B,GAAI,QAAQ;IAClD,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CACpC,KAAG,MAAM,EAET,CAAC"}
|