github-issue-tower-defence-management 2.1.2 → 2.3.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 +8 -0
- package/bin/adapter/entry-points/cli/fleetConfig.js +30 -12
- package/bin/adapter/entry-points/cli/fleetConfig.js.map +1 -1
- package/bin/adapter/entry-points/cli/index.js +5 -0
- package/bin/adapter/entry-points/cli/index.js.map +1 -1
- package/bin/adapter/entry-points/console/consoleDoneStore.js +0 -2
- package/bin/adapter/entry-points/console/consoleDoneStore.js.map +1 -1
- package/bin/adapter/entry-points/console/consoleTabNames.js +0 -1
- package/bin/adapter/entry-points/console/consoleTabNames.js.map +1 -1
- package/bin/adapter/entry-points/console/ui-dist/assets/index-C5cOzhyn.js +86 -0
- package/bin/adapter/entry-points/console/ui-dist/index.html +1 -1
- package/bin/domain/usecases/StartPreparationUseCase.js +13 -12
- package/bin/domain/usecases/StartPreparationUseCase.js.map +1 -1
- package/bin/domain/usecases/console/GenerateConsoleListsUseCase.js +0 -15
- package/bin/domain/usecases/console/GenerateConsoleListsUseCase.js.map +1 -1
- package/package.json +1 -1
- package/src/adapter/entry-points/cli/fleetConfig.test.ts +96 -0
- package/src/adapter/entry-points/cli/fleetConfig.ts +51 -6
- package/src/adapter/entry-points/cli/index.test.ts +2 -0
- package/src/adapter/entry-points/cli/index.ts +16 -0
- package/src/adapter/entry-points/console/consoleDataDelivery.test.ts +15 -9
- package/src/adapter/entry-points/console/consoleDoneStore.ts +0 -2
- package/src/adapter/entry-points/console/consoleItemUrlLookup.test.ts +1 -1
- package/src/adapter/entry-points/console/consoleTabNames.ts +0 -1
- package/src/adapter/entry-points/console/ui/e2e/consoleScenario.spec.ts +7 -115
- package/src/adapter/entry-points/console/ui/e2e/consoleTestHarness.ts +0 -16
- package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemDetail.stories.tsx +1 -3
- package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTabList.stories.tsx +0 -4
- package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTabList.test.tsx +0 -1
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOperationMenu.stories.tsx +0 -10
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOperationMenu.test.tsx +2 -28
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOperationMenu.tsx +0 -10
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleNavigation.test.ts +18 -14
- package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleOverlay.test.ts +2 -2
- package/src/adapter/entry-points/console/ui/src/features/console/logic/actionToast.test.ts +1 -1
- package/src/adapter/entry-points/console/ui/src/features/console/logic/grouping.test.ts +7 -7
- package/src/adapter/entry-points/console/ui/src/features/console/logic/overlay.test.ts +10 -8
- package/src/adapter/entry-points/console/ui/src/features/console/logic/tabAdvance.test.ts +9 -11
- package/src/adapter/entry-points/console/ui/src/features/console/logic/types.ts +1 -12
- package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsoleItemDetailContainer.test.tsx +0 -12
- package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsoleItemDetailContainer.tsx +0 -3
- package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsolePage.tsx +10 -57
- package/src/adapter/entry-points/console/ui-dist/assets/index-C5cOzhyn.js +86 -0
- package/src/adapter/entry-points/console/ui-dist/index.html +1 -1
- package/src/adapter/entry-points/console/webServer.test.ts +2 -2
- package/src/adapter/entry-points/handlers/consoleListsWriter.test.ts +0 -1
- package/src/domain/usecases/StartPreparationUseCase.test.ts +97 -0
- package/src/domain/usecases/StartPreparationUseCase.ts +13 -3
- package/src/domain/usecases/console/GenerateConsoleListsUseCase.test.ts +2 -160
- package/src/domain/usecases/console/GenerateConsoleListsUseCase.ts +0 -37
- package/types/adapter/entry-points/cli/fleetConfig.d.ts +6 -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/console/consoleDoneStore.d.ts.map +1 -1
- package/types/adapter/entry-points/console/consoleTabNames.d.ts.map +1 -1
- package/types/domain/usecases/StartPreparationUseCase.d.ts +3 -1
- package/types/domain/usecases/StartPreparationUseCase.d.ts.map +1 -1
- package/types/domain/usecases/console/GenerateConsoleListsUseCase.d.ts +1 -11
- package/types/domain/usecases/console/GenerateConsoleListsUseCase.d.ts.map +1 -1
- package/bin/adapter/entry-points/console/ui-dist/assets/index-BVyeR7xJ.js +0 -86
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleStoryActions.stories.tsx +0 -80
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleStoryActions.test.tsx +0 -39
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleStoryActions.tsx +0 -42
- package/src/adapter/entry-points/console/ui-dist/assets/index-BVyeR7xJ.js +0 -86
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>TDPM Console</title>
|
|
7
|
-
<script type="module" crossorigin src="/assets/index-
|
|
7
|
+
<script type="module" crossorigin src="/assets/index-C5cOzhyn.js"></script>
|
|
8
8
|
<link rel="stylesheet" crossorigin href="/assets/index-CLHvrafO.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
@@ -82,7 +82,7 @@ describe('webServer pure helpers', () => {
|
|
|
82
82
|
it('matches a per-project tab route for every list tab', () => {
|
|
83
83
|
expect(isConsoleAppRoute('/projects/acme/workflow-blocker')).toBe(true);
|
|
84
84
|
expect(isConsoleAppRoute('/projects/acme/prs')).toBe(true);
|
|
85
|
-
expect(isConsoleAppRoute('/projects/globex/
|
|
85
|
+
expect(isConsoleAppRoute('/projects/globex/todo-by-agent')).toBe(true);
|
|
86
86
|
expect(isConsoleAppRoute('/projects/initech/todo-by-human')).toBe(true);
|
|
87
87
|
expect(isConsoleAppRoute('/projects/umbrella/failed-preparation')).toBe(
|
|
88
88
|
true,
|
|
@@ -379,7 +379,7 @@ describe('webServer integration', () => {
|
|
|
379
379
|
port: 0,
|
|
380
380
|
});
|
|
381
381
|
try {
|
|
382
|
-
const projectRoot = await requestServer(server, '/projects/acme/
|
|
382
|
+
const projectRoot = await requestServer(server, '/projects/acme/prs');
|
|
383
383
|
expect(projectRoot.statusCode).toBe(200);
|
|
384
384
|
expect(projectRoot.body).toContain('TDPM Console');
|
|
385
385
|
} finally {
|
|
@@ -7393,6 +7393,103 @@ describe('StartPreparationUseCase.getTokenConcurrentLimit', () => {
|
|
|
7393
7393
|
it('never lets a selection weight take the limit below one slot', () => {
|
|
7394
7394
|
expect(useCase.getTokenConcurrentLimit(0.1, 0.1, 0.01)).toBe(1);
|
|
7395
7395
|
});
|
|
7396
|
+
|
|
7397
|
+
it('uses normalConcurrentLimit as the full-speed ceiling when both utilizations are low', () => {
|
|
7398
|
+
expect(useCase.getTokenConcurrentLimit(0.1, 0.1, undefined, 10)).toBe(10);
|
|
7399
|
+
});
|
|
7400
|
+
|
|
7401
|
+
it('tapers from normalConcurrentLimit when utilization is above the threshold', () => {
|
|
7402
|
+
expect(useCase.getTokenConcurrentLimit(0.1, 0.9, undefined, 10)).toBe(5);
|
|
7403
|
+
});
|
|
7404
|
+
});
|
|
7405
|
+
|
|
7406
|
+
describe('StartPreparationUseCase.run normalConcurrentLimit', () => {
|
|
7407
|
+
it('applies a custom normalConcurrentLimit to cap token concurrency per token', async () => {
|
|
7408
|
+
const mockProject = createMockProject();
|
|
7409
|
+
const awaitingIssue = createMockIssue({
|
|
7410
|
+
url: 'https://github.com/user/repo/issues/1',
|
|
7411
|
+
status: 'Awaiting Workspace',
|
|
7412
|
+
story: 'some-story',
|
|
7413
|
+
});
|
|
7414
|
+
const mockProjectRepository = {
|
|
7415
|
+
getByUrl: jest.fn().mockResolvedValue(mockProject),
|
|
7416
|
+
createField: jest.fn().mockResolvedValue(undefined),
|
|
7417
|
+
updateAgentList: jest.fn().mockResolvedValue([]),
|
|
7418
|
+
};
|
|
7419
|
+
const mockIssueRepository = {
|
|
7420
|
+
getStoryObjectMap: jest
|
|
7421
|
+
.fn()
|
|
7422
|
+
.mockResolvedValue(createMockStoryObjectMap([awaitingIssue])),
|
|
7423
|
+
getAllOpened: jest.fn().mockResolvedValue([awaitingIssue]),
|
|
7424
|
+
updateStatus: jest.fn().mockResolvedValue(undefined),
|
|
7425
|
+
findRelatedOpenPRs: jest.fn().mockResolvedValue([]),
|
|
7426
|
+
getOpenPullRequest: jest.fn().mockResolvedValue(null),
|
|
7427
|
+
closePullRequest: jest.fn().mockResolvedValue(undefined),
|
|
7428
|
+
deletePullRequestBranch: jest.fn().mockResolvedValue(undefined),
|
|
7429
|
+
createCommentByUrl: jest.fn().mockResolvedValue(undefined),
|
|
7430
|
+
setIssueAgentField: jest.fn().mockResolvedValue(undefined),
|
|
7431
|
+
removeLabel: jest.fn().mockResolvedValue(undefined),
|
|
7432
|
+
};
|
|
7433
|
+
const mockLocalCommandRunner = {
|
|
7434
|
+
runCommand: jest
|
|
7435
|
+
.fn()
|
|
7436
|
+
.mockResolvedValue({ stdout: '', stderr: '', exitCode: 0 }),
|
|
7437
|
+
spawnInteractive: jest.fn(),
|
|
7438
|
+
};
|
|
7439
|
+
const token = 'token-a';
|
|
7440
|
+
const mockClaudeTokenUsageRepository = {
|
|
7441
|
+
ensureObservable: jest.fn().mockResolvedValue(undefined),
|
|
7442
|
+
getAvailableTokenUsages: jest.fn().mockResolvedValue([
|
|
7443
|
+
{
|
|
7444
|
+
token,
|
|
7445
|
+
name: 'token-a',
|
|
7446
|
+
fiveHourUtilization: 0.0,
|
|
7447
|
+
sevenDayUtilization: 0.0,
|
|
7448
|
+
fiveHourRejected: false,
|
|
7449
|
+
blocked: false,
|
|
7450
|
+
blockedUntilEpoch: 0,
|
|
7451
|
+
modelWeeklyLimits: {},
|
|
7452
|
+
selectionWeight: undefined,
|
|
7453
|
+
},
|
|
7454
|
+
]),
|
|
7455
|
+
getTokenInFlightCounts: jest.fn().mockResolvedValue({ [token]: 0 }),
|
|
7456
|
+
proxyBaseUrl: jest.fn().mockReturnValue('http://127.0.0.1:8787'),
|
|
7457
|
+
};
|
|
7458
|
+
const mockTakeOwnershipSpawnRepository = {
|
|
7459
|
+
listSpawns: jest.fn().mockReturnValue([]),
|
|
7460
|
+
listRunningIssueUrls: jest.fn().mockReturnValue([]),
|
|
7461
|
+
};
|
|
7462
|
+
const useCase = new StartPreparationUseCase(
|
|
7463
|
+
mockProjectRepository,
|
|
7464
|
+
mockIssueRepository,
|
|
7465
|
+
mockLocalCommandRunner,
|
|
7466
|
+
mockClaudeTokenUsageRepository,
|
|
7467
|
+
mockTakeOwnershipSpawnRepository,
|
|
7468
|
+
);
|
|
7469
|
+
|
|
7470
|
+
await useCase.run({
|
|
7471
|
+
projectUrl: 'https://github.com/users/user/projects/1',
|
|
7472
|
+
defaultAgentName: 'agent1',
|
|
7473
|
+
defaultLlmModelName: 'claude-opus',
|
|
7474
|
+
fallbackLlmModelName: null,
|
|
7475
|
+
defaultLlmAgentName: null,
|
|
7476
|
+
configFilePath: '/path/to/config.yml',
|
|
7477
|
+
maximumPreparingIssuesCount: 20,
|
|
7478
|
+
utilizationPercentageThreshold: 90,
|
|
7479
|
+
allowedIssueAuthors: ['testuser'],
|
|
7480
|
+
manager: 'manager-user',
|
|
7481
|
+
codexHomeCandidates: null,
|
|
7482
|
+
labelsAsLlmAgentName: null,
|
|
7483
|
+
normalConcurrentLimit: 10,
|
|
7484
|
+
});
|
|
7485
|
+
|
|
7486
|
+
expect(mockLocalCommandRunner.runCommand).toHaveBeenCalledTimes(1);
|
|
7487
|
+
expect(mockLocalCommandRunner.runCommand).toHaveBeenCalledWith(
|
|
7488
|
+
'aw',
|
|
7489
|
+
expect.any(Array),
|
|
7490
|
+
expect.anything(),
|
|
7491
|
+
);
|
|
7492
|
+
});
|
|
7396
7493
|
});
|
|
7397
7494
|
|
|
7398
7495
|
describe('StartPreparationUseCase.fetchSpawnCandidateBranchSources', () => {
|
|
@@ -19,7 +19,7 @@ import { issueReactivationTriggerIsPending } from './issueReactivationTriggerIsP
|
|
|
19
19
|
import { ensureAgentOptionAndGetId } from './ensureAgentOptionAndGetId';
|
|
20
20
|
import { isAuthorAuthorizedForAutoStatusCheck } from './isAuthorAuthorizedForAutoStatusCheck';
|
|
21
21
|
|
|
22
|
-
const NORMAL_CONCURRENT_LIMIT = 6;
|
|
22
|
+
export const NORMAL_CONCURRENT_LIMIT = 6;
|
|
23
23
|
const SEVEN_DAY_THROTTLE_START_THRESHOLD = 0.8;
|
|
24
24
|
const FIVE_HOUR_THROTTLE_START_THRESHOLD = 0.8;
|
|
25
25
|
export const DEFAULT_FALLBACK_LLM_MODEL_NAME = 'claude-opus-4-8';
|
|
@@ -163,26 +163,30 @@ export class StartPreparationUseCase {
|
|
|
163
163
|
private taperedConcurrentLimit = (
|
|
164
164
|
utilization: number,
|
|
165
165
|
throttleStartThreshold: number,
|
|
166
|
+
normalConcurrentLimit: number,
|
|
166
167
|
): number => {
|
|
167
168
|
if (utilization < throttleStartThreshold) {
|
|
168
|
-
return
|
|
169
|
+
return normalConcurrentLimit;
|
|
169
170
|
}
|
|
170
171
|
const remaining = (1 - utilization) / (1 - throttleStartThreshold);
|
|
171
|
-
return Math.max(1, Math.ceil(
|
|
172
|
+
return Math.max(1, Math.ceil(normalConcurrentLimit * remaining));
|
|
172
173
|
};
|
|
173
174
|
|
|
174
175
|
getTokenConcurrentLimit = (
|
|
175
176
|
fiveHourUtilization: number,
|
|
176
177
|
sevenDayUtilization: number,
|
|
177
178
|
selectionWeight?: number,
|
|
179
|
+
normalConcurrentLimit: number = NORMAL_CONCURRENT_LIMIT,
|
|
178
180
|
): number => {
|
|
179
181
|
const sevenDayLimit = this.taperedConcurrentLimit(
|
|
180
182
|
sevenDayUtilization,
|
|
181
183
|
SEVEN_DAY_THROTTLE_START_THRESHOLD,
|
|
184
|
+
normalConcurrentLimit,
|
|
182
185
|
);
|
|
183
186
|
const fiveHourLimit = this.taperedConcurrentLimit(
|
|
184
187
|
fiveHourUtilization,
|
|
185
188
|
FIVE_HOUR_THROTTLE_START_THRESHOLD,
|
|
189
|
+
normalConcurrentLimit,
|
|
186
190
|
);
|
|
187
191
|
const weight = selectionWeight ?? DEFAULT_SELECTION_WEIGHT;
|
|
188
192
|
return Math.max(
|
|
@@ -268,6 +272,7 @@ export class StartPreparationUseCase {
|
|
|
268
272
|
defaultModelName: string | null,
|
|
269
273
|
fallbackModelName: string | null,
|
|
270
274
|
maxConcurrent: number,
|
|
275
|
+
normalConcurrentLimit: number,
|
|
271
276
|
): {
|
|
272
277
|
tokens: string[];
|
|
273
278
|
effectiveCap: number;
|
|
@@ -317,6 +322,7 @@ export class StartPreparationUseCase {
|
|
|
317
322
|
usage.fiveHourUtilization,
|
|
318
323
|
usage.sevenDayUtilization,
|
|
319
324
|
usage.selectionWeight,
|
|
325
|
+
normalConcurrentLimit,
|
|
320
326
|
),
|
|
321
327
|
secondsUntilSevenDayReset: this.secondsUntilSevenDayReset(
|
|
322
328
|
usage,
|
|
@@ -414,7 +420,10 @@ export class StartPreparationUseCase {
|
|
|
414
420
|
codexHomeCandidates: string[] | null;
|
|
415
421
|
labelsAsLlmAgentName: string[] | null;
|
|
416
422
|
agents?: string[] | null;
|
|
423
|
+
normalConcurrentLimit?: number;
|
|
417
424
|
}): Promise<{ rotationOrder: RotationOrderEntry[] | null }> => {
|
|
425
|
+
const normalConcurrentLimit =
|
|
426
|
+
params.normalConcurrentLimit ?? NORMAL_CONCURRENT_LIMIT;
|
|
418
427
|
const tokenUsages =
|
|
419
428
|
await this.claudeTokenUsageRepository.getAvailableTokenUsages();
|
|
420
429
|
let rotationTokens: string[] | null = null;
|
|
@@ -450,6 +459,7 @@ export class StartPreparationUseCase {
|
|
|
450
459
|
params.defaultLlmModelName,
|
|
451
460
|
fallbackLlmModelName,
|
|
452
461
|
maximumPreparingIssuesCount,
|
|
462
|
+
normalConcurrentLimit,
|
|
453
463
|
);
|
|
454
464
|
if (selectedTokens.length === 0) {
|
|
455
465
|
console.warn(
|
|
@@ -219,139 +219,6 @@ describe('GenerateConsoleListsUseCase', () => {
|
|
|
219
219
|
]);
|
|
220
220
|
expect(result['todo-by-agent'].items).toHaveLength(0);
|
|
221
221
|
});
|
|
222
|
-
|
|
223
|
-
it('selects all actionable items for triage regardless of story', () => {
|
|
224
|
-
const result = run([
|
|
225
|
-
makeIssue({ story: 'regular / NO STORY; SET STORY FIELD' }),
|
|
226
|
-
makeIssue({ story: 'no story please' }),
|
|
227
|
-
makeIssue({ story: 'Story Alpha' }),
|
|
228
|
-
makeIssue({ story: null }),
|
|
229
|
-
]);
|
|
230
|
-
expect(result.triage.items).toHaveLength(4);
|
|
231
|
-
});
|
|
232
|
-
|
|
233
|
-
it('excludes In Tmux by agent items from triage regardless of story', () => {
|
|
234
|
-
const result = run([
|
|
235
|
-
makeIssue({ story: 'no story', status: 'In Tmux by agent' }),
|
|
236
|
-
makeIssue({ story: 'no story', status: 'in tmux by agent' }),
|
|
237
|
-
makeIssue({ story: 'no story', status: 'Unread' }),
|
|
238
|
-
]);
|
|
239
|
-
const statuses = result.triage.items.map((item) => item.status);
|
|
240
|
-
expect(statuses).toEqual(['Unread']);
|
|
241
|
-
});
|
|
242
|
-
|
|
243
|
-
it('excludes items with reactivation triggers from triage', () => {
|
|
244
|
-
const result = run([
|
|
245
|
-
makeIssue({
|
|
246
|
-
story: 'no story',
|
|
247
|
-
dependedIssueUrls: ['https://github.com/demo/repo/issues/99'],
|
|
248
|
-
}),
|
|
249
|
-
makeIssue({
|
|
250
|
-
story: 'no story',
|
|
251
|
-
nextActionDate: new Date('2026-08-20T00:00:00.000Z'),
|
|
252
|
-
}),
|
|
253
|
-
makeIssue({ story: 'no story', nextActionHour: 9 }),
|
|
254
|
-
]);
|
|
255
|
-
expect(result.triage.items).toHaveLength(0);
|
|
256
|
-
});
|
|
257
|
-
|
|
258
|
-
it('includes pull requests in triage when assigned, excludes unassigned and closed', () => {
|
|
259
|
-
const result = run([
|
|
260
|
-
makeIssue({ story: 'no story', isPr: true }),
|
|
261
|
-
makeIssue({ story: 'no story', assignees: ['someone-else'] }),
|
|
262
|
-
makeIssue({ story: 'no story', isClosed: true }),
|
|
263
|
-
]);
|
|
264
|
-
expect(result.triage.items).toHaveLength(1);
|
|
265
|
-
});
|
|
266
|
-
|
|
267
|
-
it('includes all actionable items in triage including those with a real story or null story', () => {
|
|
268
|
-
const result = run([
|
|
269
|
-
makeIssue({ story: null, status: 'Awaiting Workspace' }),
|
|
270
|
-
makeIssue({ story: null, status: null }),
|
|
271
|
-
makeIssue({ story: 'regular / NO STORY' }),
|
|
272
|
-
makeIssue({ story: 'Story Alpha' }),
|
|
273
|
-
]);
|
|
274
|
-
expect(result.triage.items).toHaveLength(4);
|
|
275
|
-
});
|
|
276
|
-
|
|
277
|
-
it('includes pull requests in triage, excludes unassigned and closed items with null story', () => {
|
|
278
|
-
const result = run([
|
|
279
|
-
makeIssue({ story: null, isPr: true }),
|
|
280
|
-
makeIssue({ story: null, assignees: ['someone-else'] }),
|
|
281
|
-
makeIssue({ story: null, isClosed: true }),
|
|
282
|
-
]);
|
|
283
|
-
expect(result.triage.items).toHaveLength(1);
|
|
284
|
-
});
|
|
285
|
-
|
|
286
|
-
it('shows all actionable items in triage whatever status they carry, excluding In Tmux by agent', () => {
|
|
287
|
-
const result = run([
|
|
288
|
-
makeIssue({ story: 'no story', status: 'Unread' }),
|
|
289
|
-
makeIssue({ story: 'no story', status: 'Awaiting Workspace' }),
|
|
290
|
-
makeIssue({ story: 'no story', status: 'In Tmux by agent' }),
|
|
291
|
-
makeIssue({ story: 'no story', status: 'Preparation' }),
|
|
292
|
-
makeIssue({ story: 'no story', status: 'Failed Preparation' }),
|
|
293
|
-
makeIssue({ story: 'no story', status: 'Awaiting Quality Check' }),
|
|
294
|
-
makeIssue({ story: 'no story', status: 'Todo by human' }),
|
|
295
|
-
makeIssue({ story: 'no story', status: 'Todo by agent' }),
|
|
296
|
-
makeIssue({ story: 'no story', status: 'In Tmux by human' }),
|
|
297
|
-
makeIssue({ story: 'no story', status: 'Done' }),
|
|
298
|
-
makeIssue({ story: 'no story', status: 'Icebox' }),
|
|
299
|
-
]);
|
|
300
|
-
expect(result.triage.items.map((item) => item.status)).toEqual([
|
|
301
|
-
'Unread',
|
|
302
|
-
'Awaiting Workspace',
|
|
303
|
-
'Preparation',
|
|
304
|
-
'Failed Preparation',
|
|
305
|
-
'Awaiting Quality Check',
|
|
306
|
-
'Todo by human',
|
|
307
|
-
'Todo by agent',
|
|
308
|
-
'In Tmux by human',
|
|
309
|
-
'Done',
|
|
310
|
-
'Icebox',
|
|
311
|
-
]);
|
|
312
|
-
});
|
|
313
|
-
|
|
314
|
-
it('shows items with any story in triage at every status except In Tmux by agent', () => {
|
|
315
|
-
const result = run([
|
|
316
|
-
makeIssue({ story: 'Story Alpha', status: 'Unread' }),
|
|
317
|
-
makeIssue({ story: 'Story Alpha', status: 'Awaiting Workspace' }),
|
|
318
|
-
makeIssue({ story: 'Story Alpha', status: 'In Tmux by agent' }),
|
|
319
|
-
makeIssue({ story: 'Story Alpha', status: 'Preparation' }),
|
|
320
|
-
makeIssue({ story: 'Story Alpha', status: 'Failed Preparation' }),
|
|
321
|
-
makeIssue({ story: 'Story Alpha', status: 'Awaiting Quality Check' }),
|
|
322
|
-
makeIssue({ story: 'Story Alpha', status: 'Todo by human' }),
|
|
323
|
-
makeIssue({ story: 'Story Alpha', status: 'Todo by agent' }),
|
|
324
|
-
makeIssue({ story: 'Story Alpha', status: 'In Tmux by human' }),
|
|
325
|
-
makeIssue({ story: 'Story Alpha', status: 'Done' }),
|
|
326
|
-
makeIssue({ story: 'Story Alpha', status: 'Icebox' }),
|
|
327
|
-
]);
|
|
328
|
-
expect(result.triage.items).toHaveLength(10);
|
|
329
|
-
});
|
|
330
|
-
|
|
331
|
-
it('keeps a no-story item whose status is written in a different case', () => {
|
|
332
|
-
const result = run([
|
|
333
|
-
makeIssue({ story: 'no story', status: 'unread' }),
|
|
334
|
-
makeIssue({ story: 'no story', status: 'awaiting workspace' }),
|
|
335
|
-
makeIssue({ story: 'no story', status: 'failed preparation' }),
|
|
336
|
-
]);
|
|
337
|
-
expect(result.triage.items.map((item) => item.status)).toEqual([
|
|
338
|
-
'unread',
|
|
339
|
-
'awaiting workspace',
|
|
340
|
-
'failed preparation',
|
|
341
|
-
]);
|
|
342
|
-
});
|
|
343
|
-
|
|
344
|
-
it('keeps an item carrying the story option this tool assigns automatically once its status has advanced', () => {
|
|
345
|
-
const result = run([
|
|
346
|
-
makeIssue({
|
|
347
|
-
story: 'regular / NO STORY; SET STORY FIELD',
|
|
348
|
-
status: 'Awaiting Quality Check',
|
|
349
|
-
}),
|
|
350
|
-
]);
|
|
351
|
-
expect(result.triage.items.map((item) => item.status)).toEqual([
|
|
352
|
-
'Awaiting Quality Check',
|
|
353
|
-
]);
|
|
354
|
-
});
|
|
355
222
|
});
|
|
356
223
|
|
|
357
224
|
describe('workflow-blocker tab', () => {
|
|
@@ -420,7 +287,6 @@ describe('GenerateConsoleListsUseCase', () => {
|
|
|
420
287
|
) => [
|
|
421
288
|
...result['workflow-blocker'].items,
|
|
422
289
|
...result.prs.items,
|
|
423
|
-
...result.triage.items,
|
|
424
290
|
...result['failed-preparation'].items,
|
|
425
291
|
...result['todo-by-human'].items,
|
|
426
292
|
];
|
|
@@ -438,14 +304,13 @@ describe('GenerateConsoleListsUseCase', () => {
|
|
|
438
304
|
expect(allTabItems(result)).toHaveLength(1);
|
|
439
305
|
});
|
|
440
306
|
|
|
441
|
-
it('hides a no-story In Tmux by agent issue from
|
|
307
|
+
it('hides a no-story In Tmux by agent issue from all tabs', () => {
|
|
442
308
|
const result = run([
|
|
443
309
|
makeIssue({
|
|
444
310
|
story: 'no story',
|
|
445
311
|
status: 'In Tmux by agent',
|
|
446
312
|
}),
|
|
447
313
|
]);
|
|
448
|
-
expect(result.triage.items).toHaveLength(0);
|
|
449
314
|
expect(allTabItems(result)).toHaveLength(0);
|
|
450
315
|
});
|
|
451
316
|
|
|
@@ -475,10 +340,8 @@ describe('GenerateConsoleListsUseCase', () => {
|
|
|
475
340
|
expect(
|
|
476
341
|
result['workflow-blocker'].items.map((item) => item.status).sort(),
|
|
477
342
|
).toEqual(['In Tmux by agent', 'In Tmux by human']);
|
|
478
|
-
expect(result.triage.items.map((item) => item.number)).toEqual([3, 2]);
|
|
479
343
|
expect(
|
|
480
344
|
result.prs.items
|
|
481
|
-
.concat(result.triage.items)
|
|
482
345
|
.concat(result['failed-preparation'].items)
|
|
483
346
|
.concat(result['todo-by-human'].items)
|
|
484
347
|
.some((item) => item.status === 'In Tmux by agent'),
|
|
@@ -673,16 +536,6 @@ describe('GenerateConsoleListsUseCase', () => {
|
|
|
673
536
|
expect(names).toContain('Awaiting Workspace');
|
|
674
537
|
});
|
|
675
538
|
|
|
676
|
-
it('emits all story options for triage and no statusOptions key', () => {
|
|
677
|
-
const triage = run([]).triage;
|
|
678
|
-
expect(triage.storyOptions.map((o) => o.name)).toEqual([
|
|
679
|
-
'regular / NO STORY; SET STORY FIELD',
|
|
680
|
-
'Story Alpha',
|
|
681
|
-
'Story Beta',
|
|
682
|
-
]);
|
|
683
|
-
expect(triage).not.toHaveProperty('statusOptions');
|
|
684
|
-
});
|
|
685
|
-
|
|
686
539
|
it('builds storyOrder from story field option order', () => {
|
|
687
540
|
expect(run([]).prs.storyOrder).toEqual([
|
|
688
541
|
'regular / NO STORY; SET STORY FIELD',
|
|
@@ -700,19 +553,12 @@ describe('GenerateConsoleListsUseCase', () => {
|
|
|
700
553
|
color: 'BLUE',
|
|
701
554
|
});
|
|
702
555
|
});
|
|
703
|
-
|
|
704
|
-
it('uses plain string color values for triage', () => {
|
|
705
|
-
const result = run([]);
|
|
706
|
-
expect(result.triage.storyColors['Story Alpha']).toBe('BLUE');
|
|
707
|
-
expect(result.triage.storyColors['Story Beta']).toBe('GREEN');
|
|
708
|
-
});
|
|
709
556
|
});
|
|
710
557
|
|
|
711
558
|
describe('generatedAt and pjcode passthrough', () => {
|
|
712
559
|
it('writes the provided generatedAt without milliseconds on every tab', () => {
|
|
713
560
|
const result = run([]);
|
|
714
561
|
expect(result.prs.generatedAt).toBe(generatedAt);
|
|
715
|
-
expect(result.triage.generatedAt).toBe(generatedAt);
|
|
716
562
|
expect(result['failed-preparation'].generatedAt).toBe(generatedAt);
|
|
717
563
|
expect(generatedAt).not.toMatch(/\.\d{3}Z$/);
|
|
718
564
|
});
|
|
@@ -720,7 +566,6 @@ describe('GenerateConsoleListsUseCase', () => {
|
|
|
720
566
|
it('writes the configured pjcode on every tab', () => {
|
|
721
567
|
const result = run([]);
|
|
722
568
|
expect(result.prs.pjcode).toBe('demo');
|
|
723
|
-
expect(result.triage.pjcode).toBe('demo');
|
|
724
569
|
expect(result['failed-preparation'].pjcode).toBe('demo');
|
|
725
570
|
});
|
|
726
571
|
});
|
|
@@ -789,13 +634,10 @@ describe('GenerateConsoleListsUseCase', () => {
|
|
|
789
634
|
describe('project without a story field', () => {
|
|
790
635
|
const projectNoStory = baseProject(null);
|
|
791
636
|
|
|
792
|
-
it('degrades story order
|
|
637
|
+
it('degrades story order and colors gracefully', () => {
|
|
793
638
|
const result = run([makeIssue({ story: 'no story' })], projectNoStory);
|
|
794
639
|
expect(result.prs.storyOrder).toEqual([]);
|
|
795
640
|
expect(result.prs.storyColors).toEqual({});
|
|
796
|
-
expect(result.triage.storyOptions).toEqual([]);
|
|
797
|
-
expect(result.triage.storyColors).toEqual({});
|
|
798
|
-
expect(result.triage.items).toHaveLength(1);
|
|
799
641
|
});
|
|
800
642
|
});
|
|
801
643
|
|
|
@@ -45,19 +45,9 @@ export type ConsoleStatusTab = {
|
|
|
45
45
|
items: ConsoleListItem[];
|
|
46
46
|
};
|
|
47
47
|
|
|
48
|
-
export type ConsoleTriageTab = {
|
|
49
|
-
pjcode: string;
|
|
50
|
-
generatedAt: string;
|
|
51
|
-
storyOptions: ConsoleFieldOption[];
|
|
52
|
-
storyOrder: string[];
|
|
53
|
-
storyColors: Record<string, ConsoleColor>;
|
|
54
|
-
items: ConsoleListItem[];
|
|
55
|
-
};
|
|
56
|
-
|
|
57
48
|
export type ConsoleTabName =
|
|
58
49
|
| 'workflow-blocker'
|
|
59
50
|
| 'prs'
|
|
60
|
-
| 'triage'
|
|
61
51
|
| 'failed-preparation'
|
|
62
52
|
| 'todo-by-human'
|
|
63
53
|
| 'todo-by-agent'
|
|
@@ -83,7 +73,6 @@ export type ConsoleStoriesTab = {
|
|
|
83
73
|
export type ConsoleLists = {
|
|
84
74
|
'workflow-blocker': ConsoleStatusTab;
|
|
85
75
|
prs: ConsoleStatusTab;
|
|
86
|
-
triage: ConsoleTriageTab;
|
|
87
76
|
'failed-preparation': ConsoleStatusTab;
|
|
88
77
|
'todo-by-human': ConsoleStatusTab;
|
|
89
78
|
'todo-by-agent': ConsoleStatusTab;
|
|
@@ -217,22 +206,6 @@ export class GenerateConsoleListsUseCase {
|
|
|
217
206
|
(issue) => issue.status === TODO_BY_AGENT_STATUS_NAME,
|
|
218
207
|
[TODO_BY_AGENT_STATUS_NAME.toLowerCase(), 'done'],
|
|
219
208
|
),
|
|
220
|
-
triage: {
|
|
221
|
-
pjcode,
|
|
222
|
-
generatedAt,
|
|
223
|
-
storyOptions: this.buildFieldOptions(storyOptions, []),
|
|
224
|
-
storyOrder,
|
|
225
|
-
storyColors: this.buildStoryColorsString(storyOptions),
|
|
226
|
-
items: this.sortByStoryOrder(
|
|
227
|
-
actionableIssues.map((issue) =>
|
|
228
|
-
this.projectItem(
|
|
229
|
-
issue,
|
|
230
|
-
relatedOpenPullRequestUrlsByIssueUrl.get(issue.url) ?? [],
|
|
231
|
-
),
|
|
232
|
-
),
|
|
233
|
-
storyOrder,
|
|
234
|
-
),
|
|
235
|
-
},
|
|
236
209
|
stories: {
|
|
237
210
|
pjcode,
|
|
238
211
|
generatedAt,
|
|
@@ -332,16 +305,6 @@ export class GenerateConsoleListsUseCase {
|
|
|
332
305
|
return result;
|
|
333
306
|
};
|
|
334
307
|
|
|
335
|
-
private buildStoryColorsString = (
|
|
336
|
-
options: FieldOption[],
|
|
337
|
-
): Record<string, ConsoleColor> => {
|
|
338
|
-
const result: Record<string, ConsoleColor> = {};
|
|
339
|
-
for (const option of options) {
|
|
340
|
-
result[option.name] = option.color;
|
|
341
|
-
}
|
|
342
|
-
return result;
|
|
343
|
-
};
|
|
344
|
-
|
|
345
308
|
private sortByStoryOrder = (
|
|
346
309
|
items: ConsoleListItem[],
|
|
347
310
|
storyOrder: string[],
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { LiveSessionOauthTokenSelectionSettings } from '../../../domain/usecases/LiveSessionOauthTokenSelectUseCase';
|
|
2
2
|
export declare const FLEET_CONFIG_FILE_PATH_ENVIRONMENT_VARIABLE = "TDPM_FLEET_CONFIG";
|
|
3
3
|
export declare const LIVE_SESSION_OAUTH_TOKEN_SELECTION_SECTION_KEY = "liveSessionOauthTokenSelection";
|
|
4
|
+
export declare const PREPARATION_WORKER_SECTION_KEY = "preparationWorker";
|
|
5
|
+
export type PreparationWorkerSettings = {
|
|
6
|
+
normalConcurrentLimit: number;
|
|
7
|
+
};
|
|
8
|
+
export declare const DEFAULT_PREPARATION_WORKER_SETTINGS: PreparationWorkerSettings;
|
|
4
9
|
export declare const resolveFleetConfigFilePath: (cliValue: string | null) => string | null;
|
|
5
10
|
export declare const loadLiveSessionOauthTokenSelectionSettings: (fleetConfigFilePath: string | null) => LiveSessionOauthTokenSelectionSettings;
|
|
11
|
+
export declare const loadPreparationWorkerSettings: (fleetConfigFilePath: string | null) => PreparationWorkerSettings;
|
|
6
12
|
//# sourceMappingURL=fleetConfig.d.ts.map
|
|
@@ -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;
|
|
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;AAElE,MAAM,MAAM,yBAAyB,GAAG;IACtC,qBAAqB,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEF,eAAO,MAAM,mCAAmC,EAAE,yBAEjD,CAAC;AAEF,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"}
|
|
@@ -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;AAiPzB,eAAO,MAAM,OAAO,SAAgB,CAAC;AAwmCrC,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":"consoleDoneStore.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/console/consoleDoneStore.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,sBAAsB,eAAe,CAAC;AAEnD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B,CAAC;AAqBF,eAAO,MAAM,kBAAkB,GAC7B,sBAAsB,MAAM,EAC5B,QAAQ,MAAM,EACd,KAAK,MAAM,KACV,MACmE,CAAC;AAYvE,eAAO,MAAM,sBAAsB,GACjC,sBAAsB,MAAM,EAC5B,QAAQ,MAAM,EACd,KAAK,MAAM,KACV,MAAM,EASR,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,sBAAsB,MAAM,EAC5B,QAAQ,MAAM,EACd,KAAK,MAAM,EACX,eAAe,MAAM,KACpB,IAaF,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"consoleDoneStore.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/console/consoleDoneStore.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,sBAAsB,eAAe,CAAC;AAEnD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B,CAAC;AAqBF,eAAO,MAAM,kBAAkB,GAC7B,sBAAsB,MAAM,EAC5B,QAAQ,MAAM,EACd,KAAK,MAAM,KACV,MACmE,CAAC;AAYvE,eAAO,MAAM,sBAAsB,GACjC,sBAAsB,MAAM,EAC5B,QAAQ,MAAM,EACd,KAAK,MAAM,KACV,MAAM,EASR,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,sBAAsB,MAAM,EAC5B,QAAQ,MAAM,EACd,KAAK,MAAM,EACX,eAAe,MAAM,KACpB,IAaF,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,MAAM,EAO1C,CAAC;AAEF,eAAO,MAAM,sCAAsC,EAAE,MAAM,EAM1D,CAAC;AAEF,eAAO,MAAM,qCAAqC,EAAE,MAAM,EAEzD,CAAC;AAEF,eAAO,MAAM,8BAA8B,GACzC,sBAAsB,MAAM,EAC5B,QAAQ,MAAM,EACd,eAAe,MAAM,EACrB,UAAU,MAAM,EAAE,KACjB,IAIF,CAAC;AAEF,eAAO,MAAM,iCAAiC,GAC5C,sBAAsB,MAAM,EAC5B,QAAQ,MAAM,EACd,eAAe,MAAM,KACpB,IAIF,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,sBAAsB,MAAM,EAC5B,QAAQ,MAAM,EACd,KAAK,MAAM,KACV,IAGF,CAAC;AAEF,eAAO,MAAM,iCAAiC,GAC5C,sBAAsB,MAAM,EAC5B,QAAQ,MAAM,KACb,IAIF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consoleTabNames.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/console/consoleTabNames.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8DAA8D,CAAC;AAEnG,eAAO,MAAM,sBAAsB,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"consoleTabNames.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/console/consoleTabNames.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8DAA8D,CAAC;AAEnG,eAAO,MAAM,sBAAsB,EAAE,cAAc,EAOlD,CAAC;AAOF,eAAO,MAAM,gBAAgB,GAC3B,OAAO,OAAO,EAAE,EAChB,YAAY,MAAM,EAAE,KACnB,OAAO,EAgBT,CAAC"}
|
|
@@ -5,6 +5,7 @@ import { LocalCommandRunner } from './adapter-interfaces/LocalCommandRunner';
|
|
|
5
5
|
import { ClaudeTokenUsageRepository } from './adapter-interfaces/ClaudeTokenUsageRepository';
|
|
6
6
|
import { TakeOwnershipSpawnRepository } from './adapter-interfaces/TakeOwnershipSpawnRepository';
|
|
7
7
|
import { ClaudeTokenUsage } from '../entities/ClaudeTokenUsage';
|
|
8
|
+
export declare const NORMAL_CONCURRENT_LIMIT = 6;
|
|
8
9
|
export declare const DEFAULT_FALLBACK_LLM_MODEL_NAME = "claude-opus-4-8";
|
|
9
10
|
export declare const SPAWN_CANDIDATE_BRANCH_SOURCE_CONCURRENCY = 8;
|
|
10
11
|
export type SpawnCandidateExclusionReason = 'dependedIssueUrls' | 'futureNextActionDate' | 'nextActionHourNotReached' | 'authorNotAllowed' | 'notAssignedToManager';
|
|
@@ -35,7 +36,7 @@ export declare class StartPreparationUseCase {
|
|
|
35
36
|
private secondsUntilSevenDayReset;
|
|
36
37
|
private compareBySevenDayDeadlineThenUtilization;
|
|
37
38
|
private taperedConcurrentLimit;
|
|
38
|
-
getTokenConcurrentLimit: (fiveHourUtilization: number, sevenDayUtilization: number, selectionWeight?: number) => number;
|
|
39
|
+
getTokenConcurrentLimit: (fiveHourUtilization: number, sevenDayUtilization: number, selectionWeight?: number, normalConcurrentLimit?: number) => number;
|
|
39
40
|
spawnCandidateExclusionReasonOf: (issue: Issue, allowedIssueAuthors: string[] | null, manager: string, now: Date) => SpawnCandidateExclusionReason | null;
|
|
40
41
|
fetchSpawnCandidateBranchSources: (issueUrls: string[]) => Promise<Map<string, SpawnCandidateBranchSource>>;
|
|
41
42
|
private selectRotationTokens;
|
|
@@ -54,6 +55,7 @@ export declare class StartPreparationUseCase {
|
|
|
54
55
|
codexHomeCandidates: string[] | null;
|
|
55
56
|
labelsAsLlmAgentName: string[] | null;
|
|
56
57
|
agents?: string[] | null;
|
|
58
|
+
normalConcurrentLimit?: number;
|
|
57
59
|
}) => Promise<{
|
|
58
60
|
rotationOrder: RotationOrderEntry[] | null;
|
|
59
61
|
}>;
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"StartPreparationUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/StartPreparationUseCase.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,15 +35,7 @@ export type ConsoleStatusTab = {
|
|
|
35
35
|
}>;
|
|
36
36
|
items: ConsoleListItem[];
|
|
37
37
|
};
|
|
38
|
-
export type
|
|
39
|
-
pjcode: string;
|
|
40
|
-
generatedAt: string;
|
|
41
|
-
storyOptions: ConsoleFieldOption[];
|
|
42
|
-
storyOrder: string[];
|
|
43
|
-
storyColors: Record<string, ConsoleColor>;
|
|
44
|
-
items: ConsoleListItem[];
|
|
45
|
-
};
|
|
46
|
-
export type ConsoleTabName = 'workflow-blocker' | 'prs' | 'triage' | 'failed-preparation' | 'todo-by-human' | 'todo-by-agent' | 'stories';
|
|
38
|
+
export type ConsoleTabName = 'workflow-blocker' | 'prs' | 'failed-preparation' | 'todo-by-human' | 'todo-by-agent' | 'stories';
|
|
47
39
|
export type ConsoleStoryEntry = {
|
|
48
40
|
storyName: string;
|
|
49
41
|
storyOptionId: string;
|
|
@@ -64,7 +56,6 @@ export type ConsoleStoriesTab = {
|
|
|
64
56
|
export type ConsoleLists = {
|
|
65
57
|
'workflow-blocker': ConsoleStatusTab;
|
|
66
58
|
prs: ConsoleStatusTab;
|
|
67
|
-
triage: ConsoleTriageTab;
|
|
68
59
|
'failed-preparation': ConsoleStatusTab;
|
|
69
60
|
'todo-by-human': ConsoleStatusTab;
|
|
70
61
|
'todo-by-agent': ConsoleStatusTab;
|
|
@@ -87,7 +78,6 @@ export declare class GenerateConsoleListsUseCase {
|
|
|
87
78
|
private projectItem;
|
|
88
79
|
private buildFieldOptions;
|
|
89
80
|
private buildStoryColorsObject;
|
|
90
|
-
private buildStoryColorsString;
|
|
91
81
|
private sortByStoryOrder;
|
|
92
82
|
}
|
|
93
83
|
//# sourceMappingURL=GenerateConsoleListsUseCase.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GenerateConsoleListsUseCase.d.ts","sourceRoot":"","sources":["../../../../src/domain/usecases/console/GenerateConsoleListsUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAS9D,MAAM,MAAM,YAAY,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;AAEhD,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,0BAA0B,EAAE,MAAM,EAAE,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,YAAY,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,kBAAkB,EAAE,CAAC;IACpC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,YAAY,CAAA;KAAE,CAAC,CAAC;IACrD,KAAK,EAAE,eAAe,EAAE,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"GenerateConsoleListsUseCase.d.ts","sourceRoot":"","sources":["../../../../src/domain/usecases/console/GenerateConsoleListsUseCase.ts"],"names":[],"mappings":"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"}
|