@lokvis/schema 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.
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.
@@ -67,6 +67,15 @@ export interface CapabilityImplementation {
67
67
  capability: CapabilityName;
68
68
  /** 实现该能力的引擎名 */
69
69
  engine: string;
70
+ /**
71
+ * 实现状态:
72
+ * - `'stable'`(默认):可正常执行
73
+ * - `'stub'`:占位实现,调用 execute 会抛出异常
74
+ *
75
+ * CapabilityRegistry.resolve() 会跳过 stub 实现,
76
+ * 避免运行时出现 "not implemented" 错误。
77
+ */
78
+ status?: 'stable' | 'stub';
70
79
  /**
71
80
  * 该引擎的性能等级(可选)。缺省时使用能力声明的 performance。
72
81
  * 用于 EngineSelectionStrategy('fastest'/'balanced')排序选择。
@@ -1 +1 @@
1
- {"version":3,"file":"capability.d.ts","sourceRoot":"","sources":["../src/capability.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,sDAAsD;AACtD,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAEpC,aAAa;AACb,MAAM,MAAM,mBAAmB,GAC3B,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,MAAM,GACN,OAAO,GACP,MAAM,GACN,OAAO,GACP,QAAQ,CAAC;AAEb,aAAa;AACb,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,mBAAmB,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,4BAA4B;IAC5B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,mBAAmB,CAAC;CAC7B;AAED,aAAa;AACb,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE1D;;;;;GAKG;AACH,MAAM,MAAM,uBAAuB,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,CAAC;AAEvE,wBAAwB;AACxB,MAAM,WAAW,UAAU;IACzB,2BAA2B;IAC3B,IAAI,EAAE,cAAc,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,qBAAqB;IACrB,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,qBAAqB;IACrB,WAAW,EAAE,SAAS,EAAE,CAAC;IACzB,gBAAgB;IAChB,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,yBAAyB;IACzB,WAAW,EAAE,gBAAgB,CAAC;IAC9B,6BAA6B;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,YAAY,CAAC;IAClD;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,iCAAiC;AACjC,MAAM,WAAW,wBAAwB;IACvC,uBAAuB;IACvB,UAAU,EAAE,cAAc,CAAC;IAC3B,gBAAgB;IAChB,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,aAAa;IACb,OAAO,EAAE,CACP,MAAM,EAAE,OAAO,YAAY,EAAE,KAAK,EAAE,EACpC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,gBAAgB,KACtB,OAAO,CAAC,OAAO,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;CAC5C;AAED,cAAc;AACd,MAAM,WAAW,gBAAgB;IAC/B,qBAAqB;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW;IACX,MAAM,EAAE,WAAW,CAAC;IACpB,gBAAgB;IAChB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,WAAW;IACX,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAClE"}
1
+ {"version":3,"file":"capability.d.ts","sourceRoot":"","sources":["../src/capability.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,sDAAsD;AACtD,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAEpC,aAAa;AACb,MAAM,MAAM,mBAAmB,GAC3B,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,MAAM,GACN,OAAO,GACP,MAAM,GACN,OAAO,GACP,QAAQ,CAAC;AAEb,aAAa;AACb,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,mBAAmB,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,4BAA4B;IAC5B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,mBAAmB,CAAC;CAC7B;AAED,aAAa;AACb,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE1D;;;;;GAKG;AACH,MAAM,MAAM,uBAAuB,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,CAAC;AAEvE,wBAAwB;AACxB,MAAM,WAAW,UAAU;IACzB,2BAA2B;IAC3B,IAAI,EAAE,cAAc,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,qBAAqB;IACrB,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,qBAAqB;IACrB,WAAW,EAAE,SAAS,EAAE,CAAC;IACzB,gBAAgB;IAChB,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,yBAAyB;IACzB,WAAW,EAAE,gBAAgB,CAAC;IAC9B,6BAA6B;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,YAAY,CAAC;IAClD;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,iCAAiC;AACjC,MAAM,WAAW,wBAAwB;IACvC,uBAAuB;IACvB,UAAU,EAAE,cAAc,CAAC;IAC3B,gBAAgB;IAChB,MAAM,EAAE,MAAM,CAAC;IACf;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC3B;;;OAGG;IACH,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,aAAa;IACb,OAAO,EAAE,CACP,MAAM,EAAE,OAAO,YAAY,EAAE,KAAK,EAAE,EACpC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,gBAAgB,KACtB,OAAO,CAAC,OAAO,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;CAC5C;AAED,cAAc;AACd,MAAM,WAAW,gBAAgB;IAC/B,qBAAqB;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW;IACX,MAAM,EAAE,WAAW,CAAC;IACpB,gBAAgB;IAChB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,WAAW;IACX,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAClE"}
package/dist/event.d.ts CHANGED
@@ -6,6 +6,10 @@
6
6
  import type { Asset, AssetId, AssetMetadata } from './asset.js';
7
7
  import type { Workflow, WorkflowResult } from './workflow.js';
8
8
  import type { HistoryEntry } from './asset.js';
9
+ /** 批量项状态(对应 BatchProcessor 内部状态机) */
10
+ export type BatchItemStatus = 'pending' | 'processing' | 'completed' | 'failed' | 'cancelled';
11
+ /** 批量作业状态 */
12
+ export type BatchJobStatus = 'queued' | 'running' | 'paused' | 'completed' | 'cancelled' | 'failed';
9
13
  /** Lokvis 标准事件类型联合 */
10
14
  export type LokvisEvent = {
11
15
  type: 'asset:imported';
@@ -58,6 +62,8 @@ export type LokvisEvent = {
58
62
  type: 'history:changed';
59
63
  workflowId: string;
60
64
  entries: HistoryEntry[];
65
+ /** 当前游标(指向最后一条已应用的 entry;-1 表示无已应用条目) */
66
+ currentIndex: number;
61
67
  } | {
62
68
  type: 'capability:registered';
63
69
  capability: string;
@@ -66,6 +72,56 @@ export type LokvisEvent = {
66
72
  type: 'plugin:loaded';
67
73
  name: string;
68
74
  version: string;
75
+ } | {
76
+ type: 'batch:started';
77
+ jobId: string;
78
+ total: number;
79
+ } | {
80
+ type: 'batch:item:started';
81
+ jobId: string;
82
+ itemId: string;
83
+ index: number;
84
+ total: number;
85
+ } | {
86
+ type: 'batch:item:finished';
87
+ jobId: string;
88
+ itemId: string;
89
+ index: number;
90
+ total: number;
91
+ outputAssetId: AssetId;
92
+ duration: number;
93
+ } | {
94
+ type: 'batch:item:failed';
95
+ jobId: string;
96
+ itemId: string;
97
+ index: number;
98
+ total: number;
99
+ error: Error;
100
+ /** 已重试次数(达到 maxRetries 后才发 failed 事件) */
101
+ attempts: number;
102
+ } | {
103
+ type: 'batch:progress';
104
+ jobId: string;
105
+ completed: number;
106
+ failed: number;
107
+ total: number;
108
+ } | {
109
+ type: 'batch:completed';
110
+ jobId: string;
111
+ total: number;
112
+ completed: number;
113
+ failed: number;
114
+ duration: number;
115
+ } | {
116
+ type: 'batch:cancelled';
117
+ jobId: string;
118
+ cancelled: number;
119
+ } | {
120
+ type: 'batch:paused';
121
+ jobId: string;
122
+ } | {
123
+ type: 'batch:resumed';
124
+ jobId: string;
69
125
  };
70
126
  /** 所有事件类型字面量 */
71
127
  export type LokvisEventType = LokvisEvent['type'];
@@ -1 +1 @@
1
- {"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../src/event.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../src/event.ts"],"names":[],"mappings":"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"}
package/dist/exif.d.ts ADDED
@@ -0,0 +1,53 @@
1
+ /**
2
+ * EXIF 元数据类型与格式化(W7.3/7.4)
3
+ *
4
+ * 类型分两层:
5
+ * - `ExifData`:面向 UI / Runtime 的公共类型,只含结构化字段,**无 raw**
6
+ * - `RawExifData`:Plugin 内部类型,extends ExifData,额外含 `raw`(exifr 原始解析对象)
7
+ *
8
+ * 拆分原因(长期方案):UI 缓存 ExifData 时无需手动剔除 raw 字段,
9
+ * 避免每个消费者都要做 `{...data, raw: undefined}` 的 patch 操作。
10
+ * Plugin 在返回前把 RawExifData 收窄为 ExifData(丢弃 raw)。
11
+ */
12
+ /**
13
+ * 面向 UI / Runtime 的 EXIF 结构化数据。
14
+ * 不含 raw 字段 —— raw 仅在 Plugin 内部用于调试 / 高级展示,
15
+ * 不会传递到 UI 层(避免大对象在缓存中累积)。
16
+ */
17
+ export interface ExifData {
18
+ make?: string;
19
+ model?: string;
20
+ lensModel?: string;
21
+ dateTimeOriginal?: string;
22
+ iso?: number;
23
+ fNumber?: number;
24
+ exposureTime?: number;
25
+ focalLength?: number;
26
+ exposureCompensation?: number;
27
+ whiteBalance?: string;
28
+ gpsLatitude?: number;
29
+ gpsLongitude?: number;
30
+ gpsAltitude?: number;
31
+ orientation?: number;
32
+ software?: string;
33
+ }
34
+ /**
35
+ * Plugin 内部使用的完整 EXIF 数据,extends ExifData 并附加 raw 字段。
36
+ * raw 保留 exifr.parse 返回的原始对象,供调试或未来高级面板使用。
37
+ * Plugin 在通过 MetadataReader 返回给 Runtime 时,应丢弃 raw(收窄为 ExifData)。
38
+ */
39
+ export interface RawExifData extends ExifData {
40
+ /** exifr.parse 返回的原始对象(未筛选) */
41
+ raw?: Record<string, unknown>;
42
+ }
43
+ /** EXIF 面板的单行展示数据 */
44
+ export interface ExifRow {
45
+ label: string;
46
+ value: string;
47
+ }
48
+ /**
49
+ * 把 ExifData 格式化为 UI 展示用的行列表。
50
+ * 纯函数,放 schema 层供 UI 直接调用,避免 UI 跨层依赖 plugin / engine。
51
+ */
52
+ export declare function formatExifRows(exif: ExifData): ExifRow[];
53
+ //# sourceMappingURL=exif.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exif.d.ts","sourceRoot":"","sources":["../src/exif.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;;;GAIG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,WAAW,WAAY,SAAQ,QAAQ;IAC3C,+BAA+B;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,qBAAqB;AACrB,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,EAAE,CAuBxD"}
package/dist/exif.js ADDED
@@ -0,0 +1,52 @@
1
+ /**
2
+ * EXIF 元数据类型与格式化(W7.3/7.4)
3
+ *
4
+ * 类型分两层:
5
+ * - `ExifData`:面向 UI / Runtime 的公共类型,只含结构化字段,**无 raw**
6
+ * - `RawExifData`:Plugin 内部类型,extends ExifData,额外含 `raw`(exifr 原始解析对象)
7
+ *
8
+ * 拆分原因(长期方案):UI 缓存 ExifData 时无需手动剔除 raw 字段,
9
+ * 避免每个消费者都要做 `{...data, raw: undefined}` 的 patch 操作。
10
+ * Plugin 在返回前把 RawExifData 收窄为 ExifData(丢弃 raw)。
11
+ */
12
+ /**
13
+ * 把 ExifData 格式化为 UI 展示用的行列表。
14
+ * 纯函数,放 schema 层供 UI 直接调用,避免 UI 跨层依赖 plugin / engine。
15
+ */
16
+ export function formatExifRows(exif) {
17
+ const rows = [];
18
+ const push = (label, value) => {
19
+ if (value !== undefined && value !== '')
20
+ rows.push({ label, value });
21
+ };
22
+ push('Camera', exif.make && exif.model ? `${exif.make} ${exif.model}` : exif.make ?? exif.model);
23
+ push('Lens', exif.lensModel);
24
+ push('Date', exif.dateTimeOriginal);
25
+ push('ISO', exif.iso !== undefined ? `ISO ${exif.iso}` : undefined);
26
+ push('Aperture', exif.fNumber !== undefined ? `f/${exif.fNumber}` : undefined);
27
+ push('Shutter', exif.exposureTime !== undefined ? formatShutterSpeed(exif.exposureTime) : undefined);
28
+ push('Focal Length', exif.focalLength !== undefined ? `${exif.focalLength}mm` : undefined);
29
+ push('Exposure Comp.', exif.exposureCompensation !== undefined ? `${exif.exposureCompensation} EV` : undefined);
30
+ push('White Balance', exif.whiteBalance);
31
+ push('Software', exif.software);
32
+ if (exif.gpsLatitude !== undefined && exif.gpsLongitude !== undefined) {
33
+ push('GPS', `${exif.gpsLatitude.toFixed(6)}, ${exif.gpsLongitude.toFixed(6)}`);
34
+ if (exif.gpsAltitude !== undefined) {
35
+ push('GPS Altitude', `${exif.gpsAltitude.toFixed(1)} m`);
36
+ }
37
+ }
38
+ push('Orientation', exif.orientation !== undefined ? `${exif.orientation}` : undefined);
39
+ return rows;
40
+ }
41
+ /**
42
+ * 格式化快门速度:
43
+ * - >= 1s 直接显示秒数(如 "2s")
44
+ * - < 1s 转为分数(如 1/250s)
45
+ */
46
+ function formatShutterSpeed(seconds) {
47
+ if (seconds >= 1)
48
+ return `${seconds}s`;
49
+ const denominator = Math.round(1 / seconds);
50
+ return `1/${denominator}s`;
51
+ }
52
+ //# sourceMappingURL=exif.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exif.js","sourceRoot":"","sources":["../src/exif.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAyCH;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAAc;IAC3C,MAAM,IAAI,GAAc,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,KAAyB,EAAQ,EAAE;QAC9D,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;YAAE,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACvE,CAAC,CAAC;IACF,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;IACjG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACpC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACpE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC/E,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACrG,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC3F,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,oBAAoB,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,oBAAoB,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAChH,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IACzC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACtE,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC/E,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IACD,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACxF,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,SAAS,kBAAkB,CAAC,OAAe;IACzC,IAAI,OAAO,IAAI,CAAC;QAAE,OAAO,GAAG,OAAO,GAAG,CAAC;IACvC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;IAC5C,OAAO,KAAK,WAAW,GAAG,CAAC;AAC7B,CAAC"}
package/dist/index.d.ts CHANGED
@@ -9,6 +9,7 @@ export * from './capability.js';
9
9
  export * from './workflow.js';
10
10
  export * from './event.js';
11
11
  export * from './plugin.js';
12
+ export * from './exif.js';
12
13
  export * from './mcp.js';
13
14
  export * from './validators.js';
14
15
  export declare const SCHEMA_VERSION: "1.0.0";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAE5B,cAAc,UAAU,CAAC;AAGzB,cAAc,iBAAiB,CAAC;AAGhC,eAAO,MAAM,cAAc,EAAG,OAAgB,CAAC;AAC/C,eAAO,MAAM,mBAAmB,EAAG,OAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAE1B,cAAc,UAAU,CAAC;AAGzB,cAAc,iBAAiB,CAAC;AAGhC,eAAO,MAAM,cAAc,EAAG,OAAgB,CAAC;AAC/C,eAAO,MAAM,mBAAmB,EAAG,OAAgB,CAAC"}
package/dist/index.js CHANGED
@@ -10,6 +10,7 @@ export * from './capability.js';
10
10
  export * from './workflow.js';
11
11
  export * from './event.js';
12
12
  export * from './plugin.js';
13
+ export * from './exif.js';
13
14
  // MCP manifest 类型(见 docs/AI生态冲击调整方案.md §6.1)
14
15
  export * from './mcp.js';
15
16
  // Zod 校验器
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO;AACP,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,6CAA6C;AAC7C,cAAc,UAAU,CAAC;AAEzB,UAAU;AACV,cAAc,iBAAiB,CAAC;AAEhC,OAAO;AACP,MAAM,CAAC,MAAM,cAAc,GAAG,OAAgB,CAAC;AAC/C,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO;AACP,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,6CAA6C;AAC7C,cAAc,UAAU,CAAC;AAEzB,UAAU;AACV,cAAc,iBAAiB,CAAC;AAEhC,OAAO;AACP,MAAM,CAAC,MAAM,cAAc,GAAG,OAAgB,CAAC;AAC/C,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAgB,CAAC"}
package/dist/plugin.d.ts CHANGED
@@ -49,6 +49,27 @@ export interface PanelDefinition {
49
49
  selectedAssets: string[];
50
50
  }) => boolean;
51
51
  }
