
Archon 工作流可视化 Builder从数据层到受控编辑器与连接模式的完整实现解析【免费下载链接】ArchonThe first open-source harness builder for AI coding. Make AI coding deterministic and repeatable.项目地址: https://gitcode.com/GitHub_Trending/archon3/ArchonArchon 的Workflow Builder是 Console 实验区中一个可视化工作流编辑器它把 Archon 引擎的八种节点变体prompt、command、bash、script、loop、approval、wait、cancel以画布 检查器的方式呈现并支持与后端 API 的完整 CRUD 连接。本文基于 builder/README.md 及其源码从分层架构、变体注册表、往返round-trip契约、when 语法、校验管线、受控组件设计到连接模式保存/重命名/删除/导航守卫逐层拆解读完你可以理解该 Builder 如何在纯函数、零新增依赖、可独立审查的约束下完成从 wire 定义到可视化编辑再到写回文件的完整闭环。背景从独立 Studio 到 Console 集成Builder 的前身是独立的archon-workflow-studio后作为 Archon Studio 集成的一部分移植进 Console 实验区。整个迁移分三个 PR 渐进落地每层职责边界清晰PR-1数据层补齐生产 Builder 无法表示的四种节点变体 ——loop、approval、cancel、script与既有三种prompt、bash、command一起通过纯函数校验与类型化 fixtures 实现可往返round-trip转换。注意这里wait也在八个变体之列最终共八个变体。PR-2可视编辑器基于 React-Flow 的画布、自定义节点渲染、节点面板palette、检查器含when:构建器、校验面板、只读语法高亮 YAML 预览以及编辑器打磨功能undo/redo、多选、复制粘贴、对齐/分布、自动布局、智能参考线、网格吸附、键位帮助。编辑器以受控组件BuilderPage形式渲染由内存中的BuilderWorkflow驱动。PR-3连接模式接入loadWorkflow/saveWorkflow/deleteWorkflow/validateWorkflow技能动词、:name路由参数、项目选择器、显式保存流程含脏状态指示与导航守卫、服务端校验结果上屏以及完整 CRUD —— 内置bundled工作流只读打开另存为项目覆盖。BuilderPage始终保持受控组件定位通过initialWorkflow: BuilderWorkflow属性接收工作流通过onChange上报编辑。PR-3 对它的唯一增量是可选属性extraIssues?: Issue[]导入问题与服务端问题合并进面板。所有服务端 I/O、脏状态/导航逻辑、CRUD 都集中在BuilderConnected与connect/*中。目录结构与分层依赖方向Builder 模块的物理布局builder/本身就体现了分层约束builder/ ├── types/ # BuilderNode / BuilderWorkflow / VariantData / Issue / When AST │ # wire.ts: 唯一接触 /lib/api.generated 的 type-only 触点 ├── variants/ # 字段划分、变体检测、能力标记、per-variant fromDag/toDag/defaults 与注册表 ├── validation/ # 纯函数规则when-grammar、graph、structural、content │ # validate.ts 编排器仅客户端层级 ├── model/ # fromWorkflowDefinition / toWorkflowDefinition往返 ├── fixtures/ # 类型化 wire-definition fixtures创作时即稀疏 ├── flow/ # PR-2BuilderWorkflow ↔ xyflow 桥 本地 dagre 布局 │ # position 仅是 UI 状态从不序列化到 wire ├── yaml/ # PR-2手写 serializeToYaml纯函数、无 DOM、golden 测试 ├── editor/ # PR-2纯编辑器内核 —— historyundo/redo约 400ms 合并、 │ # clipboard 信封、align/distribute、智能参考线吸附数学、reducerstate.ts ├── components/ # PR-2canvas、node view、palette、inspector含 per-variant 子表单、 │ # WhenBuilder、IssueList、YamlPreview、Toolbar ├── BuilderPage.tsx # PR-2受控装配 PR-3 的 extraIssues 属性 ├── BuilderConnected.tsx # PR-3连接 /console/builder[/:name] 路由 ├── connect/ # PR-3纯 save/rename/issue 逻辑 选中项目 hook └── **/*.test.ts # bun:test 单元测试仅纯逻辑 —— 无 DOM、无 mock.module依赖方向严格单向见 README.md 中的依赖图PR-1: types/ variants/ validation/ model/ fixtures/ ↑ ↑ ↑ ↑ ↑ PR-2: flow/ yaml/ editor/ 纯PR-1 xyflow/dagre ↑ components/ Reactflow/yaml/editor PR-1 ↑ BuilderPage.tsx 受控装配initialWorkflow 属性 ↑ BuilderConnected.tsx PR-3技能动词 store/cache react-router routes/PreviewPage.tsx fixture 支撑的可视化表面PR-1/PR-2 各层从不导入技能动词或store/cache.ts—— 只有BuilderConnected.tsx与connect/*PR-3 接线会导入。每个模块都能独立编译天然可独立审查。三条铁律隔离守卫、无日志、纯 TypeScript 无新依赖Builder 继承自 Console spike 的家规README.md这也是理解全部代码风格的前提隔离守卫不导入/components、/contexts、/hooks、/routes、/stores不做命名导入/lib/api不用tanstack/react-query。与生成式 wire 形状的唯一耦合是type-only的/lib/api.generated且必须经 types/wire.ts 收口。该文件是唯一的生成规范触点把components[schemas][DagNode]与WorkflowDefinition分别别名为WireDagNode与WireWorkflowDefinition任何生成规范的漂移都被隔离在这一个文件里。无日志没有console.*没有 logger 模块。错误通过返回值ParseResult、Issue[]上浮 —— 既不抛到控制台也不被吞掉。唯一的例外是importWorkflowDefinition中的console.warn它是为无面板的 fixture 路由提供开发可见性详见下文。纯 TypeScript无新依赖不用zod、不用yaml。wire 形状仅以 type-only 方式来自生成规范校验是手写的纯函数fixtures 是类型化 TS 对象字面量。与引擎 schema 的一致性由往返测试保证而非复制一份运行时 schema。数据模型BuilderNode 的三段式划分BuilderNode把 wire 上的DagNode划分为三段types/variant.tsid—— 节点标识base—— 所有变体共享的基础字段depends_on、when、trigger_rule、model、provider、context、output_format、allowed_tools/denied_tools、idle_timeout、retry、hooks、mcp、skills、agents、effort、maxBudgetUsd、systemPrompt、fallbackModel、betas、sandbox、always_run、persist_session、output_type等即 wire 基础键去掉id与八个互斥模式字段data—— 由variant判别区分的变体专属字段。WireBaseKey是从WireDagNode逐键 Pick 出来的联合类型因此BaseFields与生成规范严格同步在 variants/base-fields.ts 中运行时键列表由一个穷尽的RecordWireBaseKey, true推导 —— 任何一侧漏加键都会编译报错而不是静默造成往返丢失。BuilderNode建模为以variant为判别键的可辨识联合discriminated union因此在switch (node.variant)中node.data能自动收窄到对应形状。节点数据形状一览变体关键数据字段说明promptprompt: string内联提示词commandcommand: string、with?命名命令文件body 即提示词bashbash: string、timeout?Bash 命令timeout仅在 bash/script 上被引擎产生scriptscript: string、runtime: bun\|uv、deps?、timeout?、with?内联代码或命名脚本经 bun/uv 运行loopprompt?/command?二选一、until?、max_iterations: number、fresh_context: boolean、until_bash?、until_field?、interactive?、gate_message?循环节点见下方详细说明approvalmessage: string、capture_response?、on_reject?人工闸门wait共享 wirewaitone-of 联合的可选键等待允许编辑期不完整cancelreason: stringwire 上的cancel是裸字符串builder 包成reason值得注意的细节Loop 的 one-of 约束loop节点恰好有prompt内联每轮提示词与command命名命令文件中的一个镜像引擎 schema 的 one-of 规则检查器的来源切换器在编辑时维持该不变式结构性校验在导出前报告违规而不是让导出猜测。fresh_context恒在场引擎默认false且生成类型要求必填因此往返时原样保留。until为可选自 #2563 起只声明until_bash的循环没有散文prose路径引擎要求二者至少一个结构性校验镜像该规则读处一律容忍undefined。until_field结构化完成通道#2563命名节点output_format中声明的布尔字段为true时结束循环仅loop:支持loop_group无此通道。with不透明透传#2637script/command 的节点级绑定Builder 尚无编辑器但保存时丢弃会静默毁掉工作流的绑定因此原样往返字符串值与指令from引用由内容校验扫描。wait 的编辑期松弛wire 的wait是经校验的 one-of 联合Builder 刻意在操作者切换变体、编辑字段时持有不完整表单结构性校验在序列化前恢复 wire 不变式。变体注册表单一事实来源与类型安全的调度variants/registry.ts 是每个VariantId到其标签、默认工厂、转换函数与能力标记的单一来源供model/往返与 PR-2 的节点面板消费。规范顺序export const VARIANTS: readonly VariantId[] [ prompt, command, bash, script, loop, approval, wait, cancel, ];每个注册项的类型化结构export interface VariantRegistryEntryK extends VariantId { label: string; defaultData: () VariantDataMap[K]; fromDag: (variantSpecific: PartialWireDagNode) VariantDataMap[K]; toDag: (data: VariantDataMap[K]) BuilderDagFragment; capabilities: VariantCapabilities; wireKeys: readonly (keyof WireDagNode)[]; }wireKeys声明该变体的转换器消费哪些 wire 键例如bash是[bash, timeout]script是[script, runtime, deps, timeout]loop/approval/wait/cancel各自只消费对应模式键。导入器对落在该列表之外的键警告并丢弃—— 往返无法携带的字段绝不静默丢失。类型标注为keyof WireDagNode使拼写错误或 wire 字段改名在编译期失败而不是把所有键都静默归类为不支持。由于经注册表索引调用联合类型的toDag在解构后无法关联 data 类型与变体键源码在旁边放了两个调度辅助函数variantDataFromDagfromDag参数类型统一联合调用安全与nodeDataToDag对node.variant做 switch让node.data收窄到匹配的toDag参数类型—— 零any、零强制转换。能力标记variants/capabilities.ts描述各变体与 AI 字段、retry、交互性的关系供编辑器门控 UI 能力镜像引擎运行时语义export const VARIANT_CAPABILITIES: RecordVariantId, VariantCapabilities { prompt: { honorsAiFields: true }, command: { honorsAiFields: true }, loop: { honorsAiFields: true, forbidsRetry: true }, // 引擎拒绝 loop 上的 retry approval: { honorsAiFields: false, requiresInteractive: true }, // 人工闸门须前台运行 wait: { honorsAiFields: false }, bash: { honorsAiFields: false }, script: { honorsAiFields: false }, cancel: { honorsAiFields: false }, };导入/导出与往返契约导入器 fromWorkflowDefinitionmodel/from-workflow.ts 把 wireWorkflowDefinition转成BuilderWorkflow 导入问题列表。每个节点先经partitionNode划分为{ id, base, variantSpecific }再由detectVariantOrNull检测变体通过注册表构建变体数据。无法忠实往返的东西以Issue上浮而不是静默默认化或丢弃节点没有任何模式字段畸形或未来 schema报告structural.variant.unknown错误降级为空 prompt 节点使工作流保持可编辑而非整体导入失败loop 节点同时带prompt与command引擎 schema 拒绝loopFromDag确定性地保留prompt报告被丢弃的commandscript 节点缺runtime引擎要求必填scriptFromDag默认bun保持可编辑但以structural.field.missing错误提示wire 键不在变体wireKeys中以structural.field.unsupported警告字段不支持并被丢弃。importWorkflowDefinition是给有定义但无面板渲染问题列表的调用方fixture 路由、预览页用的 —— 导入降级必须至少在控制台可见因此它console.warn导入问题。PR-3 的实时编辑器路由则把同样的导入问题送进校验面板。导出器 toWorkflowDefinitionmodel/to-workflow.ts 把BuilderWorkflow重组成校验就绪的草稿每个节点拼成{ ...base, ...variantData, id }并稀疏化省略undefined可选字段、丢弃空depends_on使输出与引擎 Zod transform 在对象层面逐字节一致。往返契约往返契约README.md 与 model/round-trip.test.tstoWorkflowDefinition(fromWorkflowDefinition(fixture))对每个 fixture 深度等于fixture。引擎的 Zod transform 产生稀疏节点未定义的选填省略、空depends_on丢弃导出器与之匹配fixtures 创作时即为稀疏因此往返精确。loop.fresh_context恒在场并原样保留。一个重要权衡真实文件的往返是无损但不逐字节一致的 —— model 输出归一化的键顺序因此一次保存可能产生比预期略大但正确的 git diff。脏检测因此基于onChange带来的BuilderWorkflow身份而绝不基于序列化 YAML 字符串比较那会把每次加载都误判为脏。校验管线纯函数规则编排validation/validate.ts 是客户端校验编排器运行即时层级structural与防抖层级graph、content按稳定 idrule path message 的哈希去重export function runValidation(workflow: BuilderWorkflow): Issue[] { const all: Issue[] [ ...validateStructural(workflow), ...validateGraph(workflow), ...validateContent(workflow), ]; const byId new Mapstring, Issue(); for (const issue of all) if (!byId.has(issue.id)) byId.set(issue.id, issue); return [...byId.values()]; }structuralstructural.ts结构规则如 loop 的 prompt/command 二选一、script 的runtime必填等graphgraph.ts图结构规则依赖、环、悬空引用等contentcontent.ts内容规则含with绑定扫描。server问题源类型在 PR-1 已存在但未被使用PR-3 才接线。Issue的稳定 id 使客户端、导入与服务端/保存问题能在面板中安全去重。when: 表达式语法与引擎共用的纯解析器when:是节点条件执行的核心语法。Builder 的 validation/when-grammar.ts 是纯解析器/格式化器镜像引擎的单原子解析器WHEN_ATOM_PATTERN与 when-atom.ts 的parseWhenAtom保证 Builder 与运行时对什么能解析看法一致。语法每个原子引用形式$nodeId.output[.field] op rhs规范写法、$nodeId.field op rhs简写等价于$node.output.field或$INPUTS.name op rhs声明的工作流输入rhs单引号字符串字面量或裸数字/布尔true/false||连接 OR 子句外层、低优先级连接子句内原子内层、高优先级六个操作符 ! 不支持括号。archon/web绝不能导入archon/workflows服务端包因此语法是复制而非共享但 scripts/node-ref-parity.test.ts 用同一语料同时运行两个解析器并比较该 pattern 编译后的.source与引擎的复制品无法静默漂移。实现细节值得展开ATOM_PATTERN的正则顺序先是$INPUTS.name输入分支再是$nodeId.segment.segment节点分支。输入分支在前使$INPUTS.mode绑定到输入作用域$INPUTS.a.b会失败输入分支输入名不能带子字段并回溯到节点分支在那里parseAtom显式拒绝保留字 id —— 与引擎行为完全一致。INPUTS是保留作用域名引擎的WHEN_INPUTS_SCOPE引擎节点 schema 直接拒绝它作为节点 id因此绑定到输入作用域不会遮蔽真实节点。路径解析$node.output→ 裸输出引用无字段$node.output.field→ 输出字段访问$node.field→ 简写。简写形式不能携带子字段引擎 fail-closed 拒绝parseAtom会给出明确错误。解析返回 DNF AST外层 OR、内层 AND 组parse在第一个畸形原子即失败fail-closedformat把 AST 格式化回 wire 字符串 —— 裸拼写仅对数字/布尔 RHS 有效其余一律加引号防止手工构造的 AST 格式化出不可解析表达式空 AND 组被丢弃无剩余原子的 AST 格式化为undefined无条件绝不写出空字符串那会写入不可解析的when: 。字符串拆分器splitOutsideQuotes只在单引号区域外切分分隔符。受控装配 BuilderPagereducer、防抖校验与编辑器内核BuilderPage.tsx 是可视编辑器的受控装配以initialWorkflow属性接收工作流、以onChange上报编辑 ——无技能调用、无路由参数、无store/cache.ts。这个接缝让 PR-2 可独立审查、可独立回滚。核心机制编辑器状态工作流 position 选中 history clipboard住在 editor/state.ts 的 reducer 中本文件负责接线 canvas、palette、inspector、校验面板、YAML 预览、工具栏与键位。校验防抖编辑后 300msVALIDATION_DEBOUNCE_MS重新运行runValidation。onChange 上报useRef记录上次已上报的工作流只在变化时回调 —— 注释特别说明React StrictMode 会双重调用 effect 且 ref 保留一次性跳过守卫会导致重跑时误发onChange(initialWorkflow)。选中边高亮覆盖 xyflow.selectedCSS 无法赢过内联style.stroke的问题 —— 选中边展开e.style保留条件边的虚线同时换入var(--accent)强调色。选中漂移受控模式下 xyflow 唯一的选择通道是逐元素 deltareducer 合并之apply-selection的 no-op 守卫防止渲染抖动回调无 stale-state 依赖因此稳定避免useKeymap重注册清空进行中的 chord 缓冲。对齐/分布使用实测尺寸measuredSizes从画布读取node.measured让 align/distribute 与智能参考线吸附共用同一几何常量仅作兜底。编辑器内核editor/history.tsundo/redo约 400ms 合并窗口 —— 动作以墙钟时间戳at打标窗口内同类动作合并clipboard.ts剪贴板信封复制时重映射 id/边align.ts 与 smart-guides.ts对齐/分布内核与吸附数学keymap.ts复用 Console 的lib/keymap.ts无修饰键、vim 风格。键位README.mdu/U撤销/重做、y/x/P复制/剪切/粘贴、a全选、A自动布局、f适配视图、g-和弦做对齐/分布p、?、,仍归 ConsoleApp 级键位所有。节点颜色 tokenPR-2 在 console 的theme.css中新增两个作用域 token ——--node-script与--node-cancel补齐八个变体的色带其余六个继承生产:root位于index.css。按品牌基础规则未来若提升到生产调色板必须同时更新 token 源与品牌指南。position 是纯 UI 状态wireDagNode没有 position 字段画布 position 只活在编辑器状态里由flowToBuilder剥离保持 PR-1 往返逐字节一致。builderToFlowflow/to-flow.ts负责 BuilderWorkflow ↔ xyflow 桥flow/layout.ts 提供本地 dagre 布局。YAML 预览手写序列化器与无 DOM 测试yaml/serialize.ts 是手写、零依赖的 YAML 序列化器供实时预览面板使用。它从生产YamlCodeView.tsx模式移植多行字符串用 block scalar、歧义标量加引号、两空格缩进并泛化使八个变体发射的所有 wire 键 —— 包括嵌套的loop:/approval:对象与output_formatJSON schema —— 无需逐字段 allowlist 即可序列化。防歧义细节AMBIGUOUS_WORDS覆盖 YAML 1.1 布尔拼写yes/no/on/off加true/false/null/~与nan保证输出在两种 schema 下都保持字符串类型NUMERIC_LIKE覆盖整数/浮点、科学计数法1e5、十六进制0x1A、八进制0o17、.inf/.nan带可选符号多点的1.2.3不是数字保持裸值含:、#、引号、以{/[//*/-//?/!/%//开头或首尾空白的标量一律JSON.stringify加引号多行字符串用|字面 block scalar行缩进与当前键列对齐节点键序固定为id先行再按作者字段序顶层description为空时不输出。该模块纯且无 DOM预览面板只渲染字符串本模块从toWorkflowDefinition输出生产字符串无需 DOM 即可单测。PR-3 连接模式技能动词、项目选择器与保存流程BuilderConnected.tsx 替换 fixture 支撑的BuilderRoute解析:name参数 选中项目cwd经loadWorkflow技能动词加载真实工作流渲染受控BuilderPage再经saveWorkflow持久化编辑含完整 create/rename/delete。内置工作流只读打开Save-as 写项目覆盖。路由/console/builder选择器 打开工作流与/console/builder/:name加载 编辑都挂载到BuilderConnected。路由:name即文件名每次保存强制 in-YAML 的name:等于它const draft { ...toWorkflowDefinition(currentWorkflow), name }使文件名与name:保持同步 —— 一个名字驱动两者。项目选择器工作流按 codebase 的cwd发现/保存因此必须先选项目。选择持久化在archon.console.builderProjectlocalStoragetry/catch 守卫并反映为?projectid搜索参数使深链刷新能恢复 cwd。这是对 Console/p/:projectId路径作用域Runs/Chat 使用的刻意分歧—— Builder 用全局路由 选择器。加载键K.workflow(cwd, name)列表键K.workflows(cwd)。保存流程显式保存 客户端校验runValidation阻塞性 error 门禁保存→服务端校验POST /api/workflows/validate即使无效也返回 HTTP 200 —— 需分支判断valid→PUT然后使工作流与列表缓存失效。脏点dirty dot显示未保存编辑。blockingErrors只取 severity 为error的问题保存被阻时面板给出 Cannot save: fix N blocking error(s) first.。服务端校验的errors[]valid:false逐条映射为source:server问题validationFailureToIssues保证服务端返回valid:false但无errors时至少有一条问题否则 Save/Rename 会无解释地重新启用。导航守卫应用是非数据BrowserRouteruseBlocker不可用因此守卫 beforeunload监听刷新/关标签页 包裹头部自身控件项目切换、打开另一个、New的confirmIfDirty。已知限制浏览器 Back 按钮与ProjectRail点击不被拦截数据路由迁移超出 PR-3 范围。内置 只读 → 另存为source bundled时只读打开Save 按钮变为Save as写入项目覆盖服务端对 bundled 删除返回 400因此 bundled 时隐藏 Delete。isReadOnlySource与saveTargetFor把参数放宽为string#2578 的WorkflowSource | (string {})未识别 source 落到project—— 最宽松的解释issue 中明确辩护。保存成功后setSourceOverride(saved.source)使保存后可翻转 bundled → project override。CRUDNew种子一个最小单 prompt 工作流step-1data: { prompt: Describe what this step should do. }经导航 statecreateSeed进入创建模式保存时创建create-on-save保存成功后用replace导航去掉 create-mode seed使工作流按普通项目工作流重新加载启用 Rename/DeleteRenameconnect/save-logic.ts 的planRename做碰撞守卫非法名 / no-op / 已存在执行先新后旧new-then-old失败的删除只留新文件权威并作为非致命 warning issue 上浮经导航 statenotices传入新路由名称合法性校验isValidWorkflowName精确镜像服务端isValidCommandName—— 只拒绝含/、\、..、空名或以.开头名中间的点a.b允许因为服务端接受它们Delete确认 → 删除 → 导航离开HttpErrorerrorDetail/serverErrorToIssues把失败映射成source:server面板问题 —— 注意HttpError.bodySnippet是 200 字符封顶的服务端 body可能被截断、追加...因此JSON.parse可能抛错须守卫并回退原始片段。编辑状态生命周期编辑状态currentWorkflow/dirty/serverIssues/sourceOverride只在编辑器身份变化时重置一次editorKey ${cwd}:${name}:${isCreateMode}成功保存会失效工作流缓存 → 重新运行加载器 → 为同一工作流产生新的imported若在该 refetch 上重置会清掉实时编辑并在 Save 解析与 refetch 落地之间的窗口静默清除dirty。BuilderPage以同一editorKey为 key 同步重挂载。错误状态区分将真正的 404工作流不存在 → 提示 New与其他加载失败500/403/网络分开 —— 后者绝不能伪装成未找到那会误导并邀请用户通过 Create a new workflow 创建重复文件。列表加载失败也上浮为错误横幅而不是伪装成无项目/无工作流空态。测试策略纯逻辑优先无 DOMweb 包没有 DOM 测试环境这一点保持不变README.mdflow 映射、YAML 序列化、history 合并、剪贴板重映射、对齐内核、智能参考线吸附数学 —— 全部是bun:test下的纯函数可视化表面经/console/_previewfixture 切换器加 PR 截图验证无mock.module、无 happy-dom、无testing-library/*、无 web 本地bunfig.toml。测试覆盖要点round-trip.test.ts往返深度相等、serialize.test.tsgolden 测试、when-grammar.test.ts解析/格式化、graph.test.ts/structural.test.ts/content.test.ts各校验层级、validate.test.ts编排与去重、save-logic.test.ts纯保存/重命名逻辑、flow.test.ts桥接、editor/*.test.ts内核以及scripts/node-ref-parity.test.ts的跨包 when 语法一致性。fixturesfixtures/覆盖loop、approval、cancel、script、mixed类型化 TS 对象字面量。已知限制延后项timeout是变体专属bash/script不是基础字段扁平化的生成DagNode虽在顶层携带它但引擎 transform 只在 bash 与 script 节点上发射timeout因此其他变体上的timeout不是引擎可产生的 wire 输入被丢弃带导入警告而非携带。子目录限制GET /api/workflows/:name不递归.archon/workflows/subdir/子文件夹工作流无法经单名路由加载呈现未找到空态提供 New。导航守卫盲区浏览器 Back 按钮与ProjectRail点击不被拦截数据路由迁移超出范围。早期生成类型漂移persist_session、output_type、工作流级persist_sessions/requires缺失于规范已通过重新生成api.generated.d.ts解决这些字段现在逐字往返。小结Archon 的 Workflow Builder 是一个在严格工程约束下成长的编辑器数据层PR-1用类型化注册表与纯函数校验保证 wire 往返精确可视层PR-2用受控组件 纯编辑器内核实现画布编辑连接层PR-3以技能动词与路由接缝接入真实 CRUD。三层之间的依赖方向单向、接缝明确initialWorkflow/onChange属性、extraIssues扩展点每个模块可独立编译、独立测试、独立审查 —— 这是可独立回滚的渐进式集成的一个完整范例。相关实现可继续阅读 BuilderPage.tsx、BuilderConnected.tsx、types/variant.ts、validation/when-grammar.ts 与 connect/save-logic.ts。【免费下载链接】ArchonThe first open-source harness builder for AI coding. Make AI coding deterministic and repeatable.项目地址: https://gitcode.com/GitHub_Trending/archon3/Archon创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考