sensorium-mcp 3.1.0-refactor.0 → 3.1.0-refactor.10
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/Install-Sensorium.ps1 +113 -20
- package/dist/config/agent-settings.d.ts +7 -0
- package/dist/config/agent-settings.d.ts.map +1 -1
- package/dist/config/agent-settings.js +14 -0
- package/dist/config/agent-settings.js.map +1 -1
- package/dist/dashboard/log-parser.d.ts +3 -0
- package/dist/dashboard/log-parser.d.ts.map +1 -1
- package/dist/dashboard/log-parser.js +38 -4
- package/dist/dashboard/log-parser.js.map +1 -1
- package/dist/dashboard/routes/claude.d.ts.map +1 -1
- package/dist/dashboard/routes/claude.js +9 -1
- package/dist/dashboard/routes/claude.js.map +1 -1
- package/dist/dashboard/routes/threads.js +1 -1
- package/dist/dashboard/routes/threads.js.map +1 -1
- package/dist/dashboard/spa.html +11 -11
- package/dist/data/memory/bootstrap.d.ts +7 -0
- package/dist/data/memory/bootstrap.d.ts.map +1 -1
- package/dist/data/memory/bootstrap.js +45 -16
- package/dist/data/memory/bootstrap.js.map +1 -1
- package/dist/data/memory/consolidation.d.ts +9 -4
- package/dist/data/memory/consolidation.d.ts.map +1 -1
- package/dist/data/memory/consolidation.js +24 -12
- package/dist/data/memory/consolidation.js.map +1 -1
- package/dist/data/memory/index.d.ts +1 -2
- package/dist/data/memory/index.d.ts.map +1 -1
- package/dist/data/memory/index.js +1 -2
- package/dist/data/memory/index.js.map +1 -1
- package/dist/data/memory/migration-runner.d.ts +24 -1
- package/dist/data/memory/migration-runner.d.ts.map +1 -1
- package/dist/data/memory/migration-runner.js +85 -1
- package/dist/data/memory/migration-runner.js.map +1 -1
- package/dist/data/memory/narrative.d.ts.map +1 -1
- package/dist/data/memory/narrative.js +5 -1
- package/dist/data/memory/narrative.js.map +1 -1
- package/dist/data/memory/note-archival.d.ts +29 -4
- package/dist/data/memory/note-archival.d.ts.map +1 -1
- package/dist/data/memory/note-archival.js +55 -26
- package/dist/data/memory/note-archival.js.map +1 -1
- package/dist/data/memory/reflection-dedup.js +2 -2
- package/dist/data/memory/reflection-dedup.js.map +1 -1
- package/dist/data/memory/reflection.d.ts.map +1 -1
- package/dist/data/memory/reflection.js +7 -3
- package/dist/data/memory/reflection.js.map +1 -1
- package/dist/data/memory/schema-ddl.d.ts +1 -1
- package/dist/data/memory/schema-ddl.d.ts.map +1 -1
- package/dist/data/memory/schema-ddl.js +8 -8
- package/dist/data/memory/semantic-notes.d.ts +30 -2
- package/dist/data/memory/semantic-notes.d.ts.map +1 -1
- package/dist/data/memory/semantic-notes.js +94 -13
- package/dist/data/memory/semantic-notes.js.map +1 -1
- package/dist/data/memory/semantic-search.d.ts.map +1 -1
- package/dist/data/memory/semantic-search.js +6 -4
- package/dist/data/memory/semantic-search.js.map +1 -1
- package/dist/data/memory/thread-registry.d.ts.map +1 -1
- package/dist/data/memory/thread-registry.js +20 -4
- package/dist/data/memory/thread-registry.js.map +1 -1
- package/dist/data/memory/topic-shift.js +2 -2
- package/dist/data/memory/topic-shift.js.map +1 -1
- package/dist/index.js +19 -9
- package/dist/index.js.map +1 -1
- package/dist/integrations/openai/chat.d.ts +7 -1
- package/dist/integrations/openai/chat.d.ts.map +1 -1
- package/dist/integrations/openai/chat.js +19 -2
- package/dist/integrations/openai/chat.js.map +1 -1
- package/dist/integrations/openai/speech.d.ts +4 -1
- package/dist/integrations/openai/speech.d.ts.map +1 -1
- package/dist/integrations/openai/speech.js +6 -1
- package/dist/integrations/openai/speech.js.map +1 -1
- package/dist/integrations/telegram/types.d.ts +9 -0
- package/dist/integrations/telegram/types.d.ts.map +1 -1
- package/dist/lib/markdown.d.ts +0 -13
- package/dist/lib/markdown.d.ts.map +1 -1
- package/dist/lib/markdown.js +45 -0
- package/dist/lib/markdown.js.map +1 -1
- package/dist/lib/usage-metering/index.d.ts +13 -0
- package/dist/lib/usage-metering/index.d.ts.map +1 -0
- package/dist/lib/usage-metering/index.js +10 -0
- package/dist/lib/usage-metering/index.js.map +1 -0
- package/dist/lib/usage-metering/meter.d.ts +34 -0
- package/dist/lib/usage-metering/meter.d.ts.map +1 -0
- package/dist/lib/usage-metering/meter.js +28 -0
- package/dist/lib/usage-metering/meter.js.map +1 -0
- package/dist/lib/usage-metering/pricing.d.ts +39 -0
- package/dist/lib/usage-metering/pricing.d.ts.map +1 -0
- package/dist/lib/usage-metering/pricing.js +49 -0
- package/dist/lib/usage-metering/pricing.js.map +1 -0
- package/dist/lib/usage-metering/sink.d.ts +24 -0
- package/dist/lib/usage-metering/sink.d.ts.map +1 -0
- package/dist/lib/usage-metering/sink.js +56 -0
- package/dist/lib/usage-metering/sink.js.map +1 -0
- package/dist/server/factory.js +12 -9
- package/dist/server/factory.js.map +1 -1
- package/dist/server/http-server.d.ts +1 -0
- package/dist/server/http-server.d.ts.map +1 -1
- package/dist/server/http-server.js +45 -3
- package/dist/server/http-server.js.map +1 -1
- package/dist/services/background-runner.d.ts.map +1 -1
- package/dist/services/background-runner.js +11 -1
- package/dist/services/background-runner.js.map +1 -1
- package/dist/services/claude-spawn.service.d.ts.map +1 -1
- package/dist/services/claude-spawn.service.js +78 -4
- package/dist/services/claude-spawn.service.js.map +1 -1
- package/dist/services/codex-spawn.service.d.ts.map +1 -1
- package/dist/services/codex-spawn.service.js.map +1 -1
- package/dist/services/consolidation.service.d.ts.map +1 -1
- package/dist/services/consolidation.service.js +51 -35
- package/dist/services/consolidation.service.js.map +1 -1
- package/dist/services/copilot-spawn.service.d.ts.map +1 -1
- package/dist/services/copilot-spawn.service.js +8 -1
- package/dist/services/copilot-spawn.service.js.map +1 -1
- package/dist/services/dispatcher/broker.d.ts +6 -0
- package/dist/services/dispatcher/broker.d.ts.map +1 -1
- package/dist/services/dispatcher/broker.js.map +1 -1
- package/dist/services/dispatcher/poller.d.ts.map +1 -1
- package/dist/services/dispatcher/poller.js +15 -0
- package/dist/services/dispatcher/poller.js.map +1 -1
- package/dist/services/keeper.service.d.ts.map +1 -1
- package/dist/services/keeper.service.js +97 -1
- package/dist/services/keeper.service.js.map +1 -1
- package/dist/services/memory-pruning.service.d.ts.map +1 -1
- package/dist/services/memory-pruning.service.js +3 -1
- package/dist/services/memory-pruning.service.js.map +1 -1
- package/dist/services/process.service.d.ts +51 -0
- package/dist/services/process.service.d.ts.map +1 -1
- package/dist/services/process.service.js +247 -7
- package/dist/services/process.service.js.map +1 -1
- package/dist/services/spawn-common.d.ts.map +1 -1
- package/dist/services/spawn-common.js +9 -2
- package/dist/services/spawn-common.js.map +1 -1
- package/dist/services/thread-config.service.d.ts.map +1 -1
- package/dist/services/thread-config.service.js +1 -1
- package/dist/services/thread-config.service.js.map +1 -1
- package/dist/services/thread-health.service.d.ts +19 -1
- package/dist/services/thread-health.service.d.ts.map +1 -1
- package/dist/services/thread-health.service.js +74 -4
- package/dist/services/thread-health.service.js.map +1 -1
- package/dist/services/thread-lifecycle.service.d.ts.map +1 -1
- package/dist/services/thread-lifecycle.service.js +5 -0
- package/dist/services/thread-lifecycle.service.js.map +1 -1
- package/dist/services/worker-cleanup.service.d.ts +12 -0
- package/dist/services/worker-cleanup.service.d.ts.map +1 -1
- package/dist/services/worker-cleanup.service.js +281 -70
- package/dist/services/worker-cleanup.service.js.map +1 -1
- package/dist/sessions/mcp-registry.d.ts +6 -0
- package/dist/sessions/mcp-registry.d.ts.map +1 -1
- package/dist/sessions/mcp-registry.js +8 -0
- package/dist/sessions/mcp-registry.js.map +1 -1
- package/dist/tools/defs/session-defs.d.ts.map +1 -1
- package/dist/tools/defs/session-defs.js +20 -2
- package/dist/tools/defs/session-defs.js.map +1 -1
- package/dist/tools/delegate-tool.d.ts.map +1 -1
- package/dist/tools/delegate-tool.js +84 -4
- package/dist/tools/delegate-tool.js.map +1 -1
- package/dist/tools/memory-tools.d.ts +1 -1
- package/dist/tools/memory-tools.d.ts.map +1 -1
- package/dist/tools/memory-tools.js +4 -4
- package/dist/tools/memory-tools.js.map +1 -1
- package/dist/tools/utility-tools.d.ts.map +1 -1
- package/dist/tools/utility-tools.js +1 -1
- package/dist/tools/utility-tools.js.map +1 -1
- package/dist/tools/wait/drive-handler.js +1 -1
- package/dist/tools/wait/drive-handler.js.map +1 -1
- package/dist/tools/wait/media-processor.d.ts.map +1 -1
- package/dist/tools/wait/media-processor.js +2 -2
- package/dist/tools/wait/media-processor.js.map +1 -1
- package/dist/tools/wait/message-delivery.d.ts +10 -0
- package/dist/tools/wait/message-delivery.d.ts.map +1 -1
- package/dist/tools/wait/message-delivery.js +48 -1
- package/dist/tools/wait/message-delivery.js.map +1 -1
- package/dist/tools/wait/poll-loop.d.ts.map +1 -1
- package/dist/tools/wait/poll-loop.js +18 -0
- package/dist/tools/wait/poll-loop.js.map +1 -1
- package/package.json +3 -2
- package/templates/swarm.default.md +4 -1
- package/dist/data/memory/topic-index.d.ts +0 -20
- package/dist/data/memory/topic-index.d.ts.map +0 -1
- package/dist/data/memory/topic-index.js +0 -91
- package/dist/data/memory/topic-index.js.map +0 -1
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
import { mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
1
3
|
import { log } from "../lib/logger.js";
|
|
2
|
-
import { findAliveThreadViaPidFile, isProcessAlive, killProcessTree } from "./process.service.js";
|
|
4
|
+
import { findAliveThreadViaPidFile, isProcessAlive, killProcessTree, PROCESS_LOGS_DIR, THREAD_LOGS_DIR, } from "./process.service.js";
|
|
5
|
+
import { getThreadSessionCount } from "../sessions/mcp-registry.js";
|
|
3
6
|
import { readThreadHeartbeat } from "../data/file-storage.js";
|
|
4
7
|
import { dispatchSpawn } from "./agent-spawn.service.js";
|
|
5
8
|
import { getKeepAliveThreads, getThread } from "../data/memory/thread-registry.js";
|
|
@@ -23,6 +26,95 @@ const UNKILLABLE_RENOTIFY_MS = 3_600_000; // 1 hour — re-ping the operator at
|
|
|
23
26
|
// tool calls) after startup. Used to avoid trusting a frozen pre-restart
|
|
24
27
|
// heartbeat as an "untracked live worker" and needlessly delaying restart.
|
|
25
28
|
const SERVER_START_TIME = Date.now();
|
|
29
|
+
/** DIAGNOSTIC (read-only): newest stream-json stdout log file for a thread, or null. */
|
|
30
|
+
function findLatestThreadLogFile(threadId) {
|
|
31
|
+
let files;
|
|
32
|
+
try {
|
|
33
|
+
files = readdirSync(THREAD_LOGS_DIR);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
const suffixRe = new RegExp(`_${threadId}_\\d{4}-\\d{2}-\\d{2}\\.jsonl?$`);
|
|
39
|
+
let best = null;
|
|
40
|
+
for (const file of files) {
|
|
41
|
+
if (!suffixRe.test(file))
|
|
42
|
+
continue;
|
|
43
|
+
const full = join(THREAD_LOGS_DIR, file);
|
|
44
|
+
try {
|
|
45
|
+
const mtimeMs = statSync(full).mtimeMs;
|
|
46
|
+
if (!best || mtimeMs > best.mtimeMs)
|
|
47
|
+
best = { path: full, mtimeMs };
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
/* file vanished between readdir and stat */
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return best?.path ?? null;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* DIAGNOSTIC (logging-only): capture what node knows about a STUCK thread at the
|
|
57
|
+
* moment the keeper decides to kill it, into a best-effort forensic snapshot
|
|
58
|
+
* file. Critically records whether an MCP transport still exists for the thread
|
|
59
|
+
* (still connected vs. already orphaned) and the tail of its stdout log (the
|
|
60
|
+
* last tool_use/command). Wrapped whole in try/catch — a snapshot failure must
|
|
61
|
+
* NEVER affect the kill. This runs only when the keeper has ALREADY decided the
|
|
62
|
+
* thread is stuck; it triggers no new kills.
|
|
63
|
+
*/
|
|
64
|
+
function writeWedgeSnapshot(threadId, pid, reason, heartbeat, now) {
|
|
65
|
+
try {
|
|
66
|
+
const dir = join(PROCESS_LOGS_DIR, "wedge-snapshots");
|
|
67
|
+
mkdirSync(dir, { recursive: true });
|
|
68
|
+
const lines = [];
|
|
69
|
+
lines.push(`threadId: ${threadId}`);
|
|
70
|
+
lines.push(`pid: ${pid}`);
|
|
71
|
+
lines.push(`reason: ${reason}`);
|
|
72
|
+
lines.push(`timestamp: ${new Date(now).toISOString()}`);
|
|
73
|
+
let alive;
|
|
74
|
+
try {
|
|
75
|
+
alive = isProcessAlive(pid);
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
alive = `error: ${errorMessage(err)}`;
|
|
79
|
+
}
|
|
80
|
+
lines.push(`processAlive: ${String(alive)}`);
|
|
81
|
+
let mcpSessions;
|
|
82
|
+
try {
|
|
83
|
+
mcpSessions = getThreadSessionCount(threadId);
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
mcpSessions = `error: ${errorMessage(err)}`;
|
|
87
|
+
}
|
|
88
|
+
const orphanNote = typeof mcpSessions === "number"
|
|
89
|
+
? mcpSessions > 0
|
|
90
|
+
? "still MCP-connected"
|
|
91
|
+
: "ORPHANED — no transport"
|
|
92
|
+
: "unknown";
|
|
93
|
+
lines.push(`mcpSessionsInRegistry: ${String(mcpSessions)} (${orphanNote})`);
|
|
94
|
+
lines.push(`heartbeatAgeMs: ${heartbeat !== null ? String(now - heartbeat) : "none"}`);
|
|
95
|
+
const logFile = findLatestThreadLogFile(threadId);
|
|
96
|
+
lines.push(`stdoutLog: ${logFile ?? "not found"}`);
|
|
97
|
+
if (logFile) {
|
|
98
|
+
try {
|
|
99
|
+
const tail = readFileSync(logFile, "utf-8")
|
|
100
|
+
.split(/\r?\n/)
|
|
101
|
+
.filter((l) => l.length > 0)
|
|
102
|
+
.slice(-30);
|
|
103
|
+
lines.push("--- last 30 stdout lines ---");
|
|
104
|
+
lines.push(...tail);
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
lines.push(`stdout read error: ${errorMessage(err)}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const file = join(dir, `${threadId}-${Date.now()}.txt`);
|
|
111
|
+
writeFileSync(file, lines.join("\n") + "\n", "utf-8");
|
|
112
|
+
log.info(`[wedge] Wrote stuck-thread forensic snapshot for thread ${threadId} → ${file}`);
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
log.warn(`[wedge] Failed to write forensic snapshot for thread ${threadId}: ${errorMessage(err)}`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
26
118
|
export class KeeperService {
|
|
27
119
|
deps;
|
|
28
120
|
keepers = new Map();
|
|
@@ -170,6 +262,10 @@ export class KeeperService {
|
|
|
170
262
|
catch (err) {
|
|
171
263
|
log.warn(`[keeper] Active→Stuck transition failed for ${entry.threadId}: ${errorMessage(err)}`);
|
|
172
264
|
}
|
|
265
|
+
// DIAGNOSTIC (logging-only): forensic snapshot BEFORE the kill so we can
|
|
266
|
+
// see whether the stuck agent was still MCP-connected or already orphaned,
|
|
267
|
+
// plus the tail of its stdout. Best-effort; never blocks/affects the kill.
|
|
268
|
+
writeWedgeSnapshot(entry.threadId, alivePid, reason, heartbeat, now);
|
|
173
269
|
await killProcessTree(alivePid, entry.threadId);
|
|
174
270
|
// Verify kill succeeded before restarting — if the process is still alive,
|
|
175
271
|
// do NOT spawn a second instance. Keeper will retry on the next cycle.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keeper.service.js","sourceRoot":"","sources":["../../src/services/keeper.service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"keeper.service.js","sourceRoot":"","sources":["../../src/services/keeper.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-pruning.service.d.ts","sourceRoot":"","sources":["../../src/services/memory-pruning.service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAML,KAAK,aAAa,EACnB,MAAM,iCAAiC,CAAC;AAOzC,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,QAAQ,EACZ,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAChD,OAAO,CAAC,aAAa,CAAC,
|
|
1
|
+
{"version":3,"file":"memory-pruning.service.d.ts","sourceRoot":"","sources":["../../src/services/memory-pruning.service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAML,KAAK,aAAa,EACnB,MAAM,iCAAiC,CAAC;AAOzC,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,QAAQ,EACZ,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAChD,OAAO,CAAC,aAAa,CAAC,CAoMxB"}
|
|
@@ -85,6 +85,8 @@ Return {"expire": [], "merge": []} if nothing needs pruning.`;
|
|
|
85
85
|
];
|
|
86
86
|
const parsed = await chatCompletionJson(messages, apiKey, {
|
|
87
87
|
model: process.env.CONSOLIDATION_MODEL ?? "gpt-4o",
|
|
88
|
+
// Cross-thread pruning — no originating thread to attribute this to.
|
|
89
|
+
category: "pruning",
|
|
88
90
|
maxTokens: 4096,
|
|
89
91
|
responseFormat: { type: "json_object" },
|
|
90
92
|
timeoutMs: 60_000,
|
|
@@ -112,7 +114,7 @@ Return {"expire": [], "merge": []} if nothing needs pruning.`;
|
|
|
112
114
|
details.push(`[skip-expire] ${action.noteId} not found or already expired`);
|
|
113
115
|
continue;
|
|
114
116
|
}
|
|
115
|
-
expireNote(db, action.noteId, nowStr);
|
|
117
|
+
expireNote(db, action.noteId, nowStr, "pruned");
|
|
116
118
|
expired++;
|
|
117
119
|
details.push(`[pruned] ${action.noteId}: ${action.reason}`);
|
|
118
120
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-pruning.service.js","sourceRoot":"","sources":["../../src/services/memory-pruning.service.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"memory-pruning.service.js","sourceRoot":"","sources":["../../src/services/memory-pruning.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -65,6 +65,57 @@ export declare function findAliveThreadViaPidFile(threadId: number): number | un
|
|
|
65
65
|
* Replaces the old restoreFromPidFiles() + cleanupStalePidFiles() pair.
|
|
66
66
|
*/
|
|
67
67
|
export declare function reconcileState(db: Database, threadLifecycle: ThreadLifecycleService): void;
|
|
68
|
+
export interface ProcSnapshotEntry {
|
|
69
|
+
ppid: number;
|
|
70
|
+
startMs: number;
|
|
71
|
+
}
|
|
72
|
+
export type ProcSnapshot = Map<number, ProcSnapshotEntry>;
|
|
73
|
+
interface OrphanLineageEntry {
|
|
74
|
+
ownerThreadId: number;
|
|
75
|
+
ownerPid: number;
|
|
76
|
+
ownerStartedAt?: number;
|
|
77
|
+
descendantStartMs: number;
|
|
78
|
+
}
|
|
79
|
+
export interface OrphanSweepTrackedThread {
|
|
80
|
+
threadId: number;
|
|
81
|
+
pid: number;
|
|
82
|
+
startedAt?: number;
|
|
83
|
+
alive: boolean;
|
|
84
|
+
}
|
|
85
|
+
export interface OrphanSweepResult {
|
|
86
|
+
/** Confirmed orphans that passed BOTH pid-reuse guards. */
|
|
87
|
+
orphans: {
|
|
88
|
+
pid: number;
|
|
89
|
+
ownerThreadId: number;
|
|
90
|
+
startMs: number;
|
|
91
|
+
}[];
|
|
92
|
+
/** Recorded descendants whose pid was recycled (start-time mismatch) — dropped, never killed. */
|
|
93
|
+
reusedPidsSkipped: number[];
|
|
94
|
+
/** Candidates rejected by the child-not-older-than-parent guard — never killed. */
|
|
95
|
+
olderThanParentSkipped: number[];
|
|
96
|
+
/** How many descendant lineage entries were (re)recorded this pass. */
|
|
97
|
+
recorded: number;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Pure core of the orphan sweep — no IO, no clock, fully deterministic so the
|
|
101
|
+
* pid-reuse guard and the snapshot-unavailable path can be tested directly.
|
|
102
|
+
* Mutates `lineage` in place (records new descendants, drops dead/recycled ones).
|
|
103
|
+
*/
|
|
104
|
+
export declare function computeOrphanSweep(params: {
|
|
105
|
+
snapshot: ProcSnapshot | null;
|
|
106
|
+
trackedThreads: OrphanSweepTrackedThread[];
|
|
107
|
+
lineage: Map<number, OrphanLineageEntry>;
|
|
108
|
+
protectedPids: Set<number>;
|
|
109
|
+
toleranceMs: number;
|
|
110
|
+
}): OrphanSweepResult;
|
|
111
|
+
/**
|
|
112
|
+
* Run one orphan-descendant sweep on the existing worker-cleanup cadence. Takes a
|
|
113
|
+
* single process snapshot (no new timer, no second snapshot on the hot liveness
|
|
114
|
+
* path), records lineage for live threads, and logs — or, when ORPHAN_SWEEP_KILL
|
|
115
|
+
* is set, reaps — confirmed orphans. Best-effort and self-contained; any failure
|
|
116
|
+
* degrades to doing nothing.
|
|
117
|
+
*/
|
|
118
|
+
export declare function sweepOrphanDescendants(): Promise<OrphanSweepResult>;
|
|
68
119
|
export declare function killProcessTree(pid: number, threadId: number, caller?: string, spawnedAtMs?: number): Promise<void>;
|
|
69
120
|
export {};
|
|
70
121
|
//# sourceMappingURL=process.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process.service.d.ts","sourceRoot":"","sources":["../../src/services/process.service.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEzD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAsB5E,eAAO,MAAM,iBAAiB,QAAkC,CAAC;AACjE,eAAO,MAAM,gBAAgB,QAAW,CAAC;AACzC,eAAO,MAAM,gBAAgB,QAAW,CAAC;AACzC,eAAO,MAAM,eAAe,QAA4B,CAAC;AACzD,eAAO,MAAM,gBAAgB,QAAW,CAAC;AAEzC,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,UAAU,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAClC;AAED,UAAU,YAAY;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,cAAc,EAAE,aAAa,EAAO,CAAC;AAYlD,eAAO,MAAM,gBAAgB,GAAI,UAAU,MAAM,KAAG,IAEnD,CAAC;AACF,eAAO,MAAM,eAAe,GAAI,UAAU,MAAM,KAAG,OAA4C,CAAC;AAChG,eAAO,MAAM,iBAAiB,GAAI,UAAU,MAAM,KAAG,IAEpD,CAAC;AAEF;6DAC6D;AAC7D,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAQ/D;AAED;;;;gEAIgE;AAChE,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAuBzE;
|
|
1
|
+
{"version":3,"file":"process.service.d.ts","sourceRoot":"","sources":["../../src/services/process.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -263,14 +263,17 @@ function isSameProcess(pid, startedAt) {
|
|
|
263
263
|
* `taskkill /T` fails to tear the whole tree down: a single wedged descendant
|
|
264
264
|
* can make taskkill abort the tree, so killing each PID individually lets the
|
|
265
265
|
* still-killable relatives (often including the root) go down anyway. */
|
|
266
|
-
function getWindowsProcessTreeLeafFirst(rootPid, done) {
|
|
266
|
+
function getWindowsProcessTreeLeafFirst(rootPid, threadId, done) {
|
|
267
267
|
execFile("powershell", [
|
|
268
268
|
"-NoProfile",
|
|
269
269
|
"-Command",
|
|
270
270
|
'Get-CimInstance Win32_Process | ForEach-Object { "$($_.ProcessId) $($_.ParentProcessId)" }',
|
|
271
271
|
], { encoding: "utf-8", windowsHide: true, timeout: 5000 }, (err, out) => {
|
|
272
272
|
if (err) {
|
|
273
|
-
|
|
273
|
+
// "Could not look" — distinct from "found nothing" below: the snapshot
|
|
274
|
+
// itself failed (the corporate-agent CIM failure seen on this machine),
|
|
275
|
+
// so we cannot enumerate the tree at all and fall back to the root pid.
|
|
276
|
+
log.warn(`[process] leaf-first walk pid=${rootPid} thread=${threadId}: process-tree snapshot FAILED (${errorMessage(err)}) — could NOT enumerate the tree; falling back to root pid only`);
|
|
274
277
|
done([rootPid]);
|
|
275
278
|
return;
|
|
276
279
|
}
|
|
@@ -295,6 +298,9 @@ function getWindowsProcessTreeLeafFirst(rootPid, done) {
|
|
|
295
298
|
ordered.push(pid); // post-order → leaves first, root last
|
|
296
299
|
};
|
|
297
300
|
visit(rootPid);
|
|
301
|
+
// "Found nothing" reads as "root + 0 descendant(s)" — clearly not the same
|
|
302
|
+
// as the snapshot-failed warning above.
|
|
303
|
+
log.info(`[process] leaf-first walk pid=${rootPid} thread=${threadId} enumerated ${ordered.length} process(es): root + ${ordered.length - 1} descendant(s)`);
|
|
298
304
|
done(ordered);
|
|
299
305
|
});
|
|
300
306
|
}
|
|
@@ -303,13 +309,18 @@ function getWindowsProcessTreeLeafFirst(rootPid, done) {
|
|
|
303
309
|
* tree never blocks the server event loop. */
|
|
304
310
|
function killPidsSequentiallyWin(pids, done) {
|
|
305
311
|
let i = 0;
|
|
312
|
+
let killed = 0; // taskkill invocations that returned no error (reported killed)
|
|
306
313
|
const next = () => {
|
|
307
314
|
if (i >= pids.length) {
|
|
308
|
-
done();
|
|
315
|
+
done(killed);
|
|
309
316
|
return;
|
|
310
317
|
}
|
|
311
318
|
const pid = pids[i++];
|
|
312
|
-
execFile("taskkill", ["/F", "/PID", String(pid)], { timeout: TASKKILL_TIMEOUT_MS, windowsHide: true }, () =>
|
|
319
|
+
execFile("taskkill", ["/F", "/PID", String(pid)], { timeout: TASKKILL_TIMEOUT_MS, windowsHide: true }, (err) => {
|
|
320
|
+
if (!err)
|
|
321
|
+
killed++;
|
|
322
|
+
next();
|
|
323
|
+
});
|
|
313
324
|
};
|
|
314
325
|
next();
|
|
315
326
|
}
|
|
@@ -549,6 +560,231 @@ export function reconcileState(db, threadLifecycle) {
|
|
|
549
560
|
spawnedThreads.splice(i, 1);
|
|
550
561
|
}
|
|
551
562
|
}
|
|
563
|
+
// 3. Sweep orphaned per-thread MCP config files. buildClaudeMcpConfig writes
|
|
564
|
+
// `<threadId>-mcp-config.json` (carrying the spawn token + MCP bearer auth
|
|
565
|
+
// header) on every spawn, but nothing deleted them on teardown, so they
|
|
566
|
+
// accumulated for months (hundreds of files with live secrets on disk).
|
|
567
|
+
// SAFETY RULE: a config is deleted ONLY when its thread is NOT in dbThreadMap,
|
|
568
|
+
// i.e. the thread is archived OR absent from the registry. dbThreadMap holds
|
|
569
|
+
// every non-archived row (active/exited/exiting/spawning/stuck), so any
|
|
570
|
+
// currently-running or reconnectable thread is always present and its config
|
|
571
|
+
// is never touched. This runs before the HTTP endpoint binds and before any
|
|
572
|
+
// thread is (re)spawned this instance, so it cannot race a fresh config write.
|
|
573
|
+
try {
|
|
574
|
+
for (const file of readdirSync(PIDS_DIR)) {
|
|
575
|
+
const match = /^(\d+)-mcp-config\.json$/.exec(file);
|
|
576
|
+
if (!match)
|
|
577
|
+
continue;
|
|
578
|
+
const threadId = Number(match[1]);
|
|
579
|
+
if (dbThreadMap.has(threadId))
|
|
580
|
+
continue;
|
|
581
|
+
try {
|
|
582
|
+
unlinkSync(join(PIDS_DIR, file));
|
|
583
|
+
log.info(`[reconcileState] Removed orphan MCP config for archived/absent thread ${threadId}`);
|
|
584
|
+
}
|
|
585
|
+
catch {
|
|
586
|
+
/* already gone or locked */
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
catch (err) {
|
|
591
|
+
log.warn(`[reconcileState] Failed to sweep orphan MCP configs: ${errorMessage(err)}`);
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
// descendantPid → the tracked thread it was witnessed under (in-memory: an
|
|
595
|
+
// orphan spanning a server restart is intentionally not tracked — see header).
|
|
596
|
+
const orphanLineage = new Map();
|
|
597
|
+
const orphanSnapshotBreaker = makeSnapshotBreaker("win32-process");
|
|
598
|
+
/** One `Get-CimInstance Win32_Process` snapshot giving ppid AND creation time for
|
|
599
|
+
* every pid — the only single call that yields both, which the sweep needs to
|
|
600
|
+
* walk lineage and enforce the pid-reuse guards. Async (never blocks the event
|
|
601
|
+
* loop) and behind the shared circuit breaker: on the corporate-agent failure
|
|
602
|
+
* observed on this machine it resolves null, and the sweep degrades to a no-op. */
|
|
603
|
+
function takeWindowsProcessSnapshot() {
|
|
604
|
+
return new Promise((resolve) => {
|
|
605
|
+
if (process.platform !== "win32" || orphanSnapshotBreaker.isOpen()) {
|
|
606
|
+
resolve(null);
|
|
607
|
+
return;
|
|
608
|
+
}
|
|
609
|
+
execFile("powershell", [
|
|
610
|
+
"-NoProfile",
|
|
611
|
+
"-Command",
|
|
612
|
+
'Get-CimInstance Win32_Process | ForEach-Object { try { "$($_.ProcessId) $($_.ParentProcessId) $($_.CreationDate.ToUniversalTime().Ticks)" } catch {} }',
|
|
613
|
+
], { encoding: "utf-8", windowsHide: true, timeout: 5000 }, (err, out) => {
|
|
614
|
+
if (err) {
|
|
615
|
+
orphanSnapshotBreaker.recordFailure(err);
|
|
616
|
+
resolve(null);
|
|
617
|
+
return;
|
|
618
|
+
}
|
|
619
|
+
orphanSnapshotBreaker.recordSuccess();
|
|
620
|
+
const snap = new Map();
|
|
621
|
+
for (const m of out.matchAll(/^(\d+) (\d+) (\d+)$/gm)) {
|
|
622
|
+
snap.set(Number(m[1]), {
|
|
623
|
+
ppid: Number(m[2]),
|
|
624
|
+
startMs: Math.round(Number(m[3]) / 10000 - 62135596800000), // .NET ticks → Unix ms
|
|
625
|
+
});
|
|
626
|
+
}
|
|
627
|
+
resolve(snap);
|
|
628
|
+
});
|
|
629
|
+
});
|
|
630
|
+
}
|
|
631
|
+
/**
|
|
632
|
+
* Pure core of the orphan sweep — no IO, no clock, fully deterministic so the
|
|
633
|
+
* pid-reuse guard and the snapshot-unavailable path can be tested directly.
|
|
634
|
+
* Mutates `lineage` in place (records new descendants, drops dead/recycled ones).
|
|
635
|
+
*/
|
|
636
|
+
export function computeOrphanSweep(params) {
|
|
637
|
+
const { snapshot, trackedThreads, lineage, protectedPids, toleranceMs } = params;
|
|
638
|
+
const result = {
|
|
639
|
+
orphans: [],
|
|
640
|
+
reusedPidsSkipped: [],
|
|
641
|
+
olderThanParentSkipped: [],
|
|
642
|
+
recorded: 0,
|
|
643
|
+
};
|
|
644
|
+
// Snapshot unavailable → never guess, never kill, never mutate lineage.
|
|
645
|
+
if (snapshot === null)
|
|
646
|
+
return result;
|
|
647
|
+
const aliveOwners = new Set();
|
|
648
|
+
for (const t of trackedThreads)
|
|
649
|
+
if (t.alive)
|
|
650
|
+
aliveOwners.add(t.threadId);
|
|
651
|
+
// Children adjacency, built once from the snapshot.
|
|
652
|
+
const children = new Map();
|
|
653
|
+
for (const [pid, e] of snapshot) {
|
|
654
|
+
const list = children.get(e.ppid);
|
|
655
|
+
if (list)
|
|
656
|
+
list.push(pid);
|
|
657
|
+
else
|
|
658
|
+
children.set(e.ppid, [pid]);
|
|
659
|
+
}
|
|
660
|
+
// Step A — witness lineage: record every descendant of each ALIVE tracked
|
|
661
|
+
// thread while its subtree chain is still intact. Excludes the root pid itself
|
|
662
|
+
// (that thread is managed by the worker-cleanup path, not here).
|
|
663
|
+
for (const t of trackedThreads) {
|
|
664
|
+
if (!t.alive || !snapshot.has(t.pid))
|
|
665
|
+
continue;
|
|
666
|
+
const seen = new Set([t.pid]);
|
|
667
|
+
const stack = [...(children.get(t.pid) ?? [])];
|
|
668
|
+
while (stack.length) {
|
|
669
|
+
const d = stack.pop();
|
|
670
|
+
if (seen.has(d))
|
|
671
|
+
continue; // cycle / pid-reuse loop guard
|
|
672
|
+
seen.add(d);
|
|
673
|
+
const e = snapshot.get(d);
|
|
674
|
+
if (!e)
|
|
675
|
+
continue;
|
|
676
|
+
lineage.set(d, {
|
|
677
|
+
ownerThreadId: t.threadId,
|
|
678
|
+
ownerPid: t.pid,
|
|
679
|
+
ownerStartedAt: t.startedAt,
|
|
680
|
+
descendantStartMs: e.startMs,
|
|
681
|
+
});
|
|
682
|
+
result.recorded++;
|
|
683
|
+
for (const c of children.get(d) ?? [])
|
|
684
|
+
if (!seen.has(c))
|
|
685
|
+
stack.push(c);
|
|
686
|
+
}
|
|
687
|
+
}
|
|
688
|
+
// Step B — evaluate: a recorded descendant whose owner is no longer alive is an
|
|
689
|
+
// orphan candidate, subject to both pid-reuse guards.
|
|
690
|
+
for (const [pid, entry] of [...lineage]) {
|
|
691
|
+
// Prune a descendant that has left the process table FIRST, before the
|
|
692
|
+
// owner-liveness check — otherwise a dead descendant of a still-live owner is
|
|
693
|
+
// never evaluated here (its owner short-circuits below) and never re-recorded
|
|
694
|
+
// by Step A (it is gone), so it lingers in `lineage` for the owner's entire
|
|
695
|
+
// lifetime. A long-lived thread that churns many short-lived children (e.g. a
|
|
696
|
+
// claude-agent spawning a bash.exe per hook) would grow the map without bound.
|
|
697
|
+
const cur = snapshot.get(pid);
|
|
698
|
+
if (!cur) {
|
|
699
|
+
lineage.delete(pid); // descendant already gone — nothing to reap
|
|
700
|
+
continue;
|
|
701
|
+
}
|
|
702
|
+
if (aliveOwners.has(entry.ownerThreadId))
|
|
703
|
+
continue; // owner still alive → not orphaned
|
|
704
|
+
// Never touch a pid managed elsewhere (a live tracked thread, the server, us).
|
|
705
|
+
if (protectedPids.has(pid))
|
|
706
|
+
continue;
|
|
707
|
+
// GUARD 1 — same-process: a recycled pid now hosts a different process whose
|
|
708
|
+
// creation time differs from the one we recorded. Drop it; do NOT kill.
|
|
709
|
+
if (Math.abs(cur.startMs - entry.descendantStartMs) > toleranceMs) {
|
|
710
|
+
lineage.delete(pid);
|
|
711
|
+
result.reusedPidsSkipped.push(pid);
|
|
712
|
+
continue;
|
|
713
|
+
}
|
|
714
|
+
// GUARD 2 — a child cannot predate its parent. If this pid started before the
|
|
715
|
+
// owning thread did, it is not really our descendant (recorded owner is wrong
|
|
716
|
+
// or the pid was reused across the boundary). Keep it for logging, never kill.
|
|
717
|
+
if (entry.ownerStartedAt !== undefined && cur.startMs < entry.ownerStartedAt - toleranceMs) {
|
|
718
|
+
result.olderThanParentSkipped.push(pid);
|
|
719
|
+
continue;
|
|
720
|
+
}
|
|
721
|
+
result.orphans.push({ pid, ownerThreadId: entry.ownerThreadId, startMs: cur.startMs });
|
|
722
|
+
}
|
|
723
|
+
return result;
|
|
724
|
+
}
|
|
725
|
+
/** True when the sweep is allowed to actually kill confirmed orphans. Default is
|
|
726
|
+
* log-only (see header): a week of real candidate logs comes first. */
|
|
727
|
+
function orphanSweepWillKill() {
|
|
728
|
+
const v = process.env.ORPHAN_SWEEP_KILL;
|
|
729
|
+
return v === "1" || v === "true";
|
|
730
|
+
}
|
|
731
|
+
/**
|
|
732
|
+
* Run one orphan-descendant sweep on the existing worker-cleanup cadence. Takes a
|
|
733
|
+
* single process snapshot (no new timer, no second snapshot on the hot liveness
|
|
734
|
+
* path), records lineage for live threads, and logs — or, when ORPHAN_SWEEP_KILL
|
|
735
|
+
* is set, reaps — confirmed orphans. Best-effort and self-contained; any failure
|
|
736
|
+
* degrades to doing nothing.
|
|
737
|
+
*/
|
|
738
|
+
export async function sweepOrphanDescendants() {
|
|
739
|
+
const snapshot = await takeWindowsProcessSnapshot();
|
|
740
|
+
if (snapshot === null) {
|
|
741
|
+
log.debug("[orphan-sweep] process snapshot unavailable — skipping (never kill on partial data)");
|
|
742
|
+
return { orphans: [], reusedPidsSkipped: [], olderThanParentSkipped: [], recorded: 0 };
|
|
743
|
+
}
|
|
744
|
+
const trackedThreads = readPidFiles().map((e) => ({
|
|
745
|
+
threadId: e.threadId,
|
|
746
|
+
pid: e.pid,
|
|
747
|
+
startedAt: e.startedAt,
|
|
748
|
+
alive: isProcessAlive(e.pid, e.startedAt) && isSameProcess(e.pid, e.startedAt),
|
|
749
|
+
}));
|
|
750
|
+
// Protected: every live tracked-thread pid (managed by worker-cleanup), the
|
|
751
|
+
// authoritative server pid, and our own pid — these are never orphan targets.
|
|
752
|
+
const protectedPids = new Set([process.pid]);
|
|
753
|
+
const serverPid = readServerPid();
|
|
754
|
+
if (serverPid !== undefined)
|
|
755
|
+
protectedPids.add(serverPid);
|
|
756
|
+
for (const t of trackedThreads)
|
|
757
|
+
if (t.alive)
|
|
758
|
+
protectedPids.add(t.pid);
|
|
759
|
+
const result = computeOrphanSweep({
|
|
760
|
+
snapshot,
|
|
761
|
+
trackedThreads,
|
|
762
|
+
lineage: orphanLineage,
|
|
763
|
+
protectedPids,
|
|
764
|
+
toleranceMs: PID_IDENTITY_TOLERANCE_MS,
|
|
765
|
+
});
|
|
766
|
+
for (const pid of result.reusedPidsSkipped)
|
|
767
|
+
log.debug(`[orphan-sweep] pid ${pid} recycled since we recorded it — dropped, not killed`);
|
|
768
|
+
for (const pid of result.olderThanParentSkipped)
|
|
769
|
+
log.warn(`[orphan-sweep] pid ${pid} is older than its recorded owner — refusing to kill`);
|
|
770
|
+
const willKill = orphanSweepWillKill();
|
|
771
|
+
for (const orphan of result.orphans) {
|
|
772
|
+
if (!willKill) {
|
|
773
|
+
log.warn(`[orphan-sweep] CANDIDATE (log-only): pid ${orphan.pid} orphaned from dead thread ${orphan.ownerThreadId} — set ORPHAN_SWEEP_KILL=1 to reap`);
|
|
774
|
+
continue;
|
|
775
|
+
}
|
|
776
|
+
log.warn(`[orphan-sweep] REAPING orphan pid ${orphan.pid} (owner thread ${orphan.ownerThreadId} is dead)`);
|
|
777
|
+
try {
|
|
778
|
+
await killProcessTree(orphan.pid, orphan.ownerThreadId, "orphan-sweep", orphan.startMs);
|
|
779
|
+
}
|
|
780
|
+
catch (err) {
|
|
781
|
+
log.warn(`[orphan-sweep] kill of orphan pid ${orphan.pid} failed: ${errorMessage(err)}`);
|
|
782
|
+
}
|
|
783
|
+
finally {
|
|
784
|
+
orphanLineage.delete(orphan.pid);
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
return result;
|
|
552
788
|
}
|
|
553
789
|
// taskkill on a WEDGED process tree (e.g. a quota-stuck agent whose child
|
|
554
790
|
// node/bash/git processes sit in blocking IO) can take well over 10s to force
|
|
@@ -627,9 +863,13 @@ export function killProcessTree(pid, threadId, caller, spawnedAtMs) {
|
|
|
627
863
|
// `taskkill /T` walks the tree top-down and can stall when a hung child
|
|
628
864
|
// blocks the parent's termination — the exact case where the root sat
|
|
629
865
|
// alive for hours. Kill each descendant leaves-first so a wedged child is
|
|
630
|
-
// reaped before its parent, freeing the root to die.
|
|
631
|
-
|
|
632
|
-
|
|
866
|
+
// reaped before its parent, freeing the root to die. Logged at info (from
|
|
867
|
+
// entry through kill count) so a week of logs can answer whether this
|
|
868
|
+
// escalation path ever actually runs, or is dead weight.
|
|
869
|
+
log.info(`[process] leaf-first kill ESCALATION entered for pid=${pid} thread=${threadId} (attempt ${attempt}) — taskkill /F /T did not verify-dead`);
|
|
870
|
+
getWindowsProcessTreeLeafFirst(pid, threadId, (tree) => {
|
|
871
|
+
killPidsSequentiallyWin(tree, (killed) => {
|
|
872
|
+
log.info(`[process] leaf-first escalation for pid=${pid} thread=${threadId}: issued taskkill to ${tree.length} process(es), ${killed} reported killed`);
|
|
633
873
|
setTimeout(() => verifyDead(attempt + 1), 1000);
|
|
634
874
|
});
|
|
635
875
|
});
|