@zqagent/core 0.3.7 → 0.3.9

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 (41) hide show
  1. package/dist/index.cjs +47 -3
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.js +47 -3
  4. package/dist/index.js.map +1 -1
  5. package/dist/internal/tools/git.cjs +47 -3
  6. package/dist/internal/tools/git.cjs.map +1 -1
  7. package/dist/internal/tools/git.js +47 -3
  8. package/dist/internal/tools/git.js.map +1 -1
  9. package/dist/internal/tools/shell.cjs +54 -5
  10. package/dist/internal/tools/shell.cjs.map +1 -1
  11. package/dist/internal/tools/shell.d.cts +26 -1
  12. package/dist/internal/tools/shell.d.ts +26 -1
  13. package/dist/internal/tools/shell.js +52 -4
  14. package/dist/internal/tools/shell.js.map +1 -1
  15. package/dist/internal/update/controller.cjs +1 -1
  16. package/dist/internal/update/controller.js +1 -1
  17. package/dist/internal/update/platform.cjs +1 -1
  18. package/dist/internal/update/platform.js +1 -1
  19. package/dist/tools/explore.cjs +47 -3
  20. package/dist/tools/explore.cjs.map +1 -1
  21. package/dist/tools/explore.js +47 -3
  22. package/dist/tools/explore.js.map +1 -1
  23. package/dist/tools/git.cjs +47 -3
  24. package/dist/tools/git.cjs.map +1 -1
  25. package/dist/tools/git.js +47 -3
  26. package/dist/tools/git.js.map +1 -1
  27. package/dist/tools/media.cjs +47 -3
  28. package/dist/tools/media.cjs.map +1 -1
  29. package/dist/tools/media.js +47 -3
  30. package/dist/tools/media.js.map +1 -1
  31. package/dist/tools/search.cjs +47 -3
  32. package/dist/tools/search.cjs.map +1 -1
  33. package/dist/tools/search.js +47 -3
  34. package/dist/tools/search.js.map +1 -1
  35. package/dist/tools/shell.cjs +54 -5
  36. package/dist/tools/shell.cjs.map +1 -1
  37. package/dist/tools/shell.d.cts +1 -1
  38. package/dist/tools/shell.d.ts +1 -1
  39. package/dist/tools/shell.js +52 -4
  40. package/dist/tools/shell.js.map +1 -1
  41. package/package.json +2 -2
@@ -256,6 +256,12 @@ var ShellTaskManager = class {
256
256
  tasks = /* @__PURE__ */ new Map();
257
257
  seq = 0;
258
258
  cleanupInstalled = false;
259
+ /** 任务集合变化监听(server 用它推送,替代控制台的 5s 轮询) */
260
+ listener = null;
261
+ /** 注册变化监听(传 null 取消) */
262
+ setListener(cb) {
263
+ this.listener = cb;
264
+ }
259
265
  /** 启动一个后台任务,立即返回快照(不等退出) */
260
266
  start(opts) {
261
267
  this.installCleanup();
@@ -283,16 +289,26 @@ var ShellTaskManager = class {
283
289
  this.tasks.set(id, task);
284
290
  child.stdout?.on("data", (d) => task.stdout.add(d.toString("utf-8")));
285
291
  child.stderr?.on("data", (d) => task.stderr.add(d.toString("utf-8")));
286
- child.on("error", (err) => task.stderr.add(`[spawn error] ${err.message}
287
- `));
292
+ child.on("error", (err) => {
293
+ task.stderr.add(`[spawn error] ${err.message}
294
+ `);
295
+ if (task.status === "running") {
296
+ task.endedAt = Date.now();
297
+ task.status = "exited";
298
+ this._notify(task.scope);
299
+ }
300
+ });
288
301
  child.on("exit", (code, signal) => {
289
302
  task.exitCode = code;
290
303
  task.signal = signal;
291
304
  task.endedAt = Date.now();
292
305
  if (task.status !== "killed") task.status = "exited";
306
+ this._notify(task.scope);
293
307
  });
294
308
  child.unref();
295
- return this.snapshot(task);
309
+ const snap = this.snapshot(task);
310
+ this._notify(task.scope);
311
+ return snap;
296
312
  }
297
313
  /** 读取任务输出与状态 */
298
314
  output(taskId) {
@@ -311,6 +327,7 @@ var ShellTaskManager = class {
311
327
  task.status = "killed";
312
328
  task.endedAt = Date.now();
313
329
  killTree(task.child.pid);
330
+ this._notify(task.scope);
314
331
  }
315
332
  return this.snapshot(task);
316
333
  }
@@ -330,6 +347,33 @@ var ShellTaskManager = class {
330
347
  }
331
348
  }
332
349
  }
350
+ /**
351
+ * 通知订阅方「该归属下运行中的任务变了」。
352
+ *
353
+ * 只遍历内存任务表取字段,不调用 snapshot(后者会 join 两路 64KB 缓冲)。
354
+ */
355
+ _notify(scope) {
356
+ const listener = this.listener;
357
+ if (!listener) return;
358
+ const tasks = [];
359
+ for (const task of this.tasks.values()) {
360
+ if (task.scope !== scope || task.status !== "running") continue;
361
+ tasks.push({
362
+ task_id: task.id,
363
+ command: task.command,
364
+ status: task.status,
365
+ running: true,
366
+ exit_code: task.exitCode,
367
+ signal: task.signal,
368
+ duration_ms: Date.now() - task.startedAt,
369
+ started_at: task.startedAt
370
+ });
371
+ }
372
+ try {
373
+ listener(scope, tasks);
374
+ } catch {
375
+ }
376
+ }
333
377
  snapshot(task) {
334
378
  return {
335
379
  task_id: task.id,