github-issue-tower-defence-management 1.126.2 → 1.126.3

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 (21) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/bin/adapter/repositories/FileSystemSessionOutputActivityRepository.js +49 -24
  3. package/bin/adapter/repositories/FileSystemSessionOutputActivityRepository.js.map +1 -1
  4. package/bin/domain/usecases/NotifySilentLiveSessionsUseCase.js +33 -2
  5. package/bin/domain/usecases/NotifySilentLiveSessionsUseCase.js.map +1 -1
  6. package/package.json +4 -4
  7. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleOperations.test.ts +5 -2
  8. package/src/adapter/repositories/FileSystemSessionOutputActivityRepository.test.ts +183 -18
  9. package/src/adapter/repositories/FileSystemSessionOutputActivityRepository.ts +59 -26
  10. package/src/domain/entities/LiveSessionActivitySnapshot.ts +1 -0
  11. package/src/domain/entities/LiveSessionOutputActivity.ts +1 -0
  12. package/src/domain/usecases/NotifySilentLiveSessionsUseCase.test.ts +70 -0
  13. package/src/domain/usecases/NotifySilentLiveSessionsUseCase.ts +37 -1
  14. package/types/adapter/repositories/FileSystemSessionOutputActivityRepository.d.ts +1 -11
  15. package/types/adapter/repositories/FileSystemSessionOutputActivityRepository.d.ts.map +1 -1
  16. package/types/domain/entities/LiveSessionActivitySnapshot.d.ts +1 -0
  17. package/types/domain/entities/LiveSessionActivitySnapshot.d.ts.map +1 -1
  18. package/types/domain/entities/LiveSessionOutputActivity.d.ts +1 -0
  19. package/types/domain/entities/LiveSessionOutputActivity.d.ts.map +1 -1
  20. package/types/domain/usecases/NotifySilentLiveSessionsUseCase.d.ts +1 -0
  21. package/types/domain/usecases/NotifySilentLiveSessionsUseCase.d.ts.map +1 -1
package/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## [1.126.3](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.126.2...v1.126.3) (2026-07-22)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **silent-monitor:** compute main-session last activity from the last assistant line only ([#1242](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/issues/1242)) ([1f11221](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/commit/1f11221dc8ef8d8c3c2c137e1b728297ccb4ddf2)), closes [#1241](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/issues/1241) [#1241](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/issues/1241) [#1241](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/issues/1241)
7
+
1
8
  ## [1.126.2](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.126.1...v1.126.2) (2026-07-20)
2
9
 
3
10
 
@@ -47,37 +47,42 @@ const parseEpochMilliseconds = (timestamp) => {
47
47
  const parsed = Date.parse(timestamp);
48
48
  return Number.isNaN(parsed) ? null : parsed;
49
49
  };
