github-issue-tower-defence-management 1.149.1 → 1.151.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 +19 -0
- package/README.md +9 -1
- package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js +24 -0
- package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js.map +1 -1
- package/bin/adapter/entry-points/handlers/LiveSessionOauthTokenSelectHandler.js +2 -2
- package/bin/adapter/entry-points/handlers/LiveSessionOauthTokenSelectHandler.js.map +1 -1
- package/bin/adapter/entry-points/handlers/OauthTokenSelectHandler.js +1 -1
- package/bin/adapter/entry-points/handlers/OauthTokenSelectHandler.js.map +1 -1
- package/bin/adapter/entry-points/handlers/inTmuxByHumanDataWriter.js +13 -1
- package/bin/adapter/entry-points/handlers/inTmuxByHumanDataWriter.js.map +1 -1
- package/bin/adapter/entry-points/handlers/resolveUnansweredOwnerCalls.js +12 -0
- package/bin/adapter/entry-points/handlers/resolveUnansweredOwnerCalls.js.map +1 -0
- package/bin/adapter/repositories/TranscriptOwnerCallStatusProvider.js +60 -13
- package/bin/adapter/repositories/TranscriptOwnerCallStatusProvider.js.map +1 -1
- package/bin/domain/entities/UnansweredOwnerCall.js +3 -0
- package/bin/domain/entities/UnansweredOwnerCall.js.map +1 -0
- package/bin/domain/usecases/LiveSessionOauthTokenSelectUseCase.js +1 -0
- package/bin/domain/usecases/LiveSessionOauthTokenSelectUseCase.js.map +1 -1
- package/bin/domain/usecases/OauthTokenSelectUseCase.js +15 -7
- package/bin/domain/usecases/OauthTokenSelectUseCase.js.map +1 -1
- package/bin/domain/usecases/intmux/GenerateInTmuxByHumanDataUseCase.js +21 -2
- package/bin/domain/usecases/intmux/GenerateInTmuxByHumanDataUseCase.js.map +1 -1
- package/package.json +1 -1
- package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts +46 -0
- package/src/adapter/entry-points/handlers/LiveSessionOauthTokenSelectHandler.test.ts +21 -0
- package/src/adapter/entry-points/handlers/LiveSessionOauthTokenSelectHandler.ts +6 -6
- package/src/adapter/entry-points/handlers/OauthTokenSelectHandler.test.ts +27 -0
- package/src/adapter/entry-points/handlers/OauthTokenSelectHandler.ts +5 -5
- package/src/adapter/entry-points/handlers/inTmuxByHumanDataWriter.test.ts +104 -1
- package/src/adapter/entry-points/handlers/inTmuxByHumanDataWriter.ts +19 -0
- package/src/adapter/entry-points/handlers/resolveUnansweredOwnerCalls.test.ts +111 -0
- package/src/adapter/entry-points/handlers/resolveUnansweredOwnerCalls.ts +33 -0
- package/src/adapter/repositories/TranscriptOwnerCallStatusProvider.test.ts +178 -0
- package/src/adapter/repositories/TranscriptOwnerCallStatusProvider.ts +106 -17
- package/src/domain/entities/UnansweredOwnerCall.ts +4 -0
- package/src/domain/usecases/LiveSessionOauthTokenSelectUseCase.test.ts +33 -0
- package/src/domain/usecases/LiveSessionOauthTokenSelectUseCase.ts +4 -2
- package/src/domain/usecases/OauthTokenSelectUseCase.test.ts +88 -0
- package/src/domain/usecases/OauthTokenSelectUseCase.ts +21 -13
- package/src/domain/usecases/intmux/GenerateInTmuxByHumanDataUseCase.test.ts +99 -0
- package/src/domain/usecases/intmux/GenerateInTmuxByHumanDataUseCase.ts +47 -1
- package/src/domain/usecases/intmux/UnansweredOwnerCallSessionKeyContract.test.ts +141 -0
- package/types/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.d.ts.map +1 -1
- package/types/adapter/entry-points/handlers/LiveSessionOauthTokenSelectHandler.d.ts +2 -2
- package/types/adapter/entry-points/handlers/LiveSessionOauthTokenSelectHandler.d.ts.map +1 -1
- package/types/adapter/entry-points/handlers/OauthTokenSelectHandler.d.ts +1 -1
- package/types/adapter/entry-points/handlers/OauthTokenSelectHandler.d.ts.map +1 -1
- package/types/adapter/entry-points/handlers/inTmuxByHumanDataWriter.d.ts +2 -0
- package/types/adapter/entry-points/handlers/inTmuxByHumanDataWriter.d.ts.map +1 -1
- package/types/adapter/entry-points/handlers/resolveUnansweredOwnerCalls.d.ts +13 -0
- package/types/adapter/entry-points/handlers/resolveUnansweredOwnerCalls.d.ts.map +1 -0
- package/types/adapter/repositories/TranscriptOwnerCallStatusProvider.d.ts +5 -0
- package/types/adapter/repositories/TranscriptOwnerCallStatusProvider.d.ts.map +1 -1
- package/types/domain/entities/UnansweredOwnerCall.d.ts +5 -0
- package/types/domain/entities/UnansweredOwnerCall.d.ts.map +1 -0
- package/types/domain/usecases/LiveSessionOauthTokenSelectUseCase.d.ts +3 -2
- package/types/domain/usecases/LiveSessionOauthTokenSelectUseCase.d.ts.map +1 -1
- package/types/domain/usecases/OauthTokenSelectUseCase.d.ts +1 -0
- package/types/domain/usecases/OauthTokenSelectUseCase.d.ts.map +1 -1
- package/types/domain/usecases/intmux/GenerateInTmuxByHumanDataUseCase.d.ts +19 -0
- package/types/domain/usecases/intmux/GenerateInTmuxByHumanDataUseCase.d.ts.map +1 -1
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { Issue } from '../../entities/Issue';
|
|
2
2
|
import { FieldOption, Project } from '../../entities/Project';
|
|
3
3
|
import { GenerateInTmuxByHumanDataUseCase } from './GenerateInTmuxByHumanDataUseCase';
|
|
4
|
+
import { UnansweredOwnerCall } from '../../entities/UnansweredOwnerCall';
|
|
5
|
+
import { toTmuxSessionName } from './InTmuxByHumanSessionReconcileUseCase';
|
|
4
6
|
|
|
5
7
|
const ASSIGNEE = 'owner-login';
|
|
6
8
|
const CONSOLE_BASE_URL = 'https://console.example.test';
|
|
@@ -98,6 +100,7 @@ describe('GenerateInTmuxByHumanDataUseCase', () => {
|
|
|
98
100
|
consoleBaseUrl?: string | null;
|
|
99
101
|
consoleToken?: string | null;
|
|
100
102
|
newIssueRepo?: string;
|
|
103
|
+
unansweredCallsByTmuxSessionName?: Map<string, UnansweredOwnerCall[]>;
|
|
101
104
|
} = {},
|
|
102
105
|
) =>
|
|
103
106
|
usecase.run({
|
|
@@ -116,6 +119,9 @@ describe('GenerateInTmuxByHumanDataUseCase', () => {
|
|
|
116
119
|
overrides.consoleToken === undefined
|
|
117
120
|
? CONSOLE_TOKEN
|
|
118
121
|
: overrides.consoleToken,
|
|
122
|
+
unansweredCallsByTmuxSessionName:
|
|
123
|
+
overrides.unansweredCallsByTmuxSessionName ??
|
|
124
|
+
new Map<string, UnansweredOwnerCall[]>(),
|
|
119
125
|
now: NOW,
|
|
120
126
|
});
|
|
121
127
|
|
|
@@ -333,4 +339,97 @@ describe('GenerateInTmuxByHumanDataUseCase', () => {
|
|
|
333
339
|
expect(result.v3).not.toBeNull();
|
|
334
340
|
});
|
|
335
341
|
});
|
|
342
|
+
|
|
343
|
+
describe('v5 document', () => {
|
|
344
|
+
const callsFor = (
|
|
345
|
+
issueUrl: string,
|
|
346
|
+
calls: UnansweredOwnerCall[],
|
|
347
|
+
): Map<string, UnansweredOwnerCall[]> =>
|
|
348
|
+
new Map([[toTmuxSessionName(issueUrl), calls]]);
|
|
349
|
+
|
|
350
|
+
it('builds version 5 with key order version, overviewUrl, tdpmConsoleUrl, newIssueUrl, groups', () => {
|
|
351
|
+
const result = run([makeIssue({ story: 'Story Alpha' })]);
|
|
352
|
+
expect(result.v5).not.toBeNull();
|
|
353
|
+
expect(Object.keys(result.v5 ?? {})).toEqual([
|
|
354
|
+
'version',
|
|
355
|
+
'overviewUrl',
|
|
356
|
+
'tdpmConsoleUrl',
|
|
357
|
+
'newIssueUrl',
|
|
358
|
+
'groups',
|
|
359
|
+
]);
|
|
360
|
+
expect(result.v5?.version).toBe(5);
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
it('gives a session with no unanswered call an empty unansweredCalls array', () => {
|
|
364
|
+
const result = run([makeIssue({ story: 'Story Alpha' })]);
|
|
365
|
+
expect(result.v5?.groups).toEqual([
|
|
366
|
+
{
|
|
367
|
+
story: 'Story Alpha',
|
|
368
|
+
sessions: [
|
|
369
|
+
{
|
|
370
|
+
name: 'https://github.com/demo/repo/issues/1',
|
|
371
|
+
description: 'Issue 1',
|
|
372
|
+
unansweredCalls: [],
|
|
373
|
+
},
|
|
374
|
+
],
|
|
375
|
+
},
|
|
376
|
+
]);
|
|
377
|
+
});
|
|
378
|
+
|
|
379
|
+
it('carries the unanswered calls of a session looked up by the tmux session name the reconciler derives from the issue url', () => {
|
|
380
|
+
const issue = makeIssue({ story: 'Story Alpha' });
|
|
381
|
+
const call: UnansweredOwnerCall = {
|
|
382
|
+
calledAt: '2026-08-13T10:14:00.000Z',
|
|
383
|
+
body: 'Please decide whether to merge the release branch',
|
|
384
|
+
};
|
|
385
|
+
|
|
386
|
+
const result = run([issue], {
|
|
387
|
+
unansweredCallsByTmuxSessionName: callsFor(issue.url, [call]),
|
|
388
|
+
});
|
|
389
|
+
|
|
390
|
+
expect(result.v5?.groups[0].sessions[0].unansweredCalls).toEqual([call]);
|
|
391
|
+
});
|
|
392
|
+
|
|
393
|
+
it('carries every unanswered call of one session in call order with its own time and body', () => {
|
|
394
|
+
const issue = makeIssue({ story: 'Story Alpha' });
|
|
395
|
+
const calls: UnansweredOwnerCall[] = [
|
|
396
|
+
{ calledAt: '2026-08-13T10:14:00.000Z', body: 'first call body' },
|
|
397
|
+
{ calledAt: '2026-08-13T10:41:30.000Z', body: 'second call body' },
|
|
398
|
+
];
|
|
399
|
+
|
|
400
|
+
const result = run([issue], {
|
|
401
|
+
unansweredCallsByTmuxSessionName: callsFor(issue.url, calls),
|
|
402
|
+
});
|
|
403
|
+
|
|
404
|
+
expect(result.v5?.groups[0].sessions[0].unansweredCalls).toEqual(calls);
|
|
405
|
+
expect(
|
|
406
|
+
result.v5?.groups[0].sessions[0].unansweredCalls.map(
|
|
407
|
+
(unansweredCall) => unansweredCall.calledAt,
|
|
408
|
+
),
|
|
409
|
+
).toEqual(['2026-08-13T10:14:00.000Z', '2026-08-13T10:41:30.000Z']);
|
|
410
|
+
});
|
|
411
|
+
|
|
412
|
+
it('leaves the version 4 document free of unanswered call data', () => {
|
|
413
|
+
const issue = makeIssue({ story: 'Story Alpha' });
|
|
414
|
+
|
|
415
|
+
const result = run([issue], {
|
|
416
|
+
unansweredCallsByTmuxSessionName: callsFor(issue.url, [
|
|
417
|
+
{ calledAt: '2026-08-13T10:14:00.000Z', body: 'first call body' },
|
|
418
|
+
]),
|
|
419
|
+
});
|
|
420
|
+
|
|
421
|
+
expect(result.v4?.groups[0].sessions[0]).toEqual({
|
|
422
|
+
name: 'https://github.com/demo/repo/issues/1',
|
|
423
|
+
description: 'Issue 1',
|
|
424
|
+
});
|
|
425
|
+
});
|
|
426
|
+
|
|
427
|
+
it('is null when the console token is unset while v3 is still produced', () => {
|
|
428
|
+
const result = run([makeIssue({ story: 'Story Alpha' })], {
|
|
429
|
+
consoleToken: null,
|
|
430
|
+
});
|
|
431
|
+
expect(result.v5).toBeNull();
|
|
432
|
+
expect(result.v3).not.toBeNull();
|
|
433
|
+
});
|
|
434
|
+
});
|
|
336
435
|
});
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { Issue } from '../../entities/Issue';
|
|
2
2
|
import { FieldOption, Project } from '../../entities/Project';
|
|
3
|
+
import { UnansweredOwnerCall } from '../../entities/UnansweredOwnerCall';
|
|
4
|
+
import { toTmuxSessionName } from './InTmuxByHumanSessionReconcileUseCase';
|
|
3
5
|
|
|
4
6
|
export type InTmuxByHumanUrlEntry = {
|
|
5
7
|
url: string;
|
|
@@ -26,6 +28,17 @@ export type InTmuxByHumanGroupV4 = {
|
|
|
26
28
|
sessions: InTmuxByHumanSession[];
|
|
27
29
|
};
|
|
28
30
|
|
|
31
|
+
export type InTmuxByHumanSessionV5 = {
|
|
32
|
+
name: string;
|
|
33
|
+
description: string;
|
|
34
|
+
unansweredCalls: UnansweredOwnerCall[];
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export type InTmuxByHumanGroupV5 = {
|
|
38
|
+
story: string;
|
|
39
|
+
sessions: InTmuxByHumanSessionV5[];
|
|
40
|
+
};
|
|
41
|
+
|
|
29
42
|
export type InTmuxByHumanV3 = {
|
|
30
43
|
version: 3;
|
|
31
44
|
overviewUrl: string;
|
|
@@ -41,11 +54,20 @@ export type InTmuxByHumanV4 = {
|
|
|
41
54
|
groups: InTmuxByHumanGroupV4[];
|
|
42
55
|
};
|
|
43
56
|
|
|
57
|
+
export type InTmuxByHumanV5 = {
|
|
58
|
+
version: 5;
|
|
59
|
+
overviewUrl: string;
|
|
60
|
+
tdpmConsoleUrl: string;
|
|
61
|
+
newIssueUrl: string;
|
|
62
|
+
groups: InTmuxByHumanGroupV5[];
|
|
63
|
+
};
|
|
64
|
+
|
|
44
65
|
export type InTmuxByHumanData = {
|
|
45
66
|
v1: InTmuxByHumanGroupV1[];
|
|
46
67
|
v2: InTmuxByHumanGroupV2[];
|
|
47
68
|
v3: InTmuxByHumanV3 | null;
|
|
48
69
|
v4: InTmuxByHumanV4 | null;
|
|
70
|
+
v5: InTmuxByHumanV5 | null;
|
|
49
71
|
};
|
|
50
72
|
|
|
51
73
|
export type GenerateInTmuxByHumanDataInput = {
|
|
@@ -58,6 +80,7 @@ export type GenerateInTmuxByHumanDataInput = {
|
|
|
58
80
|
newIssueRepo?: string;
|
|
59
81
|
consoleBaseUrl: string | null;
|
|
60
82
|
consoleToken: string | null;
|
|
83
|
+
unansweredCallsByTmuxSessionName: Map<string, UnansweredOwnerCall[]>;
|
|
61
84
|
now: Date;
|
|
62
85
|
};
|
|
63
86
|
|
|
@@ -81,6 +104,7 @@ export class GenerateInTmuxByHumanDataUseCase {
|
|
|
81
104
|
newIssueRepo,
|
|
82
105
|
consoleBaseUrl,
|
|
83
106
|
consoleToken,
|
|
107
|
+
unansweredCallsByTmuxSessionName,
|
|
84
108
|
} = input;
|
|
85
109
|
|
|
86
110
|
const storyOrder = project.story
|
|
@@ -114,6 +138,17 @@ export class GenerateInTmuxByHumanDataUseCase {
|
|
|
114
138
|
})),
|
|
115
139
|
}));
|
|
116
140
|
|
|
141
|
+
const v5Groups: InTmuxByHumanGroupV5[] = groups.map((group) => ({
|
|
142
|
+
story: group.story,
|
|
143
|
+
sessions: group.issues.map((issue) => ({
|
|
144
|
+
name: issue.url,
|
|
145
|
+
description: issue.title,
|
|
146
|
+
unansweredCalls:
|
|
147
|
+
unansweredCallsByTmuxSessionName.get(toTmuxSessionName(issue.url)) ??
|
|
148
|
+
[],
|
|
149
|
+
})),
|
|
150
|
+
}));
|
|
151
|
+
|
|
117
152
|
const overviewUrl = project.url;
|
|
118
153
|
const tdpmConsoleUrl = consoleBaseUrl
|
|
119
154
|
? `${consoleBaseUrl}/projects/${pjcode}`
|
|
@@ -139,7 +174,18 @@ export class GenerateInTmuxByHumanDataUseCase {
|
|
|
139
174
|
}
|
|
140
175
|
: null;
|
|
141
176
|
|
|
142
|
-
|
|
177
|
+
const v5: InTmuxByHumanV5 | null =
|
|
178
|
+
tdpmConsoleUrl && consoleToken
|
|
179
|
+
? {
|
|
180
|
+
version: 5,
|
|
181
|
+
overviewUrl,
|
|
182
|
+
tdpmConsoleUrl: `${tdpmConsoleUrl}?k=${consoleToken}`,
|
|
183
|
+
newIssueUrl: `https://github.com/${org}/${newIssueRepo ?? repo}/issues/new?assignees=${assigneeLogin}`,
|
|
184
|
+
groups: v5Groups,
|
|
185
|
+
}
|
|
186
|
+
: null;
|
|
187
|
+
|
|
188
|
+
return { v1, v2, v3, v4, v5 };
|
|
143
189
|
};
|
|
144
190
|
|
|
145
191
|
private isInTmuxByHuman = (issue: Issue, assigneeLogin: string): boolean =>
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { Issue } from '../../entities/Issue';
|
|
2
|
+
import { IN_TMUX_STATUS_NAME } from '../../entities/WorkflowStatus';
|
|
3
|
+
import { FieldOption, Project } from '../../entities/Project';
|
|
4
|
+
import { UnansweredOwnerCall } from '../../entities/UnansweredOwnerCall';
|
|
5
|
+
import { IssueRepository } from '../adapter-interfaces/IssueRepository';
|
|
6
|
+
import { TmuxSessionRepository } from '../adapter-interfaces/TmuxSessionRepository';
|
|
7
|
+
import { InTmuxByHumanSessionReconcileUseCase } from './InTmuxByHumanSessionReconcileUseCase';
|
|
8
|
+
import { GenerateInTmuxByHumanDataUseCase } from './GenerateInTmuxByHumanDataUseCase';
|
|
9
|
+
|
|
10
|
+
const ASSIGNEE = 'owner-login';
|
|
11
|
+
const LAUNCHER = 'cl';
|
|
12
|
+
const NOW = new Date('2026-06-25T12:00:00.000Z');
|
|
13
|
+
const ISSUE_URL = 'https://github.com/demo/repo/issues/1';
|
|
14
|
+
const STORY_NAME = 'Story Alpha';
|
|
15
|
+
|
|
16
|
+
const fieldOption = (id: string, name: string): FieldOption => ({
|
|
17
|
+
id,
|
|
18
|
+
name,
|
|
19
|
+
color: 'BLUE',
|
|
20
|
+
description: '',
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
const projectWithStory: Project = {
|
|
24
|
+
id: 'project-node-id',
|
|
25
|
+
url: 'https://github.com/orgs/demo/projects/1',
|
|
26
|
+
databaseId: 1,
|
|
27
|
+
name: 'demo',
|
|
28
|
+
status: {
|
|
29
|
+
name: 'Status',
|
|
30
|
+
fieldId: 'status-field',
|
|
31
|
+
statuses: [fieldOption('st-tmux', IN_TMUX_STATUS_NAME)],
|
|
32
|
+
},
|
|
33
|
+
nextActionDate: null,
|
|
34
|
+
nextActionHour: null,
|
|
35
|
+
story: {
|
|
36
|
+
name: 'story',
|
|
37
|
+
fieldId: 'story-field',
|
|
38
|
+
databaseId: 2,
|
|
39
|
+
stories: [fieldOption('s1', STORY_NAME)],
|
|
40
|
+
workflowManagementStory: { id: 'wm', name: 'workflow management' },
|
|
41
|
+
},
|
|
42
|
+
remainingEstimationMinutes: null,
|
|
43
|
+
dependedIssueUrlSeparatedByComma: null,
|
|
44
|
+
completionDate50PercentConfidence: null,
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const inTmuxIssue: Issue = {
|
|
48
|
+
nameWithOwner: 'demo/repo',
|
|
49
|
+
number: 1,
|
|
50
|
+
title: 'Issue 1',
|
|
51
|
+
state: 'OPEN',
|
|
52
|
+
status: IN_TMUX_STATUS_NAME,
|
|
53
|
+
story: STORY_NAME,
|
|
54
|
+
nextActionDate: null,
|
|
55
|
+
nextActionHour: null,
|
|
56
|
+
estimationMinutes: null,
|
|
57
|
+
dependedIssueUrls: [],
|
|
58
|
+
completionDate50PercentConfidence: null,
|
|
59
|
+
url: ISSUE_URL,
|
|
60
|
+
assignees: [ASSIGNEE],
|
|
61
|
+
labels: [],
|
|
62
|
+
org: 'demo',
|
|
63
|
+
repo: 'repo',
|
|
64
|
+
body: '',
|
|
65
|
+
itemId: 'item-1',
|
|
66
|
+
isPr: false,
|
|
67
|
+
isInProgress: false,
|
|
68
|
+
isClosed: false,
|
|
69
|
+
createdAt: NOW,
|
|
70
|
+
author: '',
|
|
71
|
+
closingIssueReferenceUrls: [],
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
const tmuxSessionNameTheReconcilerCreatesFor = async (
|
|
75
|
+
issue: Issue,
|
|
76
|
+
): Promise<string> => {
|
|
77
|
+
const launchedSessionNames: string[] = [];
|
|
78
|
+
const tmuxSessionRepository: TmuxSessionRepository = {
|
|
79
|
+
listLiveSessionNames: async () => [],
|
|
80
|
+
listLiveSessionsWithActivity: async () => [],
|
|
81
|
+
listInteractiveProcessCommandLines: async () => [],
|
|
82
|
+
launchDetachedSession: async (sessionName: string) => {
|
|
83
|
+
launchedSessionNames.push(sessionName);
|
|
84
|
+
},
|
|
85
|
+
killSession: async () => undefined,
|
|
86
|
+
killOwnSession: async () => undefined,
|
|
87
|
+
sendKeys: async () => undefined,
|
|
88
|
+
launchBareNameLeaderSession: async () => undefined,
|
|
89
|
+
};
|
|
90
|
+
const issueStateRepository: Pick<
|
|
91
|
+
IssueRepository,
|
|
92
|
+
'getIssueOrPullRequestState'
|
|
93
|
+
> = {
|
|
94
|
+
getIssueOrPullRequestState: async () => ({
|
|
95
|
+
state: 'OPEN',
|
|
96
|
+
merged: false,
|
|
97
|
+
isPullRequest: false,
|
|
98
|
+
title: 'Issue 1',
|
|
99
|
+
}),
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
await new InTmuxByHumanSessionReconcileUseCase(
|
|
103
|
+
tmuxSessionRepository,
|
|
104
|
+
issueStateRepository,
|
|
105
|
+
).run({
|
|
106
|
+
issues: [issue],
|
|
107
|
+
assigneeLogin: ASSIGNEE,
|
|
108
|
+
launcherCommand: LAUNCHER,
|
|
109
|
+
now: NOW,
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
return launchedSessionNames[0];
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
describe('unanswered owner call session key contract', () => {
|
|
116
|
+
it('reads the calls under the very tmux session name the reconciler creates for that issue', async () => {
|
|
117
|
+
const call: UnansweredOwnerCall = {
|
|
118
|
+
calledAt: '2026-06-25T11:00:00.000Z',
|
|
119
|
+
body: 'Please decide whether to merge the release branch',
|
|
120
|
+
};
|
|
121
|
+
const sessionNameTheReconcilerCreates =
|
|
122
|
+
await tmuxSessionNameTheReconcilerCreatesFor(inTmuxIssue);
|
|
123
|
+
|
|
124
|
+
const result = new GenerateInTmuxByHumanDataUseCase().run({
|
|
125
|
+
project: projectWithStory,
|
|
126
|
+
issues: [inTmuxIssue],
|
|
127
|
+
pjcode: 'demo',
|
|
128
|
+
assigneeLogin: ASSIGNEE,
|
|
129
|
+
org: 'demo',
|
|
130
|
+
repo: 'repo',
|
|
131
|
+
consoleBaseUrl: 'https://console.example.test',
|
|
132
|
+
consoleToken: 'test-token-value',
|
|
133
|
+
unansweredCallsByTmuxSessionName: new Map([
|
|
134
|
+
[sessionNameTheReconcilerCreates, [call]],
|
|
135
|
+
]),
|
|
136
|
+
now: NOW,
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
expect(result.v5?.groups[0].sessions[0].unansweredCalls).toEqual([call]);
|
|
140
|
+
});
|
|
141
|
+
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HandleScheduledEventUseCaseHandler.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"HandleScheduledEventUseCaseHandler.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts"],"names":[],"mappings":"AAkDA,OAAO,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAqD3D,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,CA6yBP;CACH"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ClaudeLiveSessionRepository } from '../../../domain/usecases/adapter-interfaces/ClaudeLiveSessionRepository';
|
|
2
|
-
import {
|
|
1
|
+
import type { ClaudeLiveSessionRepository } from '../../../domain/usecases/adapter-interfaces/ClaudeLiveSessionRepository';
|
|
2
|
+
import { type LiveSessionOauthTokenSelectionSettings, LiveSessionOauthTokenSelectUseCase } from '../../../domain/usecases/LiveSessionOauthTokenSelectUseCase';
|
|
3
3
|
export type LiveSessionOauthTokenSelectHandlerInput = {
|
|
4
4
|
tokenListJsonPath: string | null;
|
|
5
5
|
cacheDirectory: string | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LiveSessionOauthTokenSelectHandler.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/LiveSessionOauthTokenSelectHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,yEAAyE,CAAC;
|
|
1
|
+
{"version":3,"file":"LiveSessionOauthTokenSelectHandler.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/LiveSessionOauthTokenSelectHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,yEAAyE,CAAC;AAC3H,OAAO,EACL,KAAK,sCAAsC,EAE3C,kCAAkC,EACnC,MAAM,6DAA6D,CAAC;AAerE,MAAM,MAAM,uCAAuC,GAAG;IACpD,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,sCAAsC,CAAC;CAC3D,CAAC;AAEF,MAAM,MAAM,wCAAwC,GAAG;IACrD,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB,CAAC;AAEF,qBAAa,kCAAkC;IAE3C,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,qBAAqB;gBADrB,OAAO,GAAE,kCAA6E,EACtF,qBAAqB,GAAE,2BAAmE;IAG7G,MAAM,GACJ,OAAO,uCAAuC,KAC7C,wCAAwC,CAmEzC;IAEF,OAAO,CAAC,iBAAiB,CAyBvB;CACH"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { OauthTokenSelectUseCase, SelectionRandom } from '../../../domain/usecases/OauthTokenSelectUseCase';
|
|
1
|
+
import { OauthTokenSelectUseCase, type SelectionRandom } from '../../../domain/usecases/OauthTokenSelectUseCase';
|
|
2
2
|
export type OauthTokenSelectHandlerInput = {
|
|
3
3
|
tokenListJsonPath: string | null;
|
|
4
4
|
cacheDirectory: string | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OauthTokenSelectHandler.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/OauthTokenSelectHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,uBAAuB,EACvB,eAAe,
|
|
1
|
+
{"version":3,"file":"OauthTokenSelectHandler.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/OauthTokenSelectHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,uBAAuB,EACvB,KAAK,eAAe,EACrB,MAAM,kDAAkD,CAAC;AAQ1D,MAAM,MAAM,4BAA4B,GAAG;IACzC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB,CAAC;AAKF,eAAO,MAAM,wBAAwB,GACnC,cAAc,MAAM,GAAG,IAAI,KAC1B,MAAM,GAAG,IASX,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAChC,mBAAmB,MAAM,GAAG,IAAI,KAC/B,MASF,CAAC;AAEF,qBAAa,uBAAuB;IAEhC,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,OAAO,GAAE,uBAAuD,EAChE,MAAM,GAAE,eAA6B;IAGxD,MAAM,GACJ,OAAO,4BAA4B,KAClC,6BAA6B,CAgE9B;IAEF,OAAO,CAAC,iBAAiB,CAuBvB;CACH"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Issue } from '../../../domain/entities/Issue';
|
|
2
2
|
import type { Project } from '../../../domain/entities/Project';
|
|
3
|
+
import type { UnansweredOwnerCall } from '../../../domain/entities/UnansweredOwnerCall';
|
|
3
4
|
export type InTmuxByHumanDataWriterParams = {
|
|
4
5
|
inTmuxDataOutputDir: string | null | undefined;
|
|
5
6
|
inTmuxConsoleBaseUrl: string | null | undefined;
|
|
@@ -12,6 +13,7 @@ export type InTmuxByHumanDataWriterParams = {
|
|
|
12
13
|
newIssueRepo?: string | null | undefined;
|
|
13
14
|
project: Project;
|
|
14
15
|
issues: Issue[];
|
|
16
|
+
unansweredCallsByTmuxSessionName?: Map<string, UnansweredOwnerCall[]>;
|
|
15
17
|
now: Date;
|
|
16
18
|
};
|
|
17
19
|
export declare const writeInTmuxByHumanData: (params: InTmuxByHumanDataWriterParams) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inTmuxByHumanDataWriter.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/inTmuxByHumanDataWriter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"inTmuxByHumanDataWriter.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/inTmuxByHumanDataWriter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAChE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AAMxF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,mBAAmB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC/C,oBAAoB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAChD,kBAAkB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC9C,kBAAkB,EAAE,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,CAAC;IAChD,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAClC,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,gCAAgC,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,EAAE,CAAC,CAAC;IACtE,GAAG,EAAE,IAAI,CAAC;CACX,CAAC;AAUF,eAAO,MAAM,sBAAsB,GACjC,QAAQ,6BAA6B,KACpC,IA2FF,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { UnansweredOwnerCall } from '../../../domain/entities/UnansweredOwnerCall';
|
|
2
|
+
import { LiveSessionProcessSnapshotProvider } from '../../../domain/usecases/adapter-interfaces/LiveSessionProcessSnapshotProvider';
|
|
3
|
+
import { InteractiveLiveSessionTranscriptResolver } from '../../../domain/usecases/adapter-interfaces/InteractiveLiveSessionTranscriptResolver';
|
|
4
|
+
export type UnansweredOwnerCallListProvider = {
|
|
5
|
+
listUnansweredOwnerCallsBySessionName: (transcriptPathBySessionName: Map<string, string>) => Promise<Map<string, UnansweredOwnerCall[]>>;
|
|
6
|
+
};
|
|
7
|
+
export type ResolveUnansweredOwnerCallsParams = {
|
|
8
|
+
liveSessionProcessSnapshotProvider: LiveSessionProcessSnapshotProvider;
|
|
9
|
+
interactiveLiveSessionTranscriptResolver: InteractiveLiveSessionTranscriptResolver;
|
|
10
|
+
unansweredOwnerCallListProvider: UnansweredOwnerCallListProvider;
|
|
11
|
+
};
|
|
12
|
+
export declare const resolveUnansweredOwnerCallsByTmuxSessionName: (params: ResolveUnansweredOwnerCallsParams) => Promise<Map<string, UnansweredOwnerCall[]>>;
|
|
13
|
+
//# sourceMappingURL=resolveUnansweredOwnerCalls.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveUnansweredOwnerCalls.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/resolveUnansweredOwnerCalls.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AAGnF,OAAO,EAAE,kCAAkC,EAAE,MAAM,gFAAgF,CAAC;AACpI,OAAO,EAAE,wCAAwC,EAAE,MAAM,sFAAsF,CAAC;AAEhJ,MAAM,MAAM,+BAA+B,GAAG;IAC5C,qCAAqC,EAAE,CACrC,2BAA2B,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,KAC7C,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC;CAClD,CAAC;AAEF,MAAM,MAAM,iCAAiC,GAAG;IAC9C,kCAAkC,EAAE,kCAAkC,CAAC;IACvE,wCAAwC,EAAE,wCAAwC,CAAC;IACnF,+BAA+B,EAAE,+BAA+B,CAAC;CAClE,CAAC;AAEF,eAAO,MAAM,4CAA4C,GACvD,QAAQ,iCAAiC,KACxC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,mBAAmB,EAAE,CAAC,CAY5C,CAAC"}
|
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
import { OwnerCallStatusProvider } from '../../domain/usecases/adapter-interfaces/OwnerCallStatusProvider';
|
|
2
|
+
import { UnansweredOwnerCall } from '../../domain/entities/UnansweredOwnerCall';
|
|
2
3
|
export declare const ownerCallMarkerFamilyResolve: (marker: string) => string[];
|
|
3
4
|
export declare class TranscriptOwnerCallStatusProvider implements OwnerCallStatusProvider {
|
|
4
5
|
private readonly ownerReplyMarkerDirectory;
|
|
5
6
|
private readonly ownerCallMarkerFamily;
|
|
6
7
|
constructor(ownerCallMarker: string | null, ownerReplyMarkerDirectory?: string | null);
|
|
7
8
|
listUnansweredOwnerCallEpochSecondsBySessionName: (transcriptPathBySessionName: Map<string, string>) => Promise<Map<string, number>>;
|
|
9
|
+
listUnansweredOwnerCallsBySessionName: (transcriptPathBySessionName: Map<string, string>) => Promise<Map<string, UnansweredOwnerCall[]>>;
|
|
10
|
+
private scanTranscript;
|
|
11
|
+
private resolveReplyEpochMs;
|
|
8
12
|
private findUnansweredOwnerCallEpochMs;
|
|
9
13
|
private readOwnerReplyMarkerEpochMs;
|
|
14
|
+
private isCallDeliveredToOwner;
|
|
10
15
|
private isCallSuppressedUndelivered;
|
|
11
16
|
private isCandidateCallDelivered;
|
|
12
17
|
private readMarkerEpochMs;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TranscriptOwnerCallStatusProvider.d.ts","sourceRoot":"","sources":["../../../src/adapter/repositories/TranscriptOwnerCallStatusProvider.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,kEAAkE,CAAC;
|
|
1
|
+
{"version":3,"file":"TranscriptOwnerCallStatusProvider.d.ts","sourceRoot":"","sources":["../../../src/adapter/repositories/TranscriptOwnerCallStatusProvider.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,kEAAkE,CAAC;AAC3G,OAAO,EAAE,mBAAmB,EAAE,MAAM,2CAA2C,CAAC;AAwGhF,eAAO,MAAM,4BAA4B,GAAI,QAAQ,MAAM,KAAG,MAAM,EAMtD,CAAC;AA4Cf,qBAAa,iCAAkC,YAAW,uBAAuB;IAK7E,OAAO,CAAC,QAAQ,CAAC,yBAAyB;IAJ5C,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAW;gBAG/C,eAAe,EAAE,MAAM,GAAG,IAAI,EACb,yBAAyB,GAAE,MAAM,GAAG,IAAW;IAQlE,gDAAgD,GAC9C,6BAA6B,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,KAC/C,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAqB7B;IAEF,qCAAqC,GACnC,6BAA6B,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,KAC/C,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAqC5C;IAEF,OAAO,CAAC,cAAc,CA6DpB;IAEF,OAAO,CAAC,mBAAmB,CAUzB;IAEF,OAAO,CAAC,8BAA8B,CAiCpC;IAOF,OAAO,CAAC,2BAA2B,CAGyC;IAS5E,OAAO,CAAC,sBAAsB,CAW5B;IAEF,OAAO,CAAC,2BAA2B,CAgBjC;IAEF,OAAO,CAAC,wBAAwB,CAoB9B;IAEF,OAAO,CAAC,iBAAiB,CA4BvB;CACH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UnansweredOwnerCall.d.ts","sourceRoot":"","sources":["../../../src/domain/entities/UnansweredOwnerCall.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ClaudeLiveSession } from './adapter-interfaces/ClaudeLiveSessionRepository';
|
|
2
|
-
import { OauthTokenCandidate, OauthTokenSelectUseCase } from './OauthTokenSelectUseCase';
|
|
1
|
+
import type { ClaudeLiveSession } from './adapter-interfaces/ClaudeLiveSessionRepository';
|
|
2
|
+
import { type OauthTokenCandidate, OauthTokenSelectUseCase } from './OauthTokenSelectUseCase';
|
|
3
3
|
export type LiveSessionOauthTokenSelectionSettings = {
|
|
4
4
|
maxConcurrentSessionCount: number;
|
|
5
5
|
fullSpeedFiveHourFreeRatio: number;
|
|
@@ -16,6 +16,7 @@ export type LiveSessionOauthTokenCandidateMetrics = {
|
|
|
16
16
|
hasConcurrencyHeadroom: boolean;
|
|
17
17
|
eligible: boolean;
|
|
18
18
|
exclusionReason: string | null;
|
|
19
|
+
selectionWeight: number;
|
|
19
20
|
};
|
|
20
21
|
export type LiveSessionOauthTokenSelectResult = {
|
|
21
22
|
selected: OauthTokenCandidate | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LiveSessionOauthTokenSelectUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/LiveSessionOauthTokenSelectUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kDAAkD,CAAC;
|
|
1
|
+
{"version":3,"file":"LiveSessionOauthTokenSelectUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/LiveSessionOauthTokenSelectUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kDAAkD,CAAC;AAC1F,OAAO,EACL,KAAK,mBAAmB,EACxB,uBAAuB,EAExB,MAAM,2BAA2B,CAAC;AAEnC,MAAM,MAAM,sCAAsC,GAAG;IACnD,yBAAyB,EAAE,MAAM,CAAC;IAClC,0BAA0B,EAAE,MAAM,CAAC;CACpC,CAAC;AAEF,eAAO,MAAM,mDAAmD,EAAE,sCAI/D,CAAC;AAEJ,eAAO,MAAM,4BAA4B,GACvC,mBAAmB,MAAM,EACzB,iBAAiB,MAAM,EACvB,UAAU,sCAAsC,KAC/C,MAaF,CAAC;AAEF,MAAM,MAAM,qCAAqC,GAAG;IAClD,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,sBAAsB,EAAE,OAAO,CAAC;IAChC,QAAQ,EAAE,OAAO,CAAC;IAClB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,iCAAiC,GAAG;IAC9C,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACrC,OAAO,EAAE,qCAAqC,EAAE,CAAC;CAClD,CAAC;AAEF,qBAAa,kCAAkC;IAE3C,OAAO,CAAC,QAAQ,CAAC,sBAAsB;gBAAtB,sBAAsB,GAAE,uBAAuD;IAGlG,GAAG,GACD,YAAY,mBAAmB,EAAE,EACjC,cAAc,iBAAiB,EAAE,EACjC,iBAAiB,MAAM,EACvB,UAAU,sCAAsC,KAC/C,iCAAiC,CAgDlC;IAEF,OAAO,CAAC,SAAS,CAgBf;IAEF,OAAO,CAAC,uBAAuB,CAe7B;CACH"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OauthTokenSelectUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/OauthTokenSelectUseCase.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,wBAAwB,GAAG;IACrC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,wBAAwB,GAAG,IAAI,CAAC;IAC1C,oBAAoB,EAAE,OAAO,CAAC;IAC9B,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC;AAE3C,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAE1C,eAAO,MAAM,iBAAiB,GAAI,WAAW,mBAAmB,KAAG,MAGlE,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"OauthTokenSelectUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/OauthTokenSelectUseCase.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,wBAAwB,GAAG;IACrC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,wBAAwB,GAAG,IAAI,CAAC;IAC1C,oBAAoB,EAAE,OAAO,CAAC;IAC9B,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC;AAE3C,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAE1C,eAAO,MAAM,iBAAiB,GAAI,WAAW,mBAAmB,KAAG,MAGlE,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACrC,OAAO,EAAE,0BAA0B,EAAE,CAAC;CACvC,CAAC;AAKF,eAAO,MAAM,wBAAwB,OAAO,CAAC;AAC7C,eAAO,MAAM,wBAAwB,OAAO,CAAC;AAE7C,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAC1C,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAGpC,eAAO,MAAM,qBAAqB,GAChC,mBAAmB,MAAM,EACzB,kBAAkB,MAAM,EACxB,iBAAiB,MAAM,KACtB,MAMF,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,KAAK,EAC3C,UAAU,KAAK,EAAE,EACjB,UAAU,CAAC,KAAK,EAAE,KAAK,KAAK,MAAM,EAClC,mBAAmB,KAAK,EACxB,QAAQ,eAAe,KACtB,KAkBF,CAAC;AAEF,qBAAa,uBAAuB;IAClC,GAAG,GACD,YAAY,mBAAmB,EAAE,EACjC,iBAAiB,MAAM,EACvB,SAAQ,eAA6B,KACpC,sBAAsB,CAwCvB;IAEF,OAAO,CAAC,QAAQ,CAiCd;IAEF,OAAO,CAAC,eAAe,CAuBrB;IAEF,OAAO,CAAC,iBAAiB,CAWvB;IAEF,OAAO,CAAC,iBAAiB,CAWvB;IAEF,OAAO,CAAC,gBAAgB,CActB;IAEF,OAAO,CAAC,aAAa,CAGwC;IAE7D,OAAO,CAAC,wBAAwB,CAG9B;IAEF,OAAO,CAAC,SAAS,CAAsD;CACxE"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Issue } from '../../entities/Issue';
|
|
2
2
|
import { Project } from '../../entities/Project';
|
|
3
|
+
import { UnansweredOwnerCall } from '../../entities/UnansweredOwnerCall';
|
|
3
4
|
export type InTmuxByHumanUrlEntry = {
|
|
4
5
|
url: string;
|
|
5
6
|
title: string;
|
|
@@ -20,6 +21,15 @@ export type InTmuxByHumanGroupV4 = {
|
|
|
20
21
|
story: string;
|
|
21
22
|
sessions: InTmuxByHumanSession[];
|
|
22
23
|
};
|
|
24
|
+
export type InTmuxByHumanSessionV5 = {
|
|
25
|
+
name: string;
|
|
26
|
+
description: string;
|
|
27
|
+
unansweredCalls: UnansweredOwnerCall[];
|
|
28
|
+
};
|
|
29
|
+
export type InTmuxByHumanGroupV5 = {
|
|
30
|
+
story: string;
|
|
31
|
+
sessions: InTmuxByHumanSessionV5[];
|
|
32
|
+
};
|
|
23
33
|
export type InTmuxByHumanV3 = {
|
|
24
34
|
version: 3;
|
|
25
35
|
overviewUrl: string;
|
|
@@ -33,11 +43,19 @@ export type InTmuxByHumanV4 = {
|
|
|
33
43
|
newIssueUrl: string;
|
|
34
44
|
groups: InTmuxByHumanGroupV4[];
|
|
35
45
|
};
|
|
46
|
+
export type InTmuxByHumanV5 = {
|
|
47
|
+
version: 5;
|
|
48
|
+
overviewUrl: string;
|
|
49
|
+
tdpmConsoleUrl: string;
|
|
50
|
+
newIssueUrl: string;
|
|
51
|
+
groups: InTmuxByHumanGroupV5[];
|
|
52
|
+
};
|
|
36
53
|
export type InTmuxByHumanData = {
|
|
37
54
|
v1: InTmuxByHumanGroupV1[];
|
|
38
55
|
v2: InTmuxByHumanGroupV2[];
|
|
39
56
|
v3: InTmuxByHumanV3 | null;
|
|
40
57
|
v4: InTmuxByHumanV4 | null;
|
|
58
|
+
v5: InTmuxByHumanV5 | null;
|
|
41
59
|
};
|
|
42
60
|
export type GenerateInTmuxByHumanDataInput = {
|
|
43
61
|
project: Project;
|
|
@@ -49,6 +67,7 @@ export type GenerateInTmuxByHumanDataInput = {
|
|
|
49
67
|
newIssueRepo?: string;
|
|
50
68
|
consoleBaseUrl: string | null;
|
|
51
69
|
consoleToken: string | null;
|
|
70
|
+
unansweredCallsByTmuxSessionName: Map<string, UnansweredOwnerCall[]>;
|
|
52
71
|
now: Date;
|
|
53
72
|
};
|
|
54
73
|
export declare class GenerateInTmuxByHumanDataUseCase {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GenerateInTmuxByHumanDataUseCase.d.ts","sourceRoot":"","sources":["../../../../src/domain/usecases/intmux/GenerateInTmuxByHumanDataUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAe,OAAO,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"GenerateInTmuxByHumanDataUseCase.d.ts","sourceRoot":"","sources":["../../../../src/domain/usecases/intmux/GenerateInTmuxByHumanDataUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAe,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAGzE,MAAM,MAAM,qBAAqB,GAAG;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,qBAAqB,EAAE,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,oBAAoB,EAAE,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,mBAAmB,EAAE,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,sBAAsB,EAAE,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,CAAC,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,oBAAoB,EAAE,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,CAAC,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,oBAAoB,EAAE,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,CAAC,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,oBAAoB,EAAE,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,EAAE,oBAAoB,EAAE,CAAC;IAC3B,EAAE,EAAE,oBAAoB,EAAE,CAAC;IAC3B,EAAE,EAAE,eAAe,GAAG,IAAI,CAAC;IAC3B,EAAE,EAAE,eAAe,GAAG,IAAI,CAAC;IAC3B,EAAE,EAAE,eAAe,GAAG,IAAI,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,gCAAgC,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,EAAE,CAAC,CAAC;IACrE,GAAG,EAAE,IAAI,CAAC;CACX,CAAC;AAUF,qBAAa,gCAAgC;IAC3C,GAAG,GAAI,OAAO,8BAA8B,KAAG,iBAAiB,CA6F9D;IAEF,OAAO,CAAC,eAAe,CAMS;IAEhC,OAAO,CAAC,iBAAiB,CAkCvB;CACH"}
|