agentvigil 1.0.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/LICENSE +21 -0
- package/README.md +76 -0
- package/dist/commands/autostart.d.ts +3 -0
- package/dist/commands/autostart.d.ts.map +1 -0
- package/dist/commands/autostart.js +57 -0
- package/dist/commands/autostart.js.map +1 -0
- package/dist/commands/daemon.d.ts +31 -0
- package/dist/commands/daemon.d.ts.map +1 -0
- package/dist/commands/daemon.js +131 -0
- package/dist/commands/daemon.js.map +1 -0
- package/dist/commands/setup.d.ts +5 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +158 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/start.d.ts +2 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +89 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/uninstall.d.ts +7 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +13 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/crypto/encryption.d.ts +11 -0
- package/dist/crypto/encryption.d.ts.map +1 -0
- package/dist/crypto/encryption.js +57 -0
- package/dist/crypto/encryption.js.map +1 -0
- package/dist/hooks/hook-handler.d.ts +18 -0
- package/dist/hooks/hook-handler.d.ts.map +1 -0
- package/dist/hooks/hook-handler.js +256 -0
- package/dist/hooks/hook-handler.js.map +1 -0
- package/dist/hooks/hook-manager.d.ts +22 -0
- package/dist/hooks/hook-manager.d.ts.map +1 -0
- package/dist/hooks/hook-manager.js +133 -0
- package/dist/hooks/hook-manager.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +88 -0
- package/dist/index.js.map +1 -0
- package/dist/notifications/fcm-client.d.ts +15 -0
- package/dist/notifications/fcm-client.d.ts.map +1 -0
- package/dist/notifications/fcm-client.js +72 -0
- package/dist/notifications/fcm-client.js.map +1 -0
- package/dist/notifications/ntfy-client.d.ts +6 -0
- package/dist/notifications/ntfy-client.d.ts.map +1 -0
- package/dist/notifications/ntfy-client.js +51 -0
- package/dist/notifications/ntfy-client.js.map +1 -0
- package/dist/relay/relay-handler.d.ts +51 -0
- package/dist/relay/relay-handler.d.ts.map +1 -0
- package/dist/relay/relay-handler.js +325 -0
- package/dist/relay/relay-handler.js.map +1 -0
- package/dist/sessions/keystroke-injector.d.ts +4 -0
- package/dist/sessions/keystroke-injector.d.ts.map +1 -0
- package/dist/sessions/keystroke-injector.js +216 -0
- package/dist/sessions/keystroke-injector.js.map +1 -0
- package/dist/sessions/process-detector.d.ts +27 -0
- package/dist/sessions/process-detector.d.ts.map +1 -0
- package/dist/sessions/process-detector.js +180 -0
- package/dist/sessions/process-detector.js.map +1 -0
- package/dist/sessions/session-manager.d.ts +37 -0
- package/dist/sessions/session-manager.d.ts.map +1 -0
- package/dist/sessions/session-manager.js +90 -0
- package/dist/sessions/session-manager.js.map +1 -0
- package/dist/sessions/session-poller.d.ts +18 -0
- package/dist/sessions/session-poller.d.ts.map +1 -0
- package/dist/sessions/session-poller.js +73 -0
- package/dist/sessions/session-poller.js.map +1 -0
- package/dist/sessions/session-watcher.d.ts +20 -0
- package/dist/sessions/session-watcher.d.ts.map +1 -0
- package/dist/sessions/session-watcher.js +71 -0
- package/dist/sessions/session-watcher.js.map +1 -0
- package/dist/sessions/tmux-bridge.d.ts +11 -0
- package/dist/sessions/tmux-bridge.d.ts.map +1 -0
- package/dist/sessions/tmux-bridge.js +67 -0
- package/dist/sessions/tmux-bridge.js.map +1 -0
- package/dist/tunnel/tunnel-manager.d.ts +8 -0
- package/dist/tunnel/tunnel-manager.d.ts.map +1 -0
- package/dist/tunnel/tunnel-manager.js +57 -0
- package/dist/tunnel/tunnel-manager.js.map +1 -0
- package/dist/tunnel/websocket-server.d.ts +48 -0
- package/dist/tunnel/websocket-server.d.ts.map +1 -0
- package/dist/tunnel/websocket-server.js +173 -0
- package/dist/tunnel/websocket-server.js.map +1 -0
- package/dist/types.d.ts +37 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/config.d.ts +23 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +54 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/logger.d.ts +9 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +11 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/qr.d.ts +19 -0
- package/dist/utils/qr.d.ts.map +1 -0
- package/dist/utils/qr.js +17 -0
- package/dist/utils/qr.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay-handler.js","sourceRoot":"","sources":["../../src/relay/relay-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function approvePermission(sessionId: string): Promise<boolean>;
|
|
2
|
+
export declare function denyPermission(sessionId: string): Promise<boolean>;
|
|
3
|
+
export declare function sendPromptToSession(sessionId: string, text: string): Promise<boolean>;
|
|
4
|
+
//# sourceMappingURL=keystroke-injector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keystroke-injector.d.ts","sourceRoot":"","sources":["../../src/sessions/keystroke-injector.ts"],"names":[],"mappings":"AAcA,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE3E;AAED,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAExE;AAED,wBAAsB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE3F"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { logger } from '../utils/logger.js';
|
|
3
|
+
import { getSession, updateSession } from './session-manager.js';
|
|
4
|
+
function run(cmd, args) {
|
|
5
|
+
return new Promise((resolve, reject) => {
|
|
6
|
+
execFile(cmd, args, (error, stdout) => {
|
|
7
|
+
if (error)
|
|
8
|
+
reject(error);
|
|
9
|
+
else
|
|
10
|
+
resolve(stdout);
|
|
11
|
+
});
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
// The permission prompt is a numbered menu — option 1 is "Yes", option 3 is "No".
|
|
15
|
+
export async function approvePermission(sessionId) {
|
|
16
|
+
return injectText(sessionId, '1');
|
|
17
|
+
}
|
|
18
|
+
export async function denyPermission(sessionId) {
|
|
19
|
+
return injectText(sessionId, '3');
|
|
20
|
+
}
|
|
21
|
+
export async function sendPromptToSession(sessionId, text) {
|
|
22
|
+
return injectText(sessionId, text);
|
|
23
|
+
}
|
|
24
|
+
async function getTtyForPid(pid) {
|
|
25
|
+
try {
|
|
26
|
+
const raw = await run('ps', ['-p', pid, '-o', 'tty=']);
|
|
27
|
+
const tty = raw.trim();
|
|
28
|
+
if (!tty || tty === '?' || tty === '??')
|
|
29
|
+
return null;
|
|
30
|
+
return tty.startsWith('/dev/') ? tty : `/dev/${tty}`;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
async function injectText(sessionId, text) {
|
|
37
|
+
const session = getSession(sessionId);
|
|
38
|
+
if (!session) {
|
|
39
|
+
logger.error(`Cannot inject — session ${sessionId} not found`);
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
const pid = session.pid;
|
|
43
|
+
if (!pid) {
|
|
44
|
+
logger.error(`Cannot inject — session ${session.project_name} has no pid`);
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
logger.info(`Injecting "${text}" into ${session.project_name} (pid ${pid})`);
|
|
48
|
+
const strategies = [
|
|
49
|
+
['tmux', () => injectViaTmux(pid, session.tmux_pane_id, sessionId, text)],
|
|
50
|
+
['iTerm2', () => injectViaITerm2(pid, text)],
|
|
51
|
+
['Terminal.app', () => injectViaTerminalApp(pid, text)],
|
|
52
|
+
['tty-write', () => injectViaTtyWrite(pid, text)],
|
|
53
|
+
];
|
|
54
|
+
for (const [name, strategy] of strategies) {
|
|
55
|
+
try {
|
|
56
|
+
const ok = await strategy();
|
|
57
|
+
if (ok) {
|
|
58
|
+
logger.success(`Keystroke injected into ${session.project_name} (via ${name})`);
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
logger.dim(`${name} strategy failed: ${err}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
await sendMacNotificationFallback(session.project_name, text);
|
|
67
|
+
logger.warn(`All injection strategies failed for ${session.project_name}`);
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
// ── Strategy 1: tmux send-keys ────────────────────────────────────────────────
|
|
71
|
+
async function injectViaTmux(pid, storedPaneId, sessionId, text) {
|
|
72
|
+
try {
|
|
73
|
+
await run('which', ['tmux']);
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
// Fast path: use cached pane ID
|
|
79
|
+
if (storedPaneId) {
|
|
80
|
+
try {
|
|
81
|
+
await run('tmux', ['send-keys', '-t', storedPaneId, text, 'Enter']);
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
logger.dim(`Cached tmux pane ${storedPaneId} is stale — scanning all panes`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Slow path: find the pane whose pid matches this process
|
|
89
|
+
try {
|
|
90
|
+
const out = await run('tmux', ['list-panes', '-a', '-F', '#{pane_id}|#{pane_pid}']);
|
|
91
|
+
for (const line of out.trim().split('\n')) {
|
|
92
|
+
const [paneId, panePid] = line.split('|');
|
|
93
|
+
if (panePid?.trim() === pid && paneId?.trim()) {
|
|
94
|
+
await run('tmux', ['send-keys', '-t', paneId.trim(), text, 'Enter']);
|
|
95
|
+
updateSession(sessionId, { tmux_pane_id: paneId.trim() });
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch { }
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
// ── Strategy 2: iTerm2 AppleScript ───────────────────────────────────────────
|
|
104
|
+
// iTerm2's `write text` injects directly into the PTY without needing focus.
|
|
105
|
+
async function injectViaITerm2(pid, text) {
|
|
106
|
+
try {
|
|
107
|
+
const out = await run('pgrep', ['-x', 'iTerm2']);
|
|
108
|
+
if (!out.trim())
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
const tty = await getTtyForPid(pid);
|
|
115
|
+
if (!tty)
|
|
116
|
+
return false;
|
|
117
|
+
const safe = text.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
|
|
118
|
+
const script = `tell application "iTerm2"
|
|
119
|
+
repeat with w in windows
|
|
120
|
+
repeat with t in tabs of w
|
|
121
|
+
repeat with s in sessions of t
|
|
122
|
+
if tty of s is "${tty}" then
|
|
123
|
+
tell s to write text "${safe}"
|
|
124
|
+
return "ok"
|
|
125
|
+
end if
|
|
126
|
+
end repeat
|
|
127
|
+
end repeat
|
|
128
|
+
end repeat
|
|
129
|
+
end tell`;
|
|
130
|
+
try {
|
|
131
|
+
await run('osascript', ['-e', script]);
|
|
132
|
+
return true;
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// ── Strategy 3: Terminal.app via AppleScript + System Events ─────────────────
|
|
139
|
+
// Finds the tab by TTY, focuses it, then sends keystrokes via System Events.
|
|
140
|
+
// Brings the Terminal window to the front — the visible side-effect is
|
|
141
|
+
// intentional: the user sees the injection happen.
|
|
142
|
+
async function injectViaTerminalApp(pid, text) {
|
|
143
|
+
try {
|
|
144
|
+
const out = await run('pgrep', ['-x', 'Terminal']);
|
|
145
|
+
if (!out.trim())
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
const tty = await getTtyForPid(pid);
|
|
152
|
+
if (!tty)
|
|
153
|
+
return false;
|
|
154
|
+
const safe = text.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
|
|
155
|
+
// key code 36 = Return in System Events
|
|
156
|
+
const script = `tell application "Terminal"
|
|
157
|
+
repeat with w in windows
|
|
158
|
+
repeat with t in tabs of w
|
|
159
|
+
if tty of t is "${tty}" then
|
|
160
|
+
set selected of t to true
|
|
161
|
+
set frontmost of w to true
|
|
162
|
+
tell application "System Events"
|
|
163
|
+
tell process "Terminal"
|
|
164
|
+
keystroke "${safe}"
|
|
165
|
+
key code 36
|
|
166
|
+
end tell
|
|
167
|
+
end tell
|
|
168
|
+
return "ok"
|
|
169
|
+
end if
|
|
170
|
+
end repeat
|
|
171
|
+
end repeat
|
|
172
|
+
end tell`;
|
|
173
|
+
try {
|
|
174
|
+
await run('osascript', ['-e', script]);
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// ── Strategy 4: Python TIOCSTI — write into the TTY input queue ──────────────
|
|
182
|
+
// Injects characters directly into the terminal's input buffer using the
|
|
183
|
+
// TIOCSTI ioctl. Works for any terminal emulator when we own the TTY (same
|
|
184
|
+
// user). No window focus required.
|
|
185
|
+
async function injectViaTtyWrite(pid, text) {
|
|
186
|
+
const tty = await getTtyForPid(pid);
|
|
187
|
+
if (!tty)
|
|
188
|
+
return false;
|
|
189
|
+
const safe = text.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
|
|
190
|
+
const py = [
|
|
191
|
+
'import fcntl, termios, struct',
|
|
192
|
+
`chars = "${safe}\\n"`,
|
|
193
|
+
`f = open("${tty}", "r+b")`,
|
|
194
|
+
'[fcntl.ioctl(f, termios.TIOCSTI, struct.pack("B", c)) for c in chars.encode("utf-8")]',
|
|
195
|
+
'f.close()',
|
|
196
|
+
].join('; ');
|
|
197
|
+
try {
|
|
198
|
+
await run('python3', ['-c', py]);
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
// ── Notification fallback ─────────────────────────────────────────────────────
|
|
206
|
+
async function sendMacNotificationFallback(projectName, text) {
|
|
207
|
+
const key = text === '1' ? "'1'" : text === '3' ? "'3'" : `"${text}"`;
|
|
208
|
+
const action = text === '1' ? 'approve' : text === '3' ? 'deny' : 'respond';
|
|
209
|
+
const title = `AgentVigil — ${projectName}`.replace(/"/g, '\\"');
|
|
210
|
+
const body = `Press ${key} + Enter in your terminal to ${action}`;
|
|
211
|
+
try {
|
|
212
|
+
await run('osascript', ['-e', `display notification "${body}" with title "${title}" sound name "Funk"`]);
|
|
213
|
+
}
|
|
214
|
+
catch { }
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=keystroke-injector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keystroke-injector.js","sourceRoot":"","sources":["../../src/sessions/keystroke-injector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface DetectedProcess {
|
|
2
|
+
pid: string;
|
|
3
|
+
cwd: string;
|
|
4
|
+
agentType: 'claude-code' | 'codex' | 'amp';
|
|
5
|
+
}
|
|
6
|
+
export interface SessionFile {
|
|
7
|
+
sessionId: string;
|
|
8
|
+
filePath: string;
|
|
9
|
+
lastMessage: string;
|
|
10
|
+
}
|
|
11
|
+
/** Synchronous liveness check — sends signal 0 (no-op) to the process. */
|
|
12
|
+
export declare function isPidAlive(pid: string): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Finds all running claude / codex / amp processes, resolves each PID's cwd
|
|
15
|
+
* (preferring /tmp/claude-{pid}-cwd over lsof), and returns only processes
|
|
16
|
+
* that belong to the user and are not part of the companion tool itself.
|
|
17
|
+
*/
|
|
18
|
+
export declare function detectAgentProcesses(): Promise<DetectedProcess[]>;
|
|
19
|
+
/**
|
|
20
|
+
* Given a process cwd, locates the most-recently-modified JSONL transcript
|
|
21
|
+
* file that Claude Code would have written for that session.
|
|
22
|
+
*
|
|
23
|
+
* Claude Code encodes the project path as a directory name under
|
|
24
|
+
* ~/.claude/projects/ by replacing every '/' with '-'.
|
|
25
|
+
*/
|
|
26
|
+
export declare function findSessionFileForCwd(cwd: string): Promise<SessionFile | null>;
|
|
27
|
+
//# sourceMappingURL=process-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-detector.d.ts","sourceRoot":"","sources":["../../src/sessions/process-detector.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,aAAa,GAAG,OAAO,GAAG,KAAK,CAAC;CAC5C;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,0EAA0E;AAC1E,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAO/C;AAqDD;;;;GAIG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAgDvE;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAsCpF"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { exec as execCb } from 'node:child_process';
|
|
2
|
+
import { promisify } from 'node:util';
|
|
3
|
+
import fs from 'node:fs/promises';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import os from 'node:os';
|
|
6
|
+
import { isBlocklisted } from './session-watcher.js';
|
|
7
|
+
import { logger } from '../utils/logger.js';
|
|
8
|
+
const exec = promisify(execCb);
|
|
9
|
+
/** Synchronous liveness check — sends signal 0 (no-op) to the process. */
|
|
10
|
+
export function isPidAlive(pid) {
|
|
11
|
+
try {
|
|
12
|
+
process.kill(parseInt(pid, 10), 0);
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
async function getCwdForPid(pid) {
|
|
20
|
+
// Method 1: Claude Code writes its cwd to /tmp/claude-{pid}-cwd.
|
|
21
|
+
// Trust this unconditionally — Claude itself wrote it, so even the home
|
|
22
|
+
// directory is a valid project root (e.g. sessions started from ~).
|
|
23
|
+
try {
|
|
24
|
+
const cwdFile = `/tmp/claude-${pid}-cwd`;
|
|
25
|
+
const cwd = (await fs.readFile(cwdFile, 'utf-8')).trim();
|
|
26
|
+
if (cwd && cwd.length > 1 && cwd !== '/') {
|
|
27
|
+
return cwd;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
catch { }
|
|
31
|
+
// Method 2: lsof fallback — less authoritative, keep home-dir filter to
|
|
32
|
+
// avoid noise from unrelated processes that happen to live in ~.
|
|
33
|
+
try {
|
|
34
|
+
const { stdout } = await exec(`lsof -a -p ${pid} -d cwd -Fn 2>/dev/null | grep "^n" | head -1`);
|
|
35
|
+
const cwd = stdout.trim().replace(/^n/, '');
|
|
36
|
+
if (cwd && cwd.length > 1 && cwd !== os.homedir() && cwd !== '/') {
|
|
37
|
+
return cwd;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch { }
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
// Use exact name match (-x) to avoid false positives from shell scripts or
|
|
44
|
+
// build commands that contain "claude" in their arguments.
|
|
45
|
+
async function findClaudePids() {
|
|
46
|
+
const pids = new Set();
|
|
47
|
+
try {
|
|
48
|
+
const { stdout } = await exec(`pgrep -x claude 2>/dev/null || true`);
|
|
49
|
+
stdout.trim().split('\n')
|
|
50
|
+
.filter(p => p.trim())
|
|
51
|
+
.forEach(p => pids.add(p.trim()));
|
|
52
|
+
}
|
|
53
|
+
catch { }
|
|
54
|
+
for (const name of ['codex', 'amp']) {
|
|
55
|
+
try {
|
|
56
|
+
const { stdout } = await exec(`pgrep -x ${name} 2>/dev/null || true`);
|
|
57
|
+
stdout.trim().split('\n')
|
|
58
|
+
.filter(p => p.trim())
|
|
59
|
+
.forEach(p => pids.add(p.trim()));
|
|
60
|
+
}
|
|
61
|
+
catch { }
|
|
62
|
+
}
|
|
63
|
+
return Array.from(pids).filter(p => /^\d+$/.test(p));
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Finds all running claude / codex / amp processes, resolves each PID's cwd
|
|
67
|
+
* (preferring /tmp/claude-{pid}-cwd over lsof), and returns only processes
|
|
68
|
+
* that belong to the user and are not part of the companion tool itself.
|
|
69
|
+
*/
|
|
70
|
+
export async function detectAgentProcesses() {
|
|
71
|
+
const rawPids = await findClaudePids();
|
|
72
|
+
logger.info(`Found ${rawPids.length} claude process(es): ${rawPids.join(', ') || 'none'}`);
|
|
73
|
+
if (rawPids.length === 0)
|
|
74
|
+
return [];
|
|
75
|
+
const results = [];
|
|
76
|
+
for (const pid of rawPids) {
|
|
77
|
+
try {
|
|
78
|
+
const { stdout: cmdOut } = await exec(`ps -p ${pid} -o args= 2>/dev/null`);
|
|
79
|
+
const fullCmd = cmdOut.trim();
|
|
80
|
+
if (!fullCmd)
|
|
81
|
+
continue;
|
|
82
|
+
if (fullCmd.includes('agentvigil'))
|
|
83
|
+
continue;
|
|
84
|
+
let agentType;
|
|
85
|
+
if (fullCmd.includes('codex'))
|
|
86
|
+
agentType = 'codex';
|
|
87
|
+
else if (fullCmd.includes('amp'))
|
|
88
|
+
agentType = 'amp';
|
|
89
|
+
else
|
|
90
|
+
agentType = 'claude-code';
|
|
91
|
+
const cwd = await getCwdForPid(pid);
|
|
92
|
+
if (!cwd) {
|
|
93
|
+
logger.dim(`Skipping pid ${pid} — could not determine cwd`);
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
await fs.access(cwd);
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
logger.dim(`Skipping pid ${pid} — cwd does not exist: ${cwd}`);
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
if (isBlocklisted(cwd)) {
|
|
104
|
+
logger.dim(`Skipping pid ${pid} — blocklisted cwd: ${cwd}`);
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
logger.info(` pid ${pid} → cwd: ${cwd}`);
|
|
108
|
+
results.push({ pid, cwd, agentType });
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
// Process died between pgrep and resolution, or insufficient permissions — skip.
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return results;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Given a process cwd, locates the most-recently-modified JSONL transcript
|
|
119
|
+
* file that Claude Code would have written for that session.
|
|
120
|
+
*
|
|
121
|
+
* Claude Code encodes the project path as a directory name under
|
|
122
|
+
* ~/.claude/projects/ by replacing every '/' with '-'.
|
|
123
|
+
*/
|
|
124
|
+
export async function findSessionFileForCwd(cwd) {
|
|
125
|
+
const projectsDir = path.join(os.homedir(), '.claude', 'projects');
|
|
126
|
+
// Claude Code encodes paths by replacing all non-alphanumeric chars with '-'
|
|
127
|
+
// (not just '/' — underscores and other chars are also replaced).
|
|
128
|
+
const encodedCwd = cwd.replace(/[^a-zA-Z0-9]/g, '-');
|
|
129
|
+
const cwdBasename = path.basename(cwd);
|
|
130
|
+
const encodedBasename = cwdBasename.replace(/[^a-zA-Z0-9]/g, '-');
|
|
131
|
+
try {
|
|
132
|
+
const entries = await fs.readdir(projectsDir, { withFileTypes: true });
|
|
133
|
+
for (const entry of entries) {
|
|
134
|
+
if (!entry.isDirectory())
|
|
135
|
+
continue;
|
|
136
|
+
// Accept an exact encoding match or a suffix match (handles partial paths).
|
|
137
|
+
if (entry.name !== encodedCwd && !entry.name.endsWith('-' + encodedBasename))
|
|
138
|
+
continue;
|
|
139
|
+
const dirPath = path.join(projectsDir, entry.name);
|
|
140
|
+
const files = (await fs.readdir(dirPath)).filter(f => f.endsWith('.jsonl'));
|
|
141
|
+
if (files.length === 0)
|
|
142
|
+
continue;
|
|
143
|
+
// Pick the most recently modified transcript.
|
|
144
|
+
let latest = { file: '', mtime: 0 };
|
|
145
|
+
for (const f of files) {
|
|
146
|
+
const stats = await fs.stat(path.join(dirPath, f));
|
|
147
|
+
if (stats.mtimeMs > latest.mtime)
|
|
148
|
+
latest = { file: f, mtime: stats.mtimeMs };
|
|
149
|
+
}
|
|
150
|
+
const filePath = path.join(dirPath, latest.file);
|
|
151
|
+
const sessionId = path.basename(latest.file, '.jsonl');
|
|
152
|
+
const lastMessage = await extractLastMessage(filePath);
|
|
153
|
+
return { sessionId, filePath, lastMessage };
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
// projectsDir missing or unreadable — expected on first run
|
|
158
|
+
}
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
async function extractLastMessage(filePath) {
|
|
162
|
+
try {
|
|
163
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
164
|
+
const lines = content.trim().split('\n').filter(l => l.trim());
|
|
165
|
+
for (const line of [...lines].reverse()) {
|
|
166
|
+
try {
|
|
167
|
+
const parsed = JSON.parse(line);
|
|
168
|
+
if (parsed.message && typeof parsed.message === 'string') {
|
|
169
|
+
return parsed.message.substring(0, 120);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
catch { /* unreadable */ }
|
|
178
|
+
return 'Active session';
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=process-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-detector.js","sourceRoot":"","sources":["../../src/sessions/process-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export type SessionState = 'working' | 'blocked' | 'done' | 'error' | 'idle';
|
|
2
|
+
export type AgentKind = 'claude-code' | 'codex' | 'amp';
|
|
3
|
+
export type HookEventType = 'permission_prompt' | 'idle_prompt' | 'stop' | 'subagent_stop';
|
|
4
|
+
export interface Session {
|
|
5
|
+
session_id: string;
|
|
6
|
+
cwd: string;
|
|
7
|
+
project_name: string;
|
|
8
|
+
agent: AgentKind;
|
|
9
|
+
state: SessionState;
|
|
10
|
+
last_activity: Date;
|
|
11
|
+
last_message?: string;
|
|
12
|
+
tmux_pane_id?: string;
|
|
13
|
+
pid?: string;
|
|
14
|
+
/** The shell command awaiting approval. Only meaningful while state === 'blocked'. */
|
|
15
|
+
permission_command?: string;
|
|
16
|
+
/** The tool requesting approval (e.g. 'Bash', 'Write'). Only meaningful while state === 'blocked'. */
|
|
17
|
+
tool_name?: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function stateAfterHookEvent(hookType: HookEventType): SessionState;
|
|
20
|
+
export declare function projectNameFromCwd(cwd: string): string;
|
|
21
|
+
export declare function updateSession(sessionId: string, changes: Partial<Omit<Session, 'session_id'>>): Session;
|
|
22
|
+
export declare function getSession(sessionId: string): Session | undefined;
|
|
23
|
+
/** Returns the first session whose cwd matches exactly, or undefined. */
|
|
24
|
+
export declare function getSessionByCwd(cwd: string): Session | undefined;
|
|
25
|
+
export declare function getAllSessions(): Session[];
|
|
26
|
+
/** Returns only sessions that are currently active (working / blocked / idle). */
|
|
27
|
+
export declare function getActiveSessions(): Session[];
|
|
28
|
+
export declare function deleteSession(sessionId: string): void;
|
|
29
|
+
/**
|
|
30
|
+
* Removes done/error sessions that have lingered for over 5 minutes.
|
|
31
|
+
* Active (working/blocked/idle) sessions are removed immediately by the process
|
|
32
|
+
* poller when their pid dies — not by this function.
|
|
33
|
+
* Returns the removed session ids.
|
|
34
|
+
*/
|
|
35
|
+
export declare function cleanup(now?: Date): string[];
|
|
36
|
+
export declare function clearSessions(): void;
|
|
37
|
+
//# sourceMappingURL=session-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/sessions/session-manager.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAC7E,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,OAAO,GAAG,KAAK,CAAC;AACxD,MAAM,MAAM,aAAa,GAAG,mBAAmB,GAAG,aAAa,GAAG,MAAM,GAAG,eAAe,CAAC;AAE3F,MAAM,WAAW,OAAO;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,YAAY,CAAC;IACpB,aAAa,EAAE,IAAI,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sFAAsF;IACtF,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,sGAAsG;IACtG,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAgBD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,aAAa,GAAG,YAAY,CAEzE;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD;AAID,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,GAAG,OAAO,CA2BvG;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAEjE;AAED,yEAAyE;AACzE,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAKhE;AAED,wBAAgB,cAAc,IAAI,OAAO,EAAE,CAE1C;AAED,kFAAkF;AAClF,wBAAgB,iBAAiB,IAAI,OAAO,EAAE,CAI7C;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAErD;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,GAAG,GAAE,IAAiB,GAAG,MAAM,EAAE,CAaxD;AAED,wBAAgB,aAAa,IAAI,IAAI,CAEpC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
// done/error sessions linger briefly so the phone can display the final state
|
|
3
|
+
// before they disappear. Active sessions are removed immediately by the process
|
|
4
|
+
// poller when their pid dies — no time-based threshold for those.
|
|
5
|
+
const DONE_SESSION_LINGER_MS = 5 * 60 * 1000;
|
|
6
|
+
// Mirrors the state machine documented in SESSIONS.md — subagent_stop returns
|
|
7
|
+
// the parent session to 'working' rather than marking it 'done'.
|
|
8
|
+
const STATE_AFTER_HOOK_EVENT = {
|
|
9
|
+
permission_prompt: 'blocked',
|
|
10
|
+
idle_prompt: 'idle',
|
|
11
|
+
stop: 'done',
|
|
12
|
+
subagent_stop: 'working',
|
|
13
|
+
};
|
|
14
|
+
export function stateAfterHookEvent(hookType) {
|
|
15
|
+
return STATE_AFTER_HOOK_EVENT[hookType];
|
|
16
|
+
}
|
|
17
|
+
export function projectNameFromCwd(cwd) {
|
|
18
|
+
return path.basename(cwd);
|
|
19
|
+
}
|
|
20
|
+
const sessionStore = new Map();
|
|
21
|
+
export function updateSession(sessionId, changes) {
|
|
22
|
+
const existing = sessionStore.get(sessionId);
|
|
23
|
+
const cwd = changes.cwd ?? existing?.cwd ?? '';
|
|
24
|
+
const state = changes.state ?? existing?.state ?? 'working';
|
|
25
|
+
const session = {
|
|
26
|
+
session_id: sessionId,
|
|
27
|
+
cwd,
|
|
28
|
+
project_name: changes.project_name ?? existing?.project_name ?? projectNameFromCwd(cwd),
|
|
29
|
+
agent: changes.agent ?? existing?.agent ?? 'claude-code',
|
|
30
|
+
state,
|
|
31
|
+
last_activity: changes.last_activity ?? new Date(),
|
|
32
|
+
last_message: changes.last_message ?? existing?.last_message,
|
|
33
|
+
tmux_pane_id: changes.tmux_pane_id ?? existing?.tmux_pane_id,
|
|
34
|
+
pid: changes.pid ?? existing?.pid,
|
|
35
|
+
// Stale once the session leaves 'blocked' — drop it so a later full_sync
|
|
36
|
+
// doesn't re-show a permission card for an already-resolved prompt.
|
|
37
|
+
permission_command: state === 'blocked'
|
|
38
|
+
? (changes.permission_command ?? existing?.permission_command)
|
|
39
|
+
: undefined,
|
|
40
|
+
tool_name: state === 'blocked'
|
|
41
|
+
? (changes.tool_name ?? existing?.tool_name)
|
|
42
|
+
: undefined,
|
|
43
|
+
};
|
|
44
|
+
sessionStore.set(sessionId, session);
|
|
45
|
+
return session;
|
|
46
|
+
}
|
|
47
|
+
export function getSession(sessionId) {
|
|
48
|
+
return sessionStore.get(sessionId);
|
|
49
|
+
}
|
|
50
|
+
/** Returns the first session whose cwd matches exactly, or undefined. */
|
|
51
|
+
export function getSessionByCwd(cwd) {
|
|
52
|
+
for (const session of sessionStore.values()) {
|
|
53
|
+
if (session.cwd === cwd)
|
|
54
|
+
return session;
|
|
55
|
+
}
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
export function getAllSessions() {
|
|
59
|
+
return [...sessionStore.values()];
|
|
60
|
+
}
|
|
61
|
+
/** Returns only sessions that are currently active (working / blocked / idle). */
|
|
62
|
+
export function getActiveSessions() {
|
|
63
|
+
return [...sessionStore.values()].filter((s) => s.state === 'working' || s.state === 'blocked' || s.state === 'idle');
|
|
64
|
+
}
|
|
65
|
+
export function deleteSession(sessionId) {
|
|
66
|
+
sessionStore.delete(sessionId);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Removes done/error sessions that have lingered for over 5 minutes.
|
|
70
|
+
* Active (working/blocked/idle) sessions are removed immediately by the process
|
|
71
|
+
* poller when their pid dies — not by this function.
|
|
72
|
+
* Returns the removed session ids.
|
|
73
|
+
*/
|
|
74
|
+
export function cleanup(now = new Date()) {
|
|
75
|
+
const removed = [];
|
|
76
|
+
for (const [id, session] of sessionStore.entries()) {
|
|
77
|
+
if (session.state !== 'done' && session.state !== 'error')
|
|
78
|
+
continue;
|
|
79
|
+
const inactiveMs = now.getTime() - session.last_activity.getTime();
|
|
80
|
+
if (inactiveMs > DONE_SESSION_LINGER_MS) {
|
|
81
|
+
sessionStore.delete(id);
|
|
82
|
+
removed.push(id);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return removed;
|
|
86
|
+
}
|
|
87
|
+
export function clearSessions() {
|
|
88
|
+
sessionStore.clear();
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=session-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../src/sessions/session-manager.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAsB7B,8EAA8E;AAC9E,gFAAgF;AAChF,kEAAkE;AAClE,MAAM,sBAAsB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAE7C,8EAA8E;AAC9E,iEAAiE;AACjE,MAAM,sBAAsB,GAAwC;IAClE,iBAAiB,EAAE,SAAS;IAC5B,WAAW,EAAE,MAAM;IACnB,IAAI,EAAE,MAAM;IACZ,aAAa,EAAE,SAAS;CACzB,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,QAAuB;IACzD,OAAO,sBAAsB,CAAC,QAAQ,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,YAAY,GAAG,IAAI,GAAG,EAAmB,CAAC;AAEhD,MAAM,UAAU,aAAa,CAAC,SAAiB,EAAE,OAA6C;IAC5F,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,QAAQ,EAAE,GAAG,IAAI,EAAE,CAAC;IAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,QAAQ,EAAE,KAAK,IAAI,SAAS,CAAC;IAE5D,MAAM,OAAO,GAAY;QACvB,UAAU,EAAE,SAAS;QACrB,GAAG;QACH,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,QAAQ,EAAE,YAAY,IAAI,kBAAkB,CAAC,GAAG,CAAC;QACvF,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,QAAQ,EAAE,KAAK,IAAI,aAAa;QACxD,KAAK;QACL,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,IAAI,IAAI,EAAE;QAClD,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,QAAQ,EAAE,YAAY;QAC5D,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,QAAQ,EAAE,YAAY;QAC5D,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,QAAQ,EAAE,GAAG;QACjC,yEAAyE;QACzE,oEAAoE;QACpE,kBAAkB,EAAE,KAAK,KAAK,SAAS;YACrC,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAkB,IAAI,QAAQ,EAAE,kBAAkB,CAAC;YAC9D,CAAC,CAAC,SAAS;QACb,SAAS,EAAE,KAAK,KAAK,SAAS;YAC5B,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,IAAI,QAAQ,EAAE,SAAS,CAAC;YAC5C,CAAC,CAAC,SAAS;KACd,CAAC;IAEF,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACrC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,SAAiB;IAC1C,OAAO,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACrC,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,KAAK,MAAM,OAAO,IAAI,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC;QAC5C,IAAI,OAAO,CAAC,GAAG,KAAK,GAAG;YAAE,OAAO,OAAO,CAAC;IAC1C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;AACpC,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,iBAAiB;IAC/B,OAAO,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CACtC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAC5E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,SAAiB;IAC7C,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AACjC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAC,MAAY,IAAI,IAAI,EAAE;IAC5C,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;QACnD,IAAI,OAAO,CAAC,KAAK,KAAK,MAAM,IAAI,OAAO,CAAC,KAAK,KAAK,OAAO;YAAE,SAAS;QACpE,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;QACnE,IAAI,UAAU,GAAG,sBAAsB,EAAE,CAAC;YACxC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,YAAY,CAAC,KAAK,EAAE,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type Session } from './session-manager.js';
|
|
2
|
+
export declare const PROCESS_POLL_INTERVAL_MS = 10000;
|
|
3
|
+
export interface SessionPoller {
|
|
4
|
+
stop(): void;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Reconciles the OS process table with the in-memory session store every
|
|
8
|
+
* PROCESS_POLL_INTERVAL_MS milliseconds.
|
|
9
|
+
*
|
|
10
|
+
* - Sessions whose process has died are removed immediately.
|
|
11
|
+
* - Running agent processes not yet in the store are added.
|
|
12
|
+
* - done/error sessions are left for cleanup() to expire.
|
|
13
|
+
*
|
|
14
|
+
* Runs the first poll synchronously (awaited) before returning so the store
|
|
15
|
+
* is fully populated when the caller proceeds.
|
|
16
|
+
*/
|
|
17
|
+
export declare function startSessionPolling(onSessionAdded: (session: Session) => void, onSessionRemoved: (sessionId: string) => void, intervalMs?: number): Promise<SessionPoller>;
|
|
18
|
+
//# sourceMappingURL=session-poller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-poller.d.ts","sourceRoot":"","sources":["../../src/sessions/session-poller.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,OAAO,EACb,MAAM,sBAAsB,CAAC;AAG9B,eAAO,MAAM,wBAAwB,QAAS,CAAC;AAE/C,MAAM,WAAW,aAAa;IAC5B,IAAI,IAAI,IAAI,CAAC;CACd;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CACvC,cAAc,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,EAC1C,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,EAC7C,UAAU,SAA2B,GACpC,OAAO,CAAC,aAAa,CAAC,CA6DxB"}
|