@hy-sde-org dsh-graph-executor
英语| 中文
总结
dsh-graph-executor 是代理图的子操作符执行器适配器。它实现了协调器 AgentGraphExecutor 两个注入接缝的表面:a GraphOperatorWorktreePool (获取/发布一个存储库的工作树租约)和 GraphOperatorChildRunner (每次激活运行一个提供者支持的子节点)。控制存储保持持久的权限—条款和绑定是行,其他所有内容都是派生的。
供应是确定的和幂等的: provisionOperator 派生 graph_operator_lease_<sha256(graphId, workId, provisionFingerprint)[32]> 从供应中获取,因此重试采用相同的租赁密钥,并且 pool.acquire 每个键都是幂等的(设计为进程本地;绑定行是真正的池在重启后查询的持久提示)。当无法获得租约时,该方法返回 undefined 调和者将工作推迟到稍后的驱动。
每个操作符的执行被序列化(一次运行一个子程序),并且每次激活都精确地保存在一个终端记录中:运行者的摘要被截断为16 KiB (truncateUtf8, … 后缀),并作为 AgentGraphRecordSourceEvent (facets: ['message', 'terminal'])通过 recordSink;没有发出摘要的失败运行 [operator failed] <message>. 一个孩子的失败永远不会抛起 runClaimedAgentGraphIntent —记录为观察通道。
这个包不提供任何工具、提示符或插件行——流层协调器和管理器工具会使用它。
目录表
使用这个包
import { GraphControlStore } from '@hy-sde-org/dsh-graph-control'
import { AgentGraphCoordinator } from '@hy-sde-org/dsh-graph-stream'
import { createGraphOperatorExecutor } from '@hy-sde-org/dsh-graph-executor'
const executor = createGraphOperatorExecutor({
store,
pool: worktreePool, // GraphOperatorWorktreePool over the git worktree engine
childRunner: childRunner, // GraphOperatorChildRunner over the subagent runtime
recordSink: recordSink, // commits AgentGraphRecordSourceEvent rows
newId,
})
const coordinator = new AgentGraphCoordinator(graphId, {
store,
executor,
recordSource,
newId,
maxNewActivations: 4,
})
理解实现
Provision:租赁键、绑定、持久行
provisionKey(request) 散列 { graphId, workId, provisionFingerprint } 与 stableHash32,因此同一供应的重试会重用一个租约键。 provisionOperator 然后获得租赁(或采用租赁),坚持下去 bindOperatorWorktree({ graphId, workId, provisionId, leaseId, path, repoRoot, boundAt }),最后通过存储提交供应行——与控制存储已经拥有的具有修订条件、闭包阻塞的写相同。获取失败返回 undefined;如果没有租约,永远不会写入绑定行。拒绝用不同的租约id重新绑定相同的条文(binding-conflict),因此一个provision只拥有一个工作树。
运行:admission、serialization和settlement
runClaimedAgentGraphIntent 在每个操作符承诺链上排队激活,因此一个操作符永远不会同时运行两个子节点。在队列内,它首先求值 admitExecution (序列化后修订门),并在返回时中止 cancelled;然后解析操作符的绑定——通过 ${graphId}:${workId} 当意图的准备id命名供应工作(动态操作符)时索引,或者通过供应的 operatorId 对于以作业者为目标的作业,它重新运行已配置的作业者,并以 { sessionId, instructions, workspace: binding.path, runId, labels, abortSignal }. concurrencyHint 可选地限制跨操作符并发运行的子启动。
孩子安顿下来后,一 AgentGraphRecordSourceEvent 是建(runtimeEventId 从 newId, seq 1、索赔 targetRunId(删节摘要)并交给 recordSink;被折叠的 AgentGraphRecord 也返回。 recordSink 故障传播——终端记录是阻止协调器重新调度相同声明的提交点。
控件存储中的绑定
控制存储区获得了一个权威表, operator_bindings (行键 provisionId),带派生词 ${graphId}:${workId} 索引在打开时重建。方法: bindOperatorWorktree (幂等相同-租约重新绑定保留原始 boundAt;异租约重新绑定抛出 binding-conflict), readOperatorBinding, readOperatorBindingByWork, listOperatorBindings(graphId?).
进一步的探索
@hy-sde-org/dsh-graph-control:存储行(条款、绑定)及其持久性契约。@hy-sde-org/dsh-graph-stream:AgentGraphExecutor,记录折叠readCommittedAgentGraphProjection),stableHash32,truncateUtf8.- 马卡参考:
git-worktree-child-executor.ts(租赁标识、确定性路径、在终端运行中幸存的工作树)和session-manager.ts(runClaimedAgentGraphIntent)。 tests/graph-executor.spec.ts:假的游泳池/跑步机加上一个真正的sqlite后台商店。
模型经验
没有面向模型的表面。包是主机端机器:它不呈现提示(流层呈现),它记录的终端摘要是主管工具呈现的内容。
已知的限制和延迟的工作
- 租赁等幂是进程本地的:真正的池实现在通过匹配重新启动后采用先前租用的工作树
listWorktrees;这里没有从存储绑定重新派生租约(绑定是持久提示,而不是租约授权)。 - 工作树有意在终端运行中存活(Maka合同);执行人永远不会解除租约。池释放是为主机程序集拆图而连接的。
recordSink失败作为执行失败传播——协调程序报告它们,主机重试;还没有崩溃一致的终端事件日志。runClaimedAgentGraphIntent注意到ssh -graph-stream README文档(provisionOperator可能会返回undefined); 这个AgentGraphExecutor输入dsh-graph-stream的src/types.ts仍然声明一个非可选条款结果,并期望在集成上排队。