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.
- package/CHANGELOG.md +7 -0
- package/README.md +8 -7
- package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js +9 -21
- package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js.map +1 -1
- package/bin/adapter/entry-points/handlers/notifySilentTmuxSessions.js +10 -15
- package/bin/adapter/entry-points/handlers/notifySilentTmuxSessions.js.map +1 -1
- package/bin/adapter/repositories/FileSystemInteractiveLiveSessionTranscriptResolver.js +104 -0
- package/bin/adapter/repositories/FileSystemInteractiveLiveSessionTranscriptResolver.js.map +1 -0
- package/bin/adapter/repositories/FileSystemSessionOutputActivityRepository.js +55 -19
- package/bin/adapter/repositories/FileSystemSessionOutputActivityRepository.js.map +1 -1
- package/bin/adapter/repositories/LocalProcessLiveSessionProcessSnapshotProvider.js +75 -0
- package/bin/adapter/repositories/LocalProcessLiveSessionProcessSnapshotProvider.js.map +1 -0
- package/bin/adapter/repositories/NoUnansweredOwnerCallStatusProvider.js +1 -1
- package/bin/adapter/repositories/NoUnansweredOwnerCallStatusProvider.js.map +1 -1
- package/bin/adapter/repositories/ProcFsProcessEnvironReader.js +73 -0
- package/bin/adapter/repositories/ProcFsProcessEnvironReader.js.map +1 -0
- package/bin/adapter/repositories/TranscriptOwnerCallStatusProvider.js +8 -16
- package/bin/adapter/repositories/TranscriptOwnerCallStatusProvider.js.map +1 -1
- package/bin/domain/entities/InteractiveLiveSession.js +3 -0
- package/bin/domain/entities/InteractiveLiveSession.js.map +1 -0
- package/bin/domain/entities/LiveSessionProcessSnapshot.js +3 -0
- package/bin/domain/entities/LiveSessionProcessSnapshot.js.map +1 -0
- package/bin/domain/usecases/NotifySilentLiveSessionsUseCase.js +20 -33
- package/bin/domain/usecases/NotifySilentLiveSessionsUseCase.js.map +1 -1
- package/bin/domain/usecases/ResolveInteractiveLiveSessionsUseCase.js +89 -0
- package/bin/domain/usecases/ResolveInteractiveLiveSessionsUseCase.js.map +1 -0
- package/bin/domain/usecases/adapter-interfaces/InteractiveLiveSessionTranscriptResolver.js +3 -0
- package/bin/domain/usecases/adapter-interfaces/InteractiveLiveSessionTranscriptResolver.js.map +1 -0
- package/bin/domain/usecases/adapter-interfaces/LiveSessionProcessSnapshotProvider.js +3 -0
- package/bin/domain/usecases/adapter-interfaces/LiveSessionProcessSnapshotProvider.js.map +1 -0
- package/bin/domain/usecases/adapter-interfaces/ProcessEnvironReader.js +3 -0
- package/bin/domain/usecases/adapter-interfaces/ProcessEnvironReader.js.map +1 -0
- package/package.json +1 -1
- package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts +5 -15
- package/src/adapter/entry-points/handlers/notifySilentTmuxSessions.test.ts +96 -204
- package/src/adapter/entry-points/handlers/notifySilentTmuxSessions.ts +19 -40
- package/src/adapter/repositories/FileSystemInteractiveLiveSessionTranscriptResolver.test.ts +147 -0
- package/src/adapter/repositories/FileSystemInteractiveLiveSessionTranscriptResolver.ts +75 -0
- package/src/adapter/repositories/FileSystemSessionOutputActivityRepository.test.ts +82 -44
- package/src/adapter/repositories/FileSystemSessionOutputActivityRepository.ts +62 -24
- package/src/adapter/repositories/LocalProcessLiveSessionProcessSnapshotProvider.test.ts +138 -0
- package/src/adapter/repositories/LocalProcessLiveSessionProcessSnapshotProvider.ts +93 -0
- package/src/adapter/repositories/NoUnansweredOwnerCallStatusProvider.test.ts +6 -4
- package/src/adapter/repositories/NoUnansweredOwnerCallStatusProvider.ts +1 -1
- package/src/adapter/repositories/ProcFsProcessEnvironReader.test.ts +60 -0
- package/src/adapter/repositories/ProcFsProcessEnvironReader.ts +38 -0
- package/src/adapter/repositories/TranscriptOwnerCallStatusProvider.test.ts +61 -81
- package/src/adapter/repositories/TranscriptOwnerCallStatusProvider.ts +8 -25
- package/src/domain/entities/InteractiveLiveSession.ts +5 -0
- package/src/domain/entities/LiveSessionProcessSnapshot.ts +17 -0
- package/src/domain/usecases/NotifySilentLiveSessionsUseCase.test.ts +125 -349
- package/src/domain/usecases/NotifySilentLiveSessionsUseCase.ts +33 -55
- package/src/domain/usecases/ResolveInteractiveLiveSessionsUseCase.test.ts +220 -0
- package/src/domain/usecases/ResolveInteractiveLiveSessionsUseCase.ts +105 -0
- package/src/domain/usecases/adapter-interfaces/InteractiveLiveSessionTranscriptResolver.ts +7 -0
- package/src/domain/usecases/adapter-interfaces/LiveSessionProcessSnapshotProvider.ts +5 -0
- package/src/domain/usecases/adapter-interfaces/OwnerCallStatusProvider.ts +1 -1
- package/src/domain/usecases/adapter-interfaces/ProcessEnvironReader.ts +3 -0
- package/src/domain/usecases/adapter-interfaces/SessionOutputActivityRepository.ts +1 -1
- package/types/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.d.ts.map +1 -1
- package/types/adapter/entry-points/handlers/notifySilentTmuxSessions.d.ts +3 -7
- package/types/adapter/entry-points/handlers/notifySilentTmuxSessions.d.ts.map +1 -1
- package/types/adapter/repositories/FileSystemInteractiveLiveSessionTranscriptResolver.d.ts +18 -0
- package/types/adapter/repositories/FileSystemInteractiveLiveSessionTranscriptResolver.d.ts.map +1 -0
- package/types/adapter/repositories/FileSystemSessionOutputActivityRepository.d.ts +9 -5
- package/types/adapter/repositories/FileSystemSessionOutputActivityRepository.d.ts.map +1 -1
- package/types/adapter/repositories/LocalProcessLiveSessionProcessSnapshotProvider.d.ts +21 -0
- package/types/adapter/repositories/LocalProcessLiveSessionProcessSnapshotProvider.d.ts.map +1 -0
- package/types/adapter/repositories/NoUnansweredOwnerCallStatusProvider.d.ts +1 -1
- package/types/adapter/repositories/NoUnansweredOwnerCallStatusProvider.d.ts.map +1 -1
- package/types/adapter/repositories/ProcFsProcessEnvironReader.d.ts +12 -0
- package/types/adapter/repositories/ProcFsProcessEnvironReader.d.ts.map +1 -0
- package/types/adapter/repositories/TranscriptOwnerCallStatusProvider.d.ts +2 -4
- package/types/adapter/repositories/TranscriptOwnerCallStatusProvider.d.ts.map +1 -1
- package/types/domain/entities/InteractiveLiveSession.d.ts +6 -0
- package/types/domain/entities/InteractiveLiveSession.d.ts.map +1 -0
- package/types/domain/entities/LiveSessionProcessSnapshot.d.ts +16 -0
- package/types/domain/entities/LiveSessionProcessSnapshot.d.ts.map +1 -0
- package/types/domain/usecases/NotifySilentLiveSessionsUseCase.d.ts +6 -11
- package/types/domain/usecases/NotifySilentLiveSessionsUseCase.d.ts.map +1 -1
- package/types/domain/usecases/ResolveInteractiveLiveSessionsUseCase.d.ts +23 -0
- package/types/domain/usecases/ResolveInteractiveLiveSessionsUseCase.d.ts.map +1 -0
- package/types/domain/usecases/adapter-interfaces/InteractiveLiveSessionTranscriptResolver.d.ts +5 -0
- package/types/domain/usecases/adapter-interfaces/InteractiveLiveSessionTranscriptResolver.d.ts.map +1 -0
- package/types/domain/usecases/adapter-interfaces/LiveSessionProcessSnapshotProvider.d.ts +5 -0
- package/types/domain/usecases/adapter-interfaces/LiveSessionProcessSnapshotProvider.d.ts.map +1 -0
- package/types/domain/usecases/adapter-interfaces/OwnerCallStatusProvider.d.ts +1 -1
- package/types/domain/usecases/adapter-interfaces/OwnerCallStatusProvider.d.ts.map +1 -1
- package/types/domain/usecases/adapter-interfaces/ProcessEnvironReader.d.ts +4 -0
- package/types/domain/usecases/adapter-interfaces/ProcessEnvironReader.d.ts.map +1 -0
- package/types/domain/usecases/adapter-interfaces/SessionOutputActivityRepository.d.ts +1 -1
- 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 = (
|
|
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,
|
|
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(
|
|
80
|
-
this.rootDirectory = rootDirectory;
|
|
78
|
+
constructor(ownerCallMarker) {
|
|
81
79
|
this.ownerCallMarker = ownerCallMarker;
|
|
82
|
-
this.listSessionNamesWithUnansweredOwnerCall = async (
|
|
80
|
+
this.listSessionNamesWithUnansweredOwnerCall = async (transcriptPathBySessionName) => {
|
|
83
81
|
const waiting = new Set();
|
|
84
|
-
if (this.
|
|
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
|
-
|
|
90
|
-
|
|
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 = (
|
|
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(
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;
|
|
1
|
+
{"version":3,"file":"TranscriptOwnerCallStatusProvider.js","sourceRoot":"","sources":["../../../src/adapter/repositories/TranscriptOwnerCallStatusProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InteractiveLiveSession.js","sourceRoot":"","sources":["../../../src/domain/entities/InteractiveLiveSession.ts"],"names":[],"mappings":""}
|
|
@@ -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 =
|
|
4
|
-
const
|
|
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(
|
|
14
|
-
this.
|
|
15
|
-
this.
|
|
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
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
const snapshots = await this.collectSnapshots(
|
|
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
|
|
29
|
-
const message = this.composeMessage(
|
|
27
|
+
for (const sessionSnapshot of snapshots) {
|
|
28
|
+
const message = this.composeMessage(sessionSnapshot, params);
|
|
30
29
|
if (message !== null) {
|
|
31
|
-
candidates.push({ sessionName:
|
|
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 ${
|
|
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 (
|
|
59
|
-
const
|
|
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(
|
|
65
|
-
const sessionNamesWithUnansweredOwnerCall = await this.ownerCallStatusProvider.listSessionNamesWithUnansweredOwnerCall(
|
|
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
|
|
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":";;;
|
|
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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"}
|
package/bin/domain/usecases/adapter-interfaces/InteractiveLiveSessionTranscriptResolver.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InteractiveLiveSessionTranscriptResolver.js","sourceRoot":"","sources":["../../../../src/domain/usecases/adapter-interfaces/InteractiveLiveSessionTranscriptResolver.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LiveSessionProcessSnapshotProvider.js","sourceRoot":"","sources":["../../../../src/domain/usecases/adapter-interfaces/LiveSessionProcessSnapshotProvider.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProcessEnvironReader.js","sourceRoot":"","sources":["../../../../src/domain/usecases/adapter-interfaces/ProcessEnvironReader.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -108,8 +108,7 @@ export class HandleScheduledEventUseCaseHandler {
|
|
|
108
108
|
inTmuxConsoleToken?: string;
|
|
109
109
|
inTmuxProjectOrder?: string[];
|
|
110
110
|
inTmuxLauncherCommand?: string;
|
|
111
|
-
|
|
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
|
|
567
|
-
mergedInput.
|
|
568
|
-
process.env.
|
|
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
|
-
|
|
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,
|