@lokvis/runtime 0.2.2 → 0.4.2

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 (125) hide show
  1. package/dist/asset-store.d.ts +13 -0
  2. package/dist/asset-store.d.ts.map +1 -1
  3. package/dist/asset-store.js +15 -2
  4. package/dist/asset-store.js.map +1 -1
  5. package/dist/batch-processor.d.ts +32 -161
  6. package/dist/batch-processor.d.ts.map +1 -1
  7. package/dist/batch-processor.js +107 -333
  8. package/dist/batch-processor.js.map +1 -1
  9. package/dist/batch-progress.d.ts +94 -0
  10. package/dist/batch-progress.d.ts.map +1 -0
  11. package/dist/batch-progress.js +128 -0
  12. package/dist/batch-progress.js.map +1 -0
  13. package/dist/batch-scheduler.d.ts +70 -0
  14. package/dist/batch-scheduler.d.ts.map +1 -0
  15. package/dist/batch-scheduler.js +147 -0
  16. package/dist/batch-scheduler.js.map +1 -0
  17. package/dist/browser-detect.d.ts +115 -0
  18. package/dist/browser-detect.d.ts.map +1 -0
  19. package/dist/browser-detect.js +160 -0
  20. package/dist/browser-detect.js.map +1 -0
  21. package/dist/concurrency-controller.d.ts +31 -0
  22. package/dist/concurrency-controller.d.ts.map +1 -0
  23. package/dist/concurrency-controller.js +33 -0
  24. package/dist/concurrency-controller.js.map +1 -0
  25. package/dist/errors.d.ts +51 -0
  26. package/dist/errors.d.ts.map +1 -0
  27. package/dist/errors.js +74 -0
  28. package/dist/errors.js.map +1 -0
  29. package/dist/executor.d.ts +9 -0
  30. package/dist/executor.d.ts.map +1 -1
  31. package/dist/executor.js +102 -48
  32. package/dist/executor.js.map +1 -1
  33. package/dist/history.d.ts.map +1 -1
  34. package/dist/history.js +3 -2
  35. package/dist/history.js.map +1 -1
  36. package/dist/idb-asset-store.d.ts.map +1 -1
  37. package/dist/idb-asset-store.js +6 -1
  38. package/dist/idb-asset-store.js.map +1 -1
  39. package/dist/index.d.ts +17 -15
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +20 -15
  42. package/dist/index.js.map +1 -1
  43. package/dist/managers/asset-manager.d.ts +114 -0
  44. package/dist/managers/asset-manager.d.ts.map +1 -0
  45. package/dist/managers/asset-manager.js +238 -0
  46. package/dist/managers/asset-manager.js.map +1 -0
  47. package/dist/managers/history-manager.d.ts +100 -0
  48. package/dist/managers/history-manager.d.ts.map +1 -0
  49. package/dist/managers/history-manager.js +296 -0
  50. package/dist/managers/history-manager.js.map +1 -0
  51. package/dist/managers/mcp-manifest-builder.d.ts +18 -0
  52. package/dist/managers/mcp-manifest-builder.d.ts.map +1 -0
  53. package/dist/managers/mcp-manifest-builder.js +99 -0
  54. package/dist/managers/mcp-manifest-builder.js.map +1 -0
  55. package/dist/managers/quota-manager.d.ts +42 -0
  56. package/dist/managers/quota-manager.d.ts.map +1 -0
  57. package/dist/managers/quota-manager.js +126 -0
  58. package/dist/managers/quota-manager.js.map +1 -0
  59. package/dist/managers/workflow-coordinator.d.ts +62 -0
  60. package/dist/managers/workflow-coordinator.d.ts.map +1 -0
  61. package/dist/managers/workflow-coordinator.js +125 -0
  62. package/dist/managers/workflow-coordinator.js.map +1 -0
  63. package/dist/opfs-asset-store.d.ts.map +1 -1
  64. package/dist/opfs-asset-store.js +12 -2
  65. package/dist/opfs-asset-store.js.map +1 -1
  66. package/dist/plugin-context.d.ts +35 -0
  67. package/dist/plugin-context.d.ts.map +1 -0
  68. package/dist/plugin-context.js +62 -0
  69. package/dist/plugin-context.js.map +1 -0
  70. package/dist/plugin-permissions.d.ts +99 -0
  71. package/dist/plugin-permissions.d.ts.map +1 -0
  72. package/dist/plugin-permissions.js +205 -0
  73. package/dist/plugin-permissions.js.map +1 -0
  74. package/dist/runtime-impl.d.ts +116 -0
  75. package/dist/runtime-impl.d.ts.map +1 -0
  76. package/dist/runtime-impl.js +270 -0
  77. package/dist/runtime-impl.js.map +1 -0
  78. package/dist/runtime.d.ts +10 -233
  79. package/dist/runtime.d.ts.map +1 -1
  80. package/dist/runtime.js +12 -978
  81. package/dist/runtime.js.map +1 -1
  82. package/dist/test-utils/fakes.d.ts +35 -0
  83. package/dist/test-utils/fakes.d.ts.map +1 -0
  84. package/dist/test-utils/fakes.js +60 -0
  85. package/dist/test-utils/fakes.js.map +1 -0
  86. package/dist/types.d.ts +113 -1
  87. package/dist/types.d.ts.map +1 -1
  88. package/dist/worker-host.d.ts.map +1 -1
  89. package/dist/worker-host.js +32 -9
  90. package/dist/worker-host.js.map +1 -1
  91. package/dist/worker-protocol.d.ts +30 -0
  92. package/dist/worker-protocol.d.ts.map +1 -1
  93. package/dist/worker-protocol.js +24 -0
  94. package/dist/worker-protocol.js.map +1 -1
  95. package/package.json +2 -2
  96. package/src/asset-store.ts +32 -2
  97. package/src/batch-processor.ts +133 -510
  98. package/src/batch-progress.ts +228 -0
  99. package/src/batch-scheduler.ts +209 -0
  100. package/src/browser-detect.ts +221 -0
  101. package/src/concurrency-controller.ts +52 -0
  102. package/src/errors.ts +82 -0
  103. package/src/executor.ts +122 -55
  104. package/src/history.ts +3 -2
  105. package/src/idb-asset-store.ts +7 -1
  106. package/src/index.ts +50 -15
  107. package/src/managers/asset-manager.ts +259 -0
  108. package/src/managers/history-manager.ts +327 -0
  109. package/src/managers/mcp-manifest-builder.ts +108 -0
  110. package/src/managers/quota-manager.ts +149 -0
  111. package/src/managers/workflow-coordinator.ts +158 -0
  112. package/src/opfs-asset-store.ts +16 -2
  113. package/src/plugin-context.ts +87 -0
  114. package/src/plugin-permissions.ts +228 -0
  115. package/src/runtime-impl.ts +298 -0
  116. package/src/runtime.ts +16 -1116
  117. package/src/test-utils/fakes.ts +72 -0
  118. package/src/types.ts +116 -0
  119. package/src/worker-host.ts +35 -7
  120. package/src/worker-protocol.ts +47 -0
  121. package/dist/workflow-builder.d.ts +0 -124
  122. package/dist/workflow-builder.d.ts.map +0 -1
  123. package/dist/workflow-builder.js +0 -240
  124. package/dist/workflow-builder.js.map +0 -1
  125. package/src/workflow-builder.ts +0 -303
