@swarmify/agents-cli 1.13.2 → 1.13.4

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 (35) hide show
  1. package/dist/commands/__tests__/sessions-tail.test.d.ts +2 -0
  2. package/dist/commands/__tests__/sessions-tail.test.d.ts.map +1 -0
  3. package/dist/commands/__tests__/sessions-tail.test.js +108 -0
  4. package/dist/commands/__tests__/sessions-tail.test.js.map +1 -0
  5. package/dist/commands/sessions-tail.d.ts +20 -0
  6. package/dist/commands/sessions-tail.d.ts.map +1 -0
  7. package/dist/commands/sessions-tail.js +236 -0
  8. package/dist/commands/sessions-tail.js.map +1 -0
  9. package/dist/commands/sessions.d.ts.map +1 -1
  10. package/dist/commands/sessions.js +84 -1
  11. package/dist/commands/sessions.js.map +1 -1
  12. package/dist/commands/teams.d.ts.map +1 -1
  13. package/dist/commands/teams.js +46 -0
  14. package/dist/commands/teams.js.map +1 -1
  15. package/dist/lib/__tests__/shims.test.js +20 -2
  16. package/dist/lib/__tests__/shims.test.js.map +1 -1
  17. package/dist/lib/exec.d.ts +2 -1
  18. package/dist/lib/exec.d.ts.map +1 -1
  19. package/dist/lib/exec.js +16 -6
  20. package/dist/lib/exec.js.map +1 -1
  21. package/dist/lib/factory.d.ts.map +1 -1
  22. package/dist/lib/factory.js +2 -5
  23. package/dist/lib/factory.js.map +1 -1
  24. package/dist/lib/permissions.d.ts.map +1 -1
  25. package/dist/lib/permissions.js +16 -2
  26. package/dist/lib/permissions.js.map +1 -1
  27. package/dist/lib/session/active.d.ts +44 -0
  28. package/dist/lib/session/active.d.ts.map +1 -0
  29. package/dist/lib/session/active.js +379 -0
  30. package/dist/lib/session/active.js.map +1 -0
  31. package/dist/lib/shims.d.ts +7 -2
  32. package/dist/lib/shims.d.ts.map +1 -1
  33. package/dist/lib/shims.js +23 -4
  34. package/dist/lib/shims.js.map +1 -1
  35. package/package.json +1 -1
