@lokvis/runtime 0.1.0 → 0.2.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.
Files changed (80) hide show
  1. package/LICENSE +21 -0
  2. package/dist/asset-store.d.ts +5 -2
  3. package/dist/asset-store.d.ts.map +1 -1
  4. package/dist/asset-store.js +93 -3
  5. package/dist/asset-store.js.map +1 -1
  6. package/dist/batch-processor.d.ts +200 -0
  7. package/dist/batch-processor.d.ts.map +1 -0
  8. package/dist/batch-processor.js +505 -0
  9. package/dist/batch-processor.js.map +1 -0
  10. package/dist/capability-registry.d.ts +4 -0
  11. package/dist/capability-registry.d.ts.map +1 -1
  12. package/dist/capability-registry.js +19 -2
  13. package/dist/capability-registry.js.map +1 -1
  14. package/dist/degradation.d.ts +109 -0
  15. package/dist/degradation.d.ts.map +1 -0
  16. package/dist/degradation.js +184 -0
  17. package/dist/degradation.js.map +1 -0
  18. package/dist/event-bus.d.ts.map +1 -1
  19. package/dist/event-bus.js +7 -2
  20. package/dist/event-bus.js.map +1 -1
  21. package/dist/executor.d.ts.map +1 -1
  22. package/dist/executor.js +37 -1
  23. package/dist/executor.js.map +1 -1
  24. package/dist/history-store.d.ts +76 -0
  25. package/dist/history-store.d.ts.map +1 -0
  26. package/dist/history-store.js +109 -0
  27. package/dist/history-store.js.map +1 -0
  28. package/dist/history.d.ts +1 -1
  29. package/dist/history.d.ts.map +1 -1
  30. package/dist/history.js +1 -1
  31. package/dist/history.js.map +1 -1
  32. package/dist/idb-asset-store.js +1 -1
  33. package/dist/idb-asset-store.js.map +1 -1
  34. package/dist/index.d.ts +5 -0
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +5 -0
  37. package/dist/index.js.map +1 -1
  38. package/dist/memory-guard.d.ts +109 -0
  39. package/dist/memory-guard.d.ts.map +1 -0
  40. package/dist/memory-guard.js +161 -0
  41. package/dist/memory-guard.js.map +1 -0
  42. package/dist/opfs-asset-store.d.ts +35 -4
  43. package/dist/opfs-asset-store.d.ts.map +1 -1
  44. package/dist/opfs-asset-store.js +94 -10
  45. package/dist/opfs-asset-store.js.map +1 -1
  46. package/dist/runtime.d.ts +139 -4
  47. package/dist/runtime.d.ts.map +1 -1
  48. package/dist/runtime.js +443 -25
  49. package/dist/runtime.js.map +1 -1
  50. package/dist/types.d.ts +101 -2
  51. package/dist/types.d.ts.map +1 -1
  52. package/dist/worker-host.d.ts +13 -0
  53. package/dist/worker-host.d.ts.map +1 -1
  54. package/dist/worker-host.js +47 -15
  55. package/dist/worker-host.js.map +1 -1
  56. package/dist/worker-protocol.d.ts +10 -1
  57. package/dist/worker-protocol.d.ts.map +1 -1
  58. package/dist/worker-protocol.js.map +1 -1
  59. package/dist/workflow-builder.d.ts +124 -0
  60. package/dist/workflow-builder.d.ts.map +1 -0
  61. package/dist/workflow-builder.js +240 -0
  62. package/dist/workflow-builder.js.map +1 -0
  63. package/package.json +3 -2
  64. package/src/asset-store.ts +103 -3
  65. package/src/batch-processor.ts +699 -0
  66. package/src/capability-registry.ts +19 -2
  67. package/src/degradation.ts +241 -0
  68. package/src/event-bus.ts +6 -2
  69. package/src/executor.ts +46 -1
  70. package/src/history-store.ts +159 -0
  71. package/src/history.ts +2 -2
  72. package/src/idb-asset-store.ts +1 -1
  73. package/src/index.ts +5 -0
  74. package/src/memory-guard.ts +202 -0
  75. package/src/opfs-asset-store.ts +118 -10
  76. package/src/runtime.ts +482 -21
  77. package/src/types.ts +98 -1
  78. package/src/worker-host.ts +56 -16
  79. package/src/worker-protocol.ts +11 -1
  80. package/src/workflow-builder.ts +303 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Lokvis Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -43,10 +43,13 @@ export interface PreparedImport {
43
43
  }
