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.
Files changed (43) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +9 -1
  3. package/bin/adapter/entry-points/cli/fleetConfig.js +7 -1
  4. package/bin/adapter/entry-points/cli/fleetConfig.js.map +1 -1
  5. package/bin/adapter/entry-points/cli/index.js +11 -3
  6. package/bin/adapter/entry-points/cli/index.js.map +1 -1
  7. package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js +2 -1
  8. package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js.map +1 -1
  9. package/bin/adapter/repositories/CliGitHubGraphqlRateLimitRepository.js +24 -0
  10. package/bin/adapter/repositories/CliGitHubGraphqlRateLimitRepository.js.map +1 -0
  11. package/bin/adapter/repositories/KySlackRepository.js +2 -1
  12. package/bin/adapter/repositories/KySlackRepository.js.map +1 -1
  13. package/bin/domain/usecases/StartPreparationUseCase.js +22 -1
  14. package/bin/domain/usecases/StartPreparationUseCase.js.map +1 -1
  15. package/bin/domain/usecases/adapter-interfaces/GitHubGraphqlRateLimitRepository.js +3 -0
  16. package/bin/domain/usecases/adapter-interfaces/GitHubGraphqlRateLimitRepository.js.map +1 -0
  17. package/package.json +1 -1
  18. package/src/adapter/entry-points/cli/fleetConfig.test.ts +99 -0
  19. package/src/adapter/entry-points/cli/fleetConfig.ts +25 -0
  20. package/src/adapter/entry-points/cli/index.test.ts +4 -0
  21. package/src/adapter/entry-points/cli/index.ts +16 -2
  22. package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts +2 -0
  23. package/src/adapter/repositories/CliGitHubGraphqlRateLimitRepository.test.ts +71 -0
  24. package/src/adapter/repositories/CliGitHubGraphqlRateLimitRepository.ts +21 -0
  25. package/src/adapter/repositories/KySlackRepository.test.ts +49 -1
  26. package/src/adapter/repositories/KySlackRepository.ts +3 -2
  27. package/src/domain/usecases/ConflictedIssueRevertUseCase.test.ts +74 -0
  28. package/src/domain/usecases/StartPreparationUseCase.test.ts +229 -0
  29. package/src/domain/usecases/StartPreparationUseCase.ts +35 -0
  30. package/src/domain/usecases/adapter-interfaces/GitHubGraphqlRateLimitRepository.ts +3 -0
  31. package/src/domain/usecases/issueReactivationTriggerIsPending.test.ts +1 -0
  32. package/types/adapter/entry-points/cli/fleetConfig.d.ts +4 -0
  33. package/types/adapter/entry-points/cli/fleetConfig.d.ts.map +1 -1
  34. package/types/adapter/entry-points/cli/index.d.ts.map +1 -1
  35. package/types/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.d.ts.map +1 -1
  36. package/types/adapter/repositories/CliGitHubGraphqlRateLimitRepository.d.ts +8 -0
  37. package/types/adapter/repositories/CliGitHubGraphqlRateLimitRepository.d.ts.map +1 -0
  38. package/types/adapter/repositories/KySlackRepository.d.ts +1 -1
  39. package/types/adapter/repositories/KySlackRepository.d.ts.map +1 -1
  40. package/types/domain/usecases/StartPreparationUseCase.d.ts +5 -1
  41. package/types/domain/usecases/StartPreparationUseCase.d.ts.map +1 -1
  42. package/types/domain/usecases/adapter-interfaces/GitHubGraphqlRateLimitRepository.d.ts +4 -0
  43. 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,
@@ -0,0 +1,3 @@
1
+ export interface GitHubGraphqlRateLimitRepository {
2
+ getRemainingRequestCount(): Promise<number | null>;
3
+ }
@@ -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,yBAEjD,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,yBAsBF,CAAC;AAEF,eAAO,MAAM,iCAAiC,GAC5C,qBAAqB,MAAM,GAAG,IAAI,KACjC,6BAsBF,CAAC"}
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;AAiPzB,eAAO,MAAM,OAAO,SAAgB,CAAC;AAkmCrC,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
+ {"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;AA0D3D,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,CAy1BP;CACH"}
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;AAwE3F,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;IAcvB,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"}
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
- 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);
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":"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"}
1
+ {"version":3,"file":"StartPreparationUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/StartPreparationUseCase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export interface GitHubGraphqlRateLimitRepository {
2
+ getRemainingRequestCount(): Promise<number | null>;
3
+ }
4
+ //# sourceMappingURL=GitHubGraphqlRateLimitRepository.d.ts.map
@@ -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"}