dsh-auto-flow 0.1.4 → 0.1.5

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/lib/client.js CHANGED
@@ -7244,15 +7244,15 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7244
7244
  document.head.appendChild(tag);
7245
7245
  }
7246
7246
  var WorkflowOverlay_module_css_default = {
7247
- "bar": "_3sfATW_bar",
7248
- "stage": "_3sfATW_stage",
7249
7247
  "frame": "_3sfATW_frame",
7248
+ "notice": "_3sfATW_notice",
7250
7249
  "noticeActions": "_3sfATW_noticeActions",
7250
+ "bar": "_3sfATW_bar",
7251
7251
  "dialog": "_3sfATW_dialog",
7252
7252
  "layer": "_3sfATW_layer",
7253
- "noticeReason": "_3sfATW_noticeReason",
7254
- "notice": "_3sfATW_notice",
7255
- "noticeText": "_3sfATW_noticeText"
7253
+ "stage": "_3sfATW_stage",
7254
+ "noticeText": "_3sfATW_noticeText",
7255
+ "noticeReason": "_3sfATW_noticeReason"
7256
7256
  };
7257
7257
  //#endregion
7258
7258
  //#region src/client/features/workflow-overlay/WorkflowOverlay.tsx
@@ -0,0 +1,226 @@
1
+ import { z } from "zod";
2
+ //#region ../../shared/script-contract/src/types.ts
3
+ const JsonValueSchema = z.lazy(() => z.union([
4
+ z.string(),
5
+ z.number(),
6
+ z.boolean(),
7
+ z.null(),
8
+ z.array(JsonValueSchema),
9
+ z.record(z.string(), JsonValueSchema)
10
+ ]));
11
+ z.record(z.string(), JsonValueSchema);
12
+ /** 下拉选项(label = 展示,value = 传给脚本的值)。 */
13
+ const ScriptSelectOptionSchema = z.object({
14
+ label: z.string(),
15
+ value: JsonValueSchema
16
+ });
17
+ /** 显隐条件:判据键取到该值时才显示本字段。 */
18
+ /**
19
+ * 字段条件的运算符白名单(**真源在这里**,`workflow` 的 `FieldCondition` 直接用它)。
20
+ *
21
+ * 【为什么放在最底层】`workflow` 依赖 `script-contract`(产物规则的真源在这里),
22
+ * 所以共用词汇只能由下层定义、上层复用 —— 反向依赖会造出一个环。
23
+ * 与条件节点的 `CONDITION_OPERATORS` 同一套思路:宁可少几种写法,也不要一个能执行任意代码的入口。
24
+ */
25
+ const SCRIPT_FIELD_CONDITION_OPERATORS = [
26
+ "eq",
27
+ "not",
28
+ "gte",
29
+ "lte",
30
+ "gt",
31
+ "lt",
32
+ "startsWith",
33
+ "endsWith",
34
+ "includes",
35
+ "regex",
36
+ "exists"
37
+ ];
38
+ const ScriptParamVisibilitySchema = z.lazy(() => z.object({
39
+ key: z.string(),
40
+ op: z.enum(SCRIPT_FIELD_CONDITION_OPERATORS).optional(),
41
+ value: JsonValueSchema.optional(),
42
+ values: z.array(JsonValueSchema).optional()
43
+ }));
44
+ const ScriptParamVariantSchema = z.lazy(() => z.object({
45
+ when: z.string(),
46
+ value: JsonValueSchema,
47
+ children: z.array(ScriptParamFieldSchema)
48
+ }));
49
+ const ScriptParamFieldSchema = z.lazy(() => z.object({
50
+ key: z.string(),
51
+ label: z.string(),
52
+ type: z.enum([
53
+ "string",
54
+ "number",
55
+ "boolean",
56
+ "select",
57
+ "datetime",
58
+ "array",
59
+ "object",
60
+ "file"
61
+ ]),
62
+ required: z.boolean().optional(),
63
+ defaultValue: JsonValueSchema.optional(),
64
+ options: z.array(ScriptSelectOptionSchema).optional(),
65
+ multiple: z.boolean().optional(),
66
+ format: z.string().optional(),
67
+ placeholder: z.string().optional(),
68
+ description: z.string().optional(),
69
+ children: z.array(ScriptParamFieldSchema),
70
+ variants: z.array(ScriptParamVariantSchema).optional(),
71
+ discriminantOptions: z.array(ScriptSelectOptionSchema).optional(),
72
+ discriminantKey: z.object({
73
+ key: z.string(),
74
+ label: z.string()
75
+ }).optional(),
76
+ visibleWhen: ScriptParamVisibilitySchema.optional()
77
+ }));
78
+ /**
79
+ * 产物装配规则:告诉工作流引擎「本脚本产出的文件路径放在返回数据的哪个键上」。
80
+ *
81
+ * 为什么需要它:工作流下游脚本节点的 payload 由「上游表单值 + 上游脚本返回值 + 上游产物文件」
82
+ * 三路合并而成(auto-flow 的 src/workflow/payload.ts),而产物文件注入哪个键由**下游脚本**声明。
83
+ * 不声明则工作流拿不到文件,只会拿到路径字符串。
84
+ */
85
+ const ScriptArtifactSpecSchema = z.object({
86
+ /** 返回数据里存放文件路径列表的键名。 */
87
+ filesKey: z.string().optional(),
88
+ /** 路径的形状(缺省按普通路径列表处理;prompt-pairs 表示每份产物配一组提示词)。 */
89
+ filesShape: z.enum(["paths", "prompt-pairs"]).optional(),
90
+ /** 与图片一一对应的提示词所在键(仅图片类产物用)。 */
91
+ filesPromptKey: z.string().optional()
92
+ });
93
+ z.object({
94
+ /** 库内脚本名(稳定路由键,如 `dxf/analyze`);对外身份是 `<来源 id>/<本名>`。 */
95
+ name: z.string(),
96
+ /** 展示名。 */
97
+ label: z.string(),
98
+ /** 用途说明(供 listScripts / 模型工具展示)。 */
99
+ description: z.string(),
100
+ /** 参数清单(JSON 安全,供工作流 UI 渲染表单)。 */
101
+ params: z.array(ScriptParamFieldSchema),
102
+ /** 产物装配规则(缺省不消费上游文件)。 */
103
+ artifacts: ScriptArtifactSpecSchema.optional()
104
+ });
105
+ const ScriptErrorSchema = z.object({
106
+ /** 稳定错误码(机器可路由)。 */
107
+ code: z.string(),
108
+ /** 给人看的说明。 */
109
+ message: z.string()
110
+ });
111
+ const ScriptRunMetaSchema = z.object({
112
+ startedAt: z.number(),
113
+ finishedAt: z.number(),
114
+ durationMs: z.number()
115
+ });
116
+ z.discriminatedUnion("ok", [z.object({
117
+ ok: z.literal(true),
118
+ script: z.string(),
119
+ data: JsonValueSchema,
120
+ meta: ScriptRunMetaSchema
121
+ }), z.object({
122
+ ok: z.literal(false),
123
+ script: z.string(),
124
+ error: ScriptErrorSchema,
125
+ meta: ScriptRunMetaSchema
126
+ })]);
127
+ /**
128
+ * 浏览器品牌通道。
129
+ *
130
+ * 【为什么在契约包里而不是某个脚本库】它是 `ScriptRunOptions.browser.channel` 的取值域,
131
+ * 属于运行选项契约的一部分。原先两个脚本库各存一份同名 schema,其中一方多了 `browser`——
132
+ * **同名不同形**,而契约正是为了让工作流引擎不必对脚本库分分支而存在的。
133
+ * 现在取并集:不跑浏览器的脚本库接受并忽略 `browser`,跑浏览器的脚本库照旧使用它。
134
+ *
135
+ * 为什么没有「留空 = 用自带 Chromium」这个状态:自带 Chromium 要额外下载数百 MB,
136
+ * 且与系统浏览器的反检测环境不同;留空会让「没配置」和「显式要求不要品牌通道」两种意图
137
+ * 混在一起,最终静默走到自带浏览器上。需要扩展时在这里加一项,各脚本库的 config 校验与
138
+ * 工作流节点的类型同步生效。
139
+ */
140
+ const BROWSER_CHANNELS = ["msedge", "chrome"];
141
+ /**
142
+ * 判定一个值是不是合法的浏览器品牌通道。
143
+ *
144
+ * 【为什么需要它】`channel` 的来源之一是**用户手写的画布节点数据**(`inline.browser`),
145
+ * 那边取到的只是 `string` —— 信任边界。按本仓库的政策「校验只做在信任边界上,且只做一次」,
146
+ * 校验就在这里做一次;不识别的取值应被**丢弃**,而不是透传给脚本库。
147
+ *
148
+ * @param value - 任意值(通常是节点数据里的 `browser` 字段)。
149
+ * @returns 是取值域内的通道时为 `true`,调用方据此收窄成 {@link BrowserChannel}。
150
+ */
151
+ function isBrowserChannel(value) {
152
+ return typeof value === "string" && BROWSER_CHANNELS.includes(value);
153
+ }
154
+ z.object({
155
+ /** 本次运行的产物根目录(工作流引擎传入;缺省由插件配置兜底)。 */
156
+ baseDir: z.string().optional(),
157
+ /** 本次运行的子目录名(工作流引擎传入 `<序号>-<脚本名>`)。 */
158
+ runId: z.string().optional(),
159
+ /** 浏览器选项;只有驱动浏览器的脚本库会读它,其余脚本库接受并忽略。 */
160
+ browser: z.object({
161
+ headless: z.boolean().optional(),
162
+ channel: z.enum(BROWSER_CHANNELS).optional()
163
+ }).optional(),
164
+ /** 本次运行的硬超时(毫秒;非正数表示不限)。 */
165
+ timeoutMs: z.number().optional()
166
+ });
167
+ //#endregion
168
+ //#region ../../shared/workflow/src/types.ts
169
+ /**
170
+ * 脚本「上游产物文件 → payload」装配规则:真源在共享包 `script-contract`,这里转出。
171
+ * 原先本文件手写了一份同形 interface,与共享契约逐字段相同——纯重复,已消除。
172
+ * 既 import 又 export:本文件下面有接口把它当字段类型用,`export type { X } from` 不会把 X 带进本地作用域。
173
+ */
174
+ /**
175
+ * 重试路径上的**跳过策略**。
176
+ *
177
+ * - `rerun-all`(**默认**):不跳过,该做的都做 —— 与正常执行等价(只是保留同一次运行的身份);
178
+ * - `skip-succeeded`:只补做台账里 `status !== 'ok'` 的 key。
179
+ *
180
+ * 【为什么默认不跳过】默认跳过会让「我改了提示词想重跑」变成一个**用户想不通的静默行为**;
181
+ * 跳过是重试路径上用户显式要的东西,不该成为整个体系的默认。**这是我的判断**,
182
+ * 不是从别处抄的;若认为默认应当跳过,改这一个常量即可,不影响其它设计。
183
+ */
184
+ const RESUME_MODES = ["rerun-all", "skip-succeeded"];
185
+ /** 缺省的重试跳过策略(见 {@link ResumeMode} 的理由)。 */
186
+ const DEFAULT_RESUME_MODE = "rerun-all";
187
+ /**
188
+ * 当前工作流文档格式版本(显式版本化,便于未来演进与迁移)。
189
+ *
190
+ * v2 = item 流:节点有唯一 `name`、引用按名字;`RunStep` 装批的汇总与样本。
191
+ * 旧文档(v1)**响亮拒绝**,不写迁移(项目无历史债务)。
192
+ */
193
+ const WORKFLOW_FORMAT_VERSION = 2;
194
+ /**
195
+ * 节点的一条**运行前必填项**:该字段取到空白就报诊断(运行前 fail-fast)。
196
+ *
197
+ * 取代原先按节点类型写死的 `if / else if` 链 —— 那段链每加一种节点就要改一次校验文件。
198
+ */
199
+ /**
200
+ * 字段条件的运算符白名单:**真源在 `script-contract`**(下层),这里复用。
201
+ *
202
+ * 【为什么不各写一份】`workflow` 依赖 `script-contract`(产物规则的真源在下层),共享词汇
203
+ * 只能由下层定义。各写一份字面量联合虽然结构上相等,但两处漂移时只有运行期的
204
+ * `typert-gen` 结构比对会发现 —— 复用同一个常量就没有这个缝。
205
+ */
206
+ const FIELD_CONDITION_OPERATORS = SCRIPT_FIELD_CONDITION_OPERATORS;
207
+ /** 运行终止事件。 */
208
+ /**
209
+ * 运行**终态**集合:`run-end` 的 `stopReason` 只能取自这里。
210
+ *
211
+ * 【为什么单独成一个常量而不是把字面量写进接口】`RunState['status']` 是 6 值联合
212
+ * (多出 `running` / `waiting` / `crashed`),而一次运行**结束时**只可能是这三者之一:
213
+ * 引擎的三个出口分别置 `completed` / `failed` / `cancelled`;`waiting` 期间
214
+ * `runInner` 根本不返回(审批等待是 `await`),`crashed` 由宿主扫尾赋值、不经 `run()`。
215
+ * 把这三值提成常量,是为了让**发射点**能显式取它 —— 先前那里直接写 `stopReason: state.status`,
216
+ * 类型上把 6 值塞进 3 值(`emit` 通道是 `unknown`,编译器不拦),类型与事实脱节。
217
+ */
218
+ const RUN_TERMINAL_STATUSES = [
219
+ "completed",
220
+ "failed",
221
+ "cancelled"
222
+ ];
223
+ //#endregion
224
+ export { WORKFLOW_FORMAT_VERSION as a, RUN_TERMINAL_STATUSES as i, FIELD_CONDITION_OPERATORS as n, isBrowserChannel as o, RESUME_MODES as r, DEFAULT_RESUME_MODE as t };
225
+
226
+ //# sourceMappingURL=types-DFA-SFER.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-auto-flow",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "description": "可视化工作流编辑器与执行引擎:画布编排、脚本节点、人工审批、运行历史,让 dsh 按确定流程跑长任务。",
5
5
  "keywords": [
6
6
  "deepseek-harness",
@@ -9,17 +9,8 @@
9
9
  ],
