github-issue-tower-defence-management 1.117.10 → 1.118.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 (45) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +11 -7
  3. package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js +38 -12
  4. package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js.map +1 -1
  5. package/bin/adapter/entry-points/handlers/notifySilentTmuxSessions.js +7 -2
  6. package/bin/adapter/entry-points/handlers/notifySilentTmuxSessions.js.map +1 -1
  7. package/bin/adapter/repositories/ConfigurableSilentSessionMessageComposer.js +44 -11
  8. package/bin/adapter/repositories/ConfigurableSilentSessionMessageComposer.js.map +1 -1
  9. package/bin/adapter/repositories/FileSystemSilentSessionHubTaskStatusCacheRepository.js +128 -0
  10. package/bin/adapter/repositories/FileSystemSilentSessionHubTaskStatusCacheRepository.js.map +1 -0
  11. package/bin/domain/usecases/DefaultSilentSessionMessageComposer.js +27 -7
  12. package/bin/domain/usecases/DefaultSilentSessionMessageComposer.js.map +1 -1
  13. package/bin/domain/usecases/NotifySilentLiveSessionsUseCase.js +65 -17
  14. package/bin/domain/usecases/NotifySilentLiveSessionsUseCase.js.map +1 -1
  15. package/bin/domain/usecases/adapter-interfaces/SilentSessionHubTaskStatusCacheRepository.js +3 -0
  16. package/bin/domain/usecases/adapter-interfaces/SilentSessionHubTaskStatusCacheRepository.js.map +1 -0
  17. package/package.json +1 -1
  18. package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts +29 -8
  19. package/src/adapter/entry-points/handlers/notifySilentTmuxSessions.test.ts +14 -4
  20. package/src/adapter/entry-points/handlers/notifySilentTmuxSessions.ts +13 -0
  21. package/src/adapter/repositories/ConfigurableSilentSessionMessageComposer.test.ts +81 -28
  22. package/src/adapter/repositories/ConfigurableSilentSessionMessageComposer.ts +91 -19
  23. package/src/adapter/repositories/FileSystemSilentSessionHubTaskStatusCacheRepository.test.ts +251 -0
  24. package/src/adapter/repositories/FileSystemSilentSessionHubTaskStatusCacheRepository.ts +121 -0
  25. package/src/domain/usecases/DefaultSilentSessionMessageComposer.test.ts +91 -15
  26. package/src/domain/usecases/DefaultSilentSessionMessageComposer.ts +54 -11
  27. package/src/domain/usecases/NotifySilentLiveSessionsUseCase.test.ts +252 -9
  28. package/src/domain/usecases/NotifySilentLiveSessionsUseCase.ts +111 -20
  29. package/src/domain/usecases/adapter-interfaces/SilentSessionHubTaskStatusCacheRepository.ts +20 -0
  30. package/src/domain/usecases/adapter-interfaces/SilentSessionMessageComposer.ts +9 -1
  31. package/types/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.d.ts.map +1 -1
  32. package/types/adapter/entry-points/handlers/notifySilentTmuxSessions.d.ts +3 -0
  33. package/types/adapter/entry-points/handlers/notifySilentTmuxSessions.d.ts.map +1 -1
  34. package/types/adapter/repositories/ConfigurableSilentSessionMessageComposer.d.ts +8 -4
  35. package/types/adapter/repositories/ConfigurableSilentSessionMessageComposer.d.ts.map +1 -1
  36. package/types/adapter/repositories/FileSystemSilentSessionHubTaskStatusCacheRepository.d.ts +20 -0
  37. package/types/adapter/repositories/FileSystemSilentSessionHubTaskStatusCacheRepository.d.ts.map +1 -0
  38. package/types/domain/usecases/DefaultSilentSessionMessageComposer.d.ts +2 -2
  39. package/types/domain/usecases/DefaultSilentSessionMessageComposer.d.ts.map +1 -1
  40. package/types/domain/usecases/NotifySilentLiveSessionsUseCase.d.ts +7 -1
  41. package/types/domain/usecases/NotifySilentLiveSessionsUseCase.d.ts.map +1 -1
  42. package/types/domain/usecases/adapter-interfaces/SilentSessionHubTaskStatusCacheRepository.d.ts +19 -0
  43. package/types/domain/usecases/adapter-interfaces/SilentSessionHubTaskStatusCacheRepository.d.ts.map +1 -0
  44. package/types/domain/usecases/adapter-interfaces/SilentSessionMessageComposer.d.ts +5 -1
  45. package/types/domain/usecases/adapter-interfaces/SilentSessionMessageComposer.d.ts.map +1 -1
@@ -8,6 +8,7 @@ import { SessionSubAgentActivityRepository } from './adapter-interfaces/SessionS
8
8
  import { SilentSessionMessageComposer } from './adapter-interfaces/SilentSessionMessageComposer';
9
9
  import { SilentSessionNotificationRepository } from './adapter-interfaces/SilentSessionNotificationRepository';
10
10
  import { SilentSessionCandidateStateRepository } from './adapter-interfaces/SilentSessionCandidateStateRepository';
