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.
Files changed (178) hide show
  1. package/Install-Sensorium.ps1 +113 -20
  2. package/dist/config/agent-settings.d.ts +7 -0
  3. package/dist/config/agent-settings.d.ts.map +1 -1
  4. package/dist/config/agent-settings.js +14 -0
  5. package/dist/config/agent-settings.js.map +1 -1
  6. package/dist/dashboard/log-parser.d.ts +3 -0
  7. package/dist/dashboard/log-parser.d.ts.map +1 -1
  8. package/dist/dashboard/log-parser.js +38 -4
  9. package/dist/dashboard/log-parser.js.map +1 -1
  10. package/dist/dashboard/routes/claude.d.ts.map +1 -1
  11. package/dist/dashboard/routes/claude.js +9 -1
  12. package/dist/dashboard/routes/claude.js.map +1 -1
  13. package/dist/dashboard/routes/threads.js +1 -1
  14. package/dist/dashboard/routes/threads.js.map +1 -1
  15. package/dist/dashboard/spa.html +11 -11
  16. package/dist/data/memory/bootstrap.d.ts +7 -0
  17. package/dist/data/memory/bootstrap.d.ts.map +1 -1
  18. package/dist/data/memory/bootstrap.js +45 -16
  19. package/dist/data/memory/bootstrap.js.map +1 -1
  20. package/dist/data/memory/consolidation.d.ts +9 -4
  21. package/dist/data/memory/consolidation.d.ts.map +1 -1
  22. package/dist/data/memory/consolidation.js +24 -12
  23. package/dist/data/memory/consolidation.js.map +1 -1
  24. package/dist/data/memory/index.d.ts +1 -2
  25. package/dist/data/memory/index.d.ts.map +1 -1
  26. package/dist/data/memory/index.js +1 -2
  27. package/dist/data/memory/index.js.map +1 -1
  28. package/dist/data/memory/migration-runner.d.ts +24 -1
  29. package/dist/data/memory/migration-runner.d.ts.map +1 -1
  30. package/dist/data/memory/migration-runner.js +85 -1
  31. package/dist/data/memory/migration-runner.js.map +1 -1
  32. package/dist/data/memory/narrative.d.ts.map +1 -1
  33. package/dist/data/memory/narrative.js +5 -1
  34. package/dist/data/memory/narrative.js.map +1 -1
  35. package/dist/data/memory/note-archival.d.ts +29 -4
  36. package/dist/data/memory/note-archival.d.ts.map +1 -1
  37. package/dist/data/memory/note-archival.js +55 -26
  38. package/dist/data/memory/note-archival.js.map +1 -1
  39. package/dist/data/memory/reflection-dedup.js +2 -2
  40. package/dist/data/memory/reflection-dedup.js.map +1 -1
  41. package/dist/data/memory/reflection.d.ts.map +1 -1
  42. package/dist/data/memory/reflection.js +7 -3
  43. package/dist/data/memory/reflection.js.map +1 -1
  44. package/dist/data/memory/schema-ddl.d.ts +1 -1
  45. package/dist/data/memory/schema-ddl.d.ts.map +1 -1
  46. package/dist/data/memory/schema-ddl.js +8 -8
  47. package/dist/data/memory/semantic-notes.d.ts +30 -2
  48. package/dist/data/memory/semantic-notes.d.ts.map +1 -1
  49. package/dist/data/memory/semantic-notes.js +94 -13
  50. package/dist/data/memory/semantic-notes.js.map +1 -1
  51. package/dist/data/memory/semantic-search.d.ts.map +1 -1
  52. package/dist/data/memory/semantic-search.js +6 -4
  53. package/dist/data/memory/semantic-search.js.map +1 -1
  54. package/dist/data/memory/thread-registry.d.ts.map +1 -1
  55. package/dist/data/memory/thread-registry.js +20 -4
  56. package/dist/data/memory/thread-registry.js.map +1 -1
  57. package/dist/data/memory/topic-shift.js +2 -2
  58. package/dist/data/memory/topic-shift.js.map +1 -1
  59. package/dist/index.js +19 -9
  60. package/dist/index.js.map +1 -1
  61. package/dist/integrations/openai/chat.d.ts +7 -1
  62. package/dist/integrations/openai/chat.d.ts.map +1 -1
  63. package/dist/integrations/openai/chat.js +19 -2
  64. package/dist/integrations/openai/chat.js.map +1 -1
  65. package/dist/integrations/openai/speech.d.ts +4 -1
  66. package/dist/integrations/openai/speech.d.ts.map +1 -1
  67. package/dist/integrations/openai/speech.js +6 -1
  68. package/dist/integrations/openai/speech.js.map +1 -1
  69. package/dist/integrations/telegram/types.d.ts +9 -0
  70. package/dist/integrations/telegram/types.d.ts.map +1 -1
  71. package/dist/lib/markdown.d.ts +0 -13
  72. package/dist/lib/markdown.d.ts.map +1 -1
  73. package/dist/lib/markdown.js +45 -0
  74. package/dist/lib/markdown.js.map +1 -1
  75. package/dist/lib/usage-metering/index.d.ts +13 -0
  76. package/dist/lib/usage-metering/index.d.ts.map +1 -0
  77. package/dist/lib/usage-metering/index.js +10 -0
  78. package/dist/lib/usage-metering/index.js.map +1 -0
  79. package/dist/lib/usage-metering/meter.d.ts +34 -0
  80. package/dist/lib/usage-metering/meter.d.ts.map +1 -0
  81. package/dist/lib/usage-metering/meter.js +28 -0
  82. package/dist/lib/usage-metering/meter.js.map +1 -0
  83. package/dist/lib/usage-metering/pricing.d.ts +39 -0
  84. package/dist/lib/usage-metering/pricing.d.ts.map +1 -0
  85. package/dist/lib/usage-metering/pricing.js +49 -0
  86. package/dist/lib/usage-metering/pricing.js.map +1 -0
  87. package/dist/lib/usage-metering/sink.d.ts +24 -0
  88. package/dist/lib/usage-metering/sink.d.ts.map +1 -0
  89. package/dist/lib/usage-metering/sink.js +56 -0
  90. package/dist/lib/usage-metering/sink.js.map +1 -0
  91. package/dist/server/factory.js +12 -9
  92. package/dist/server/factory.js.map +1 -1
  93. package/dist/server/http-server.d.ts +1 -0
  94. package/dist/server/http-server.d.ts.map +1 -1
  95. package/dist/server/http-server.js +45 -3
  96. package/dist/server/http-server.js.map +1 -1
  97. package/dist/services/background-runner.d.ts.map +1 -1
  98. package/dist/services/background-runner.js +11 -1
  99. package/dist/services/background-runner.js.map +1 -1
  100. package/dist/services/claude-spawn.service.d.ts.map +1 -1
  101. package/dist/services/claude-spawn.service.js +78 -4
  102. package/dist/services/claude-spawn.service.js.map +1 -1
  103. package/dist/services/codex-spawn.service.d.ts.map +1 -1
  104. package/dist/services/codex-spawn.service.js.map +1 -1
  105. package/dist/services/consolidation.service.d.ts.map +1 -1
  106. package/dist/services/consolidation.service.js +51 -35
  107. package/dist/services/consolidation.service.js.map +1 -1
  108. package/dist/services/copilot-spawn.service.d.ts.map +1 -1
  109. package/dist/services/copilot-spawn.service.js +8 -1
  110. package/dist/services/copilot-spawn.service.js.map +1 -1
  111. package/dist/services/dispatcher/broker.d.ts +6 -0
  112. package/dist/services/dispatcher/broker.d.ts.map +1 -1
  113. package/dist/services/dispatcher/broker.js.map +1 -1
  114. package/dist/services/dispatcher/poller.d.ts.map +1 -1
  115. package/dist/services/dispatcher/poller.js +15 -0
  116. package/dist/services/dispatcher/poller.js.map +1 -1
  117. package/dist/services/keeper.service.d.ts.map +1 -1
  118. package/dist/services/keeper.service.js +97 -1
  119. package/dist/services/keeper.service.js.map +1 -1
  120. package/dist/services/memory-pruning.service.d.ts.map +1 -1
  121. package/dist/services/memory-pruning.service.js +3 -1
  122. package/dist/services/memory-pruning.service.js.map +1 -1
  123. package/dist/services/process.service.d.ts +51 -0
  124. package/dist/services/process.service.d.ts.map +1 -1
  125. package/dist/services/process.service.js +247 -7
  126. package/dist/services/process.service.js.map +1 -1
  127. package/dist/services/spawn-common.d.ts.map +1 -1
  128. package/dist/services/spawn-common.js +9 -2
  129. package/dist/services/spawn-common.js.map +1 -1
  130. package/dist/services/thread-config.service.d.ts.map +1 -1
  131. package/dist/services/thread-config.service.js +1 -1
  132. package/dist/services/thread-config.service.js.map +1 -1
  133. package/dist/services/thread-health.service.d.ts +19 -1
  134. package/dist/services/thread-health.service.d.ts.map +1 -1
  135. package/dist/services/thread-health.service.js +74 -4
  136. package/dist/services/thread-health.service.js.map +1 -1
  137. package/dist/services/thread-lifecycle.service.d.ts.map +1 -1
  138. package/dist/services/thread-lifecycle.service.js +5 -0
  139. package/dist/services/thread-lifecycle.service.js.map +1 -1
  140. package/dist/services/worker-cleanup.service.d.ts +12 -0
  141. package/dist/services/worker-cleanup.service.d.ts.map +1 -1
  142. package/dist/services/worker-cleanup.service.js +281 -70
  143. package/dist/services/worker-cleanup.service.js.map +1 -1
  144. package/dist/sessions/mcp-registry.d.ts +6 -0
  145. package/dist/sessions/mcp-registry.d.ts.map +1 -1
  146. package/dist/sessions/mcp-registry.js +8 -0
  147. package/dist/sessions/mcp-registry.js.map +1 -1
  148. package/dist/tools/defs/session-defs.d.ts.map +1 -1
  149. package/dist/tools/defs/session-defs.js +20 -2
  150. package/dist/tools/defs/session-defs.js.map +1 -1
  151. package/dist/tools/delegate-tool.d.ts.map +1 -1
  152. package/dist/tools/delegate-tool.js +84 -4
  153. package/dist/tools/delegate-tool.js.map +1 -1
  154. package/dist/tools/memory-tools.d.ts +1 -1
  155. package/dist/tools/memory-tools.d.ts.map +1 -1
  156. package/dist/tools/memory-tools.js +4 -4
  157. package/dist/tools/memory-tools.js.map +1 -1
  158. package/dist/tools/utility-tools.d.ts.map +1 -1
  159. package/dist/tools/utility-tools.js +1 -1
  160. package/dist/tools/utility-tools.js.map +1 -1
  161. package/dist/tools/wait/drive-handler.js +1 -1
  162. package/dist/tools/wait/drive-handler.js.map +1 -1
  163. package/dist/tools/wait/media-processor.d.ts.map +1 -1
  164. package/dist/tools/wait/media-processor.js +2 -2
  165. package/dist/tools/wait/media-processor.js.map +1 -1
  166. package/dist/tools/wait/message-delivery.d.ts +10 -0
  167. package/dist/tools/wait/message-delivery.d.ts.map +1 -1
  168. package/dist/tools/wait/message-delivery.js +48 -1
  169. package/dist/tools/wait/message-delivery.js.map +1 -1
  170. package/dist/tools/wait/poll-loop.d.ts.map +1 -1
  171. package/dist/tools/wait/poll-loop.js +18 -0
  172. package/dist/tools/wait/poll-loop.js.map +1 -1
  173. package/package.json +3 -2
  174. package/templates/swarm.default.md +4 -1
  175. package/dist/data/memory/topic-index.d.ts +0 -20
  176. package/dist/data/memory/topic-index.d.ts.map +0 -1
  177. package/dist/data/memory/topic-index.js +0 -91
  178. 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,CAkMxB"}
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;AAyRD,wBAAgB,YAAY,IAAI,YAAY,EAAE,CAiC7C;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CA8B3E;AAED,eAAO,MAAM,eAAe,GAAI,UAAU,MAAM,KAAG,OACV,CAAC;AAE1C,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAW7C;AAED,wBAAgB,UAAU,IAAI,IAAI,CAMjC;AAED;;;;;;;uCAOuC;AACvC,wBAAgB,kBAAkB,IAAI,IAAI,CAsBzC;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAY9E;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE,sBAAsB,GAAG,IAAI,CAuF1F;AAUD,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAuHf"}
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
- log.debug(`[process] process-tree snapshot failed: ${errorMessage(err)} — falling back to root only`);
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 }, () => next());
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
- getWindowsProcessTreeLeafFirst(pid, (tree) => {
632
- killPidsSequentiallyWin(tree, () => {
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
  });