@xiaoso/dsh-workflow-lite 0.0.0-stage → 0.1.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 +24 -0
- package/README.en.md +84 -0
- package/README.md +83 -2
- package/THIRD_PARTY_NOTICES.md +762 -0
- package/assets/icon-full.webp +0 -0
- package/assets/icon.webp +0 -0
- package/assets/wordmark.png +0 -0
- package/cordis.patch.yml +3 -0
- package/lib/client.js +127442 -0
- package/lib/index.mjs +9613 -0
- package/lib/types/client/app/addStep.d.ts +25 -0
- package/lib/types/client/app/desktop.d.ts +52 -0
- package/lib/types/client/app/host.d.ts +29 -0
- package/lib/types/client/app/sessions.d.ts +117 -0
- package/lib/types/client/app/theme.d.ts +27 -0
- package/lib/types/client/app/usePluginConfig.d.ts +59 -0
- package/lib/types/client/app/useRunFile.d.ts +24 -0
- package/lib/types/client/app/useRunGraph.d.ts +51 -0
- package/lib/types/client/app/useRunHistory.d.ts +21 -0
- package/lib/types/client/app/useRuns.d.ts +84 -0
- package/lib/types/client/app/useVersions.d.ts +50 -0
- package/lib/types/client/app/useWorkflow.d.ts +67 -0
- package/lib/types/client/app/viewport.d.ts +14 -0
- package/lib/types/client/i18n.d.ts +930 -0
- package/lib/types/client/index.d.ts +18 -0
- package/lib/types/client/model/connect.d.ts +44 -0
- package/lib/types/client/model/editor.d.ts +252 -0
- package/lib/types/client/model/fileKind.d.ts +15 -0
- package/lib/types/client/model/hostPath.d.ts +15 -0
- package/lib/types/client/model/htmlPreview.d.ts +24 -0
- package/lib/types/client/model/hubRuns.d.ts +45 -0
- package/lib/types/client/model/layout.d.ts +83 -0
- package/lib/types/client/model/library.d.ts +109 -0
- package/lib/types/client/model/nudge.d.ts +43 -0
- package/lib/types/client/model/pathSample.d.ts +26 -0
- package/lib/types/client/model/route.d.ts +121 -0
- package/lib/types/client/model/runDraft.d.ts +68 -0
- package/lib/types/client/model/runGraph.d.ts +15 -0
- package/lib/types/client/model/runHistory.d.ts +40 -0
- package/lib/types/client/model/themes.d.ts +87 -0
- package/lib/types/client/model/time.d.ts +7 -0
- package/lib/types/client/rpc.d.ts +42 -0
- package/lib/types/client/ui/AppearancePicker.d.ts +23 -0
- package/lib/types/client/ui/Canvas.d.ts +76 -0
- package/lib/types/client/ui/Confirm.d.ts +42 -0
- package/lib/types/client/ui/DocViewer.d.ts +67 -0
- package/lib/types/client/ui/Dock.d.ts +13 -0
- package/lib/types/client/ui/FileTag.d.ts +9 -0
- package/lib/types/client/ui/FileViewer.d.ts +30 -0
- package/lib/types/client/ui/FlowStreaks.d.ts +40 -0
- package/lib/types/client/ui/Handoff.d.ts +30 -0
- package/lib/types/client/ui/HostPicker.d.ts +31 -0
- package/lib/types/client/ui/HubDialog.d.ts +38 -0
- package/lib/types/client/ui/HubRunRow.d.ts +22 -0
- package/lib/types/client/ui/HubRuns.d.ts +19 -0
- package/lib/types/client/ui/HubSettings.d.ts +20 -0
- package/lib/types/client/ui/HubStorage.d.ts +18 -0
- package/lib/types/client/ui/HubWorkflowList.d.ts +21 -0
- package/lib/types/client/ui/HubWorkflowRow.d.ts +33 -0
- package/lib/types/client/ui/HubWorkflows.d.ts +26 -0
- package/lib/types/client/ui/HubWorkspacePicker.d.ts +16 -0
- package/lib/types/client/ui/Icon.d.ts +83 -0
- package/lib/types/client/ui/InputPanel.d.ts +37 -0
- package/lib/types/client/ui/InputsDialog.d.ts +22 -0
- package/lib/types/client/ui/Inspector.d.ts +51 -0
- package/lib/types/client/ui/Issues.d.ts +15 -0
- package/lib/types/client/ui/Launch.d.ts +30 -0
- package/lib/types/client/ui/Library.d.ts +23 -0
- package/lib/types/client/ui/LinkRow.d.ts +31 -0
- package/lib/types/client/ui/Markdown.d.ts +21 -0
- package/lib/types/client/ui/NodeHeads.d.ts +47 -0
- package/lib/types/client/ui/NoteDrawer.d.ts +21 -0
- package/lib/types/client/ui/OpenWith.d.ts +21 -0
- package/lib/types/client/ui/Outputs.d.ts +61 -0
- package/lib/types/client/ui/PanelHead.d.ts +21 -0
- package/lib/types/client/ui/PlanDialog.d.ts +18 -0
- package/lib/types/client/ui/PreviewCard.d.ts +38 -0
- package/lib/types/client/ui/QuickAdd.d.ts +30 -0
- package/lib/types/client/ui/ResourceItemDialog.d.ts +33 -0
- package/lib/types/client/ui/ResourceItems.d.ts +30 -0
- package/lib/types/client/ui/ResourcePanel.d.ts +26 -0
- package/lib/types/client/ui/Resources.d.ts +43 -0
- package/lib/types/client/ui/RunDraftBar.d.ts +35 -0
- package/lib/types/client/ui/RunEdge.d.ts +29 -0
- package/lib/types/client/ui/RunFiles.d.ts +24 -0
- package/lib/types/client/ui/RunInput.d.ts +26 -0
- package/lib/types/client/ui/RunItemDialog.d.ts +43 -0
- package/lib/types/client/ui/RunModeSwitch.d.ts +14 -0
- package/lib/types/client/ui/RunNav.d.ts +22 -0
- package/lib/types/client/ui/RunNodeState.d.ts +42 -0
- package/lib/types/client/ui/RunOverview.d.ts +27 -0
- package/lib/types/client/ui/RunPosition.d.ts +24 -0
- package/lib/types/client/ui/RunResource.d.ts +40 -0
- package/lib/types/client/ui/RunStatusMenu.d.ts +28 -0
- package/lib/types/client/ui/RunStep.d.ts +45 -0
- package/lib/types/client/ui/RunTopBar.d.ts +42 -0
- package/lib/types/client/ui/RunView.d.ts +43 -0
- package/lib/types/client/ui/SettingsDialog.d.ts +25 -0
- package/lib/types/client/ui/SettingsFields.d.ts +37 -0
- package/lib/types/client/ui/SkillPicker.d.ts +25 -0
- package/lib/types/client/ui/SkillPreview.d.ts +27 -0
- package/lib/types/client/ui/StepMark.d.ts +16 -0
- package/lib/types/client/ui/StepPanel.d.ts +26 -0
- package/lib/types/client/ui/ThemePicker.d.ts +13 -0
- package/lib/types/client/ui/TipLayer.d.ts +17 -0
- package/lib/types/client/ui/TopBar.d.ts +32 -0
- package/lib/types/client/ui/VersionList.d.ts +19 -0
- package/lib/types/client/ui/VersionRow.d.ts +19 -0
- package/lib/types/client/ui/VersionsDialog.d.ts +18 -0
- package/lib/types/client/ui/WorkflowRow.d.ts +32 -0
- package/lib/types/client/ui/WorkflowSwitcher.d.ts +20 -0
- package/lib/types/client/ui/WorkflowView.d.ts +27 -0
- package/lib/types/client/ui/lines.d.ts +13 -0
- package/lib/types/client/ui/primitives.d.ts +119 -0
- package/lib/types/client/ui/resourceUi.d.ts +49 -0
- package/lib/types/client/ui/stepIcons.d.ts +10 -0
- package/lib/types/host/authoringSkill.d.ts +17 -0
- package/lib/types/host/config.d.ts +54 -0
- package/lib/types/host/hostFs.d.ts +69 -0
- package/lib/types/host/plan.d.ts +68 -0
- package/lib/types/host/pluginConfig.d.ts +57 -0
- package/lib/types/host/rpc.d.ts +45 -0
- package/lib/types/host/runs/files.d.ts +37 -0
- package/lib/types/host/runs/notice.d.ts +21 -0
- package/lib/types/host/runs/service.d.ts +258 -0
- package/lib/types/host/runs/skill.d.ts +16 -0
- package/lib/types/host/runs/storage.d.ts +16 -0
- package/lib/types/host/runs/store.d.ts +56 -0
- package/lib/types/host/skillView.d.ts +22 -0
- package/lib/types/host/store/atomic.d.ts +34 -0
- package/lib/types/host/store/materialize.d.ts +19 -0
- package/lib/types/host/store/merge.d.ts +25 -0
- package/lib/types/host/store/paths.d.ts +86 -0
- package/lib/types/host/store/repository.d.ts +217 -0
- package/lib/types/host/store/versions.d.ts +38 -0
- package/lib/types/host/tool/tool.d.ts +432 -0
- package/lib/types/index.d.ts +35 -0
- package/lib/types/shared/appearance.d.ts +49 -0
- package/lib/types/shared/compile.d.ts +71 -0
- package/lib/types/shared/graph.d.ts +54 -0
- package/lib/types/shared/graphDiff.d.ts +29 -0
- package/lib/types/shared/inputs.d.ts +46 -0
- package/lib/types/shared/limits.d.ts +77 -0
- package/lib/types/shared/model.d.ts +122 -0
- package/lib/types/shared/naming.d.ts +59 -0
- package/lib/types/shared/outputPaths.d.ts +49 -0
- package/lib/types/shared/resources.d.ts +98 -0
- package/lib/types/shared/runCursor.d.ts +54 -0
- package/lib/types/shared/runState.d.ts +221 -0
- package/lib/types/shared/runSync.d.ts +24 -0
- package/lib/types/shared/types.d.ts +488 -0
- package/lib/types/shared/validate.d.ts +54 -0
- package/lib/types/shared/wire.d.ts +600 -0
- package/locale/en.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +144 -4
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* dsh-workflow-lite — 两版图之间改了什么。
|
|
3
|
+
*
|
|
4
|
+
* 实例视图里改图时,底部的「已改 x 处」按它数;保存时插件按它写给模型的通知。
|
|
5
|
+
* 按对象比:步骤、资源、输入按 id;连线先按 id,对不上再按两端认(改条件会换 id)。
|
|
6
|
+
* 挪卡片合成一处「布局」:不进计划,也不用告诉模型。
|
|
7
|
+
*
|
|
8
|
+
* 纯函数,不碰磁盘。
|
|
9
|
+
*
|
|
10
|
+
* @module @xiaoso/dsh-workflow-lite/shared/graphDiff
|
|
11
|
+
*/
|
|
12
|
+
import type { WorkflowDocument } from './types.ts';
|
|
13
|
+
export type ChangeObject = 'step' | 'resource' | 'input' | 'edge' | 'layout';
|
|
14
|
+
export interface GraphChange {
|
|
15
|
+
object: ChangeObject;
|
|
16
|
+
kind: 'added' | 'removed' | 'changed';
|
|
17
|
+
/** 节点 id 或连线 id(删掉的是原来的 id,其余是现在的);布局是空串。 */
|
|
18
|
+
id: string;
|
|
19
|
+
/** 改了的连线原来的 id(改条件会换 id)。 */
|
|
20
|
+
was?: string;
|
|
21
|
+
/** 改了哪些字段(`changed` 才有);布局是挪动了的节点 id。 */
|
|
22
|
+
fields: string[];
|
|
23
|
+
}
|
|
24
|
+
/** 这处改动会不会让计划变样(要不要告诉模型)。 */
|
|
25
|
+
export declare function affectsPlan(change: GraphChange): boolean;
|
|
26
|
+
/** `base` → `next` 改了什么:节点按图里的顺序在前(删掉的排在最前),连线其次,布局最后。 */
|
|
27
|
+
export declare function graphChanges(base: WorkflowDocument, next: WorkflowDocument): GraphChange[];
|
|
28
|
+
/** 一处改动写成一行(不带前面的「- 」),比如「步骤 review(审查):改了提示词、名称」。 */
|
|
29
|
+
export declare function describeGraphChange(change: GraphChange, base: WorkflowDocument, next: WorkflowDocument): string;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* dsh-workflow-lite — 输入节点:执行前问用户的问题,与用户的回答。
|
|
3
|
+
*
|
|
4
|
+
* 一个输入节点 = 一个问题。连到哪些步骤(输入 → 步骤),回答就交给哪些步骤;一条都没连 = 交给整个工作流。
|
|
5
|
+
* 用户点「执行」时按画布上从上到下、从左到右的顺序把问题摆出来填;编译时问题与回答进计划,
|
|
6
|
+
* 占位与说明只给填写的人看。
|
|
7
|
+
*
|
|
8
|
+
* 编译器、校验、画布、工具、实例都从这里取解释。纯函数,不碰磁盘、不 import DSH 包。
|
|
9
|
+
*
|
|
10
|
+
* @module @xiaoso/dsh-workflow-lite/shared/inputs
|
|
11
|
+
*/
|
|
12
|
+
import type { InputAnswer, InputData, InputKind, InputNode, WorkflowDocument } from './types.ts';
|
|
13
|
+
/** 交互方式(缺省 = 单行文字)。 */
|
|
14
|
+
export declare function inputKind(data: InputData): InputKind;
|
|
15
|
+
/** 要从选项里选的两种。 */
|
|
16
|
+
export declare function isChoiceKind(kind: InputKind): boolean;
|
|
17
|
+
/** 图里的输入节点,按画布上的阅读顺序:从上到下、同一行从左到右,再按 id。 */
|
|
18
|
+
export declare function orderedInputs(document: WorkflowDocument): InputNode[];
|
|
19
|
+
/** 回答交给哪些步骤(按 id 码位序);空 = 交给整个工作流。 */
|
|
20
|
+
export declare function inputReaders(document: WorkflowDocument, inputId: string): string[];
|
|
21
|
+
/** 一个步骤用到的输入节点(按阅读顺序)。 */
|
|
22
|
+
export declare function stepInputs(document: WorkflowDocument, stepId: string): InputNode[];
|
|
23
|
+
/**
|
|
24
|
+
* 一份回答按题型取形(见 `readAnswer`)。单选 / 多选只留选项里有的那些;文字题原样。
|
|
25
|
+
* @returns 没有有效回答时 `undefined`。
|
|
26
|
+
*/
|
|
27
|
+
export declare function normalizeAnswer(data: InputData, raw: unknown): InputAnswer | undefined;
|
|
28
|
+
/** 实际用的回答:用户给的;没给就用默认值(默认值同样按题型取形)。 */
|
|
29
|
+
export declare function effectiveAnswer(input: InputNode, answers: Readonly<Record<string, InputAnswer>>): InputAnswer | undefined;
|
|
30
|
+
export interface AnswerCheck {
|
|
31
|
+
/** 规范化后的回答(输入 id → 回答;已经补上默认值,没回答的不在里面)。 */
|
|
32
|
+
answers: Record<string, InputAnswer>;
|
|
33
|
+
/** 填得不对的:选了不在选项里的、对不上任何输入节点的。 */
|
|
34
|
+
errors: string[];
|
|
35
|
+
/** 必填却还空着的输入节点。 */
|
|
36
|
+
missing: InputNode[];
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* 核对一份回答(来自「执行」对话框或工具的 `answers`):补上默认值、挑出填错的与漏填的。
|
|
40
|
+
* @param raw - 输入 id → 回答;不是对象当没回答。
|
|
41
|
+
*/
|
|
42
|
+
export declare function checkAnswers(document: WorkflowDocument, raw: unknown): AnswerCheck;
|
|
43
|
+
/** 两份回答是否相同(实例复用时比)。 */
|
|
44
|
+
export declare function sameAnswers(a: Readonly<Record<string, InputAnswer>>, b: Readonly<Record<string, InputAnswer>>): boolean;
|
|
45
|
+
/** 一个问题的写法提示(给模型问用户时看):「单选:A / B,默认 A」这类。 */
|
|
46
|
+
export declare function describeInput(data: InputData): string;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* dsh-workflow-lite — 字面约束与默认值。
|
|
3
|
+
*
|
|
4
|
+
* 这里放**格式契约里写死的字面量**(字符集、长度上限、键序之外的那些数)。
|
|
5
|
+
* 随部署变化的取值**不在这里**——那些一律是 Config 字段(见 `shared/config.ts`)。
|
|
6
|
+
*
|
|
7
|
+
* @module @xiaoso/dsh-workflow-lite/shared/limits
|
|
8
|
+
*/
|
|
9
|
+
/** 工具名(唯一工具)。 */
|
|
10
|
+
export declare const TOOL_NAME = "workflow_lite";
|
|
11
|
+
/** 派发目录名。写死、不做配置键;启动时**不**创建,编译时才建。 */
|
|
12
|
+
export declare const DISPATCH_DIR = ".dispatch";
|
|
13
|
+
/** 图目录名(`dataDir` 下的固定子目录)。 */
|
|
14
|
+
export declare const WORKFLOWS_DIR = "workflows";
|
|
15
|
+
/** 模板目录名。 */
|
|
16
|
+
export declare const TEMPLATES_DIR = "templates";
|
|
17
|
+
/** 工作流版本目录名:`versions/<图名>/<序号>.json`(不在 `workflows/` 下——那里的子目录算旧结构)。 */
|
|
18
|
+
export declare const VERSIONS_DIR = "versions";
|
|
19
|
+
/** 一个工作流最多留几个版本(到了就先删掉旧的再存)。 */
|
|
20
|
+
export declare const MAX_VERSIONS = 100;
|
|
21
|
+
/** 版本说明的长度上限(码点)。 */
|
|
22
|
+
export declare const MAX_VERSION_NOTE_CODEPOINTS = 500;
|
|
23
|
+
/** 自动布局 / 归一化后的坐标小数位。 */
|
|
24
|
+
export declare const COORD_DECIMALS = 2;
|
|
25
|
+
/** 名字长度上限(码点)。适用于图名 / 模板名 / `node.id`。 */
|
|
26
|
+
export declare const MAX_NAME_CODEPOINTS = 64;
|
|
27
|
+
/**
|
|
28
|
+
* `when` 值长度上限(码点)。
|
|
29
|
+
*
|
|
30
|
+
* 这是软编排:条件可以是一句、一段自然语言("测试全绿且没有新增警告"),由执行者自己判断。
|
|
31
|
+
* 上限只防病态输入。
|
|
32
|
+
*/
|
|
33
|
+
export declare const MAX_WHEN_CODEPOINTS = 2000;
|
|
34
|
+
/**
|
|
35
|
+
* 判定词(走 `VERDICT: <值>` 约定的那种)的长度上限。短标识(pass / fail / retry)是判定词,
|
|
36
|
+
* 其余的是自然语言条件——编译器对两者的写法不同,见 `isVerdictWhen`。
|
|
37
|
+
*/
|
|
38
|
+
export declare const MAX_VERDICT_CODEPOINTS = 32;
|
|
39
|
+
/** 一个节点的描述 / 一条产出规则的长度上限(码点)——同样只防病态输入。 */
|
|
40
|
+
export declare const MAX_TEXT_CODEPOINTS = 2000;
|
|
41
|
+
/** 工作流设置里「产出根目录」的长度上限(码点)。 */
|
|
42
|
+
export declare const MAX_ROOT_CODEPOINTS = 1024;
|
|
43
|
+
/** `label` 长度上限(码点)——只防病态输入,不参与任何判定。 */
|
|
44
|
+
export declare const MAX_LABEL_CODEPOINTS = 200;
|
|
45
|
+
/** 一个资源最多放几项。 */
|
|
46
|
+
export declare const MAX_RESOURCE_ITEMS = 50;
|
|
47
|
+
/** 资源里一条路径 / 网址的长度上限(码点)。 */
|
|
48
|
+
export declare const MAX_VALUE_CODEPOINTS = 2048;
|
|
49
|
+
/** 资源里一段自定义提示词的长度上限(码点)——它本身就是一段提示词,给得宽一些。 */
|
|
50
|
+
export declare const MAX_RESOURCE_TEXT_CODEPOINTS = 20000;
|
|
51
|
+
/** 一个选择题最多几个选项(再多就不是执行前顺手点一下的事了)。 */
|
|
52
|
+
export declare const MAX_OPTIONS = 30;
|
|
53
|
+
/**
|
|
54
|
+
* Windows 文件名非法字符。`node.id` / 图名 / 模板名共用这一套(它们都要落成文件名)。
|
|
55
|
+
* 注意:`|` 也在这里——它同时会打断计划里的 markdown 表格,`label` 另有单列规则。
|
|
56
|
+
*/
|
|
57
|
+
export declare const ILLEGAL_NAME_CHARS: RegExp;
|
|
58
|
+
/** 控制字符(含 DEL)。**这里就是要匹配它们**——它们是名字里必须被拒的字符类。 */
|
|
59
|
+
export declare const CONTROL_CHARS: RegExp;
|
|
60
|
+
/** Windows 保留名(**大小写不敏感**);带扩展名的形式也算,如 `con.json`。 */
|
|
61
|
+
export declare const WINDOWS_RESERVED: Set<string>;
|
|
62
|
+
/** 原子写的临时文件前缀——以 `.` 开头,一切扫描天然忽略。 */
|
|
63
|
+
export declare const TMP_PREFIX = ".tmp-";
|
|
64
|
+
/** 预置的分支判定值(自由文本 `when` 也允许,只是无法推断穷尽性)。 */
|
|
65
|
+
export declare const WELL_KNOWN_WHEN: readonly ["pass", "fail"];
|
|
66
|
+
/** `VERDICT` 约定的固定形态:`VERDICT: <值>`(顶格、大写、半角冒号 + 一个空格)。 */
|
|
67
|
+
export declare const VERDICT_PREFIX = "VERDICT: ";
|
|
68
|
+
/** 派发计划的段标记(字节稳定的前缀契约)。 */
|
|
69
|
+
export declare const PLAN_SECTIONS: {
|
|
70
|
+
readonly protocol: "## 你拿到的是什么";
|
|
71
|
+
readonly facts: "## 图的事实";
|
|
72
|
+
readonly discipline: "## 分发纪律";
|
|
73
|
+
readonly contract: "## 交付契约";
|
|
74
|
+
readonly dynamic: "## 本次执行";
|
|
75
|
+
readonly notes: "## 图的注意事项";
|
|
76
|
+
readonly runState: "## 运行状态";
|
|
77
|
+
};
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* dsh-workflow-lite — 图 JSON 的读入规范化与 canonical 写出。
|
|
3
|
+
*
|
|
4
|
+
* 两条硬规则都在这里兑现:
|
|
5
|
+
* 1. **白名单写出**:只写契约里的键,React Flow 的运行时字段(`measured` /
|
|
6
|
+
* `selected` / `dragging` / `width` / `height` / `computedPosition` …)与一切
|
|
7
|
+
* 未知字段**一律丢弃**并报警告——它们每次渲染都在变,持久化就是永不停止的假 diff。
|
|
8
|
+
* 2. **canonical writer**:2 空格缩进 / LF / 末尾恰好一个换行 / 固定键序 / 坐标归一化 /
|
|
9
|
+
* 数组顺序永不重排。往返测试与"同图两次编译逐字节相同"的期望值都来自它。
|
|
10
|
+
*
|
|
11
|
+
* 纯函数,不碰磁盘、不 import DSH 包。
|
|
12
|
+
* @module @xiaoso/dsh-workflow-lite/shared/model
|
|
13
|
+
*/
|
|
14
|
+
import { type EdgeData, type Handoff, type InputAnswer, type InputData, type InputNode, type NodeData, type OutputSpec, type ResourceData, type ResourceItem, type ResourceNode, type StepNode, type ValidationProblem, type WorkflowDocument, type WorkflowEdge, type WorkflowNode, type WorkflowSettings } from './types.ts';
|
|
15
|
+
/** 坐标归一化:`round(v * 100) / 100`(2 位小数)。 */
|
|
16
|
+
export declare function normalizeCoord(value: number): number;
|
|
17
|
+
/**
|
|
18
|
+
* 大小写不敏感的 id 键——图内唯一性按它判定(`Scan` 与 `scan` 是同一个身份,
|
|
19
|
+
* 因为它们会撞同一个载荷文件名)。
|
|
20
|
+
*/
|
|
21
|
+
export declare function idKey(id: string): string;
|
|
22
|
+
/** 边 id 的构造式:`<source>-><target>`,带 `when` 时追加 `#<when>`。构造上天然唯一。 */
|
|
23
|
+
export declare function makeEdgeId(source: string, target: string, when?: string): string;
|
|
24
|
+
/** 一个节点在计划里的规范标识:`label(id)`,`label` 缺省时只写 `id`。 */
|
|
25
|
+
export declare function displayName(id: string, label?: string): string;
|
|
26
|
+
export interface ParseOutcome {
|
|
27
|
+
/** 结构可用时是规范化后的文档;保存级破损时是 `null`。 */
|
|
28
|
+
document: WorkflowDocument | null;
|
|
29
|
+
problems: ValidationProblem[];
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 从原始对象里挑出 `data` 的已知键(图里的节点与节点模板共用这一份)。
|
|
33
|
+
* 产出数组里认不出的元素(不是对象、没有字符串 `path`)直接略过。
|
|
34
|
+
*/
|
|
35
|
+
export declare function readNodeData(raw: unknown): NodeData;
|
|
36
|
+
/**
|
|
37
|
+
* 产出的规范写法:空数组 = 未声明;只有一个产出且没有规则 = 写成字符串(老写法,文件保持不变);
|
|
38
|
+
* 规则是空白的当没写。其余原样(数组顺序永不重排)。
|
|
39
|
+
*/
|
|
40
|
+
export declare function canonicalOutput(output: NodeData['output']): NodeData['output'];
|
|
41
|
+
/** 把任意写法的产出摊成一张清单(`false` 与未声明都是空清单)。 */
|
|
42
|
+
export declare function outputSpecs(output: NodeData['output']): OutputSpec[];
|
|
43
|
+
/** 两份 `data` 内容是否相同(产出按规范写法比,数组逐项比)。 */
|
|
44
|
+
export declare function sameNodeData(a: NodeData, b: NodeData): boolean;
|
|
45
|
+
/** 深拷一份输入节点的 `data`(选项与多选默认值不和原件共用)。 */
|
|
46
|
+
export declare function cloneInputData(data: InputData): InputData;
|
|
47
|
+
/** 深拷一份 `data`(产出数组不和原件共用)。 */
|
|
48
|
+
export declare function cloneNodeData(data: NodeData): NodeData;
|
|
49
|
+
/**
|
|
50
|
+
* 从原始对象里挑出工作流设置的已知键。根目录存规范化后的写法;认不出的执行方式、复用方式当缺省(`auto`)。
|
|
51
|
+
* 全是缺省值时返回 `undefined`(文件里不写这个键)。
|
|
52
|
+
*/
|
|
53
|
+
export declare function readSettings(raw: unknown): WorkflowSettings | undefined;
|
|
54
|
+
/** 冲突清单里代表「工作流设置」的那一项(设置没有 id,用这个固定键)。 */
|
|
55
|
+
export declare const SETTINGS_CONFLICT_ID = "settings";
|
|
56
|
+
/** 两份设置是否相同(缺省与缺省相等)。 */
|
|
57
|
+
export declare function sameSettings(a: WorkflowSettings | undefined, b: WorkflowSettings | undefined): boolean;
|
|
58
|
+
/** 交接:`false` 原样;对象只认字符串 `note`(空白说明 = 缺省);其余值当没写(= 交执行结果)。 */
|
|
59
|
+
export declare function readHandoff(raw: unknown): Handoff | false | undefined;
|
|
60
|
+
/** 交接的规范写法:空白说明 = 缺省(交执行结果、不附说明)。 */
|
|
61
|
+
export declare function canonicalHandoff(handoff: Handoff | false | undefined): Handoff | false | undefined;
|
|
62
|
+
/** 两份交接是否相同(按规范写法比;缺省与缺省相等)。 */
|
|
63
|
+
export declare function sameHandoff(a: Handoff | false | undefined, b: Handoff | false | undefined): boolean;
|
|
64
|
+
/** 两条边的 `data` 内容是否相同(条件、标签、交接、写入方式)。 */
|
|
65
|
+
export declare function sameEdgeData(a: EdgeData | undefined, b: EdgeData | undefined): boolean;
|
|
66
|
+
export declare function isStep(node: WorkflowNode): node is StepNode;
|
|
67
|
+
export declare function isInput(node: WorkflowNode): node is InputNode;
|
|
68
|
+
export declare function isResource(node: WorkflowNode): node is ResourceNode;
|
|
69
|
+
/**
|
|
70
|
+
* 资源节点 `data` 的已知键:名字与描述空白就当没写;内容里认不出的项(不是对象、种类不认识、
|
|
71
|
+
* 没有字符串 `value`)直接略过;自定义不带 `note`。
|
|
72
|
+
*/
|
|
73
|
+
export declare function readResourceData(raw: unknown): ResourceData;
|
|
74
|
+
/** 资源节点 `data` 的规范写法(读入的规范化 + 固定键序),写盘与比较都用它。 */
|
|
75
|
+
export declare function canonicalResource(data: ResourceData): ResourceData;
|
|
76
|
+
/** 深拷一份资源节点的 `data`(内容数组与每一项都不和原件共用)。 */
|
|
77
|
+
export declare function cloneResourceData(data: ResourceData): ResourceData;
|
|
78
|
+
/**
|
|
79
|
+
* 输入节点 `data` 的已知键,顺手规范化:选项去空、去重;不认识的交互方式当单行文字;
|
|
80
|
+
* 默认值按交互方式取形(文字题 / 单选是一段文字,多选是若干选项)。没有字符串 `question` 时给空串(编译级)。
|
|
81
|
+
*/
|
|
82
|
+
export declare function readInputData(raw: unknown): InputData;
|
|
83
|
+
/**
|
|
84
|
+
* 一份回答按交互方式取形:文字题与单选是一段文字(空白 = 没回答),多选是去空、去重后的若干项
|
|
85
|
+
* (一项都没有 = 没回答)。形状对不上(比如多选给了一段文字)时也尽量接住。
|
|
86
|
+
*/
|
|
87
|
+
export declare function readAnswer(kind: InputData['kind'] | 'text', raw: unknown): InputAnswer | undefined;
|
|
88
|
+
/** 输入节点 `data` 的规范写法(读入的规范化 + 固定键序),写盘与比较都用它。 */
|
|
89
|
+
export declare function canonicalInput(data: InputData): InputData;
|
|
90
|
+
/** 两个节点的内容是否相同(类型 + `data`;坐标不算)。 */
|
|
91
|
+
export declare function sameNodeContent(a: WorkflowNode, b: WorkflowNode): boolean;
|
|
92
|
+
/** 一项内容的简称:文件与文件夹取最后一段,网址取主机名,skill 取名字,自定义取 `custom`。 */
|
|
93
|
+
export declare function itemShortName(item: ResourceItem): string;
|
|
94
|
+
/**
|
|
95
|
+
* 给资源起一个节点 id:按名字(没有就按第一项的简称,文件不带扩展名)换掉文件名里不许出现的字符,前面加 `res-`;
|
|
96
|
+
* 撞名(大小写不敏感)就加 `-2`、`-3`…
|
|
97
|
+
*/
|
|
98
|
+
export declare function resourceIdFor(data: ResourceData, taken: (id: string) => boolean): string;
|
|
99
|
+
/**
|
|
100
|
+
* 把 `JSON.parse` 的结果规范化成我们的文档形状。
|
|
101
|
+
*
|
|
102
|
+
* 保存级破损(顶层不是对象 / `nodes` 或 `edges` 不是数组 / 元素不是对象 /
|
|
103
|
+
* 缺 `id` / 缺 `source` / `target` / 坐标非法)→ `document: null` + 保存级问题。
|
|
104
|
+
* 其余问题(未知字段、未知 `type`、`position` 缺失、悬空 edge…)在**保留文档**的前提下
|
|
105
|
+
* 逐条报出,交给上层按级别处置。
|
|
106
|
+
*/
|
|
107
|
+
export declare function normalizeDocument(input: unknown): ParseOutcome;
|
|
108
|
+
/** `JSON.parse` + {@link normalizeDocument}。解析失败就是保存级。 */
|
|
109
|
+
export declare function readDocument(text: string): ParseOutcome;
|
|
110
|
+
/**
|
|
111
|
+
* Canonical 写出。**同一份文档两次写出必得逐字节相同的文本**,而不同文档的差异
|
|
112
|
+
* 被限制在改动的那一个块里(2 空格缩进的每节点/每边一个多行块)。
|
|
113
|
+
*/
|
|
114
|
+
export declare function writeDocument(document: WorkflowDocument): string;
|
|
115
|
+
/** 深拷贝一份文档(工具做读-改-写时用,避免就地改调用方的对象)。 */
|
|
116
|
+
export declare function cloneDocument(document: WorkflowDocument): WorkflowDocument;
|
|
117
|
+
/** 按 `id` 找节点。 */
|
|
118
|
+
export declare function findNode(document: WorkflowDocument, id: string): WorkflowNode | undefined;
|
|
119
|
+
/** 一个节点的入边(**含回边**)。 */
|
|
120
|
+
export declare function incomingEdges(document: WorkflowDocument, id: string): WorkflowEdge[];
|
|
121
|
+
/** 一个节点的出边。 */
|
|
122
|
+
export declare function outgoingEdges(document: WorkflowDocument, id: string): WorkflowEdge[];
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* dsh-workflow-lite — 命名约束。
|
|
3
|
+
*
|
|
4
|
+
* 图名、模板名与 `node.id` **共用同一套文件名约束**(这三样都要落成文件名:
|
|
5
|
+
* `workflows/<图名>.json`、`templates/**\/<名>.json`、`.dispatch/<图名>/<planId>/<id>.md`)。
|
|
6
|
+
* `label` **不在**这套里——它不是文件名,只受"不得含换行或 `|`"一条。
|
|
7
|
+
*
|
|
8
|
+
* 写成**禁止集**而不是允许集:规则是"不许有什么",所以中文名天然可用(`修复认证` 合法)。
|
|
9
|
+
*
|
|
10
|
+
* 纯函数,不碰磁盘、不 import DSH 包。
|
|
11
|
+
* @module @xiaoso/dsh-workflow-lite/shared/naming
|
|
12
|
+
*/
|
|
13
|
+
import type { ValidationCode } from './types.ts';
|
|
14
|
+
/** 一条命名/取值问题:`code` 给机器,`message` 给人。 */
|
|
15
|
+
export interface NameProblem {
|
|
16
|
+
code: ValidationCode;
|
|
17
|
+
message: string;
|
|
18
|
+
}
|
|
19
|
+
/** 码点数(不是 UTF-16 长度——emoji 与增补平面字符按 1 个数)。 */
|
|
20
|
+
export declare function codepointLength(value: string): number;
|
|
21
|
+
/**
|
|
22
|
+
* 归一:trim 尾部空白与尾随 `.`(Windows 会静默吞掉尾点),再统一 NFC。
|
|
23
|
+
* **比较与落盘都走这一步。**
|
|
24
|
+
*/
|
|
25
|
+
export declare function normalizeName(raw: string): string;
|
|
26
|
+
/** 只做归一,不做校验——给"用户输入 → 待校验名字"这一步用。 */
|
|
27
|
+
export declare function normalizeWhen(raw: string): string;
|
|
28
|
+
/**
|
|
29
|
+
* 校验一个名字(图名 / 模板名 / `node.id`)。
|
|
30
|
+
* @returns `null` = 合法;否则是一条问题。
|
|
31
|
+
*/
|
|
32
|
+
export declare function checkName(raw: string): NameProblem | null;
|
|
33
|
+
/**
|
|
34
|
+
* 校验 `when` 的值(条件出边的判据)。
|
|
35
|
+
*
|
|
36
|
+
* 两种都合法:短的判定词(`pass` / `fail` / `retry`,走 `VERDICT:` 约定),或者一句自然语言条件
|
|
37
|
+
* ("测试全绿且没有新增警告")。只拦三样:空串(要无条件边就整条不写 `when`)、换行与控制字符
|
|
38
|
+
* (条件要能写进计划里的一句话)、超长。
|
|
39
|
+
*/
|
|
40
|
+
export declare function checkWhen(raw: string): NameProblem | null;
|
|
41
|
+
/**
|
|
42
|
+
* 这个条件是不是判定词:一个短的英文标识(≤ {@link MAX_VERDICT_CODEPOINTS} 个字符,只含字母、
|
|
43
|
+
* 数字、`-`、`_`),如 `pass` / `fail` / `needs-review`。
|
|
44
|
+
*
|
|
45
|
+
* 判定词由上游在回复末行写 `VERDICT: <值>` 来选路;其余(包括"用户确认了方案"这类中文短句)
|
|
46
|
+
* 都按自然语言条件处理:由执行者读了上游产出之后自己判断成立与否——计划里两种的写法不同。
|
|
47
|
+
*/
|
|
48
|
+
export declare function isVerdictWhen(value: string): boolean;
|
|
49
|
+
/** 校验节点描述 / 产出规则这类自由文本:只防病态长度。 */
|
|
50
|
+
export declare function checkText(raw: string, what: string): NameProblem | null;
|
|
51
|
+
/** 校验 `label`:只禁换行与竖线 `|`(它们会打断计划里的 markdown 表格)。 */
|
|
52
|
+
export declare function checkLabel(raw: string): NameProblem | null;
|
|
53
|
+
/**
|
|
54
|
+
* 校验 `output`:相对工作区根的路径,允许子路径,**禁止绝对路径与 `..`**。
|
|
55
|
+
* `false`(显式不产出)与缺省都合法,由调用方先分流。
|
|
56
|
+
*/
|
|
57
|
+
export declare function checkOutput(raw: string): NameProblem | null;
|
|
58
|
+
/** 大小写不敏感的撞名比较(Windows 落盘不区分大小写,而这三样都是文件名)。 */
|
|
59
|
+
export declare function sameName(a: string, b: string): boolean;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* dsh-workflow-lite — 产出路径:根目录的规范化,与「根目录 + 产出文件名」的拼接。
|
|
3
|
+
*
|
|
4
|
+
* 这件事**只在这里做**:编译器、校验、画布预览都调这几个函数,不各写一份字符串拼接。
|
|
5
|
+
* 规范化交给 `pathe`(Node `path` 的跨平台版本,浏览器里也能跑):
|
|
6
|
+
* - 分隔符统一成 `/`(Windows 的 `D:\out` → `D:/out`,执行者的文件工具两种都认);
|
|
7
|
+
* - 折叠重复的 `/`、`./`、`a/..`;盘符大写;UNC `\\srv\share` → `//srv/share`;
|
|
8
|
+
* - 拼接时不管根目录有没有尾斜杠、产出名是不是 `./` 开头,结果都只有一个分隔符。
|
|
9
|
+
*
|
|
10
|
+
* 纯函数,不碰磁盘、不 import DSH 包。
|
|
11
|
+
* @module @xiaoso/dsh-workflow-lite/shared/outputPaths
|
|
12
|
+
*/
|
|
13
|
+
import { type NameProblem } from './naming.ts';
|
|
14
|
+
/**
|
|
15
|
+
* 根目录的规范写法:去首尾空白、`pathe.normalize`、去掉尾斜杠(`/`、`C:/`、`//srv/share` 这类根本身除外)。
|
|
16
|
+
* 空串与 `.` 都表示"工作区根",返回 `undefined`(拼接时不加前缀)。
|
|
17
|
+
*/
|
|
18
|
+
export declare function normalizeRoot(raw: string | undefined): string | undefined;
|
|
19
|
+
/** 根目录里的这个记号建实例时换成实例 id(每次执行的产出各放各的)。 */
|
|
20
|
+
export declare const INSTANCE_TOKEN = "{instance}";
|
|
21
|
+
/** 没配产出根目录时用它:和状态文件放在一起,每个实例一个 `out`。 */
|
|
22
|
+
export declare const DEFAULT_OUTPUT_ROOT = ".workflow-lite/runs/{instance}/out";
|
|
23
|
+
/** 写 `.` = 明确要写在工作区根目录(和"没配"区分开:没配是 {@link DEFAULT_OUTPUT_ROOT})。 */
|
|
24
|
+
export declare const WORKSPACE_ROOT = ".";
|
|
25
|
+
/** 一张图实际用的产出根目录(还没换实例 id):没配就是默认值。 */
|
|
26
|
+
export declare function rootOf(settings: {
|
|
27
|
+
outputRoot?: string;
|
|
28
|
+
} | undefined): string;
|
|
29
|
+
/** 把根目录里的 {@link INSTANCE_TOKEN} 换成 `instance`,再规范化;结果是工作区根时回 `.`。 */
|
|
30
|
+
export declare function bindRoot(root: string, instance: string): string;
|
|
31
|
+
/** 根目录是不是绝对路径(`/x`、`C:/x`、`//srv/share`;`C:` 这种盘符相对写法规范化后也算)。 */
|
|
32
|
+
export declare function isAbsoluteRoot(root: string): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* 一个产出文件最终写到哪:`根目录 + 产出路径`,规范化。没配根目录就是规范化后的产出路径本身
|
|
35
|
+
* (相对工作区)。产出路径本身是绝对路径时原样用(规范化),不拼根目录。
|
|
36
|
+
*/
|
|
37
|
+
export declare function resolveOutputPath(root: string | undefined, path: string): string;
|
|
38
|
+
/**
|
|
39
|
+
* 资源里一个文件 / 文件夹实际在哪:绝对路径原样用;相对路径在有步骤写这个资源时放在产出根目录下
|
|
40
|
+
* (它是这次执行的产出),只被读时相对工作区(它是现成的东西)。
|
|
41
|
+
*/
|
|
42
|
+
export declare function resolveItemPath(root: string | undefined, path: string, written: boolean): string;
|
|
43
|
+
/**
|
|
44
|
+
* 一个产出文件的身份:规范化后的相对路径(`./a.md` 与 `a.md` 是同一份)。
|
|
45
|
+
* 交接引用产出、统计「谁在用这份文件」都按它比较。
|
|
46
|
+
*/
|
|
47
|
+
export declare function outputKey(path: string): string;
|
|
48
|
+
/** 根目录合不合法:只拦控制字符、`~`(不会被展开)与超长;相对、绝对、`..` 都允许。 */
|
|
49
|
+
export declare function checkOutputRoot(raw: string): NameProblem | null;
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* dsh-workflow-lite — 资源节点与交接:图上"传了什么"的唯一解释。
|
|
3
|
+
*
|
|
4
|
+
* 两种东西在步骤之间传,性质不同,所以分开表达:
|
|
5
|
+
* - **资源**是独立的东西,不依赖某一次运行——画成**资源节点**,一个资源里可以放好几项(文件、文件夹、
|
|
6
|
+
* 网址、Skill、自定义)。步骤 → 资源 = 写它(写的是其中的文件与文件夹:产出,或在原文件上更新);
|
|
7
|
+
* 资源 → 步骤 = 读它。几个步骤连到同一个资源,它就是几步之间共用的一份;一条线都没连的资源交给
|
|
8
|
+
* 整个工作流。
|
|
9
|
+
* - **执行结果**是某一次运行的回复——沿**步骤 → 步骤**的线交给下游(缺省就交;可以附一段交接说明,
|
|
10
|
+
* 也可以设成"只管先后")。
|
|
11
|
+
*
|
|
12
|
+
* 编译器、校验、画布、工具都从这里取解释。纯函数,不碰磁盘、不 import DSH 包。
|
|
13
|
+
*
|
|
14
|
+
* @module @xiaoso/dsh-workflow-lite/shared/resources
|
|
15
|
+
*/
|
|
16
|
+
import { type Handoff, type OutputSpec, type ResourceData, type ResourceItem, type ResourceNode, type StepNode, type WorkflowDocument, type WorkflowEdge, type WorkflowNode } from './types.ts';
|
|
17
|
+
/**
|
|
18
|
+
* - `flow`:步骤 → 步骤(先后,带条件与交接);
|
|
19
|
+
* - `write`:步骤 → 资源;`read`:资源 → 步骤;
|
|
20
|
+
* - `ask`:输入 → 步骤(把用户的回答交给它);
|
|
21
|
+
* - `invalid`:资源 → 资源、连进输入节点、输入连到资源(保存级);`dangling`:端点不存在。
|
|
22
|
+
*/
|
|
23
|
+
export type EdgeKind = 'flow' | 'write' | 'read' | 'ask' | 'invalid' | 'dangling';
|
|
24
|
+
/** 按 `idKey` 查节点(同 id 重复时取第一个)。 */
|
|
25
|
+
export declare function nodeIndex(document: WorkflowDocument): Map<string, WorkflowNode>;
|
|
26
|
+
export declare function edgeKind(nodes: ReadonlyMap<string, WorkflowNode>, edge: WorkflowEdge): EdgeKind;
|
|
27
|
+
/** 只留步骤 → 步骤的线(执行次序、环、批次只看它们)。 */
|
|
28
|
+
export declare function flowEdges(document: WorkflowDocument): WorkflowEdge[];
|
|
29
|
+
/** 这一项步骤能不能写(文件、文件夹)。 */
|
|
30
|
+
export declare function isWritable(item: ResourceItem): boolean;
|
|
31
|
+
/** 资源的称呼:名字;没有名字就用第一项的简称;什么都没有就是 id。 */
|
|
32
|
+
export declare function resourceTitle(resource: ResourceNode): string;
|
|
33
|
+
export interface ResourceInfo {
|
|
34
|
+
resource: ResourceNode;
|
|
35
|
+
/** 写它的步骤(文件中的顺序);`update` = 在原文件上更新。 */
|
|
36
|
+
writers: {
|
|
37
|
+
id: string;
|
|
38
|
+
update: boolean;
|
|
39
|
+
}[];
|
|
40
|
+
/** 读它的步骤。 */
|
|
41
|
+
readers: string[];
|
|
42
|
+
}
|
|
43
|
+
/** 一个资源有没有连任何步骤:一条线都没有就交给整个工作流。 */
|
|
44
|
+
export declare function isShared(info: ResourceInfo): boolean;
|
|
45
|
+
/** 资源节点 id(规范大小写)→ 写它、读它的步骤。 */
|
|
46
|
+
export declare function resourceGraph(document: WorkflowDocument): Map<string, ResourceInfo>;
|
|
47
|
+
/** 一个步骤和它连着的资源(不含交给整个工作流的那些)。 */
|
|
48
|
+
export interface StepResources {
|
|
49
|
+
writes: {
|
|
50
|
+
resource: ResourceNode;
|
|
51
|
+
update: boolean;
|
|
52
|
+
edge: WorkflowEdge;
|
|
53
|
+
}[];
|
|
54
|
+
reads: {
|
|
55
|
+
resource: ResourceNode;
|
|
56
|
+
edge: WorkflowEdge;
|
|
57
|
+
}[];
|
|
58
|
+
}
|
|
59
|
+
export declare function stepResources(document: WorkflowDocument, stepId: string): StepResources;
|
|
60
|
+
/** 交给整个工作流的资源(一条线都没连的那些),按文件中的顺序。 */
|
|
61
|
+
export declare function sharedResources(document: WorkflowDocument): ResourceNode[];
|
|
62
|
+
/** 某个步骤与某个资源的关系(画布高亮用);没关系是 `null`。 */
|
|
63
|
+
export type ResourceRole = 'producer' | 'updater' | 'reader';
|
|
64
|
+
export declare function roleOf(info: ResourceInfo | undefined, stepId: string): ResourceRole | null;
|
|
65
|
+
/** 一个步骤写的资源里的文件,摊成产出清单(存成步骤模板时用)。 */
|
|
66
|
+
export declare function outputsOf(document: WorkflowDocument, stepId: string): OutputSpec[];
|
|
67
|
+
/** 一个产出文件对应的资源内容:一个文件项,生成规则写进它的说明。 */
|
|
68
|
+
export declare function outputResource(spec: OutputSpec): ResourceData;
|
|
69
|
+
/** 按路径(规范化后)找放着这个文件的资源;有好几个时优先只放了它一项的。 */
|
|
70
|
+
export declare function resourceByPath(document: WorkflowDocument, path: string): ResourceNode | undefined;
|
|
71
|
+
/** 新资源节点(`(0,0)` = 还没摆过,由布局补位)。 */
|
|
72
|
+
export declare function newResourceNode(document: WorkflowDocument, data: ResourceData, position?: {
|
|
73
|
+
x: number;
|
|
74
|
+
y: number;
|
|
75
|
+
}): ResourceNode;
|
|
76
|
+
/**
|
|
77
|
+
* 让一个步骤恰好写这些文件(工具的 `write_node` 与模板展开用):
|
|
78
|
+
* 路径已有资源就连上它(文件项没写过说明就补上),没有就新建一个只放这个文件的资源;
|
|
79
|
+
* 不在清单里的写入线去掉,去掉之后什么都不连的资源一并删掉。**就地改** `document`。
|
|
80
|
+
* @param positionOf - 新资源节点的坐标(第几个新资源 → 坐标);缺省 `(0,0)`。
|
|
81
|
+
* @returns 新建的资源节点 id。
|
|
82
|
+
*/
|
|
83
|
+
export declare function setStepOutputs(document: WorkflowDocument, stepId: string, specs: readonly OutputSpec[], positionOf?: (index: number) => {
|
|
84
|
+
x: number;
|
|
85
|
+
y: number;
|
|
86
|
+
}): string[];
|
|
87
|
+
/** 把模板里的产出清单(`data.output`)挑出来,剩下的是步骤自己的 `data`。 */
|
|
88
|
+
export declare function splitOutputs(data: StepNode['data']): {
|
|
89
|
+
data: StepNode['data'];
|
|
90
|
+
outputs: OutputSpec[];
|
|
91
|
+
};
|
|
92
|
+
/** 一条步骤间的线实际交了什么。 */
|
|
93
|
+
export interface ResolvedHandoff {
|
|
94
|
+
/** 交不交上游的执行结果。 */
|
|
95
|
+
result: boolean;
|
|
96
|
+
note?: string;
|
|
97
|
+
}
|
|
98
|
+
export declare function resolveHandoff(handoff: Handoff | false | undefined): ResolvedHandoff;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* dsh-workflow-lite — 运行到哪了:按图、判定和流水推出**最后执行**的步骤与**接下来**该做的步骤。
|
|
3
|
+
*
|
|
4
|
+
* 只看各步骤的状态会漂:循环里每个步骤都做过一轮、都是 `done`,"第一个没完成的步骤"会跳到环外。
|
|
5
|
+
* 这里改看流水(只追加,下标就是先后):
|
|
6
|
+
* - 一个步骤做完之后,它该交给的下游(无条件线、条件等于它这一轮判定的线)在那之后还没有动静,
|
|
7
|
+
* 它就是**最后执行**的步骤之一,那些下游就是**接下来**的步骤(回边 = 循环回去,再做一轮);
|
|
8
|
+
* - 失败的步骤一直算最后执行(等重做或叫停);
|
|
9
|
+
* - 都接上了(下游在跑,或走到了头)时,最后执行 = 最近做完的那一步(同一次调用写下的几步一起算)。
|
|
10
|
+
*
|
|
11
|
+
* 另外两种「接下来」:从没开始过的入口步骤,和被改回 `pending` 的步骤(它前面的都完成了才轮到)。
|
|
12
|
+
*
|
|
13
|
+
* 用户也可以**指定**下一步(状态里的 `next`,流水里记一条 `next` 事件):
|
|
14
|
+
* - 指定还在时,「接下来」就是指定的这几步;
|
|
15
|
+
* - 指定那一刻之前做完的步骤,交接都算已经了结——模型做完指定的步骤后,不会再绕回指定之前没接上的下游。
|
|
16
|
+
* 画布上的「最后执行 / 下一步」标记与工具回给模型的进度都用它。
|
|
17
|
+
*
|
|
18
|
+
* @module @xiaoso/dsh-workflow-lite/shared/runCursor
|
|
19
|
+
*/
|
|
20
|
+
import { type GraphAnalysis } from './graph.ts';
|
|
21
|
+
import type { NodeStatus, RunState } from './runState.ts';
|
|
22
|
+
import type { WorkflowDocument } from './types.ts';
|
|
23
|
+
/** 最后执行的一步。 */
|
|
24
|
+
export interface CursorStep {
|
|
25
|
+
node: string;
|
|
26
|
+
status: NodeStatus;
|
|
27
|
+
round?: number;
|
|
28
|
+
verdict?: string;
|
|
29
|
+
/** 结束时刻。 */
|
|
30
|
+
at?: string;
|
|
31
|
+
}
|
|
32
|
+
/** 接下来的一步。 */
|
|
33
|
+
export interface NextStep {
|
|
34
|
+
node: string;
|
|
35
|
+
/** 做的话是第几轮。 */
|
|
36
|
+
round: number;
|
|
37
|
+
/**
|
|
38
|
+
* `flow` = 上游交过来;`start` = 入口步骤还没开始;`reset` = 被改回 pending,要重做;
|
|
39
|
+
* `pinned` = 用户指定。
|
|
40
|
+
*/
|
|
41
|
+
reason: 'flow' | 'start' | 'reset' | 'pinned';
|
|
42
|
+
/** 谁交过来的(`flow` 才有)。 */
|
|
43
|
+
from?: string;
|
|
44
|
+
/** 沿回边过来:循环回到这一步。 */
|
|
45
|
+
loop?: true;
|
|
46
|
+
}
|
|
47
|
+
export interface RunCursor {
|
|
48
|
+
/** 按做完的先后。 */
|
|
49
|
+
last: CursorStep[];
|
|
50
|
+
running: string[];
|
|
51
|
+
waiting: string[];
|
|
52
|
+
next: NextStep[];
|
|
53
|
+
}
|
|
54
|
+
export declare function runCursor(document: WorkflowDocument, state: RunState, analysis?: GraphAnalysis): RunCursor;
|