11
+ import { SilentSessionHubTaskStatusCacheRepository } from './adapter-interfaces/SilentSessionHubTaskStatusCacheRepository';
11
12
  import { Sleeper } from './adapter-interfaces/Sleeper';
12
13
  import { IssueRepository } from './adapter-interfaces/IssueRepository';
13
14
  import { ResolveInteractiveLiveSessionsUseCase } from './ResolveInteractiveLiveSessionsUseCase';
@@ -17,6 +18,7 @@ export const DEFAULT_SUBAGENT_SILENT_THRESHOLD_SECONDS = 5 * 60;
17
18
  export const DEFAULT_SUBAGENT_RUNNING_THRESHOLD_SECONDS = 15 * 60;
18
19
  export const DEFAULT_NOTIFICATION_STAGGER_SECONDS = 25;
19
20
  export const DEFAULT_CANDIDATE_DEBOUNCE_RECENCY_WINDOW_SECONDS = 15 * 60;
21
+ export const DEFAULT_HUB_TASK_STATUS_CACHE_TTL_SECONDS = 5 * 60;
20
22
 
21
23
  const GITHUB_ISSUE_OR_PULL_URL_PATTERN =
22
24
  /^https:\/\/github\.com\/([^/]+)\/([^/]+)\/(?:issues|pull)\/(\d+)$/;
@@ -69,6 +71,7 @@ export class NotifySilentLiveSessionsUseCase {
69
71
  private readonly messageComposer: SilentSessionMessageComposer,
70
72
  private readonly sleeper: Sleeper,
71
73
  private readonly hubTaskStatusResolver: HubTaskStatusResolver | null = null,
74
+ private readonly hubTaskStatusCacheRepository: SilentSessionHubTaskStatusCacheRepository | null = null,
72
75
  ) {}
73
76
 
