github-issue-tower-defence-management 2.10.2 → 2.11.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 +7 -0
- package/README.md +9 -1
- package/bin/adapter/entry-points/cli/fleetConfig.js +7 -1
- package/bin/adapter/entry-points/cli/fleetConfig.js.map +1 -1
- package/bin/adapter/entry-points/cli/index.js +11 -3
- package/bin/adapter/entry-points/cli/index.js.map +1 -1
- package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js +2 -1
- package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js.map +1 -1
- package/bin/adapter/repositories/CliGitHubGraphqlRateLimitRepository.js +24 -0
- package/bin/adapter/repositories/CliGitHubGraphqlRateLimitRepository.js.map +1 -0
- package/bin/adapter/repositories/KySlackRepository.js +2 -1
- package/bin/adapter/repositories/KySlackRepository.js.map +1 -1
- package/bin/domain/usecases/StartPreparationUseCase.js +22 -1
- package/bin/domain/usecases/StartPreparationUseCase.js.map +1 -1
- package/bin/domain/usecases/adapter-interfaces/GitHubGraphqlRateLimitRepository.js +3 -0
- package/bin/domain/usecases/adapter-interfaces/GitHubGraphqlRateLimitRepository.js.map +1 -0
- package/package.json +1 -1
- package/src/adapter/entry-points/cli/fleetConfig.test.ts +99 -0
- package/src/adapter/entry-points/cli/fleetConfig.ts +25 -0
- package/src/adapter/entry-points/cli/index.test.ts +4 -0
- package/src/adapter/entry-points/cli/index.ts +16 -2
- package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts +2 -0
- package/src/adapter/repositories/CliGitHubGraphqlRateLimitRepository.test.ts +71 -0
- package/src/adapter/repositories/CliGitHubGraphqlRateLimitRepository.ts +21 -0
- package/src/adapter/repositories/KySlackRepository.test.ts +49 -1
- package/src/adapter/repositories/KySlackRepository.ts +3 -2
- package/src/domain/usecases/ConflictedIssueRevertUseCase.test.ts +74 -0
- package/src/domain/usecases/StartPreparationUseCase.test.ts +229 -0
- package/src/domain/usecases/StartPreparationUseCase.ts +35 -0
- package/src/domain/usecases/adapter-interfaces/GitHubGraphqlRateLimitRepository.ts +3 -0
- package/src/domain/usecases/issueReactivationTriggerIsPending.test.ts +1 -0
- package/types/adapter/entry-points/cli/fleetConfig.d.ts +4 -0
- package/types/adapter/entry-points/cli/fleetConfig.d.ts.map +1 -1
- package/types/adapter/entry-points/cli/index.d.ts.map +1 -1
- package/types/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.d.ts.map +1 -1
- package/types/adapter/repositories/CliGitHubGraphqlRateLimitRepository.d.ts +8 -0
- package/types/adapter/repositories/CliGitHubGraphqlRateLimitRepository.d.ts.map +1 -0
- package/types/adapter/repositories/KySlackRepository.d.ts +1 -1
- package/types/adapter/repositories/KySlackRepository.d.ts.map +1 -1
- package/types/domain/usecases/StartPreparationUseCase.d.ts +5 -1
- package/types/domain/usecases/StartPreparationUseCase.d.ts.map +1 -1
- package/types/domain/usecases/adapter-interfaces/GitHubGraphqlRateLimitRepository.d.ts +4 -0
- package/types/domain/usecases/adapter-interfaces/GitHubGraphqlRateLimitRepository.d.ts.map +1 -0
|
@@ -10,6 +10,7 @@ import { ProjectRepository } from './adapter-interfaces/ProjectRepository';
|
|
|
10
10
|
import { LocalCommandRunner } from './adapter-interfaces/LocalCommandRunner';
|
|
11
11
|
import { ClaudeTokenUsageRepository } from './adapter-interfaces/ClaudeTokenUsageRepository';
|
|
12
12
|
import { TakeOwnershipSpawnRepository } from './adapter-interfaces/TakeOwnershipSpawnRepository';
|
|
13
|
+
import { GitHubGraphqlRateLimitRepository } from './adapter-interfaces/GitHubGraphqlRateLimitRepository';
|
|
13
14
|
import { ClaudeTokenUsage } from '../entities/ClaudeTokenUsage';
|
|
14
15
|
import { Issue } from '../entities/Issue';
|
|
15
16
|
import { FieldOption, Project } from '../entities/Project';
|
|
@@ -109,6 +110,7 @@ describe('StartPreparationUseCase', () => {
|
|
|
109
110
|
let mockLocalCommandRunner: Mocked<LocalCommandRunner>;
|
|
110
111
|
let mockClaudeTokenUsageRepository: Mocked<ClaudeTokenUsageRepository>;
|
|
111
112
|
let mockTakeOwnershipSpawnRepository: Mocked<TakeOwnershipSpawnRepository>;
|
|
113
|
+
let mockGitHubGraphqlRateLimitRepository: Mocked<GitHubGraphqlRateLimitRepository>;
|
|
112
114
|
let mockProject: Project;
|
|
113
115
|
beforeEach(() => {
|
|
114
116
|
jest.resetAllMocks();
|
|
@@ -144,12 +146,16 @@ describe('StartPreparationUseCase', () => {
|
|
|
144
146
|
listSpawns: jest.fn().mockReturnValue([]),
|
|
145
147
|
listRunningIssueUrls: jest.fn().mockReturnValue([]),
|
|
146
148
|
};
|
|
149
|
+
mockGitHubGraphqlRateLimitRepository = {
|
|
150
|
+
getRemainingRequestCount: jest.fn().mockResolvedValue(null),
|
|
151
|
+
};
|
|
147
152
|
useCase = new StartPreparationUseCase(
|
|
148
153
|
mockProjectRepository,
|
|
149
154
|
mockIssueRepository,
|
|
150
155
|
mockLocalCommandRunner,
|
|
151
156
|
mockClaudeTokenUsageRepository,
|
|
152
157
|
mockTakeOwnershipSpawnRepository,
|
|
158
|
+
mockGitHubGraphqlRateLimitRepository,
|
|
153
159
|
);
|
|
154
160
|
});
|
|
155
161
|
it('should run aw command for awaiting workspace issues', async () => {
|
|
@@ -627,6 +633,225 @@ describe('StartPreparationUseCase', () => {
|
|
|
627
633
|
expect(mockLocalCommandRunner.runCommand.mock.calls).toHaveLength(0);
|
|
628
634
|
});
|
|
629
635
|
|
|
636
|
+
it('skips all spawning when active worker count meets the maxConcurrentWorkers cap', async () => {
|
|
637
|
+
const awaitingIssues: Issue[] = [
|
|
638
|
+
createMockIssue({
|
|
639
|
+
url: 'https://github.com/user/repo/issues/10',
|
|
640
|
+
status: 'Awaiting Workspace',
|
|
641
|
+
author: 'testuser',
|
|
642
|
+
}),
|
|
643
|
+
createMockIssue({
|
|
644
|
+
number: 2,
|
|
645
|
+
url: 'https://github.com/user/repo/issues/11',
|
|
646
|
+
status: 'Awaiting Workspace',
|
|
647
|
+
author: 'testuser',
|
|
648
|
+
}),
|
|
649
|
+
];
|
|
650
|
+
mockProjectRepository.getByUrl.mockResolvedValue(mockProject);
|
|
651
|
+
mockIssueRepository.getStoryObjectMap.mockResolvedValue(
|
|
652
|
+
createMockStoryObjectMap(awaitingIssues),
|
|
653
|
+
);
|
|
654
|
+
mockTakeOwnershipSpawnRepository.listRunningIssueUrls.mockReturnValue([
|
|
655
|
+
'https://github.com/user/repo/issues/1',
|
|
656
|
+
'https://github.com/user/repo/issues/2',
|
|
657
|
+
]);
|
|
658
|
+
|
|
659
|
+
await useCase.run({
|
|
660
|
+
projectUrl: 'https://github.com/user/repo',
|
|
661
|
+
defaultAgentName: 'agent1',
|
|
662
|
+
defaultLlmModelName: 'claude-opus',
|
|
663
|
+
fallbackLlmModelName: null,
|
|
664
|
+
defaultLlmAgentName: null,
|
|
665
|
+
configFilePath: '/path/to/config.yml',
|
|
666
|
+
maximumPreparingIssuesCount: null,
|
|
667
|
+
utilizationPercentageThreshold: 90,
|
|
668
|
+
allowedIssueAuthors: ['testuser'],
|
|
669
|
+
manager: 'manager-user',
|
|
670
|
+
codexHomeCandidates: null,
|
|
671
|
+
labelsAsLlmAgentName: null,
|
|
672
|
+
maxConcurrentWorkers: 2,
|
|
673
|
+
});
|
|
674
|
+
|
|
675
|
+
expect(mockIssueRepository.updateStatus).not.toHaveBeenCalled();
|
|
676
|
+
expect(
|
|
677
|
+
mockLocalCommandRunner.runCommand.mock.calls.map((c) => c[0]),
|
|
678
|
+
).not.toContain('aw');
|
|
679
|
+
});
|
|
680
|
+
|
|
681
|
+
it('stops spawning mid-loop when workers started in the run bring the count to the cap', async () => {
|
|
682
|
+
const awaitingIssues: Issue[] = [
|
|
683
|
+
createMockIssue({
|
|
684
|
+
url: 'https://github.com/user/repo/issues/10',
|
|
685
|
+
status: 'Awaiting Workspace',
|
|
686
|
+
author: 'testuser',
|
|
687
|
+
}),
|
|
688
|
+
createMockIssue({
|
|
689
|
+
number: 2,
|
|
690
|
+
url: 'https://github.com/user/repo/issues/11',
|
|
691
|
+
status: 'Awaiting Workspace',
|
|
692
|
+
author: 'testuser',
|
|
693
|
+
}),
|
|
694
|
+
];
|
|
695
|
+
mockProjectRepository.getByUrl.mockResolvedValue(mockProject);
|
|
696
|
+
mockIssueRepository.getStoryObjectMap.mockResolvedValue(
|
|
697
|
+
createMockStoryObjectMap(awaitingIssues),
|
|
698
|
+
);
|
|
699
|
+
mockIssueRepository.getAllOpened.mockResolvedValue([]);
|
|
700
|
+
mockTakeOwnershipSpawnRepository.listRunningIssueUrls.mockReturnValue([]);
|
|
701
|
+
mockLocalCommandRunner.runCommand.mockResolvedValue({
|
|
702
|
+
stdout: '',
|
|
703
|
+
stderr: '',
|
|
704
|
+
exitCode: 0,
|
|
705
|
+
});
|
|
706
|
+
|
|
707
|
+
await useCase.run({
|
|
708
|
+
projectUrl: 'https://github.com/user/repo',
|
|
709
|
+
defaultAgentName: 'agent1',
|
|
710
|
+
defaultLlmModelName: 'claude-opus',
|
|
711
|
+
fallbackLlmModelName: null,
|
|
712
|
+
defaultLlmAgentName: null,
|
|
713
|
+
configFilePath: '/path/to/config.yml',
|
|
714
|
+
maximumPreparingIssuesCount: null,
|
|
715
|
+
utilizationPercentageThreshold: 90,
|
|
716
|
+
allowedIssueAuthors: ['testuser'],
|
|
717
|
+
manager: 'manager-user',
|
|
718
|
+
codexHomeCandidates: null,
|
|
719
|
+
labelsAsLlmAgentName: null,
|
|
720
|
+
maxConcurrentWorkers: 1,
|
|
721
|
+
});
|
|
722
|
+
|
|
723
|
+
const awCalls = mockLocalCommandRunner.runCommand.mock.calls.filter(
|
|
724
|
+
(call) => call[0] === 'aw',
|
|
725
|
+
);
|
|
726
|
+
expect(awCalls).toHaveLength(1);
|
|
727
|
+
});
|
|
728
|
+
|
|
729
|
+
it('skips the preparation cycle when GraphQL rate limit is below the floor', async () => {
|
|
730
|
+
const awaitingIssues: Issue[] = [
|
|
731
|
+
createMockIssue({
|
|
732
|
+
url: 'https://github.com/user/repo/issues/10',
|
|
733
|
+
status: 'Awaiting Workspace',
|
|
734
|
+
author: 'testuser',
|
|
735
|
+
}),
|
|
736
|
+
];
|
|
737
|
+
mockProjectRepository.getByUrl.mockResolvedValue(mockProject);
|
|
738
|
+
mockIssueRepository.getStoryObjectMap.mockResolvedValue(
|
|
739
|
+
createMockStoryObjectMap(awaitingIssues),
|
|
740
|
+
);
|
|
741
|
+
mockGitHubGraphqlRateLimitRepository.getRemainingRequestCount.mockResolvedValue(
|
|
742
|
+
499,
|
|
743
|
+
);
|
|
744
|
+
|
|
745
|
+
await useCase.run({
|
|
746
|
+
projectUrl: 'https://github.com/user/repo',
|
|
747
|
+
defaultAgentName: 'agent1',
|
|
748
|
+
defaultLlmModelName: 'claude-opus',
|
|
749
|
+
fallbackLlmModelName: null,
|
|
750
|
+
defaultLlmAgentName: null,
|
|
751
|
+
configFilePath: '/path/to/config.yml',
|
|
752
|
+
maximumPreparingIssuesCount: null,
|
|
753
|
+
utilizationPercentageThreshold: 90,
|
|
754
|
+
allowedIssueAuthors: ['testuser'],
|
|
755
|
+
manager: 'manager-user',
|
|
756
|
+
codexHomeCandidates: null,
|
|
757
|
+
labelsAsLlmAgentName: null,
|
|
758
|
+
graphqlRateLimitFloor: 500,
|
|
759
|
+
});
|
|
760
|
+
|
|
761
|
+
expect(mockIssueRepository.updateStatus).not.toHaveBeenCalled();
|
|
762
|
+
expect(
|
|
763
|
+
mockLocalCommandRunner.runCommand.mock.calls.map((c) => c[0]),
|
|
764
|
+
).not.toContain('aw');
|
|
765
|
+
});
|
|
766
|
+
|
|
767
|
+
it('proceeds with spawning when GraphQL remaining equals the floor exactly', async () => {
|
|
768
|
+
const awaitingIssues: Issue[] = [
|
|
769
|
+
createMockIssue({
|
|
770
|
+
url: 'https://github.com/user/repo/issues/10',
|
|
771
|
+
status: 'Awaiting Workspace',
|
|
772
|
+
author: 'testuser',
|
|
773
|
+
}),
|
|
774
|
+
];
|
|
775
|
+
mockProjectRepository.getByUrl.mockResolvedValue(mockProject);
|
|
776
|
+
mockIssueRepository.getStoryObjectMap.mockResolvedValue(
|
|
777
|
+
createMockStoryObjectMap(awaitingIssues),
|
|
778
|
+
);
|
|
779
|
+
mockIssueRepository.getAllOpened.mockResolvedValue([]);
|
|
780
|
+
mockGitHubGraphqlRateLimitRepository.getRemainingRequestCount.mockResolvedValue(
|
|
781
|
+
500,
|
|
782
|
+
);
|
|
783
|
+
mockLocalCommandRunner.runCommand.mockResolvedValue({
|
|
784
|
+
stdout: '',
|
|
785
|
+
stderr: '',
|
|
786
|
+
exitCode: 0,
|
|
787
|
+
});
|
|
788
|
+
|
|
789
|
+
await useCase.run({
|
|
790
|
+
projectUrl: 'https://github.com/user/repo',
|
|
791
|
+
defaultAgentName: 'agent1',
|
|
792
|
+
defaultLlmModelName: 'claude-opus',
|
|
793
|
+
fallbackLlmModelName: null,
|
|
794
|
+
defaultLlmAgentName: null,
|
|
795
|
+
configFilePath: '/path/to/config.yml',
|
|
796
|
+
maximumPreparingIssuesCount: null,
|
|
797
|
+
utilizationPercentageThreshold: 90,
|
|
798
|
+
allowedIssueAuthors: ['testuser'],
|
|
799
|
+
manager: 'manager-user',
|
|
800
|
+
codexHomeCandidates: null,
|
|
801
|
+
labelsAsLlmAgentName: null,
|
|
802
|
+
graphqlRateLimitFloor: 500,
|
|
803
|
+
});
|
|
804
|
+
|
|
805
|
+
const awCalls = mockLocalCommandRunner.runCommand.mock.calls.filter(
|
|
806
|
+
(call) => call[0] === 'aw',
|
|
807
|
+
);
|
|
808
|
+
expect(awCalls).toHaveLength(1);
|
|
809
|
+
});
|
|
810
|
+
|
|
811
|
+
it('proceeds with spawning when GraphQL rate limit check returns null', async () => {
|
|
812
|
+
const awaitingIssues: Issue[] = [
|
|
813
|
+
createMockIssue({
|
|
814
|
+
url: 'https://github.com/user/repo/issues/10',
|
|
815
|
+
status: 'Awaiting Workspace',
|
|
816
|
+
author: 'testuser',
|
|
817
|
+
}),
|
|
818
|
+
];
|
|
819
|
+
mockProjectRepository.getByUrl.mockResolvedValue(mockProject);
|
|
820
|
+
mockIssueRepository.getStoryObjectMap.mockResolvedValue(
|
|
821
|
+
createMockStoryObjectMap(awaitingIssues),
|
|
822
|
+
);
|
|
823
|
+
mockIssueRepository.getAllOpened.mockResolvedValue([]);
|
|
824
|
+
mockGitHubGraphqlRateLimitRepository.getRemainingRequestCount.mockResolvedValue(
|
|
825
|
+
null,
|
|
826
|
+
);
|
|
827
|
+
mockLocalCommandRunner.runCommand.mockResolvedValue({
|
|
828
|
+
stdout: '',
|
|
829
|
+
stderr: '',
|
|
830
|
+
exitCode: 0,
|
|
831
|
+
});
|
|
832
|
+
|
|
833
|
+
await useCase.run({
|
|
834
|
+
projectUrl: 'https://github.com/user/repo',
|
|
835
|
+
defaultAgentName: 'agent1',
|
|
836
|
+
defaultLlmModelName: 'claude-opus',
|
|
837
|
+
fallbackLlmModelName: null,
|
|
838
|
+
defaultLlmAgentName: null,
|
|
839
|
+
configFilePath: '/path/to/config.yml',
|
|
840
|
+
maximumPreparingIssuesCount: null,
|
|
841
|
+
utilizationPercentageThreshold: 90,
|
|
842
|
+
allowedIssueAuthors: ['testuser'],
|
|
843
|
+
manager: 'manager-user',
|
|
844
|
+
codexHomeCandidates: null,
|
|
845
|
+
labelsAsLlmAgentName: null,
|
|
846
|
+
graphqlRateLimitFloor: 500,
|
|
847
|
+
});
|
|
848
|
+
|
|
849
|
+
const awCalls = mockLocalCommandRunner.runCommand.mock.calls.filter(
|
|
850
|
+
(call) => call[0] === 'aw',
|
|
851
|
+
);
|
|
852
|
+
expect(awCalls).toHaveLength(1);
|
|
853
|
+
});
|
|
854
|
+
|
|
630
855
|
it('should pass --branch to aw command when issue has an existing linked PR', async () => {
|
|
631
856
|
const awaitingIssues: Issue[] = [
|
|
632
857
|
createMockIssue({
|
|
@@ -7055,6 +7280,7 @@ describe('StartPreparationUseCase.buildRotationOrder', () => {
|
|
|
7055
7280
|
listSpawns: jest.fn().mockReturnValue([]),
|
|
7056
7281
|
listRunningIssueUrls: jest.fn().mockReturnValue([]),
|
|
7057
7282
|
},
|
|
7283
|
+
{ getRemainingRequestCount: jest.fn().mockResolvedValue(null) },
|
|
7058
7284
|
);
|
|
7059
7285
|
|
|
7060
7286
|
it('lists selected tokens first in ascending 7-day reset deadline order then excluded tokens', () => {
|
|
@@ -7354,6 +7580,7 @@ describe('StartPreparationUseCase.getTokenConcurrentLimit', () => {
|
|
|
7354
7580
|
listSpawns: jest.fn().mockReturnValue([]),
|
|
7355
7581
|
listRunningIssueUrls: jest.fn().mockReturnValue([]),
|
|
7356
7582
|
},
|
|
7583
|
+
{ getRemainingRequestCount: jest.fn().mockResolvedValue(null) },
|
|
7357
7584
|
);
|
|
7358
7585
|
});
|
|
7359
7586
|
|
|
@@ -7465,6 +7692,7 @@ describe('StartPreparationUseCase.run normalConcurrentLimit', () => {
|
|
|
7465
7692
|
mockLocalCommandRunner,
|
|
7466
7693
|
mockClaudeTokenUsageRepository,
|
|
7467
7694
|
mockTakeOwnershipSpawnRepository,
|
|
7695
|
+
{ getRemainingRequestCount: jest.fn().mockResolvedValue(null) },
|
|
7468
7696
|
);
|
|
7469
7697
|
|
|
7470
7698
|
await useCase.run({
|
|
@@ -7542,6 +7770,7 @@ describe('StartPreparationUseCase.fetchSpawnCandidateBranchSources', () => {
|
|
|
7542
7770
|
listSpawns: jest.fn().mockReturnValue([]),
|
|
7543
7771
|
listRunningIssueUrls: jest.fn().mockReturnValue([]),
|
|
7544
7772
|
},
|
|
7773
|
+
{ getRemainingRequestCount: jest.fn().mockResolvedValue(null) },
|
|
7545
7774
|
);
|
|
7546
7775
|
|
|
7547
7776
|
it('looks up related open pull requests for issue urls concurrently up to the configured limit', async () => {
|
|
@@ -7,6 +7,7 @@ import { ProjectRepository } from './adapter-interfaces/ProjectRepository';
|
|
|
7
7
|
import { LocalCommandRunner } from './adapter-interfaces/LocalCommandRunner';
|
|
8
8
|
import { ClaudeTokenUsageRepository } from './adapter-interfaces/ClaudeTokenUsageRepository';
|
|
9
9
|
import { TakeOwnershipSpawnRepository } from './adapter-interfaces/TakeOwnershipSpawnRepository';
|
|
10
|
+
import { GitHubGraphqlRateLimitRepository } from './adapter-interfaces/GitHubGraphqlRateLimitRepository';
|
|
10
11
|
import { ClaudeTokenUsage } from '../entities/ClaudeTokenUsage';
|
|
11
12
|
import { DEFAULT_SELECTION_WEIGHT } from './OauthTokenSelectUseCase';
|
|
12
13
|
import {
|
|
@@ -74,6 +75,7 @@ export class StartPreparationUseCase {
|
|
|
74
75
|
private readonly localCommandRunner: LocalCommandRunner,
|
|
75
76
|
private readonly claudeTokenUsageRepository: ClaudeTokenUsageRepository,
|
|
76
77
|
private readonly takeOwnershipSpawnRepository: TakeOwnershipSpawnRepository,
|
|
78
|
+
private readonly gitHubGraphqlRateLimitRepository: GitHubGraphqlRateLimitRepository,
|
|
77
79
|
) {}
|
|
78
80
|
|
|
79
81
|
private weeklyLimitTypeForModel = (modelName: string | null): string => {
|
|
@@ -421,6 +423,8 @@ export class StartPreparationUseCase {
|
|
|
421
423
|
labelsAsLlmAgentName: string[] | null;
|
|
422
424
|
agents?: string[] | null;
|
|
423
425
|
normalConcurrentLimit?: number;
|
|
426
|
+
maxConcurrentWorkers?: number | null;
|
|
427
|
+
graphqlRateLimitFloor?: number | null;
|
|
424
428
|
}): Promise<{ rotationOrder: RotationOrderEntry[] | null }> => {
|
|
425
429
|
const normalConcurrentLimit =
|
|
426
430
|
params.normalConcurrentLimit ?? NORMAL_CONCURRENT_LIMIT;
|
|
@@ -537,6 +541,28 @@ export class StartPreparationUseCase {
|
|
|
537
541
|
|
|
538
542
|
const now = new Date();
|
|
539
543
|
|
|
544
|
+
const maxConcurrentWorkers = params.maxConcurrentWorkers ?? null;
|
|
545
|
+
const graphqlRateLimitFloor = params.graphqlRateLimitFloor ?? null;
|
|
546
|
+
|
|
547
|
+
if (graphqlRateLimitFloor !== null) {
|
|
548
|
+
const graphqlRemaining =
|
|
549
|
+
await this.gitHubGraphqlRateLimitRepository.getRemainingRequestCount();
|
|
550
|
+
if (
|
|
551
|
+
graphqlRemaining !== null &&
|
|
552
|
+
graphqlRemaining < graphqlRateLimitFloor
|
|
553
|
+
) {
|
|
554
|
+
console.warn(
|
|
555
|
+
`GraphQL rate limit low (${graphqlRemaining} remaining, floor: ${graphqlRateLimitFloor}); skipping preparation cycle.`,
|
|
556
|
+
);
|
|
557
|
+
return { rotationOrder };
|
|
558
|
+
}
|
|
559
|
+
if (graphqlRemaining === null) {
|
|
560
|
+
console.warn(
|
|
561
|
+
'GraphQL rate limit check failed; proceeding with spawning.',
|
|
562
|
+
);
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
|
|
540
566
|
const branchSourceByIssueUrl = await this.fetchSpawnCandidateBranchSources(
|
|
541
567
|
awaitingWorkspaceIssues
|
|
542
568
|
.filter(
|
|
@@ -567,6 +593,15 @@ export class StartPreparationUseCase {
|
|
|
567
593
|
console.warn(`Skipping ${issue.url}: worker already running.`);
|
|
568
594
|
continue;
|
|
569
595
|
}
|
|
596
|
+
if (maxConcurrentWorkers !== null) {
|
|
597
|
+
const activeWorkerCount = runningIssueUrls.size + startedInThisRunCount;
|
|
598
|
+
if (activeWorkerCount >= maxConcurrentWorkers) {
|
|
599
|
+
console.warn(
|
|
600
|
+
`Spawn cap reached (${activeWorkerCount}/${maxConcurrentWorkers} active workers); skipping remaining candidates.`,
|
|
601
|
+
);
|
|
602
|
+
break;
|
|
603
|
+
}
|
|
604
|
+
}
|
|
570
605
|
const exclusionReason = this.spawnCandidateExclusionReasonOf(
|
|
571
606
|
issue,
|
|
572
607
|
params.allowedIssueAuthors,
|
|
@@ -415,6 +415,7 @@ describe('spawn and finish sides agree on the reactivation trigger predicate', (
|
|
|
415
415
|
spawnMockLocalCommandRunner,
|
|
416
416
|
spawnMockClaudeTokenUsageRepository,
|
|
417
417
|
spawnMockTakeOwnershipSpawnRepository,
|
|
418
|
+
{ getRemainingRequestCount: jest.fn().mockResolvedValue(null) },
|
|
418
419
|
);
|
|
419
420
|
|
|
420
421
|
const notifyProject = createNotifyMockProject();
|
|
@@ -4,8 +4,12 @@ export declare const LIVE_SESSION_OAUTH_TOKEN_SELECTION_SECTION_KEY = "liveSessi
|
|
|
4
4
|
export declare const PREPARATION_WORKER_SECTION_KEY = "preparationWorker";
|
|
5
5
|
export declare const START_PREPARATION_SECTION_KEY = "startPreparation";
|
|
6
6
|
export declare const DEFAULT_FLEET_MAXIMUM_PREPARING_ISSUES_COUNT = 80;
|
|
7
|
+
export declare const DEFAULT_MAX_CONCURRENT_WORKERS = 40;
|
|
8
|
+
export declare const DEFAULT_GRAPHQL_RATE_LIMIT_FLOOR = 500;
|
|
7
9
|
export type PreparationWorkerSettings = {
|
|
8
10
|
normalConcurrentLimit: number;
|
|
11
|
+
maxConcurrentWorkers: number;
|
|
12
|
+
graphqlRateLimitFloor: number;
|
|
9
13
|
};
|
|
10
14
|
export declare const DEFAULT_PREPARATION_WORKER_SETTINGS: PreparationWorkerSettings;
|
|
11
15
|
export type StartPreparationFleetSettings = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fleetConfig.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/cli/fleetConfig.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,sCAAsC,EACvC,MAAM,6DAA6D,CAAC;AAGrE,eAAO,MAAM,2CAA2C,sBAAsB,CAAC;AAE/E,eAAO,MAAM,8CAA8C,mCACzB,CAAC;AACnC,eAAO,MAAM,8BAA8B,sBAAsB,CAAC;AAClE,eAAO,MAAM,6BAA6B,qBAAqB,CAAC;AAEhE,eAAO,MAAM,4CAA4C,KAAK,CAAC;AAE/D,MAAM,MAAM,yBAAyB,GAAG;IACtC,qBAAqB,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEF,eAAO,MAAM,mCAAmC,EAAE,
|
|
1
|
+
{"version":3,"file":"fleetConfig.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/cli/fleetConfig.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,sCAAsC,EACvC,MAAM,6DAA6D,CAAC;AAGrE,eAAO,MAAM,2CAA2C,sBAAsB,CAAC;AAE/E,eAAO,MAAM,8CAA8C,mCACzB,CAAC;AACnC,eAAO,MAAM,8BAA8B,sBAAsB,CAAC;AAClE,eAAO,MAAM,6BAA6B,qBAAqB,CAAC;AAEhE,eAAO,MAAM,4CAA4C,KAAK,CAAC;AAE/D,eAAO,MAAM,8BAA8B,KAAK,CAAC;AACjD,eAAO,MAAM,gCAAgC,MAAM,CAAC;AAEpD,MAAM,MAAM,yBAAyB,GAAG;IACtC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qBAAqB,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEF,eAAO,MAAM,mCAAmC,EAAE,yBAIjD,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,2BAA2B,EAAE,MAAM,CAAC;CACrC,CAAC;AAEF,eAAO,MAAM,wCAAwC,EAAE,6BAGpD,CAAC;AAEJ,eAAO,MAAM,0BAA0B,GACrC,UAAU,MAAM,GAAG,IAAI,KACtB,MAAM,GAAG,IAUX,CAAC;AA0DF,eAAO,MAAM,0CAA0C,GACrD,qBAAqB,MAAM,GAAG,IAAI,KACjC,sCAiDF,CAAC;AAEF,eAAO,MAAM,6BAA6B,GACxC,qBAAqB,MAAM,GAAG,IAAI,KACjC,yBAwCF,CAAC;AAEF,eAAO,MAAM,iCAAiC,GAC5C,qBAAqB,MAAM,GAAG,IAAI,KACjC,6BAsBF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,cAAc,EACd,YAAY,EACZ,wBAAwB,GACzB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,cAAc,EACd,YAAY,EACZ,wBAAwB,GACzB,MAAM,iBAAiB,CAAC;AAkPzB,eAAO,MAAM,OAAO,SAAgB,CAAC;AA+mCrC,eAAO,MAAM,uBAAuB,GAAI,OAAO,OAAO,KAAG,IAGxD,CAAC;AAwCF,eAAO,MAAM,aAAa,GACxB,MAAM,MAAM,EAAE,EACd,kBAAkB,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,KACzC,OAAO,CAAC,IAAI,CAqCd,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HandleScheduledEventUseCaseHandler.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts"],"names":[],"mappings":"AAsDA,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":"AAsDA,OAAO,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AA2D3D,qBAAa,kCAAkC;IAC7C,MAAM,GACJ,gBAAgB,MAAM,EACtB,UAAU,OAAO,EACjB,6BAA4B,MAAM,EAAE,GAAG,IAAW,KACjD,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,CA01BP;CACH"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { GitHubGraphqlRateLimitRepository } from '../../domain/usecases/adapter-interfaces/GitHubGraphqlRateLimitRepository';
|
|
2
|
+
import { LocalCommandRunner } from '../../domain/usecases/adapter-interfaces/LocalCommandRunner';
|
|
3
|
+
export declare class CliGitHubGraphqlRateLimitRepository implements GitHubGraphqlRateLimitRepository {
|
|
4
|
+
private readonly localCommandRunner;
|
|
5
|
+
constructor(localCommandRunner: LocalCommandRunner);
|
|
6
|
+
getRemainingRequestCount: () => Promise<number | null>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=CliGitHubGraphqlRateLimitRepository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CliGitHubGraphqlRateLimitRepository.d.ts","sourceRoot":"","sources":["../../../src/adapter/repositories/CliGitHubGraphqlRateLimitRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gCAAgC,EAAE,MAAM,2EAA2E,CAAC;AAC7H,OAAO,EAAE,kBAAkB,EAAE,MAAM,6DAA6D,CAAC;AAEjG,qBAAa,mCAAoC,YAAW,gCAAgC;IAC9E,OAAO,CAAC,QAAQ,CAAC,kBAAkB;gBAAlB,kBAAkB,EAAE,kBAAkB;IAEnE,wBAAwB,QAAa,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAazD;CACH"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { SlackRepository } from '../../domain/usecases/adapter-interfaces/SlackRepository';
|
|
1
|
+
import type { SlackRepository } from '../../domain/usecases/adapter-interfaces/SlackRepository';
|
|
2
2
|
export declare class KySlackRepository implements SlackRepository {
|
|
3
3
|
private readonly client;
|
|
4
4
|
private readonly authHeader;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KySlackRepository.d.ts","sourceRoot":"","sources":["../../../src/adapter/repositories/KySlackRepository.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,0DAA0D,CAAC;
|
|
1
|
+
{"version":3,"file":"KySlackRepository.d.ts","sourceRoot":"","sources":["../../../src/adapter/repositories/KySlackRepository.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0DAA0D,CAAC;AAwEhG,qBAAa,iBAAkB,YAAW,eAAe;IACvD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;gBAEvC,SAAS,EAAE,MAAM;IAevB,oBAAoB,CACxB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;QACT,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IA8BI,0BAA0B,CAC9B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC;IA6BV,0BAA0B,CAC9B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC;IA6BV,6BAA6B,CACjC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC;CAmGjB"}
|
|
@@ -4,6 +4,7 @@ import { ProjectRepository } from './adapter-interfaces/ProjectRepository';
|
|
|
4
4
|
import { LocalCommandRunner } from './adapter-interfaces/LocalCommandRunner';
|
|
5
5
|
import { ClaudeTokenUsageRepository } from './adapter-interfaces/ClaudeTokenUsageRepository';
|
|
6
6
|
import { TakeOwnershipSpawnRepository } from './adapter-interfaces/TakeOwnershipSpawnRepository';
|
|
7
|
+
import { GitHubGraphqlRateLimitRepository } from './adapter-interfaces/GitHubGraphqlRateLimitRepository';
|
|
7
8
|
import { ClaudeTokenUsage } from '../entities/ClaudeTokenUsage';
|
|
8
9
|
export declare const NORMAL_CONCURRENT_LIMIT = 6;
|
|
9
10
|
export declare const DEFAULT_FALLBACK_LLM_MODEL_NAME = "claude-opus-4-8";
|
|
@@ -28,7 +29,8 @@ export declare class StartPreparationUseCase {
|
|
|
28
29
|
private readonly localCommandRunner;
|
|
29
30
|
private readonly claudeTokenUsageRepository;
|
|
30
31
|
private readonly takeOwnershipSpawnRepository;
|
|
31
|
-
|
|
32
|
+
private readonly gitHubGraphqlRateLimitRepository;
|
|
33
|
+
constructor(projectRepository: Pick<ProjectRepository, 'getByUrl' | 'createField' | 'updateAgentList'>, issueRepository: Pick<IssueRepository, 'getStoryObjectMap' | 'getAllOpened' | 'updateStatus' | 'findRelatedOpenPRs' | 'getOpenPullRequest' | 'closePullRequest' | 'deletePullRequestBranch' | 'createCommentByUrl' | 'setIssueAgentField' | 'removeLabel'>, localCommandRunner: LocalCommandRunner, claudeTokenUsageRepository: ClaudeTokenUsageRepository, takeOwnershipSpawnRepository: TakeOwnershipSpawnRepository, gitHubGraphqlRateLimitRepository: GitHubGraphqlRateLimitRepository);
|
|
32
34
|
private weeklyLimitTypeForModel;
|
|
33
35
|
private isWithinCooldown;
|
|
34
36
|
private isModelWeeklyLimitRejected;
|
|
@@ -56,6 +58,8 @@ export declare class StartPreparationUseCase {
|
|
|
56
58
|
labelsAsLlmAgentName: string[] | null;
|
|
57
59
|
agents?: string[] | null;
|
|
58
60
|
normalConcurrentLimit?: number;
|
|
61
|
+
maxConcurrentWorkers?: number | null;
|
|
62
|
+
graphqlRateLimitFloor?: number | null;
|
|
59
63
|
}) => Promise<{
|
|
60
64
|
rotationOrder: RotationOrderEntry[] | null;
|
|
61
65
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StartPreparationUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/StartPreparationUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,kBAAkB,EACnB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,0BAA0B,EAAE,MAAM,iDAAiD,CAAC;AAC7F,OAAO,EAAE,4BAA4B,EAAE,MAAM,mDAAmD,CAAC;AACjG,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAYhE,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAGzC,eAAO,MAAM,+BAA+B,oBAAoB,CAAC;AAEjE,eAAO,MAAM,yCAAyC,IAAI,CAAC;AAE3D,MAAM,MAAM,6BAA6B,GACrC,mBAAmB,GACnB,sBAAsB,GACtB,0BAA0B,GAC1B,kBAAkB,GAClB,sBAAsB,CAAC;AAE3B,MAAM,MAAM,0BAA0B,GAAG;IACvC,eAAe,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC3C,uBAAuB,EAAE,kBAAkB,EAAE,CAAC;CAC/C,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAI,aAAa,MAAM,KAAG,MAGvC,CAAC;AAEzB,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB,EAAE,MAAM,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,gBAAgB,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,qBAAa,uBAAuB;IAEhC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAIlC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAahC,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,0BAA0B;IAC3C,OAAO,CAAC,QAAQ,CAAC,4BAA4B;
|
|
1
|
+
{"version":3,"file":"StartPreparationUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/StartPreparationUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,kBAAkB,EACnB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,0BAA0B,EAAE,MAAM,iDAAiD,CAAC;AAC7F,OAAO,EAAE,4BAA4B,EAAE,MAAM,mDAAmD,CAAC;AACjG,OAAO,EAAE,gCAAgC,EAAE,MAAM,uDAAuD,CAAC;AACzG,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAYhE,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAGzC,eAAO,MAAM,+BAA+B,oBAAoB,CAAC;AAEjE,eAAO,MAAM,yCAAyC,IAAI,CAAC;AAE3D,MAAM,MAAM,6BAA6B,GACrC,mBAAmB,GACnB,sBAAsB,GACtB,0BAA0B,GAC1B,kBAAkB,GAClB,sBAAsB,CAAC;AAE3B,MAAM,MAAM,0BAA0B,GAAG;IACvC,eAAe,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC3C,uBAAuB,EAAE,kBAAkB,EAAE,CAAC;CAC/C,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAI,aAAa,MAAM,KAAG,MAGvC,CAAC;AAEzB,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB,EAAE,MAAM,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,gBAAgB,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,qBAAa,uBAAuB;IAEhC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAIlC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAahC,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,0BAA0B;IAC3C,OAAO,CAAC,QAAQ,CAAC,4BAA4B;IAC7C,OAAO,CAAC,QAAQ,CAAC,gCAAgC;gBApBhC,iBAAiB,EAAE,IAAI,CACtC,iBAAiB,EACjB,UAAU,GAAG,aAAa,GAAG,iBAAiB,CAC/C,EACgB,eAAe,EAAE,IAAI,CACpC,eAAe,EACb,mBAAmB,GACnB,cAAc,GACd,cAAc,GACd,oBAAoB,GACpB,oBAAoB,GACpB,kBAAkB,GAClB,yBAAyB,GACzB,oBAAoB,GACpB,oBAAoB,GACpB,aAAa,CAChB,EACgB,kBAAkB,EAAE,kBAAkB,EACtC,0BAA0B,EAAE,0BAA0B,EACtD,4BAA4B,EAAE,4BAA4B,EAC1D,gCAAgC,EAAE,gCAAgC;IAGrF,OAAO,CAAC,uBAAuB,CAK7B;IAEF,OAAO,CAAC,gBAAgB,CAGgC;IAExD,OAAO,CAAC,0BAA0B,CAQhC;IAEF,OAAO,CAAC,mBAAmB,CAqBzB;IAEF,OAAO,CAAC,yBAAyB,CAc/B;IAEF,OAAO,CAAC,wCAAwC,CAqB9C;IAEF,OAAO,CAAC,sBAAsB,CAU5B;IAEF,uBAAuB,GACrB,qBAAqB,MAAM,EAC3B,qBAAqB,MAAM,EAC3B,kBAAkB,MAAM,EACxB,wBAAuB,MAAgC,KACtD,MAAM,CAgBP;IAEF,+BAA+B,GAC7B,OAAO,KAAK,EACZ,qBAAqB,MAAM,EAAE,GAAG,IAAI,EACpC,SAAS,MAAM,EACf,KAAK,IAAI,KACR,6BAA6B,GAAG,IAAI,CAsBrC;IAEF,gCAAgC,GAC9B,WAAW,MAAM,EAAE,KAClB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC,CAsCjD;IAEF,OAAO,CAAC,oBAAoB,CA+E1B;IAEF,kBAAkB,GAChB,aAAa,gBAAgB,EAAE,EAC/B,gCAAgC,MAAM,EACtC,WAAW,MAAM,GAAG,IAAI,KACvB,kBAAkB,EAAE,CAqDrB;IAEF,GAAG,GAAU,QAAQ;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,gBAAgB,EAAE,MAAM,CAAC;QACzB,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;QACnC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;QACpC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;QACnC,cAAc,EAAE,MAAM,CAAC;QACvB,2BAA2B,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3C,8BAA8B,EAAE,MAAM,CAAC;QACvC,mBAAmB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QACrC,OAAO,EAAE,MAAM,CAAC;QAChB,mBAAmB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QACrC,oBAAoB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QACtC,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QACzB,qBAAqB,CAAC,EAAE,MAAM,CAAC;QAC/B,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACrC,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KACvC,KAAG,OAAO,CAAC;QAAE,aAAa,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAAA;KAAE,CAAC,CA+bzD;CACH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitHubGraphqlRateLimitRepository.d.ts","sourceRoot":"","sources":["../../../../src/domain/usecases/adapter-interfaces/GitHubGraphqlRateLimitRepository.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gCAAgC;IAC/C,wBAAwB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACpD"}
|