50
- /**
51
- * Reads the last main-session activity time for each live session from its
52
- * already-resolved transcript path. Idle time is computed from the timestamp of
53
- * the latest entry of any kind (assistant text, owner replies, tool results, or
54
- * any other entry type) rather than from the transcript file modification time.
55
- * Because a session that is actively running tool calls keeps appending entries
56
- * such as `user` and `tool_result` even while it emits no assistant text, every
57
- * entry with a parseable timestamp counts as activity, so a working session is
58
- * not mistaken for a silent one.
59
- */
50
+ const readContentBlocks = (message) => {
51
+ const content = message.content;
52
+ if (!Array.isArray(content)) {
53
+ return [];
54
+ }
55
+ return content.filter(isRecord);
56
+ };
60
57
  class FileSystemSessionOutputActivityRepository {
61
58
  constructor() {
62
59
  this.listSessionOutputActivities = async (transcriptPathBySessionName) => {
63
60
  const activities = [];
64
61
  for (const [sessionName, transcriptPath] of transcriptPathBySessionName) {
65
- const lastOutputEpochSeconds = this.readLastActivityEpochSeconds(transcriptPath);
66
- if (lastOutputEpochSeconds !== null) {
67
- activities.push({ sessionName, lastOutputEpochSeconds });
62
+ const { lastAssistantOutputEpochSeconds, hasInProgressToolCall } = this.readTranscriptActivity(transcriptPath);
63
+ if (lastAssistantOutputEpochSeconds !== null) {
64
+ activities.push({
65
+ sessionName,
66
+ lastOutputEpochSeconds: lastAssistantOutputEpochSeconds,
67
+ hasInProgressToolCall,
68
+ });
68
69
  }
69
70
  }
70
71
  return activities;
71
72
  };
72
- this.readLastActivityEpochSeconds = (transcriptPath) => {
73
+ this.readTranscriptActivity = (transcriptPath) => {
73
74
  let content;
74
75
  try {
75
76
  content = fs.readFileSync(transcriptPath, 'utf8');
76
77
  }
77
78
  catch {
78
- return null;
79
+ return {
80
+ lastAssistantOutputEpochSeconds: null,
81
+ hasInProgressToolCall: false,
82
+ };
79
83
  }
80
- let lastActivityEpochMs = null;
84
+ let lastAssistantOutputEpochMs = null;
85
+ const pendingToolUseIds = new Set();
81
86
  for (const line of content.split('\n')) {
82
87
  const trimmed = line.trim();
83
88
  if (trimmed.length === 0) {
@@ -93,18 +98,38 @@ class FileSystemSessionOutputActivityRepository {
93
98
  if (!isRecord(parsed)) {
94
99
  continue;
95
100
  }
96
- const epochMs = parseEpochMilliseconds(readString(parsed, 'timestamp'));
97
- if (epochMs === null) {
101
+ const message = parsed.message;
102
+ if (readString(parsed, 'type') === 'assistant') {
103
+ const epochMs = parseEpochMilliseconds(readString(parsed, 'timestamp'));
104
+ if (epochMs !== null) {
105
+ lastAssistantOutputEpochMs = epochMs;
106
+ }
107
+ }
108
+ if (!isRecord(message)) {
98
109
  continue;
99
110
  }
100
- if (lastActivityEpochMs === null || epochMs > lastActivityEpochMs) {
101
- lastActivityEpochMs = epochMs;
111
+ for (const block of readContentBlocks(message)) {
112
+ const blockType = readString(block, 'type');
113
+ if (blockType === 'tool_use') {
114
+ const toolUseId = readString(block, 'id');
115
+ if (toolUseId !== null) {
116
+ pendingToolUseIds.add(toolUseId);
117
+ }
118
+ }
119
+ else if (blockType === 'tool_result') {
120
+ const toolUseId = readString(block, 'tool_use_id');
121
+ if (toolUseId !== null) {
122
+ pendingToolUseIds.delete(toolUseId);
123
+ }
124
+ }
102
125
  }
103
126
  }
104
- if (lastActivityEpochMs === null) {
105
- return null;
106
- }
107
- return Math.floor(lastActivityEpochMs / 1000);
127
+ return {
128
+ lastAssistantOutputEpochSeconds: lastAssistantOutputEpochMs === null
129
+ ? null
130
+ : Math.floor(lastAssistantOutputEpochMs / 1000),
131
+ hasInProgressToolCall: pendingToolUseIds.size > 0,
132
+ };
108
133
  };
109
134
  }
110
135
  }
@@ -1 +1 @@
1
- {"version":3,"file":"FileSystemSessionOutputActivityRepository.js","sourceRoot":"","sources":["../../../src/adapter/repositories/FileSystemSessionOutputActivityRepository.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FileSystemSessionOutputActivityRepository.js","sourceRoot":"","sources":["../../../src/adapter/repositories/FileSystemSessionOutputActivityRepository.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
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_UNANSWERED_OWNER_CALL_GRACE_SECONDS = exports.DEFAULT_MAIN_SILENT_THRESHOLD_SECONDS = void 0;
3
+ exports.NotifySilentLiveSessionsUseCase = exports.isGitHubIssueOrPullRequestSessionName = exports.parseHubTaskIssueUrlFromSessionName = exports.IN_PROGRESS_TOOL_CALL_MAX_SUPPRESS_SECONDS = 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
6
  // Retained only for backward compatibility of the configuration surface
@@ -13,6 +13,15 @@ exports.DEFAULT_SUBAGENT_RUNNING_THRESHOLD_SECONDS = 15 * 60;
13
13
  exports.DEFAULT_NOTIFICATION_STAGGER_SECONDS = 25;
14
14
  exports.DEFAULT_CANDIDATE_DEBOUNCE_RECENCY_WINDOW_SECONDS = 15 * 60;
15
15
  exports.DEFAULT_HUB_TASK_STATUS_CACHE_TTL_SECONDS = 5 * 60;
16
+ // Upper bound on how long an in-progress tool call suppresses the main-stall
17
+ // reminder. Set to 2 hours: comfortably above the ~1-hour maximum duration of
18
+ // the longest legitimate single tool call (the Monitor tool's own timeout
19
+ // ceiling), so every legitimate long-running tool call is still suppressed,
20
+ // while a session whose transcript tail has been an unanswered tool_use for
21
+ // longer than this — for example because the tool call itself hung and never
22
+ // returned — still receives the stall reminder instead of being suppressed
23
+ // forever.
24
+ exports.IN_PROGRESS_TOOL_CALL_MAX_SUPPRESS_SECONDS = 2 * 60 * 60;
16
25
  const GITHUB_ISSUE_OR_PULL_URL_PATTERN = /^https:\/\/github\.com\/([^/]+)\/([^/]+)\/(?:issues|pull)\/(\d+)$/;
17
26
  const GITHUB_TMUX_SESSION_NAME_PATTERN = /^https_\/\/github_com\/([^/]+)\/([^/]+)\/(?:issues|pull)\/(\d+)$/;
18
27
  const parseHubTaskIssueUrlFromSessionName = (sessionName) => {
@@ -184,8 +193,10 @@ class NotifySilentLiveSessionsUseCase {
184
193
  const sessionNames = interactiveSessions.map((session) => session.sessionName);
185
194
  const activities = await this.sessionOutputActivityRepository.listSessionOutputActivities(transcriptPathBySessionName);
186
195
  const lastOutputBySessionName = new Map();
196
+ const inProgressToolCallBySessionName = new Map();
187
197
  for (const activity of activities) {
188
198
  lastOutputBySessionName.set(activity.sessionName, activity.lastOutputEpochSeconds);
199
+ inProgressToolCallBySessionName.set(activity.sessionName, activity.hasInProgressToolCall);
189
200
  }
190
201
  const subAgentsBySessionName = await this.subAgentActivityRepository.listSubAgentActivitiesBySessionName(sessionNames, transcriptPathBySessionName);
191
202
  const unansweredOwnerCallEpochSecondsBySessionName = await this.ownerCallStatusProvider.listUnansweredOwnerCallEpochSecondsBySessionName(transcriptPathBySessionName);
@@ -199,6 +210,7 @@ class NotifySilentLiveSessionsUseCase {
199
210
  return {
200
211
  sessionName,
201
212
  mainSilentSeconds,
213
+ mainHasInProgressToolCall: inProgressToolCallBySessionName.get(sessionName) ?? false,
202
214
  subAgents: subAgentsBySessionName.get(sessionName) ?? [],
203
215
  unansweredOwnerCallAgeSeconds: unansweredOwnerCallEpochSeconds === undefined
204
216
  ? null
@@ -220,9 +232,28 @@ class NotifySilentLiveSessionsUseCase {
220
232
  // is retained in the parameters only for backward compatibility of the
221
233
  // call signature and is intentionally ignored (treated as infinite).
222
234
  const suppressedByUnansweredOwnerCall = unansweredOwnerCallAgeSeconds !== null;
235
+ // A session whose transcript tail is an assistant tool_use with no matching
236
+ // tool_result is legitimately busy running one long tool call (e.g. a Bash
237
+ // command near its timeout, or a Monitor waiting up to an hour): it appends
238
+ // no new assistant line while the tool runs, so mainSilentSeconds crosses
239
+ // the threshold even though the session is working, not stalled. Suppress
240
+ // the main-stall reminder in that case. Genuine thrashing silence — where
241
+ // the last assistant tool_use was already answered (or there is none) — has
242
+ // no pending tool call and is still flagged.
243
+ // The suppression is bounded by the pending tool call's own age
244
+ // (mainSilentSeconds, which for an in-progress tool call equals the age of
245
+ // the pending tool_use line) so it cannot last forever: a session stuck
246
+ // inside a tool call that never returns is reminded once that age exceeds
247
+ // IN_PROGRESS_TOOL_CALL_MAX_SUPPRESS_SECONDS, restoring the ~10-minute
248
+ // stall reminder for a truly hung session instead of suppressing it
249
+ // indefinitely.
250
+ const suppressedByInProgressToolCall = snapshot.mainHasInProgressToolCall &&
251
+ mainSilentSeconds !== null &&
252
+ mainSilentSeconds < exports.IN_PROGRESS_TOOL_CALL_MAX_SUPPRESS_SECONDS;
223
253
  const mainTriggered = mainSilentSeconds !== null &&
224
254
  mainSilentSeconds >= thresholds.mainSilentThresholdSeconds &&
225
- !suppressedByUnansweredOwnerCall;
255
+ !suppressedByUnansweredOwnerCall &&
256
+ !suppressedByInProgressToolCall;
226
257
  if (mainTriggered) {
227
258
  sections.push(this.messageComposer.composeMainStalledSection(mainSilentSeconds));
228
259
  sectionLabels.push('main-stalled');
@@ -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.126.2",
3
+ "version": "1.126.3",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "scripts": {
@@ -65,7 +65,7 @@
65
65
  "@testing-library/react": "16.3.2",
66
66
  "@jest/globals": "^29.7.0",
67
67
  "@types/better-sqlite3": "7.6.13",
68
- "@types/jest": "^29.5.12",
68
+ "@types/jest": "^30.0.0",
69
69
  "@types/node": "^20.5.1",
70
70
  "@types/react": "^19.1.0",
71
71
  "@types/react-dom": "^19.1.0",
@@ -82,8 +82,8 @@
82
82
  "eslint": "^10.5.0",
83
83
  "eslint-plugin-import-x": "^4.0.0",
84
84
  "eslint-plugin-unused-imports": "^4.4.1",
85
- "jest": "^29.7.0",
86
- "jest-environment-jsdom": "29.7.0",
85
+ "jest": "^30.4.2",
86
+ "jest-environment-jsdom": "30.4.1",
87
87
  "jest-html-reporter": "^4.4.0",
88
88
  "jest-junit": "^17.0.0",
89
89
  "jest-mock-extended": "^4.0.0-beta1",
@@ -36,8 +36,11 @@ const captureFetch = (): jest.Mock => {
36
36
  return fetchMock;
37
37
  };
38
38
 
39
- const lastBody = (fetchMock: jest.Mock): Record<string, unknown> =>
40
- JSON.parse((fetchMock.mock.calls.at(-1)?.[1] as { body: string }).body);
39
+ const lastBody = (fetchMock: jest.Mock): Record<string, unknown> => {
40
+ const lastCall = fetchMock.mock.calls.at(-1);
41
+ if (!lastCall) throw new Error('No fetch calls found');
42
+ return JSON.parse((lastCall[1] as { body: string }).body);
43
+ };
41
44
 
42
45
  const setup = () => {
43
46
  localStorage.clear();
@@ -25,6 +25,14 @@ describe('FileSystemSessionOutputActivityRepository', () => {
25
25
  },
26
26
  });
27
27
 
28
+ const assistantEntryWithoutTimestamp = (): object => ({
29
+ type: 'assistant',
30
+ message: {
31
+ role: 'assistant',
32
+ content: [{ type: 'text', text: 'no timestamp on this entry' }],
33
+ },
34
+ });
35
+
28
36
  const userEntry = (timestamp: string): object => ({
29
37
  type: 'user',
30
38
  timestamp,
@@ -37,6 +45,51 @@ describe('FileSystemSessionOutputActivityRepository', () => {
37
45
  toolUseResult: { stdout: 'done', stderr: '' },
38
46
  });
39
47
 
48
+ const systemEntry = (timestamp: string): object => ({
49
+ type: 'system',
50
+ timestamp,
51
+ content: 'Compacting conversation history',
52
+ });
53
+
54
+ const assistantEntryWithToolUse = (
55
+ timestamp: string,
56
+ toolUseId: string,
57
+ ): object => ({
58
+ type: 'assistant',
59
+ timestamp,
60
+ message: {
61
+ role: 'assistant',
62
+ stop_reason: 'tool_use',
63
+ content: [
64
+ { type: 'text', text: 'running a command' },
65
+ {
66
+ type: 'tool_use',
67
+ id: toolUseId,
68
+ name: 'Bash',
69
+ input: { command: 'sleep 590' },
70
+ },
71
+ ],
72
+ },
73
+ });
74
+
75
+ const toolResultUserEntry = (
76
+ timestamp: string,
77
+ toolUseId: string,
78
+ ): object => ({
79
+ type: 'user',
80
+ timestamp,
81
+ message: {
82
+ role: 'user',
83
+ content: [
84
+ {
85
+ type: 'tool_result',
86
+ tool_use_id: toolUseId,
87
+ content: 'done',
88
+ },
89
+ ],
90
+ },
91
+ });
92
+
40
93
  const untimestampedEntry = (): object => ({
41
94
  type: 'summary',
42
95
  summary: 'no timestamp on this entry',
@@ -52,11 +105,56 @@ describe('FileSystemSessionOutputActivityRepository', () => {
52
105
  return filePath;
53
106
  };
54
107
 
55
- it('returns the latest entry timestamp of any type as the last activity epoch', async () => {
108
+ it('returns the old last-assistant timestamp when recent system and tool entries follow it', async () => {
109
+ const transcriptPath = writeTranscript('thrashing.jsonl', [
110
+ assistantEntry('2026-06-27T01:00:00.000Z'),
111
+ systemEntry('2026-06-27T09:30:00.000Z'),
112
+ toolResultEntry('2026-06-27T09:45:00.000Z'),
113
+ systemEntry('2026-06-27T10:00:00.000Z'),
114
+ ]);
115
+ const repository = new FileSystemSessionOutputActivityRepository();
116
+
117
+ const result = await repository.listSessionOutputActivities(
118
+ new Map([['thrashing', transcriptPath]]),
119
+ );
120
+
121
+ expect(result).toEqual([
122
+ {
123
+ sessionName: 'thrashing',
124
+ lastOutputEpochSeconds: Math.floor(
125
+ Date.parse('2026-06-27T01:00:00.000Z') / 1000,
126
+ ),
127
+ hasInProgressToolCall: false,
128
+ },
129
+ ]);
130
+ });
131
+
132
+ it('returns the recent timestamp when the latest assistant entry is recent', async () => {
133
+ const transcriptPath = writeTranscript('working.jsonl', [
134
+ userEntry('2026-06-27T09:00:00.000Z'),
135
+ assistantEntry('2026-06-27T09:55:00.000Z'),
136
+ ]);
137
+ const repository = new FileSystemSessionOutputActivityRepository();
138
+
139
+ const result = await repository.listSessionOutputActivities(
140
+ new Map([['working', transcriptPath]]),
141
+ );
142
+
143
+ expect(result).toEqual([
144
+ {
145
+ sessionName: 'working',
146
+ lastOutputEpochSeconds: Math.floor(
147
+ Date.parse('2026-06-27T09:55:00.000Z') / 1000,
148
+ ),
149
+ hasInProgressToolCall: false,
150
+ },
151
+ ]);
152
+ });
153
+
154
+ it('ignores a later user entry and returns the last assistant timestamp', async () => {
56
155
  const transcriptPath = writeTranscript('workbench.jsonl', [
57
156
  assistantEntry('2026-06-27T10:00:00.000Z'),
58
- userEntry('2026-06-27T10:30:00.000Z'),
59
- assistantEntry('2026-06-27T10:05:00.000Z'),
157
+ userEntry('2026-06-27T11:00:00.000Z'),
60
158
  ]);
61
159
  const repository = new FileSystemSessionOutputActivityRepository();
62
160
 
@@ -68,16 +166,41 @@ describe('FileSystemSessionOutputActivityRepository', () => {
68
166
  {
69
167
  sessionName: 'workbench',
70
168
  lastOutputEpochSeconds: Math.floor(
71
- Date.parse('2026-06-27T10:30:00.000Z') / 1000,
169
+ Date.parse('2026-06-27T10:00:00.000Z') / 1000,
72
170
  ),
171
+ hasInProgressToolCall: false,
73
172
  },
74
173
  ]);
75
174
  });
76
175
 
77
- it('advances the last activity time when a later user entry follows an assistant entry', async () => {
176
+ it('ignores a later tool_result entry and returns the last assistant timestamp', async () => {
78
177
  const transcriptPath = writeTranscript('workbench.jsonl', [
79
178
  assistantEntry('2026-06-27T10:00:00.000Z'),
80
- userEntry('2026-06-27T11:00:00.000Z'),
179
+ toolResultEntry('2026-06-27T10:45:00.000Z'),
180
+ ]);
181
+ const repository = new FileSystemSessionOutputActivityRepository();
182
+
183
+ const result = await repository.listSessionOutputActivities(
184
+ new Map([['workbench', transcriptPath]]),
185
+ );
186
+
187
+ expect(result).toEqual([
188
+ {
189
+ sessionName: 'workbench',
190
+ lastOutputEpochSeconds: Math.floor(
191
+ Date.parse('2026-06-27T10:00:00.000Z') / 1000,
192
+ ),
193
+ hasInProgressToolCall: false,
194
+ },
195
+ ]);
196
+ });
197
+
198
+ it('returns the last assistant entry timestamp when several entry types interleave', async () => {
199
+ const transcriptPath = writeTranscript('workbench.jsonl', [
200
+ assistantEntry('2026-06-27T10:00:00.000Z'),
201
+ userEntry('2026-06-27T10:10:00.000Z'),
202
+ assistantEntry('2026-06-27T10:05:00.000Z'),
203
+ systemEntry('2026-06-27T10:40:00.000Z'),
81
204
  ]);
82
205
  const repository = new FileSystemSessionOutputActivityRepository();
83
206
 
@@ -89,16 +212,17 @@ describe('FileSystemSessionOutputActivityRepository', () => {
89
212
  {
90
213
  sessionName: 'workbench',
91
214
  lastOutputEpochSeconds: Math.floor(
92
- Date.parse('2026-06-27T11:00:00.000Z') / 1000,
215
+ Date.parse('2026-06-27T10:05:00.000Z') / 1000,
93
216
  ),
217
+ hasInProgressToolCall: false,
94
218
  },
95
219
  ]);
96
220
  });
97
221
 
98
- it('advances the last activity time when a tool_result entry is the latest entry', async () => {
222
+ it('falls back to the last assistant entry that has a parseable timestamp', async () => {
99
223
  const transcriptPath = writeTranscript('workbench.jsonl', [
100
224
  assistantEntry('2026-06-27T10:00:00.000Z'),
101
- toolResultEntry('2026-06-27T10:45:00.000Z'),
225
+ assistantEntryWithoutTimestamp(),
102
226
  ]);
103
227
  const repository = new FileSystemSessionOutputActivityRepository();
104
228
 
@@ -110,8 +234,9 @@ describe('FileSystemSessionOutputActivityRepository', () => {
110
234
  {
111
235
  sessionName: 'workbench',
112
236
  lastOutputEpochSeconds: Math.floor(
113
- Date.parse('2026-06-27T10:45:00.000Z') / 1000,
237
+ Date.parse('2026-06-27T10:00:00.000Z') / 1000,
114
238
  ),
239
+ hasInProgressToolCall: false,
115
240
  },
116
241
  ]);
117
242
  });
@@ -135,13 +260,29 @@ describe('FileSystemSessionOutputActivityRepository', () => {
135
260
  lastOutputEpochSeconds: Math.floor(
136
261
  Date.parse('2026-06-27T10:00:00.000Z') / 1000,
137
262
  ),
263
+ hasInProgressToolCall: false,
138
264
  },
139
265
  ]);
140
266
  });
141
267
 
142
- it('resolves a transcript whose only entry is a non-assistant entry', async () => {
268
+ it('omits a transcript whose only entries are non-assistant entries', async () => {
143
269
  const transcriptPath = writeTranscript('workbench.jsonl', [
144
270
  userEntry('2026-06-27T10:00:00.000Z'),
271
+ toolResultEntry('2026-06-27T10:05:00.000Z'),
272
+ systemEntry('2026-06-27T10:10:00.000Z'),
273
+ ]);
274
+ const repository = new FileSystemSessionOutputActivityRepository();
275
+
276
+ const result = await repository.listSessionOutputActivities(
277
+ new Map([['workbench', transcriptPath]]),
278
+ );
279
+
280
+ expect(result).toEqual([]);
281
+ });
282
+
283
+ it('omits sessions whose transcript has no parseable timestamp', async () => {
284
+ const transcriptPath = writeTranscript('workbench.jsonl', [
285
+ untimestampedEntry(),
145
286
  ]);
146
287
  const repository = new FileSystemSessionOutputActivityRepository();
147
288
 
@@ -149,27 +290,51 @@ describe('FileSystemSessionOutputActivityRepository', () => {
149
290
  new Map([['workbench', transcriptPath]]),
150
291
  );
151
292
 
293
+ expect(result).toEqual([]);
294
+ });
295
+
296
+ it('flags a session as waiting on a running tool when the last assistant tool_use has no matching tool_result', async () => {
297
+ const transcriptPath = writeTranscript('busy.jsonl', [
298
+ assistantEntry('2026-06-27T09:00:00.000Z'),
299
+ assistantEntryWithToolUse('2026-06-27T09:01:00.000Z', 'toolu_running'),
300
+ ]);
301
+ const repository = new FileSystemSessionOutputActivityRepository();
302
+
303
+ const result = await repository.listSessionOutputActivities(
304
+ new Map([['busy', transcriptPath]]),
305
+ );
306
+
152
307
  expect(result).toEqual([
153
308
  {
154
- sessionName: 'workbench',
309
+ sessionName: 'busy',
155
310
  lastOutputEpochSeconds: Math.floor(
156
- Date.parse('2026-06-27T10:00:00.000Z') / 1000,
311
+ Date.parse('2026-06-27T09:01:00.000Z') / 1000,
157
312
  ),
313
+ hasInProgressToolCall: true,
158
314
  },
159
315
  ]);
160
316
  });
161
317
 
162
- it('omits sessions whose transcript has no parseable timestamp', async () => {
163
- const transcriptPath = writeTranscript('workbench.jsonl', [
164
- untimestampedEntry(),
318
+ it('does not flag a session once the matching tool_result for its last tool_use is appended', async () => {
319
+ const transcriptPath = writeTranscript('completed.jsonl', [
320
+ assistantEntryWithToolUse('2026-06-27T09:01:00.000Z', 'toolu_done'),
321
+ toolResultUserEntry('2026-06-27T09:05:00.000Z', 'toolu_done'),
165
322
  ]);
166
323
  const repository = new FileSystemSessionOutputActivityRepository();
167
324
 
168
325
  const result = await repository.listSessionOutputActivities(
169
- new Map([['workbench', transcriptPath]]),
326
+ new Map([['completed', transcriptPath]]),
170
327
  );
171
328
 
172
- expect(result).toEqual([]);
329
+ expect(result).toEqual([
330
+ {
331
+ sessionName: 'completed',
332
+ lastOutputEpochSeconds: Math.floor(
333
+ Date.parse('2026-06-27T09:01:00.000Z') / 1000,
334
+ ),
335
+ hasInProgressToolCall: false,
336
+ },
337
+ ]);
173
338
  });
174
339
 
175
340
  it('returns an empty list when no sessions are requested', async () => {
@@ -21,41 +21,54 @@ const parseEpochMilliseconds = (timestamp: string | null): number | null => {
21
21
  return Number.isNaN(parsed) ? null : parsed;
22
22
  };
23
23
 
24
- /**
25
- * Reads the last main-session activity time for each live session from its
26
- * already-resolved transcript path. Idle time is computed from the timestamp of
27
- * the latest entry of any kind (assistant text, owner replies, tool results, or
28
- * any other entry type) rather than from the transcript file modification time.
29
- * Because a session that is actively running tool calls keeps appending entries
30
- * such as `user` and `tool_result` even while it emits no assistant text, every
31
- * entry with a parseable timestamp counts as activity, so a working session is
32
- * not mistaken for a silent one.
33
- */
24
+ const readContentBlocks = (
25
+ message: Record<string, unknown>,
26
+ ): Record<string, unknown>[] => {
27
+ const content = message.content;
28
+ if (!Array.isArray(content)) {
29
+ return [];
30
+ }
31
+ return content.filter(isRecord);
32
+ };
33
+
34
+ type TranscriptActivity = {
35
+ lastAssistantOutputEpochSeconds: number | null;
36
+ hasInProgressToolCall: boolean;
37
+ };
38
+
34
39
  export class FileSystemSessionOutputActivityRepository implements SessionOutputActivityRepository {
35
40
  listSessionOutputActivities = async (
36
41
  transcriptPathBySessionName: Map<string, string>,
37
42
  ): Promise<LiveSessionOutputActivity[]> => {
38
43
  const activities: LiveSessionOutputActivity[] = [];
39
44
  for (const [sessionName, transcriptPath] of transcriptPathBySessionName) {
40
- const lastOutputEpochSeconds =
41
- this.readLastActivityEpochSeconds(transcriptPath);
42
- if (lastOutputEpochSeconds !== null) {
43
- activities.push({ sessionName, lastOutputEpochSeconds });
45
+ const { lastAssistantOutputEpochSeconds, hasInProgressToolCall } =
46
+ this.readTranscriptActivity(transcriptPath);
47
+ if (lastAssistantOutputEpochSeconds !== null) {
48
+ activities.push({
49
+ sessionName,
50
+ lastOutputEpochSeconds: lastAssistantOutputEpochSeconds,
51
+ hasInProgressToolCall,
52
+ });
44
53
  }
45
54
  }
46
55
  return activities;
47
56
  };
48
57
 
49
- private readLastActivityEpochSeconds = (
58
+ private readTranscriptActivity = (
50
59
  transcriptPath: string,
51
- ): number | null => {
60
+ ): TranscriptActivity => {
52
61
  let content: string;
53
62
  try {
54
63
  content = fs.readFileSync(transcriptPath, 'utf8');
55
64
  } catch {
56
- return null;
65
+ return {
66
+ lastAssistantOutputEpochSeconds: null,
67
+ hasInProgressToolCall: false,
68
+ };
57
69
  }
58
- let lastActivityEpochMs: number | null = null;
70
+ let lastAssistantOutputEpochMs: number | null = null;
71
+ const pendingToolUseIds = new Set<string>();
59
72
  for (const line of content.split('\n')) {
60
73
  const trimmed = line.trim();
61
74
  if (trimmed.length === 0) {
@@ -70,17 +83,37 @@ export class FileSystemSessionOutputActivityRepository implements SessionOutputA
70
83
  if (!isRecord(parsed)) {
71
84
  continue;
72
85
  }
73
- const epochMs = parseEpochMilliseconds(readString(parsed, 'timestamp'));
74
- if (epochMs === null) {
86
+ const message = parsed.message;
87
+ if (readString(parsed, 'type') === 'assistant') {
88
+ const epochMs = parseEpochMilliseconds(readString(parsed, 'timestamp'));
89
+ if (epochMs !== null) {
90
+ lastAssistantOutputEpochMs = epochMs;
91
+ }
92
+ }
93
+ if (!isRecord(message)) {
75
94
  continue;
76
95
  }
77
- if (lastActivityEpochMs === null || epochMs > lastActivityEpochMs) {
78
- lastActivityEpochMs = epochMs;
96
+ for (const block of readContentBlocks(message)) {
97
+ const blockType = readString(block, 'type');
98
+ if (blockType === 'tool_use') {
99
+ const toolUseId = readString(block, 'id');
100
+ if (toolUseId !== null) {
101
+ pendingToolUseIds.add(toolUseId);
102
+ }
103
+ } else if (blockType === 'tool_result') {
104
+ const toolUseId = readString(block, 'tool_use_id');
105
+ if (toolUseId !== null) {
106
+ pendingToolUseIds.delete(toolUseId);
107
+ }
108
+ }
79
109
  }
80
110
  }
81
- if (lastActivityEpochMs === null) {
82
- return null;
83
- }
84
- return Math.floor(lastActivityEpochMs / 1000);
111
+ return {
112
+ lastAssistantOutputEpochSeconds:
113
+ lastAssistantOutputEpochMs === null
114
+ ? null
115
+ : Math.floor(lastAssistantOutputEpochMs / 1000),
116
+ hasInProgressToolCall: pendingToolUseIds.size > 0,
117
+ };
85
118
  };
86
119
  }
@@ -8,6 +8,7 @@ export type SubAgentActivity = {
8
8
  export type LiveSessionActivitySnapshot = {
9
9
  sessionName: string;
10
10
  mainSilentSeconds: number | null;
11
+ mainHasInProgressToolCall: boolean;
11
12
  subAgents: SubAgentActivity[];
12
13
  unansweredOwnerCallAgeSeconds: number | null;
13
14
  };
@@ -1,4 +1,5 @@
1
1
  export type LiveSessionOutputActivity = {
2
2
  sessionName: string;
3
3
  lastOutputEpochSeconds: number;
4
+ hasInProgressToolCall: boolean;
4
5
  };
@@ -10,6 +10,7 @@ import {
10
10
  DEFAULT_NOTIFICATION_STAGGER_SECONDS,
11
11
  DEFAULT_CANDIDATE_DEBOUNCE_RECENCY_WINDOW_SECONDS,
12
12
  DEFAULT_HUB_TASK_STATUS_CACHE_TTL_SECONDS,
13
+ IN_PROGRESS_TOOL_CALL_MAX_SUPPRESS_SECONDS,
13
14
  } from './NotifySilentLiveSessionsUseCase';
14
15
  import { Issue } from '../entities/Issue';
15
16
  import { LiveSessionProcessSnapshotProvider } from './adapter-interfaces/LiveSessionProcessSnapshotProvider';
@@ -244,6 +245,7 @@ describe('NotifySilentLiveSessionsUseCase', () => {
244
245
  sessionName,
245
246
  lastOutputEpochSeconds:
246
247
  nowEpochSeconds - DEFAULT_MAIN_SILENT_THRESHOLD_SECONDS,
248
+ hasInProgressToolCall: false,
247
249
  },
248
250
  ],
249
251
  );
@@ -274,6 +276,7 @@ describe('NotifySilentLiveSessionsUseCase', () => {
274
276
  sessionName: GITHUB_SESSION,
275
277
  lastOutputEpochSeconds:
276
278
  nowEpochSeconds - DEFAULT_MAIN_SILENT_THRESHOLD_SECONDS,
279
+ hasInProgressToolCall: false,
277
280
  },
278
281
  ],
279
282
  );
@@ -297,6 +300,7 @@ describe('NotifySilentLiveSessionsUseCase', () => {
297
300
  sessionName: pullRequestSession,
298
301
  lastOutputEpochSeconds:
299
302
  nowEpochSeconds - DEFAULT_MAIN_SILENT_THRESHOLD_SECONDS,
303
+ hasInProgressToolCall: false,
300
304
  },
301
305
  ],
302
306
  );
@@ -318,6 +322,7 @@ describe('NotifySilentLiveSessionsUseCase', () => {
318
322
  sessionName: 'workbench',
319
323
  lastOutputEpochSeconds:
320
324
  nowEpochSeconds - DEFAULT_MAIN_SILENT_THRESHOLD_SECONDS,
325
+ hasInProgressToolCall: false,
321
326
  },
322
327
  ],
323
328
  );
@@ -351,11 +356,13 @@ describe('NotifySilentLiveSessionsUseCase', () => {
351
356
  sessionName: GITHUB_SESSION,
352
357
  lastOutputEpochSeconds:
353
358
  nowEpochSeconds - DEFAULT_MAIN_SILENT_THRESHOLD_SECONDS,
359
+ hasInProgressToolCall: false,
354
360
  },
355
361
  {
356
362
  sessionName: 'orchestrator',
357
363
  lastOutputEpochSeconds:
358
364
  nowEpochSeconds - DEFAULT_MAIN_SILENT_THRESHOLD_SECONDS,
365
+ hasInProgressToolCall: false,
359
366
  },
360
367
  ],
361
368
  );
@@ -471,6 +478,7 @@ describe('NotifySilentLiveSessionsUseCase', () => {
471
478
  sessionName: GITHUB_SESSION,
472
479
  lastOutputEpochSeconds:
473
480
  nowEpochSeconds - DEFAULT_MAIN_SILENT_THRESHOLD_SECONDS + 1,
481
+ hasInProgressToolCall: false,
474
482
  },
475
483
  ],
476
484
  );
@@ -498,6 +506,7 @@ describe('NotifySilentLiveSessionsUseCase', () => {
498
506
  sessionName: GITHUB_SESSION,
499
507
  lastOutputEpochSeconds:
500
508
  nowEpochSeconds - DEFAULT_MAIN_SILENT_THRESHOLD_SECONDS,
509
+ hasInProgressToolCall: false,
501
510
  },
502
511
  ],
503
512
  );
@@ -518,6 +527,59 @@ describe('NotifySilentLiveSessionsUseCase', () => {
518
527
  ).toHaveBeenCalledWith(GITHUB_SESSION, MAIN_STALLED_SECTION);
519
528
  });
520
529
 
530
+ it('does not send the main stalled section when the session is silent past the threshold but is waiting on a running tool call', async () => {
531
+ setupLiveInteractiveSession(GITHUB_SESSION);
532
+ mockSessionOutputActivityRepository.listSessionOutputActivities.mockResolvedValue(
533
+ [
534
+ {
535
+ sessionName: GITHUB_SESSION,
536
+ lastOutputEpochSeconds:
537
+ nowEpochSeconds - DEFAULT_MAIN_SILENT_THRESHOLD_SECONDS,
538
+ hasInProgressToolCall: true,
539
+ },
540
+ ],
541
+ );
542
+ mockOwnerCallStatusProvider.listUnansweredOwnerCallEpochSecondsBySessionName.mockResolvedValue(
543
+ new Map<string, number>(),
544
+ );
545
+
546
+ await useCase.run(runParams());
547
+
548
+ expect(
549
+ mockMessageComposer.composeMainStalledSection,
550
+ ).not.toHaveBeenCalled();
551
+ expect(
552
+ mockNotificationRepository.sendSelfCheckNotification,
553
+ ).not.toHaveBeenCalled();
554
+ });
555
+
556
+ it('sends the main stalled section when the in-progress tool call has been pending longer than the suppression bound', async () => {
557
+ setupLiveInteractiveSession(GITHUB_SESSION);
558
+ const pendingToolCallAgeSeconds =
559
+ IN_PROGRESS_TOOL_CALL_MAX_SUPPRESS_SECONDS + 60 * 60;
560
+ mockSessionOutputActivityRepository.listSessionOutputActivities.mockResolvedValue(
561
+ [
562
+ {
563
+ sessionName: GITHUB_SESSION,
564
+ lastOutputEpochSeconds: nowEpochSeconds - pendingToolCallAgeSeconds,
565
+ hasInProgressToolCall: true,
566
+ },
567
+ ],
568
+ );
569
+ mockOwnerCallStatusProvider.listUnansweredOwnerCallEpochSecondsBySessionName.mockResolvedValue(
570
+ new Map<string, number>(),
571
+ );
572
+
573
+ await useCase.run(runParams());
574
+
575
+ expect(mockMessageComposer.composeMainStalledSection).toHaveBeenCalledWith(
576
+ pendingToolCallAgeSeconds,
577
+ );
578
+ expect(
579
+ mockNotificationRepository.sendSelfCheckNotification,
580
+ ).toHaveBeenCalledWith(GITHUB_SESSION, MAIN_STALLED_SECTION);
581
+ });
582
+
521
583
  it('does not send the main stalled section when output is within the threshold', async () => {
522
584
  setupLiveInteractiveSession(GITHUB_SESSION);
523
585
  mockSessionOutputActivityRepository.listSessionOutputActivities.mockResolvedValue(
@@ -526,6 +588,7 @@ describe('NotifySilentLiveSessionsUseCase', () => {
526
588
  sessionName: GITHUB_SESSION,
527
589
  lastOutputEpochSeconds:
528
590
  nowEpochSeconds - DEFAULT_MAIN_SILENT_THRESHOLD_SECONDS + 1,
591
+ hasInProgressToolCall: false,
529
592
  },
530
593
  ],
531
594
  );
@@ -651,6 +714,7 @@ describe('NotifySilentLiveSessionsUseCase', () => {
651
714
  sessionName: GITHUB_SESSION,
652
715
  lastOutputEpochSeconds:
653
716
  nowEpochSeconds - DEFAULT_MAIN_SILENT_THRESHOLD_SECONDS,
717
+ hasInProgressToolCall: false,
654
718
  },
655
719
  ],
656
720
  );
@@ -678,6 +742,7 @@ describe('NotifySilentLiveSessionsUseCase', () => {
678
742
  sessionName: GITHUB_SESSION,
679
743
  lastOutputEpochSeconds:
680
744
  nowEpochSeconds - DEFAULT_MAIN_SILENT_THRESHOLD_SECONDS,
745
+ hasInProgressToolCall: false,
681
746
  },
682
747
  ],
683
748
  );
@@ -944,11 +1009,13 @@ describe('NotifySilentLiveSessionsUseCase', () => {
944
1009
  sessionName: GITHUB_SESSION_ALPHA,
945
1010
  lastOutputEpochSeconds:
946
1011
  nowEpochSeconds - DEFAULT_MAIN_SILENT_THRESHOLD_SECONDS,
1012
+ hasInProgressToolCall: false,
947
1013
  },
948
1014
  {
949
1015
  sessionName: GITHUB_SESSION_BRAVO,
950
1016
  lastOutputEpochSeconds:
951
1017
  nowEpochSeconds - DEFAULT_MAIN_SILENT_THRESHOLD_SECONDS,
1018
+ hasInProgressToolCall: false,
952
1019
  },
953
1020
  ],
954
1021
  );
@@ -984,6 +1051,7 @@ describe('NotifySilentLiveSessionsUseCase', () => {
984
1051
  sessionName: GITHUB_SESSION,
985
1052
  lastOutputEpochSeconds:
986
1053
  nowEpochSeconds - DEFAULT_MAIN_SILENT_THRESHOLD_SECONDS,
1054
+ hasInProgressToolCall: false,
987
1055
  },
988
1056
  ],
989
1057
  );
@@ -1525,11 +1593,13 @@ describe('NotifySilentLiveSessionsUseCase', () => {
1525
1593
  sessionName: GITHUB_SESSION_ALPHA,
1526
1594
  lastOutputEpochSeconds:
1527
1595
  nowEpochSeconds - DEFAULT_MAIN_SILENT_THRESHOLD_SECONDS,
1596
+ hasInProgressToolCall: false,
1528
1597
  },
1529
1598
  {
1530
1599
  sessionName: GITHUB_SESSION_BRAVO,
1531
1600
  lastOutputEpochSeconds:
1532
1601
  nowEpochSeconds - DEFAULT_MAIN_SILENT_THRESHOLD_SECONDS,
1602
+ hasInProgressToolCall: false,
1533
1603
  },
1534
1604
  ],
1535
1605
  );
@@ -25,6 +25,15 @@ export const DEFAULT_SUBAGENT_RUNNING_THRESHOLD_SECONDS = 15 * 60;
25
25
  export const DEFAULT_NOTIFICATION_STAGGER_SECONDS = 25;
26
26
  export const DEFAULT_CANDIDATE_DEBOUNCE_RECENCY_WINDOW_SECONDS = 15 * 60;
27
27
  export const DEFAULT_HUB_TASK_STATUS_CACHE_TTL_SECONDS = 5 * 60;
28
+ // Upper bound on how long an in-progress tool call suppresses the main-stall
29
+ // reminder. Set to 2 hours: comfortably above the ~1-hour maximum duration of
30
+ // the longest legitimate single tool call (the Monitor tool's own timeout
31
+ // ceiling), so every legitimate long-running tool call is still suppressed,
32
+ // while a session whose transcript tail has been an unanswered tool_use for
33
+ // longer than this — for example because the tool call itself hung and never
34
+ // returned — still receives the stall reminder instead of being suppressed
35
+ // forever.
36
+ export const IN_PROGRESS_TOOL_CALL_MAX_SUPPRESS_SECONDS = 2 * 60 * 60;
28
37
 
29
38
  const GITHUB_ISSUE_OR_PULL_URL_PATTERN =
30
39
  /^https:\/\/github\.com\/([^/]+)\/([^/]+)\/(?:issues|pull)\/(\d+)$/;
@@ -336,11 +345,16 @@ export class NotifySilentLiveSessionsUseCase {
336
345
  transcriptPathBySessionName,
337
346
  );
338
347
  const lastOutputBySessionName = new Map<string, number>();
348
+ const inProgressToolCallBySessionName = new Map<string, boolean>();
339
349
  for (const activity of activities) {
340
350
  lastOutputBySessionName.set(
341
351
  activity.sessionName,
342
352
  activity.lastOutputEpochSeconds,
343
353
  );
354
+ inProgressToolCallBySessionName.set(
355
+ activity.sessionName,
356
+ activity.hasInProgressToolCall,
357
+ );
344
358
  }
345
359
 
346
360
  const subAgentsBySessionName =
@@ -366,6 +380,8 @@ export class NotifySilentLiveSessionsUseCase {
366
380
  return {
367
381
  sessionName,
368
382
  mainSilentSeconds,
383
+ mainHasInProgressToolCall:
384
+ inProgressToolCallBySessionName.get(sessionName) ?? false,
369
385
  subAgents: subAgentsBySessionName.get(sessionName) ?? [],
370
386
  unansweredOwnerCallAgeSeconds:
371
387
  unansweredOwnerCallEpochSeconds === undefined
@@ -401,10 +417,30 @@ export class NotifySilentLiveSessionsUseCase {
401
417
  // call signature and is intentionally ignored (treated as infinite).
402
418
  const suppressedByUnansweredOwnerCall =
403
419
  unansweredOwnerCallAgeSeconds !== null;
420
+ // A session whose transcript tail is an assistant tool_use with no matching
421
+ // tool_result is legitimately busy running one long tool call (e.g. a Bash
422
+ // command near its timeout, or a Monitor waiting up to an hour): it appends
423
+ // no new assistant line while the tool runs, so mainSilentSeconds crosses
424
+ // the threshold even though the session is working, not stalled. Suppress
425
+ // the main-stall reminder in that case. Genuine thrashing silence — where
426
+ // the last assistant tool_use was already answered (or there is none) — has
427
+ // no pending tool call and is still flagged.
428
+ // The suppression is bounded by the pending tool call's own age
429
+ // (mainSilentSeconds, which for an in-progress tool call equals the age of
430
+ // the pending tool_use line) so it cannot last forever: a session stuck
431
+ // inside a tool call that never returns is reminded once that age exceeds
432
+ // IN_PROGRESS_TOOL_CALL_MAX_SUPPRESS_SECONDS, restoring the ~10-minute
433
+ // stall reminder for a truly hung session instead of suppressing it
434
+ // indefinitely.
435
+ const suppressedByInProgressToolCall =
436
+ snapshot.mainHasInProgressToolCall &&
437
+ mainSilentSeconds !== null &&
438
+ mainSilentSeconds < IN_PROGRESS_TOOL_CALL_MAX_SUPPRESS_SECONDS;
404
439
  const mainTriggered =
405
440
  mainSilentSeconds !== null &&
406
441
  mainSilentSeconds >= thresholds.mainSilentThresholdSeconds &&
407
- !suppressedByUnansweredOwnerCall;
442
+ !suppressedByUnansweredOwnerCall &&
443
+ !suppressedByInProgressToolCall;
408
444
  if (mainTriggered) {
409
445
  sections.push(
410
446
  this.messageComposer.composeMainStalledSection(mainSilentSeconds),
@@ -1,17 +1,7 @@
1
1
  import { LiveSessionOutputActivity } from '../../domain/entities/LiveSessionOutputActivity';
2
2
  import { SessionOutputActivityRepository } from '../../domain/usecases/adapter-interfaces/SessionOutputActivityRepository';
3
- /**
4
- * Reads the last main-session activity time for each live session from its
5
- * already-resolved transcript path. Idle time is computed from the timestamp of
6
- * the latest entry of any kind (assistant text, owner replies, tool results, or
7
- * any other entry type) rather than from the transcript file modification time.
8
- * Because a session that is actively running tool calls keeps appending entries
9
- * such as `user` and `tool_result` even while it emits no assistant text, every
10
- * entry with a parseable timestamp counts as activity, so a working session is
11
- * not mistaken for a silent one.
12
- */
13
3
  export declare class FileSystemSessionOutputActivityRepository implements SessionOutputActivityRepository {
14
4
  listSessionOutputActivities: (transcriptPathBySessionName: Map<string, string>) => Promise<LiveSessionOutputActivity[]>;
15
- private readLastActivityEpochSeconds;
5
+ private readTranscriptActivity;
16
6
  }
17
7
  //# sourceMappingURL=FileSystemSessionOutputActivityRepository.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"FileSystemSessionOutputActivityRepository.d.ts","sourceRoot":"","sources":["../../../src/adapter/repositories/FileSystemSessionOutputActivityRepository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,iDAAiD,CAAC;AAC5F,OAAO,EAAE,+BAA+B,EAAE,MAAM,0EAA0E,CAAC;AAqB3H;;;;;;;;;GASG;AACH,qBAAa,yCAA0C,YAAW,+BAA+B;IAC/F,2BAA2B,GACzB,6BAA6B,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,KAC/C,OAAO,CAAC,yBAAyB,EAAE,CAAC,CAUrC;IAEF,OAAO,CAAC,4BAA4B,CAoClC;CACH"}
1
+ {"version":3,"file":"FileSystemSessionOutputActivityRepository.d.ts","sourceRoot":"","sources":["../../../src/adapter/repositories/FileSystemSessionOutputActivityRepository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,iDAAiD,CAAC;AAC5F,OAAO,EAAE,+BAA+B,EAAE,MAAM,0EAA0E,CAAC;AAoC3H,qBAAa,yCAA0C,YAAW,+BAA+B;IAC/F,2BAA2B,GACzB,6BAA6B,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,KAC/C,OAAO,CAAC,yBAAyB,EAAE,CAAC,CAcrC;IAEF,OAAO,CAAC,sBAAsB,CA4D5B;CACH"}
@@ -7,6 +7,7 @@ export type SubAgentActivity = {
7
7
  export type LiveSessionActivitySnapshot = {
8
8
  sessionName: string;
9
9
  mainSilentSeconds: number | null;
10
+ mainHasInProgressToolCall: boolean;
10
11
  subAgents: SubAgentActivity[];
11
12
  unansweredOwnerCallAgeSeconds: number | null;
12
13
  };
@@ -1 +1 @@
1
- {"version":3,"file":"LiveSessionActivitySnapshot.d.ts","sourceRoot":"","sources":["../../../src/domain/entities/LiveSessionActivitySnapshot.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,wBAAwB,EAAE,OAAO,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,6BAA6B,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9C,CAAC"}
1
+ {"version":3,"file":"LiveSessionActivitySnapshot.d.ts","sourceRoot":"","sources":["../../../src/domain/entities/LiveSessionActivitySnapshot.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,wBAAwB,EAAE,OAAO,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,yBAAyB,EAAE,OAAO,CAAC;IACnC,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,6BAA6B,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9C,CAAC"}
@@ -1,5 +1,6 @@
1
1
  export type LiveSessionOutputActivity = {
2
2
  sessionName: string;
3
3
  lastOutputEpochSeconds: number;
4
+ hasInProgressToolCall: boolean;
4
5
  };
5
6
  //# sourceMappingURL=LiveSessionOutputActivity.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"LiveSessionOutputActivity.d.ts","sourceRoot":"","sources":["../../../src/domain/entities/LiveSessionOutputActivity.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,yBAAyB,GAAG;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB,EAAE,MAAM,CAAC;CAChC,CAAC"}
1
+ {"version":3,"file":"LiveSessionOutputActivity.d.ts","sourceRoot":"","sources":["../../../src/domain/entities/LiveSessionOutputActivity.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,yBAAyB,GAAG;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,qBAAqB,EAAE,OAAO,CAAC;CAChC,CAAC"}
@@ -17,6 +17,7 @@ export declare const DEFAULT_SUBAGENT_RUNNING_THRESHOLD_SECONDS: number;
17
17
  export declare const DEFAULT_NOTIFICATION_STAGGER_SECONDS = 25;
18
18
  export declare const DEFAULT_CANDIDATE_DEBOUNCE_RECENCY_WINDOW_SECONDS: number;
19
19
  export declare const DEFAULT_HUB_TASK_STATUS_CACHE_TTL_SECONDS: number;
20
+ export declare const IN_PROGRESS_TOOL_CALL_MAX_SUPPRESS_SECONDS: number;
20
21
  export declare const parseHubTaskIssueUrlFromSessionName: (sessionName: string) => string | null;
21
22
  export declare const isGitHubIssueOrPullRequestSessionName: (sessionName: string) => boolean;
22
23
  export type HubTaskStatusResolver = Pick<IssueRepository, 'getIssueByUrl'>;
@@ -1 +1 @@
1
- {"version":3,"file":"NotifySilentLiveSessionsUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/NotifySilentLiveSessionsUseCase.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"NotifySilentLiveSessionsUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/NotifySilentLiveSessionsUseCase.ts"],"names":[],"mappings":"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"}