agent-gear 2.1.1 → 2.3.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.
@@ -0,0 +1,327 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { homedir } from 'node:os';
3
+ /**
4
+ * 单条脚本的尾部输出上限(256 KiB),与 cloud-controller 的 `WORKLOAD_LOG_MAX_BYTES` 对齐。
5
+ */
6
+ export const MAX_OUTPUT_BYTES = 256 * 1024;
7
+ /** 未确认执行结果在内存中的保留上限(重连重放用)。 */
8
+ export const MAX_PENDING_RESULTS = 50;
9
+ /** 空 script(含纯空白)的失败文案。 */
10
+ export const EMPTY_SCRIPT_MESSAGE = '工作负载脚本为空,跳过执行';
11
+ /**
12
+ * 单条脚本输出的尾部环形截断缓冲:始终保留最近 `limit` 字节。
13
+ *
14
+ * 大输出脚本(如构建日志、循环 echo)若不截断会打爆内存与 Mongo,
15
+ * 契约要求保留尾部 ≤ 256 KiB(尾部通常包含真正的错误信息)。
16
+ */
17
+ class TailBuffer {
18
+ limit;
19
+ chunks = [];
20
+ size = 0;
21
+ constructor(limit) {
22
+ this.limit = limit;
23
+ }
24
+ push(chunk) {
25
+ if (chunk.length === 0)
26
+ return;
27
+ this.chunks.push(chunk);
28
+ this.size += chunk.length;
29
+ while (this.size > this.limit && this.chunks.length > 0) {
30
+ const first = this.chunks[0];
31
+ const excess = this.size - this.limit;
32
+ if (first.length <= excess) {
33
+ this.chunks.shift();
34
+ this.size -= first.length;
35
+ }
36
+ else {
37
+ this.chunks[0] = first.subarray(excess);
38
+ this.size -= excess;
39
+ }
40
+ }
41
+ }
42
+ toString() {
43
+ const buffer = Buffer.concat(this.chunks);
44
+ // 截断保留尾部时,起始处可能落在多字节 UTF-8 字符的续字节上(0b10xxxxxx),
45
+ // 直接解码会在日志首字符产生乱码(U+FFFD);跳过续字节到字符边界再解码
46
+ // (与服务端 `truncateLogTail` 同一口径)。
47
+ let start = 0;
48
+ while (start < buffer.length && (buffer[start] & 0xc0) === 0x80)
49
+ start += 1;
50
+ return buffer.subarray(start).toString('utf8');
51
+ }
52
+ }
53
+ function nowIso() {
54
+ return new Date().toISOString();
55
+ }
56
+ /** 单个参数值 → 环境变量字符串(契约 §2.9「参数注入约定」)。 */
57
+ function encodeParamValue(value) {
58
+ if (typeof value === 'string')
59
+ return value;
60
+ if (typeof value === 'boolean')
61
+ return value ? 'true' : 'false';
62
+ if (typeof value === 'number' || typeof value === 'bigint')
63
+ return String(value);
64
+ if (value === null || value === undefined)
65
+ return '';
66
+ // MULTI_SELECT 等复合值:JSON 数组字符串(脚本自行解析)
67
+ return JSON.stringify(value);
68
+ }
69
+ /**
70
+ * 由 `process.env` 派生单条 item 的执行环境:
71
+ * - `WORKLOAD_PARAMS`:完整参数 JSON 字符串(缺省 `{}`);
72
+ * - `WORKLOAD_PARAM_<KEY_UPPER>`:单值编码(字符串原样、布尔 `"true"`/`"false"`、多选 JSON 数组字符串)。
73
+ *
74
+ * 每次 spawn 都从当前 `process.env` 重新派生,参数 env 仅对当前 item 生效、不污染后续脚本;
75
+ * 不修改脚本文本、不做字符串替换(避免注入)。
76
+ */
77
+ function buildWorkloadEnv(params) {
78
+ const normalized = params && typeof params === 'object' && !Array.isArray(params) ? params : {};
79
+ const env = {
80
+ ...process.env,
81
+ WORKLOAD_PARAMS: JSON.stringify(normalized),
82
+ };
83
+ for (const [key, value] of Object.entries(normalized)) {
84
+ if (!key || value === null || value === undefined)
85
+ continue;
86
+ env[`WORKLOAD_PARAM_${key.toUpperCase()}`] = encodeParamValue(value);
87
+ }
88
+ return env;
89
+ }
90
+ /**
91
+ * 工作负载脚本执行器(agent-gear 侧)。
92
+ *
93
+ * - 按 `items` 顺序**串行**执行 `bash -c <script>`(`cwd=os.homedir()`,继承进程环境并按 item 注入
94
+ * `WORKLOAD_PARAMS` / `WORKLOAD_PARAM_*`,stdout/stderr 合并捕获);
95
+ * - 单条超时或收到新批次时终止整个进程组(`detached: true` + `kill(-pid)`);
96
+ * - 非零退出回报 `failed` + `exitCode`,不影响后续条目;
97
+ * - `post` 批次共享 `budgetMs`:剩余预算耗尽时后续条目直接回报 `timeout`(不启动进程);
98
+ * - 未被服务端确认的结果保存在内存(上限 50 条)供重连重放。
99
+ *
100
+ * 进程内全局单实例,保证同一时间只跑一个批次(后到的批次打断前一个,用于 post 打断 init)。
101
+ */
102
+ export class WorkloadExecutor {
103
+ active = null;
104
+ activePromise = null;
105
+ pendingResults = [];
106
+ /** 当前是否有批次正在执行。 */
107
+ isRunning() {
108
+ return this.active !== null;
109
+ }
110
+ /** 未确认的执行结果快照(供重连重放读取)。 */
111
+ getPendingResults() {
112
+ return [...this.pendingResults];
113
+ }
114
+ /** 清空未确认的执行结果。 */
115
+ clearPendingResults() {
116
+ this.pendingResults = [];
117
+ }
118
+ /**
119
+ * 重连后重放未确认结果:逐条 emit 后清空缓冲。
120
+ * 服务端对已进入终态的记录按幂等忽略(契约 §2.9/§2.10)。
121
+ */
122
+ replayPendingResults(emit) {
123
+ const pending = this.getPendingResults();
124
+ this.clearPendingResults();
125
+ for (const result of pending) {
126
+ emit(result);
127
+ }
128
+ }
129
+ /** 等待当前批次结束;无批次时立即返回,超时也返回(不阻塞退出流程)。 */
130
+ async waitForIdle(timeoutMs) {
131
+ const promise = this.activePromise;
132
+ if (!this.active || !promise)
133
+ return;
134
+ let timer;
135
+ const timeout = new Promise((resolve) => {
136
+ timer = setTimeout(resolve, timeoutMs);
137
+ });
138
+ try {
139
+ await Promise.race([promise.then(() => undefined, () => undefined), timeout]);
140
+ }
141
+ finally {
142
+ if (timer)
143
+ clearTimeout(timer);
144
+ }
145
+ }
146
+ /**
147
+ * 执行一个批次。若已有批次在跑,先终止其进程组并停止推进,再执行新批次。
148
+ */
149
+ runBatch(payload, onResult) {
150
+ this.interruptActive();
151
+ const run = { cancelled: false, child: null };
152
+ this.active = run;
153
+ const promise = this.executeBatch(payload, onResult, run).finally(() => {
154
+ // 仅当自己仍是当前批次时才清空(被打断时 active 已指向新批次)
155
+ if (this.active === run) {
156
+ this.active = null;
157
+ this.activePromise = null;
158
+ }
159
+ });
160
+ this.activePromise = promise;
161
+ return promise;
162
+ }
163
+ async executeBatch(payload, onResult, run) {
164
+ const items = Array.isArray(payload?.items) ? payload.items : [];
165
+ if (items.length === 0)
166
+ return;
167
+ const budgetMs = typeof payload.budgetMs === 'number' && payload.budgetMs > 0 ? payload.budgetMs : null;
168
+ const batchStart = Date.now();
169
+ for (const item of items) {
170
+ if (run.cancelled)
171
+ return;
172
+ let effectiveTimeoutMs = item.timeoutMs;
173
+ if (budgetMs !== null) {
174
+ const remaining = budgetMs - (Date.now() - batchStart);
175
+ if (remaining <= 0) {
176
+ // 预算耗尽:后续条目不再启动进程,直接回报 timeout
177
+ this.report(onResult, this.emptyResult(item.logId, 'timeout', ''));
178
+ continue;
179
+ }
180
+ effectiveTimeoutMs = Math.min(item.timeoutMs, remaining);
181
+ }
182
+ if (!item.script || item.script.trim().length === 0) {
183
+ this.report(onResult, this.emptyResult(item.logId, 'failed', EMPTY_SCRIPT_MESSAGE));
184
+ continue;
185
+ }
186
+ const outcome = await this.executeItem(item, effectiveTimeoutMs, run);
187
+ if (outcome.cancelled)
188
+ return;
189
+ if (outcome.result)
190
+ this.report(onResult, outcome.result);
191
+ }
192
+ }
193
+ report(onResult, result) {
194
+ this.pendingResults.push(result);
195
+ while (this.pendingResults.length > MAX_PENDING_RESULTS) {
196
+ this.pendingResults.shift();
197
+ }
198
+ onResult(result);
199
+ }
200
+ emptyResult(logId, status, log) {
201
+ const now = nowIso();
202
+ return { logId, status, exitCode: null, log, startedAt: now, finishedAt: now };
203
+ }
204
+ executeItem(item, timeoutMs, run) {
205
+ return new Promise((resolve) => {
206
+ if (run.cancelled) {
207
+ resolve({ cancelled: true });
208
+ return;
209
+ }
210
+ const startedAt = nowIso();
211
+ let child;
212
+ try {
213
+ child = spawn('bash', ['-c', item.script], {
214
+ cwd: homedir(),
215
+ detached: true,
216
+ env: buildWorkloadEnv(item.params),
217
+ });
218
+ }
219
+ catch (error) {
220
+ resolve({
221
+ cancelled: false,
222
+ result: {
223
+ logId: item.logId,
224
+ status: 'failed',
225
+ exitCode: null,
226
+ log: `启动脚本失败: ${error.message}`,
227
+ startedAt,
228
+ finishedAt: nowIso(),
229
+ },
230
+ });
231
+ return;
232
+ }
233
+ run.child = child;
234
+ const tail = new TailBuffer(MAX_OUTPUT_BYTES);
235
+ let settled = false;
236
+ let timedOut = false;
237
+ const finish = (outcome) => {
238
+ if (settled)
239
+ return;
240
+ settled = true;
241
+ clearTimeout(timer);
242
+ if (run.child === child)
243
+ run.child = null;
244
+ resolve(outcome);
245
+ };
246
+ const timer = setTimeout(() => {
247
+ timedOut = true;
248
+ this.killGroup(child);
249
+ }, Math.max(1, timeoutMs));
250
+ child.stdout?.on('data', (chunk) => tail.push(chunk));
251
+ child.stderr?.on('data', (chunk) => tail.push(chunk));
252
+ child.on('error', (error) => {
253
+ tail.push(Buffer.from(`\n[执行脚本失败] ${error.message}`));
254
+ if (run.cancelled) {
255
+ finish({ cancelled: true });
256
+ return;
257
+ }
258
+ finish({
259
+ cancelled: false,
260
+ result: {
261
+ logId: item.logId,
262
+ status: 'failed',
263
+ exitCode: null,
264
+ log: tail.toString(),
265
+ startedAt,
266
+ finishedAt: nowIso(),
267
+ },
268
+ });
269
+ });
270
+ child.on('close', (code, signal) => {
271
+ if (run.cancelled) {
272
+ finish({ cancelled: true });
273
+ return;
274
+ }
275
+ if (timedOut) {
276
+ finish({
277
+ cancelled: false,
278
+ result: {
279
+ logId: item.logId,
280
+ status: 'timeout',
281
+ exitCode: null,
282
+ log: tail.toString(),
283
+ startedAt,
284
+ finishedAt: nowIso(),
285
+ },
286
+ });
287
+ return;
288
+ }
289
+ const exitCode = code ?? (signal ? 1 : 0);
290
+ finish({
291
+ cancelled: false,
292
+ result: {
293
+ logId: item.logId,
294
+ status: exitCode === 0 ? 'success' : 'failed',
295
+ exitCode,
296
+ log: tail.toString(),
297
+ startedAt,
298
+ finishedAt: nowIso(),
299
+ },
300
+ });
301
+ });
302
+ });
303
+ }
304
+ interruptActive() {
305
+ const run = this.active;
306
+ if (!run)
307
+ return;
308
+ run.cancelled = true;
309
+ this.killGroup(run.child);
310
+ }
311
+ killGroup(child) {
312
+ if (!child || child.pid == null)
313
+ return;
314
+ try {
315
+ process.kill(-child.pid, 'SIGKILL');
316
+ }
317
+ catch {
318
+ try {
319
+ child.kill('SIGKILL');
320
+ }
321
+ catch {
322
+ /* process already exited */
323
+ }
324
+ }
325
+ }
326
+ }
327
+ //# sourceMappingURL=workload-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workload-executor.js","sourceRoot":"","sources":["../src/workload-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=workload-executor.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workload-executor.test.d.ts","sourceRoot":"","sources":["../src/workload-executor.test.ts"],"names":[],"mappings":""}