@zhin.js/process-monitor 3.0.4 → 3.0.6

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.
@@ -0,0 +1,9 @@
1
+ // Generated by build-plugin-runtime-entries.mjs. Do not edit.
2
+ import { defineCommand } from '@zhin.js/command';
3
+ import { formatProcessStatus } from "../lib/monitor.js";
4
+ export default defineCommand({
5
+ description: '查看进程监控状态(PID、运行时长、重启统计)',
6
+ execute() {
7
+ return formatProcessStatus();
8
+ },
9
+ });
package/lib/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- export { formatProcessStatus, formatUptime, processState, resetProcessMonitorForTests, resolveProcessMonitorConfig, startProcessMonitor, startTime, } from './monitor.js';
2
- export type { NotifyChannel, ProcessMonitorConfig, ProcessState } from './monitor.js';
1
+ export { classifyStartup, formatProcessStatus, formatUptime, processState, resetProcessMonitorForTests, resolveProcessMonitorConfig, startProcessMonitor, startTime, } from './monitor.js';
2
+ export type { NotifyChannel, ProcessMonitorConfig, ProcessState, StartupReason } from './monitor.js';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,2BAA2B,EAC3B,2BAA2B,EAC3B,mBAAmB,EACnB,SAAS,GACV,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,2BAA2B,EAC3B,2BAA2B,EAC3B,mBAAmB,EACnB,SAAS,GACV,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
package/lib/index.js CHANGED
@@ -1,2 +1,2 @@
1
- export { formatProcessStatus, formatUptime, processState, resetProcessMonitorForTests, resolveProcessMonitorConfig, startProcessMonitor, startTime, } from './monitor.js';
1
+ export { classifyStartup, formatProcessStatus, formatUptime, processState, resetProcessMonitorForTests, resolveProcessMonitorConfig, startProcessMonitor, startTime, } from './monitor.js';
2
2
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,2BAA2B,EAC3B,2BAA2B,EAC3B,mBAAmB,EACnB,SAAS,GACV,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,2BAA2B,EAC3B,2BAA2B,EAC3B,mBAAmB,EACnB,SAAS,GACV,MAAM,cAAc,CAAC"}
package/lib/monitor.d.ts CHANGED
@@ -13,6 +13,8 @@ export interface ProcessMonitorConfig {
13
13
  export interface ProcessState {
14
14
  lastPid?: number;
15
15
  lastStartTime?: number;
16
+ /** SIGTERM/SIGINT 正常退出时置 true,下次启动据此归为 restart 而非 crash。 */
17
+ cleanExit?: boolean;
16
18
  restartCount: number;
17
19
  crashCount: number;
18
20
  totalUptime: number;
@@ -24,6 +26,16 @@ export declare function resolveProcessMonitorConfig(raw: ProcessMonitorConfig |
24
26
  };
25
27
  export declare function formatUptime(ms: number): string;
26
28
  export declare function formatProcessStatus(): string;
29
+ export type StartupReason = 'start' | 'restart' | 'crash';
30
+ /**
31
+ * Classify this startup from persisted state.
32
+ * - 同 PID(热重载,进程未退出)跳过判定,不算 restart/crash。
33
+ * - 上次为 SIGTERM/SIGINT 正常退出(cleanExit)时归为 restart,即使间隔 <5min。
34
+ */
35
+ export declare function classifyStartup(state: ProcessState, currentPid: number, now?: number): {
36
+ reason: StartupReason;
37
+ uptime?: number;
38
+ };
27
39
  /** Start monitoring once; returns disposer for lifecycle cleanup. */
28
40
  export declare function startProcessMonitor(rawConfig?: ProcessMonitorConfig): () => void;
29
41
  /** Test helper: reset module state without touching disk. */
@@ -1 +1 @@
1
- {"version":3,"file":"monitor.d.ts","sourceRoot":"","sources":["../src/monitor.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IACjC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAID,eAAO,IAAI,YAAY,EAAE,YAIxB,CAAC;AAEF,eAAO,MAAM,SAAS,QAAa,CAAC;AAKpC,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,oBAAoB,GAAG,SAAS,GACpC,QAAQ,CACT,IAAI,CACF,oBAAoB,EACpB,SAAS,GAAG,eAAe,GAAG,iBAAiB,GAAG,eAAe,CAClE,CACF,GAAG;IAAE,cAAc,EAAE,aAAa,EAAE,CAAA;CAAE,CAQtC;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAU/C;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAgB5C;AAgJD,qEAAqE;AACrE,wBAAgB,mBAAmB,CAAC,SAAS,CAAC,EAAE,oBAAoB,GAAG,MAAM,IAAI,CA2BhF;AAED,6DAA6D;AAC7D,wBAAgB,2BAA2B,IAAI,IAAI,CAQlD"}
1
+ {"version":3,"file":"monitor.d.ts","sourceRoot":"","sources":["../src/monitor.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IACjC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAID,eAAO,IAAI,YAAY,EAAE,YAIxB,CAAC;AAEF,eAAO,MAAM,SAAS,QAAa,CAAC;AAKpC,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,oBAAoB,GAAG,SAAS,GACpC,QAAQ,CACT,IAAI,CACF,oBAAoB,EACpB,SAAS,GAAG,eAAe,GAAG,iBAAiB,GAAG,eAAe,CAClE,CACF,GAAG;IAAE,cAAc,EAAE,aAAa,EAAE,CAAA;CAAE,CAQtC;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAU/C;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAgB5C;AAkGD,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;AAE1D;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,MAAM,EAClB,GAAG,SAAa,GACf;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAQ5C;AAuCD,qEAAqE;AACrE,wBAAgB,mBAAmB,CAAC,SAAS,CAAC,EAAE,oBAAoB,GAAG,MAAM,IAAI,CA6BhF;AAED,6DAA6D;AAC7D,wBAAgB,2BAA2B,IAAI,IAAI,CAQlD"}
package/lib/monitor.js CHANGED
@@ -120,24 +120,33 @@ async function sendNotification(config, record) {
120
120
  }
121
121
  }
122
122
  }
123
+ /**
124
+ * Classify this startup from persisted state.
125
+ * - 同 PID(热重载,进程未退出)跳过判定,不算 restart/crash。
126
+ * - 上次为 SIGTERM/SIGINT 正常退出(cleanExit)时归为 restart,即使间隔 <5min。
127
+ */
128
+ export function classifyStartup(state, currentPid, now = Date.now()) {
129
+ if (!state.lastPid || !state.lastStartTime)
130
+ return { reason: 'start' };
131
+ if (state.lastPid === currentPid)
132
+ return { reason: 'start' };
133
+ const uptime = now - state.lastStartTime;
134
+ if (state.cleanExit === true || uptime >= 5 * 60 * 1000) {
135
+ return { reason: 'restart', uptime };
136
+ }
137
+ return { reason: 'crash', uptime };
138
+ }
123
139
  async function detectStartupReason(config) {
124
140
  const currentPid = process.pid;
125
141
  const currentTime = Date.now();
126
- let reason = 'start';
127
- let uptime;
128
- if (processState.lastPid && processState.lastStartTime) {
129
- const timeSinceLastStart = currentTime - processState.lastStartTime;
130
- if (timeSinceLastStart < 5 * 60 * 1000) {
131
- reason = 'crash';
132
- processState.crashCount++;
133
- }
134
- else {
135
- reason = 'restart';
136
- processState.restartCount++;
137
- }
138
- uptime = timeSinceLastStart;
142
+ const { reason, uptime } = classifyStartup(processState, currentPid, currentTime);
143
+ if (reason === 'crash')
144
+ processState.crashCount++;
145
+ else if (reason === 'restart')
146
+ processState.restartCount++;
147
+ if (uptime)
139
148
  processState.totalUptime += uptime;
140
- }
149
+ processState.cleanExit = false;
141
150
  processState.lastPid = currentPid;
142
151
  processState.lastStartTime = currentTime;
143
152
  saveProcessState();
@@ -168,9 +177,11 @@ export function startProcessMonitor(rawConfig) {
168
177
  loadProcessState();
169
178
  void detectStartupReason(config);
170
179
  const onSigterm = () => {
180
+ processState.cleanExit = true;
171
181
  saveProcessState();
172
182
  };
173
183
  const onSigint = () => {
184
+ processState.cleanExit = true;
174
185
  saveProcessState();
175
186
  };
176
187
  process.on('SIGTERM', onSigterm);
@@ -1 +1 @@
1
- {"version":3,"file":"monitor.js","sourceRoot":"","sources":["../src/monitor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"monitor.js","sourceRoot":"","sources":["../src/monitor.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zhin.js/process-monitor",
3
- "version": "3.0.4",
3
+ "version": "3.0.6",
4
4
  "description": "进程监控与重启通知插件 (Plugin Runtime)",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",
@@ -14,7 +14,7 @@
14
14
  "./package.json": "./package.json"
15
15
  },
16
16
  "files": [
17
- "plugin.ts",
17
+ "plugin.js",
18
18
  "schema.json",
19
19
  "commands",
20
20
  "tools",
@@ -38,9 +38,9 @@
38
38
  "directory": "plugins/features/process-monitor"
39
39
  },
40
40
  "dependencies": {
41
- "@zhin.js/command": "1.0.2",
42
- "@zhin.js/plugin-runtime": "1.1.0",
43
- "@zhin.js/tool": "1.0.2"
41
+ "@zhin.js/command": "1.0.4",
42
+ "@zhin.js/plugin-runtime": "1.1.1",
43
+ "@zhin.js/tool": "1.0.4"
44
44
  },
45
45
  "devDependencies": {
46
46
  "@types/node": "^26.1.0",
@@ -57,7 +57,7 @@
57
57
  "zhin": {
58
58
  "protocol": 1,
59
59
  "type": "plugin",
60
- "entry": "./plugin.ts",
60
+ "entry": "./plugin.js",
61
61
  "engine": "^1.0.0",
62
62
  "runtime": "trusted",
63
63
  "features": [
package/plugin.js ADDED
@@ -0,0 +1,20 @@
1
+ // Generated by build-plugin-runtime-entries.mjs. Do not edit.
2
+ import { definePlugin } from '@zhin.js/plugin-runtime';
3
+ import { resolveProcessMonitorConfig, startProcessMonitor, } from "./lib/monitor.js";
4
+ /**
5
+ * Process monitor Plugin Runtime cutover:
6
+ * - setup() owns file-backed restart detection + signal cleanup
7
+ * - commands/process-status for chat status
8
+ * - tools/process-status kept as agent tool surface
9
+ */
10
+ export default definePlugin({
11
+ name: 'process-monitor',
12
+ metadata: {
13
+ displayName: 'Process Monitor',
14
+ },
15
+ setup(context) {
16
+ const config = resolveProcessMonitorConfig(context.config.get());
17
+ const dispose = startProcessMonitor(config);
18
+ context.lifecycle.add(dispose);
19
+ },
20
+ });
package/src/index.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export {
2
+ classifyStartup,
2
3
  formatProcessStatus,
3
4
  formatUptime,
4
5
  processState,
@@ -7,4 +8,4 @@ export {
7
8
  startProcessMonitor,
8
9
  startTime,
9
10
  } from './monitor.js';
10
- export type { NotifyChannel, ProcessMonitorConfig, ProcessState } from './monitor.js';
11
+ export type { NotifyChannel, ProcessMonitorConfig, ProcessState, StartupReason } from './monitor.js';
package/src/monitor.ts CHANGED
@@ -23,6 +23,8 @@ export interface ProcessMonitorConfig {
23
23
  export interface ProcessState {
24
24
  lastPid?: number;
25
25
  lastStartTime?: number;
26
+ /** SIGTERM/SIGINT 正常退出时置 true,下次启动据此归为 restart 而非 crash。 */
27
+ cleanExit?: boolean;
26
28
  restartCount: number;
27
29
  crashCount: number;
28
30
  totalUptime: number;
@@ -184,27 +186,39 @@ async function sendNotification(
184
186
  }
185
187
  }
186
188
 
189
+ export type StartupReason = 'start' | 'restart' | 'crash';
190
+
191
+ /**
192
+ * Classify this startup from persisted state.
193
+ * - 同 PID(热重载,进程未退出)跳过判定,不算 restart/crash。
194
+ * - 上次为 SIGTERM/SIGINT 正常退出(cleanExit)时归为 restart,即使间隔 <5min。
195
+ */
196
+ export function classifyStartup(
197
+ state: ProcessState,
198
+ currentPid: number,
199
+ now = Date.now(),
200
+ ): { reason: StartupReason; uptime?: number } {
201
+ if (!state.lastPid || !state.lastStartTime) return { reason: 'start' };
202
+ if (state.lastPid === currentPid) return { reason: 'start' };
203
+ const uptime = now - state.lastStartTime;
204
+ if (state.cleanExit === true || uptime >= 5 * 60 * 1000) {
205
+ return { reason: 'restart', uptime };
206
+ }
207
+ return { reason: 'crash', uptime };
208
+ }
209
+
187
210
  async function detectStartupReason(
188
211
  config: ReturnType<typeof resolveProcessMonitorConfig>,
189
212
  ): Promise<void> {
190
213
  const currentPid = process.pid;
191
214
  const currentTime = Date.now();
192
- let reason: 'start' | 'restart' | 'crash' = 'start';
193
- let uptime: number | undefined;
194
215
 
195
- if (processState.lastPid && processState.lastStartTime) {
196
- const timeSinceLastStart = currentTime - processState.lastStartTime;
197
- if (timeSinceLastStart < 5 * 60 * 1000) {
198
- reason = 'crash';
199
- processState.crashCount++;
200
- } else {
201
- reason = 'restart';
202
- processState.restartCount++;
203
- }
204
- uptime = timeSinceLastStart;
205
- processState.totalUptime += uptime;
206
- }
216
+ const { reason, uptime } = classifyStartup(processState, currentPid, currentTime);
217
+ if (reason === 'crash') processState.crashCount++;
218
+ else if (reason === 'restart') processState.restartCount++;
219
+ if (uptime) processState.totalUptime += uptime;
207
220
 
221
+ processState.cleanExit = false;
208
222
  processState.lastPid = currentPid;
209
223
  processState.lastStartTime = currentTime;
210
224
  saveProcessState();
@@ -241,9 +255,11 @@ export function startProcessMonitor(rawConfig?: ProcessMonitorConfig): () => voi
241
255
  void detectStartupReason(config);
242
256
 
243
257
  const onSigterm = () => {
258
+ processState.cleanExit = true;
244
259
  saveProcessState();
245
260
  };
246
261
  const onSigint = () => {
262
+ processState.cleanExit = true;
247
263
  saveProcessState();
248
264
  };
249
265
  process.on('SIGTERM', onSigterm);
@@ -0,0 +1,12 @@
1
+ // Generated by build-plugin-runtime-entries.mjs. Do not edit.
2
+ import { defineAgentTool } from '@zhin.js/tool';
3
+ import { formatProcessStatus } from "../lib/monitor.js";
4
+ export default defineAgentTool({
5
+ description: '查看进程监控状态,包括 PID、运行时长、内存、重启和崩溃统计',
6
+ inputSchema: {
7
+ type: 'object',
8
+ properties: {},
9
+ },
10
+ approval: 'never',
11
+ execute: () => formatProcessStatus(),
12
+ });
package/plugin.ts DELETED
@@ -1,24 +0,0 @@
1
- import { definePlugin } from '@zhin.js/plugin-runtime';
2
- import {
3
- resolveProcessMonitorConfig,
4
- startProcessMonitor,
5
- type ProcessMonitorConfig,
6
- } from './src/monitor.js';
7
-
8
- /**
9
- * Process monitor Plugin Runtime cutover:
10
- * - setup() owns file-backed restart detection + signal cleanup
11
- * - commands/process-status for chat status
12
- * - tools/process-status kept as agent tool surface
13
- */
14
- export default definePlugin<ProcessMonitorConfig>({
15
- name: 'process-monitor',
16
- metadata: {
17
- displayName: 'Process Monitor',
18
- },
19
- setup(context) {
20
- const config = resolveProcessMonitorConfig(context.config.get());
21
- const dispose = startProcessMonitor(config);
22
- context.lifecycle.add(dispose);
23
- },
24
- });