52
+ /**
53
+ * 元数据读取函数(依赖反转)。
54
+ *
55
+ * 某些 Plugin 能力本质是"元数据查询"而非"资产变换"(如 EXIF 读取:
56
+ * Blob → ExifData),既不符合 Engine 层 Blob↔Blob 约束,也不符合
57
+ * CapabilityImplementation 的 Asset[]→Asset[] 契约。这类能力通过
58
+ * MetadataReader 注册:Plugin 提供读取函数,Runtime 持有引用并按名调用。
59
+ *
60
+ * 与 registerCapability 的区别:
61
+ * - registerCapability:注册变换能力(Asset→Asset),走 WorkflowExecutor
62
+ * - registerMetadataReader:注册查询函数(Asset→T),走 Runtime 直接调用
63
+ *
64
+ * 优点(相对 Capability execute + data Asset 序列化方案):
65
+ * - 无需创建临时 data Asset(避免手动 removeAsset 清理 / 泄漏)
66
+ * - 无 JSON marshal/unmarshal 开销
67
+ * - 类型直接透传(ExifData),无需序列化
68
+ *
69
+ * @param asset 输入资产
70
+ * @returns 读取结果;无数据 / 解析失败返回 null
71
+ */
72
+ export type MetadataReader<T = unknown> = (asset: import('./asset.js').Asset) => Promise<T | null>;
52
73
  /**
53
74
  * Plugin 上下文(Plugin 能访问的全部 API)
54
75
  *
@@ -75,8 +96,19 @@ export interface PluginContext {
75
96
  };
76
97
  /** 事件总线 */
