github-issue-tower-defence-management 1.122.3 → 1.122.5

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 (84) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +8 -4
  3. package/bin/adapter/entry-points/console/consoleDoneStore.js +19 -5
  4. package/bin/adapter/entry-points/console/consoleDoneStore.js.map +1 -1
  5. package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js +14 -2
  6. package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js.map +1 -1
  7. package/bin/adapter/entry-points/handlers/consoleListsWriter.js +2 -0
  8. package/bin/adapter/entry-points/handlers/consoleListsWriter.js.map +1 -1
  9. package/bin/adapter/entry-points/handlers/notifySilentTmuxSessions.js +4 -2
  10. package/bin/adapter/entry-points/handlers/notifySilentTmuxSessions.js.map +1 -1
  11. package/bin/adapter/repositories/ConfigurableSilentSessionMessageComposer.js +12 -7
  12. package/bin/adapter/repositories/ConfigurableSilentSessionMessageComposer.js.map +1 -1
  13. package/bin/adapter/repositories/FileSystemSilentSessionCandidateStateRepository.js +60 -11
  14. package/bin/adapter/repositories/FileSystemSilentSessionCandidateStateRepository.js.map +1 -1
  15. package/bin/adapter/repositories/NoUnansweredOwnerCallStatusProvider.js +2 -2
  16. package/bin/adapter/repositories/NoUnansweredOwnerCallStatusProvider.js.map +1 -1
  17. package/bin/adapter/repositories/ProcessListSessionSubAgentActivityRepository.js +1 -0
  18. package/bin/adapter/repositories/ProcessListSessionSubAgentActivityRepository.js.map +1 -1
  19. package/bin/adapter/repositories/TranscriptOwnerCallStatusProvider.js +14 -11
  20. package/bin/adapter/repositories/TranscriptOwnerCallStatusProvider.js.map +1 -1
  21. package/bin/adapter/repositories/TranscriptSessionSubAgentActivityRepository.js +64 -7
  22. package/bin/adapter/repositories/TranscriptSessionSubAgentActivityRepository.js.map +1 -1
  23. package/bin/domain/usecases/DefaultSilentSessionMessageComposer.js +18 -7
  24. package/bin/domain/usecases/DefaultSilentSessionMessageComposer.js.map +1 -1
  25. package/bin/domain/usecases/NotifySilentLiveSessionsUseCase.js +64 -19
  26. package/bin/domain/usecases/NotifySilentLiveSessionsUseCase.js.map +1 -1
  27. package/package.json +1 -1
  28. package/src/adapter/entry-points/console/consoleDoneStore.test.ts +38 -0
  29. package/src/adapter/entry-points/console/consoleDoneStore.ts +29 -4
  30. package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts +11 -0
  31. package/src/adapter/entry-points/handlers/consoleListsWriter.test.ts +72 -0
  32. package/src/adapter/entry-points/handlers/consoleListsWriter.ts +3 -0
  33. package/src/adapter/entry-points/handlers/notifySilentTmuxSessions.test.ts +46 -7
  34. package/src/adapter/entry-points/handlers/notifySilentTmuxSessions.ts +6 -0
  35. package/src/adapter/repositories/ConfigurableSilentSessionMessageComposer.test.ts +102 -37
  36. package/src/adapter/repositories/ConfigurableSilentSessionMessageComposer.ts +22 -17
  37. package/src/adapter/repositories/FileSystemInteractiveLiveSessionTranscriptResolver.test.ts +1 -1
  38. package/src/adapter/repositories/FileSystemSilentSessionCandidateStateRepository.test.ts +223 -0
  39. package/src/adapter/repositories/FileSystemSilentSessionCandidateStateRepository.ts +94 -10
  40. package/src/adapter/repositories/NoUnansweredOwnerCallStatusProvider.test.ts +7 -6
  41. package/src/adapter/repositories/NoUnansweredOwnerCallStatusProvider.ts +3 -3
  42. package/src/adapter/repositories/ProcessListSessionSubAgentActivityRepository.test.ts +12 -2
  43. package/src/adapter/repositories/ProcessListSessionSubAgentActivityRepository.ts +1 -0
  44. package/src/adapter/repositories/TranscriptOwnerCallStatusProvider.test.ts +99 -49
  45. package/src/adapter/repositories/TranscriptOwnerCallStatusProvider.ts +24 -14
  46. package/src/adapter/repositories/TranscriptSessionSubAgentActivityRepository.test.ts +196 -4
  47. package/src/adapter/repositories/TranscriptSessionSubAgentActivityRepository.ts +91 -7
  48. package/src/domain/entities/LiveSessionActivitySnapshot.ts +2 -1
  49. package/src/domain/usecases/DefaultSilentSessionMessageComposer.test.ts +187 -51
  50. package/src/domain/usecases/DefaultSilentSessionMessageComposer.ts +32 -15
  51. package/src/domain/usecases/NotifySilentLiveSessionsUseCase.test.ts +356 -28
  52. package/src/domain/usecases/NotifySilentLiveSessionsUseCase.ts +94 -26
  53. package/src/domain/usecases/adapter-interfaces/OwnerCallStatusProvider.ts +2 -2
  54. package/src/domain/usecases/adapter-interfaces/SilentSessionCandidateStateRepository.ts +8 -0
  55. package/src/domain/usecases/adapter-interfaces/SilentSessionMessageComposer.ts +7 -6
  56. package/types/adapter/entry-points/console/consoleDoneStore.d.ts +2 -0
  57. package/types/adapter/entry-points/console/consoleDoneStore.d.ts.map +1 -1
  58. package/types/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.d.ts.map +1 -1
  59. package/types/adapter/entry-points/handlers/consoleListsWriter.d.ts.map +1 -1
  60. package/types/adapter/entry-points/handlers/notifySilentTmuxSessions.d.ts +2 -0
  61. package/types/adapter/entry-points/handlers/notifySilentTmuxSessions.d.ts.map +1 -1
  62. package/types/adapter/repositories/ConfigurableSilentSessionMessageComposer.d.ts +4 -3
  63. package/types/adapter/repositories/ConfigurableSilentSessionMessageComposer.d.ts.map +1 -1
  64. package/types/adapter/repositories/FileSystemSilentSessionCandidateStateRepository.d.ts +13 -2
  65. package/types/adapter/repositories/FileSystemSilentSessionCandidateStateRepository.d.ts.map +1 -1
  66. package/types/adapter/repositories/NoUnansweredOwnerCallStatusProvider.d.ts +1 -1
  67. package/types/adapter/repositories/NoUnansweredOwnerCallStatusProvider.d.ts.map +1 -1
  68. package/types/adapter/repositories/ProcessListSessionSubAgentActivityRepository.d.ts.map +1 -1
  69. package/types/adapter/repositories/TranscriptOwnerCallStatusProvider.d.ts +2 -2
  70. package/types/adapter/repositories/TranscriptOwnerCallStatusProvider.d.ts.map +1 -1
  71. package/types/adapter/repositories/TranscriptSessionSubAgentActivityRepository.d.ts +5 -1
  72. package/types/adapter/repositories/TranscriptSessionSubAgentActivityRepository.d.ts.map +1 -1
  73. package/types/domain/entities/LiveSessionActivitySnapshot.d.ts +2 -1
  74. package/types/domain/entities/LiveSessionActivitySnapshot.d.ts.map +1 -1
  75. package/types/domain/usecases/DefaultSilentSessionMessageComposer.d.ts +3 -3
  76. package/types/domain/usecases/DefaultSilentSessionMessageComposer.d.ts.map +1 -1
  77. package/types/domain/usecases/NotifySilentLiveSessionsUseCase.d.ts +4 -1
  78. package/types/domain/usecases/NotifySilentLiveSessionsUseCase.d.ts.map +1 -1
  79. package/types/domain/usecases/adapter-interfaces/OwnerCallStatusProvider.d.ts +1 -1
  80. package/types/domain/usecases/adapter-interfaces/OwnerCallStatusProvider.d.ts.map +1 -1
  81. package/types/domain/usecases/adapter-interfaces/SilentSessionCandidateStateRepository.d.ts +8 -0
  82. package/types/domain/usecases/adapter-interfaces/SilentSessionCandidateStateRepository.d.ts.map +1 -1
  83. package/types/domain/usecases/adapter-interfaces/SilentSessionMessageComposer.d.ts +5 -4
  84. package/types/domain/usecases/adapter-interfaces/SilentSessionMessageComposer.d.ts.map +1 -1
