github-issue-tower-defence-management 1.150.0 → 1.151.1

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 (44) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +9 -1
  3. package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js +32 -9
  4. package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js.map +1 -1
  5. package/bin/adapter/entry-points/handlers/inTmuxByHumanDataWriter.js +13 -1
  6. package/bin/adapter/entry-points/handlers/inTmuxByHumanDataWriter.js.map +1 -1
  7. package/bin/adapter/entry-points/handlers/notifySilentTmuxSessions.js +2 -10
  8. package/bin/adapter/entry-points/handlers/notifySilentTmuxSessions.js.map +1 -1
  9. package/bin/adapter/entry-points/handlers/resolveUnansweredOwnerCalls.js +12 -0
  10. package/bin/adapter/entry-points/handlers/resolveUnansweredOwnerCalls.js.map +1 -0
  11. package/bin/adapter/repositories/TranscriptOwnerCallStatusProvider.js +72 -14
  12. package/bin/adapter/repositories/TranscriptOwnerCallStatusProvider.js.map +1 -1
  13. package/bin/domain/entities/UnansweredOwnerCall.js +3 -0
  14. package/bin/domain/entities/UnansweredOwnerCall.js.map +1 -0
  15. package/bin/domain/usecases/intmux/GenerateInTmuxByHumanDataUseCase.js +21 -2
  16. package/bin/domain/usecases/intmux/GenerateInTmuxByHumanDataUseCase.js.map +1 -1
  17. package/package.json +1 -1
  18. package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts +58 -14
  19. package/src/adapter/entry-points/handlers/inTmuxByHumanDataWriter.test.ts +104 -1
  20. package/src/adapter/entry-points/handlers/inTmuxByHumanDataWriter.ts +19 -0
  21. package/src/adapter/entry-points/handlers/notifySilentTmuxSessions.test.ts +36 -3
  22. package/src/adapter/entry-points/handlers/notifySilentTmuxSessions.ts +3 -22
  23. package/src/adapter/entry-points/handlers/resolveUnansweredOwnerCalls.test.ts +111 -0
  24. package/src/adapter/entry-points/handlers/resolveUnansweredOwnerCalls.ts +33 -0
  25. package/src/adapter/repositories/TranscriptOwnerCallStatusProvider.singleScan.test.ts +88 -0
  26. package/src/adapter/repositories/TranscriptOwnerCallStatusProvider.test.ts +178 -0
  27. package/src/adapter/repositories/TranscriptOwnerCallStatusProvider.ts +122 -22
  28. package/src/domain/entities/UnansweredOwnerCall.ts +4 -0
  29. package/src/domain/usecases/intmux/GenerateInTmuxByHumanDataUseCase.test.ts +99 -0
  30. package/src/domain/usecases/intmux/GenerateInTmuxByHumanDataUseCase.ts +47 -1
  31. package/src/domain/usecases/intmux/UnansweredOwnerCallSessionKeyContract.test.ts +141 -0
  32. package/types/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.d.ts.map +1 -1
  33. package/types/adapter/entry-points/handlers/inTmuxByHumanDataWriter.d.ts +2 -0
  34. package/types/adapter/entry-points/handlers/inTmuxByHumanDataWriter.d.ts.map +1 -1
  35. package/types/adapter/entry-points/handlers/notifySilentTmuxSessions.d.ts +2 -2
  36. package/types/adapter/entry-points/handlers/notifySilentTmuxSessions.d.ts.map +1 -1
  37. package/types/adapter/entry-points/handlers/resolveUnansweredOwnerCalls.d.ts +13 -0
  38. package/types/adapter/entry-points/handlers/resolveUnansweredOwnerCalls.d.ts.map +1 -0
  39. package/types/adapter/repositories/TranscriptOwnerCallStatusProvider.d.ts +7 -0
  40. package/types/adapter/repositories/TranscriptOwnerCallStatusProvider.d.ts.map +1 -1
  41. package/types/domain/entities/UnansweredOwnerCall.d.ts +5 -0
  42. package/types/domain/entities/UnansweredOwnerCall.d.ts.map +1 -0
  43. package/types/domain/usecases/intmux/GenerateInTmuxByHumanDataUseCase.d.ts +19 -0
  44. package/types/domain/usecases/intmux/GenerateInTmuxByHumanDataUseCase.d.ts.map +1 -1