44
44
  /**
45
45
  * 从 AssetSource 准备导入数据(共享逻辑,供 Memory/OPFS/IDB store 复用):
46
- * 提取 blob + MIME、生成 id、推断 type、构造 metadata。
46
+ * 提取 blob + MIME、生成 id、推断 type、构造 metadata(含富元数据)
47
47
  * 各 store 只需负责"写入 blob + 存元数据"。
48
+ *
49
+ * W6.4:异步提取 dimensions(image)/ duration(video/audio)/ pages(pdf,暂 stub)。
50
+ * 富元数据提取失败时静默降级为 undefined,不阻断 import。
48
51
  */
49
- export declare function prepareImport(source: AssetSource): PreparedImport;
52
+ export declare function prepareImport(source: AssetSource): Promise<PreparedImport>;
50
53
  /** 从 BlobHandle.path 解析出 AssetId(共享,各 store 按 prefix 调用) */
51
54
  export declare function parseBlobPath(path: string, prefix: string): AssetId;
52
55
  /** 构造完整 Asset 元数据 + 默认字段(共享工厂) */
@@ -1 +1 @@
1
- {"version":3,"file":"asset-store.d.ts","sourceRoot":"","sources":["../src/asset-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAI7F,iBAAiB;AACjB,MAAM,WAAW,UAAU;IACzB,gCAAgC;IAChC,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC5C,cAAc;IACd,GAAG,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC;IAC7C,oBAAoB;IACpB,OAAO,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,WAAW;IACX,MAAM,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,aAAa;IACb,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACzB,qCAAqC;IACrC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;CAClF;AAED,cAAc;AACd,wBAAgB,UAAU,IAAI,MAAM,CAKnC;AAED,2BAA2B;AAC3B,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAS9D;AAED,uBAAuB;AACvB,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED,mEAAmE;AACnE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,WAAW,GAAG;IAC1D,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;CAClB,CAUA;AAED,gDAAgD;AAChD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,aAAa,CAAC;IACxB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW,GAAG,cAAc,CAWjE;AAED,4DAA4D;AAC5D,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAMnE;AAED,kCAAkC;AAClC,wBAAgB,UAAU,CACxB,EAAE,EAAE,OAAO,EACX,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,aAAa,EACvB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,EACnB,UAAU,EAAE,MAAM,GACjB,KAAK,CAgBP;AAKD,kCAAkC;AAClC,wBAAgB,sBAAsB,IAAI,UAAU,CAyCnD;AAED,iBAAiB;AACjB,MAAM,WAAW,uBAAuB;IACtC,4CAA4C;IAC5C,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,UAAU,CAAC,CAwBrB"}
1
+ {"version":3,"file":"asset-store.d.ts","sourceRoot":"","sources":["../src/asset-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAI7F,iBAAiB;AACjB,MAAM,WAAW,UAAU;IACzB,gCAAgC;IAChC,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC5C,cAAc;IACd,GAAG,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC;IAC7C,oBAAoB;IACpB,OAAO,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,WAAW;IACX,MAAM,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,aAAa;IACb,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACzB,qCAAqC;IACrC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;CAClF;AAED,cAAc;AACd,wBAAgB,UAAU,IAAI,MAAM,CAKnC;AAED,2BAA2B;AAC3B,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAS9D;AAED,uBAAuB;AACvB,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED,mEAAmE;AACnE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,WAAW,GAAG;IAC1D,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;CAClB,CAUA;AAED,gDAAgD;AAChD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,aAAa,CAAC;IACxB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;CACrB;AA2FD;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,CAmBhF;AAED,4DAA4D;AAC5D,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAMnE;AAED,kCAAkC;AAClC,wBAAgB,UAAU,CACxB,EAAE,EAAE,OAAO,EACX,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,aAAa,EACvB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,EACnB,UAAU,EAAE,MAAM,GACjB,KAAK,CAgBP;AAKD,kCAAkC;AAClC,wBAAgB,sBAAsB,IAAI,UAAU,CAyCnD;AAED,iBAAiB;AACjB,MAAM,WAAW,uBAAuB;IACtC,4CAA4C;IAC5C,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,UAAU,CAAC,CAwBrB"}
@@ -47,12 +47,94 @@ export function extractBlobFromSource(source) {
47
47
  }
48
48
  throw new Error(`Asset source kind "${source.kind}" not supported by this store`);
49
49
  }
50
+ /**
51
+ * 从 Blob 提取富元数据(dimensions/duration/pages)。
52
+ *
53
+ * 提取策略:
54
+ * - image: createImageBitmap → width/height
55
+ * - video/audio: HTMLMediaElement + loadedmetadata → duration
56
+ * - pdf: 暂不提取(需 pdf.js,Phase 2 补全)
57
+ * - 其余: 返回空
58
+ *
59
+ * 所有提取均 try/catch:失败时返回空对象,不阻断 import。
60
+ * Node.js / 测试环境可能无 createImageBitmap / document,自然降级为空。
61
+ */
62
+ async function extractRichMetadata(blob, type) {
63
+ try {
64
+ switch (type) {
65
+ case 'image':
66
+ return await extractImageDimensions(blob);
67
+ case 'video':
68
+ case 'audio':
69
+ return await extractMediaDuration(blob, type);
70
+ default:
71
+ return {};
72
+ }
73
+ }
74
+ catch {
75
+ return {};
76
+ }
77
+ }
78
+ /** 用 createImageBitmap 提取图片尺寸(浏览器原生 API,失败返回空) */
79
+ async function extractImageDimensions(blob) {
80
+ if (typeof createImageBitmap !== 'function')
81
+ return {};
82
+ const bitmap = await createImageBitmap(blob);
83
+ try {
84
+ return { dimensions: { width: bitmap.width, height: bitmap.height } };
85
+ }
86
+ finally {
87
+ // 释放 ImageBitmap 资源,避免内存泄漏(浏览器 GC 不保证立即回收)
88
+ if (typeof bitmap.close === 'function')
89
+ bitmap.close();
90
+ }
91
+ }
92
+ /** 用 HTMLMediaElement 提取视频/音频时长(浏览器环境,失败返回空) */
93
+ async function extractMediaDuration(blob, type) {
94
+ if (typeof document === 'undefined')
95
+ return {};
96
+ const url = URL.createObjectURL(blob);
97
+ try {
98
+ const el = document.createElement(type === 'video' ? 'video' : 'audio');
99
+ el.preload = 'metadata';
100
+ el.src = url;
101
+ return await new Promise((resolve) => {
102
+ let settled = false;
103
+ const finish = (result) => {
104
+ if (settled)
105
+ return;
106
+ settled = true;
107
+ el.onloadedmetadata = null;
108
+ el.onerror = null;
109
+ el.removeAttribute('src');
110
+ clearTimeout(timer);
111
+ resolve(result);
112
+ };
113
+ el.onloadedmetadata = () => {
114
+ const duration = el.duration;
115
+ finish(Number.isFinite(duration) ? { duration } : {});
116
+ };
117
+ el.onerror = () => finish({});
118
+ // M2 修复:超时兜底,防止坏文件既不触发 loadedmetadata 也不触发 onerror
119
+ // 导致 Promise 永久挂起 + 外层 finally 的 revokeObjectURL 永不执行(泄漏)
120
+ const timer = setTimeout(() => finish({}), MEDIA_DURATION_TIMEOUT_MS);
121
+ });
122
+ }
123
+ finally {
124
+ URL.revokeObjectURL(url);
125
+ }
126
+ }
127
+ /** 媒体时长提取超时(5s,足够解码大多数媒体头) */
128
+ const MEDIA_DURATION_TIMEOUT_MS = 5000;
50
129
  /**
51
130
  * 从 AssetSource 准备导入数据(共享逻辑,供 Memory/OPFS/IDB store 复用):
52
- * 提取 blob + MIME、生成 id、推断 type、构造 metadata。
131
+ * 提取 blob + MIME、生成 id、推断 type、构造 metadata(含富元数据)
53
132
  * 各 store 只需负责"写入 blob + 存元数据"。
133
+ *
134
+ * W6.4:异步提取 dimensions(image)/ duration(video/audio)/ pages(pdf,暂 stub)。
135
+ * 富元数据提取失败时静默降级为 undefined,不阻断 import。
54
136
  */
55
- export function prepareImport(source) {
137
+ export async function prepareImport(source) {
56
138
  const { blob, mimeType: rawMime } = extractBlobFromSource(source);
57
139
  const id = generateId();
58
140
  const mimeType = rawMime || 'application/octet-stream';
@@ -62,6 +144,14 @@ export function prepareImport(source) {
62
144
  size: blob.size,
63
145
  format: getFormatFromMime(mimeType),
64
146
  };
147
+ // 富元数据(异步,失败静默降级)
148
+ const rich = await extractRichMetadata(blob, type);
149
+ if (rich.dimensions)
150
+ metadata.dimensions = rich.dimensions;
151
+ if (rich.duration !== undefined)
152
+ metadata.duration = rich.duration;
153
+ if (rich.pages !== undefined)
154
+ metadata.pages = rich.pages;
65
155
  return { id, blob, metadata, type };
66
156
  }
67
157
  /** 从 BlobHandle.path 解析出 AssetId(共享,各 store 按 prefix 调用) */
@@ -98,7 +188,7 @@ export function createMemoryAssetStore() {
98
188
  const blobs = new Map();
99
189
  return {
100
190
  async import(source) {
101
- const { id, blob, metadata, type } = prepareImport(source);
191
+ const { id, blob, metadata, type } = await prepareImport(source);
102
192
  blobs.set(id, blob);
103
193
  const asset = buildAsset(id, blob, metadata, type, MEMORY_PATH_PREFIX);
104
194
  assets.set(id, asset);
@@ -1 +1 @@
1
- {"version":3,"file":"asset-store.js","sourceRoot":"","sources":["../src/asset-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"asset-store.js","sourceRoot":"","sources":["../src/asset-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,200 @@
1
+ /**
2
+ * BatchProcessor - 批量作业处理器(W6.1 + W6.2 + W6.3)
3
+ *
4
+ * 目标:把 W5 在 playground BatchQueue.tsx 里手写的"并发 4 池 + 进度 + 错误"
5
+ * 逻辑下沉到 runtime,统一暴露给 SDK / MCP / UI 消费。
6
+ *
7
+ * 核心能力:
8
+ * - 并发控制:基于槽位池,默认 4(Pro=16),按 MemoryGuard 压力动态收缩
9
+ * - 失败重试:maxRetries(默认 0,与 W5 行为兼容);达到上限才发 batch:item:failed
10
+ * - 批量上限:免费 10 文件(W6.2)、Pro 无限(超额抛 BatchLimitExceededError)
11
+ * - 进度事件:batch:started / batch:item:* / batch:progress / batch:completed / batch:cancelled
12
+ * - 取消:批量级 cancel,逐个取消 in-flight 项,已 pending 的标记 cancelled
13
+ * - 暂停/恢复:挂起 schedule 循环(不取消 in-flight,完成后不再补满)
14
+ *
15
+ * 设计取舍:
16
+ * - 不持久化作业状态(刷新即丢):W6 主要保证 Asset 持久化,批量队列是临时调度
17
+ * 结构,刷新后由 UI 重新发起即可。持久化批量进度属 Phase 2。
18
+ * - 不持有 output Blob:每项执行完即返回 AssetId,Blob 由 AssetStore(OPFS/IDB)托管,
19
+ * 避免 50+ 图批量把 output Blob 全部留在内存导致 OOM。
20
+ * - 单 Job 串行 schedule:同一 BatchProcessor 实例可并发 enqueue 多个 Job,但内部
21
+ * schedule 逻辑用 per-job lock 防重入(参考 W5 BatchQueue 的 scheduleLock 修复)。
22
+ *
23
+ * @example
24
+ * ```ts
25
+ * const job = runtime.batch.enqueue({
26
+ * items: files.map((f) => ({ source: { kind: 'file', file: f }, workflow: wf })),
27
+ * maxRetries: 1,
28
+ * });
29
+ * runtime.batch.onProgress(job.id, (p) => console.log(p.completed, '/', p.total));
30
+ * await runtime.batch.waitForCompletion(job.id);
31
+ * ```
32
+ */
33
+ import type { AssetId, AssetSource, BatchItemStatus, BatchJobStatus, Workflow } from '@lokvis/schema';
34
+ import type { EventBus } from '@lokvis/schema';
35
+ import type { LokvisRuntime } from './types.js';
36
+ import { MemoryGuard } from './memory-guard.js';
37
+ /** 批量项输入(每个文件一个) */
38
+ export interface BatchItemInput {
39
+ /**
40
+ * 资产来源:通常为 { kind: 'file', file }(用户拖入),也可为 blob/url。
41
+ * BatchProcessor 在执行前调 runtime.importAsset(source) 导入为 AssetId。
42
+ */
43
+ source: AssetSource;
44
+ /** 该项要执行的工作流(每个文件独立 workflow 实例,便于独立 cancel) */
45
+ workflow: Workflow;
46
+ /** 该项最大重试次数(覆盖 job 级 maxRetries) */
47
+ maxRetries?: number;
48
+ }
49
+ /** 批量项运行时状态(对外只读视图) */
50
+ export interface BatchItem {
51
+ /** 项 ID(自动生成,用于事件追踪与 UI 定位) */
52
+ id: string;
53
+ /** 在 job 中的序号(0-based,用于事件中的 index 字段) */
54
+ index: number;
55
+ status: BatchItemStatus;
56
+ /** 输入 source(便于失败时 UI 展示文件名) */
57
+ source: AssetSource;
58
+ /** 该项执行的工作流 */
59
+ workflow: Workflow;
60
+ /** 输出 AssetId(completed 时填) */
61
+ outputAssetId?: AssetId;
62
+ /** 失败原因(failed 时填) */
63
+ error?: Error;
64
+ /** 已重试次数 */
65
+ attempts: number;
66
+ /** 该项最大重试次数 */
67
+ maxRetries: number;
68
+ /** 单项执行耗时(ms,completed 时填) */
69
+ duration?: number;
70
+ }
71
+ /** 批量作业运行时状态(对外只读视图) */
72
+ export interface BatchJob {
73
+ id: string;
74
+ status: BatchJobStatus;
75
+ items: BatchItem[];
76
+ /** 已完成数(completed) */
77
+ completed: number;
78
+ /** 失败数(failed) */
79
+ failed: number;
80
+ /** 总项数 */
81
+ total: number;
82
+ /** job 起始时间(ms) */
83
+ startedAt: number;
84
+ /** job 结束时间(ms,完成后填) */
85
+ endedAt?: number;
86
+ }
87
+ /** enqueue 选项 */
88
+ export interface EnqueueOptions {
89
+ /** 作业项 */
90
+ items: BatchItemInput[];
91
+ /** job 级最大重试次数(默认 0,单项可 BatchItemInput.maxRetries 覆盖) */
92
+ maxRetries?: number;
93
+ /**
94
+ * 并发槽位上限(默认按 isPro:free=4,pro=16)。
95
+ * 实际并发会按 MemoryGuard 压力动态收缩。
96
+ */
97
+ concurrency?: number;
98
+ }
99
+ /** 进度回调载荷 */
100
+ export interface BatchProgress {
101
+ jobId: string;
102
+ completed: number;
103
+ failed: number;
104
+ total: number;
105
+ }
106
+ /** 批量上限超限错误(W6.2) */
107
+ export declare class BatchLimitExceededError extends Error {
108
+ readonly limit: number;
109
+ readonly requested: number;
110
+ constructor(limit: number, requested: number);
111
+ }
112
+ /** 免费版批量上限(W6.2) */
113
+ export declare const FREE_BATCH_LIMIT = 10;
114
+ /** 默认并发槽位 */
115
+ export declare const FREE_CONCURRENCY = 4;
116
+ export declare const PRO_CONCURRENCY = 16;
117
+ /**
118
+ * BatchProcessor 实现。
119
+ *
120
+ * 不直接依赖 LokvisRuntimeImpl(避免循环引用),通过构造注入 LokvisRuntime 接口。
121
+ * 内部用纯 JS Map 管理作业,无 React state(可被 SDK / MCP / Node 复用)。
122
+ */
123
+ export declare class BatchProcessor {
124
+ private readonly runtime;
125
+ private readonly eventBus;
126
+ private readonly isPro;
127
+ private readonly memoryGuard?;
128
+ /** jobId → BatchJob 内部可变状态(含 private 字段) */
129
+ private readonly jobs;
130
+ /** 进度回调订阅 */
131
+ private readonly progressSubs;
132
+ constructor(opts: {
133
+ runtime: LokvisRuntime;
134
+ eventBus: EventBus;
135
+ isPro: boolean;
136
+ memoryGuard?: MemoryGuard;
137
+ });
138
+ /**
139
+ * 入队批量作业。返回 job 视图(只读)。
140
+ * 超过免费上限时同步抛 BatchLimitExceededError,不创建 job。
141
+ * 空 items 抛错(避免静默产出 0 项 completed job,遮蔽调用方逻辑错误)。
142
+ */
143
+ enqueue(options: EnqueueOptions): BatchJob;
144
+ /** 列出所有作业(只读视图) */
145
+ list(): BatchJob[];
146
+ /** 获取指定 job */
147
+ get(jobId: string): BatchJob | undefined;
148
+ /** 取消整个 job:逐个取消 in-flight 项,pending 项标记 cancelled */
149
+ cancel(jobId: string): Promise<void>;
150
+ /** 暂停 job:schedule 不再补满,已 in-flight 项跑完即止 */
151
+ pause(jobId: string): Promise<void>;
152
+ /** 恢复 job:解除 pause,schedule 继续补满 */
153
+ resume(jobId: string): Promise<void>;
154
+ /**
155
+ * 重试 job 中所有 failed 项(仅当 job 已结束)。
156
+ * 重置 attempts/error/status,pending 重新等待 schedule。
157
+ */
158
+ retryFailed(jobId: string): Promise<void>;
159
+ /** 订阅 job 进度(返回取消订阅函数) */
160
+ onProgress(jobId: string, handler: (p: BatchProgress) => void): () => void;
161
+ /**
162
+ * 等待 job 完成(completed/failed/cancelled 任一)。
163
+ *
164
+ * M5 修复:
165
+ * - 增加 timeoutMs(默认 5min),超时 reject,避免坏 job 永久挂起泄漏订阅
166
+ * - batch:completed 事件已涵盖 failed(maybeComplete 对 failed>0 的 job
167
+ * 同样发 batch:completed),故只需监听 completed + cancelled
168
+ * - resolve 后立即解绑所有订阅,避免调用方丢弃 promise 时泄漏
169
+ * - cancel/maybeComplete 进入终态时也会 cleanupJobSubs 兜底
170
+ */
171
+ waitForCompletion(jobId: string, timeoutMs?: number): Promise<BatchJob>;
172
+ /** 清理 job 的所有进度订阅(终态时调用,避免泄漏) */
173
+ private cleanupJobSubs;
174
+ /** 启动 job:发 batch:started,进入 running,触发首次 schedule */
175
+ private runJob;
176
+ /**
177
+ * 调度循环:把 pending 项填入空闲槽位,直到无可用槽位或无 pending 项。
178
+ *
179
+ * 重入保护:用 scheduleLock 防止多个 schedule 调用并发导致超限(参考 W5
180
+ * BatchQueue.tsx 的 scheduleLock 修复:并发完成时多个 processItem 同时触发
181
+ * schedule 会读到相同 running 快照,导致并发超限)。
182
+ */
183
+ private schedule;
184
+ /** 处理单个项:导入 → run workflow → 导出 output AssetId */
185
+ private processItem;
186
+ /** 当前并发槽位(按内存压力动态收缩) */
187
+ private currentConcurrency;
188
+ /** 发出 progress 事件 + 通知订阅者 */
189
+ private emitProgress;
190
+ /** 检查 job 是否全部完成,如是则发 batch:completed */
191
+ private maybeComplete;
192
+ private isTerminal;
193
+ /** 派生每项的 workflow id(独立于其他项,便于 cancel) */
194
+ private itemWorkflowId;
195
+ /** 安全 emit(无 EventBus 时降级为 no-op,便于纯单元测试) */
196
+ private emit;
197
+ /** 内部可变状态 → 对外只读视图(浅拷贝 items 数组与每项) */
198
+ private toJobView;
199
+ }
200
+ //# sourceMappingURL=batch-processor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch-processor.d.ts","sourceRoot":"","sources":["../src/batch-processor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,OAAO,KAAK,EACV,OAAO,EACP,WAAW,EACX,eAAe,EACf,cAAc,EAEd,QAAQ,EAET,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,WAAW,EAAuB,MAAM,mBAAmB,CAAC;AAErE,oBAAoB;AACpB,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,MAAM,EAAE,WAAW,CAAC;IACpB,gDAAgD;IAChD,QAAQ,EAAE,QAAQ,CAAC;IACnB,oCAAoC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,uBAAuB;AACvB,MAAM,WAAW,SAAS;IACxB,+BAA+B;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,eAAe,CAAC;IACxB,gCAAgC;IAChC,MAAM,EAAE,WAAW,CAAC;IACpB,eAAe;IACf,QAAQ,EAAE,QAAQ,CAAC;IACnB,+BAA+B;IAC/B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,sBAAsB;IACtB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,YAAY;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAwB;AACxB,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,sBAAsB;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU;IACV,KAAK,EAAE,MAAM,CAAC;IACd,mBAAmB;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,wBAAwB;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,iBAAiB;AACjB,MAAM,WAAW,cAAc;IAC7B,UAAU;IACV,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,aAAa;AACb,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAqB;AACrB,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;gBACf,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;CAS7C;AAED,oBAAoB;AACpB,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC,aAAa;AACb,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAClC,eAAO,MAAM,eAAe,KAAK,CAAC;AAmClC;;;;;GAKG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAU;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAc;IAC3C,4CAA4C;IAC5C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAuC;IAC5D,aAAa;IACb,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsD;gBAEvE,IAAI,EAAE;QAChB,OAAO,EAAE,aAAa,CAAC;QACvB,QAAQ,EAAE,QAAQ,CAAC;QACnB,KAAK,EAAE,OAAO,CAAC;QACf,WAAW,CAAC,EAAE,WAAW,CAAC;KAC3B;IAOD;;;;OAIG;IACH,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,QAAQ;IAiD1C,mBAAmB;IACnB,IAAI,IAAI,QAAQ,EAAE;IAIlB,eAAe;IACf,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAKxC,sDAAsD;IAChD,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuC1C,6CAA6C;IACvC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUzC,oCAAoC;IAC9B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW1C;;;OAGG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB/C,0BAA0B;IAC1B,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,GAAG,MAAM,IAAI;IAa1E;;;;;;;;;OASG;IACG,iBAAiB,CACrB,KAAK,EAAE,MAAM,EACb,SAAS,SAAgB,GACxB,OAAO,CAAC,QAAQ,CAAC;IAuCpB,iCAAiC;IACjC,OAAO,CAAC,cAAc;IAMtB,sDAAsD;YACxC,MAAM;IAOpB;;;;;;OAMG;YACW,QAAQ;IA2BtB,kDAAkD;YACpC,WAAW;IAkHzB,wBAAwB;IACxB,OAAO,CAAC,kBAAkB;IAK1B,6BAA6B;IAC7B,OAAO,CAAC,YAAY;IAwBpB,yCAAyC;IACzC,OAAO,CAAC,aAAa;IAyBrB,OAAO,CAAC,UAAU;IAQlB,0CAA0C;IAC1C,OAAO,CAAC,cAAc;IAItB,6CAA6C;IAC7C,OAAO,CAAC,IAAI;IAQZ,uCAAuC;IACvC,OAAO,CAAC,SAAS;CAYlB"}