@@ -1,4 +1,7 @@
1
1
  import { MemoryGuard } from './memory-guard.js';
2
+ import { BatchProgressEmitter, } from './batch-progress.js';
3
+ import { FREE_CONCURRENCY, PRO_CONCURRENCY, ConcurrencyController, } from './concurrency-controller.js';
4
+ import { BatchScheduler } from './batch-scheduler.js';
2
5
  /** 批量上限超限错误(W6.2) */
3
6
  export class BatchLimitExceededError extends Error {
4
7
  limit;
@@ -13,76 +16,52 @@ export class BatchLimitExceededError extends Error {
13
16
  }
14
17
  /** 免费版批量上限(W6.2) */
15
18
  export const FREE_BATCH_LIMIT = 10;
16
- /** 默认并发槽位 */
17
- export const FREE_CONCURRENCY = 4;
18
- export const PRO_CONCURRENCY = 16;
19
- /** 按 MemoryPressure 收缩并发槽位 */
20
- function shrinkConcurrencyByPressure(base, pressure) {
21
- switch (pressure) {
22
- case 'critical':
23
- return 1;
24
- case 'high':
25
- return Math.max(1, Math.floor(base / 2));
26
- case 'elevated':
27
- return Math.max(2, Math.floor((base * 3) / 4));
28
- default:
29
- return base;
30
- }
31
- }
32
- /** 生成项 ID */
19
+ /** 终态 job 保留上限(超出按 FIFO 淘汰最旧) */
20
+ export const MAX_RETAINED_JOBS = 10;
21
+ export { FREE_CONCURRENCY, PRO_CONCURRENCY } from './concurrency-controller.js';
33
22
  function generateItemId() {
34
23
  if (typeof crypto !== 'undefined' && crypto.randomUUID) {
35
24
  return `bi_${crypto.randomUUID()}`;
36
25
  }
37
26
  return `bi_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;
38
27
  }
39
- /** 生成 job ID */
40
28
  function generateJobId() {
41
29
  if (typeof crypto !== 'undefined' && crypto.randomUUID) {
42
30
  return `batch_${crypto.randomUUID()}`;
43
31
  }
44
32
  return `batch_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;
45
33
  }
46
- /**
47
- * BatchProcessor 实现。
48
- *
49
- * 不直接依赖 LokvisRuntimeImpl(避免循环引用),通过构造注入 LokvisRuntime 接口。
50
- * 内部用纯 JS Map 管理作业,无 React state(可被 SDK / MCP / Node 复用)。
51
- */
34
+ /** BatchProcessor Facade(不依赖 LokvisRuntimeImpl,通过构造注入接口) */
52
35
  export class BatchProcessor {
53
36
  runtime;
54
- eventBus;
55
37
  isPro;
56
- memoryGuard;
57
- /** jobId → BatchJob 内部可变状态(含 private 字段) */
38
+ eventBus;
58
39
  jobs = new Map();
59
- /** 进度回调订阅 */
60
- progressSubs = new Map();
40
+ scheduler;
41
+ progress;
61
42
  constructor(opts) {
62
43
  this.runtime = opts.runtime;
63
- this.eventBus = opts.eventBus;
64
44
  this.isPro = opts.isPro;
65
- this.memoryGuard = opts.memoryGuard;
45
+ this.eventBus = opts.eventBus;
46
+ this.progress = new BatchProgressEmitter(opts.eventBus);
47
+ const concurrency = new ConcurrencyController({ memoryGuard: opts.memoryGuard });
48
+ this.scheduler = new BatchScheduler({
49
+ runtime: opts.runtime,
50
+ progress: this.progress,
51
+ concurrency,
52
+ });
66
53
  }
67
- /**
68
- * 入队批量作业。返回 job 视图(只读)。
69
- * 超过免费上限时同步抛 BatchLimitExceededError,不创建 job。
70
- * 空 items 抛错(避免静默产出 0 项 completed job,遮蔽调用方逻辑错误)。
71
- */
72
54
  enqueue(options) {
73
55
  const { items, maxRetries = 0, concurrency } = options;
74
- // m3: 空数组视为调用方逻辑错误,显式抛错而非静默完成
75
56
  if (!Array.isArray(items) || items.length === 0) {
76
57
  throw new Error('BatchProcessor.enqueue: items cannot be empty');
77
58
  }
78
- // W6.2 批量上限:免费 10,Pro 无限
79
59
  if (!this.isPro && items.length > FREE_BATCH_LIMIT) {
80
60
  throw new BatchLimitExceededError(FREE_BATCH_LIMIT, items.length);
81
61
  }
82
- const jobId = generateJobId();
83
62
  const baseConcurrency = concurrency ?? (this.isPro ? PRO_CONCURRENCY : FREE_CONCURRENCY);
84
63
  const internal = {
85
- id: jobId,
64
+ id: generateJobId(),
86
65
  status: 'queued',
87
66
  baseConcurrency,
88
67
  maxRetries,
@@ -98,66 +77,79 @@ export class BatchProcessor {
98
77
  completed: 0,
99
78
  failed: 0,
100
79
  startedAt: Date.now(),
101
- /** schedule 重入锁(参考 W5 BatchQueue scheduleLock 修复) */
102
80
  scheduleLock: false,
103
- /** pause 时 schedule 不再补满新项 */
104
81
  paused: false,
105
- /** cancel 标记:已发起 cancel 后所有 pending → cancelled,schedule 终止 */
106
82
  cancelled: false,
107
83
  };
108
- this.jobs.set(jobId, internal);
109
- // 异步启动(不阻塞 enqueue 调用方)
110
- void this.runJob(internal);
84
+ this.jobs.set(internal.id, internal);
85
+ void this.scheduler.runJob(internal);
111
86
  return this.toJobView(internal);
112
87
  }
113
- /** 列出所有作业(只读视图) */
114
88
  list() {
115
89
  return Array.from(this.jobs.values()).map((j) => this.toJobView(j));
116
90
  }
117
- /** 获取指定 job */
118
91
  get(jobId) {
119
92
  const internal = this.jobs.get(jobId);
120
93
  return internal ? this.toJobView(internal) : undefined;
121
94
  }
122
- /** 取消整个 job:逐个取消 in-flight 项,pending 项标记 cancelled */
123
95
  async cancel(jobId) {
124
96
  const job = this.jobs.get(jobId);
125
97
  if (!job)
126
98
  return;
127
99
  // m2: failed 也是终态,任何终态 job 不应被改写
128
- if (this.isTerminal(job.status))
100
+ if (this.scheduler.isTerminal(job.status))
129
101
  return;
130
- // B1 修复:同步先标记 cancelled,使 in-flight processItem 续跑时读到
131
- // cancelled=true 后短路,避免覆盖 cancelled 状态或把被取消的项误标 failed。
102
+ // B1:同步先标记 cancelled,使 in-flight processItem 续跑时短路
132
103
  job.cancelled = true;
133
104
  job.paused = false;
134
105
  let cancelledCount = 0;
135
- // 同步把所有 processing/pending 项标记 cancelled(processItem 续跑会读到此状态)
136
106
  for (const item of job.items) {
137
107
  if (item.status === 'processing' || item.status === 'pending') {
138
108
  item.status = 'cancelled';
139
109
  cancelledCount++;
140
110
  }
141
111
  }
142
- // 异步取消所有 in-flight workflow(此时项状态已是 cancelled,
143
- // processItem 续跑会因 job.cancelled 短路,不会回写其他状态)
144
112
  for (const item of job.items) {
145
113
  if (item.status === 'cancelled') {
146
- const wfId = this.itemWorkflowId(job.id, item.id);
114
+ const wfId = this.scheduler.itemWorkflowId(job.id, item.id);
147
115
  try {
148
116
  await this.runtime.cancel(wfId);
149
117
  }
150
- catch {
151
- // 取消失败不阻断,继续取消其他项
118
+ catch (err) {
119
+ // 取消失败不阻断后续项的 cancel,但需记录便于调试
120
+ console.warn(`[lokvis] BatchProcessor.cancel: cancel(${wfId}) failed:`, err);
152
121
  }
153
122
  }
154
123
  }
155
124
  job.status = 'cancelled';
156
125
  job.endedAt = Date.now();
157
- this.emit({ type: 'batch:cancelled', jobId, cancelled: cancelledCount });
158
- this.cleanupJobSubs(jobId);
126
+ this.progress.emitCancelled(jobId, cancelledCount);
127
+ this.progress.cleanupJobSubs(jobId);
128
+ this.pruneJobs();
129
+ }
130
+ /**
131
+ * 取消所有非终态 job + 清理 progress 订阅(W21.6 runtime.dispose 用)。
132
+ *
133
+ * 与单 job cancel 不同:不等待 runtime.cancel(wfId) 完成 —— runtime
134
+ * 自身的 dispose 会通过 executor.cancelAll 统一取消所有 workflow,
135
+ * 这里只做 batch 层面的状态标记 + 订阅清理,避免双 await 死锁。
136
+ */
137
+ async dispose() {
138
+ for (const job of [...this.jobs.values()]) {
139
+ if (this.scheduler.isTerminal(job.status))
140
+ continue;
141
+ job.cancelled = true;
142
+ job.paused = false;
143
+ for (const item of job.items) {
144
+ if (item.status === 'processing' || item.status === 'pending') {
145
+ item.status = 'cancelled';
146
+ }
147
+ }
148
+ job.status = 'cancelled';
149
+ job.endedAt = Date.now();
150
+ this.progress.cleanupJobSubs(job.id);
151
+ }
159
152
  }
160
- /** 暂停 job:schedule 不再补满,已 in-flight 项跑完即止 */
161
153
  async pause(jobId) {
162
154
  const job = this.jobs.get(jobId);
163
155
  if (!job)
@@ -166,10 +158,8 @@ export class BatchProcessor {
166
158
  return;
167
159
  job.paused = true;
168
160
  job.status = 'paused';
169
- // m1: 发 pause 事件,UI 可订阅无需轮询
170
- this.emit({ type: 'batch:paused', jobId });
161
+ this.progress.emitPaused(jobId);
171
162
  }
172
- /** 恢复 job:解除 pause,schedule 继续补满 */
173
163
  async resume(jobId) {
174
164
  const job = this.jobs.get(jobId);
175
165
  if (!job)
@@ -178,14 +168,9 @@ export class BatchProcessor {
178
168
  return;
179
169
  job.paused = false;
180
170
  job.status = 'running';
181
- // m1: 发 resumed 事件
182
- this.emit({ type: 'batch:resumed', jobId });
183
- void this.schedule(job);
171
+ this.progress.emitResumed(jobId);
172
+ void this.scheduler.schedule(job);
184
173
  }
185
- /**
186
- * 重试 job 中所有 failed 项(仅当 job 已结束)。
187
- * 重置 attempts/error/status,pending 重新等待 schedule。
188
- */
189
174
  async retryFailed(jobId) {
190
175
  const job = this.jobs.get(jobId);
191
176
  if (!job)
@@ -202,293 +187,82 @@ export class BatchProcessor {
202
187
  job.failed = 0;
203
188
  job.cancelled = false;
204
189
  job.status = 'running';
205
- void this.schedule(job);
190
+ void this.scheduler.schedule(job);
206
191
  }
207
- /** 订阅 job 进度(返回取消订阅函数) */
208
192
  onProgress(jobId, handler) {
209
- let subs = this.progressSubs.get(jobId);
210
- if (!subs) {
211
- subs = new Set();
212
- this.progressSubs.set(jobId, subs);
213
- }
214
- subs.add(handler);
215
- return () => {
216
- subs.delete(handler);
217
- if (subs.size === 0)
218
- this.progressSubs.delete(jobId);
219
- };
193
+ return this.progress.onProgress(jobId, handler);
220
194
  }
221
195
  /**
222
- * 等待 job 完成(completed/failed/cancelled 任一)。
196
+ * 等待 job 中至少 count 项进入 processing 状态(TD-2.2 长期方案)。
223
197
  *
224
- * M5 修复:
225
- * - 增加 timeoutMs(默认 5min),超时 reject,避免坏 job 永久挂起泄漏订阅
226
- * - batch:completed 事件已涵盖 failed(maybeComplete 对 failed>0 的 job
227
- * 同样发 batch:completed),故只需监听 completed + cancelled
228
- * - resolve 后立即解绑所有订阅,避免调用方丢弃 promise 时泄漏
229
- * - cancel/maybeComplete 进入终态时也会 cleanupJobSubs 兜底
198
+ * 替代测试中固定 setTimeout 赌注:基于"当前状态快照 + batch:item:started
199
+ * 事件订阅"双重判定,确定性等待而非时间赌注。
200
+ *
201
+ * - 先快照当前 processing 数,若已 >= count 立即 resolve(schedule 循环内
202
+ * 同步设置 item.status='processing' + batch:item:started,enqueue
203
+ * 返回时首批项通常已进入 processing)
204
+ * - 否则订阅 batch:item:started,累计到 count 时 resolve(兜底异步场景)
205
+ * - 超时(默认 5s)reject,避免坏 job 永久挂起
230
206
  */
231
- async waitForCompletion(jobId, timeoutMs = 5 * 60 * 1000) {
207
+ async waitForItemsStarted(jobId, count, timeoutMs = 5000) {
232
208
  const job = this.jobs.get(jobId);
233
209
  if (!job)
234
210
  throw new Error(`Batch job not found: ${jobId}`);
235
- if (this.isTerminal(job.status))
236
- return this.toJobView(job);
211
+ const current = job.items.filter((i) => i.status === 'processing').length;
212
+ if (current >= count)
213
+ return;
214
+ let seen = current;
237
215
  return new Promise((resolve, reject) => {
238
216
  let settled = false;
239
- // 声明在前,finish 与各 handler 互相引用
240
- let offCompleted;
241
- let offCancelled;
242
- let timer;
243
- const finish = (fn) => {
217
+ let off;
218
+ const timer = setTimeout(() => {
244
219
  if (settled)
245
220
  return;
246
221
  settled = true;
247
- clearTimeout(timer);
248
- offCompleted();
249
- offCancelled();
250
- fn();
251
- };
252
- offCompleted = this.eventBus.on('batch:completed', (e) => {
253
- if (e.jobId !== jobId)
254
- return;
255
- finish(() => resolve(this.toJobView(this.jobs.get(jobId) ?? job)));
256
- });
257
- offCancelled = this.eventBus.on('batch:cancelled', (e) => {
222
+ off();
223
+ reject(new Error(`waitForItemsStarted timed out after ${timeoutMs}ms ` +
224
+ `(jobId=${jobId}, expected=${count}, seen=${seen})`));
225
+ }, timeoutMs);
226
+ off = this.eventBus.on('batch:item:started', (e) => {
258
227
  if (e.jobId !== jobId)
259
228
  return;
260
- finish(() => resolve(this.toJobView(this.jobs.get(jobId) ?? job)));
229
+ seen++;
230
+ if (seen >= count) {
231
+ if (settled)
232
+ return;
233
+ settled = true;
234
+ clearTimeout(timer);
235
+ off();
236
+ resolve();
237
+ }
261
238
  });
262
- timer = setTimeout(() => {
263
- finish(() => reject(new Error(`BatchProcessor.waitForCompletion timed out after ${timeoutMs}ms (jobId=${jobId})`)));
264
- }, timeoutMs);
265
239
  });
266
240
  }
267
- /** 清理 job 的所有进度订阅(终态时调用,避免泄漏) */
268
- cleanupJobSubs(jobId) {
269
- this.progressSubs.delete(jobId);
270
- }
271
- // ─── 内部实现 ────────────────────────────────────────
272
- /** 启动 job:发 batch:started,进入 running,触发首次 schedule */
273
- async runJob(job) {
274
- if (job.cancelled)
275
- return;
276
- job.status = 'running';
277
- this.emit({ type: 'batch:started', jobId: job.id, total: job.items.length });
278
- await this.schedule(job);
279
- }
280
- /**
281
- * 调度循环:把 pending 项填入空闲槽位,直到无可用槽位或无 pending 项。
282
- *
283
- * 重入保护:用 scheduleLock 防止多个 schedule 调用并发导致超限(参考 W5
284
- * BatchQueue.tsx 的 scheduleLock 修复:并发完成时多个 processItem 同时触发
285
- * schedule 会读到相同 running 快照,导致并发超限)。
286
- */
287
- async schedule(job) {
288
- if (job.scheduleLock)
289
- return;
290
- if (job.cancelled || job.paused)
291
- return;
292
- if (this.isTerminal(job.status))
293
- return;
294
- job.scheduleLock = true;
295
- try {
296
- while (!job.cancelled && !job.paused) {
297
- const running = job.items.filter((i) => i.status === 'processing').length;
298
- const cap = this.currentConcurrency(job);
299
- if (running >= cap)
300
- break;
301
- const next = job.items.find((i) => i.status === 'pending');
302
- if (!next)
303
- break;
304
- // 标记 processing 并启动(不 await,让循环继续补满)
305
- next.status = 'processing';
306
- void this.processItem(job, next);
307
- }
308
- // 循环结束:检查是否所有项都已终结
309
- this.maybeComplete(job);
310
- }
311
- finally {
312
- job.scheduleLock = false;
313
- }
314
- }
315
- /** 处理单个项:导入 → run workflow → 导出 output AssetId */
316
- async processItem(job, item) {
317
- const start = Date.now();
318
- const wfId = this.itemWorkflowId(job.id, item.id);
319
- this.emit({
320
- type: 'batch:item:started',
321
- jobId: job.id,
322
- itemId: item.id,
323
- index: item.index,
324
- total: job.items.length,
241
+ async waitForCompletion(jobId, timeoutMs = 5 * 60 * 1000) {
242
+ const job = this.jobs.get(jobId);
243
+ if (!job)
244
+ throw new Error(`Batch job not found: ${jobId}`);
245
+ return this.progress.waitForCompletion(jobId, {
246
+ timeoutMs,
247
+ isTerminal: () => this.scheduler.isTerminal(job.status),
248
+ resolveJob: () => this.toJobView(this.jobs.get(jobId) ?? job),
249
+ onTimeout: () => this.cancel(jobId),
325
250
  });
326
- // B1 修复:cancel 已同步把 item 标为 cancelled,此处若发现 cancelled
327
- // 直接短路,不发起 import/run,避免与 cancel 竞态
328
- if (job.cancelled || item.status === 'cancelled') {
329
- return;
330
- }
331
- let inputAssetId;
332
- let result;
333
- try {
334
- // 1. 导入输入资产
335
- inputAssetId = await this.runtime.importAsset(item.source);
336
- // B1 守卫:import 期间可能被 cancel
337
- if (job.cancelled) {
338
- item.status = 'cancelled';
339
- // 清理刚导入的 input,避免孤儿资产(cancel 期间产出的 input 不应残留)
340
- void this.runtime.removeAsset(inputAssetId).catch(() => { });
341
- return;
342
- }
343
- // 2. 执行工作流(用独立 workflow id,便于 cancel)
344
- const wf = { ...item.workflow, id: wfId };
345
- result = await this.runtime.run(wf, [inputAssetId]);
346
- // B1 守卫:run 期间可能被 cancel(cancel 已同步标 item=cancelled)
347
- if (job.cancelled) {
348
- item.status = 'cancelled';
349
- return;
350
- }
351
- if (result.status !== 'completed' || result.outputs.length === 0) {
352
- throw new Error(result.error || `Workflow ${result.status}`);
353
- }
354
- const outputAssetId = result.outputs[0];
355
- const duration = Date.now() - start;
356
- // 成功
357
- item.status = 'completed';
358
- item.outputAssetId = outputAssetId;
359
- item.duration = duration;
360
- job.completed++;
361
- this.emit({
362
- type: 'batch:item:finished',
363
- jobId: job.id,
364
- itemId: item.id,
365
- index: item.index,
366
- total: job.items.length,
367
- outputAssetId,
368
- duration,
369
- });
370
- this.emitProgress(job);
371
- }
372
- catch (err) {
373
- // B1 守卫:被 cancel 的 workflow 抛错不计入 failed(item 已是 cancelled)
374
- if (job.cancelled) {
375
- item.status = 'cancelled';
376
- return;
377
- }
378
- // 失败:判断是否还可重试
379
- item.attempts++;
380
- const maxRetries = item.maxRetries;
381
- if (item.attempts <= maxRetries) {
382
- // 重试:回 pending,schedule 会再次拉起
383
- item.status = 'pending';
384
- // 注意:不重置 attempts,保留累计重试次数
385
- // 清理本次导入的 input asset,避免重试重新 import 时旧 input 成为孤儿
386
- // (Blocker 修复:maxRetries=3 全失败原本会累积 3 个孤儿 input)
387
- if (inputAssetId !== undefined) {
388
- void this.runtime.removeAsset(inputAssetId).catch(() => { });
389
- }
390
- }
391
- else {
392
- item.status = 'failed';
393
- item.error = err instanceof Error ? err : new Error(String(err));
394
- job.failed++;
395
- // M4:最终失败时清理已导入的 input asset,避免批量失败累积孤儿资产
396
- // 占用 OPFS/IDB 空间并污染 listAssets / StatusBar 配额
397
- if (inputAssetId !== undefined) {
398
- void this.runtime.removeAsset(inputAssetId).catch(() => { });
399
- }
400
- this.emit({
401
- type: 'batch:item:failed',
402
- jobId: job.id,
403
- itemId: item.id,
404
- index: item.index,
405
- total: job.items.length,
406
- error: item.error,
407
- attempts: item.attempts,
408
- });
409
- this.emitProgress(job);
410
- }
411
- }
412
- finally {
413
- // 触发 schedule 补满(用 ref 打破循环依赖)
414
- if (!job.cancelled && !job.paused && !this.isTerminal(job.status)) {
415
- void this.schedule(job);
416
- }
417
- }
418
- }
419
- /** 当前并发槽位(按内存压力动态收缩) */
420
- currentConcurrency(job) {
421
- const pressure = this.memoryGuard?.getPressure() ?? 'low';
422
- return shrinkConcurrencyByPressure(job.baseConcurrency, pressure);
423
251
  }
424
- /** 发出 progress 事件 + 通知订阅者 */
425
- emitProgress(job) {
426
- const payload = {
427
- jobId: job.id,
428
- completed: job.completed,
429
- failed: job.failed,
430
- total: job.items.length,
431
- };
432
- this.emit({
433
- type: 'batch:progress',
434
- ...payload,
435
- });
436
- const subs = this.progressSubs.get(job.id);
437
- if (subs) {
438
- // M1 修复:遍历副本,防止 handler 内 unsubscribe/subscribe mutate 正在迭代的 Set
439
- for (const fn of [...subs]) {
440
- try {
441
- fn(payload);
442
- }
443
- catch {
444
- // 单个订阅者异常不阻断其他订阅者
445
- }
446
- }
252
+ pruneJobs() {
253
+ const terminal = [];
254
+ for (const job of this.jobs.values()) {
255
+ if (this.scheduler.isTerminal(job.status))
256
+ terminal.push(job);
447
257
  }
448
- }
449
- /** 检查 job 是否全部完成,如是则发 batch:completed */
450
- maybeComplete(job) {
451
- if (this.isTerminal(job.status))
452
- return;
453
- const pending = job.items.some((i) => i.status === 'pending' || i.status === 'processing');
454
- if (pending)
258
+ if (terminal.length <= MAX_RETAINED_JOBS)
455
259
  return;
456
- job.endedAt = Date.now();
457
- job.status = job.failed > 0 ? 'failed' : 'completed';
458
- // 注意:无论 job.status 'completed' 还是 'failed',都发 batch:completed 事件。
459
- // 事件名表示"所有项已终结(含部分失败)",而非"全部成功"。
460
- // 消费方应通过 payload.failed 区分;waitForCompletion 依赖此行为(只监听
461
- // batch:completed + batch:cancelled 两种终态事件)。
462
- this.emit({
463
- type: 'batch:completed',
464
- jobId: job.id,
465
- total: job.items.length,
466
- completed: job.completed,
467
- failed: job.failed,
468
- duration: job.endedAt - job.startedAt,
469
- });
470
- // M5:进入终态清理进度订阅,避免 waitForCompletion 调用方丢弃 promise 后泄漏
471
- this.cleanupJobSubs(job.id);
472
- }
473
- isTerminal(status) {
474
- return (status === 'completed' ||
475
- status === 'cancelled' ||
476
- status === 'failed');
477
- }
478
- /** 派生每项的 workflow id(独立于其他项,便于 cancel) */
479
- itemWorkflowId(jobId, itemId) {
480
- return `${jobId}__${itemId}`;
481
- }
482
- /** 安全 emit(无 EventBus 时降级为 no-op,便于纯单元测试) */
483
- emit(event) {
484
- try {
485
- this.eventBus.emit(event);
486
- }
487
- catch {
488
- // EventBus 异常不阻断批量逻辑
260
+ terminal.sort((a, b) => a.startedAt - b.startedAt);
261
+ const removeCount = terminal.length - MAX_RETAINED_JOBS;
262
+ for (let i = 0; i < removeCount; i++) {
263
+ this.jobs.delete(terminal[i].id);
489
264
  }
490
265
  }
491
- /** 内部可变状态 → 对外只读视图(浅拷贝 items 数组与每项) */
492
266
  toJobView(job) {
493
267
  return {
494
268
  id: job.id,
@@ -1 +1 @@
1
- {"version":3,"file":"batch-processor.js","sourceRoot":"","sources":["../src/batch-processor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"batch-processor.js","sourceRoot":"","sources":["../src/batch-processor.ts"],"names":[],"mappings":"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"}