77
98
  eventBus: import('./event.js').EventBus;
78
- /** 注册能力实现 */
99
+ /** 注册能力实现(变换:Asset→Asset) */
79
100
  registerCapability(impl: CapabilityImplementation): void;
101
+ /**
102
+ * 注册元数据读取函数(查询:Asset→T)。
103
+ *
104
+ * 用于非变换类能力(如 EXIF 读取)。Runtime 持有 reader 引用,
105
+ * UI 通过 runtime.readAssetExif(id) 间接调用,不直接依赖 Plugin / Engine。
106
+ * 同名 reader 重复注册时覆盖前者(支持热更新)。
107
+ *
108
+ * @param name 读取器名称,约定与能力名对齐(如 'image.read-exif')
109
+ * @param reader 读取函数
110
+ */
111
+ registerMetadataReader<T>(name: string, reader: MetadataReader<T>): void;
80
112
  /** 注册 UI Panel */
81
113
  registerPanel(panel: PanelDefinition): void;
82
114
  /** 日志 */
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,10 @@
5
5
  */
6
6
  import { z } from 'zod';
7
7
  export declare const assetTypeSchema: z.ZodEnum<["image", "video", "audio", "pdf", "text", "data", "unknown"]>;
8
+ /** W10: Workflow 分类枚举(与 WorkflowCategory 类型对齐) */
9
+ export declare const workflowCategorySchema: z.ZodEnum<["image", "video", "audio", "pdf", "ai", "data", "developer", "ecommerce", "content-creation", "other"]>;
10
+ /** W10: Workflow 输出类型枚举(含 archive 用于打包下载场景) */
11
+ export declare const workflowOutputTypeSchema: z.ZodEnum<["image", "video", "audio", "pdf", "text", "data", "unknown", "archive"]>;
8
12
  export declare const assetMetadataSchema: z.ZodObject<{
9
13
  mimeType: z.ZodString;
10
14
  size: z.ZodNumber;
@@ -99,7 +103,7 @@ export declare const workflowSchema: z.ZodObject<{
99
103
  id: string;
100
104
  name: string;
101
105
  }>;
102
- category: z.ZodString;
106
+ category: z.ZodEnum<["image", "video", "audio", "pdf", "ai", "data", "developer", "ecommerce", "content-creation", "other"]>;
103
107
  tags: z.ZodArray<z.ZodString, "many">;
104
108
  nodes: z.ZodArray<z.ZodEffects<z.ZodObject<{
105
109
  id: z.ZodString;
@@ -180,7 +184,7 @@ export declare const workflowSchema: z.ZodObject<{
180
184
  id: string;
181
185
  name: string;
182
186
  };
183
- category: string;
187
+ category: "image" | "video" | "audio" | "pdf" | "data" | "ai" | "developer" | "ecommerce" | "content-creation" | "other";
184
188
  tags: string[];
185
189
  nodes: {
186
190
  type: "load" | "transform" | "export";
@@ -216,7 +220,7 @@ export declare const workflowSchema: z.ZodObject<{
216
220
  id: string;
217
221
  name: string;
218
222
  };
219
- category: string;
223
+ category: "image" | "video" | "audio" | "pdf" | "data" | "ai" | "developer" | "ecommerce" | "content-creation" | "other";
220
224
  tags: string[];
221
225
  nodes: {
222
226
  type: "load" | "transform" | "export";
@@ -288,8 +292,35 @@ export declare const pluginManifestSchema: z.ZodObject<{
288
292
  permissions: string[];
289
293
  icon?: string | undefined;
290
294
  }>;
291
- /** 校验 Workflow JSON */
292
- export declare function validateWorkflow(data: unknown): z.SafeParseReturnType<{
295
+ /**
296
+ * 校验 Workflow JSON。
297
+ *
298
+ * 修复 review 报告:原实现仅做 Zod 形状校验,不检查 edge 引用、保留字、DAG 合法性,
299
+ * 导致 demo 用 `__input__` 哨兵边时 Zod 通过但 executor 抛 "cycle"。
300
+ * 现增加结构层校验,让错误在入口处暴露。
301
+ *
302
+ * W10.2 增强:新增 capability 兼容性校验(可选)。
303
+ * 通过 `options.resolveCapability` 回调查询 capability 的 inputTypes/outputTypes,
304
+ * 检查相邻节点的输出类型与下一节点的输入类型是否兼容。schema 包无法直接访问
305
+ * CapabilityRegistry,故采用回调注入模式(避免五层依赖违规)。
306
+ *
307
+ * @param data 待校验的 Workflow JSON
308
+ * @param options 可选项:
309
+ * - resolveCapability: (name: string) => Capability | undefined
310
+ * 返回 capability 声明;返回 undefined 时跳过该节点的兼容性校验(向后兼容)
311
+ * - maxSteps: number
312
+ * 最大节点数限制(默认不限制;W10 要求 5 步,调用方按需传入)
313
+ */
314
+ export interface ValidateWorkflowOptions {
315
+ /** 查询 capability 声明的回调(返回 undefined 时跳过该节点校验) */
316
+ resolveCapability?: (name: string) => {
317
+ inputTypes: string[];
318
+ outputTypes: string[];
319
+ } | undefined;
320
+ /** 最大节点数限制(可选) */
321
+ maxSteps?: number;
322
+ }
323
+ export declare function validateWorkflow(data: unknown, options?: ValidateWorkflowOptions): z.SafeParseError<{
293
324
  id: string;
294
325
  version: string;
295
326
  name: string;
@@ -298,7 +329,7 @@ export declare function validateWorkflow(data: unknown): z.SafeParseReturnType<{
298
329
  id: string;
299
330
  name: string;
300
331
  };
301
- category: string;
332
+ category: "image" | "video" | "audio" | "pdf" | "data" | "ai" | "developer" | "ecommerce" | "content-creation" | "other";
302
333
  tags: string[];
303
334
  nodes: {
304
335
  type: "load" | "transform" | "export";
@@ -325,43 +356,57 @@ export declare function validateWorkflow(data: unknown): z.SafeParseReturnType<{
325
356
  official?: boolean | undefined;
326
357
  createdAt?: number | undefined;
327
358
  updatedAt?: number | undefined;
328
- }, {
329
- id: string;
330
- version: string;
331
- name: string;
332
- description: string;
333
- author: {
334
- id: string;
335
- name: string;
359
+ }> | {
360
+ success: false;
361
+ error: {
362
+ issues: {
363
+ code: "custom";
364
+ message: string;
365
+ path: never[];
366
+ }[];
336
367
  };
337
- category: string;
338
- tags: string[];
339
- nodes: {
340
- type: "load" | "transform" | "export";
368
+ data?: undefined;
369
+ } | {
370
+ success: true;
371
+ data: {
341
372
  id: string;
342
- params?: Record<string, unknown> | undefined;
343
- capability?: string | undefined;
344
- label?: string | undefined;
345
- }[];
346
- edges: {
347
- from: string;
348
- to: string;
349
- }[];
350
- inputs: {
351
- type: "image" | "video" | "audio" | "pdf" | "text" | "data" | "unknown";
352
- multiple: boolean;
353
- maxCount?: number | undefined;
354
- accept?: string[] | undefined;
355
- };
356
- outputs: {
357
- type: "image" | "video" | "audio" | "pdf" | "text" | "data" | "unknown" | "archive";
358
- format?: string | undefined;
373
+ version: string;
374
+ name: string;
375
+ description: string;
376
+ author: {
377
+ id: string;
378
+ name: string;
379
+ };
380
+ category: "image" | "video" | "audio" | "pdf" | "data" | "ai" | "developer" | "ecommerce" | "content-creation" | "other";
381
+ tags: string[];
382
+ nodes: {
383
+ type: "load" | "transform" | "export";
384
+ id: string;
385
+ params?: Record<string, unknown> | undefined;
386
+ capability?: string | undefined;
387
+ label?: string | undefined;
388
+ }[];
389
+ edges: {
390
+ from: string;
391
+ to: string;
392
+ }[];
393
+ inputs: {
394
+ type: "image" | "video" | "audio" | "pdf" | "text" | "data" | "unknown";
395
+ multiple: boolean;
396
+ maxCount?: number | undefined;
397
+ accept?: string[] | undefined;
398
+ };
399
+ outputs: {
400
+ type: "image" | "video" | "audio" | "pdf" | "text" | "data" | "unknown" | "archive";
401
+ format?: string | undefined;
402
+ };
403
+ $schema?: string | undefined;
404
+ official?: boolean | undefined;
405
+ createdAt?: number | undefined;
406
+ updatedAt?: number | undefined;
359
407
  };
360
- $schema?: string | undefined;
361
- official?: boolean | undefined;
362
- createdAt?: number | undefined;
363
- updatedAt?: number | undefined;
364
- }>;
408
+ error?: undefined;
409
+ };
365
410
  /** 校验 Plugin Manifest */
366
411
  export declare function validatePluginManifest(data: unknown): z.SafeParseReturnType<{
367
412
  version: string;
@@ -1 +1 @@
1
- {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,eAAe,0EAQ1B,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAS9B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAU9B,CAAC;AAEF,eAAO,MAAM,kBAAkB;;;;;;;;;EAG7B,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwBzB,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAW/B,CAAC;AAEH,uBAAuB;AACvB,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAE7C;AAED,yBAAyB;AACzB,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;GAEnD"}
1
+ {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,eAAe,0EAQ1B,CAAC;AAEH,kDAAkD;AAClD,eAAO,MAAM,sBAAsB,oHAWjC,CAAC;AAEH,+CAA+C;AAC/C,eAAO,MAAM,wBAAwB,qFASnC,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAS9B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAU9B,CAAC;AAEF,eAAO,MAAM,kBAAkB;;;;;;;;;EAG7B,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwBzB,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAW/B,CAAC;AAEH;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,uBAAuB;IACtC,iDAAiD;IACjD,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK;QACpC,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,WAAW,EAAE,MAAM,EAAE,CAAC;KACvB,GAAG,SAAS,CAAC;IACd,kBAAkB;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+HhF;AA4FD,yBAAyB;AACzB,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;GAEnD"}