@lokvis/schema 0.4.0 → 0.4.1

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.
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * AUTO-GENERATED BY scripts/codegen-capabilities.ts — DO NOT EDIT.
3
3
  *
4
- * 来源:packages/capability/manifests/ai.manifest.json, packages/capability/manifests/audio.manifest.json, packages/capability/manifests/image.manifest.json, packages/capability/manifests/pdf.manifest.json, packages/capability/manifests/video.manifest.json
4
+ * 来源:packages/capability/manifests/ai.manifest.json, packages/capability/manifests/audio.manifest.json, packages/capability/manifests/developer.manifest.json, packages/capability/manifests/image.manifest.json, packages/capability/manifests/pdf.manifest.json, packages/capability/manifests/video.manifest.json
5
5
  * 重跑:pnpm codegen
6
6
  *
7
7
  * 此文件提供精确字面量联合类型 BuiltinCapabilityName,
@@ -13,7 +13,7 @@
13
13
  * - `BuiltinCapabilityName` 是已知内置能力的字面量子集,
14
14
  * 可作为 `CapabilityName` 的精确化类型
15
15
  */
16
- export type BuiltinCapabilityName = 'ai.ocr' | 'ai.caption' | 'ai.background-remove' | 'ai.generate-workflow' | 'ai.optimize-workflow' | 'audio.trim' | 'audio.normalize' | 'audio.merge' | 'audio.transcode' | 'audio.denoise' | 'image.resize' | 'image.compress' | 'image.convert' | 'image.crop' | 'image.rotate' | 'image.flip' | 'image.watermark' | 'image.background' | 'image.filter' | 'pdf.merge' | 'pdf.split' | 'pdf.compress' | 'pdf.rotate' | 'pdf.watermark' | 'pdf.ocr' | 'pdf.sign' | 'pdf.add-page-numbers' | 'video.compress' | 'video.transcode' | 'video.trim' | 'video.merge' | 'video.extract-audio' | 'video.to-gif' | 'video.screenshot';
16
+ export type BuiltinCapabilityName = 'ai.ocr' | 'ai.caption' | 'ai.background-remove' | 'ai.generate-workflow' | 'ai.optimize-workflow' | 'ai.diagnose-error' | 'audio.trim' | 'audio.normalize' | 'audio.merge' | 'audio.transcode' | 'developer.inspect.capabilities' | 'developer.inspect.asset' | 'developer.validate.workflow' | 'developer.profile' | 'image.resize' | 'image.compress' | 'image.convert' | 'image.crop' | 'image.rotate' | 'image.flip' | 'image.watermark' | 'image.background' | 'image.filter' | 'pdf.merge' | 'pdf.split' | 'pdf.compress' | 'pdf.rotate' | 'pdf.watermark' | 'pdf.ocr' | 'pdf.sign' | 'video.compress' | 'video.transcode' | 'video.trim' | 'video.merge' | 'video.extract-audio' | 'video.to-gif' | 'video.screenshot';
17
17
  /** 全部内置能力名常量数组(运行时校验 / 枚举用) */
18
18
  export declare const BUILTIN_CAPABILITY_NAMES: readonly BuiltinCapabilityName[];
19
19
  //# sourceMappingURL=capability-names.generated.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"capability-names.generated.d.ts","sourceRoot":"","sources":["../src/capability-names.generated.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,qBAAqB,GAC7B,QAAQ,GACR,YAAY,GACZ,sBAAsB,GACtB,sBAAsB,GACtB,sBAAsB,GACtB,YAAY,GACZ,iBAAiB,GACjB,aAAa,GACb,iBAAiB,GACjB,eAAe,GACf,cAAc,GACd,gBAAgB,GAChB,eAAe,GACf,YAAY,GACZ,cAAc,GACd,YAAY,GACZ,iBAAiB,GACjB,kBAAkB,GAClB,cAAc,GACd,WAAW,GACX,WAAW,GACX,cAAc,GACd,YAAY,GACZ,eAAe,GACf,SAAS,GACT,UAAU,GACV,sBAAsB,GACtB,gBAAgB,GAChB,iBAAiB,GACjB,YAAY,GACZ,aAAa,GACb,qBAAqB,GACrB,cAAc,GACd,kBAAkB,CAAC;AAEvB,+BAA+B;AAC/B,eAAO,MAAM,wBAAwB,EAAE,SAAS,qBAAqB,EAmCpE,CAAC"}