@@ -0,0 +1,379 @@
1
+ /**
2
+ * Active-session detection across every context an agent can run in:
3
+ *
4
+ * - `terminal` — agents launched from VS Code / Cursor / Codium via the
5
+ * swarmify extension. Published to `~/.agents/swarmify/live-terminals.json`
6
+ * with PID + session UUID per entry.
7
+ * - `teams` — agents spawned by `agents teams add`, tracked in
8
+ * `~/.agents/teams/agents/<id>/meta.json` with a PID the manager polls.
9
+ * - `cloud` — dispatched to Rush / Codex Cloud / Factory, tracked in
10
+ * the SQLite cache at `~/.agents/cloud/tasks.db`.
11
+ * - `headless` — bare `claude` / `codex` / `gemini` / `cursor-agent` /
12
+ * `opencode` processes that don't belong to any of the above. Detected
13
+ * by `ps` minus the PIDs we've already attributed.
14
+ *
15
+ * `running` vs `idle` is a secondary classification within the alive set:
16
+ * the process is holding its session file, but the file's mtime is older
17
+ * than ACTIVE_MTIME_WINDOW_MS, so it's probably waiting on the user.
18
+ */
19
+ import * as fs from 'fs';
20
+ import * as path from 'path';
21
+ import * as os from 'os';
22
+ import { execSync } from 'child_process';
23
+ import { listActiveTasks } from '../cloud/store.js';
24
+ import { AgentManager } from '../teams/agents.js';
25
+ const HOME = os.homedir();
26
+ const LIVE_TERMINALS_FILE = path.join(HOME, '.agents', 'swarmify', 'live-terminals.json');
27
+ /**
28
+ * A process is classified `running` if its session file was touched in the
29
+ * last 2 minutes. Every Claude/Codex tool-call appends an event, so a
30
+ * healthy session writes several times a minute.
31
+ */
32
+ const ACTIVE_MTIME_WINDOW_MS = 2 * 60_000;
33
+ /** Executables we recognize as agent CLIs when scanning the process table. */
34
+ const AGENT_CLI_NAMES = {
35
+ claude: 'claude',
36
+ codex: 'codex',
37
+ gemini: 'gemini',
38
+ 'cursor-agent': 'cursor',
39
+ opencode: 'opencode',
40
+ };
41
+ function isPidAlive(pid) {
42
+ if (!pid || pid < 1)
43
+ return false;
44
+ try {
45
+ process.kill(pid, 0);
46
+ return true;
47
+ }
48
+ catch (err) {
49
+ return err?.code === 'EPERM';
50
+ }
51
+ }
52
+ /** Read swarmify's live-terminals registry, dedupe by sessionId, keep only pid-alive entries. */
53
+ function readLiveTerminals() {
54
+ let raw;
55
+ try {
56
+ raw = fs.readFileSync(LIVE_TERMINALS_FILE, 'utf8');
57
+ }
58
+ catch {
59
+ return [];
60
+ }
61
+ let parsed;
62
+ try {
63
+ parsed = JSON.parse(raw);
64
+ }
65
+ catch {
66
+ return [];
67
+ }
68
+ if (!parsed || typeof parsed !== 'object')
69
+ return [];
70
+ const merged = new Map();
71
+ for (const slice of Object.values(parsed)) {
72
+ for (const e of (slice?.entries ?? [])) {
73
+ if (!e?.sessionId || !isPidAlive(e.pid))
74
+ continue;
75
+ merged.set(e.sessionId, e);
76
+ }
77
+ }
78
+ return Array.from(merged.values());
79
+ }
80
+ /** Convert an absolute cwd to the Claude-project folder name (slashes → dashes). */
81
+ function claudeProjectDirName(cwd) {
82
+ return cwd.replace(/\//g, '-');
83
+ }
84
+ /**
85
+ * Locate the active Claude session file for a process. If we know the session
86
+ * UUID (from terminal env or team parent), prefer the exact match. Otherwise
87
+ * fall back to the most-recent-mtime .jsonl in the project's folder.
88
+ */
89
+ function findClaudeSessionFile(cwd, sessionId) {
90
+ const projectDir = path.join(HOME, '.claude', 'projects', claudeProjectDirName(cwd));
91
+ if (sessionId) {
92
+ const specific = path.join(projectDir, `${sessionId}.jsonl`);
93
+ if (fs.existsSync(specific))
94
+ return specific;
95
+ }
96
+ let files;
97
+ try {
98
+ files = fs.readdirSync(projectDir).filter(f => f.endsWith('.jsonl'));
99
+ }
100
+ catch {
101
+ return undefined;
102
+ }
103
+ let best = null;
104
+ for (const f of files) {
105
+ const p = path.join(projectDir, f);
106
+ try {
107
+ const m = fs.statSync(p).mtimeMs;
108
+ if (!best || m > best.mtime)
109
+ best = { path: p, mtime: m };
110
+ }
111
+ catch { /* file vanished between readdir and stat */ }
112
+ }
113
+ return best?.path;
114
+ }
115
+ function classifyActivity(sessionFile) {
116
+ if (!sessionFile)
117
+ return 'running';
118
+ try {
119
+ const mtimeMs = fs.statSync(sessionFile).mtimeMs;
120
+ return Date.now() - mtimeMs < ACTIVE_MTIME_WINDOW_MS ? 'running' : 'idle';
121
+ }
122
+ catch {
123
+ return 'running';
124
+ }
125
+ }
126
+ /** Live teams teammates. Reuses AgentManager which already polls PIDs via `kill -0`. */
127
+ export async function listTeamsActive() {
128
+ const mgr = new AgentManager();
129
+ const running = await mgr.listRunning();
130
+ return running.map((a) => {
131
+ const sessionId = a.parentSessionId ?? a.remoteSessionId ?? undefined;
132
+ const sessionFile = a.agentType === 'claude' && a.cwd
133
+ ? findClaudeSessionFile(a.cwd, sessionId ?? undefined)
134
+ : undefined;
135
+ return {
136
+ context: 'teams',
137
+ kind: a.agentType,
138
+ pid: a.pid ?? undefined,
139
+ sessionId,
140
+ cwd: a.cwd ?? undefined,
141
+ label: a.name ?? undefined,
142
+ sessionFile,
143
+ startedAtMs: a.startedAt.getTime(),
144
+ status: classifyActivity(sessionFile),
145
+ teamName: a.taskName,
146
+ agentId: a.agentId,
147
+ };
148
+ });
149
+ }
150
+ /** Live editor-terminal agents across every IDE window. */
151
+ export function listTerminalsActive() {
152
+ const entries = readLiveTerminals();
153
+ if (entries.length === 0)
154
+ return [];
155
+ // Walk the shell PIDs through the process table once so we can name the host
156
+ // (code / cursor / codium) per entry rather than a generic 'terminal'.
157
+ const procByPid = new Map();
158
+ for (const r of readProcessTable())
159
+ procByPid.set(r.pid, r);
160
+ return entries.map((t) => {
161
+ const sessionFile = t.kind === 'claude' && t.cwd
162
+ ? findClaudeSessionFile(t.cwd, t.sessionId)
163
+ : undefined;
164
+ return {
165
+ context: 'terminal',
166
+ kind: t.kind,
167
+ host: detectHost(t.pid, procByPid),
168
+ pid: t.pid,
169
+ sessionId: t.sessionId,
170
+ cwd: t.cwd ?? undefined,
171
+ label: t.label ?? undefined,
172
+ sessionFile,
173
+ startedAtMs: t.startedAtMs,
174
+ status: classifyActivity(sessionFile),
175
+ };
176
+ });
177
+ }
178
+ /** Cloud tasks still in a non-terminal state. `tasks.db` may not exist; that's fine. */
179
+ export function listCloudActive() {
180
+ let tasks;
181
+ try {
182
+ tasks = listActiveTasks();
183
+ }
184
+ catch {
185
+ return [];
186
+ }
187
+ return tasks.map((t) => ({
188
+ context: 'cloud',
189
+ kind: t.agent || 'cloud',
190
+ label: t.prompt.length > 60 ? t.prompt.slice(0, 57) + '...' : t.prompt,
191
+ startedAtMs: Date.parse(t.createdAt) || undefined,
192
+ status: t.status === 'running'
193
+ ? 'running'
194
+ : t.status === 'input_required'
195
+ ? 'input_required'
196
+ : 'queued',
197
+ cloudProvider: t.provider,
198
+ cloudTaskId: t.id,
199
+ cloudStatus: t.status,
200
+ }));
201
+ }
202
+ /**
203
+ * Ordered ancestor-process matchers. First match wins (most specific to least),
204
+ * so an IDE renderer is preferred over the terminal-app that launched the IDE,
205
+ * and a terminal-app is preferred over the multiplexer inside it.
206
+ */
207
+ const HOST_MATCHERS = [
208
+ // IDE renderers (Electron helper processes)
209
+ { host: 'code', tokens: ['Code Helper', 'Code - Insiders Helper'] },
210
+ { host: 'cursor', tokens: ['Cursor Helper'] },
211
+ { host: 'codium', tokens: ['VSCodium Helper'] },
212
+ { host: 'windsurf', tokens: ['Windsurf Helper'] },
213
+ // Native terminal apps
214
+ { host: 'iterm', tokens: ['iTerm2', 'iTermServer', 'iTerm'] },
215
+ { host: 'terminal', tokens: ['Terminal.app', '/Applications/Utilities/Terminal.app'] },
216
+ { host: 'warp', tokens: ['Warp.app', 'stable_'] },
217
+ { host: 'alacritty', tokens: ['alacritty', 'Alacritty'] },
218
+ { host: 'kitty', tokens: ['kitty'] },
219
+ { host: 'hyper', tokens: ['Hyper.app', 'Hyper Helper'] },
220
+ { host: 'wezterm', tokens: ['wezterm', 'WezTerm'] },
221
+ { host: 'ghostty', tokens: ['ghostty', 'Ghostty'] },
222
+ // Multiplexers (fallback — only if no UI found above them)
223
+ { host: 'tmux', tokens: ['tmux'] },
224
+ { host: 'screen', tokens: ['screen'] },
225
+ ];
226
+ /**
227
+ * Snapshot the whole process table in one `ps` call. Includes ppid so we can
228
+ * walk ancestry chains to attribute child processes to their terminal hosts.
229
+ * `comm` may be an absolute path for shim-launched agents, so basename before
230
+ * matching against AGENT_CLI_NAMES.
231
+ */
232
+ function readProcessTable() {
233
+ let out;
234
+ try {
235
+ out = execSync('ps -A -o pid=,ppid=,comm=', { encoding: 'utf8' });
236
+ }
237
+ catch {
238
+ return [];
239
+ }
240
+ const rows = [];
241
+ for (const line of out.split('\n')) {
242
+ const m = line.trim().match(/^(\d+)\s+(\d+)\s+(.+)$/);
243
+ if (!m)
244
+ continue;
245
+ const pid = parseInt(m[1], 10);
246
+ const ppid = parseInt(m[2], 10);
247
+ if (!Number.isFinite(pid) || !Number.isFinite(ppid))
248
+ continue;
249
+ const commRaw = m[3].trim();
250
+ const kind = AGENT_CLI_NAMES[path.basename(commRaw)];
251
+ rows.push({ pid, ppid, comm: commRaw, kind });
252
+ }
253
+ return rows;
254
+ }
255
+ /**
256
+ * True when any ancestor in pid's parent chain is a known attributed PID.
257
+ * VS Code / Cursor terminals store the *shell* PID in live-terminals.json,
258
+ * while `ps` reports the *child* claude PID, so a direct set lookup misses.
259
+ */
260
+ function hasAttributedAncestor(pid, ppidMap, attributed) {
261
+ let cur = ppidMap.get(pid);
262
+ const seen = new Set();
263
+ while (cur && cur > 1 && !seen.has(cur)) {
264
+ if (attributed.has(cur))
265
+ return true;
266
+ seen.add(cur);
267
+ cur = ppidMap.get(cur);
268
+ }
269
+ return false;
270
+ }
271
+ /**
272
+ * Resolve a process's current working directory via `lsof`. The `-a` flag
273
+ * ANDs the filters; without it macOS treats `-p` and `-d` as a union and
274
+ * returns the cwd of every process on the system.
275
+ */
276
+ function getCwdForPid(pid) {
277
+ let out;
278
+ try {
279
+ out = execSync(`lsof -a -p ${pid} -d cwd -Fn 2>/dev/null`, { encoding: 'utf8' });
280
+ }
281
+ catch {
282
+ return undefined;
283
+ }
284
+ for (const line of out.split('\n')) {
285
+ if (line.startsWith('n'))
286
+ return line.slice(1);
287
+ }
288
+ return undefined;
289
+ }
290
+ /**
291
+ * Walk a pid's ancestor chain and return the most specific host app found.
292
+ * Checks each HOST_MATCHERS entry against every ancestor, returns the first
293
+ * host whose tokens match — so IDEs beat terminal apps, terminals beat
294
+ * multiplexers. Returns undefined if nothing is recognised (true headless).
295
+ */
296
+ function detectHost(pid, procByPid) {
297
+ const chain = [];
298
+ let cur = procByPid.get(pid)?.ppid;
299
+ const seen = new Set();
300
+ while (cur && cur > 1 && !seen.has(cur)) {
301
+ const row = procByPid.get(cur);
302
+ if (!row)
303
+ break;
304
+ chain.push(row.comm);
305
+ seen.add(cur);
306
+ cur = row.ppid;
307
+ }
308
+ for (const { host, tokens } of HOST_MATCHERS) {
309
+ if (chain.some(c => tokens.some(t => c.includes(t))))
310
+ return host;
311
+ }
312
+ return undefined;
313
+ }
314
+ /** IDE / terminal / multiplexer hosts all count as UI-hosted. Absence = truly headless. */
315
+ const UI_HOSTS = new Set([
316
+ 'code', 'cursor', 'codium', 'windsurf',
317
+ 'iterm', 'terminal', 'warp', 'alacritty', 'kitty', 'hyper', 'wezterm', 'ghostty',
318
+ 'tmux', 'screen',
319
+ ]);
320
+ /**
321
+ * Agent processes not attributed to a team or the swarmify registry.
322
+ * Classified by walking the ppid chain: any recognised UI ancestor (IDE
323
+ * helper, terminal-app, or multiplexer) means `terminal`; nothing of the
324
+ * sort means `headless` (daemon, launchd-spawned, orphan).
325
+ */
326
+ export function listUnattributedActive(attributed) {
327
+ const table = readProcessTable();
328
+ const procByPid = new Map();
329
+ const ppidMap = new Map();
330
+ for (const r of table) {
331
+ procByPid.set(r.pid, r);
332
+ ppidMap.set(r.pid, r.ppid);
333
+ }
334
+ const out = [];
335
+ for (const { pid, kind } of table) {
336
+ if (!kind)
337
+ continue;
338
+ if (attributed.has(pid))
339
+ continue;
340
+ if (hasAttributedAncestor(pid, ppidMap, attributed))
341
+ continue;
342
+ const cwd = getCwdForPid(pid);
343
+ const sessionFile = kind === 'claude' && cwd ? findClaudeSessionFile(cwd) : undefined;
344
+ const host = detectHost(pid, procByPid);
345
+ const context = host && UI_HOSTS.has(host) ? 'terminal' : 'headless';
346
+ out.push({
347
+ context,
348
+ kind,
349
+ host,
350
+ pid,
351
+ cwd,
352
+ sessionFile,
353
+ status: classifyActivity(sessionFile),
354
+ });
355
+ }
356
+ return out;
357
+ }
358
+ /**
359
+ * Union of all four sources. Teams and terminals spawn actual CLI processes
360
+ * that also show up in `ps`, so headless attribution runs last with the
361
+ * already-attributed PIDs removed.
362
+ */
363
+ export async function getActiveSessions(opts = {}) {
364
+ const [teams, terminals, cloud] = await Promise.all([
365
+ listTeamsActive().catch(() => []),
366
+ Promise.resolve(listTerminalsActive()),
367
+ Promise.resolve(listCloudActive()),
368
+ ]);
369
+ const knownPids = new Set();
370
+ for (const s of teams)
371
+ if (s.pid)
372
+ knownPids.add(s.pid);
373
+ for (const s of terminals)
374
+ if (s.pid)
375
+ knownPids.add(s.pid);
376
+ const unattributed = opts.skipHeadless ? [] : listUnattributedActive(knownPids);
377
+ return [...teams, ...terminals, ...cloud, ...unattributed];
378
+ }
379
+ //# sourceMappingURL=active.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"active.js","sourceRoot":"","sources":["../../../src/lib/session/active.ts"],"names":[],"mappings":"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"}
@@ -49,8 +49,11 @@ export declare function promptConflictStrategy(conflictInfos: ConflictInfo[]): P
49
49
  * v4 — project version marker changed from `.agents-version` to a
50
50
  * root-level `agents.yaml`; shim now skips ~/.agents/agents.yaml
51
51
  * when walking up for a project marker.
52
+ * v5 — emit CODEX_HOME for codex shims so the versioned config (permissions,
53
+ * sandbox_mode, rules/agents-deny.rules) is actually read by the codex
54
+ * binary instead of $HOME/.codex.
52
55
  */
53
- export declare const SHIM_SCHEMA_VERSION = 4;
56
+ export declare const SHIM_SCHEMA_VERSION = 5;
54
57
  /**
55
58
  * Generate the full bash shim script for the given agent. The returned string
56
59
  * is written to ~/.agents/shims/{cliCommand} and made executable.
@@ -75,8 +78,10 @@ export declare function removeShim(agent: AgentId): boolean;
75
78
  * v2 — emit CLAUDE_CONFIG_DIR for claude aliases so each version has its
76
79
  * own isolated config/OAuth slot; stamp a version marker so stale
77
80
  * aliases can be detected and regenerated.
81
+ * v3 — emit CODEX_HOME for codex aliases so direct `codex@X` invocations
82
+ * read the versioned permissions/rules instead of $HOME/.codex.
78
83
  */
79
- export declare const VERSIONED_ALIAS_SCHEMA_VERSION = 2;
84
+ export declare const VERSIONED_ALIAS_SCHEMA_VERSION = 3;
80
85
  /**
81
86
  * Generate a versioned alias script that directly execs a specific version.
82
87
  * e.g., claude@2.0.65 -> directly runs that version's binary
@@ -1 +1 @@
1
- {"version":3,"file":"shims.d.ts","sourceRoot":"","sources":["../../src/lib/shims.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shims.d.ts","sourceRoot":"","sources":["../../src/lib/shims.ts"],"names":[],"mappings":"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"}
package/dist/lib/shims.js CHANGED
@@ -163,8 +163,11 @@ export async function promptConflictStrategy(conflictInfos) {
163
163
  * v4 — project version marker changed from `.agents-version` to a
164
164
  * root-level `agents.yaml`; shim now skips ~/.agents/agents.yaml
165
165
  * when walking up for a project marker.
166
+ * v5 — emit CODEX_HOME for codex shims so the versioned config (permissions,
167
+ * sandbox_mode, rules/agents-deny.rules) is actually read by the codex
168
+ * binary instead of $HOME/.codex.
166
169
  */
167
- export const SHIM_SCHEMA_VERSION = 4;
170
+ export const SHIM_SCHEMA_VERSION = 5;
168
171
  /** Internal marker string used to embed the schema version in shim scripts. */
169
172
  const SHIM_VERSION_MARKER = 'agents-shim-version:';
170
173
  /**
@@ -182,7 +185,14 @@ export function generateShimScript(agent) {
182
185
  # live Claude account.
183
186
  export CLAUDE_CONFIG_DIR="$VERSION_DIR/home/${configDirName}"
184
187
  `
185
- : '';
188
+ : agent === 'codex'
189
+ ? `
190
+ # Codex reads its config (approval_policy, sandbox_mode, MCP servers, rules)
191
+ # from CODEX_HOME. Point it at the versioned home so permissions/rules
192
+ # written by agents-cli actually take effect.
193
+ export CODEX_HOME="$VERSION_DIR/home/${configDirName}"
194
+ `
195
+ : '';
186
196
  // Agents that don't natively resolve @-imports in their memory file need
187
197
  // agents-cli to recompile when the user edits a rule/preset file. The
188
198
  // check is fast (sha256 of ~8 small files) and skips the recompile when
@@ -356,8 +366,10 @@ export function removeShim(agent) {
356
366
  * v2 — emit CLAUDE_CONFIG_DIR for claude aliases so each version has its
357
367
  * own isolated config/OAuth slot; stamp a version marker so stale
358
368
  * aliases can be detected and regenerated.
369
+ * v3 — emit CODEX_HOME for codex aliases so direct `codex@X` invocations
370
+ * read the versioned permissions/rules instead of $HOME/.codex.
359
371
  */
360
- export const VERSIONED_ALIAS_SCHEMA_VERSION = 2;
372
+ export const VERSIONED_ALIAS_SCHEMA_VERSION = 3;
361
373
  /** Internal marker string used to embed the schema version in versioned alias scripts. */
362
374
  const VERSIONED_ALIAS_VERSION_MARKER = 'agents-versioned-alias-version:';
363
375
  /**
@@ -373,7 +385,14 @@ export function generateVersionedAliasScript(agent, version) {
373
385
  # version's config directory so direct aliases also switch the live account.
374
386
  export CLAUDE_CONFIG_DIR="$HOME/.agents/versions/${agent}/${version}/home/${configDirName}"
375
387
  `
376
- : '';
388
+ : agent === 'codex'
389
+ ? `
390
+ # Codex reads its config (approval_policy, sandbox_mode, MCP servers, rules)
391
+ # from CODEX_HOME. Point direct aliases at the versioned home so permissions
392
+ # and rules written by agents-cli actually take effect.
393
+ export CODEX_HOME="$HOME/.agents/versions/${agent}/${version}/home/${configDirName}"
394
+ `
395
+ : '';
377
396
  return `#!/bin/bash
378
397
  # Auto-generated by agents-cli - do not edit
379
398
  # ${VERSIONED_ALIAS_VERSION_MARKER} ${VERSIONED_ALIAS_SCHEMA_VERSION}