@zhin.js/process-monitor 1.0.0 → 2.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/lib/index.d.ts ADDED
@@ -0,0 +1,13 @@
1
+ declare const plugin: import("zhin.js").Plugin;
2
+ interface ProcessState {
3
+ lastPid?: number;
4
+ lastStartTime?: number;
5
+ restartCount: number;
6
+ crashCount: number;
7
+ totalUptime: number;
8
+ }
9
+ export declare let processState: ProcessState;
10
+ export declare const startTime: number;
11
+ export declare function formatUptime(ms: number): string;
12
+ export default plugin;
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,QAAA,MAAM,MAAM,0BAAc,CAAC;AAsC3B,UAAU,YAAY;IACpB,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;AAED,eAAO,IAAI,YAAY,EAAE,YAIxB,CAAC;AAEF,eAAO,MAAM,SAAS,QAAa,CAAC;AA2GpC,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAU/C;AAwCD,eAAe,MAAM,CAAC"}
package/lib/index.js ADDED
@@ -0,0 +1,169 @@
1
+ /**
2
+ * @zhin.js/process-monitor
3
+ *
4
+ * 进程监控与重启通知插件
5
+ */
6
+ import { formatCompact, usePlugin } from 'zhin.js';
7
+ import os from 'os';
8
+ import fs from 'fs';
9
+ import path from 'path';
10
+ const plugin = usePlugin();
11
+ const { logger, root } = plugin;
12
+ const configService = root.inject('config');
13
+ const appConfig = configService?.getPrimary() || {};
14
+ const config = {
15
+ enabled: true,
16
+ notifyChannels: [],
17
+ notifyOnStart: true,
18
+ notifyOnRestart: true,
19
+ notifyOnCrash: true,
20
+ ...appConfig['process-monitor'],
21
+ };
22
+ if (!config.enabled) {
23
+ logger.info(formatCompact({ op: 'load', enabled: false }));
24
+ }
25
+ // ─── 状态管理 ────────────────────────────────────────────────────────────────
26
+ const STATE_FILE = path.join(process.cwd(), 'data', 'process-state.json');
27
+ export let processState = {
28
+ restartCount: 0,
29
+ crashCount: 0,
30
+ totalUptime: 0,
31
+ };
32
+ export const startTime = Date.now();
33
+ function loadProcessState() {
34
+ try {
35
+ if (fs.existsSync(STATE_FILE)) {
36
+ const data = fs.readFileSync(STATE_FILE, 'utf-8');
37
+ processState = JSON.parse(data);
38
+ }
39
+ }
40
+ catch (error) {
41
+ logger.warn(formatCompact({ op: 'load_state', ok: false, error: String(error) }));
42
+ }
43
+ }
44
+ function saveProcessState() {
45
+ try {
46
+ fs.mkdirSync(path.dirname(STATE_FILE), { recursive: true });
47
+ fs.writeFileSync(STATE_FILE, JSON.stringify(processState, null, 2));
48
+ }
49
+ catch (error) {
50
+ logger.warn(formatCompact({ op: 'save_state', ok: false, error: String(error) }));
51
+ }
52
+ }
53
+ // ─── 启动检测 ────────────────────────────────────────────────────────────────
54
+ async function detectStartupReason() {
55
+ const currentPid = process.pid;
56
+ const currentTime = Date.now();
57
+ let reason = 'start';
58
+ let uptime;
59
+ if (processState.lastPid && processState.lastStartTime) {
60
+ const timeSinceLastStart = currentTime - processState.lastStartTime;
61
+ if (timeSinceLastStart < 5 * 60 * 1000) {
62
+ reason = 'crash';
63
+ processState.crashCount++;
64
+ logger.warn(formatCompact({ op: 'restart', abnormal: true, since_last_s: Math.floor(timeSinceLastStart / 1000) }));
65
+ }
66
+ else {
67
+ reason = 'restart';
68
+ processState.restartCount++;
69
+ logger.info(formatCompact({ op: 'restart', abnormal: false }));
70
+ }
71
+ uptime = timeSinceLastStart;
72
+ processState.totalUptime += uptime;
73
+ }
74
+ else {
75
+ logger.info(formatCompact({ first: true }));
76
+ }
77
+ processState.lastPid = currentPid;
78
+ processState.lastStartTime = currentTime;
79
+ saveProcessState();
80
+ const record = {
81
+ timestamp: new Date(),
82
+ reason,
83
+ uptime,
84
+ pid: currentPid,
85
+ hostname: os.hostname(),
86
+ platform: `${os.platform()}-${os.arch()}`,
87
+ nodeVersion: process.version,
88
+ memory: Math.round(process.memoryUsage().heapUsed / 1024 / 1024),
89
+ };
90
+ const shouldNotify = (reason === 'start' && config.notifyOnStart) ||
91
+ (reason === 'restart' && config.notifyOnRestart) ||
92
+ (reason === 'crash' && config.notifyOnCrash);
93
+ if (shouldNotify && config.notifyChannels && config.notifyChannels.length > 0) {
94
+ await sendNotification(record);
95
+ }
96
+ }
97
+ // ─── 通知 ────────────────────────────────────────────────────────────────────
98
+ function formatNotificationMessage(record) {
99
+ const emoji = { start: '🚀', restart: '🔄', crash: '💥' }[record.reason] || '📊';
100
+ const reasonText = { start: '首次启动', restart: '正常重启', crash: '异常崩溃' }[record.reason] || '未知';
101
+ const lines = [
102
+ `${emoji} 【进程监控通知】`,
103
+ '',
104
+ `📊 事件: ${reasonText}`,
105
+ `⏰ 时间: ${record.timestamp.toLocaleString('zh-CN')}`,
106
+ `🖥️ 主机: ${record.hostname}`,
107
+ `🔢 PID: ${record.pid}`,
108
+ `💻 平台: ${record.platform}`,
109
+ `📦 Node: ${record.nodeVersion}`,
110
+ ];
111
+ if (record.uptime) {
112
+ lines.push(`⏱️ 运行时长: ${formatUptime(record.uptime)}`);
113
+ }
114
+ if (record.memory) {
115
+ lines.push(`💾 内存: ${record.memory} MB`);
116
+ }
117
+ lines.push('', `📈 统计:`);
118
+ lines.push(` • 总重启: ${processState.restartCount} 次`);
119
+ lines.push(` • 崩溃: ${processState.crashCount} 次`);
120
+ lines.push(` • 累计运行: ${formatUptime(processState.totalUptime)}`);
121
+ return lines.join('\n');
122
+ }
123
+ export function formatUptime(ms) {
124
+ const seconds = Math.floor(ms / 1000);
125
+ const minutes = Math.floor(seconds / 60);
126
+ const hours = Math.floor(minutes / 60);
127
+ const days = Math.floor(hours / 24);
128
+ if (days > 0)
129
+ return `${days}天${hours % 24}小时`;
130
+ if (hours > 0)
131
+ return `${hours}小时${minutes % 60}分钟`;
132
+ if (minutes > 0)
133
+ return `${minutes}分钟`;
134
+ return `${seconds}秒`;
135
+ }
136
+ async function sendNotification(record) {
137
+ const message = formatNotificationMessage(record);
138
+ for (const channel of config.notifyChannels || []) {
139
+ try {
140
+ if (channel.type === 'webhook') {
141
+ await fetch(channel.target, {
142
+ method: 'POST',
143
+ headers: { 'Content-Type': 'application/json' },
144
+ body: JSON.stringify({ event: 'process_restart', data: record, stats: processState }),
145
+ });
146
+ logger.debug(`Webhook 通知已发送: ${channel.target}`);
147
+ }
148
+ }
149
+ catch (error) {
150
+ logger.error(`发送通知失败 (${channel.type}):`, error);
151
+ }
152
+ }
153
+ }
154
+ // ─── 初始化 ──────────────────────────────────────────────────────────────────
155
+ if (config.enabled) {
156
+ loadProcessState();
157
+ detectStartupReason();
158
+ process.on('SIGTERM', () => {
159
+ logger.info(formatCompact({ op: 'shutdown', signal: 'SIGTERM' }));
160
+ saveProcessState();
161
+ });
162
+ process.on('SIGINT', () => {
163
+ logger.info(formatCompact({ op: 'shutdown', signal: 'SIGINT' }));
164
+ saveProcessState();
165
+ });
166
+ }
167
+ // AI 工具已迁移到 tools/*.tool.md,框架自动发现注册
168
+ export default plugin;
169
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.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": "1.0.0",
3
+ "version": "2.0.0",
4
4
  "description": "进程监控与重启通知插件",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",
@@ -39,14 +39,15 @@
39
39
  "directory": "plugins/features/process-monitor"
40
40
  },
41
41
  "dependencies": {
42
- "zhin.js": "2.0.0"
42
+ "zhin.js": "3.0.0"
43
43
  },
44
44
  "devDependencies": {
45
- "@types/node": "^25.9.1",
46
- "typescript": "^6.0.3"
45
+ "@types/node": "^25.9.2",
46
+ "typescript": "^6.0.3",
47
+ "zhin.js": "3.0.0"
47
48
  },
48
49
  "peerDependencies": {
49
- "zhin.js": "2.0.0"
50
+ "zhin.js": "3.0.0"
50
51
  },
51
52
  "scripts": {
52
53
  "build": "tsc",