github-issue-tower-defence-management 1.110.1 → 1.111.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +8 -7
  3. package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js +9 -21
  4. package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js.map +1 -1
  5. package/bin/adapter/entry-points/handlers/notifySilentTmuxSessions.js +10 -15
  6. package/bin/adapter/entry-points/handlers/notifySilentTmuxSessions.js.map +1 -1
  7. package/bin/adapter/repositories/FileSystemInteractiveLiveSessionTranscriptResolver.js +104 -0
  8. package/bin/adapter/repositories/FileSystemInteractiveLiveSessionTranscriptResolver.js.map +1 -0
  9. package/bin/adapter/repositories/FileSystemSessionOutputActivityRepository.js +55 -19
  10. package/bin/adapter/repositories/FileSystemSessionOutputActivityRepository.js.map +1 -1
  11. package/bin/adapter/repositories/LocalProcessLiveSessionProcessSnapshotProvider.js +75 -0
  12. package/bin/adapter/repositories/LocalProcessLiveSessionProcessSnapshotProvider.js.map +1 -0
  13. package/bin/adapter/repositories/NoUnansweredOwnerCallStatusProvider.js +1 -1
  14. package/bin/adapter/repositories/NoUnansweredOwnerCallStatusProvider.js.map +1 -1
  15. package/bin/adapter/repositories/ProcFsProcessEnvironReader.js +73 -0
  16. package/bin/adapter/repositories/ProcFsProcessEnvironReader.js.map +1 -0
  17. package/bin/adapter/repositories/TranscriptOwnerCallStatusProvider.js +8 -16
  18. package/bin/adapter/repositories/TranscriptOwnerCallStatusProvider.js.map +1 -1
  19. package/bin/domain/entities/InteractiveLiveSession.js +3 -0
  20. package/bin/domain/entities/InteractiveLiveSession.js.map +1 -0
  21. package/bin/domain/entities/LiveSessionProcessSnapshot.js +3 -0
  22. package/bin/domain/entities/LiveSessionProcessSnapshot.js.map +1 -0
  23. package/bin/domain/usecases/NotifySilentLiveSessionsUseCase.js +20 -33
  24. package/bin/domain/usecases/NotifySilentLiveSessionsUseCase.js.map +1 -1
  25. package/bin/domain/usecases/ResolveInteractiveLiveSessionsUseCase.js +89 -0
  26. package/bin/domain/usecases/ResolveInteractiveLiveSessionsUseCase.js.map +1 -0
  27. package/bin/domain/usecases/adapter-interfaces/InteractiveLiveSessionTranscriptResolver.js +3 -0
  28. package/bin/domain/usecases/adapter-interfaces/InteractiveLiveSessionTranscriptResolver.js.map +1 -0
  29. package/bin/domain/usecases/adapter-interfaces/LiveSessionProcessSnapshotProvider.js +3 -0
  30. package/bin/domain/usecases/adapter-interfaces/LiveSessionProcessSnapshotProvider.js.map +1 -0
  31. package/bin/domain/usecases/adapter-interfaces/ProcessEnvironReader.js +3 -0
  32. package/bin/domain/usecases/adapter-interfaces/ProcessEnvironReader.js.map +1 -0
  33. package/package.json +1 -1
  34. package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts +5 -15
  35. package/src/adapter/entry-points/handlers/notifySilentTmuxSessions.test.ts +96 -204
  36. package/src/adapter/entry-points/handlers/notifySilentTmuxSessions.ts +19 -40
  37. package/src/adapter/repositories/FileSystemInteractiveLiveSessionTranscriptResolver.test.ts +147 -0
  38. package/src/adapter/repositories/FileSystemInteractiveLiveSessionTranscriptResolver.ts +75 -0
  39. package/src/adapter/repositories/FileSystemSessionOutputActivityRepository.test.ts +82 -44
  40. package/src/adapter/repositories/FileSystemSessionOutputActivityRepository.ts +62 -24
  41. package/src/adapter/repositories/LocalProcessLiveSessionProcessSnapshotProvider.test.ts +138 -0
  42. package/src/adapter/repositories/LocalProcessLiveSessionProcessSnapshotProvider.ts +93 -0
  43. package/src/adapter/repositories/NoUnansweredOwnerCallStatusProvider.test.ts +6 -4
  44. package/src/adapter/repositories/NoUnansweredOwnerCallStatusProvider.ts +1 -1
  45. package/src/adapter/repositories/ProcFsProcessEnvironReader.test.ts +60 -0
  46. package/src/adapter/repositories/ProcFsProcessEnvironReader.ts +38 -0
  47. package/src/adapter/repositories/TranscriptOwnerCallStatusProvider.test.ts +61 -81
  48. package/src/adapter/repositories/TranscriptOwnerCallStatusProvider.ts +8 -25
  49. package/src/domain/entities/InteractiveLiveSession.ts +5 -0
  50. package/src/domain/entities/LiveSessionProcessSnapshot.ts +17 -0
  51. package/src/domain/usecases/NotifySilentLiveSessionsUseCase.test.ts +125 -349
  52. package/src/domain/usecases/NotifySilentLiveSessionsUseCase.ts +33 -55
  53. package/src/domain/usecases/ResolveInteractiveLiveSessionsUseCase.test.ts +220 -0
  54. package/src/domain/usecases/ResolveInteractiveLiveSessionsUseCase.ts +105 -0
  55. package/src/domain/usecases/adapter-interfaces/InteractiveLiveSessionTranscriptResolver.ts +7 -0
  56. package/src/domain/usecases/adapter-interfaces/LiveSessionProcessSnapshotProvider.ts +5 -0
  57. package/src/domain/usecases/adapter-interfaces/OwnerCallStatusProvider.ts +1 -1
  58. package/src/domain/usecases/adapter-interfaces/ProcessEnvironReader.ts +3 -0
  59. package/src/domain/usecases/adapter-interfaces/SessionOutputActivityRepository.ts +1 -1
  60. package/types/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.d.ts.map +1 -1
  61. package/types/adapter/entry-points/handlers/notifySilentTmuxSessions.d.ts +3 -7
  62. package/types/adapter/entry-points/handlers/notifySilentTmuxSessions.d.ts.map +1 -1
  63. package/types/adapter/repositories/FileSystemInteractiveLiveSessionTranscriptResolver.d.ts +18 -0
  64. package/types/adapter/repositories/FileSystemInteractiveLiveSessionTranscriptResolver.d.ts.map +1 -0
  65. package/types/adapter/repositories/FileSystemSessionOutputActivityRepository.d.ts +9 -5
  66. package/types/adapter/repositories/FileSystemSessionOutputActivityRepository.d.ts.map +1 -1
  67. package/types/adapter/repositories/LocalProcessLiveSessionProcessSnapshotProvider.d.ts +21 -0
  68. package/types/adapter/repositories/LocalProcessLiveSessionProcessSnapshotProvider.d.ts.map +1 -0
  69. package/types/adapter/repositories/NoUnansweredOwnerCallStatusProvider.d.ts +1 -1
  70. package/types/adapter/repositories/NoUnansweredOwnerCallStatusProvider.d.ts.map +1 -1
  71. package/types/adapter/repositories/ProcFsProcessEnvironReader.d.ts +12 -0
  72. package/types/adapter/repositories/ProcFsProcessEnvironReader.d.ts.map +1 -0
  73. package/types/adapter/repositories/TranscriptOwnerCallStatusProvider.d.ts +2 -4
  74. package/types/adapter/repositories/TranscriptOwnerCallStatusProvider.d.ts.map +1 -1
  75. package/types/domain/entities/InteractiveLiveSession.d.ts +6 -0
  76. package/types/domain/entities/InteractiveLiveSession.d.ts.map +1 -0
  77. package/types/domain/entities/LiveSessionProcessSnapshot.d.ts +16 -0
  78. package/types/domain/entities/LiveSessionProcessSnapshot.d.ts.map +1 -0
  79. package/types/domain/usecases/NotifySilentLiveSessionsUseCase.d.ts +6 -11
  80. package/types/domain/usecases/NotifySilentLiveSessionsUseCase.d.ts.map +1 -1
  81. package/types/domain/usecases/ResolveInteractiveLiveSessionsUseCase.d.ts +23 -0
  82. package/types/domain/usecases/ResolveInteractiveLiveSessionsUseCase.d.ts.map +1 -0
  83. package/types/domain/usecases/adapter-interfaces/InteractiveLiveSessionTranscriptResolver.d.ts +5 -0
  84. package/types/domain/usecases/adapter-interfaces/InteractiveLiveSessionTranscriptResolver.d.ts.map +1 -0
  85. package/types/domain/usecases/adapter-interfaces/LiveSessionProcessSnapshotProvider.d.ts +5 -0
  86. package/types/domain/usecases/adapter-interfaces/LiveSessionProcessSnapshotProvider.d.ts.map +1 -0
  87. package/types/domain/usecases/adapter-interfaces/OwnerCallStatusProvider.d.ts +1 -1
  88. package/types/domain/usecases/adapter-interfaces/OwnerCallStatusProvider.d.ts.map +1 -1
  89. package/types/domain/usecases/adapter-interfaces/ProcessEnvironReader.d.ts +4 -0
  90. package/types/domain/usecases/adapter-interfaces/ProcessEnvironReader.d.ts.map +1 -0
  91. package/types/domain/usecases/adapter-interfaces/SessionOutputActivityRepository.d.ts +1 -1
  92. package/types/domain/usecases/adapter-interfaces/SessionOutputActivityRepository.d.ts.map +1 -1
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LocalProcessLiveSessionProcessSnapshotProvider = void 0;
4
+ const SESSION_ID_ENV_KEY = 'CLAUDE_CODE_SESSION_ID';
5
+ const CONFIG_DIR_ENV_KEY = 'CLAUDE_CONFIG_DIR';
6
+ /**
7
+ * Builds a live-session process snapshot from the local host: it lists the live
8
+ * tmux sessions and each session's pane process ids, lists the full process
9
+ * tree with command lines, and reads each process environment to expose the
10
+ * Claude Code session id and config directory. The snapshot is consumed by a
11
+ * pure resolver, so all host access is contained in this adapter.
12
+ */
13
+ class LocalProcessLiveSessionProcessSnapshotProvider {
14
+ constructor(localCommandRunner, environReader) {
15
+ this.localCommandRunner = localCommandRunner;
16
+ this.environReader = environReader;
17
+ this.getSnapshot = async () => {
18
+ const sessionNames = await this.listSessionNames();
19
+ const sessions = [];
20
+ for (const sessionName of sessionNames) {
21
+ const panePids = await this.listPanePids(sessionName);
22
+ sessions.push({ sessionName, panePids });
23
+ }
24
+ const processes = await this.listProcesses();
25
+ return { sessions, processes };
26
+ };
27
+ this.listSessionNames = async () => {
28
+ const { stdout, exitCode } = await this.localCommandRunner.runCommand('tmux', ['list-sessions', '-F', '#{session_name}']);
29
+ if (exitCode !== 0) {
30
+ return [];
31
+ }
32
+ return stdout
33
+ .split('\n')
34
+ .map((line) => line.trim())
35
+ .filter((line) => line.length > 0);
36
+ };
37
+ this.listPanePids = async (sessionName) => {
38
+ const { stdout, exitCode } = await this.localCommandRunner.runCommand('tmux', ['list-panes', '-t', sessionName, '-F', '#{pane_pid}']);
39
+ if (exitCode !== 0) {
40
+ return [];
41
+ }
42
+ return stdout
43
+ .split('\n')
44
+ .map((line) => Number(line.trim()))
45
+ .filter((pid) => Number.isInteger(pid) && pid > 0);
46
+ };
47
+ this.listProcesses = async () => {
48
+ const { stdout, exitCode } = await this.localCommandRunner.runCommand('ps', ['-eo', 'pid=,ppid=,args=']);
49
+ if (exitCode !== 0) {
50
+ return [];
51
+ }
52
+ const processes = [];
53
+ for (const line of stdout.split('\n')) {
54
+ const match = line.match(/^\s*(\d+)\s+(\d+)\s+(.*)$/);
55
+ if (match === null) {
56
+ continue;
57
+ }
58
+ const pid = Number(match[1]);
59
+ const ppid = Number(match[2]);
60
+ const commandLine = match[3].trim();
61
+ const environ = this.environReader.readEnviron(pid);
62
+ processes.push({
63
+ pid,
64
+ ppid,
65
+ commandLine,
66
+ sessionId: environ?.[SESSION_ID_ENV_KEY] ?? null,
67
+ configDir: environ?.[CONFIG_DIR_ENV_KEY] ?? null,
68
+ });
69
+ }
70
+ return processes;
71
+ };
72
+ }
73
+ }
74
+ exports.LocalProcessLiveSessionProcessSnapshotProvider = LocalProcessLiveSessionProcessSnapshotProvider;
75
+ //# sourceMappingURL=LocalProcessLiveSessionProcessSnapshotProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalProcessLiveSessionProcessSnapshotProvider.js","sourceRoot":"","sources":["../../../src/adapter/repositories/LocalProcessLiveSessionProcessSnapshotProvider.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.NoUnansweredOwnerCallStatusProvider = void 0;
4
4
  class NoUnansweredOwnerCallStatusProvider {
5
5
  constructor() {
6
- this.listSessionNamesWithUnansweredOwnerCall = (_sessionNames) => {
6
+ this.listSessionNamesWithUnansweredOwnerCall = (_transcriptPathBySessionName) => {
7
7
  return Promise.resolve(new Set());
8
8
  };
9
9
  }
@@ -1 +1 @@
1
- {"version":3,"file":"NoUnansweredOwnerCallStatusProvider.js","sourceRoot":"","sources":["../../../src/adapter/repositories/NoUnansweredOwnerCallStatusProvider.ts"],"names":[],"mappings":";;;AAEA,MAAa,mCAAmC;IAAhD;QACE,4CAAuC,GAAG,CACxC,aAAuB,EACD,EAAE;YACxB,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,GAAG,EAAU,CAAC,CAAC;QAC5C,CAAC,CAAC;IACJ,CAAC;CAAA;AAND,kFAMC"}
1
+ {"version":3,"file":"NoUnansweredOwnerCallStatusProvider.js","sourceRoot":"","sources":["../../../src/adapter/repositories/NoUnansweredOwnerCallStatusProvider.ts"],"names":[],"mappings":";;;AAEA,MAAa,mCAAmC;IAAhD;QACE,4CAAuC,GAAG,CACxC,4BAAiD,EAC3B,EAAE;YACxB,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,GAAG,EAAU,CAAC,CAAC;QAC5C,CAAC,CAAC;IACJ,CAAC;CAAA;AAND,kFAMC"}
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ProcFsProcessEnvironReader = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ /**
40
+ * Reads a process environment from the Linux procfs (`/proc/<pid>/environ`),
41
+ * where entries are NUL-separated `KEY=value` pairs. Returns null when the
42
+ * environment cannot be read (the process has exited or is not accessible).
43
+ */
44
+ class ProcFsProcessEnvironReader {
45
+ constructor(procDirectory = '/proc') {
46
+ this.procDirectory = procDirectory;
47
+ this.readEnviron = (pid) => {
48
+ let raw;
49
+ try {
50
+ raw = fs.readFileSync(path.join(this.procDirectory, String(pid), 'environ'), 'utf8');
51
+ }
52
+ catch {
53
+ return null;
54
+ }
55
+ const environ = {};
56
+ for (const entry of raw.split('\0')) {
57
+ if (entry.length === 0) {
58
+ continue;
59
+ }
60
+ const separatorIndex = entry.indexOf('=');
61
+ if (separatorIndex === -1) {
62
+ continue;
63
+ }
64
+ const key = entry.slice(0, separatorIndex);
65
+ const value = entry.slice(separatorIndex + 1);
66
+ environ[key] = value;
67
+ }
68
+ return environ;
69
+ };
70
+ }
71
+ }
72
+ exports.ProcFsProcessEnvironReader = ProcFsProcessEnvironReader;
73
+ //# sourceMappingURL=ProcFsProcessEnvironReader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProcFsProcessEnvironReader.js","sourceRoot":"","sources":["../../../src/adapter/repositories/ProcFsProcessEnvironReader.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAG7B;;;;GAIG;AACH,MAAa,0BAA0B;IACrC,YAA6B,gBAAwB,OAAO;QAA/B,kBAAa,GAAb,aAAa,CAAkB;QAE5D,gBAAW,GAAG,CAAC,GAAW,EAAiC,EAAE;YAC3D,IAAI,GAAW,CAAC;YAChB,IAAI,CAAC;gBACH,GAAG,GAAG,EAAE,CAAC,YAAY,CACnB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,EACrD,MAAM,CACP,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,OAAO,GAA2B,EAAE,CAAC;YAC3C,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACvB,SAAS;gBACX,CAAC;gBACD,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAC1C,IAAI,cAAc,KAAK,CAAC,CAAC,EAAE,CAAC;oBAC1B,SAAS;gBACX,CAAC;gBACD,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;gBAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;gBAC9C,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACvB,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC;IA1B6D,CAAC;CA2BjE;AA5BD,gEA4BC"}
@@ -35,7 +35,6 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.TranscriptOwnerCallStatusProvider = void 0;
37
37
  const fs = __importStar(require("fs"));
38
- const path = __importStar(require("path"));
39
38
  const isRecord = (value) => typeof value === 'object' && value !== null;
40
39
  const readString = (value, key) => {
41
40
  const candidate = value[key];
@@ -76,31 +75,25 @@ const hasOwnerTextReply = (content) => {
76
75
  return content.some((block) => isRecord(block) && block.type === 'text');
77
76
  };
78
77
  class TranscriptOwnerCallStatusProvider {
79
- constructor(rootDirectory, ownerCallMarker) {
80
- this.rootDirectory = rootDirectory;
78
+ constructor(ownerCallMarker) {
81
79
  this.ownerCallMarker = ownerCallMarker;
82
- this.listSessionNamesWithUnansweredOwnerCall = async (sessionNames) => {
80
+ this.listSessionNamesWithUnansweredOwnerCall = async (transcriptPathBySessionName) => {
83
81
  const waiting = new Set();
84
- if (this.rootDirectory === null ||
85
- this.ownerCallMarker === null ||
86
- this.ownerCallMarker.length === 0) {
82
+ if (this.ownerCallMarker === null || this.ownerCallMarker.length === 0) {
87
83
  return waiting;
88
84
  }
89
- for (const sessionName of sessionNames) {
90
- if (this.isWaitingForOwnerReply(sessionName, this.ownerCallMarker)) {
85
+ const marker = this.ownerCallMarker;
86
+ for (const [sessionName, transcriptPath] of transcriptPathBySessionName) {
87
+ if (this.isWaitingForOwnerReply(transcriptPath, marker)) {
91
88
  waiting.add(sessionName);
92
89
  }
93
90
  }
94
91
  return waiting;
95
92
  };
96
- this.isWaitingForOwnerReply = (sessionName, marker) => {
97
- if (this.rootDirectory === null) {
98
- return false;
99
- }
100
- const filePath = path.join(this.rootDirectory, this.toTranscriptFileName(sessionName));
93
+ this.isWaitingForOwnerReply = (transcriptPath, marker) => {
101
94
  let content;
102
95
  try {
103
- content = fs.readFileSync(filePath, 'utf8');
96
+ content = fs.readFileSync(transcriptPath, 'utf8');
104
97
  }
105
98
  catch {
106
99
  return false;
@@ -143,7 +136,6 @@ class TranscriptOwnerCallStatusProvider {
143
136
  return (lastOwnerReplyEpochMs === null ||
144
137
  lastOwnerCallEpochMs > lastOwnerReplyEpochMs);
145
138
  };
146
- this.toTranscriptFileName = (sessionName) => `${sessionName.replace(/\//g, '_')}.jsonl`;
147
139
  }
148
140
  }
149
141
  exports.TranscriptOwnerCallStatusProvider = TranscriptOwnerCallStatusProvider;
@@ -1 +1 @@
1
- {"version":3,"file":"TranscriptOwnerCallStatusProvider.js","sourceRoot":"","sources":["../../../src/adapter/repositories/TranscriptOwnerCallStatusProvider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TranscriptOwnerCallStatusProvider.js","sourceRoot":"","sources":["../../../src/adapter/repositories/TranscriptOwnerCallStatusProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=InteractiveLiveSession.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InteractiveLiveSession.js","sourceRoot":"","sources":["../../../src/domain/entities/InteractiveLiveSession.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=LiveSessionProcessSnapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LiveSessionProcessSnapshot.js","sourceRoot":"","sources":["../../../src/domain/entities/LiveSessionProcessSnapshot.ts"],"names":[],"mappings":""}
@@ -1,34 +1,33 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.NotifySilentLiveSessionsUseCase = exports.DEFAULT_NOTIFICATION_STAGGER_SECONDS = exports.DEFAULT_NOTIFICATION_COOLDOWN_SECONDS = exports.DEFAULT_SUBAGENT_RUNNING_THRESHOLD_SECONDS = exports.DEFAULT_SUBAGENT_SILENT_THRESHOLD_SECONDS = exports.DEFAULT_MAIN_SILENT_THRESHOLD_SECONDS = exports.DEFAULT_MONITORED_STATUS = void 0;
4
- const WorkflowStatus_1 = require("../entities/WorkflowStatus");
5
- const InTmuxByHumanSessionReconcileUseCase_1 = require("./intmux/InTmuxByHumanSessionReconcileUseCase");
6
- exports.DEFAULT_MONITORED_STATUS = WorkflowStatus_1.IN_TMUX_STATUS_NAME;
3
+ exports.NotifySilentLiveSessionsUseCase = exports.DEFAULT_NOTIFICATION_STAGGER_SECONDS = exports.DEFAULT_NOTIFICATION_COOLDOWN_SECONDS = exports.DEFAULT_SUBAGENT_RUNNING_THRESHOLD_SECONDS = exports.DEFAULT_SUBAGENT_SILENT_THRESHOLD_SECONDS = exports.DEFAULT_MAIN_SILENT_THRESHOLD_SECONDS = void 0;
4
+ const ResolveInteractiveLiveSessionsUseCase_1 = require("./ResolveInteractiveLiveSessionsUseCase");
7
5
  exports.DEFAULT_MAIN_SILENT_THRESHOLD_SECONDS = 10 * 60;
8
6
  exports.DEFAULT_SUBAGENT_SILENT_THRESHOLD_SECONDS = 5 * 60;
9
7
  exports.DEFAULT_SUBAGENT_RUNNING_THRESHOLD_SECONDS = 15 * 60;
10
8
  exports.DEFAULT_NOTIFICATION_COOLDOWN_SECONDS = 30 * 60;
11
9
  exports.DEFAULT_NOTIFICATION_STAGGER_SECONDS = 25;
12
10
  class NotifySilentLiveSessionsUseCase {
13
- constructor(issueRepository, tmuxSessionRepository, sessionOutputActivityRepository, subAgentActivityRepository, ownerCallStatusProvider, notificationRepository, messageComposer, sleeper) {
14
- this.issueRepository = issueRepository;
15
- this.tmuxSessionRepository = tmuxSessionRepository;
11
+ constructor(liveSessionProcessSnapshotProvider, interactiveLiveSessionTranscriptResolver, sessionOutputActivityRepository, subAgentActivityRepository, ownerCallStatusProvider, notificationRepository, messageComposer, sleeper) {
12
+ this.liveSessionProcessSnapshotProvider = liveSessionProcessSnapshotProvider;
13
+ this.interactiveLiveSessionTranscriptResolver = interactiveLiveSessionTranscriptResolver;
16
14
  this.sessionOutputActivityRepository = sessionOutputActivityRepository;
17
15
  this.subAgentActivityRepository = subAgentActivityRepository;
18
16
  this.ownerCallStatusProvider = ownerCallStatusProvider;
19
17
  this.notificationRepository = notificationRepository;
20
18
  this.messageComposer = messageComposer;
21
19
  this.sleeper = sleeper;
20
+ this.resolveInteractiveLiveSessions = new ResolveInteractiveLiveSessionsUseCase_1.ResolveInteractiveLiveSessionsUseCase();
22
21
  this.run = async (params) => {
23
- const liveSessionNames = new Set(await this.tmuxSessionRepository.listLiveSessionNames());
24
- const openIssues = await this.issueRepository.getAllOpened(params.project, params.allowCacheMinutes);
25
- const monitoredSessionNames = this.selectMonitoredSessionNames(openIssues, liveSessionNames, params.monitoredStatus);
26
- const snapshots = await this.collectSnapshots(monitoredSessionNames, params.now);
22
+ const snapshot = await this.liveSessionProcessSnapshotProvider.getSnapshot();
23
+ const interactiveSessions = this.resolveInteractiveLiveSessions.resolve(snapshot);
24
+ const transcriptPathBySessionName = this.interactiveLiveSessionTranscriptResolver.resolveTranscriptPaths(interactiveSessions);
25
+ const snapshots = await this.collectSnapshots(interactiveSessions, transcriptPathBySessionName, params.now);
27
26
  const candidates = [];
28
- for (const snapshot of snapshots) {
29
- const message = this.composeMessage(snapshot, params);
27
+ for (const sessionSnapshot of snapshots) {
28
+ const message = this.composeMessage(sessionSnapshot, params);
30
29
  if (message !== null) {
31
- candidates.push({ sessionName: snapshot.sessionName, message });
30
+ candidates.push({ sessionName: sessionSnapshot.sessionName, message });
32
31
  }
33
32
  }
34
33
  candidates.sort((left, right) => left.sessionName < right.sessionName
@@ -36,7 +35,7 @@ class NotifySilentLiveSessionsUseCase {
36
35
  : left.sessionName > right.sessionName
37
36
  ? 1
38
37
  : 0);
39
- console.log(`Silent live session notification: ${candidates.length} candidate(s) of ${monitoredSessionNames.length} monitored session(s).`);
38
+ console.log(`Silent live session notification: ${candidates.length} candidate(s) of ${interactiveSessions.length} interactive session(s).`);
40
39
  const nowEpochSeconds = Math.floor(params.now.getTime() / 1000);
41
40
  let sentCount = 0;
42
41
  for (const candidate of candidates) {
@@ -55,16 +54,17 @@ class NotifySilentLiveSessionsUseCase {
55
54
  console.log(`Notified ${candidate.sessionName}.`);
56
55
  }
57
56
  };
58
- this.collectSnapshots = async (monitoredSessionNames, now) => {
59
- const activities = await this.sessionOutputActivityRepository.listSessionOutputActivities(monitoredSessionNames);
57
+ this.collectSnapshots = async (interactiveSessions, transcriptPathBySessionName, now) => {
58
+ const sessionNames = interactiveSessions.map((session) => session.sessionName);
59
+ const activities = await this.sessionOutputActivityRepository.listSessionOutputActivities(transcriptPathBySessionName);
60
60
  const lastOutputBySessionName = new Map();
61
61
  for (const activity of activities) {
62
62
  lastOutputBySessionName.set(activity.sessionName, activity.lastOutputEpochSeconds);
63
63
  }
64
- const subAgentsBySessionName = await this.subAgentActivityRepository.listSubAgentActivitiesBySessionName(monitoredSessionNames);
65
- const sessionNamesWithUnansweredOwnerCall = await this.ownerCallStatusProvider.listSessionNamesWithUnansweredOwnerCall(monitoredSessionNames);
64
+ const subAgentsBySessionName = await this.subAgentActivityRepository.listSubAgentActivitiesBySessionName(sessionNames);
65
+ const sessionNamesWithUnansweredOwnerCall = await this.ownerCallStatusProvider.listSessionNamesWithUnansweredOwnerCall(transcriptPathBySessionName);
66
66
  const nowEpochSeconds = Math.floor(now.getTime() / 1000);
67
- return monitoredSessionNames.map((sessionName) => {
67
+ return sessionNames.map((sessionName) => {
68
68
  const lastOutputEpochSeconds = lastOutputBySessionName.get(sessionName);
69
69
  const mainSilentSeconds = lastOutputEpochSeconds === undefined
70
70
  ? null
@@ -94,19 +94,6 @@ class NotifySilentLiveSessionsUseCase {
94
94
  }
95
95
  return sections.join('\n\n');
96
96
  };
97
- this.selectMonitoredSessionNames = (openIssues, liveSessionNames, monitoredStatus) => {
98
- const monitoredSessionNames = [];
99
- for (const issue of openIssues) {
100
- if (issue.status !== monitoredStatus) {
101
- continue;
102
- }
103
- const sessionName = (0, InTmuxByHumanSessionReconcileUseCase_1.toTmuxSessionName)(issue.url);
104
- if (liveSessionNames.has(sessionName)) {
105
- monitoredSessionNames.push(sessionName);
106
- }
107
- }
108
- return monitoredSessionNames;
109
- };
110
97
  }
111
98
  }
112
99
  exports.NotifySilentLiveSessionsUseCase = NotifySilentLiveSessionsUseCase;
@@ -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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"}
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ResolveInteractiveLiveSessionsUseCase = exports.OWNER_HANDOVER_COMMAND_MARKER = void 0;
4
+ // Command-line substring that identifies an "owner-handover" agent spawn (for
5
+ // example a background implementation agent started with a prompt beginning
6
+ // "Take ownership of ..."). These spawns are not interactive owner sessions and
7
+ // MUST NOT be notified, so any process whose command line contains this marker
8
+ // is excluded even if it somehow appears under a monitored pane.
9
+ exports.OWNER_HANDOVER_COMMAND_MARKER = 'Take ownership of';
10
+ // Command-name substring that identifies the interactive Claude Code process.
11
+ const INTERACTIVE_PROCESS_COMMAND_MARKER = 'claude';
12
+ const isInteractiveCandidate = (process) => {
13
+ if (process.commandLine.includes(exports.OWNER_HANDOVER_COMMAND_MARKER)) {
14
+ return false;
15
+ }
16
+ if (!process.commandLine.includes(INTERACTIVE_PROCESS_COMMAND_MARKER)) {
17
+ return false;
18
+ }
19
+ return process.sessionId !== null && process.configDir !== null;
20
+ };
21
+ /**
22
+ * Selects the interactive Claude Code sessions that are eligible for the silent
23
+ * self-check notification, independently of session naming or any GitHub issue
24
+ * linkage.
25
+ *
26
+ * Selection works purely from a process snapshot: for each live tmux session,
27
+ * the descendants of its pane processes are walked, and the first descendant
28
+ * that looks like an interactive Claude Code process (command line contains
29
+ * `claude`, does not contain the owner-handover marker, and exposes both a
30
+ * session id and a config directory in its environment) is taken as the
31
+ * session's interactive process. Because the walk is anchored on tmux panes,
32
+ * background owner-handover spawns, the preparation daemon, and monitor
33
+ * processes — none of which run inside an interactive tmux pane — are naturally
34
+ * excluded; the explicit owner-handover marker check is an additional guard.
35
+ */
36
+ class ResolveInteractiveLiveSessionsUseCase {
37
+ constructor() {
38
+ this.resolve = (snapshot) => {
39
+ const processByPid = new Map();
40
+ const childrenByPpid = new Map();
41
+ for (const process of snapshot.processes) {
42
+ processByPid.set(process.pid, process);
43
+ const siblings = childrenByPpid.get(process.ppid) ?? [];
44
+ siblings.push(process);
45
+ childrenByPpid.set(process.ppid, siblings);
46
+ }
47
+ const sessions = [];
48
+ for (const session of snapshot.sessions) {
49
+ const interactiveProcess = this.findInteractiveProcess(session.panePids, processByPid, childrenByPpid);
50
+ if (interactiveProcess === null ||
51
+ interactiveProcess.sessionId === null ||
52
+ interactiveProcess.configDir === null) {
53
+ continue;
54
+ }
55
+ sessions.push({
56
+ sessionName: session.sessionName,
57
+ sessionId: interactiveProcess.sessionId,
58
+ configDir: interactiveProcess.configDir,
59
+ });
60
+ }
61
+ return sessions;
62
+ };
63
+ this.findInteractiveProcess = (panePids, processByPid, childrenByPpid) => {
64
+ const visited = new Set();
65
+ const queue = [...panePids];
66
+ let head = 0;
67
+ while (head < queue.length) {
68
+ const pid = queue[head];
69
+ head += 1;
70
+ if (visited.has(pid)) {
71
+ continue;
72
+ }
73
+ visited.add(pid);
74
+ const process = processByPid.get(pid);
75
+ if (process !== undefined && isInteractiveCandidate(process)) {
76
+ return process;
77
+ }
78
+ for (const child of childrenByPpid.get(pid) ?? []) {
79
+ if (!visited.has(child.pid)) {
80
+ queue.push(child.pid);
81
+ }
82
+ }
83
+ }
84
+ return null;
85
+ };
86
+ }
87
+ }
88
+ exports.ResolveInteractiveLiveSessionsUseCase = ResolveInteractiveLiveSessionsUseCase;
89
+ //# sourceMappingURL=ResolveInteractiveLiveSessionsUseCase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResolveInteractiveLiveSessionsUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/ResolveInteractiveLiveSessionsUseCase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=InteractiveLiveSessionTranscriptResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InteractiveLiveSessionTranscriptResolver.js","sourceRoot":"","sources":["../../../../src/domain/usecases/adapter-interfaces/InteractiveLiveSessionTranscriptResolver.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=LiveSessionProcessSnapshotProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LiveSessionProcessSnapshotProvider.js","sourceRoot":"","sources":["../../../../src/domain/usecases/adapter-interfaces/LiveSessionProcessSnapshotProvider.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=ProcessEnvironReader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProcessEnvironReader.js","sourceRoot":"","sources":["../../../../src/domain/usecases/adapter-interfaces/ProcessEnvironReader.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "github-issue-tower-defence-management",
3
- "version": "1.110.1",
3
+ "version": "1.111.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "scripts": {
@@ -108,8 +108,7 @@ export class HandleScheduledEventUseCaseHandler {
108
108
  inTmuxConsoleToken?: string;
109
109
  inTmuxProjectOrder?: string[];
110
110
  inTmuxLauncherCommand?: string;
111
- sessionOutputRootDirectory?: string;
112
- sessionTranscriptRootDirectory?: string;
111
+ silentNotificationEnabled?: boolean;
113
112
  ownerCallMarker?: string;
114
113
  subAgentOutputRootDirectory?: string;
115
114
  subAgentProcessMatchPattern?: string;
@@ -563,10 +562,9 @@ export class HandleScheduledEventUseCaseHandler {
563
562
  }
564
563
 
565
564
  try {
566
- const sessionOutputRootDirectory =
567
- mergedInput.sessionOutputRootDirectory ??
568
- process.env.TDPM_SESSION_OUTPUT_ROOT_DIRECTORY ??
569
- null;
565
+ const silentNotificationEnabled =
566
+ mergedInput.silentNotificationEnabled ??
567
+ process.env.TDPM_SILENT_NOTIFICATION_ENABLED === 'true';
570
568
  const subAgentOutputRootDirectory =
571
569
  mergedInput.subAgentOutputRootDirectory ??
572
570
  process.env.TDPM_SUBAGENT_OUTPUT_ROOT_DIRECTORY ??
@@ -575,10 +573,6 @@ export class HandleScheduledEventUseCaseHandler {
575
573
  mergedInput.subAgentProcessMatchPattern ??
576
574
  process.env.TDPM_SUBAGENT_PROCESS_MATCH_PATTERN ??
577
575
  null;
578
- const sessionTranscriptRootDirectory =
579
- mergedInput.sessionTranscriptRootDirectory ??
580
- process.env.TDPM_SESSION_TRANSCRIPT_ROOT_DIRECTORY ??
581
- null;
582
576
  const ownerCallMarker =
583
577
  mergedInput.ownerCallMarker ??
584
578
  process.env.TDPM_SILENT_OWNER_CALL_MARKER ??
@@ -588,13 +582,9 @@ export class HandleScheduledEventUseCaseHandler {
588
582
  process.env.TDPM_SUBAGENT_TRANSCRIPT_ROOT_DIRECTORY ??
589
583
  null;
590
584
  await notifySilentTmuxSessions({
591
- project: result.project,
592
- allowCacheMinutes: mergedInput.allowIssueCacheMinutes,
593
- issueRepository,
585
+ enabled: silentNotificationEnabled,
594
586
  localCommandRunner: nodeLocalCommandRunner,
595
587
  cacheRepository: localStorageCacheRepository,
596
- sessionOutputRootDirectory,
597
- sessionTranscriptRootDirectory,
598
588
  ownerCallMarker,
599
589
  subAgentOutputRootDirectory,
600
590
  subAgentProcessMatchPattern,