github-issue-tower-defence-management 2.6.0 → 2.7.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 +0 -2
- package/bin/adapter/entry-points/cli/index.js +0 -5
- package/bin/adapter/entry-points/cli/index.js.map +1 -1
- package/bin/adapter/entry-points/cli/projectConfig.js +0 -3
- package/bin/adapter/entry-points/cli/projectConfig.js.map +1 -1
- package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js +1 -3
- package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js.map +1 -1
- package/bin/adapter/entry-points/handlers/tokenExhaustionHandover.js +2 -1
- package/bin/adapter/entry-points/handlers/tokenExhaustionHandover.js.map +1 -1
- package/bin/adapter/repositories/GitHubIssueCheckpointRepository.js +37 -0
- package/bin/adapter/repositories/GitHubIssueCheckpointRepository.js.map +1 -0
- package/bin/domain/usecases/CheckIssueReviewReadinessUseCase.js +4 -2
- package/bin/domain/usecases/CheckIssueReviewReadinessUseCase.js.map +1 -1
- package/bin/domain/usecases/HandleScheduledEventUseCase.js +1 -6
- package/bin/domain/usecases/HandleScheduledEventUseCase.js.map +1 -1
- package/bin/domain/usecases/IssueRejectionEvaluator.js +0 -23
- package/bin/domain/usecases/IssueRejectionEvaluator.js.map +1 -1
- package/bin/domain/usecases/NotifyFinishedIssuePreparationUseCase.js +39 -69
- package/bin/domain/usecases/NotifyFinishedIssuePreparationUseCase.js.map +1 -1
- package/bin/domain/usecases/RevertNotReadyReviewQueueIssueUseCase.js +3 -2
- package/bin/domain/usecases/RevertNotReadyReviewQueueIssueUseCase.js.map +1 -1
- package/bin/domain/usecases/RevertOrphanedPreparationUseCase.js +0 -43
- package/bin/domain/usecases/RevertOrphanedPreparationUseCase.js.map +1 -1
- package/bin/domain/usecases/TokenExhaustionHandoverUseCase.js +10 -2
- package/bin/domain/usecases/TokenExhaustionHandoverUseCase.js.map +1 -1
- package/bin/domain/usecases/adapter-interfaces/IssueCheckpointRepository.js +3 -0
- package/bin/domain/usecases/adapter-interfaces/IssueCheckpointRepository.js.map +1 -0
- package/bin/domain/usecases/autoStatusCheckComments.js +1 -11
- package/bin/domain/usecases/autoStatusCheckComments.js.map +1 -1
- package/bin/domain/usecases/extractNextStepAgentFromComments.js +14 -0
- package/bin/domain/usecases/extractNextStepAgentFromComments.js.map +1 -0
- package/bin/domain/usecases/triagerAgentName.js +7 -0
- package/bin/domain/usecases/triagerAgentName.js.map +1 -0
- package/package.json +1 -1
- package/src/adapter/entry-points/cli/index.test.ts +0 -2
- package/src/adapter/entry-points/cli/index.ts +0 -9
- package/src/adapter/entry-points/cli/projectConfig.ts +0 -8
- package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts +0 -7
- package/src/adapter/entry-points/handlers/tokenExhaustionHandover.ts +2 -0
- package/src/adapter/repositories/GitHubIssueCheckpointRepository.test.ts +51 -0
- package/src/adapter/repositories/GitHubIssueCheckpointRepository.ts +47 -0
- package/src/domain/usecases/CheckIssueReviewReadinessUseCase.test.ts +26 -4
- package/src/domain/usecases/CheckIssueReviewReadinessUseCase.ts +5 -3
- package/src/domain/usecases/HandleScheduledEventUseCase.test.ts +0 -28
- package/src/domain/usecases/HandleScheduledEventUseCase.ts +0 -6
- package/src/domain/usecases/IssueRejectionEvaluator.test.ts +0 -119
- package/src/domain/usecases/IssueRejectionEvaluator.ts +0 -21
- package/src/domain/usecases/NotifyFinishedIssuePreparationUseCase.test.ts +185 -327
- package/src/domain/usecases/NotifyFinishedIssuePreparationUseCase.ts +68 -138
- package/src/domain/usecases/RevertNotReadyReviewQueueIssueUseCase.test.ts +4 -4
- package/src/domain/usecases/RevertNotReadyReviewQueueIssueUseCase.ts +11 -5
- package/src/domain/usecases/RevertOrphanedPreparationUseCase.test.ts +0 -313
- package/src/domain/usecases/RevertOrphanedPreparationUseCase.ts +1 -102
- package/src/domain/usecases/TokenExhaustionHandoverUseCase.test.ts +87 -3
- package/src/domain/usecases/TokenExhaustionHandoverUseCase.ts +14 -1
- package/src/domain/usecases/adapter-interfaces/IssueCheckpointRepository.ts +3 -0
- package/src/domain/usecases/autoStatusCheckComments.ts +0 -17
- package/src/domain/usecases/extractNextStepAgentFromComments.ts +13 -0
- package/src/domain/usecases/isHumanComment.test.ts +0 -13
- package/src/domain/usecases/triagerAgentName.ts +4 -0
- package/types/adapter/entry-points/cli/index.d.ts.map +1 -1
- package/types/adapter/entry-points/cli/projectConfig.d.ts +0 -1
- package/types/adapter/entry-points/cli/projectConfig.d.ts.map +1 -1
- package/types/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.d.ts.map +1 -1
- package/types/adapter/entry-points/handlers/tokenExhaustionHandover.d.ts.map +1 -1
- package/types/adapter/repositories/GitHubIssueCheckpointRepository.d.ts +8 -0
- package/types/adapter/repositories/GitHubIssueCheckpointRepository.d.ts.map +1 -0
- package/types/domain/usecases/CheckIssueReviewReadinessUseCase.d.ts.map +1 -1
- package/types/domain/usecases/HandleScheduledEventUseCase.d.ts +1 -3
- package/types/domain/usecases/HandleScheduledEventUseCase.d.ts.map +1 -1
- package/types/domain/usecases/IssueRejectionEvaluator.d.ts +0 -1
- package/types/domain/usecases/IssueRejectionEvaluator.d.ts.map +1 -1
- package/types/domain/usecases/NotifyFinishedIssuePreparationUseCase.d.ts +0 -1
- package/types/domain/usecases/NotifyFinishedIssuePreparationUseCase.d.ts.map +1 -1
- package/types/domain/usecases/RevertNotReadyReviewQueueIssueUseCase.d.ts.map +1 -1
- package/types/domain/usecases/RevertOrphanedPreparationUseCase.d.ts +0 -1
- package/types/domain/usecases/RevertOrphanedPreparationUseCase.d.ts.map +1 -1
- package/types/domain/usecases/TokenExhaustionHandoverUseCase.d.ts +3 -1
- package/types/domain/usecases/TokenExhaustionHandoverUseCase.d.ts.map +1 -1
- package/types/domain/usecases/adapter-interfaces/IssueCheckpointRepository.d.ts +4 -0
- package/types/domain/usecases/adapter-interfaces/IssueCheckpointRepository.d.ts.map +1 -0
- package/types/domain/usecases/autoStatusCheckComments.d.ts +0 -4
- package/types/domain/usecases/autoStatusCheckComments.d.ts.map +1 -1
- package/types/domain/usecases/extractNextStepAgentFromComments.d.ts +5 -0
- package/types/domain/usecases/extractNextStepAgentFromComments.d.ts.map +1 -0
- package/types/domain/usecases/triagerAgentName.d.ts +3 -0
- package/types/domain/usecases/triagerAgentName.d.ts.map +1 -0
- package/src/domain/usecases/TriagerApprovalDispatchUseCase.test.ts +0 -1051
- package/src/domain/usecases/TriagerApprovalDispatchUseCase.ts +0 -274
- package/src/domain/usecases/awaitingOwnerApprovalMessage.ts +0 -5
- package/src/domain/usecases/isPullRequestDeclaredUnnecessary.test.ts +0 -162
- package/src/domain/usecases/isPullRequestDeclaredUnnecessary.ts +0 -29
- package/src/domain/usecases/isWaitingForOwnerApproval.test.ts +0 -91
- package/src/domain/usecases/isWaitingForOwnerApproval.ts +0 -17
- package/src/domain/usecases/returnedToAwaitingWorkspaceMessage.ts +0 -5
|
@@ -11,11 +11,12 @@ exports.TOKEN_EXHAUSTION_SEVEN_DAY_FREE_THRESHOLD = 0.05;
|
|
|
11
11
|
exports.TOKEN_EXHAUSTION_FIVE_HOUR_WARNING_FREE_THRESHOLD = 0.25;
|
|
12
12
|
exports.TOKEN_EXHAUSTION_SEVEN_DAY_WARNING_FREE_THRESHOLD = 0.15;
|
|
13
13
|
class TokenExhaustionHandoverUseCase {
|
|
14
|
-
constructor(handoverSessionRepository, snapshotRepository, tmuxSessionRepository, processSignalRepository) {
|
|
14
|
+
constructor(handoverSessionRepository, snapshotRepository, tmuxSessionRepository, processSignalRepository, issueCheckpointRepository) {
|
|
15
15
|
this.handoverSessionRepository = handoverSessionRepository;
|
|
16
16
|
this.snapshotRepository = snapshotRepository;
|
|
17
17
|
this.tmuxSessionRepository = tmuxSessionRepository;
|
|
18
18
|
this.processSignalRepository = processSignalRepository;
|
|
19
|
+
this.issueCheckpointRepository = issueCheckpointRepository;
|
|
19
20
|
this.run = async (input) => {
|
|
20
21
|
const nowEpochSeconds = Math.floor(input.now.getTime() / 1000);
|
|
21
22
|
const sessions = this.handoverSessionRepository.listHandoverSessions();
|
|
@@ -130,7 +131,13 @@ class TokenExhaustionHandoverUseCase {
|
|
|
130
131
|
};
|
|
131
132
|
this.sendHandover = async (session, input) => {
|
|
132
133
|
if (session.kind === 'implSubagent') {
|
|
133
|
-
|
|
134
|
+
if (session.issueUrl !== null) {
|
|
135
|
+
await this.issueCheckpointRepository.postCheckpoint(session.issueUrl);
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
console.log(`Token exhaustion handover: sending SIGTERM to impl subagent pid=${session.pid} (no issue URL, cannot post checkpoint)`);
|
|
139
|
+
this.processSignalRepository.terminateProcess(session.pid);
|
|
140
|
+
}
|
|
134
141
|
return;
|
|
135
142
|
}
|
|
136
143
|
if (session.sessionName === null) {
|
|
@@ -143,6 +150,7 @@ class TokenExhaustionHandoverUseCase {
|
|
|
143
150
|
};
|
|
144
151
|
this.forceKill = async (session, entry) => {
|
|
145
152
|
if (session.kind === 'implSubagent') {
|
|
153
|
+
this.processSignalRepository.terminateProcess(entry.pid);
|
|
146
154
|
this.processSignalRepository.killProcess(entry.pid);
|
|
147
155
|
return;
|
|
148
156
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TokenExhaustionHandoverUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/TokenExhaustionHandoverUseCase.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"TokenExhaustionHandoverUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/TokenExhaustionHandoverUseCase.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IssueCheckpointRepository.js","sourceRoot":"","sources":["../../../../src/domain/usecases/adapter-interfaces/IssueCheckpointRepository.ts"],"names":[],"mappings":""}
|
|
@@ -1,15 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.AUTO_STATUS_CHECK_MESSAGE_HEAD = void 0;
|
|
4
4
|
exports.AUTO_STATUS_CHECK_MESSAGE_HEAD = 'Auto Status Check:';
|
|
5
|
-
const dropTrailingAutoStatusCheckComments = (comments, isTrustedAuthor) => {
|
|
6
|
-
let endIndex = comments.length;
|
|
7
|
-
while (endIndex > 0 &&
|
|
8
|
-
isTrustedAuthor(comments[endIndex - 1].author) &&
|
|
9
|
-
comments[endIndex - 1].content.startsWith(exports.AUTO_STATUS_CHECK_MESSAGE_HEAD)) {
|
|
10
|
-
endIndex -= 1;
|
|
11
|
-
}
|
|
12
|
-
return comments.slice(0, endIndex);
|
|
13
|
-
};
|
|
14
|
-
exports.dropTrailingAutoStatusCheckComments = dropTrailingAutoStatusCheckComments;
|
|
15
5
|
//# sourceMappingURL=autoStatusCheckComments.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autoStatusCheckComments.js","sourceRoot":"","sources":["../../../src/domain/usecases/autoStatusCheckComments.ts"],"names":[],"mappings":";;;AAAa,QAAA,8BAA8B,GAAG,oBAAoB,CAAC
|
|
1
|
+
{"version":3,"file":"autoStatusCheckComments.js","sourceRoot":"","sources":["../../../src/domain/usecases/autoStatusCheckComments.ts"],"names":[],"mappings":";;;AAAa,QAAA,8BAA8B,GAAG,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.extractNextStepAgentFromComments = void 0;
|
|
4
|
+
const extractNextStepAgent_1 = require("./extractNextStepAgent");
|
|
5
|
+
const findLastAgentReport_1 = require("./findLastAgentReport");
|
|
6
|
+
const extractNextStepAgentFromComments = (comments, isTrustedAuthor) => {
|
|
7
|
+
const lastAgentReport = (0, findLastAgentReport_1.findLastAgentReport)(comments, isTrustedAuthor);
|
|
8
|
+
if (!lastAgentReport) {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
return (0, extractNextStepAgent_1.extractNextStepAgent)(lastAgentReport.content);
|
|
12
|
+
};
|
|
13
|
+
exports.extractNextStepAgentFromComments = extractNextStepAgentFromComments;
|
|
14
|
+
//# sourceMappingURL=extractNextStepAgentFromComments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extractNextStepAgentFromComments.js","sourceRoot":"","sources":["../../../src/domain/usecases/extractNextStepAgentFromComments.ts"],"names":[],"mappings":";;;AAAA,iEAA8D;AAC9D,+DAA4D;AAErD,MAAM,gCAAgC,GAAG,CAC9C,QAA+C,EAC/C,eAA4C,EAC7B,EAAE;IACjB,MAAM,eAAe,GAAG,IAAA,yCAAmB,EAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IACvE,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,IAAA,2CAAoB,EAAC,eAAe,CAAC,OAAO,CAAC,CAAC;AACvD,CAAC,CAAC;AATW,QAAA,gCAAgC,oCAS3C"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isTriagerAgentName = exports.TRIAGER_AGENT_NAME = void 0;
|
|
4
|
+
exports.TRIAGER_AGENT_NAME = 'triager';
|
|
5
|
+
const isTriagerAgentName = (agentName) => agentName !== null && agentName.trim().toLowerCase() === exports.TRIAGER_AGENT_NAME;
|
|
6
|
+
exports.isTriagerAgentName = isTriagerAgentName;
|
|
7
|
+
//# sourceMappingURL=triagerAgentName.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triagerAgentName.js","sourceRoot":"","sources":["../../../src/domain/usecases/triagerAgentName.ts"],"names":[],"mappings":";;;AAAa,QAAA,kBAAkB,GAAG,SAAS,CAAC;AAErC,MAAM,kBAAkB,GAAG,CAAC,SAAwB,EAAW,EAAE,CACtE,SAAS,KAAK,IAAI,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,0BAAkB,CAAC;AADjE,QAAA,kBAAkB,sBAC+C"}
|
package/package.json
CHANGED
|
@@ -1527,7 +1527,6 @@ mysteryKey: 'value'
|
|
|
1527
1527
|
manager: 'test-manager',
|
|
1528
1528
|
developerAgentName: null,
|
|
1529
1529
|
deferPreparation: null,
|
|
1530
|
-
ownerApprovalTimeoutCycles: 12,
|
|
1531
1530
|
});
|
|
1532
1531
|
});
|
|
1533
1532
|
|
|
@@ -1572,7 +1571,6 @@ mysteryKey: 'value'
|
|
|
1572
1571
|
manager: 'test-manager',
|
|
1573
1572
|
developerAgentName: null,
|
|
1574
1573
|
deferPreparation: null,
|
|
1575
|
-
ownerApprovalTimeoutCycles: 12,
|
|
1576
1574
|
});
|
|
1577
1575
|
});
|
|
1578
1576
|
|
|
@@ -122,7 +122,6 @@ type NotifyFinishedOptions = {
|
|
|
122
122
|
missingAgentName?: string;
|
|
123
123
|
sessionErrorLine?: string;
|
|
124
124
|
deferPreparation?: boolean;
|
|
125
|
-
ownerApprovalTimeoutCycles?: string;
|
|
126
125
|
};
|
|
127
126
|
|
|
128
127
|
type CheckIssueReviewReadinessOptions = {
|
|
@@ -484,7 +483,6 @@ program
|
|
|
484
483
|
labelsAsLlmAgentName: config.labelsAsLlmAgentName ?? null,
|
|
485
484
|
labelsNotRequiringPullRequest:
|
|
486
485
|
config.labelsNotRequiringPullRequest ?? null,
|
|
487
|
-
ownerApprovalTimeoutCycles: config.ownerApprovalTimeoutCycles ?? 12,
|
|
488
486
|
});
|
|
489
487
|
}
|
|
490
488
|
|
|
@@ -585,10 +583,6 @@ program
|
|
|
585
583
|
'--deferPreparation',
|
|
586
584
|
'Defer the item via the Reactivation Trigger fields (sets nextActionDate to tomorrow) without creating any issue; use for transient upstream failures',
|
|
587
585
|
)
|
|
588
|
-
.option(
|
|
589
|
-
'--ownerApprovalTimeoutCycles <count>',
|
|
590
|
-
'Number of owner-approval wait cycles before escalating to Failed Preparation (default: 12)',
|
|
591
|
-
)
|
|
592
586
|
.action(async (options: NotifyFinishedOptions) => {
|
|
593
587
|
const token = process.env.GH_TOKEN;
|
|
594
588
|
if (!token) {
|
|
@@ -730,9 +724,6 @@ program
|
|
|
730
724
|
manager: config.manager ?? null,
|
|
731
725
|
developerAgentName: config.developerAgentName ?? null,
|
|
732
726
|
deferPreparation: options.deferPreparation ?? null,
|
|
733
|
-
ownerApprovalTimeoutCycles: options.ownerApprovalTimeoutCycles
|
|
734
|
-
? Number(options.ownerApprovalTimeoutCycles)
|
|
735
|
-
: (config.ownerApprovalTimeoutCycles ?? 12),
|
|
736
727
|
});
|
|
737
728
|
});
|
|
738
729
|
|
|
@@ -32,7 +32,6 @@ export type ConfigFile = {
|
|
|
32
32
|
consoleProjects?: Record<string, string>;
|
|
33
33
|
consoleGithubTokenFileDir?: string;
|
|
34
34
|
disks?: DiskConfig[];
|
|
35
|
-
ownerApprovalTimeoutCycles?: number;
|
|
36
35
|
errorReportingRepository?: string;
|
|
37
36
|
};
|
|
38
37
|
|
|
@@ -209,10 +208,6 @@ export const loadConfigFile = (configFilePath: string): ConfigFile => {
|
|
|
209
208
|
'consoleGithubTokenFileDir',
|
|
210
209
|
),
|
|
211
210
|
disks: getDisksValue(parsed, 'disks'),
|
|
212
|
-
ownerApprovalTimeoutCycles: getNumberValue(
|
|
213
|
-
parsed,
|
|
214
|
-
'ownerApprovalTimeoutCycles',
|
|
215
|
-
),
|
|
216
211
|
errorReportingRepository: getStringValue(
|
|
217
212
|
parsed,
|
|
218
213
|
'errorReportingRepository',
|
|
@@ -410,9 +405,6 @@ export const mergeConfigs = (
|
|
|
410
405
|
cliOverrides.consoleGithubTokenFileDir ??
|
|
411
406
|
configFile.consoleGithubTokenFileDir,
|
|
412
407
|
disks: cliOverrides.disks ?? configFile.disks,
|
|
413
|
-
ownerApprovalTimeoutCycles:
|
|
414
|
-
cliOverrides.ownerApprovalTimeoutCycles ??
|
|
415
|
-
configFile.ownerApprovalTimeoutCycles,
|
|
416
408
|
errorReportingRepository:
|
|
417
409
|
readmeOverrides.errorReportingRepository ??
|
|
418
410
|
cliOverrides.errorReportingRepository ??
|
|
@@ -74,7 +74,6 @@ import { ProxyRateLimitCacheRepository } from '../../repositories/ProxyRateLimit
|
|
|
74
74
|
import { UpdateRateLimitCacheUseCase } from '../../../domain/usecases/UpdateRateLimitCacheUseCase';
|
|
75
75
|
import { RevertOrphanedPreparationUseCase } from '../../../domain/usecases/RevertOrphanedPreparationUseCase';
|
|
76
76
|
import { RevertNotReadyReviewQueueIssueUseCase } from '../../../domain/usecases/RevertNotReadyReviewQueueIssueUseCase';
|
|
77
|
-
import { TriagerApprovalDispatchUseCase } from '../../../domain/usecases/TriagerApprovalDispatchUseCase';
|
|
78
77
|
import { AgentDesignationLabelAdoptUseCase } from '../../../domain/usecases/AgentDesignationLabelAdoptUseCase';
|
|
79
78
|
import { GitHubIssueCommentRepository } from '../../repositories/GitHubIssueCommentRepository';
|
|
80
79
|
import { ProjectRequiredFieldCreateUseCase } from '../../../domain/usecases/ProjectRequiredFieldCreateUseCase';
|
|
@@ -528,11 +527,6 @@ export class HandleScheduledEventUseCaseHandler {
|
|
|
528
527
|
issueRepository,
|
|
529
528
|
issueCommentRepository,
|
|
530
529
|
);
|
|
531
|
-
const triagerApprovalDispatchUseCase = new TriagerApprovalDispatchUseCase(
|
|
532
|
-
projectRepository,
|
|
533
|
-
issueRepository,
|
|
534
|
-
issueCommentRepository,
|
|
535
|
-
);
|
|
536
530
|
const agentDesignationLabelAdoptUseCase =
|
|
537
531
|
new AgentDesignationLabelAdoptUseCase(projectRepository, issueRepository);
|
|
538
532
|
|
|
@@ -575,7 +569,6 @@ export class HandleScheduledEventUseCaseHandler {
|
|
|
575
569
|
revertOrphanedPreparationUseCase,
|
|
576
570
|
conflictedIssueRevertUseCase,
|
|
577
571
|
revertNotReadyReviewQueueIssueUseCase,
|
|
578
|
-
triagerApprovalDispatchUseCase,
|
|
579
572
|
agentDesignationLabelAdoptUseCase,
|
|
580
573
|
updateRateLimitCacheUseCase,
|
|
581
574
|
dailySecurityScanUseCase,
|
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
DEFAULT_TOKEN_EXHAUSTION_HANDOVER_MESSAGE_BARE_NAME_LEADER,
|
|
6
6
|
DEFAULT_TOKEN_EXHAUSTION_GRACE_PERIOD_SECONDS,
|
|
7
7
|
} from '../../../domain/usecases/TokenExhaustionHandoverUseCase';
|
|
8
|
+
import { GitHubIssueCheckpointRepository } from '../../repositories/GitHubIssueCheckpointRepository';
|
|
8
9
|
import { NodeTmuxSessionRepository } from '../../repositories/NodeTmuxSessionRepository';
|
|
9
10
|
import { RateLimitSnapshotRepository } from '../../repositories/RateLimitSnapshotRepository';
|
|
10
11
|
import { ProcClaudeHandoverSessionRepository } from '../../repositories/ProcClaudeHandoverSessionRepository';
|
|
@@ -60,6 +61,7 @@ export const handleTokenExhaustionHandover = async (
|
|
|
60
61
|
snapshotRepository,
|
|
61
62
|
new NodeTmuxSessionRepository(localCommandRunner),
|
|
62
63
|
new NodeProcessSignalRepository(),
|
|
64
|
+
new GitHubIssueCheckpointRepository(process.env.GH_TOKEN ?? ''),
|
|
63
65
|
);
|
|
64
66
|
|
|
65
67
|
const result = await useCase.run({
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { GitHubIssueCheckpointRepository } from './GitHubIssueCheckpointRepository';
|
|
2
|
+
|
|
3
|
+
const VALID_URL = 'https://github.com/owner/repo/issues/42';
|
|
4
|
+
const EXPECTED_API_URL =
|
|
5
|
+
'https://api.github.com/repos/owner/repo/issues/42/comments';
|
|
6
|
+
const EXPECTED_BODY = JSON.stringify({
|
|
7
|
+
body: 'From: :robot: preparation-daemon (-)\n\n```json\n{"pullRequestRequired": false}\n```\n\nThis implementation session was interrupted by the preparation daemon due to token near exhaustion. The task will be re-dispatched.',
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
describe('GitHubIssueCheckpointRepository', () => {
|
|
11
|
+
let repository: GitHubIssueCheckpointRepository;
|
|
12
|
+
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
jest.restoreAllMocks();
|
|
15
|
+
repository = new GitHubIssueCheckpointRepository('test-token');
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it('posts to the correct GitHub API URL with correct headers and body', async () => {
|
|
19
|
+
const fetchSpy = jest
|
|
20
|
+
.spyOn(global, 'fetch')
|
|
21
|
+
.mockResolvedValue(new Response('{}', { status: 201 }));
|
|
22
|
+
|
|
23
|
+
await repository.postCheckpoint(VALID_URL);
|
|
24
|
+
|
|
25
|
+
expect(fetchSpy).toHaveBeenCalledWith(EXPECTED_API_URL, {
|
|
26
|
+
method: 'POST',
|
|
27
|
+
headers: {
|
|
28
|
+
Authorization: 'Bearer test-token',
|
|
29
|
+
Accept: 'application/vnd.github+json',
|
|
30
|
+
'Content-Type': 'application/json',
|
|
31
|
+
},
|
|
32
|
+
body: EXPECTED_BODY,
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('throws when the response is not 2xx', async () => {
|
|
37
|
+
jest
|
|
38
|
+
.spyOn(global, 'fetch')
|
|
39
|
+
.mockResolvedValue(
|
|
40
|
+
new Response('Forbidden', { status: 403, statusText: 'Forbidden' }),
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
await expect(repository.postCheckpoint(VALID_URL)).rejects.toThrow('403');
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it('throws when the URL does not match the expected GitHub issue pattern', async () => {
|
|
47
|
+
await expect(
|
|
48
|
+
repository.postCheckpoint('https://example.com/not-an-issue'),
|
|
49
|
+
).rejects.toThrow('Invalid GitHub issue URL');
|
|
50
|
+
});
|
|
51
|
+
});
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { IssueCheckpointRepository } from '../../domain/usecases/adapter-interfaces/IssueCheckpointRepository';
|
|
2
|
+
|
|
3
|
+
const CHECKPOINT_COMMENT_BODY =
|
|
4
|
+
'From: :robot: preparation-daemon (-)\n\n```json\n{"pullRequestRequired": false}\n```\n\nThis implementation session was interrupted by the preparation daemon due to token near exhaustion. The task will be re-dispatched.';
|
|
5
|
+
|
|
6
|
+
export class GitHubIssueCheckpointRepository implements IssueCheckpointRepository {
|
|
7
|
+
constructor(private readonly ghToken: string) {}
|
|
8
|
+
|
|
9
|
+
postCheckpoint = async (issueUrl: string): Promise<void> => {
|
|
10
|
+
const { owner, repo, issueNumber } = this.parseIssueUrl(issueUrl);
|
|
11
|
+
|
|
12
|
+
const response = await fetch(
|
|
13
|
+
`https://api.github.com/repos/${owner}/${repo}/issues/${issueNumber}/comments`,
|
|
14
|
+
{
|
|
15
|
+
method: 'POST',
|
|
16
|
+
headers: {
|
|
17
|
+
Authorization: `Bearer ${this.ghToken}`,
|
|
18
|
+
Accept: 'application/vnd.github+json',
|
|
19
|
+
'Content-Type': 'application/json',
|
|
20
|
+
},
|
|
21
|
+
body: JSON.stringify({ body: CHECKPOINT_COMMENT_BODY }),
|
|
22
|
+
},
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
if (!response.ok) {
|
|
26
|
+
throw new Error(
|
|
27
|
+
`Failed to post checkpoint comment to ${issueUrl}: ${response.status} ${response.statusText}`,
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
private parseIssueUrl = (
|
|
33
|
+
issueUrl: string,
|
|
34
|
+
): { owner: string; repo: string; issueNumber: number } => {
|
|
35
|
+
const match = issueUrl.match(
|
|
36
|
+
/github\.com\/([^/]+)\/([^/]+)\/(issues|pull)\/(\d+)/,
|
|
37
|
+
);
|
|
38
|
+
if (!match) {
|
|
39
|
+
throw new Error(`Invalid GitHub issue URL: ${issueUrl}`);
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
owner: match[1],
|
|
43
|
+
repo: match[2],
|
|
44
|
+
issueNumber: parseInt(match[4], 10),
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
}
|
|
@@ -212,13 +212,13 @@ describe('CheckIssueReviewReadinessUseCase', () => {
|
|
|
212
212
|
});
|
|
213
213
|
});
|
|
214
214
|
|
|
215
|
-
it('should return reviewReady=true when the last report
|
|
215
|
+
it('should return reviewReady=true when the last report designates the triager and no related PR exists', async () => {
|
|
216
216
|
const issue = createMockIssue();
|
|
217
217
|
mockIssueRepository.getIssueByUrl.mockResolvedValue(issue);
|
|
218
218
|
mockIssueCommentRepository.getCommentsFromIssue.mockResolvedValue([
|
|
219
219
|
createMockComment({
|
|
220
220
|
content:
|
|
221
|
-
'From: :robot: Agent report\n```json\n{"
|
|
221
|
+
'From: :robot: Agent report\n```json\n{"nextStepAgent": "triager"}\n```',
|
|
222
222
|
}),
|
|
223
223
|
]);
|
|
224
224
|
mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([]);
|
|
@@ -232,13 +232,35 @@ describe('CheckIssueReviewReadinessUseCase', () => {
|
|
|
232
232
|
expect(result.reviewReady).toBe(true);
|
|
233
233
|
});
|
|
234
234
|
|
|
235
|
-
it('should keep
|
|
235
|
+
it('should keep rejecting a missing PR when the last report designates an agent other than the triager', async () => {
|
|
236
236
|
const issue = createMockIssue();
|
|
237
237
|
mockIssueRepository.getIssueByUrl.mockResolvedValue(issue);
|
|
238
238
|
mockIssueCommentRepository.getCommentsFromIssue.mockResolvedValue([
|
|
239
239
|
createMockComment({
|
|
240
240
|
content:
|
|
241
|
-
'From: :robot: Agent report\n```json\n{"
|
|
241
|
+
'From: :robot: Agent report\n```json\n{"nextStepAgent": "developer"}\n```',
|
|
242
|
+
}),
|
|
243
|
+
]);
|
|
244
|
+
mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([]);
|
|
245
|
+
|
|
246
|
+
const result = await useCase.run({
|
|
247
|
+
issueUrl: 'https://github.com/user/repo/issues/1',
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
expect(result.reviewReady).toBe(false);
|
|
251
|
+
expect(result.rejections).toContainEqual({
|
|
252
|
+
type: 'PULL_REQUEST_NOT_FOUND',
|
|
253
|
+
detail: 'PULL_REQUEST_NOT_FOUND',
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
it('should keep every rejection other than PULL_REQUEST_NOT_FOUND when the last report designates the triager', async () => {
|
|
258
|
+
const issue = createMockIssue();
|
|
259
|
+
mockIssueRepository.getIssueByUrl.mockResolvedValue(issue);
|
|
260
|
+
mockIssueCommentRepository.getCommentsFromIssue.mockResolvedValue([
|
|
261
|
+
createMockComment({
|
|
262
|
+
content:
|
|
263
|
+
'From: :robot: Agent report\n```json\n{"nextStepAgent": "triager"}\n```',
|
|
242
264
|
}),
|
|
243
265
|
]);
|
|
244
266
|
mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([
|
|
@@ -5,10 +5,11 @@ import {
|
|
|
5
5
|
PrRejectedReasonType,
|
|
6
6
|
} from './IssueRejectionEvaluator';
|
|
7
7
|
import { resolveLabelsNotRequiringPullRequest } from './resolveLabelsNotRequiringPullRequest';
|
|
8
|
-
import { isPullRequestDeclaredUnnecessary } from './isPullRequestDeclaredUnnecessary';
|
|
9
8
|
import { normalizeReportBody } from './normalizeReportBody';
|
|
10
9
|
import { isAgentReportBody } from './isAgentReportBody';
|
|
11
10
|
import { isAuthorAuthorizedForAutoStatusCheck } from './isAuthorAuthorizedForAutoStatusCheck';
|
|
11
|
+
import { extractNextStepAgentFromComments } from './extractNextStepAgentFromComments';
|
|
12
|
+
import { isTriagerAgentName } from './triagerAgentName';
|
|
12
13
|
|
|
13
14
|
type RejectedReasonType =
|
|
14
15
|
| 'ISSUE_NOT_FOUND'
|
|
@@ -94,10 +95,11 @@ export class CheckIssueReviewReadinessUseCase {
|
|
|
94
95
|
{ developerAgentName: params.developerAgentName },
|
|
95
96
|
);
|
|
96
97
|
|
|
97
|
-
const
|
|
98
|
+
const nextStepAgent = extractNextStepAgentFromComments(
|
|
98
99
|
comments,
|
|
99
100
|
isTrustedAuthor,
|
|
100
|
-
)
|
|
101
|
+
);
|
|
102
|
+
const requiredPrRejections = isTriagerAgentName(nextStepAgent)
|
|
101
103
|
? prRejections.filter(
|
|
102
104
|
(rejection) => rejection.type !== 'PULL_REQUEST_NOT_FOUND',
|
|
103
105
|
)
|
|
@@ -25,7 +25,6 @@ import { StartPreparationUseCase } from './StartPreparationUseCase';
|
|
|
25
25
|
import { RevertOrphanedPreparationUseCase } from './RevertOrphanedPreparationUseCase';
|
|
26
26
|
import { ConflictedIssueRevertUseCase } from './ConflictedIssueRevertUseCase';
|
|
27
27
|
import { RevertNotReadyReviewQueueIssueUseCase } from './RevertNotReadyReviewQueueIssueUseCase';
|
|
28
|
-
import { TriagerApprovalDispatchUseCase } from './TriagerApprovalDispatchUseCase';
|
|
29
28
|
import { AgentDesignationLabelAdoptUseCase } from './AgentDesignationLabelAdoptUseCase';
|
|
30
29
|
import { ProjectRequiredFieldCreateUseCase } from './ProjectRequiredFieldCreateUseCase';
|
|
31
30
|
import { SetupTowerDefenceProjectUseCase } from './SetupTowerDefenceProjectUseCase';
|
|
@@ -129,8 +128,6 @@ describe('HandleScheduledEventUseCase', () => {
|
|
|
129
128
|
mock<ConflictedIssueRevertUseCase>();
|
|
130
129
|
const mockRevertNotReadyReviewQueueIssueUseCase =
|
|
131
130
|
mock<RevertNotReadyReviewQueueIssueUseCase>();
|
|
132
|
-
const mockTriagerApprovalDispatchUseCase =
|
|
133
|
-
mock<TriagerApprovalDispatchUseCase>();
|
|
134
131
|
const mockAgentDesignationLabelAdoptUseCase =
|
|
135
132
|
mock<AgentDesignationLabelAdoptUseCase>();
|
|
136
133
|
const mockUpdateRateLimitCacheUseCase = mock<UpdateRateLimitCacheUseCase>();
|
|
@@ -165,7 +162,6 @@ describe('HandleScheduledEventUseCase', () => {
|
|
|
165
162
|
mockRevertOrphanedPreparationUseCase,
|
|
166
163
|
mockConflictedIssueRevertUseCase,
|
|
167
164
|
mockRevertNotReadyReviewQueueIssueUseCase,
|
|
168
|
-
mockTriagerApprovalDispatchUseCase,
|
|
169
165
|
mockAgentDesignationLabelAdoptUseCase,
|
|
170
166
|
mockUpdateRateLimitCacheUseCase,
|
|
171
167
|
mockDailySecurityScanUseCase,
|
|
@@ -282,29 +278,6 @@ describe('HandleScheduledEventUseCase', () => {
|
|
|
282
278
|
});
|
|
283
279
|
});
|
|
284
280
|
|
|
285
|
-
it('should call TriagerApprovalDispatchUseCase with project URL', async () => {
|
|
286
|
-
const input = {
|
|
287
|
-
projectName: 'test-project',
|
|
288
|
-
org: 'test-org',
|
|
289
|
-
projectUrl: 'https://github.com/test-org/test-project',
|
|
290
|
-
manager: 'test-manager',
|
|
291
|
-
workingReport: {
|
|
292
|
-
repo: 'test-repo',
|
|
293
|
-
members: ['member1'],
|
|
294
|
-
spreadsheetUrl: 'https://docs.google.com/spreadsheets/test',
|
|
295
|
-
},
|
|
296
|
-
urlOfStoryView: 'https://github.com/test-org/test-project/issues',
|
|
297
|
-
disabled: false,
|
|
298
|
-
};
|
|
299
|
-
|
|
300
|
-
await useCase.run(input);
|
|
301
|
-
expect(mockTriagerApprovalDispatchUseCase.run).toHaveBeenCalledWith(
|
|
302
|
-
expect.objectContaining({
|
|
303
|
-
projectUrl: 'https://github.com/test-org/test-project',
|
|
304
|
-
}),
|
|
305
|
-
);
|
|
306
|
-
});
|
|
307
|
-
|
|
308
281
|
it('should return null and skip all processing when disabled is true', async () => {
|
|
309
282
|
const input = {
|
|
310
283
|
projectName: 'test-project',
|
|
@@ -1827,7 +1800,6 @@ describe('HandleScheduledEventUseCase', () => {
|
|
|
1827
1800
|
mock<RevertOrphanedPreparationUseCase>(),
|
|
1828
1801
|
mock<ConflictedIssueRevertUseCase>(),
|
|
1829
1802
|
mock<RevertNotReadyReviewQueueIssueUseCase>(),
|
|
1830
|
-
mock<TriagerApprovalDispatchUseCase>(),
|
|
1831
1803
|
mock<AgentDesignationLabelAdoptUseCase>(),
|
|
1832
1804
|
null,
|
|
1833
1805
|
null,
|
|
@@ -28,7 +28,6 @@ import {
|
|
|
28
28
|
import { AgentDesignationLabelAdoptUseCase } from './AgentDesignationLabelAdoptUseCase';
|
|
29
29
|
import { RevertOrphanedPreparationUseCase } from './RevertOrphanedPreparationUseCase';
|
|
30
30
|
import { RevertNotReadyReviewQueueIssueUseCase } from './RevertNotReadyReviewQueueIssueUseCase';
|
|
31
|
-
import { TriagerApprovalDispatchUseCase } from './TriagerApprovalDispatchUseCase';
|
|
32
31
|
import { isRecord } from './isRecord';
|
|
33
32
|
import { resolveLabelsAsLlmAgentName } from './resolveLabelsAsLlmAgentName';
|
|
34
33
|
import { resolveAllowedIssueAuthors } from './resolveAllowedIssueAuthors';
|
|
@@ -139,7 +138,6 @@ export class HandleScheduledEventUseCase {
|
|
|
139
138
|
readonly revertOrphanedPreparationUseCase: RevertOrphanedPreparationUseCase,
|
|
140
139
|
readonly conflictedIssueRevertUseCase: ConflictedIssueRevertUseCase,
|
|
141
140
|
readonly revertNotReadyReviewQueueIssueUseCase: RevertNotReadyReviewQueueIssueUseCase,
|
|
142
|
-
readonly triagerApprovalDispatchUseCase: TriagerApprovalDispatchUseCase,
|
|
143
141
|
readonly agentDesignationLabelAdoptUseCase: AgentDesignationLabelAdoptUseCase,
|
|
144
142
|
readonly updateRateLimitCacheUseCase: UpdateRateLimitCacheUseCase | null,
|
|
145
143
|
readonly dailySecurityScanUseCase: DailySecurityScanUseCase | null,
|
|
@@ -452,10 +450,6 @@ ${JSON.stringify(e)}
|
|
|
452
450
|
allowedIssueAuthors,
|
|
453
451
|
developerAgentName: input.developerAgentName,
|
|
454
452
|
});
|
|
455
|
-
await this.triagerApprovalDispatchUseCase.run({
|
|
456
|
-
projectUrl: input.projectUrl,
|
|
457
|
-
allowedIssueAuthors,
|
|
458
|
-
});
|
|
459
453
|
if (this.dailySecurityScanUseCase !== null && input.dailySecurityScan) {
|
|
460
454
|
await this.dailySecurityScanUseCase.run({
|
|
461
455
|
targetDates: targetDateTimes,
|