dsh-auto-flow 0.1.1 → 0.1.2
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 +21 -21
- package/README.md +40 -47
- package/cordis.patch.yml +3 -24
- package/lib/client.js +20569 -519
- package/lib/index.d.ts +185 -107
- package/lib/index.js +2915 -420
- package/lib/typert.host.js +623 -155
- package/lib/typert.remote-client.d.ts +25 -13
- package/lib/typert.remote-client.js +446 -96
- package/lib/types.d.ts +2 -106
- package/lib/types.js +7 -1
- package/package.json +39 -28
package/lib/index.d.ts
CHANGED
|
@@ -1,134 +1,212 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { E as ScriptInfo, F as WorkflowListRouteModelsResult, I as WorkflowListRunsRequest, N as WorkflowListLlmRoutesResult, P as WorkflowListRouteModelsRequest, S as RunState, j as WorkflowDefinition, l as FlowSummary, o as FlowGraph, r as FlowDataValue, w as RunSummary } from "./types-B4zlU2vb.js";
|
|
2
2
|
import { Context, Service } from "@deepseek-ai/cordis";
|
|
3
3
|
import { TypertRemoteService } from "@deepseek-ai/dsh-typert-protocol";
|
|
4
4
|
import z from "@deepseek-ai/schemastery";
|
|
5
|
-
//#region src/
|
|
6
|
-
/**
|
|
5
|
+
//#region src/host/config.d.ts
|
|
6
|
+
/** 插件配置。 */
|
|
7
7
|
interface Config {
|
|
8
|
-
/**
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
|
|
8
|
+
/** 工作流运行产物根目录。 */
|
|
9
|
+
workspaceDir?: string;
|
|
10
|
+
/** AI 智能体节点的子代理递归深度上限(非负安全整数;0 禁止委托)。 */
|
|
11
|
+
maxAgentDepth?: number;
|
|
12
|
+
/** 运行日志保留天数(正整数)。 */
|
|
13
|
+
runLogRetentionDays?: number;
|
|
12
14
|
}
|
|
15
|
+
//#endregion
|
|
16
|
+
//#region src/host/service.d.ts
|
|
17
|
+
/** 一次运行的结算结果(模型工具 workflow_run 消费)。 */
|
|
18
|
+
interface RunOutcome {
|
|
19
|
+
runId: string;
|
|
20
|
+
ok: boolean;
|
|
21
|
+
/** Output 节点的最终值(无 output 节点时为 undefined)。 */
|
|
22
|
+
result?: FlowDataValue | undefined;
|
|
23
|
+
error?: string | undefined;
|
|
24
|
+
steps: RunState['steps'];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* playwright-ag 的运行时契约(最小面):本插件经 ctx.get('playwrightAg') 消费,不硬依赖其包。
|
|
28
|
+
* 这是 playwright-ag host 服务 `run`/`listScripts` 的镜像,真源在其 src/host/service.ts 与
|
|
29
|
+
* src/types.ts(ScriptResult/ScriptMeta)——两侧保持结构化同步,改动时须一起改。
|
|
30
|
+
*/
|
|
31
|
+
interface PlaywrightAgContract {
|
|
32
|
+
/** 进程内运行(非 @Remote):可带 AbortSignal,取消时穿透关闭浏览器会话。 */
|
|
33
|
+
runScript(script: string, payload: Record<string, FlowDataValue>, options?: {
|
|
34
|
+
baseDir?: string | undefined;
|
|
35
|
+
runId?: string | undefined;
|
|
36
|
+
browser?: {
|
|
37
|
+
headless?: boolean;
|
|
38
|
+
channel?: string;
|
|
39
|
+
} | undefined;
|
|
40
|
+
timeoutMs?: number | undefined;
|
|
41
|
+
}, signal?: AbortSignal | undefined): Promise<ScriptResultWire>;
|
|
42
|
+
listScripts(): Promise<ScriptInfo[]>;
|
|
43
|
+
}
|
|
44
|
+
/** ScriptRunMeta 的镜像(真源 playwright-ag src/types.ts)。 */
|
|
45
|
+
type ScriptRunMetaWire = {
|
|
46
|
+
startedAt: number;
|
|
47
|
+
finishedAt: number;
|
|
48
|
+
durationMs: number;
|
|
49
|
+
};
|
|
50
|
+
/** ScriptResult 的镜像:必须无损——meta(耗时)与 error.code(稳定错误码)不得丢弃。 */
|
|
51
|
+
type ScriptResultWire = {
|
|
52
|
+
ok: true;
|
|
53
|
+
script: string;
|
|
54
|
+
data: FlowDataValue;
|
|
55
|
+
meta: ScriptRunMetaWire;
|
|
56
|
+
} | {
|
|
57
|
+
ok: false;
|
|
58
|
+
script: string;
|
|
59
|
+
error: {
|
|
60
|
+
code: string;
|
|
61
|
+
message: string;
|
|
62
|
+
};
|
|
63
|
+
meta: ScriptRunMetaWire;
|
|
64
|
+
};
|
|
13
65
|
declare module '@deepseek-ai/cordis' {
|
|
14
66
|
interface Context {
|
|
15
|
-
/**
|
|
67
|
+
/** Host 提供服务,浏览器经 @Remote 调用。 */
|
|
16
68
|
autoFlow: AutoFlowService;
|
|
69
|
+
/** 浏览器自动化脚本服务(playwright-ag 插件),缺失时 runFlow 报错。 */
|
|
70
|
+
playwrightAg?: PlaywrightAgContract;
|
|
17
71
|
}
|
|
18
|
-
interface Events {
|
|
19
|
-
/**
|
|
20
|
-
* 一次问候已提交(域事件,跨插件实时通知 seam)。发出方在 `send` 提交后
|
|
21
|
-
* emit;其它插件可 `ctx.on('autoFlow/recorded', ...)` 订阅。
|
|
22
|
-
* @mode emit
|
|
23
|
-
*/
|
|
24
|
-
'autoFlow/recorded'(payload: {
|
|
25
|
-
readonly greeting: Greeting;
|
|
26
|
-
}): void;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* 消息来源归属(MessageSourceMap)示例:若本插件要让「模型消息」归属到自己
|
|
31
|
-
* (如经 `exec.deferContext` 注入的用户消息),在此新增一个 kind 并在
|
|
32
|
-
* UserMessage.source 里使用。问候走会话事件而非模型消息,故此处仅声明词汇、
|
|
33
|
-
* 不强制接线(参考 @deepseek-ai/dsh-goal 的 goal 来源声明)。
|
|
34
|
-
*/
|
|
35
|
-
declare module '@deepseek-ai/dsh-llm' {
|
|
36
|
-
interface MessageSourceMap {}
|
|
37
72
|
}
|
|
38
73
|
/**
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
* -
|
|
44
|
-
* - 可选依赖用 `ctx.inject([...], cb)`(settings / commands / systemPrompt /
|
|
45
|
-
* autoFlowFormatter)——服务缺失时插件照常加载;
|
|
46
|
-
* - shell / sandboxPolicy 是可选服务:用 `ctx.get(...)` 读取,未组合时
|
|
47
|
-
* `exec` 报错、插件其余部分照常工作;
|
|
48
|
-
* - 持久层异步打开走 `[Service.init]`(storageDomain 可选:缺省退化为内存态)。
|
|
74
|
+
* 服务类即插件。依赖消费约定:
|
|
75
|
+
* - 可选依赖用 ctx.inject(settings),缺失照常加载;
|
|
76
|
+
* - storageDomain 是硬依赖,[Service.init] 缺失时大声失败(不静默内存态);
|
|
77
|
+
* - playwrightAg 用 ctx.get 读取,未组合时 runFlow 报 playwright-missing;
|
|
78
|
+
* - 持久层在 [Service.init] 异步打开。
|
|
49
79
|
*/
|
|
50
80
|
declare class AutoFlowService extends TypertRemoteService {
|
|
51
|
-
/**
|
|
52
|
-
static inject: string[];
|
|
53
|
-
/** Config 的 Schema(Cordis 类插件约定:Loader 读类静态 `Config` 校验注入并补齐默认值;
|
|
54
|
-
* 模块级同名导出不会被 Loader 识别——生成插件请把 Schema 放在类上)。 */
|
|
81
|
+
/** Config 的 Schema。Cordis 约定:Loader 读类静态 Config,请放在类上(模块级同名导出不会被识别)。 */
|
|
55
82
|
static Config: z<Config>;
|
|
56
83
|
/** 校验后的配置(settings scope 可在运行时覆盖,故非 readonly)。 */
|
|
57
84
|
private resolved;
|
|
58
|
-
/**
|
|
59
|
-
private readonly greetings;
|
|
60
|
-
/** 已打开的持久化领域;无后端时保持 null(内存态兜底)。 */
|
|
85
|
+
/** 已打开的持久化领域;未组合 storageDomain 时保持 null。 */
|
|
61
86
|
private storage;
|
|
62
|
-
/**
|
|
63
|
-
private
|
|
64
|
-
/**
|
|
65
|
-
private
|
|
66
|
-
/**
|
|
67
|
-
private
|
|
68
|
-
|
|
69
|
-
private
|
|
87
|
+
/** 运行中的工作流运行时(runId → 状态 + 审批放行句柄);终态后回收。 */
|
|
88
|
+
private readonly runRuntimes;
|
|
89
|
+
/** 进行中运行的中止控制器(runId → AbortController);cancelRun 触发,终态回收。 */
|
|
90
|
+
private readonly runControllers;
|
|
91
|
+
/** 插件自持的运行日志(追加式按天 JSONL;终态 settled 记录只写一次)。 */
|
|
92
|
+
private runStore;
|
|
93
|
+
/** 已追加进运行日志的 runId(终态 append 幂等守卫)。 */
|
|
94
|
+
private readonly persistedRunIds;
|
|
95
|
+
/** 进行中的终态追加(runId → append Promise);结算返回前 await 它保证落盘先于结算。 */
|
|
96
|
+
private readonly pendingPersists;
|
|
70
97
|
constructor(ctx: Context, config?: Config);
|
|
71
|
-
/**
|
|
72
|
-
*
|
|
73
|
-
* 与 @deepseek-ai/dsh-message-feedback 的 `[Service.init]` 同构;storageDomain
|
|
74
|
-
* 是可选服务,缺失时保持内存态兜底。
|
|
75
|
-
*/
|
|
98
|
+
/** 异步初始化:打开持久层。storageDomain 是本插件硬依赖——缺失时大声失败,
|
|
99
|
+
* 不静默退化成内存态(否则 saveFlow 假装成功但重启即丢数据,是数据丢失陷阱)。 */
|
|
76
100
|
protected [Service.init](): Promise<void>;
|
|
77
|
-
/**
|
|
78
|
-
private registerTool;
|
|
79
|
-
/** 设置:同一份 Config schema 注册为可编辑 namespace,入口配置作为 base 层。 */
|
|
101
|
+
/** 把同一份 Config schema 注册为可编辑的 settings namespace。 */
|
|
80
102
|
private registerSettings;
|
|
81
|
-
/**
|
|
82
|
-
private
|
|
83
|
-
/**
|
|
84
|
-
private
|
|
85
|
-
/**
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
*
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
|
|
94
|
-
|
|
103
|
+
/** 卸载时中止在飞运行并关闭已打开的领域(Domain 句柄由调用方持有并按 effect 回收)。 */
|
|
104
|
+
private registerStorageCleanup;
|
|
105
|
+
/** 依据当前 resolved 配置重建运行日志(workspaceDir / 保留期变更时随之重建)。 */
|
|
106
|
+
private rebuildRunStore;
|
|
107
|
+
/** 列举全部工作流摘要(id + 名称 + 描述 + 节点数 + 输入键;按 id 升序)。 */
|
|
108
|
+
listFlows(): Promise<FlowSummary[]>;
|
|
109
|
+
/** 列举历史运行摘要(按 updatedAt 倒序,来自插件自持运行日志;支持按会话/工作流过滤,含归属标签)。
|
|
110
|
+
* @param request - 可选过滤:发起会话与工作流(两个条件可同时使用)。 */
|
|
111
|
+
listRuns(request: WorkflowListRunsRequest): Promise<RunSummary[]>;
|
|
112
|
+
/** 按 id 读取工作流文档(不存在或未组合 storageDomain 时返回 null)。 */
|
|
113
|
+
loadFlow(flowId: string): Promise<WorkflowDefinition | null>;
|
|
114
|
+
/** 按 id 保存工作流文档(domain 打开时落盘,否则仅返回原样;失败大声抛出)。 */
|
|
115
|
+
saveFlow(flowId: string, flow: WorkflowDefinition): Promise<WorkflowDefinition>;
|
|
116
|
+
/** 按 id 删除工作流。 */
|
|
117
|
+
deleteFlow(flowId: string): Promise<{
|
|
118
|
+
deleted: boolean;
|
|
119
|
+
}>;
|
|
120
|
+
/** 列出可运行脚本清单(展示名/描述/参数/产物装配规则;playwright-ag 为准,缺失时返回空)。 */
|
|
121
|
+
listScripts(): Promise<ScriptInfo[]>;
|
|
122
|
+
/** 列出实时 LLM 模型路由(llm/vision/agent 节点的 provider 下拉)。 */
|
|
123
|
+
listLlmRoutes(): WorkflowListLlmRoutesResult;
|
|
124
|
+
/** 列出某实时模型路由上的模型目录(llm/vision/agent 节点的 model 下拉)。 */
|
|
125
|
+
listRouteModels(request: WorkflowListRouteModelsRequest): Promise<WorkflowListRouteModelsResult>;
|
|
126
|
+
/**
|
|
127
|
+
* 启动一次工作流运行(@Remote,画布触发):按层级并发执行 表单→脚本→审批,审批经画布 approveRun/cancelRun 放行。
|
|
128
|
+
* 返回 runId 即返回,进度经 runState 轮询;校验失败抛 invalid-flow(含诊断项)。
|
|
129
|
+
* sessionId 用于把产物落到「当前会话工作区」(缺省回退配置 workspaceDir)。
|
|
130
|
+
*/
|
|
131
|
+
runFlow(request: {
|
|
132
|
+
flow: FlowGraph;
|
|
133
|
+
workflowId?: string;
|
|
134
|
+
name?: string;
|
|
135
|
+
sessionId?: string;
|
|
136
|
+
}): Promise<{
|
|
137
|
+
runId: string;
|
|
138
|
+
}>;
|
|
139
|
+
/** 解析本次运行应写入的工作区根目录:优先触发会话的 header.cwd,否则配置 workspaceDir 兜底。 */
|
|
140
|
+
private resolveWorkspaceRoot;
|
|
141
|
+
/**
|
|
142
|
+
* 启动一次运行并返回结算句柄(宿主内部,供 @Remote runFlow 与模型工具共用)。
|
|
143
|
+
* @param flow 画布(本方法负责校验)。
|
|
144
|
+
* @param waitApproval 审批等待器工厂 (runtime, step, options) => Promise<string>(返回选中的选项标签)。
|
|
145
|
+
* @param runContext 运行归属与触发方:workflowId/name/sessionId 是运行记录归属标签;
|
|
146
|
+
* workspaceRoot 是产物根目录(缺省配置 workspaceDir);有 parent 且部署有 subagents 时
|
|
147
|
+
* AI 智能体节点才可用;recordSession 存在时把 auto-flow/* 运行事实追加为会话事件(会话进度);
|
|
148
|
+
* depth 是调用工作流节点的嵌套深度。
|
|
149
|
+
*/
|
|
150
|
+
private startRun;
|
|
151
|
+
/** 画布审批等待器:挂起直至 approveRun/cancelRun 放行;30 分钟无人处理则自动取消。 */
|
|
152
|
+
private canvasWaitApproval;
|
|
153
|
+
/** 审批提问等待器:经 userQuestions 交互卡片让用户选择;无交互 UI 时回退画布审批。 */
|
|
154
|
+
private chatWaitApproval;
|
|
155
|
+
/**
|
|
156
|
+
* 调用工作流节点(硬→硬复用)的嵌套运行:加载目标工作流、合并 args、复用本运行的
|
|
157
|
+
* parent/session/signal 再跑一次 startRun,并把其 Output 值作为节点结果回灌。
|
|
158
|
+
* @param workflowId 目标工作流 id。
|
|
159
|
+
* @param args 覆盖目标工作流表单默认值的运行参数。
|
|
160
|
+
* @param parent 外层运行的父代理(审批卡片与会话归属用)。
|
|
161
|
+
* @param recordSession 外层运行的会话记录目标(嵌套进度追加到同一会话)。
|
|
162
|
+
* @param signal 外层运行的取消信号(取消外层即中止嵌套运行)。
|
|
163
|
+
* @param depth 当前嵌套深度(0 = 顶层);达到上限即拒绝,防无限递归。
|
|
164
|
+
*/
|
|
165
|
+
private runNestedWorkflow;
|
|
166
|
+
/** 画布场景的嵌套审批上抛:把嵌套运行加入根运行的上抛队列,画布经根 runId 即可看到/操作它。 */
|
|
167
|
+
private delegatedCanvasWaitApproval;
|
|
168
|
+
/** 供模型工具:按 flowId 加载并运行,args 覆盖表单默认值,等待完成返回结算结果。
|
|
169
|
+
* 同时把最近一条用户消息的图片/文本补填进缺失的 image/task 输入(会话上下文注入)。 */
|
|
170
|
+
runForAgent(flowId: string, args: Record<string, FlowDataValue>, agent: unknown, signal?: AbortSignal): Promise<RunOutcome>;
|
|
171
|
+
/** 把最近一条用户消息的图片/文本补填进运行参数(image/task);无会话或已显式传入时原样返回。 */
|
|
172
|
+
private resolveSessionRunArgs;
|
|
173
|
+
/** 执行 /workflow 命令:不带参数列出工作流;/workflow <id> [key=value ...] 运行并等待结算。 */
|
|
174
|
+
runWorkflowCommand(invocation: {
|
|
175
|
+
agent: unknown;
|
|
176
|
+
rawInput: string;
|
|
177
|
+
signal: AbortSignal;
|
|
178
|
+
}): Promise<{
|
|
179
|
+
kind: 'success';
|
|
180
|
+
text?: string;
|
|
181
|
+
} | {
|
|
182
|
+
kind: 'error';
|
|
183
|
+
text: string;
|
|
184
|
+
}>;
|
|
185
|
+
/** 把 AI 智能体节点的子任务委托给子代理(LLM + 工具循环),返回最终文本。 */
|
|
186
|
+
private delegateToAgent;
|
|
187
|
+
/** 轮询运行状态(内存权威;未在内存中时读运行日志兜底)。 */
|
|
188
|
+
runState(runId: string): Promise<RunState | null>;
|
|
189
|
+
/** 取消运行:协作式取消,中止在飞的脚本/LLM/shell/HTTP,引擎在下一个步骤边界停下;若正等待审批则放行让引擎退出。
|
|
190
|
+
* 画布面向的根运行取消时会连带取消其整个审批上抛队列中的嵌套运行。 */
|
|
191
|
+
cancelRun(runId: string): Promise<RunState>;
|
|
192
|
+
/** 审批选择:choice = 审批节点的某个选项标签;画布用根 runId 操作时,自动作用于当前待处理的嵌套审批(队首)。 */
|
|
193
|
+
approveRun(runId: string, choice: string): Promise<RunState>;
|
|
95
194
|
/**
|
|
96
|
-
*
|
|
97
|
-
*
|
|
98
|
-
* 不追加自定义会话事件:harness 的 session 持久化读路径会拒绝 `KNOWN_SESSION_EVENT_TYPES`
|
|
99
|
-
* 之外的事件类型(除非信封标记 `ignorable`,而 `Session.append` 无此参数),把插件
|
|
100
|
-
* 自定义事件写进会话日志会导致该会话在重启后无法打开。
|
|
195
|
+
* 解析运行时的「画布可见运行」:若传入的是画布面向的根 runId 且其审批上抛队列非空,
|
|
196
|
+
* 则返回队首待处理的嵌套运行(跳过已不再等待的残留项);否则返回该运行时本身。
|
|
101
197
|
*/
|
|
102
|
-
|
|
103
|
-
/** 返回全部问候记录(内存视图,已由 domain storage 水合)。 */
|
|
104
|
-
list(): Promise<Greeting[]>;
|
|
105
|
-
/** 返回最近一次提交的问候(由域事件监听器维护),首次提交前为 null。 */
|
|
106
|
-
last(): Promise<Greeting | null>;
|
|
198
|
+
private resolveRuntime;
|
|
107
199
|
/**
|
|
108
|
-
*
|
|
109
|
-
*
|
|
110
|
-
*
|
|
111
|
-
* 相比模型工具(@deepseek-ai/dsh-tool-bash)的 shell 面,@Remote 轻执行只能拿到
|
|
112
|
-
* 能映射过来的子集:timeoutMs / stdoutMaxBytes / sandboxPolicy / 后台任务 / 结果保真。
|
|
113
|
-
* 模型工具专属的 seam(shellEnv.collect 需要 ToolExecution、sandbox 升级需要 approval
|
|
114
|
-
* + callId、abort 需要 ToolExecution.signal)不适用于 @Remote,此处不做。
|
|
115
|
-
*
|
|
116
|
-
* 注意:@Remote 方法不能带 `agent: Agent` 参数——第三方仓库的 typert 生成器无法解析
|
|
117
|
-
* `agent` lookup(其 wire 类型 SessionId 是 branded 类型,官方 monorepo 内才可用)。
|
|
118
|
-
* 因此沙箱策略退化为「部署默认」(`sandboxPolicy.resolve()` 无 session)。
|
|
119
|
-
*
|
|
120
|
-
* 后台执行不走 ctx.jobs(那是给模型工具 job_output/job_kill 用的,需要 agent owner +
|
|
121
|
-
* dsh-tool-jobs 控制器,@Remote 里拿不到):直接用 `shell.start()` 拿 ShellProcess
|
|
122
|
-
* 句柄,自管在 this.background Map 里,execRead/execKill 直接操作句柄;卸载时统一 kill。
|
|
123
|
-
*
|
|
124
|
-
* shell / sandboxPolicy 是可选依赖:未组合时抛对应 RemoteError,插件其余照常。
|
|
200
|
+
* 从审批上抛队列中取出当前应处理的运行时:
|
|
201
|
+
* - 若传入的是被上抛的嵌套运行时(有反向指针),从根的队列里移除自身并返回自身;
|
|
202
|
+
* - 若传入的是根运行,取出并返回队首嵌套运行,队列为空时返回根自身。
|
|
125
203
|
*/
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
204
|
+
private takePendingApproval;
|
|
205
|
+
/** 清除审批等待超时定时器(放行/驳回/终态时调用)。 */
|
|
206
|
+
private clearApprovalTimer;
|
|
207
|
+
private failRun;
|
|
208
|
+
private persistRun;
|
|
131
209
|
}
|
|
132
210
|
//#endregion
|
|
133
|
-
export { AutoFlowService
|
|
211
|
+
export { AutoFlowService as default };
|
|
134
212
|
//# sourceMappingURL=index.d.ts.map
|