@@ -1,8 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.NotifySilentLiveSessionsUseCase = exports.isGitHubIssueOrPullRequestSessionName = exports.parseHubTaskIssueUrlFromSessionName = exports.DEFAULT_HUB_TASK_STATUS_CACHE_TTL_SECONDS = exports.DEFAULT_CANDIDATE_DEBOUNCE_RECENCY_WINDOW_SECONDS = exports.DEFAULT_NOTIFICATION_STAGGER_SECONDS = exports.DEFAULT_SUBAGENT_RUNNING_THRESHOLD_SECONDS = exports.DEFAULT_SUBAGENT_SILENT_THRESHOLD_SECONDS = exports.DEFAULT_MAIN_SILENT_THRESHOLD_SECONDS = void 0;
3
+ exports.NotifySilentLiveSessionsUseCase = exports.isGitHubIssueOrPullRequestSessionName = exports.parseHubTaskIssueUrlFromSessionName = exports.DEFAULT_HUB_TASK_STATUS_CACHE_TTL_SECONDS = exports.DEFAULT_CANDIDATE_DEBOUNCE_RECENCY_WINDOW_SECONDS = exports.DEFAULT_NOTIFICATION_STAGGER_SECONDS = exports.DEFAULT_SUBAGENT_RUNNING_THRESHOLD_SECONDS = exports.DEFAULT_SUBAGENT_SILENT_THRESHOLD_SECONDS = exports.DEFAULT_UNANSWERED_OWNER_CALL_GRACE_SECONDS = exports.DEFAULT_MAIN_SILENT_THRESHOLD_SECONDS = void 0;
4
4
  const ResolveInteractiveLiveSessionsUseCase_1 = require("./ResolveInteractiveLiveSessionsUseCase");