74
77
  run = async (params: {
@@ -78,6 +81,7 @@ export class NotifySilentLiveSessionsUseCase {
78
81
  staggerSeconds: number;
79
82
  candidateDebounceRecencyWindowSeconds: number;
80
83
  activeHubTaskStatus: string | null;
84
+ hubTaskStatusCacheTtlSeconds: number;
81
85
  now: Date;
82
86
  }): Promise<void> => {
83
87
  const snapshot =
@@ -146,6 +150,8 @@ export class NotifySilentLiveSessionsUseCase {
146
150
  !(await this.isHubTaskActive(
147
151
  candidate.sessionName,
148
152
  params.activeHubTaskStatus,
153
+ params.hubTaskStatusCacheTtlSeconds,
154
+ params.now,
149
155
  ))
150
156
  ) {
151
157
  continue;
@@ -165,6 +171,8 @@ export class NotifySilentLiveSessionsUseCase {
165
171
  private isHubTaskActive = async (
166
172
  sessionName: string,
167
173
  activeHubTaskStatus: string | null,
174
+ hubTaskStatusCacheTtlSeconds: number,
175
+ now: Date,
168
176
  ): Promise<boolean> => {
169
177
  if (activeHubTaskStatus === null || this.hubTaskStatusResolver === null) {
170
178
  return true;
@@ -173,32 +181,110 @@ export class NotifySilentLiveSessionsUseCase {
173
181
  if (hubTaskIssueUrl === null) {
174
182
  return true;
175
183
  }
176
- try {
177
- const issue =
178
- await this.hubTaskStatusResolver.getIssueByUrl(hubTaskIssueUrl);
179
- if (issue === null) {
180
- console.log(
181
- `Hub task ${hubTaskIssueUrl} for session ${sessionName} is not a resolvable tracked task; sending notification (fail-open).`,
182
- );
183
- return true;
184
- }
185
- if (issue.state !== 'OPEN' || issue.status !== activeHubTaskStatus) {
186
- console.log(
187
- `Skipping ${sessionName}: hub task ${hubTaskIssueUrl} is no longer active (state "${issue.state}", status "${issue.status ?? 'null'}", active status "${activeHubTaskStatus}").`,
184
+
185
+ const cachedEntry =
186
+ this.hubTaskStatusCacheRepository === null
187
+ ? null
188
+ : await this.hubTaskStatusCacheRepository.loadHubTaskStatus({
189
+ url: hubTaskIssueUrl,
190
+ });
191
+ const nowEpochSeconds = Math.floor(now.getTime() / 1000);
192
+ if (cachedEntry !== null) {
193
+ const cacheAgeSeconds =
194
+ nowEpochSeconds - cachedEntry.recordedEpochSeconds;
195
+ if (cacheAgeSeconds <= hubTaskStatusCacheTtlSeconds) {
196
+ const active = this.isResolvedStatusActive(
197
+ cachedEntry.state,
198
+ cachedEntry.status,
199
+ activeHubTaskStatus,
188
200
  );
189
- return false;
201
+ if (!active) {
202
+ console.log(
203
+ `Skipping ${sessionName}: hub task ${hubTaskIssueUrl} is no longer active per cached status (state "${cachedEntry.state}", status "${cachedEntry.status ?? 'null'}", active status "${activeHubTaskStatus}").`,
204
+ );
205
+ }
206
+ return active;
190
207
  }
191
- return true;
192
- } catch (error) {
208
+ }
209
+
210
+ const resolution = await this.tryResolveAndCacheHubTask(
211
+ hubTaskIssueUrl,
212
+ activeHubTaskStatus,
213
+ sessionName,
214
+ now,
215
+ );
216
+ if (resolution.resolved) {
217
+ return resolution.active;
218
+ }
219
+
220
+ if (cachedEntry !== null) {
221
+ const active = this.isResolvedStatusActive(
222
+ cachedEntry.state,
223
+ cachedEntry.status,
224
+ activeHubTaskStatus,
225
+ );
193
226
  console.warn(
194
- `Failed to resolve hub task status for session ${sessionName} (${hubTaskIssueUrl}); sending notification (fail-open): ${
195
- error instanceof Error ? error.message : String(error)
196
- }`,
227
+ `Hub task ${hubTaskIssueUrl} for session ${sessionName} could not be resolved (${resolution.reason}); falling back to expired cached status (state "${cachedEntry.state}", status "${cachedEntry.status ?? 'null'}"), so the notification is ${active ? 'sent' : 'suppressed'}.`,
197
228
  );
198
- return true;
229
+ return active;
199
230
  }
231
+
232
+ console.warn(
233
+ `Hub task ${hubTaskIssueUrl} for session ${sessionName} is not resolvable and has no cached status (${resolution.reason}); sending notification (fail-open).`,
234
+ );
235
+ return true;
200
236
  };
201
237
 
238
+ private tryResolveAndCacheHubTask = async (
239
+ hubTaskIssueUrl: string,
240
+ activeHubTaskStatus: string,
241
+ sessionName: string,
242
+ now: Date,
243
+ ): Promise<
244
+ { resolved: true; active: boolean } | { resolved: false; reason: string }
245
+ > => {
246
+ if (this.hubTaskStatusResolver === null) {
247
+ return { resolved: false, reason: 'resolver is not configured' };
248
+ }
249
+ let issue: Awaited<ReturnType<HubTaskStatusResolver['getIssueByUrl']>>;
250
+ try {
251
+ issue = await this.hubTaskStatusResolver.getIssueByUrl(hubTaskIssueUrl);
252
+ } catch (error) {
253
+ return {
254
+ resolved: false,
255
+ reason: error instanceof Error ? error.message : String(error),
256
+ };
257
+ }
258
+ if (issue === null) {
259
+ return { resolved: false, reason: 'resolver returned no tracked task' };
260
+ }
261
+ if (this.hubTaskStatusCacheRepository !== null) {
262
+ await this.hubTaskStatusCacheRepository.saveHubTaskStatus({
263
+ url: hubTaskIssueUrl,
264
+ state: issue.state,
265
+ status: issue.status,
266
+ now,
267
+ });
268
+ }
269
+ const active = this.isResolvedStatusActive(
270
+ issue.state,
271
+ issue.status,
272
+ activeHubTaskStatus,
273
+ );
274
+ if (!active) {
275
+ console.log(
276
+ `Skipping ${sessionName}: hub task ${hubTaskIssueUrl} is no longer active (state "${issue.state}", status "${issue.status ?? 'null'}", active status "${activeHubTaskStatus}").`,
277
+ );
278
+ }
279
+ return { resolved: true, active };
280
+ };
281
+
282
+ private isResolvedStatusActive = (
283
+ state: 'OPEN' | 'CLOSED' | 'MERGED',
284
+ status: string | null,
285
+ activeHubTaskStatus: string,
286
+ ): boolean => state === 'OPEN' && status === activeHubTaskStatus;
287
+
202
288
  private collectSnapshots = async (
203
289
  interactiveSessions: InteractiveLiveSession[],
204
290
  transcriptPathBySessionName: Map<string, string>,
@@ -277,7 +363,12 @@ export class NotifySilentLiveSessionsUseCase {
277
363
  );
278
364
  if (stalledSubAgents.length > 0) {
279
365
  sections.push(
280
- this.messageComposer.composeSubAgentSection(stalledSubAgents),
366
+ this.messageComposer.composeSubAgentSection(stalledSubAgents, {
367
+ subAgentSilentThresholdSeconds:
368
+ thresholds.subAgentSilentThresholdSeconds,
369
+ subAgentRunningThresholdSeconds:
370
+ thresholds.subAgentRunningThresholdSeconds,
371
+ }),
281
372
  );
282
373
  }
283
374
 
@@ -0,0 +1,20 @@
1
+ import { Issue } from '../../entities/Issue';
2
+
3
+ export type SilentSessionHubTaskStatusCacheEntry = {
4
+ url: string;
5
+ state: Issue['state'];
6
+ status: string | null;
7
+ recordedEpochSeconds: number;
8
+ };
9
+
10
+ export interface SilentSessionHubTaskStatusCacheRepository {
11
+ loadHubTaskStatus: (params: {
12
+ url: string;
13
+ }) => Promise<SilentSessionHubTaskStatusCacheEntry | null>;
14
+ saveHubTaskStatus: (params: {
15
+ url: string;
16
+ state: Issue['state'];
17
+ status: string | null;
18
+ now: Date;
19
+ }) => Promise<void>;
20
+ }
@@ -1,6 +1,14 @@
1
1
  import { SubAgentActivity } from '../../entities/LiveSessionActivitySnapshot';
2
2
 
3
+ export type SubAgentStallThresholds = {
4
+ subAgentSilentThresholdSeconds: number;
5
+ subAgentRunningThresholdSeconds: number;
6
+ };
7
+
3
8
  export interface SilentSessionMessageComposer {
4
9
  composeMainStalledSection: (mainSilentSeconds: number) => string;
5
- composeSubAgentSection: (subAgents: SubAgentActivity[]) => string;
10
+ composeSubAgentSection: (
11
+ subAgents: SubAgentActivity[],
12
+ thresholds: SubAgentStallThresholds,
13
+ ) => string;
6
14
  }
@@ -1 +1 @@
1
- {"version":3,"file":"HandleScheduledEventUseCaseHandler.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts"],"names":[],"mappings":"AAkCA,OAAO,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAiD3D,qBAAa,kCAAkC;IAC7C,MAAM,GACJ,gBAAgB,MAAM,EACtB,UAAU,OAAO,KAChB,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,CA8iBP;CACH"}
1
+ {"version":3,"file":"HandleScheduledEventUseCaseHandler.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts"],"names":[],"mappings":"AAkCA,OAAO,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAiD3D,qBAAa,kCAAkC;IAC7C,MAAM,GACJ,gBAAgB,MAAM,EACtB,UAAU,OAAO,KAChB,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,CAmkBP;CACH"}
@@ -18,6 +18,8 @@ export type NotifySilentTmuxSessionsParams = {
18
18
  candidateDebounceStateFilePath: string | null;
19
19
  activeHubTaskStatus: string | null;
20
20
  hubTaskStatusResolver: HubTaskStatusResolver | null;
21
+ hubTaskStatusCacheStateFilePath: string | null;
22
+ hubTaskStatusCacheTtlSeconds: number;
21
23
  messageTemplates: SilentSessionMessageTemplates;
22
24
  now: Date;
23
25
  };
@@ -28,5 +30,6 @@ export declare const DEFAULT_NOTIFY_SILENT_TMUX_SESSIONS_PARAMS: {
28
30
  readonly subAgentRunningThresholdSeconds: number;
29
31
  readonly staggerSeconds: 25;
30
32
  readonly candidateDebounceRecencyWindowSeconds: number;
33
+ readonly hubTaskStatusCacheTtlSeconds: number;
31
34
  };
32
35
  //# sourceMappingURL=notifySilentTmuxSessions.d.ts.map
@@ -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,EAMtB,MAAM,0DAA0D,CAAC;AAclE,OAAO,EAEL,6BAA6B,EAC9B,MAAM,6DAA6D,CAAC;AAIrE,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,2BAA2B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,2BAA2B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,+BAA+B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/C,0BAA0B,EAAE,MAAM,CAAC;IACnC,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,gBAAgB,EAAE,6BAA6B,CAAC;IAChD,GAAG,EAAE,IAAI,CAAC;CACX,CAAC;AAoCF,eAAO,MAAM,wBAAwB,GACnC,QAAQ,8BAA8B,KACrC,OAAO,CAAC,IAAI,CAgEd,CAAC;AAEF,eAAO,MAAM,0CAA0C;;;;;;CAO7C,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;AAGpG,OAAO,EAAE,oBAAoB,EAAE,MAAM,kEAAkE,CAAC;AACxG,OAAO,EAEL,qBAAqB,EAOtB,MAAM,0DAA0D,CAAC;AAclE,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,2BAA2B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,2BAA2B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,+BAA+B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/C,0BAA0B,EAAE,MAAM,CAAC;IACnC,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,GAAG,EAAE,IAAI,CAAC;CACX,CAAC;AAoCF,eAAO,MAAM,wBAAwB,GACnC,QAAQ,8BAA8B,KACrC,OAAO,CAAC,IAAI,CAwEd,CAAC;AAEF,eAAO,MAAM,0CAA0C;;;;;;;CAQ7C,CAAC"}
@@ -1,15 +1,19 @@
1
1
  import { SubAgentActivity } from '../../domain/entities/LiveSessionActivitySnapshot';
2
- import { SilentSessionMessageComposer } from '../../domain/usecases/adapter-interfaces/SilentSessionMessageComposer';
2
+ import { SilentSessionMessageComposer, SubAgentStallThresholds } from '../../domain/usecases/adapter-interfaces/SilentSessionMessageComposer';
3
3
  export type SilentSessionMessageTemplates = {
4
4
  mainStalledMessage: string | null;
5
- subAgentMessageHeader: string | null;
6
- subAgentMessageFooter: string | null;
5
+ subAgentIdleMessageHeader: string | null;
6
+ subAgentIdleMessageFooter: string | null;
7
+ subAgentLongRunningMessageHeader: string | null;
8
+ subAgentLongRunningMessageFooter: string | null;
7
9
  };
8
10
  export declare class ConfigurableSilentSessionMessageComposer implements SilentSessionMessageComposer {
9
11
  private readonly templates;
10
12
  private readonly fallback;
11
13
  constructor(templates: SilentSessionMessageTemplates, fallback: SilentSessionMessageComposer);
12
14
  composeMainStalledSection: (mainSilentSeconds: number) => string;
13
- composeSubAgentSection: (subAgents: SubAgentActivity[]) => string;
15
+ composeSubAgentSection: (subAgents: SubAgentActivity[], thresholds: SubAgentStallThresholds) => string;
16
+ private composeIdleSection;
17
+ private composeLongRunningSection;
14
18
  }
15
19
  //# sourceMappingURL=ConfigurableSilentSessionMessageComposer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ConfigurableSilentSessionMessageComposer.d.ts","sourceRoot":"","sources":["../../../src/adapter/repositories/ConfigurableSilentSessionMessageComposer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mDAAmD,CAAC;AACrF,OAAO,EAAE,4BAA4B,EAAE,MAAM,uEAAuE,CAAC;AAQrH,MAAM,MAAM,6BAA6B,GAAG;IAC1C,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC,CAAC;AAOF,qBAAa,wCAAyC,YAAW,4BAA4B;IAEzF,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBADR,SAAS,EAAE,6BAA6B,EACxC,QAAQ,EAAE,4BAA4B;IAGzD,yBAAyB,GAAI,mBAAmB,MAAM,KAAG,MAAM,CAK7D;IAEF,sBAAsB,GAAI,WAAW,gBAAgB,EAAE,KAAG,MAAM,CAsB9D;CACH"}
1
+ {"version":3,"file":"ConfigurableSilentSessionMessageComposer.d.ts","sourceRoot":"","sources":["../../../src/adapter/repositories/ConfigurableSilentSessionMessageComposer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mDAAmD,CAAC;AACrF,OAAO,EACL,4BAA4B,EAC5B,uBAAuB,EACxB,MAAM,uEAAuE,CAAC;AAQ/E,MAAM,MAAM,6BAA6B,GAAG;IAC1C,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,yBAAyB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,yBAAyB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,gCAAgC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChD,gCAAgC,EAAE,MAAM,GAAG,IAAI,CAAC;CACjD,CAAC;AAOF,qBAAa,wCAAyC,YAAW,4BAA4B;IAEzF,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBADR,SAAS,EAAE,6BAA6B,EACxC,QAAQ,EAAE,4BAA4B;IAGzD,yBAAyB,GAAI,mBAAmB,MAAM,KAAG,MAAM,CAK7D;IAEF,sBAAsB,GACpB,WAAW,gBAAgB,EAAE,EAC7B,YAAY,uBAAuB,KAClC,MAAM,CA8CP;IAEF,OAAO,CAAC,kBAAkB,CAkBxB;IAEF,OAAO,CAAC,yBAAyB,CAkB/B;CACH"}
@@ -0,0 +1,20 @@
1
+ import { Issue } from '../../domain/entities/Issue';
2
+ import { SilentSessionHubTaskStatusCacheEntry, SilentSessionHubTaskStatusCacheRepository } from '../../domain/usecases/adapter-interfaces/SilentSessionHubTaskStatusCacheRepository';
3
+ export declare const DEFAULT_HUB_TASK_STATUS_RETENTION_WINDOW_SECONDS: number;
4
+ export declare class FileSystemSilentSessionHubTaskStatusCacheRepository implements SilentSessionHubTaskStatusCacheRepository {
5
+ private readonly stateFilePath;
6
+ private readonly retentionWindowSeconds;
7
+ constructor(stateFilePath?: string, retentionWindowSeconds?: number);
8
+ loadHubTaskStatus: (params: {
9
+ url: string;
10
+ }) => Promise<SilentSessionHubTaskStatusCacheEntry | null>;
11
+ saveHubTaskStatus: (params: {
12
+ url: string;
13
+ state: Issue["state"];
14
+ status: string | null;
15
+ now: Date;
16
+ }) => Promise<void>;
17
+ private readEntries;
18
+ private writeEntries;
19
+ }
20
+ //# sourceMappingURL=FileSystemSilentSessionHubTaskStatusCacheRepository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileSystemSilentSessionHubTaskStatusCacheRepository.d.ts","sourceRoot":"","sources":["../../../src/adapter/repositories/FileSystemSilentSessionHubTaskStatusCacheRepository.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACpD,OAAO,EACL,oCAAoC,EACpC,yCAAyC,EAC1C,MAAM,oFAAoF,CAAC;AAQ5F,eAAO,MAAM,gDAAgD,QAAU,CAAC;AAOxE,qBAAa,mDAAoD,YAAW,yCAAyC;IAEjH,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,sBAAsB;gBADtB,aAAa,GAAE,MAA+B,EAC9C,sBAAsB,GAAE,MAAyD;IAGpG,iBAAiB,GAAU,QAAQ;QACjC,GAAG,EAAE,MAAM,CAAC;KACb,KAAG,OAAO,CAAC,oCAAoC,GAAG,IAAI,CAAC,CAOtD;IAEF,iBAAiB,GAAU,QAAQ;QACjC,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,GAAG,EAAE,IAAI,CAAC;KACX,KAAG,OAAO,CAAC,IAAI,CAAC,CAoBf;IAEF,OAAO,CAAC,WAAW,CAwCjB;IAEF,OAAO,CAAC,YAAY,CAWlB;CACH"}
@@ -1,9 +1,9 @@
1
1
  import { SubAgentActivity } from '../entities/LiveSessionActivitySnapshot';
2
- import { SilentSessionMessageComposer } from './adapter-interfaces/SilentSessionMessageComposer';
2
+ import { SilentSessionMessageComposer, SubAgentStallThresholds } from './adapter-interfaces/SilentSessionMessageComposer';
3
3
  export declare class DefaultSilentSessionMessageComposer implements SilentSessionMessageComposer {
4
4
  private readonly ownerCallMarker;
5
5
  constructor(ownerCallMarker?: string | null);
6
6
  composeMainStalledSection: (mainSilentSeconds: number) => string;
7
- composeSubAgentSection: (subAgents: SubAgentActivity[]) => string;
7
+ composeSubAgentSection: (subAgents: SubAgentActivity[], thresholds: SubAgentStallThresholds) => string;
8
8
  }
9
9
  //# sourceMappingURL=DefaultSilentSessionMessageComposer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DefaultSilentSessionMessageComposer.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/DefaultSilentSessionMessageComposer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAC3E,OAAO,EAAE,4BAA4B,EAAE,MAAM,mDAAmD,CAAC;AAiCjG,qBAAa,mCAAoC,YAAW,4BAA4B;IAC1E,OAAO,CAAC,QAAQ,CAAC,eAAe;gBAAf,eAAe,GAAE,MAAM,GAAG,IAAW;IAElE,yBAAyB,GAAI,mBAAmB,MAAM,KAAG,MAAM,CAE7D;IAEF,sBAAsB,GAAI,WAAW,gBAAgB,EAAE,KAAG,MAAM,CAY9D;CACH"}
1
+ {"version":3,"file":"DefaultSilentSessionMessageComposer.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/DefaultSilentSessionMessageComposer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAC3E,OAAO,EACL,4BAA4B,EAC5B,uBAAuB,EACxB,MAAM,mDAAmD,CAAC;AAiE3D,qBAAa,mCAAoC,YAAW,4BAA4B;IAC1E,OAAO,CAAC,QAAQ,CAAC,eAAe;gBAAf,eAAe,GAAE,MAAM,GAAG,IAAW;IAElE,yBAAyB,GAAI,mBAAmB,MAAM,KAAG,MAAM,CAE7D;IAEF,sBAAsB,GACpB,WAAW,gBAAgB,EAAE,EAC7B,YAAY,uBAAuB,KAClC,MAAM,CAiBP;CACH"}
@@ -6,6 +6,7 @@ import { SessionSubAgentActivityRepository } from './adapter-interfaces/SessionS
6
6
  import { SilentSessionMessageComposer } from './adapter-interfaces/SilentSessionMessageComposer';
7
7
  import { SilentSessionNotificationRepository } from './adapter-interfaces/SilentSessionNotificationRepository';
8
8
  import { SilentSessionCandidateStateRepository } from './adapter-interfaces/SilentSessionCandidateStateRepository';
9
+ import { SilentSessionHubTaskStatusCacheRepository } from './adapter-interfaces/SilentSessionHubTaskStatusCacheRepository';
9
10
  import { Sleeper } from './adapter-interfaces/Sleeper';
10
11
  import { IssueRepository } from './adapter-interfaces/IssueRepository';
11
12
  export declare const DEFAULT_MAIN_SILENT_THRESHOLD_SECONDS: number;
@@ -13,6 +14,7 @@ export declare const DEFAULT_SUBAGENT_SILENT_THRESHOLD_SECONDS: number;
13
14
  export declare const DEFAULT_SUBAGENT_RUNNING_THRESHOLD_SECONDS: number;
14
15
  export declare const DEFAULT_NOTIFICATION_STAGGER_SECONDS = 25;
15
16
  export declare const DEFAULT_CANDIDATE_DEBOUNCE_RECENCY_WINDOW_SECONDS: number;
17
+ export declare const DEFAULT_HUB_TASK_STATUS_CACHE_TTL_SECONDS: number;
16
18
  export declare const parseHubTaskIssueUrlFromSessionName: (sessionName: string) => string | null;
17
19
  export declare const isGitHubIssueOrPullRequestSessionName: (sessionName: string) => boolean;
18
20
  export type HubTaskStatusResolver = Pick<IssueRepository, 'getIssueByUrl'>;
@@ -27,8 +29,9 @@ export declare class NotifySilentLiveSessionsUseCase {
27
29
  private readonly messageComposer;
28
30
  private readonly sleeper;
29
31
  private readonly hubTaskStatusResolver;
32
+ private readonly hubTaskStatusCacheRepository;
30
33
  private readonly resolveInteractiveLiveSessions;
31
- constructor(liveSessionProcessSnapshotProvider: LiveSessionProcessSnapshotProvider, interactiveLiveSessionTranscriptResolver: InteractiveLiveSessionTranscriptResolver, sessionOutputActivityRepository: SessionOutputActivityRepository, subAgentActivityRepository: SessionSubAgentActivityRepository, ownerCallStatusProvider: OwnerCallStatusProvider, notificationRepository: SilentSessionNotificationRepository, candidateStateRepository: SilentSessionCandidateStateRepository, messageComposer: SilentSessionMessageComposer, sleeper: Sleeper, hubTaskStatusResolver?: HubTaskStatusResolver | null);
34
+ constructor(liveSessionProcessSnapshotProvider: LiveSessionProcessSnapshotProvider, interactiveLiveSessionTranscriptResolver: InteractiveLiveSessionTranscriptResolver, sessionOutputActivityRepository: SessionOutputActivityRepository, subAgentActivityRepository: SessionSubAgentActivityRepository, ownerCallStatusProvider: OwnerCallStatusProvider, notificationRepository: SilentSessionNotificationRepository, candidateStateRepository: SilentSessionCandidateStateRepository, messageComposer: SilentSessionMessageComposer, sleeper: Sleeper, hubTaskStatusResolver?: HubTaskStatusResolver | null, hubTaskStatusCacheRepository?: SilentSessionHubTaskStatusCacheRepository | null);
32
35
  run: (params: {
33
36
  mainSilentThresholdSeconds: number;
34
37
  subAgentSilentThresholdSeconds: number;
@@ -36,9 +39,12 @@ export declare class NotifySilentLiveSessionsUseCase {
36
39
  staggerSeconds: number;
37
40
  candidateDebounceRecencyWindowSeconds: number;
38
41
  activeHubTaskStatus: string | null;
42
+ hubTaskStatusCacheTtlSeconds: number;
39
43
  now: Date;
40
44
  }) => Promise<void>;
41
45
  private isHubTaskActive;
46
+ private tryResolveAndCacheHubTask;
47
+ private isResolvedStatusActive;
42
48
  private collectSnapshots;
43
49
  private composeMessage;
44
50
  }
@@ -1 +1 @@
1
- {"version":3,"file":"NotifySilentLiveSessionsUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/NotifySilentLiveSessionsUseCase.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kCAAkC,EAAE,MAAM,yDAAyD,CAAC;AAC7G,OAAO,EAAE,wCAAwC,EAAE,MAAM,+DAA+D,CAAC;AACzH,OAAO,EAAE,uBAAuB,EAAE,MAAM,8CAA8C,CAAC;AACvF,OAAO,EAAE,+BAA+B,EAAE,MAAM,sDAAsD,CAAC;AACvG,OAAO,EAAE,iCAAiC,EAAE,MAAM,wDAAwD,CAAC;AAC3G,OAAO,EAAE,4BAA4B,EAAE,MAAM,mDAAmD,CAAC;AACjG,OAAO,EAAE,mCAAmC,EAAE,MAAM,0DAA0D,CAAC;AAC/G,OAAO,EAAE,qCAAqC,EAAE,MAAM,4DAA4D,CAAC;AACnH,OAAO,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAGvE,eAAO,MAAM,qCAAqC,QAAU,CAAC;AAC7D,eAAO,MAAM,yCAAyC,QAAS,CAAC;AAChE,eAAO,MAAM,0CAA0C,QAAU,CAAC;AAClE,eAAO,MAAM,oCAAoC,KAAK,CAAC;AACvD,eAAO,MAAM,iDAAiD,QAAU,CAAC;AAQzE,eAAO,MAAM,mCAAmC,GAC9C,aAAa,MAAM,KAClB,MAAM,GAAG,IAWX,CAAC;AAKF,eAAO,MAAM,qCAAqC,GAChD,aAAa,MAAM,KAClB,OACkE,CAAC;AAEtE,MAAM,MAAM,qBAAqB,GAAG,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;AAO3E,qBAAa,+BAA+B;IAKxC,OAAO,CAAC,QAAQ,CAAC,kCAAkC;IACnD,OAAO,CAAC,QAAQ,CAAC,wCAAwC;IACzD,OAAO,CAAC,QAAQ,CAAC,+BAA+B;IAChD,OAAO,CAAC,QAAQ,CAAC,0BAA0B;IAC3C,OAAO,CAAC,QAAQ,CAAC,uBAAuB;IACxC,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IACvC,OAAO,CAAC,QAAQ,CAAC,wBAAwB;IACzC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IAbxC,OAAO,CAAC,QAAQ,CAAC,8BAA8B,CACD;gBAG3B,kCAAkC,EAAE,kCAAkC,EACtE,wCAAwC,EAAE,wCAAwC,EAClF,+BAA+B,EAAE,+BAA+B,EAChE,0BAA0B,EAAE,iCAAiC,EAC7D,uBAAuB,EAAE,uBAAuB,EAChD,sBAAsB,EAAE,mCAAmC,EAC3D,wBAAwB,EAAE,qCAAqC,EAC/D,eAAe,EAAE,4BAA4B,EAC7C,OAAO,EAAE,OAAO,EAChB,qBAAqB,GAAE,qBAAqB,GAAG,IAAW;IAG7E,GAAG,GAAU,QAAQ;QACnB,0BAA0B,EAAE,MAAM,CAAC;QACnC,8BAA8B,EAAE,MAAM,CAAC;QACvC,+BAA+B,EAAE,MAAM,CAAC;QACxC,cAAc,EAAE,MAAM,CAAC;QACvB,qCAAqC,EAAE,MAAM,CAAC;QAC9C,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;QACnC,GAAG,EAAE,IAAI,CAAC;KACX,KAAG,OAAO,CAAC,IAAI,CAAC,CAiFf;IAEF,OAAO,CAAC,eAAe,CAmCrB;IAEF,OAAO,CAAC,gBAAgB,CA+CtB;IAEF,OAAO,CAAC,cAAc,CAqCpB;CACH"}
1
+ {"version":3,"file":"NotifySilentLiveSessionsUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/NotifySilentLiveSessionsUseCase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { Issue } from '../../entities/Issue';
2
+ export type SilentSessionHubTaskStatusCacheEntry = {
3
+ url: string;
4
+ state: Issue['state'];
5
+ status: string | null;
6
+ recordedEpochSeconds: number;
7
+ };
8
+ export interface SilentSessionHubTaskStatusCacheRepository {
9
+ loadHubTaskStatus: (params: {
10
+ url: string;
11
+ }) => Promise<SilentSessionHubTaskStatusCacheEntry | null>;
12
+ saveHubTaskStatus: (params: {
13
+ url: string;
14
+ state: Issue['state'];
15
+ status: string | null;
16
+ now: Date;
17
+ }) => Promise<void>;
18
+ }
19
+ //# sourceMappingURL=SilentSessionHubTaskStatusCacheRepository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SilentSessionHubTaskStatusCacheRepository.d.ts","sourceRoot":"","sources":["../../../../src/domain/usecases/adapter-interfaces/SilentSessionHubTaskStatusCacheRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE7C,MAAM,MAAM,oCAAoC,GAAG;IACjD,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,oBAAoB,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,MAAM,WAAW,yCAAyC;IACxD,iBAAiB,EAAE,CAAC,MAAM,EAAE;QAC1B,GAAG,EAAE,MAAM,CAAC;KACb,KAAK,OAAO,CAAC,oCAAoC,GAAG,IAAI,CAAC,CAAC;IAC3D,iBAAiB,EAAE,CAAC,MAAM,EAAE;QAC1B,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,GAAG,EAAE,IAAI,CAAC;KACX,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACrB"}
@@ -1,6 +1,10 @@
1
1
  import { SubAgentActivity } from '../../entities/LiveSessionActivitySnapshot';
2
+ export type SubAgentStallThresholds = {
3
+ subAgentSilentThresholdSeconds: number;
4
+ subAgentRunningThresholdSeconds: number;
5
+ };
2
6
  export interface SilentSessionMessageComposer {
3
7
  composeMainStalledSection: (mainSilentSeconds: number) => string;
4
- composeSubAgentSection: (subAgents: SubAgentActivity[]) => string;
8
+ composeSubAgentSection: (subAgents: SubAgentActivity[], thresholds: SubAgentStallThresholds) => string;
5
9
  }
6
10
  //# sourceMappingURL=SilentSessionMessageComposer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SilentSessionMessageComposer.d.ts","sourceRoot":"","sources":["../../../../src/domain/usecases/adapter-interfaces/SilentSessionMessageComposer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4CAA4C,CAAC;AAE9E,MAAM,WAAW,4BAA4B;IAC3C,yBAAyB,EAAE,CAAC,iBAAiB,EAAE,MAAM,KAAK,MAAM,CAAC;IACjE,sBAAsB,EAAE,CAAC,SAAS,EAAE,gBAAgB,EAAE,KAAK,MAAM,CAAC;CACnE"}
1
+ {"version":3,"file":"SilentSessionMessageComposer.d.ts","sourceRoot":"","sources":["../../../../src/domain/usecases/adapter-interfaces/SilentSessionMessageComposer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4CAA4C,CAAC;AAE9E,MAAM,MAAM,uBAAuB,GAAG;IACpC,8BAA8B,EAAE,MAAM,CAAC;IACvC,+BAA+B,EAAE,MAAM,CAAC;CACzC,CAAC;AAEF,MAAM,WAAW,4BAA4B;IAC3C,yBAAyB,EAAE,CAAC,iBAAiB,EAAE,MAAM,KAAK,MAAM,CAAC;IACjE,sBAAsB,EAAE,CACtB,SAAS,EAAE,gBAAgB,EAAE,EAC7B,UAAU,EAAE,uBAAuB,KAChC,MAAM,CAAC;CACb"}