@@ -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
- return { v1, v2, v3, v4 };
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":"AA4CA,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,CAqwBP;CACH"}
1
+ {"version":3,"file":"HandleScheduledEventUseCaseHandler.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts"],"names":[],"mappings":"AAoDA,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,CAyyBP;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;AAMhE,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,GAAG,EAAE,IAAI,CAAC;CACX,CAAC;AAUF,eAAO,MAAM,sBAAsB,GACjC,QAAQ,6BAA6B,KACpC,IA0EF,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"}
@@ -1,4 +1,5 @@
1
1
  import { LocalCommandRunner } from '../../../domain/usecases/adapter-interfaces/LocalCommandRunner';
2
+ import { OwnerCallStatusProvider } from '../../../domain/usecases/adapter-interfaces/OwnerCallStatusProvider';
2
3
  import { ProcessEnvironReader } from '../../../domain/usecases/adapter-interfaces/ProcessEnvironReader';
3
4
  import { HubTaskStatusResolver } from '../../../domain/usecases/NotifySilentLiveSessionsUseCase';
4
5
  import { SilentSessionMessageTemplates } from '../../repositories/ConfigurableSilentSessionMessageComposer';
@@ -6,8 +7,7 @@ export type NotifySilentTmuxSessionsParams = {
6
7
  enabled: boolean;
7
8
  localCommandRunner: LocalCommandRunner;
8
9
  processEnvironReader?: ProcessEnvironReader;
9
- ownerCallMarker: string | null;
10
- ownerReplyMarkerDirectory?: string | null;
10
+ ownerCallStatusProvider: OwnerCallStatusProvider;
11
11
  subAgentOutputRootDirectory: string | null;
12
12
  subAgentProcessMatchPattern: string | null;
13
13
  subAgentTranscriptRootDirectory: string | null;
@@ -1 +1 @@
1
- {"version":3,"file":"notifySilentTmuxSessions.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/notifySilentTmuxSessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gEAAgE,CAAC;AAGpG,OAAO,EAAE,oBAAoB,EAAE,MAAM,kEAAkE,CAAC;AACxG,OAAO,EAEL,qBAAqB,EAQtB,MAAM,0DAA0D,CAAC;AAoBlE,OAAO,EAEL,6BAA6B,EAC9B,MAAM,6DAA6D,CAAC;AAKrE,MAAM,MAAM,8BAA8B,GAAG;IAC3C,OAAO,EAAE,OAAO,CAAC;IACjB,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,yBAAyB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,2BAA2B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,2BAA2B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,+BAA+B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/C,4BAA4B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,0BAA0B,EAAE,MAAM,CAAC;IACnC,+BAA+B,EAAE,MAAM,CAAC;IACxC,8BAA8B,EAAE,MAAM,CAAC;IACvC,+BAA+B,EAAE,MAAM,CAAC;IACxC,cAAc,EAAE,MAAM,CAAC;IACvB,qCAAqC,EAAE,MAAM,CAAC;IAC9C,8BAA8B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9C,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,qBAAqB,EAAE,qBAAqB,GAAG,IAAI,CAAC;IACpD,+BAA+B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/C,4BAA4B,EAAE,MAAM,CAAC;IACrC,gBAAgB,EAAE,6BAA6B,CAAC;IAChD,6BAA6B,CAAC,EAAE,MAAM,CAAC;IACvC,GAAG,EAAE,IAAI,CAAC;CACX,CAAC;AA2CF,eAAO,MAAM,wBAAwB,GACnC,QAAQ,8BAA8B,KACrC,OAAO,CAAC,IAAI,CAuFd,CAAC;AAEF,eAAO,MAAM,0CAA0C;;;;;;;;CAS7C,CAAC"}
1
+ {"version":3,"file":"notifySilentTmuxSessions.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/notifySilentTmuxSessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gEAAgE,CAAC;AAEpG,OAAO,EAAE,uBAAuB,EAAE,MAAM,qEAAqE,CAAC;AAC9G,OAAO,EAAE,oBAAoB,EAAE,MAAM,kEAAkE,CAAC;AACxG,OAAO,EAEL,qBAAqB,EAQtB,MAAM,0DAA0D,CAAC;AAkBlE,OAAO,EAEL,6BAA6B,EAC9B,MAAM,6DAA6D,CAAC;AAKrE,MAAM,MAAM,8BAA8B,GAAG;IAC3C,OAAO,EAAE,OAAO,CAAC;IACjB,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,uBAAuB,EAAE,uBAAuB,CAAC;IACjD,2BAA2B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,2BAA2B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,+BAA+B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/C,4BAA4B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,0BAA0B,EAAE,MAAM,CAAC;IACnC,+BAA+B,EAAE,MAAM,CAAC;IACxC,8BAA8B,EAAE,MAAM,CAAC;IACvC,+BAA+B,EAAE,MAAM,CAAC;IACxC,cAAc,EAAE,MAAM,CAAC;IACvB,qCAAqC,EAAE,MAAM,CAAC;IAC9C,8BAA8B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9C,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,qBAAqB,EAAE,qBAAqB,GAAG,IAAI,CAAC;IACpD,+BAA+B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/C,4BAA4B,EAAE,MAAM,CAAC;IACrC,gBAAgB,EAAE,6BAA6B,CAAC;IAChD,6BAA6B,CAAC,EAAE,MAAM,CAAC;IACvC,GAAG,EAAE,IAAI,CAAC;CACX,CAAC;AA8BF,eAAO,MAAM,wBAAwB,GACnC,QAAQ,8BAA8B,KACrC,OAAO,CAAC,IAAI,CAoFd,CAAC;AAEF,eAAO,MAAM,0CAA0C;;;;;;;;CAS7C,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,19 @@
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;
7
+ private readonly transcriptScanByPath;
6
8
  constructor(ownerCallMarker: string | null, ownerReplyMarkerDirectory?: string | null);
7
9
  listUnansweredOwnerCallEpochSecondsBySessionName: (transcriptPathBySessionName: Map<string, string>) => Promise<Map<string, number>>;
10
+ listUnansweredOwnerCallsBySessionName: (transcriptPathBySessionName: Map<string, string>) => Promise<Map<string, UnansweredOwnerCall[]>>;
11
+ private scanTranscript;
12
+ private readTranscriptScan;
13
+ private resolveReplyEpochMs;
8
14
  private findUnansweredOwnerCallEpochMs;
9
15
  private readOwnerReplyMarkerEpochMs;
16
+ private isCallDeliveredToOwner;
10
17
  private isCallSuppressedUndelivered;
11
18
  private isCandidateCallDelivered;
12
19
  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;AA6F3G,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,OAAO,CAAC,8BAA8B,CAqFpC;IAOF,OAAO,CAAC,2BAA2B,CAGyC;IAS5E,OAAO,CAAC,2BAA2B,CAgBjC;IAEF,OAAO,CAAC,wBAAwB,CAoB9B;IAEF,OAAO,CAAC,iBAAiB,CA4BvB;CACH"}
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;IAU7E,OAAO,CAAC,QAAQ,CAAC,yBAAyB;IAT5C,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAW;IAEjD,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAGjC;gBAGF,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,CAmB7B;IAEF,qCAAqC,GACnC,6BAA6B,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,KAC/C,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAkC5C;IAEF,OAAO,CAAC,cAAc,CAUpB;IAEF,OAAO,CAAC,kBAAkB,CA6DxB;IAEF,OAAO,CAAC,mBAAmB,CAUzB;IAEF,OAAO,CAAC,8BAA8B,CAgCpC;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,5 @@
1
+ export type UnansweredOwnerCall = {
2
+ calledAt: string;
3
+ body: string;
4
+ };
5
+ //# sourceMappingURL=UnansweredOwnerCall.d.ts.map
@@ -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,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;AAE9D,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,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,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;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,GAAG,EAAE,IAAI,CAAC;CACX,CAAC;AAUF,qBAAa,gCAAgC;IAC3C,GAAG,GAAI,OAAO,8BAA8B,KAAG,iBAAiB,CAsE9D;IAEF,OAAO,CAAC,eAAe,CAMS;IAEhC,OAAO,CAAC,iBAAiB,CAkCvB;CACH"}
1
+ {"version":3,"file":"GenerateInTmuxByHumanDataUseCase.d.ts","sourceRoot":"","sources":["../../../../src/domain/usecases/intmux/GenerateInTmuxByHumanDataUseCase.ts"],"names":[],"mappings":"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"}