5
5
  exports.DEFAULT_MAIN_SILENT_THRESHOLD_SECONDS = 10 * 60;
6
+ exports.DEFAULT_UNANSWERED_OWNER_CALL_GRACE_SECONDS = 60 * 60;
6
7
  exports.DEFAULT_SUBAGENT_SILENT_THRESHOLD_SECONDS = 5 * 60;
7
8
  exports.DEFAULT_SUBAGENT_RUNNING_THRESHOLD_SECONDS = 15 * 60;
8
9
  exports.DEFAULT_NOTIFICATION_STAGGER_SECONDS = 25;
@@ -52,9 +53,9 @@ class NotifySilentLiveSessionsUseCase {
52
53
  const snapshots = await this.collectSnapshots(interactiveSessions, transcriptPathBySessionName, params.now);
53
54
  const candidates = [];
54
55
  for (const sessionSnapshot of snapshots) {
55
- const message = this.composeMessage(sessionSnapshot, params);
56
- if (message !== null) {
57
- candidates.push({ sessionName: sessionSnapshot.sessionName, message });
56
+ const candidate = await this.composeCandidate(sessionSnapshot, params);
57
+ if (candidate !== null) {
58
+ candidates.push(candidate);
58
59
  }
59
60
  }
60
61
  candidates.sort((left, right) => left.sessionName < right.sessionName
@@ -84,6 +85,16 @@ class NotifySilentLiveSessionsUseCase {
84
85
  await this.notificationRepository.sendSelfCheckNotification(candidate.sessionName, candidate.message);
85
86
  sentCount += 1;
86
87
  console.log(`Notified ${candidate.sessionName}.`);
88
+ if (candidate.newlyAnnouncedRunningLabels.length > 0) {
89
+ await this.candidateStateRepository.saveAnnouncedRunningSubAgentLabels({
90
+ sessionName: candidate.sessionName,
91
+ labels: [
92
+ ...candidate.retainedAnnouncedRunningLabels,
93
+ ...candidate.newlyAnnouncedRunningLabels,
94
+ ],
95
+ now: params.now,
96
+ });
97
+ }
87
98
  }
88
99
  };
89
100
  this.isHubTaskActive = async (sessionName, activeHubTaskStatus, hubTaskStatusCacheTtlSeconds, now) => {
@@ -162,40 +173,74 @@ class NotifySilentLiveSessionsUseCase {
162
173
  lastOutputBySessionName.set(activity.sessionName, activity.lastOutputEpochSeconds);
163
174
  }
164
175
  const subAgentsBySessionName = await this.subAgentActivityRepository.listSubAgentActivitiesBySessionName(sessionNames, transcriptPathBySessionName);
165
- const sessionNamesWithUnansweredOwnerCall = await this.ownerCallStatusProvider.listSessionNamesWithUnansweredOwnerCall(transcriptPathBySessionName);
176
+ const unansweredOwnerCallEpochSecondsBySessionName = await this.ownerCallStatusProvider.listUnansweredOwnerCallEpochSecondsBySessionName(transcriptPathBySessionName);
166
177
  const nowEpochSeconds = Math.floor(now.getTime() / 1000);
167
178
  return sessionNames.map((sessionName) => {
168
179
  const lastOutputEpochSeconds = lastOutputBySessionName.get(sessionName);
169
180
  const mainSilentSeconds = lastOutputEpochSeconds === undefined
170
181
  ? null
171
182
  : nowEpochSeconds - lastOutputEpochSeconds;
183
+ const unansweredOwnerCallEpochSeconds = unansweredOwnerCallEpochSecondsBySessionName.get(sessionName);
172
184
  return {
173
185
  sessionName,
174
186
  mainSilentSeconds,
175
187
  subAgents: subAgentsBySessionName.get(sessionName) ?? [],
176
- hasUnansweredOwnerCall: sessionNamesWithUnansweredOwnerCall.has(sessionName),
188
+ unansweredOwnerCallAgeSeconds: unansweredOwnerCallEpochSeconds === undefined
189
+ ? null
190
+ : nowEpochSeconds - unansweredOwnerCallEpochSeconds,
177
191
  };
178
192
  });
179
193
  };
180
- this.composeMessage = (snapshot, thresholds) => {
194
+ this.composeCandidate = async (snapshot, thresholds) => {
181
195
  const sections = [];
182
- if (snapshot.mainSilentSeconds !== null &&
183
- snapshot.mainSilentSeconds >= thresholds.mainSilentThresholdSeconds &&
184
- !snapshot.hasUnansweredOwnerCall) {
185
- sections.push(this.messageComposer.composeMainStalledSection(snapshot.mainSilentSeconds));
186
- }
187
- const stalledSubAgents = snapshot.subAgents.filter((subAgent) => subAgent.silentSeconds >= thresholds.subAgentSilentThresholdSeconds ||
188
- subAgent.runningSeconds >= thresholds.subAgentRunningThresholdSeconds);
189
- if (stalledSubAgents.length > 0) {
190
- sections.push(this.messageComposer.composeSubAgentSection(stalledSubAgents, {
191
- subAgentSilentThresholdSeconds: thresholds.subAgentSilentThresholdSeconds,
192
- subAgentRunningThresholdSeconds: thresholds.subAgentRunningThresholdSeconds,
196
+ const mainSilentSeconds = snapshot.mainSilentSeconds;
197
+ const unansweredOwnerCallAgeSeconds = snapshot.unansweredOwnerCallAgeSeconds;
198
+ const suppressedByRecentOwnerCall = unansweredOwnerCallAgeSeconds !== null &&
199
+ unansweredOwnerCallAgeSeconds <
200
+ thresholds.unansweredOwnerCallGraceSeconds;
201
+ const mainTriggered = mainSilentSeconds !== null &&
202
+ mainSilentSeconds >= thresholds.mainSilentThresholdSeconds &&
203
+ !suppressedByRecentOwnerCall;
204
+ if (mainTriggered) {
205
+ sections.push(unansweredOwnerCallAgeSeconds !== null
206
+ ? this.messageComposer.composeMainStalledWithStaleOwnerCallSection(mainSilentSeconds, unansweredOwnerCallAgeSeconds)
207
+ : this.messageComposer.composeMainStalledSection(mainSilentSeconds));
208
+ }
209
+ const idleSubAgents = snapshot.subAgents.filter((subAgent) => !subAgent.waitingOnExternalProcess &&
210
+ subAgent.silentSeconds >= thresholds.subAgentSilentThresholdSeconds);
211
+ const longRunningSubAgents = snapshot.subAgents.filter((subAgent) => subAgent.runningSeconds >= thresholds.subAgentRunningThresholdSeconds);
212
+ const retainedAnnouncedRunningLabels = await this.reconcileAnnouncedRunningLabels(snapshot, thresholds.now);
213
+ const newlyLongRunningSubAgents = longRunningSubAgents.filter((subAgent) => !retainedAnnouncedRunningLabels.includes(subAgent.label));
214
+ if (idleSubAgents.length > 0 || newlyLongRunningSubAgents.length > 0) {
215
+ sections.push(this.messageComposer.composeSubAgentSection({
216
+ idleSubAgents,
217
+ longRunningSubAgents: newlyLongRunningSubAgents,
193
218
  }));
194
219
  }
195
220
  if (sections.length === 0) {
196
221
  return null;
197
222
  }
198
- return sections.join('\n\n');
223
+ return {
224
+ sessionName: snapshot.sessionName,
225
+ message: sections.join('\n\n'),
226
+ newlyAnnouncedRunningLabels: newlyLongRunningSubAgents.map((subAgent) => subAgent.label),
227
+ retainedAnnouncedRunningLabels,
228
+ };
229
+ };
230
+ this.reconcileAnnouncedRunningLabels = async (snapshot, now) => {
231
+ const announcedLabels = await this.candidateStateRepository.loadAnnouncedRunningSubAgentLabels({
232
+ sessionName: snapshot.sessionName,
233
+ });
234
+ const currentLabels = new Set(snapshot.subAgents.map((subAgent) => subAgent.label));
235
+ const retainedLabels = Array.from(announcedLabels).filter((label) => currentLabels.has(label));
236
+ if (retainedLabels.length !== announcedLabels.size) {
237
+ await this.candidateStateRepository.saveAnnouncedRunningSubAgentLabels({
238
+ sessionName: snapshot.sessionName,
239
+ labels: retainedLabels,
240
+ now,
241
+ });
242
+ }
243
+ return retainedLabels;
199
244
  };
200
245
  }
201
246
  }
@@ -1 +1 @@
1
- {"version":3,"file":"NotifySilentLiveSessionsUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/NotifySilentLiveSessionsUseCase.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"NotifySilentLiveSessionsUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/NotifySilentLiveSessionsUseCase.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "github-issue-tower-defence-management",
3
- "version": "1.122.3",
3
+ "version": "1.122.5",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "scripts": {
@@ -8,6 +8,8 @@ import {
8
8
  readDoneProjectItemIds,
9
9
  recordDoneProjectItemId,
10
10
  recordDoneProjectItemIdAcrossTabs,
11
+ resetDoneProjectItemIds,
12
+ resetDoneProjectItemIdsAcrossTabs,
11
13
  } from './consoleDoneStore';
12
14
 
13
15
  describe('consoleDoneStore', () => {
@@ -103,4 +105,40 @@ describe('consoleDoneStore', () => {
103
105
  ).toEqual(['PVTI_7']);
104
106
  });
105
107
  });
108
+
109
+ describe('resetDoneProjectItemIds', () => {
110
+ it('clears an accumulated done file to an empty record', () => {
111
+ recordDoneProjectItemId(baseDir, 'umino', 'prs', 'PVTI_1');
112
+ recordDoneProjectItemId(baseDir, 'umino', 'prs', 'PVTI_2');
113
+ recordDoneProjectItemId(baseDir, 'umino', 'prs', 'PVTI_3');
114
+ resetDoneProjectItemIds(baseDir, 'umino', 'prs');
115
+ expect(readDoneProjectItemIds(baseDir, 'umino', 'prs')).toEqual([]);
116
+ });
117
+
118
+ it('writes an empty record when no done file exists yet', () => {
119
+ resetDoneProjectItemIds(baseDir, 'umino', 'prs');
120
+ const filePath = doneFilePathForTab(baseDir, 'umino', 'prs');
121
+ const raw: unknown = JSON.parse(fs.readFileSync(filePath, 'utf-8'));
122
+ expect(raw).toEqual({ projectItemIds: [] });
123
+ });
124
+
125
+ it('does not leave a temp file behind', () => {
126
+ resetDoneProjectItemIds(baseDir, 'umino', 'prs');
127
+ const filePath = doneFilePathForTab(baseDir, 'umino', 'prs');
128
+ expect(fs.existsSync(`${filePath}.tmp`)).toBe(false);
129
+ });
130
+ });
131
+
132
+ describe('resetDoneProjectItemIdsAcrossTabs', () => {
133
+ it('clears the done file of every tab including in-tmux-by-human', () => {
134
+ expect(CONSOLE_DONE_TAB_NAMES).toContain('in-tmux-by-human');
135
+ for (const tab of CONSOLE_DONE_TAB_NAMES) {
136
+ recordDoneProjectItemId(baseDir, 'umino', tab, 'PVTI_1');
137
+ }
138
+ resetDoneProjectItemIdsAcrossTabs(baseDir, 'umino');
139
+ for (const tab of CONSOLE_DONE_TAB_NAMES) {
140
+ expect(readDoneProjectItemIds(baseDir, 'umino', tab)).toEqual([]);
141
+ }
142
+ });
143
+ });
106
144
  });
@@ -33,6 +33,16 @@ export const doneFilePathForTab = (
33
33
  ): string =>
34
34
  path.join(consoleDataOutputDir, pjcode, tab, CONSOLE_DONE_FILE_NAME);
35
35
 
36
+ const writeDoneRecordAtomic = (
37
+ filePath: string,
38
+ record: ConsoleDoneRecord,
39
+ ): void => {
40
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
41
+ const tmpPath = `${filePath}.tmp`;
42
+ fs.writeFileSync(tmpPath, JSON.stringify(record));
43
+ fs.renameSync(tmpPath, filePath);
44
+ };
45
+
36
46
  export const readDoneProjectItemIds = (
37
47
  consoleDataOutputDir: string,
38
48
  pjcode: string,
@@ -65,10 +75,7 @@ export const recordDoneProjectItemId = (
65
75
  const updated: ConsoleDoneRecord = {
66
76
  projectItemIds: [...existing, projectItemId],
67
77
  };
68
- fs.mkdirSync(path.dirname(filePath), { recursive: true });
69
- const tmpPath = `${filePath}.tmp`;
70
- fs.writeFileSync(tmpPath, JSON.stringify(updated));
71
- fs.renameSync(tmpPath, filePath);
78
+ writeDoneRecordAtomic(filePath, updated);
72
79
  };
73
80
 
74
81
  export const CONSOLE_DONE_TAB_NAMES: string[] = [
@@ -90,3 +97,21 @@ export const recordDoneProjectItemIdAcrossTabs = (
90
97
  recordDoneProjectItemId(consoleDataOutputDir, pjcode, tab, projectItemId);
91
98
  }
92
99
  };
100
+
101
+ export const resetDoneProjectItemIds = (
102
+ consoleDataOutputDir: string,
103
+ pjcode: string,
104
+ tab: string,
105
+ ): void => {
106
+ const filePath = doneFilePathForTab(consoleDataOutputDir, pjcode, tab);
107
+ writeDoneRecordAtomic(filePath, { projectItemIds: [] });
108
+ };
109
+
110
+ export const resetDoneProjectItemIdsAcrossTabs = (
111
+ consoleDataOutputDir: string,
112
+ pjcode: string,
113
+ ): void => {
114
+ for (const tab of CONSOLE_DONE_TAB_NAMES) {
115
+ resetDoneProjectItemIds(consoleDataOutputDir, pjcode, tab);
116
+ }
117
+ };
@@ -115,6 +115,7 @@ export class HandleScheduledEventUseCaseHandler {
115
115
  subAgentProcessMatchPattern?: string;
116
116
  subAgentTranscriptRootDirectory?: string;
117
117
  mainSilentThresholdSeconds?: number;
118
+ unansweredOwnerCallGraceSeconds?: number;
118
119
  subAgentSilentThresholdSeconds?: number;
119
120
  subAgentRunningThresholdSeconds?: number;
120
121
  silentNotificationStaggerSeconds?: number;
@@ -124,6 +125,7 @@ export class HandleScheduledEventUseCaseHandler {
124
125
  hubTaskStatusCacheStateFilePath?: string;
125
126
  hubTaskStatusCacheTtlSeconds?: number;
126
127
  silentMainStalledMessage?: string;
128
+ silentMainStalledStaleOwnerCallMessage?: string;
127
129
  silentSubAgentIdleMessageHeader?: string;
128
130
  silentSubAgentIdleMessageFooter?: string;
129
131
  silentSubAgentLongRunningMessageHeader?: string;
@@ -599,6 +601,11 @@ export class HandleScheduledEventUseCaseHandler {
599
601
  process.env.TDPM_MAIN_SILENT_THRESHOLD_SECONDS,
600
602
  DEFAULT_NOTIFY_SILENT_TMUX_SESSIONS_PARAMS.mainSilentThresholdSeconds,
601
603
  ),
604
+ unansweredOwnerCallGraceSeconds: readSilentSeconds(
605
+ mergedInput.unansweredOwnerCallGraceSeconds,
606
+ process.env.TDPM_SILENT_UNANSWERED_OWNER_CALL_GRACE_SECONDS,
607
+ DEFAULT_NOTIFY_SILENT_TMUX_SESSIONS_PARAMS.unansweredOwnerCallGraceSeconds,
608
+ ),
602
609
  subAgentSilentThresholdSeconds: readSilentSeconds(
603
610
  mergedInput.subAgentSilentThresholdSeconds,
604
611
  process.env.TDPM_SUBAGENT_SILENT_THRESHOLD_SECONDS,
@@ -642,6 +649,10 @@ export class HandleScheduledEventUseCaseHandler {
642
649
  mergedInput.silentMainStalledMessage ??
643
650
  process.env.TDPM_SILENT_MAIN_STALLED_MESSAGE ??
644
651
  null,
652
+ mainStalledStaleOwnerCallMessage:
653
+ mergedInput.silentMainStalledStaleOwnerCallMessage ??
654
+ process.env.TDPM_SILENT_MAIN_STALLED_STALE_OWNER_CALL_MESSAGE ??
655
+ null,
645
656
  subAgentIdleMessageHeader:
646
657
  mergedInput.silentSubAgentIdleMessageHeader ??
647
658
  process.env.TDPM_SILENT_SUBAGENT_IDLE_MESSAGE_HEADER ??
@@ -4,6 +4,15 @@ import path from 'path';
4
4
  import { mock } from 'jest-mock-extended';
5
5
  import { Issue } from '../../../domain/entities/Issue';
6
6
  import { FieldOption, Project } from '../../../domain/entities/Project';
7
+ import {
8
+ buildConsoleDataResponse,
9
+ parseConsoleDataRoute,
10
+ } from '../console/consoleDataDelivery';
11
+ import {
12
+ CONSOLE_DONE_TAB_NAMES,
13
+ readDoneProjectItemIds,
14
+ recordDoneProjectItemId,
15
+ } from '../console/consoleDoneStore';
7
16
  import {
8
17
  formatConsoleGeneratedAt,
9
18
  writeConsoleLists,
@@ -226,6 +235,69 @@ describe('writeConsoleLists', () => {
226
235
  });
227
236
  expect(fs.readdirSync(outDir)).toHaveLength(0);
228
237
  });
238
+
239
+ const regenerateUnread = (): void => {
240
+ writeConsoleLists({
241
+ consoleDataOutputDir: outDir,
242
+ pjcode: 'demo',
243
+ assigneeLogin: ASSIGNEE,
244
+ project,
245
+ issues: [makeIssue({ status: 'Unread', itemId: 'item-1' })],
246
+ generatedAt: '2026-06-14T07:22:33Z',
247
+ });
248
+ };
249
+
250
+ const unreadServedItemCount = (): number => {
251
+ const route = parseConsoleDataRoute('projects/demo/unread/list.json');
252
+ if (route === null) {
253
+ throw new Error('route should not be null');
254
+ }
255
+ const response = buildConsoleDataResponse(outDir, route);
256
+ const body: unknown = JSON.parse(response.body);
257
+ const items: unknown = isRecord(body) ? body.items : undefined;
258
+ return isUnknownArray(items) ? items.length : 0;
259
+ };
260
+
261
+ it('resets the done file of every tab to an empty record on regeneration', () => {
262
+ regenerateUnread();
263
+
264
+ for (const tab of CONSOLE_DONE_TAB_NAMES) {
265
+ const doneFile = path.join(outDir, 'demo', tab, '.done.json');
266
+ expect(fs.existsSync(doneFile)).toBe(true);
267
+ const raw: unknown = JSON.parse(fs.readFileSync(doneFile, 'utf8'));
268
+ expect(raw).toEqual({ projectItemIds: [] });
269
+ }
270
+ });
271
+
272
+ it('clears a pre-existing accumulated done file on regeneration', () => {
273
+ for (const id of ['PVTI_1', 'PVTI_2', 'PVTI_3']) {
274
+ recordDoneProjectItemId(outDir, 'demo', 'unread', id);
275
+ }
276
+ expect(readDoneProjectItemIds(outDir, 'demo', 'unread')).toHaveLength(3);
277
+
278
+ regenerateUnread();
279
+
280
+ expect(readDoneProjectItemIds(outDir, 'demo', 'unread')).toEqual([]);
281
+ });
282
+
283
+ it('serves the full list after regeneration despite a prior accumulated done record', () => {
284
+ recordDoneProjectItemId(outDir, 'demo', 'unread', 'item-1');
285
+
286
+ regenerateUnread();
287
+
288
+ expect(unreadServedItemCount()).toBe(1);
289
+ });
290
+
291
+ it('re-hides an item recorded as done until the next regeneration bounds it to one cycle', () => {
292
+ regenerateUnread();
293
+ expect(unreadServedItemCount()).toBe(1);
294
+
295
+ recordDoneProjectItemId(outDir, 'demo', 'unread', 'item-1');
296
+ expect(unreadServedItemCount()).toBe(0);
297
+
298
+ regenerateUnread();
299
+ expect(unreadServedItemCount()).toBe(1);
300
+ });
229
301
  });
230
302
 
231
303
  describe('formatConsoleGeneratedAt', () => {
@@ -7,6 +7,7 @@ import {
7
7
  ConsoleTabName,
8
8
  GenerateConsoleListsUseCase,
9
9
  } from '../../../domain/usecases/console/GenerateConsoleListsUseCase';
10
+ import { resetDoneProjectItemIdsAcrossTabs } from '../console/consoleDoneStore';
10
11
 
11
12
  export type ConsoleListsWriterParams = {
12
13
  consoleDataOutputDir: string | null | undefined;
@@ -61,4 +62,6 @@ export const writeConsoleLists = (params: ConsoleListsWriterParams): void => {
61
62
  lists[tab],
62
63
  );
63
64
  }
65
+
66
+ resetDoneProjectItemIdsAcrossTabs(consoleDataOutputDir, pjcode);
64
67
  };
@@ -20,6 +20,7 @@ const CLAUDE_PID = 201;
20
20
 
21
21
  const EMPTY_TEMPLATES: SilentSessionMessageTemplates = {
22
22
  mainStalledMessage: null,
23
+ mainStalledStaleOwnerCallMessage: null,
23
24
  subAgentIdleMessageHeader: null,
24
25
  subAgentIdleMessageFooter: null,
25
26
  subAgentLongRunningMessageHeader: null,
@@ -221,11 +222,8 @@ describe('notifySilentTmuxSessions', () => {
221
222
  await notifySilentTmuxSessions({
222
223
  ...baseParams(runner),
223
224
  messageTemplates: {
225
+ ...EMPTY_TEMPLATES,
224
226
  mainStalledMessage: 'CUSTOM_MAIN_TEMPLATE',
225
- subAgentIdleMessageHeader: null,
226
- subAgentIdleMessageFooter: null,
227
- subAgentLongRunningMessageHeader: null,
228
- subAgentLongRunningMessageFooter: null,
229
227
  },
230
228
  });
231
229
 
@@ -240,8 +238,8 @@ describe('notifySilentTmuxSessions', () => {
240
238
  );
241
239
  });
242
240
 
243
- it('suppresses the notification whenever an owner call is unanswered, regardless of how long the session has been silent', async () => {
244
- const stalePendingOwnerCall = new Date(
241
+ it('suppresses the notification while the unanswered owner call is younger than the grace period', async () => {
242
+ const recentPendingOwnerCall = new Date(
245
243
  (NOW_EPOCH_SECONDS - 11 * 60) * 1000,
246
244
  ).toISOString();
247
245
  writeTranscript([
@@ -252,7 +250,7 @@ describe('notifySilentTmuxSessions', () => {
252
250
  },
253
251
  {
254
252
  type: 'assistant',
255
- timestamp: stalePendingOwnerCall,
253
+ timestamp: recentPendingOwnerCall,
256
254
  message: {
257
255
  role: 'assistant',
258
256
  stop_reason: 'end_turn',
@@ -262,6 +260,7 @@ describe('notifySilentTmuxSessions', () => {
262
260
  },
263
261
  },
264
262
  ]);
263
+ seedPreviousCandidates([SESSION_NAME]);
265
264
  const runner = liveSessionRunner();
266
265
 
267
266
  await notifySilentTmuxSessions({
@@ -275,6 +274,46 @@ describe('notifySilentTmuxSessions', () => {
275
274
  expect(sendCall).toBeUndefined();
276
275
  });
277
276
 
277
+ it('sends the stale-owner-call reminder once the unanswered owner call is older than the grace period', async () => {
278
+ const stalePendingOwnerCall = new Date(
279
+ (NOW_EPOCH_SECONDS - 2 * 60 * 60) * 1000,
280
+ ).toISOString();
281
+ writeTranscript([
282
+ {
283
+ type: 'user',
284
+ timestamp: '2026-06-25T20:00:00.000Z',
285
+ message: { role: 'user', content: 'go ahead' },
286
+ },
287
+ {
288
+ type: 'assistant',
289
+ timestamp: stalePendingOwnerCall,
290
+ message: {
291
+ role: 'assistant',
292
+ stop_reason: 'end_turn',
293
+ content: [
294
+ { type: 'text', text: 'waiting <<OWNER_CALL>> please decide' },
295
+ ],
296
+ },
297
+ },
298
+ ]);
299
+ seedPreviousCandidates([SESSION_NAME]);
300
+ const runner = liveSessionRunner();
301
+
302
+ await notifySilentTmuxSessions({
303
+ ...baseParams(runner),
304
+ ownerCallMarker: '<<OWNER_CALL>>',
305
+ });
306
+
307
+ const sendCall = runner.runCommand.mock.calls.find(
308
+ (call) => call[0] === 'tmux' && call[1][0] === 'send-keys',
309
+ );
310
+ expect(sendCall?.[1][2]).toBe(SESSION_NAME);
311
+ expect(sendCall?.[1][4]).toContain('is still unanswered');
312
+ expect(sendCall?.[1][4]).toContain(
313
+ 're-raise your pending ask NOW as a fresh owner call',
314
+ );
315
+ });
316
+
278
317
  it('defers the first cycle then notifies on the next cycle once the persisted candidate state confirms a second consecutive cycle', async () => {
279
318
  silentAssistantTranscript();
280
319
  const firstRunner = liveSessionRunner();
@@ -6,6 +6,7 @@ import {
6
6
  NotifySilentLiveSessionsUseCase,
7
7
  HubTaskStatusResolver,
8
8
  DEFAULT_MAIN_SILENT_THRESHOLD_SECONDS,
9
+ DEFAULT_UNANSWERED_OWNER_CALL_GRACE_SECONDS,
9
10
  DEFAULT_SUBAGENT_SILENT_THRESHOLD_SECONDS,
10
11
  DEFAULT_SUBAGENT_RUNNING_THRESHOLD_SECONDS,
11
12
  DEFAULT_NOTIFICATION_STAGGER_SECONDS,
@@ -42,6 +43,7 @@ export type NotifySilentTmuxSessionsParams = {
42
43
  subAgentProcessMatchPattern: string | null;
43
44
  subAgentTranscriptRootDirectory: string | null;
44
45
  mainSilentThresholdSeconds: number;
46
+ unansweredOwnerCallGraceSeconds: number;
45
47
  subAgentSilentThresholdSeconds: number;
46
48
  subAgentRunningThresholdSeconds: number;
47
49
  staggerSeconds: number;
@@ -76,6 +78,7 @@ const createSubAgentActivityRepository = (
76
78
  new FileSystemSubAgentTranscriptDirectoryResolver(
77
79
  subAgentTranscriptRootDirectory,
78
80
  ),
81
+ new NodeSubAgentProcessLister(localCommandRunner),
79
82
  now,
80
83
  );
81
84
  }
@@ -101,6 +104,7 @@ export const notifySilentTmuxSessions = async (
101
104
  subAgentProcessMatchPattern,
102
105
  subAgentTranscriptRootDirectory,
103
106
  mainSilentThresholdSeconds,
107
+ unansweredOwnerCallGraceSeconds,
104
108
  subAgentSilentThresholdSeconds,
105
109
  subAgentRunningThresholdSeconds,
106
110
  staggerSeconds,
@@ -156,6 +160,7 @@ export const notifySilentTmuxSessions = async (
156
160
  );
157
161
  await useCase.run({
158
162
  mainSilentThresholdSeconds,
163
+ unansweredOwnerCallGraceSeconds,
159
164
  subAgentSilentThresholdSeconds,
160
165
  subAgentRunningThresholdSeconds,
161
166
  staggerSeconds,
@@ -168,6 +173,7 @@ export const notifySilentTmuxSessions = async (
168
173
 
169
174
  export const DEFAULT_NOTIFY_SILENT_TMUX_SESSIONS_PARAMS = {
170
175
  mainSilentThresholdSeconds: DEFAULT_MAIN_SILENT_THRESHOLD_SECONDS,
176
+ unansweredOwnerCallGraceSeconds: DEFAULT_UNANSWERED_OWNER_CALL_GRACE_SECONDS,
171
177
  subAgentSilentThresholdSeconds: DEFAULT_SUBAGENT_SILENT_THRESHOLD_SECONDS,
172
178
  subAgentRunningThresholdSeconds: DEFAULT_SUBAGENT_RUNNING_THRESHOLD_SECONDS,
173
179
  staggerSeconds: DEFAULT_NOTIFICATION_STAGGER_SECONDS,