@coralai/sps-cli 0.55.2 → 0.55.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.
@@ -7,8 +7,8 @@
7
7
  <link rel="preconnect" href="https://fonts.googleapis.com">
8
8
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
9
9
  <link href="https://fonts.googleapis.com/css2?family=Fredoka:wght@400;500;600;700&family=DM+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
10
- <script type="module" crossorigin src="/assets/index-d1nmsVQ5.js"></script>
11
- <link rel="stylesheet" crossorigin href="/assets/index-BsxZE28I.css">
10
+ <script type="module" crossorigin src="/assets/index-DWMRPYqr.js"></script>
11
+ <link rel="stylesheet" crossorigin href="/assets/index-C0dZGxt8.css">
12
12
  </head>
13
13
  <body>
14
14
  <div id="root"></div>
@@ -1,7 +1,8 @@
1
1
  export interface SpsProcess {
2
+ kind: 'chat' | 'worker';
2
3
  slot: string;
3
4
  tool: string;
4
- pid: number | null;
5
+ pid: number;
5
6
  alive: boolean;
6
7
  sessionState: string | null;
7
8
  project: string | null;
@@ -10,12 +11,12 @@ export interface SpsProcess {
10
11
  startedAt: string | null;
11
12
  sessionId: string | null;
12
13
  }
13
- /** 列出所有 SPS-ACP 登记的进程(含已离线的;前端可只看 alive)。 */
14
+ /** 列出所有 SPS-ACP 启动的真实存活 claude 进程(chat + worker)。 */
14
15
  export declare function listSpsProcesses(): SpsProcess[];
15
16
  /**
16
- * 关闭指定 pid 的 SPS 进程。双重护栏:
17
- * 1) pid 必须出现在 state.json 登记里(否则可能是用户自己的 claude,拒绝);
18
- * 2) /proc/<pid>/cwd 必须与登记的 cwd 一致(防 pid 被系统复用后误杀无关进程)。
17
+ * 关闭指定 pid 的 SPS 进程。双护栏:
18
+ * 1) pid 必须是当前列出的 SPS 进程(否则可能是用户自己的 claude,拒绝);
19
+ * 2) /proc/<pid>/cwd 必须与登记一致(防 pid 被系统复用后误杀)。
19
20
  */
20
21
  export declare function killSpsProcess(pid: number): {
21
22
  ok: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"processInspect.d.ts","sourceRoot":"","sources":["../../src/core/processInspect.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAyDD,6CAA6C;AAC7C,wBAAgB,gBAAgB,IAAI,UAAU,EAAE,CAE/C;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAgB5E"}
1
+ {"version":3,"file":"processInspect.d.ts","sourceRoot":"","sources":["../../src/core/processInspect.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AA+ED,qDAAqD;AACrD,wBAAgB,gBAAgB,IAAI,UAAU,EAAE,CAqC/C;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAe5E"}
@@ -1,22 +1,44 @@
1
1
  /**
2
2
  * @module core/processInspect
3
- * @description SPS-ACP 启动的 claude 进程巡检 —— 仅认 daemon state.json 里登记的会话进程,
4
- * 据此与"其它途径启动的 claude"(如用户自己的开发会话)区分开。
5
- * 提供:列表(状态/内存/cwd)、按 pid 关闭(双重护栏:必须是登记进程 + cwd 校验防 pid 复用误杀)
3
+ * @description SPS-ACP 启动的 claude 进程巡检 —— **按真实进程判断,不依赖卡片/slot 记录**。
4
+ * /proc:认 `CLAUDE_CODE_ENTRYPOINT=sdk-ts`(SPS 经 ACP SDK 启动的标记)的 claude 进程,
5
+ * 据此与"其它途径启动的 claude"(如用户自己的开发会话,无此标记)区分;
6
+ * 有 `SPS_WORKER_SLOT` 的是构建 worker,否则是 chat 会话。
7
+ * 只列**真实存活**的进程(进程没了就不在列表,不留卡片态的幽灵记录)。
8
+ * 提供:列表(类型/内存/cwd/启动时间)、按 pid 关闭(双护栏:必须是 SPS 进程 + cwd 校验防 pid 复用误杀)。
6
9
  * @layer core
7
10
  */
8
- import { readFileSync, readlinkSync } from 'node:fs';
11
+ import { readdirSync, readFileSync, readlinkSync } from 'node:fs';
9
12
  import { resolve } from 'node:path';
10
- import { isProcessAlive } from '../console/lib/lockFile.js';
11
13
  import { sessionsDir } from '../shared/runtimePaths.js';
12
- function readSessions() {
14
+ function readEnviron(pid) {
13
15
  try {
14
- const raw = readFileSync(resolve(sessionsDir(), 'state.json'), 'utf-8');
15
- const parsed = JSON.parse(raw);
16
- return Object.values(parsed.sessions ?? {});
16
+ const env = {};
17
+ for (const kv of readFileSync(`/proc/${pid}/environ`, 'utf-8').split('\0')) {
18
+ const i = kv.indexOf('=');
19
+ if (i > 0)
20
+ env[kv.slice(0, i)] = kv.slice(i + 1);
21
+ }
22
+ return env;
23
+ }
24
+ catch {
25
+ return {};
26
+ }
27
+ }
28
+ function readComm(pid) {
29
+ try {
30
+ return readFileSync(`/proc/${pid}/comm`, 'utf-8').trim();
17
31
  }
18
32
  catch {
19
- return [];
33
+ return '';
34
+ }
35
+ }
36
+ function readCwd(pid) {
37
+ try {
38
+ return readlinkSync(`/proc/${pid}/cwd`);
39
+ }
40
+ catch {
41
+ return null;
20
42
  }
21
43
  }
22
44
  function memMB(pid) {
@@ -28,47 +50,98 @@ function memMB(pid) {
28
50
  return null;
29
51
  }
30
52
  }
31
- function procCwd(pid) {
53
+ function bootEpoch() {
32
54
  try {
33
- return readlinkSync(`/proc/${pid}/cwd`);
55
+ return Number(readFileSync('/proc/stat', 'utf-8').match(/^btime (\d+)/m)?.[1] ?? 0);
56
+ }
57
+ catch {
58
+ return 0;
59
+ }
60
+ }
61
+ /** 进程启动时刻:/proc/<pid>/stat 第 22 字段(starttime,时钟滴答)+ 系统 btime。CLK_TCK 取 100。 */
62
+ function startedAt(pid, bt) {
63
+ try {
64
+ const stat = readFileSync(`/proc/${pid}/stat`, 'utf-8');
65
+ const rest = stat.slice(stat.lastIndexOf(')') + 2).split(' '); // rest[0]=state(field3)…
66
+ const starttime = Number(rest[19]); // field22 = rest[22-3]
67
+ if (!starttime || !bt)
68
+ return null;
69
+ return new Date((bt + starttime / 100) * 1000).toISOString();
34
70
  }
35
71
  catch {
36
72
  return null;
37
73
  }
38
74
  }
39
- function toProcess(s) {
40
- const pid = s.pid != null && s.pid !== '' ? Number(s.pid) : null;
41
- const alive = pid != null && isProcessAlive(pid);
42
- return {
43
- slot: s.slot ?? '?',
44
- tool: s.tool ?? 'claude',
45
- pid,
46
- alive,
47
- sessionState: s.sessionState ?? s.status ?? null,
48
- project: s.cwd ? (s.cwd.split('/').pop() ?? null) : null,
49
- cwd: s.cwd ?? null,
50
- memoryMB: alive && pid != null ? memMB(pid) : null,
51
- startedAt: s.createdAt ?? null,
52
- sessionId: s.sessionId ?? null,
53
- };
75
+ /** 交叉引用全局 sessions(chat 的 busy/ready 与 slot/sessionId)。pid → 记录。 */
76
+ function sessionByPid() {
77
+ const map = new Map();
78
+ try {
79
+ const parsed = JSON.parse(readFileSync(resolve(sessionsDir(), 'state.json'), 'utf-8'));
80
+ for (const s of Object.values(parsed.sessions ?? {})) {
81
+ if (s.pid != null && s.pid !== '') {
82
+ map.set(Number(s.pid), { slot: s.slot, sessionState: s.sessionState ?? s.status, sessionId: s.sessionId });
83
+ }
84
+ }
85
+ }
86
+ catch {
87
+ /* ignore */
88
+ }
89
+ return map;
54
90
  }
55
- /** 列出所有 SPS-ACP 登记的进程(含已离线的;前端可只看 alive)。 */
91
+ /** 列出所有 SPS-ACP 启动的真实存活 claude 进程(chat + worker)。 */
56
92
  export function listSpsProcesses() {
57
- return readSessions().map(toProcess);
93
+ const out = [];
94
+ let pids;
95
+ try {
96
+ pids = readdirSync('/proc');
97
+ }
98
+ catch {
99
+ return out;
100
+ }
101
+ const bt = bootEpoch();
102
+ const sessions = sessionByPid();
103
+ for (const pid of pids) {
104
+ if (!/^\d+$/.test(pid))
105
+ continue;
106
+ const comm = readComm(pid);
107
+ if (comm !== 'claude' && comm !== 'node')
108
+ continue;
109
+ const env = readEnviron(pid);
110
+ if (env.CLAUDE_CODE_ENTRYPOINT !== 'sdk-ts')
111
+ continue; // 仅 SPS 经 ACP SDK 启动的
112
+ const n = Number(pid);
113
+ const cwd = readCwd(n);
114
+ const isWorker = !!env.SPS_WORKER_SLOT;
115
+ const sess = sessions.get(n);
116
+ const projFromCwd = cwd ? (cwd.split('/').pop() ?? null) : null;
117
+ out.push({
118
+ kind: isWorker ? 'worker' : 'chat',
119
+ slot: isWorker ? `${env.SPS_PROJECT ?? projFromCwd ?? '?'}/${env.SPS_WORKER_SLOT}` : (sess?.slot ?? `${projFromCwd ?? 'chat'}`),
120
+ tool: 'claude',
121
+ pid: n,
122
+ alive: true,
123
+ sessionState: sess?.sessionState ?? 'running',
124
+ project: env.SPS_PROJECT ?? projFromCwd,
125
+ cwd,
126
+ memoryMB: memMB(n),
127
+ startedAt: startedAt(n, bt),
128
+ sessionId: sess?.sessionId ?? null,
129
+ });
130
+ }
131
+ // worker 在前,再按内存降序
132
+ return out.sort((a, b) => (a.kind === b.kind ? (b.memoryMB ?? 0) - (a.memoryMB ?? 0) : a.kind === 'worker' ? -1 : 1));
58
133
  }
59
134
  /**
60
- * 关闭指定 pid 的 SPS 进程。双重护栏:
61
- * 1) pid 必须出现在 state.json 登记里(否则可能是用户自己的 claude,拒绝);
62
- * 2) /proc/<pid>/cwd 必须与登记的 cwd 一致(防 pid 被系统复用后误杀无关进程)。
135
+ * 关闭指定 pid 的 SPS 进程。双护栏:
136
+ * 1) pid 必须是当前列出的 SPS 进程(否则可能是用户自己的 claude,拒绝);
137
+ * 2) /proc/<pid>/cwd 必须与登记一致(防 pid 被系统复用后误杀)。
63
138
  */
64
139
  export function killSpsProcess(pid) {
65
- const rec = readSessions().find((s) => s.pid != null && Number(s.pid) === pid);
140
+ const rec = listSpsProcesses().find((p) => p.pid === pid);
66
141
  if (!rec)
67
- return { ok: false, message: '该 pid 不是 SPS 登记的进程,拒绝关闭(可能是其它途径启动的 claude)' };
68
- if (!isProcessAlive(pid))
69
- return { ok: true, message: '进程已不在' };
142
+ return { ok: false, message: '该 pid 不是 SPS 启动的进程,拒绝关闭(可能是其它途径启动的 claude)' };
70
143
  if (rec.cwd) {
71
- const live = procCwd(pid);
144
+ const live = readCwd(pid);
72
145
  if (live && live !== rec.cwd) {
73
146
  return { ok: false, message: `pid 的实际 cwd(${live})与登记不符,疑似 pid 被复用,拒绝关闭` };
74
147
  }
@@ -1 +1 @@
1
- {"version":3,"file":"processInspect.js","sourceRoot":"","sources":["../../src/core/processInspect.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"processInspect.js","sourceRoot":"","sources":["../../src/core/processInspect.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coralai/sps-cli",
3
- "version": "0.55.2",
3
+ "version": "0.55.4",
4
4
  "description": "SPS CLI — AI-driven development pipeline orchestrator",
5
5
  "type": "module",
6
6
  "main": "dist/main.js",