10
10
  "license": "MIT",
11
11
  "files": [
12
- "lib/index.js",
13
- "lib/index.d.ts",
14
- "lib/types.js",
15
- "lib/types.d.ts",
16
- "lib/types-*.d.ts",
17
- "lib/client.js",
18
- "lib/client.*.js",
19
- "lib/typert.host.js",
20
- "lib/typert.host.d.ts",
21
- "lib/typert.remote-client.js",
22
- "lib/typert.remote-client.d.ts",
12
+ "lib/*.js",
13
+ "lib/*.d.ts",
23
14
  "units/*/dist/**",
24
15
  "units/*/host/**",
25
16
  "cordis.patch.yml",
@@ -98,11 +89,11 @@
98
89
  "typescript": "^6.0.3",
99
90
  "vitest": "^4.1.8",
100
91
  "app-unit": "0.1.0",
101
- "test-support": "0.1.0",
92
+ "script-contract": "0.1.0",
102
93
  "host-signal": "0.1.0",
103
- "workflow-engine": "0.1.0",
104
94
  "workflow": "0.1.0",
105
- "script-contract": "0.1.0"
95
+ "test-support": "0.1.0",
96
+ "workflow-engine": "0.1.0"
106
97
  },
107
98
  "peerDependencies": {
108
99
  "@deepseek-ai/cordis": "^4.0.4",