1
+ {"version":3,"file":"capability-names.generated.d.ts","sourceRoot":"","sources":["../src/capability-names.generated.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,qBAAqB,GAC7B,QAAQ,GACR,YAAY,GACZ,sBAAsB,GACtB,sBAAsB,GACtB,sBAAsB,GACtB,mBAAmB,GACnB,YAAY,GACZ,iBAAiB,GACjB,aAAa,GACb,iBAAiB,GACjB,gCAAgC,GAChC,yBAAyB,GACzB,6BAA6B,GAC7B,mBAAmB,GACnB,cAAc,GACd,gBAAgB,GAChB,eAAe,GACf,YAAY,GACZ,cAAc,GACd,YAAY,GACZ,iBAAiB,GACjB,kBAAkB,GAClB,cAAc,GACd,WAAW,GACX,WAAW,GACX,cAAc,GACd,YAAY,GACZ,eAAe,GACf,SAAS,GACT,UAAU,GACV,gBAAgB,GAChB,iBAAiB,GACjB,YAAY,GACZ,aAAa,GACb,qBAAqB,GACrB,cAAc,GACd,kBAAkB,CAAC;AAEvB,+BAA+B;AAC/B,eAAO,MAAM,wBAAwB,EAAE,SAAS,qBAAqB,EAsCpE,CAAC"}
@@ -5,11 +5,15 @@ export const BUILTIN_CAPABILITY_NAMES = [
5
5
  'ai.background-remove',
6
6
  'ai.generate-workflow',
7
7
  'ai.optimize-workflow',
8
+ 'ai.diagnose-error',
8
9
  'audio.trim',
9
10
  'audio.normalize',
10
11
  'audio.merge',
11
12
  'audio.transcode',
12
- 'audio.denoise',
13
+ 'developer.inspect.capabilities',
14
+ 'developer.inspect.asset',
15
+ 'developer.validate.workflow',
16
+ 'developer.profile',
13
17
  'image.resize',
14
18
  'image.compress',
15
19
  'image.convert',
@@ -26,7 +30,6 @@ export const BUILTIN_CAPABILITY_NAMES = [
26
30
  'pdf.watermark',
27
31
  'pdf.ocr',
28
32
  'pdf.sign',
29
- 'pdf.add-page-numbers',
30
33
  'video.compress',
31
34
  'video.transcode',
32
35
  'video.trim',
@@ -1 +1 @@
1
- {"version":3,"file":"capability-names.generated.js","sourceRoot":"","sources":["../src/capability-names.generated.ts"],"names":[],"mappings":"AAmDA,+BAA+B;AAC/B,MAAM,CAAC,MAAM,wBAAwB,GAAqC;IACxE,QAAQ;IACR,YAAY;IACZ,sBAAsB;IACtB,sBAAsB;IACtB,sBAAsB;IACtB,YAAY;IACZ,iBAAiB;IACjB,aAAa;IACb,iBAAiB;IACjB,eAAe;IACf,cAAc;IACd,gBAAgB;IAChB,eAAe;IACf,YAAY;IACZ,cAAc;IACd,YAAY;IACZ,iBAAiB;IACjB,kBAAkB;IAClB,cAAc;IACd,WAAW;IACX,WAAW;IACX,cAAc;IACd,YAAY;IACZ,eAAe;IACf,SAAS;IACT,UAAU;IACV,sBAAsB;IACtB,gBAAgB;IAChB,iBAAiB;IACjB,YAAY;IACZ,aAAa;IACb,qBAAqB;IACrB,cAAc;IACd,kBAAkB;CACnB,CAAC"}
1
+ {"version":3,"file":"capability-names.generated.js","sourceRoot":"","sources":["../src/capability-names.generated.ts"],"names":[],"mappings":"AAsDA,+BAA+B;AAC/B,MAAM,CAAC,MAAM,wBAAwB,GAAqC;IACxE,QAAQ;IACR,YAAY;IACZ,sBAAsB;IACtB,sBAAsB;IACtB,sBAAsB;IACtB,mBAAmB;IACnB,YAAY;IACZ,iBAAiB;IACjB,aAAa;IACb,iBAAiB;IACjB,gCAAgC;IAChC,yBAAyB;IACzB,6BAA6B;IAC7B,mBAAmB;IACnB,cAAc;IACd,gBAAgB;IAChB,eAAe;IACf,YAAY;IACZ,cAAc;IACd,YAAY;IACZ,iBAAiB;IACjB,kBAAkB;IAClB,cAAc;IACd,WAAW;IACX,WAAW;IACX,cAAc;IACd,YAAY;IACZ,eAAe;IACf,SAAS;IACT,UAAU;IACV,gBAAgB;IAChB,iBAAiB;IACjB,YAAY;IACZ,aAAa;IACb,qBAAqB;IACrB,cAAc;IACd,kBAAkB;CACnB,CAAC"}
package/dist/index.d.ts CHANGED
@@ -10,6 +10,7 @@ export * from './workflow.js';
10
10
  export * from './event.js';
11
11
  export * from './plugin.js';
12
12
  export * from './exif.js';
13
+ export * from './metadata.js';
13
14
  export * from './mcp.js';
14
15
  export * from './validators.js';
15
16
  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;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"}
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,eAAe,CAAC;AAE9B,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
@@ -11,6 +11,8 @@ export * from './workflow.js';
11
11
  export * from './event.js';
12
12
  export * from './plugin.js';
13
13
  export * from './exif.js';
14
+ // 跨层共享的资产元数据查询类型(ImageMetadata / PdfInfo,见 metadata.ts)
15
+ export * from './metadata.js';
14
16
  // MCP manifest 类型(见 docs/AI生态冲击调整方案.md §6.1)
15
17
  export * from './mcp.js';
16
18
  // 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,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"}
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,wDAAwD;AACxD,cAAc,eAAe,CAAC;AAC9B,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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * 跨层共享的资产元数据查询类型。
3
+ *
4
+ * 与 ExifData 同一设计层级:某些 Plugin 能力本质是"元数据查询"而非
5
+ * "资产变换"(如 image dimensions 读取、pdf 页数读取),既不符合 Engine
6
+ * 层 Blob↔Blob 纯函数约束,也不符合 Capability Asset[]→Asset[] 契约。
7
+ * 这类能力通过 MetadataReader 注册,返回值类型定义在此处,
8
+ * 供 Runtime / SDK / 上层消费者(mcp-server 等)共享,避免跨层依赖。
9
+ *
10
+ * 与 AssetMetadata 的区别:
11
+ * - AssetMetadata:导入时一次性提取的通用元数据(size/mimeType/format/
12
+ * dimensions/duration/pages),所有 asset 都有
13
+ * - ImageMetadata / PdfInfo:按需查询的领域特定元数据,由 Plugin 通过
14
+ * MetadataReader 提供(如 image 经 sharp 解码读尺寸、pdf 经 pdf-lib
15
+ * 读页数),用于处理后输出资产的精确元数据报告
16
+ */
17
+ /**
18
+ * 图像元数据(width/height/format)。
19
+ *
20
+ * 由 plugin-image 的 `image.read-metadata` MetadataReader 提供,
21
+ * 内部调用 engine-image/node 的 getMetadata(sharp .metadata())。
22
+ * 与 engine-image/node 的 ImageMetadata 接口对齐(此处为共享类型源,
23
+ * engine-image 改为 re-export 本类型)。
24
+ */
25
+ export interface ImageMetadata {
26
+ width: number;
27
+ height: number;
28
+ format: string;
29
+ }
30
+ /**
31
+ * PDF 基本信息(页数)。
32
+ *
33
+ * 由 plugin-pdf 的 `pdf.read-info` MetadataReader 提供,
34
+ * 内部调用 engine-pdf 的 getPdfInfo(pdf-lib getPageCount)。
35
+ * 与 engine-pdf 的 PdfInfo 接口对齐(此处为共享类型源,
36
+ * engine-pdf 改为 re-export 本类型)。
37
+ */
38
+ export interface PdfInfo {
39
+ pages: number;
40
+ }
41
+ /**
42
+ * 视频基本信息(分辨率/时长/帧率/编解码)。
43
+ *
44
+ * 由 plugin-video/node 的 `video.read-info` MetadataReader 提供,
45
+ * 内部调用 engine-video/node 的 getVideoInfo(ffprobe 解析)。
46
+ * 与 engine-video 的 VideoInfo 接口对齐(此处为共享类型源,
47
+ * engine-video 改为 re-export 本类型)。
48
+ */
49
+ export interface VideoInfo {
50
+ width: number;
51
+ height: number;
52
+ duration: number;
53
+ fps: number;
54
+ codec: string;
55
+ }
56
+ //# sourceMappingURL=metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * 跨层共享的资产元数据查询类型。
3
+ *
4
+ * 与 ExifData 同一设计层级:某些 Plugin 能力本质是"元数据查询"而非
5
+ * "资产变换"(如 image dimensions 读取、pdf 页数读取),既不符合 Engine
6
+ * 层 Blob↔Blob 纯函数约束,也不符合 Capability Asset[]→Asset[] 契约。
7
+ * 这类能力通过 MetadataReader 注册,返回值类型定义在此处,
8
+ * 供 Runtime / SDK / 上层消费者(mcp-server 等)共享,避免跨层依赖。
9
+ *
10
+ * 与 AssetMetadata 的区别:
11
+ * - AssetMetadata:导入时一次性提取的通用元数据(size/mimeType/format/
12
+ * dimensions/duration/pages),所有 asset 都有
13
+ * - ImageMetadata / PdfInfo:按需查询的领域特定元数据,由 Plugin 通过
14
+ * MetadataReader 提供(如 image 经 sharp 解码读尺寸、pdf 经 pdf-lib
15
+ * 读页数),用于处理后输出资产的精确元数据报告
16
+ */
17
+ export {};
18
+ //# sourceMappingURL=metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG"}
package/dist/plugin.d.ts CHANGED
@@ -36,6 +36,34 @@ export interface PluginConfig {
36
36
  /** 权限声明 */
37
37
  permissions?: PluginPermission[];
38
38
  }
39
+ /**
40
+ * Plugin 权限沙箱契约(由 runtime 实现)。
41
+ *
42
+ * Plugin 通过 `ctx.sandbox` 访问自身权限声明,在调用受限 API 前主动断言:
43
+ * ctx.sandbox.assertNetworkAllowed('loading model manifest');
44
+ * 若声明 network:none,断言立即抛 PluginPermissionError;否则 no-op。
45
+ *
46
+ * 实现见 @lokvis/runtime 的 PluginPermissionSandbox 类。schema 仅定义契约
47
+ * (依赖反转:runtime 依赖 schema,而非反之)。
48
+ */
49
+ export interface PluginPermissionSandbox {
50
+ /** 插件名(便于错误信息定位) */
51
+ readonly pluginName: string;
52
+ /** 声明的权限集合(只读) */
53
+ readonly declared: ReadonlySet<PluginPermission>;
54
+ /** 是否声明了指定权限 */
55
+ has(perm: PluginPermission): boolean;
56
+ /**
57
+ * 断言网络调用允许(声明 network:none 时抛错)。
58
+ * Plugin 在调用 fetch / XHR 等前可主动调用。
59
+ */
60
+ assertNetworkAllowed(reason: string): void;
61
+ /**
62
+ * 断言文件系统访问允许(声明未含对应 filesystem:* 时抛错)。
63
+ * @param scope 'opfs'(OPFS 根目录)或 'local'(任意本地文件系统)
64
+ */
65
+ assertFilesystemAllowed(scope: 'opfs' | 'local', reason: string): void;
66
+ }
39
67
  /** Panel 定义(UI 扩展点) */
40
68
  export interface PanelDefinition {
41
69
  id: string;
@@ -53,7 +81,7 @@ export interface PanelDefinition {
53
81
  * 元数据读取函数(依赖反转)。
54
82
  *
55
83
  * 某些 Plugin 能力本质是"元数据查询"而非"资产变换"(如 EXIF 读取:
56
- * Blob → ExifData),既不符合 Engine 层 Blob↔Blob 约束,也不符合
84
+ * Blob → ExifData),既不符合 Engine 层 Blob↔Blob 纯函数约束,也不符合
57
85
  * CapabilityImplementation 的 Asset[]→Asset[] 契约。这类能力通过
58
86
  * MetadataReader 注册:Plugin 提供读取函数,Runtime 持有引用并按名调用。
59
87
  *
@@ -67,9 +95,28 @@ export interface PanelDefinition {
67
95
  * - 类型直接透传(ExifData),无需序列化
68
96
  *
69
97
  * @param asset 输入资产
98
+ * @param ctx 读取上下文(提供 log 可观测信号;TD-3.4 长期方案)
70
99
  * @returns 读取结果;无数据 / 解析失败返回 null
71
100
  */
72
- export type MetadataReader<T = unknown> = (asset: import('./asset.js').Asset) => Promise<T | null>;
101
+ export type MetadataReader<T = unknown> = (asset: import('./asset.js').Asset, ctx: MetadataReaderContext) => Promise<T | null>;
102
+ /**
103
+ * 元数据读取上下文(TD-3.4 长期方案)。
104
+ *
105
+ * 为 MetadataReader 提供可观测信号,使其能区分"无数据"(返回 null)
106
+ * 与"解析异常"(log warn 后返回 null),避免静默吞错。
107
+ *
108
+ * 与 ExecutionContext 的关系:
109
+ * - ExecutionContext 用于 Capability execute,含 workflowId / nodeId /
110
+ * signal / onProgress(走 WorkflowExecutor)
111
+ * - MetadataReaderContext 用于 MetadataReader,只含 log(走 Runtime
112
+ * 直接调用,无 workflow 上下文)
113
+ *
114
+ * log 签名与 ExecutionContext.log 一致,便于 Plugin 复用日志逻辑。
115
+ */
116
+ export interface MetadataReaderContext {
117
+ /** 日志函数(与 ExecutionContext.log 一致签名) */
118
+ log: (level: 'info' | 'warn' | 'error', message: string) => void;
119
+ }
73
120
  /**
74
121
  * Plugin 上下文(Plugin 能访问的全部 API)
75
122
  *
@@ -111,6 +158,18 @@ export interface PluginContext {
111
158
  registerMetadataReader<T>(name: string, reader: MetadataReader<T>): void;
112
159
  /** 注册 UI Panel */
113
160
  registerPanel(panel: PanelDefinition): void;
161
+ /**
162
+ * 权限沙箱(W18.6)。
163
+ *
164
+ * Plugin 据此在调用受限 API 前主动断言:
165
+ * ctx.sandbox.assertNetworkAllowed('loading manifest');
166
+ *
167
+ * Runtime 在 installPlugin() 期间应用 network guard
168
+ * (monkey-patch fetch/XHR/WebSocket/EventSource),声明
169
+ * network:none 时这些 API 调用立即抛 NetworkGuardError。
170
+ * capability execute() 路径不自动应用守卫 —— plugin 应主动自检。
171
+ */
172
+ readonly sandbox: PluginPermissionSandbox;
114
173
  /** 日志 */
115
174
  log(level: 'info' | 'warn' | 'error', message: string): void;
116
175
  }
@@ -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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"}
@@ -7,6 +7,14 @@
7
7
  import type { AssetType } from './asset.js';
8
8
  /** Workflow 节点类型 */
9
9
  export type NodeType = 'load' | 'transform' | 'export';
10
+ /**
11
+ * 工作流最大节点数(M1 MVP 约束)。
12
+ *
13
+ * 定义在 schema 层(与 validateWorkflow 的 maxSteps option 同源),
14
+ * 供 @lokvis/workflow(WorkflowBuilder)与 @lokvis/runtime(WorkflowCoordinator)
15
+ * 共同消费,避免常量跨包分裂。
16
+ */
17
+ export declare const MAX_WORKFLOW_STEPS = 5;
10
18
  /** Workflow 节点定义 */
11
19
  export interface WorkflowNode {
12
20
  /** 节点唯一 ID */
@@ -1 +1 @@
1
- {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../src/workflow.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../src/workflow.ts"],"names":[],"mappings":"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"}
package/dist/workflow.js CHANGED
@@ -4,6 +4,14 @@
4
4
  * 第一年只支持 Linear Workflow(线性工作流)。
5
5
  * 不支持:Branch / Loop / Condition / Parallel。
6
6
  */
7
+ /**
8
+ * 工作流最大节点数(M1 MVP 约束)。
9
+ *
10
+ * 定义在 schema 层(与 validateWorkflow 的 maxSteps option 同源),
11
+ * 供 @lokvis/workflow(WorkflowBuilder)与 @lokvis/runtime(WorkflowCoordinator)
12
+ * 共同消费,避免常量跨包分裂。
13
+ */
14
+ export const MAX_WORKFLOW_STEPS = 5;
7
15
  /**
8
16
  * 把 Workflow 转换为 AI 可理解的指令描述。
9
17
  *
@@ -42,23 +50,24 @@ export function workflowToAiInstruction(workflow) {
42
50
  /** 把 Workflow 的输入定义转为 JSON Schema(供 AI 理解输入约束) */
43
51
  function workflowInputsToJsonSchema(workflow) {
44
52
  const inputDef = workflow.inputs;
45
- const schema = {
46
- type: 'object',
47
- properties: {
48
- input_path: {
49
- type: 'string',
50
- description: `Path or asset ID of the input ${inputDef.type} file${inputDef.multiple ? '(s)' : ''}`,
51
- },
53
+ // properties 单独声明为 Record<string, unknown>,动态修改 input_path 时无需强转
54
+ const properties = {
55
+ input_path: {
56
+ type: 'string',
57
+ description: `Path or asset ID of the input ${inputDef.type} file${inputDef.multiple ? '(s)' : ''}`,
52
58
  },
53
- required: ['input_path'],
54
59
  };
55
60
  if (inputDef.multiple) {
56
- schema.properties.input_path = {
61
+ properties.input_path = {
57
62
  type: 'array',
58
63
  items: { type: 'string' },
59
64
  description: `List of input ${inputDef.type} file paths${inputDef.maxCount ? ` (max ${inputDef.maxCount})` : ''}`,
60
65
  };
61
66
  }
62
- return schema;
67
+ return {
68
+ type: 'object',
69
+ properties,
70
+ required: ['input_path'],
71
+ };
63
72
  }
64
73
  //# sourceMappingURL=workflow.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"workflow.js","sourceRoot":"","sources":["../src/workflow.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAwKH;;;;;;;;GAQG;AACH,MAAM,UAAU,uBAAuB,CAAC,QAAkB;IACxD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK;SACzB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;SAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,UAAU,gBAAgB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IAE/E,kCAAkC;IAClC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAClD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1B,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,sCAAsC;IACtC,8CAA8C;IAC9C,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;IAEtE,OAAO;QACL,WAAW,EACT,WAAW,QAAQ,CAAC,KAAK,CAAC,MAAM,mBAAmB,QAAQ,CAAC,IAAI,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;QAC3F,YAAY;QACZ,WAAW,EAAE,0BAA0B,CAAC,QAAQ,CAAC;QACjD,OAAO,EAAE;YACP,KAAK,EAAE,EAAE,UAAU,EAAE,kBAAkB,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE;YAC/D,cAAc,EAAE,aAAa,QAAQ,CAAC,MAAM,CAAC,IAAI,aAAa,YAAY,EAAE;SAC7E;KACF,CAAC;AACJ,CAAC;AAED,kDAAkD;AAClD,SAAS,0BAA0B,CAAC,QAAkB;IACpD,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC;IACjC,MAAM,MAAM,GAA4B;QACtC,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,iCAAiC,QAAQ,CAAC,IAAI,QAAQ,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;aACpG;SACF;QACD,QAAQ,EAAE,CAAC,YAAY,CAAC;KACzB,CAAC;IACF,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,CAAC,UAAsC,CAAC,UAAU,GAAG;YAC1D,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACzB,WAAW,EAAE,iBAAiB,QAAQ,CAAC,IAAI,cAAc,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;SAClH,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"workflow.js","sourceRoot":"","sources":["../src/workflow.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAmKpC;;;;;;;;GAQG;AACH,MAAM,UAAU,uBAAuB,CAAC,QAAkB;IACxD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK;SACzB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;SAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,UAAU,gBAAgB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IAE/E,kCAAkC;IAClC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAClD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1B,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,sCAAsC;IACtC,8CAA8C;IAC9C,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;IAEtE,OAAO;QACL,WAAW,EACT,WAAW,QAAQ,CAAC,KAAK,CAAC,MAAM,mBAAmB,QAAQ,CAAC,IAAI,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;QAC3F,YAAY;QACZ,WAAW,EAAE,0BAA0B,CAAC,QAAQ,CAAC;QACjD,OAAO,EAAE;YACP,KAAK,EAAE,EAAE,UAAU,EAAE,kBAAkB,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE;YAC/D,cAAc,EAAE,aAAa,QAAQ,CAAC,MAAM,CAAC,IAAI,aAAa,YAAY,EAAE;SAC7E;KACF,CAAC;AACJ,CAAC;AAED,kDAAkD;AAClD,SAAS,0BAA0B,CAAC,QAAkB;IACpD,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC;IACjC,iEAAiE;IACjE,MAAM,UAAU,GAA4B;QAC1C,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,iCAAiC,QAAQ,CAAC,IAAI,QAAQ,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;SACpG;KACF,CAAC;IACF,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACtB,UAAU,CAAC,UAAU,GAAG;YACtB,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACzB,WAAW,EAAE,iBAAiB,QAAQ,CAAC,IAAI,cAAc,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;SAClH,CAAC;IACJ,CAAC;IACD,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,UAAU;QACV,QAAQ,EAAE,CAAC,YAAY,CAAC;KACzB,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lokvis/schema",
3
- "version": "0.4.0",
3
+ "version": "0.4.1",
4
4
  "description": "Lokvis Schema - Workflow / Asset / Plugin type definitions and validators",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * AUTO-GENERATED BY scripts/codegen-capabilities.ts — DO NOT EDIT.
3
3
  *
4
- * 来源:packages/capability/manifests/ai.manifest.json, packages/capability/manifests/audio.manifest.json, packages/capability/manifests/image.manifest.json, packages/capability/manifests/pdf.manifest.json, packages/capability/manifests/video.manifest.json
4
+ * 来源:packages/capability/manifests/ai.manifest.json, packages/capability/manifests/audio.manifest.json, packages/capability/manifests/developer.manifest.json, packages/capability/manifests/image.manifest.json, packages/capability/manifests/pdf.manifest.json, packages/capability/manifests/video.manifest.json
5
5
  * 重跑:pnpm codegen
6
6
  *
7
7
  * 此文件提供精确字面量联合类型 BuiltinCapabilityName,
@@ -19,11 +19,15 @@ export type BuiltinCapabilityName =
19
19
  | 'ai.background-remove'
20
20
  | 'ai.generate-workflow'
21
21
  | 'ai.optimize-workflow'
22
+ | 'ai.diagnose-error'
22
23
  | 'audio.trim'
23
24
  | 'audio.normalize'
24
25
  | 'audio.merge'
25
26
  | 'audio.transcode'
26
- | 'audio.denoise'
27
+ | 'developer.inspect.capabilities'
28
+ | 'developer.inspect.asset'
29
+ | 'developer.validate.workflow'
30
+ | 'developer.profile'
27
31
  | 'image.resize'
28
32
  | 'image.compress'
29
33
  | 'image.convert'
@@ -40,7 +44,6 @@ export type BuiltinCapabilityName =
40
44
  | 'pdf.watermark'
41
45
  | 'pdf.ocr'
42
46
  | 'pdf.sign'
43
- | 'pdf.add-page-numbers'
44
47
  | 'video.compress'
45
48
  | 'video.transcode'
46
49
  | 'video.trim'
@@ -56,11 +59,15 @@ export const BUILTIN_CAPABILITY_NAMES: readonly BuiltinCapabilityName[] = [
56
59
  'ai.background-remove',
57
60
  'ai.generate-workflow',
58
61
  'ai.optimize-workflow',
62
+ 'ai.diagnose-error',
59
63
  'audio.trim',
60
64
  'audio.normalize',
61
65
  'audio.merge',
62
66
  'audio.transcode',
63
- 'audio.denoise',
67
+ 'developer.inspect.capabilities',
68
+ 'developer.inspect.asset',
69
+ 'developer.validate.workflow',
70
+ 'developer.profile',
64
71
  'image.resize',
65
72
  'image.compress',
66
73
  'image.convert',
@@ -77,7 +84,6 @@ export const BUILTIN_CAPABILITY_NAMES: readonly BuiltinCapabilityName[] = [
77
84
  'pdf.watermark',
78
85
  'pdf.ocr',
79
86
  'pdf.sign',
80
- 'pdf.add-page-numbers',
81
87
  'video.compress',
82
88
  'video.transcode',
83
89
  'video.trim',
package/src/index.ts CHANGED
@@ -12,6 +12,8 @@ export * from './workflow.js';
12
12
  export * from './event.js';
13
13
  export * from './plugin.js';
14
14
  export * from './exif.js';
15
+ // 跨层共享的资产元数据查询类型(ImageMetadata / PdfInfo,见 metadata.ts)
16
+ export * from './metadata.js';
15
17
  // MCP manifest 类型(见 docs/AI生态冲击调整方案.md §6.1)
16
18
  export * from './mcp.js';
17
19
 
@@ -0,0 +1,58 @@
1
+ /**
2
+ * 跨层共享的资产元数据查询类型。
3
+ *
4
+ * 与 ExifData 同一设计层级:某些 Plugin 能力本质是"元数据查询"而非
5
+ * "资产变换"(如 image dimensions 读取、pdf 页数读取),既不符合 Engine
6
+ * 层 Blob↔Blob 纯函数约束,也不符合 Capability Asset[]→Asset[] 契约。
7
+ * 这类能力通过 MetadataReader 注册,返回值类型定义在此处,
8
+ * 供 Runtime / SDK / 上层消费者(mcp-server 等)共享,避免跨层依赖。
9
+ *
10
+ * 与 AssetMetadata 的区别:
11
+ * - AssetMetadata:导入时一次性提取的通用元数据(size/mimeType/format/
12
+ * dimensions/duration/pages),所有 asset 都有
13
+ * - ImageMetadata / PdfInfo:按需查询的领域特定元数据,由 Plugin 通过
14
+ * MetadataReader 提供(如 image 经 sharp 解码读尺寸、pdf 经 pdf-lib
15
+ * 读页数),用于处理后输出资产的精确元数据报告
16
+ */
17
+
18
+ /**
19
+ * 图像元数据(width/height/format)。
20
+ *
21
+ * 由 plugin-image 的 `image.read-metadata` MetadataReader 提供,
22
+ * 内部调用 engine-image/node 的 getMetadata(sharp .metadata())。
23
+ * 与 engine-image/node 的 ImageMetadata 接口对齐(此处为共享类型源,
24
+ * engine-image 改为 re-export 本类型)。
25
+ */
26
+ export interface ImageMetadata {
27
+ width: number;
28
+ height: number;
29
+ format: string;
30
+ }
31
+
32
+ /**
33
+ * PDF 基本信息(页数)。
34
+ *
35
+ * 由 plugin-pdf 的 `pdf.read-info` MetadataReader 提供,
36
+ * 内部调用 engine-pdf 的 getPdfInfo(pdf-lib getPageCount)。
37
+ * 与 engine-pdf 的 PdfInfo 接口对齐(此处为共享类型源,
38
+ * engine-pdf 改为 re-export 本类型)。
39
+ */
40
+ export interface PdfInfo {
41
+ pages: number;
42
+ }
43
+
44
+ /**
45
+ * 视频基本信息(分辨率/时长/帧率/编解码)。
46
+ *
47
+ * 由 plugin-video/node 的 `video.read-info` MetadataReader 提供,
48
+ * 内部调用 engine-video/node 的 getVideoInfo(ffprobe 解析)。
49
+ * 与 engine-video 的 VideoInfo 接口对齐(此处为共享类型源,
50
+ * engine-video 改为 re-export 本类型)。
51
+ */
52
+ export interface VideoInfo {
53
+ width: number;
54
+ height: number;
55
+ duration: number;
56
+ fps: number;
57
+ codec: string;
58
+ }
package/src/plugin.ts CHANGED
@@ -48,6 +48,35 @@ export interface PluginConfig {
48
48
  permissions?: PluginPermission[];
49
49
  }
50
50
 
51
+ /**
52
+ * Plugin 权限沙箱契约(由 runtime 实现)。
53
+ *
54
+ * Plugin 通过 `ctx.sandbox` 访问自身权限声明,在调用受限 API 前主动断言:
55
+ * ctx.sandbox.assertNetworkAllowed('loading model manifest');
56
+ * 若声明 network:none,断言立即抛 PluginPermissionError;否则 no-op。
57
+ *
58
+ * 实现见 @lokvis/runtime 的 PluginPermissionSandbox 类。schema 仅定义契约
59
+ * (依赖反转:runtime 依赖 schema,而非反之)。
60
+ */
61
+ export interface PluginPermissionSandbox {
62
+ /** 插件名(便于错误信息定位) */
63
+ readonly pluginName: string;
64
+ /** 声明的权限集合(只读) */
65
+ readonly declared: ReadonlySet<PluginPermission>;
66
+ /** 是否声明了指定权限 */
67
+ has(perm: PluginPermission): boolean;
68
+ /**
69
+ * 断言网络调用允许(声明 network:none 时抛错)。
70
+ * Plugin 在调用 fetch / XHR 等前可主动调用。
71
+ */
72
+ assertNetworkAllowed(reason: string): void;
73
+ /**
74
+ * 断言文件系统访问允许(声明未含对应 filesystem:* 时抛错)。
75
+ * @param scope 'opfs'(OPFS 根目录)或 'local'(任意本地文件系统)
76
+ */
77
+ assertFilesystemAllowed(scope: 'opfs' | 'local', reason: string): void;
78
+ }
79
+
51
80
  /** Panel 定义(UI 扩展点) */
52
81
  export interface PanelDefinition {
53
82
  id: string;
@@ -64,7 +93,7 @@ export interface PanelDefinition {
64
93
  * 元数据读取函数(依赖反转)。
65
94
  *
66
95
  * 某些 Plugin 能力本质是"元数据查询"而非"资产变换"(如 EXIF 读取:
67
- * Blob → ExifData),既不符合 Engine 层 Blob↔Blob 约束,也不符合
96
+ * Blob → ExifData),既不符合 Engine 层 Blob↔Blob 纯函数约束,也不符合
68
97
  * CapabilityImplementation 的 Asset[]→Asset[] 契约。这类能力通过
69
98
  * MetadataReader 注册:Plugin 提供读取函数,Runtime 持有引用并按名调用。
70
99
  *
@@ -78,12 +107,33 @@ export interface PanelDefinition {
78
107
  * - 类型直接透传(ExifData),无需序列化
79
108
  *
80
109
  * @param asset 输入资产
110
+ * @param ctx 读取上下文(提供 log 可观测信号;TD-3.4 长期方案)
81
111
  * @returns 读取结果;无数据 / 解析失败返回 null
82
112
  */
83
113
  export type MetadataReader<T = unknown> = (
84
- asset: import('./asset.js').Asset
114
+ asset: import('./asset.js').Asset,
115
+ ctx: MetadataReaderContext
85
116
  ) => Promise<T | null>;
86
117
 
118
+ /**
119
+ * 元数据读取上下文(TD-3.4 长期方案)。
120
+ *
121
+ * 为 MetadataReader 提供可观测信号,使其能区分"无数据"(返回 null)
122
+ * 与"解析异常"(log warn 后返回 null),避免静默吞错。
123
+ *
124
+ * 与 ExecutionContext 的关系:
125
+ * - ExecutionContext 用于 Capability execute,含 workflowId / nodeId /
126
+ * signal / onProgress(走 WorkflowExecutor)
127
+ * - MetadataReaderContext 用于 MetadataReader,只含 log(走 Runtime
128
+ * 直接调用,无 workflow 上下文)
129
+ *
130
+ * log 签名与 ExecutionContext.log 一致,便于 Plugin 复用日志逻辑。
131
+ */
132
+ export interface MetadataReaderContext {
133
+ /** 日志函数(与 ExecutionContext.log 一致签名) */
134
+ log: (level: 'info' | 'warn' | 'error', message: string) => void;
135
+ }
136
+
87
137
  /**
88
138
  * Plugin 上下文(Plugin 能访问的全部 API)
89
139
  *
@@ -129,6 +179,18 @@ export interface PluginContext {
129
179
  registerMetadataReader<T>(name: string, reader: MetadataReader<T>): void;
130
180
  /** 注册 UI Panel */
131
181
  registerPanel(panel: PanelDefinition): void;
182
+ /**
183
+ * 权限沙箱(W18.6)。
184
+ *
185
+ * Plugin 据此在调用受限 API 前主动断言:
186
+ * ctx.sandbox.assertNetworkAllowed('loading manifest');
187
+ *
188
+ * Runtime 在 installPlugin() 期间应用 network guard
189
+ * (monkey-patch fetch/XHR/WebSocket/EventSource),声明
190
+ * network:none 时这些 API 调用立即抛 NetworkGuardError。
191
+ * capability execute() 路径不自动应用守卫 —— plugin 应主动自检。
192
+ */
193
+ readonly sandbox: PluginPermissionSandbox;
132
194
  /** 日志 */
133
195
  log(level: 'info' | 'warn' | 'error', message: string): void;
134
196
  }
package/src/workflow.ts CHANGED
@@ -10,6 +10,15 @@ import type { AssetType } from './asset.js';
10
10
  /** Workflow 节点类型 */
11
11
  export type NodeType = 'load' | 'transform' | 'export';
12
12
 
13
+ /**
14
+ * 工作流最大节点数(M1 MVP 约束)。
15
+ *
16
+ * 定义在 schema 层(与 validateWorkflow 的 maxSteps option 同源),
17
+ * 供 @lokvis/workflow(WorkflowBuilder)与 @lokvis/runtime(WorkflowCoordinator)
18
+ * 共同消费,避免常量跨包分裂。
19
+ */
20
+ export const MAX_WORKFLOW_STEPS = 5;
21
+
13
22
  /** Workflow 节点定义 */
14
23
  export interface WorkflowNode {
15
24
  /** 节点唯一 ID */
@@ -214,22 +223,23 @@ export function workflowToAiInstruction(workflow: Workflow): WorkflowAiInstructi
214
223
  /** 把 Workflow 的输入定义转为 JSON Schema(供 AI 理解输入约束) */
215
224
  function workflowInputsToJsonSchema(workflow: Workflow): object {
216
225
  const inputDef = workflow.inputs;
217
- const schema: Record<string, unknown> = {
218
- type: 'object',
219
- properties: {
220
- input_path: {
221
- type: 'string',
222
- description: `Path or asset ID of the input ${inputDef.type} file${inputDef.multiple ? '(s)' : ''}`,
223
- },
226
+ // properties 单独声明为 Record<string, unknown>,动态修改 input_path 时无需强转
227
+ const properties: Record<string, unknown> = {
228
+ input_path: {
229
+ type: 'string',
230
+ description: `Path or asset ID of the input ${inputDef.type} file${inputDef.multiple ? '(s)' : ''}`,
224
231
  },
225
- required: ['input_path'],
226
232
  };
227
233
  if (inputDef.multiple) {
228
- (schema.properties as Record<string, unknown>).input_path = {
234
+ properties.input_path = {
229
235
  type: 'array',
230
236
  items: { type: 'string' },
231
237
  description: `List of input ${inputDef.type} file paths${inputDef.maxCount ? ` (max ${inputDef.maxCount})` : ''}`,
232
238
  };
233
239
  }
234
- return schema;
240
+ return {
241
+ type: 'object',
242
+ properties,
243
+ required: ['input_path'],
244
+ };
235
245
  }