Ekko Studio DSH 配置复用与插件接入实施契约:从技术决定到可复现验收

发布时间:2026/9/23 19:15:28
Ekko Studio DSH 配置复用与插件接入实施契约:从技术决定到可复现验收 Ekko Studio DSH 配置复用与插件接入实施契约从技术决定到可复现验收【免费下载链接】hermes-studioEkko Studio is a local-first AI workspace for multi-agent chat, coding, and visual workflows, available on desktop and the web.项目地址: https://gitcode.com/gh_mirrors/he/hermes-studio导读本文围绕 hermes-studioEkko Studio中复用官方 DSH Web 配置Profile、Agent 预设、插件、Skills并接入单聊、群聊、工作流这一规划主题系统讲解其实施任务与验收契约先梳理本轮收敛的 8 项技术决定与第一版用户路径再逐条展开解析/API 契约、进程与事件契约、组合快照事务最后给出任务拆分T01–T16、可复现验收场景A01–A15与发布门槛。读完本文你将掌握这套规划文档的完整契约结构、关键 API 与错误码约定以及如何结合仓库源码ACP 适配器、M0 真实实验测试验证配置是否被继承、预设是否实际绑定、插件后端是否可运行、浏览器部分是否有可用载体这四个核心问题。该契约是 DSH 配置复用与插件完整接入规划 的实施附件日期为 2026-09-12规划状态 v0.2。它建立在三份互补文档之上主规划定义目标、产品行为与架构当前实现记录描述已交付的局部能力原生预设清单、附加 ACP 包管理与 Web 后端配置/预设用于 ACP兼容性证据记录 T01/T02 首轮后端实验的通过范围。本文中的 API、事件名、错误码及测试文件名均为拟议契约——源码核对不等于运行测试通过这是阅读全文时必须保持的边界意识。1. 本轮收敛的技术决定D01–D08规划将整个接入方案收敛为 8 项技术决定每一项都有明确的依据与状态构成了后续任务拆分与验收场景的决策底座ID决定依据与状态D01配置来源与启动入口分离用户可选 Web 来源Studio 启动自有 ACP 组合最小后端组合已通过 M0完整来源转换仍待 M1D02一 owner 一进程一根原生会话不按模型或 Profile 跨 owner 共享进程M0 已证明同进程状态保持生产 owner 接入待 M2D03预设只能在工厂 setup 中 mount子 Agent composeFrom 父组合M0 已验证创建/恢复挂载子 Agent 继承仍待 T06D04默认准备版本固定的 Studio ACP 适配插件官方将来提供等价接口再替换M0 已记录发布 API、MIT 许可及所需补丁生产源码适配仍待实施D05初版不自动继承 Web 浏览器执行能力不自动导入官方会话历史范围确定后端兼容性不能替代浏览器验收D06包修改产生新 revision运行中的实例继续持有旧 revision设计确定不得原地修改活动依赖D07后端完成以输出排空、持久化屏障及 Studio 记录完成为准不以子进程退出为准M0 已证明非销毁式 flush 后强杀可恢复Studio 完成事务仍待 M2D08浏览器优先尝试隔离页面复用官方客户端不直接在 Vue 主页面执行插件首选方案仅 M0-C 实验通过后锁定交付实现这 8 项决定背后是一条硬性要求完整支持需要逐一回答四个问题——配置是否被继承、预设是否实际绑定、插件后端是否可运行、浏览器部分是否有可用载体。UI 和发布说明不得把四个答案压缩成一个兼容 DSH开关这直接决定了后续 API 设计中capabilities必须逐项返回、诊断必须分 scope 的结构。从源码看D03/D04 已具备具体实现锚点官方 ACP 包根出口只有apply、Config、inject、nameAcpSession仅有类型声明而不导出因此 acp-adapter.ts 以构建期补丁方式writeDshAcpAdapter对已发布产物做八处受控替换——包括 new-session 预设选择、预设持久化、预设挂载在工厂 setup 中调用ctx.agentPresets.mount(agentCtx, options.agentPreset)、默认预设选择、恢复预设、turn 持久化屏障ctx.sessions.flush与会话权限策略。每个修改点都校验匹配次数未知版本或内容直接抛出422 DSH_CAPABILITY_UNSUPPORTED并拒绝启动绝不静默降级。2. 第一版边界与用户路径2.1 首次复用 Web 配置的六步路径第一版M1–M3 加无浏览器三入口定义了首次复用 Web 配置的完整用户路径用户进入 DSH 设置选择使用已有配置指定后端机器上的 Home。Studio 只读列出 Profile、预设元数据、插件来源尚未加载的项目标为未验证。用户选 Web Profile 和具体预设。解析报告列出有效工具、Skills/MCP 来源、Studio 覆盖和不支持的能力。执行兼容性验证成功后发布组合 revision缺依赖或预设绑定失败时留在原页并保留选择。创建聊天时固定 source、Profile、preset、模型模式及 revision。首条消息启动对应 owner 的实例。第二条消息复用实例面板明确区分本轮已结束和运行环境仍在运行。第一版有三个明确的不不直接管理官方 Desktop 自有 Profile、不默认修改用户 Home、不自动启用未验证的第三方组合。同时保证现有 ACP 用户无需先迁移或安装插件就能继续聊天——基础 ACP 永远是一条独立可用的兼容路径。2.2 能力处理矩阵不同来源形态在第一版中会被区别对待绝不能笼统标记已启用情况第一版结果后续可用路径基础 ACP无预设使用现有行为和新增多轮能力各自的兼容分支用户可显式迁移到已验证来源已验证 Web 来源 预设 无浏览器要求正常运行同一配置支持群聊与无交互工作流双端包后端已证明可独立工作后端可用浏览器部分显示未启用M4 启用官方兼容载体后端工具必须等待浏览器不发布该不可用工具或调用时返回明确不支持不能无限等待启用已验证浏览器模式后重新建立能力目录第三方包的依赖、表达式或入口无法判定不发布新组合保留报告和旧 revision补充兼容规则或使用其官方运行环境本地只安装普通 npm 依赖显示为依赖不自动冒充插件实例由有效 bundle/patch 明确引用安全边界同步收紧原始 source 内容始终可查看但浏览器代码、完整 settings 和凭据不能通过诊断 API 无筛选返回。这一点在当前实现中落地为凭据不属于公开 revision 内容也不进入普通哈希诊断。3. 解析结果与 API 契约3.1 解析是一份可解释的结果POST /api/coding-agents/dsh/config/resolve只处理登记过的sourceId浏览器不能通过任意路径参数让解析器访问其他 Home。请求参数包括 selection、期望 source revision 和 Studio override revision。响应结构拟议契约如下interface DshResolution { resolutionId: string revisions: DshResolvedRevision // 主规划定义的字段 effectivePresetId: string | null compatibility: ready | unverified | blocked capabilities: { presetBinding: boolean persistentSession: boolean flushBarrier: boolean browserRuntime: boolean } diagnostics: Array{ code: string severity: info | warning | error scope: source | profile | preset | plugin | runtime entryId?: string message: string } effectiveEntries: Array{ entryId: string scopeId: string module: string sourceLayer: string configuredEnabled: boolean | conditional containsBrowserPart: boolean | unknown compatibility: ready | unverified | blocked runtimePhase: string | null } }三条关键语义示例省略敏感配置值不表示所有配置都可通过列表返回runtimePhase: null不等于失败——没有活实例时只有静态配置状态capabilities来自该组合、版本和实例的验证不接受客户端自报。来源变化、插件删除或 override 改动都会使旧 resolution 失效。保存与启动均验证 revision不能显示方案 A 的预览却启动后来变化的方案 B——这是 D06revision 固定在 API 层的强制表达。3.2 保存、安装和错误响应写操作使用If-Match携带目标 revision不匹配返回412要求缺失时返回428。用户保存草稿的目标还要明确为 Studio 覆盖或显式来源写回不能从当前页面猜测。包操作示例{ target: { sourceId: registered-source, sourceProfile: web, writeTarget: studio }, action: install, packageSpec: example/dsh-tools1.2.3, idempotencyKey: client-generated-request-id }服务器将逻辑目标映射到 Studio 管理的 staging Profile该示例不表示直接往用户的profiles/web安装。接受后返回202和 operation ID新增GET /api/coding-agents/dsh/plugin-operations/:operationId查询进度。幂等语义严格同一幂等键和同一请求返回同一 operation同键不同请求返回409。请求重试或网络断开不能重复执行安装。服务器重启后只能依据发布记录恢复 operation 状态不能无条件重新执行包管理命令。稳定错误码契约HTTP稳定错误码示例行为400DSH_SELECTION_INVALID非法 Profile、字段或包 spec执行前拒绝404DSH_SOURCE_NOT_FOUND来源已删除或当前用户不可见不返回其他来源路径409DSH_OPERATION_CONFLICT/DSH_RUNTIME_BUSY同一目标正在修改或运行状态不允许切换412DSH_REVISION_CHANGED外部 Web 或另一个页面已修改来源返回可重新读取的 revision428DSH_REVISION_REQUIRED缺少必需的 If-Match重新读取目标 revision 后提交422DSH_PRESET_UNAVAILABLE/DSH_CAPABILITY_UNSUPPORTED配置格式正确但不能建立请求的能力503DSH_RUNTIME_LIMIT/DSH_DEPENDENCY_UNAVAILABLE资源或 CLI/pnpm 不可用可修复后重试响应还包含retryable和脱敏 diagnosticsUI 不通过英文异常字符串猜错误类型。已有 auth 负责身份认证与资源可见性DSH 服务不另造宽松的旁路。这些错误码并非停留在纸面在 plugins.ts 中可以看到changeNativeDshPlugins对同一 sourceHome 正在运行的操作返回409 DSH_OPERATION_CONFLICTrevision 不匹配返回412 DSH_REVISION_CHANGED包 spec 非法返回400 DSH_SELECTION_INVALIDCLI/pnpm 缺失返回503 DSH_DEPENDENCY_UNAVAILABLE操作失败返回422 DSH_PLUGIN_OPERATION_FAILED——拟议契约与已落地实现保持同一套错误语义。4. 进程、轮次和浏览器事件契约4.1 所有权与并发owner key 由服务器根据现有授权上下文构造至少区分单聊 session、群聊 room/member、工作流 execution/node。配置 revision、工作目录、模型路由是该 owner 实例的固定属性而非跨 owner 复用的理由。并发规则对应 D02相同 owner 的首次启动采用 single-flight两个同时到达的消息不能各自启动进程同一根原生会话最多执行一个主动 prompt其余消息进入现有队列不并行调用 ACP prompt运行时的关闭与启动互斥关闭完成后才发布新的 generation多标签页共用同一服务端实例不各自持有一个 DSH 进程权限撤销后旧页面的实例控制能力失效group/workflow 重试必须区分恢复同一原生历史和重放节点副作用采用现有重试政策不借进程恢复自动重发已完成工具调用。4.2 能力握手标准 ACPinitialize继续按标准处理Studio 插件增加可版本协商的私有能力查询例如_ekko/capabilities返回扩展版本、支持的预设绑定、事件标识、flush 屏障及浏览器通道。方法名是提案不是官方 ACP 已提供的方法。对方返回 method-not-found 时基础 ACP 可继续依赖私有能力的 Web 预设或浏览器模式明确失败不自动降成另一个工具集合。第三方未经声明的字段不能被解释为同一扩展版本。4.3 事件归属与完成顺序新增扩展事件至少携带以下逻辑标识具体字段与原生流事件映射在 M0 验证interface DshEventIdentity { runtimeId: string generation: number nativeSessionId: string sequence: number studioRunId?: string nativeTurnId?: string attemptId?: string pluginId?: string pluginRequestId?: string pageId?: string }studioRunId的绑定由服务器建立。只有 session、generation 和本轮映射均匹配的事件进入聊天增量插件后台事件、子 Agent 事件和浏览器状态走独立通道。现有流式扩展只有 session/attempt 等部分信息多轮重构必须升级协议不能假设当前格式已经解决跨轮归属。一轮完成顺序原生 prompt 结算 → 该轮 ACP/扩展输出排空到确定的事件序号 → 非销毁式原生持久化屏障 → Studio 历史与可用用量结算 → 至多一次 run.completed / run.failed → owner 回到空闲并接收下一条队列消息output 排空与屏障不能仅靠等待固定毫秒数实现。将失败尝试的 live prefix 与最终持久化消息区分模型重试、取消或最终内容修正时最终历史不能重复累加旧尝试UI 可保留尝试状态但不得把它当成新的已完成回复。重新订阅插件通道先读取带序号的状态快照再接续事件发现序号缺口时重新读取快照不从任意日志重放副作用。刷新页面不会重新执行cordis_run——这与主规划恢复日志不等于恢复内存中的插件一脉相承。M0 实验还揭示了一个具体教训原生插件运行 ID 在重启后可能再次为run-1因此它不能单独作为跨进程事件身份生产协议必须保留规划中的 runtime/generation 并拒绝旧代事件详见 dsh-compatibility-evidence.md。4.4 取消和关闭取消/关闭是生命周期契约中最容易出错的部分规划按触发源定义了完整行为矩阵触发行为是否保留插件内存用户点聊天停止取消本轮等待原生回到空闲结算一次取消结果原生可正常结算时保留本轮模型报错等待输出排空报告本轮失败验证会话仍可继续原生会话健康时保留取消无响应或协议损坏标记实例不可复用关闭并终止拥有的进程不保留显示中断用户关闭运行环境取消活动 prompt、关闭 session、EOF、必要时升级终止不保留网页刷新/退出页面解除页面订阅和 page-local client 状态host 内存继续保留Studio 后端退出或桌面关闭触发后端退出关闭所有本后端拥有的实例不保留初始工程超时预算提议握手/创建 60 秒取消等待 10 秒session 关闭 10 秒EOF 后终止宽限 3 秒。这些是可测试的上限不是性能实测数据prompt 不套用普通 60 秒 RPC 超时。实际值在 M0 根据跨平台结果调整并记录不能将超时等同于成功取消。5. 组合快照与更新事务5.1 不能只复制配置发布一个 revision 必须同时固定组合内容、依赖解析版本、预设资源、Studio 适配器版本和必要路径映射并记录缺失或未解析项目包 manifest 不能取代完整的依赖锁定结果。存储与隔离规则仅共享可证明不会被修改的包内容缓存可写 settings、会话、插件状态、日志属于各 owner不将来源 Home、运行目录或含凭据的.env硬链接到共享快照符号链接、路径穿越和 Windows junction 必须在解析最终目标后执行规则不能只检查字符串前缀凭据不属于公开 revision 内容也不进入普通哈希诊断只记录非敏感的凭据版本标识凭据变化如何触发新实例或安全刷新有独立策略——旧实例不能因磁盘快照不可变而无限使用已撤销的凭据。5.2 发布流程校验权限与期望 revision → 登记幂等 operation 并锁定逻辑目标 → 创建 staging执行包操作或配置变更 → 静态解析、依赖验证、必要的显式启动测试 → 再次校验来源 revision → 原子发布新 revision 与 active 指针 → 完成 operation原运行实例继续引用旧 revision任何发布前失败均不改变 active 指针。发布后进程崩溃重启从事务记录恢复已发布不重复安装。维护操作锁超时、半写 manifest、安装子进程遗留和 Windows 文件占用均需要故障注入测试。停止一个操作只能在定义好的边界中止已经发布的操作不能伪称取消成功应创建回退操作。快照 GC 只删除无运行实例、无 operation、无保留恢复引用的旧 revision先回收临时文件再回收历史依赖不能删除用户来源。这一staging → 校验 → 原子发布的模型在 当前实现 中已有落地雏形每次包变更在新的 Studio Home 中安装依赖检查实际安装版本后才发布状态指针CLI 退出成功但没有完成变更也判为失败所有写入位于Studio Home/coding-agents/dsh/plugins不修改原生 DSH Home。6. 任务拆分与依赖T01–T16规划将全部工作拆为 16 个任务按阶段M0–M5组织并给出交付物、依赖与独立验收条件。T01/T02 已完成固定 rc.1、macOS arm64 下的首轮原型与实验见兼容性证据T03–T16 仍待实施。实验完成不等于 M1/M2 生产接入完成主要落点表示代码职责不表示已经分配了子 Agent 或开发人员。任务交付物 / 主要落点依赖独立验收条件T01 / M0-Arc.1 发布包 API 清单、组合差异报告、版本固定 ACP 适配原型DSH services无在工厂 setup 中挂载预设缺 API 时产出明确维护范围不能伪造成功T02 / M0-B同进程两轮、flush 与取消实验真实 CLI fixture无PID/native session 不变第二轮读到第一轮插件状态kill 后已完成历史可恢复T03 / M0-C官方 client loader runner 最小隔离页面实验T01 的有效 host 组合双端插件一次 host.call 成功拒绝后不运行记录必需的 Remotes/slotsT04 / M1source catalog、revision 和迁移字段coding-agents 服务及 Studio repository portT01旧会话默认基础 ACP来源发现不执行插件远程客户端选择后端来源T05 / M1分层 resolver、相对路径锚点、包快照、有效报告T04相同 revision 得到同一组合来源变化使旧预览失效删除文件不会残留T06 / M1preset adapter、Skills/MCP 来源、scoped 多模型约束T01、T05实际模型请求含预设工具/Skills子 Agent 继承同一组合代T07 / M1来源、预设页面与单聊选择T04–T06选项、错误及实际运行一致明确区分静态启用与 live 状态T08 / M2持久连接和每轮请求拆分acp-turn.ts后续模块与 DSH runnerT02、T06首次 initialize 后多轮复用第二轮不被旧通知污染T09 / M2独立的 prompt 完成/关闭、owner 锁、取消及代理寿命T08队列能继续取消后可继续退出只终止本服务拥有的实例T10 / M3plugin operations、staging、事务恢复、包/实例清单T05、T09更新失败保留旧版本活动实例不受卸载或更新原地破坏T11 / M3插件页面、实例配置、来源写回与 revision 冲突 UIT10并发保存给出冲突且保留草稿不修改其他 ProfileT12 / M4私有能力协商、浏览器桥接、隔离页面构建与授权T03、T08–T09主应用凭据不进入插件页面跨 owner 调用被拒绝T13 / M4动态插件面板、允许/拒绝、刷新、更新、停止与错误回传T12双端状态可解释多页面请求只结算一次渲染失败回到同一会话T14 / M5-A群成员与无浏览器工作流接入、导入导出T06、T09–T11execution/member 隔离导出不含本机 Home 和凭据T15 / M5-B明确等待用户的工作流浏览器节点T13、T14等待、超时、取消和恢复均有定义无人值守任务不被默默挂起T16 / 发布兼容表、三平台验证、回退操作、用户文档及其他 Agent 回归对应发布范围内全部任务验收记录可复现未验证功能不打开默认开关建议提交顺序M0 证据与适配决定 → 来源/预设及单聊 → 持续会话 → 原生插件管理 → 无浏览器三入口 → 浏览器运行层与交互三入口。后端首版不必等待 T03、T12、T13、T15但不能宣称已实现它们。7. 可复现验收场景A01–A15每一项验收都要求实施时附测试命令、DSH/平台版本、fixture revision、断言与日志位置。下表是生产发布的完整场景M0 的局部实验结果见证据文件不将整项生产验收标为通过。ID前置条件与动作必须观察到的结果A01Home 中有不同 web/acp patch选择 Web 来源启动 Studio 会话有效设置来自 WebACP 可交互官方 Web 端口没有被占用或关闭A02Web 预设包含只有该预设才有的测试工具和 Skill分别创建/恢复会话两条路径的真实模型输入均包含正确工具及 Skill 内容基础 ACP 不冒出这些能力A03第一轮定义递增计数的 host 插件第二轮调用记录 PID 和 native session同一实例返回递增值初始化只发生一次不通过历史工具重放实现A04第一段模型 SSE 后阻塞最终响应先检查 UI再解除阻塞UI 提前显示增量最终只出现一次文本模型失败重试不把失败尝试写成重复最终回复A05本轮工具执行中点击停止再发消息正常取消时下一轮继续使用同一实例取消超时时明确关闭并提示状态中断A06prompt 返回并通过 flush 屏障后强杀子进程再恢复已完成历史存在插件定义显示中断不自动重放插件代码A07两页面读取同 revision页面 A 保存后页面 B 保存B 收到 412保留草稿active 指针只有 A 的 revisionA08插件升级中模拟 pnpm 失败、服务器退出和发布后退出失败前的 active 可用恢复不重复安装发布后恢复到新 revisionA09浏览器模式关闭时尝试运行必须带 client 的动态插件返回不支持并完成本轮不等待隐藏的允许按钮、不假称浏览器运行成功A10浏览器模式开启允许后交互、刷新、修改版本、停止host/client 状态按各自生命周期变化回调归属正确资源和订阅被清理A11两个页面同时回应一个允许请求再用旧 request ID 重试只结算一次迟到请求无副作用授权不会扩展到其他插件或版本范围A12群成员 A/B 同名插件、不同预设两个工作流 execution 使用同一节点插件状态和消息不串成员/执行结束执行不影响群成员实例A13原生配置含额外模型路由scoped 会话触发子任务或压缩使用明确允许的 Studio 路由或显式失败不借来源凭据自动切换计费渠道A14启动用户自己的 DSH Web再运行/停止 Studio最后退出 Studio用户 Web 仍存活Studio 创建的进程树回收没有残留运行锁或代理授权A15同时运行其他 Coding Agent执行原有恢复、取消、MCP 和输出测试其他 Agent 不进入 DSH 私有协议、Profile 或生命周期分支A02 与 A03 正是 dsh-m0-real.test.ts 中已验证的两条核心断言新建时绑定预设后模型工具目录包含m0_counter且提示含预设 Skill 描述同实例两轮只 initialize 一次、只启动一个进程PID/native session 与插件运行 ID 不变计数为 1、2。A06 的flush 后强杀恢复也已在该测试中通过——prompt 返回后直接 SIGKILL新进程恢复时仍有已完成历史。该测试整体由DSH_M0_REAL1环境变量显式开启属于 opt-in 的真实实验而非默认单元测试。8. 发布门槛与下一步后端首版的必要门槛T01–T02、T04–T11、T14 完成A01–A09、A12–A15 通过其中 A09 验证浏览器关闭时的正确拒绝。浏览器版另外要求 T03、T12–T13 和 A10–A11 通过工作流浏览器节点还需 T15。每个版本发布前均须完成 T16 中适用于该发布范围的兼容记录、平台验证、回退说明和回归检查尚未验证的平台或能力明确标为未支持。版本兼容表必须按实际 DSH 版本 平台 配置来源类型 后端/浏览器能力记录已安装版本高于已验证版本时标成未验证不能仅按 semver 大小认为兼容。缺能力时保留现有基础 ACP不静默伪装完整 Web 支持。性能记录至少包含冷启动、首段延迟、两轮之间等待时间、空闲进程内存、取消与关闭耗时。多轮测试必须断言轮次之间没有 spawn、重复安装或整目录复制模型响应时间单独统计避免误判适配器开销。实例数量上限根据 M0 测量确定并配置化首版不通过无提示淘汰活动插件来维持上限。当前状态截至规划日期T01/T02 首轮实验由 dsh-m0-real.test.ts 和独立锁定的 fixture 提供已证明预设绑定、同进程状态保留、取消后继续及 flush 后强杀恢复下一步进入 T04/T05。尚未验证的完整来源、平台、辅助模型及浏览器能力不据此放行。原有dsh-acp-real.test.ts仍是单轮进程/跨进程恢复基线。证据文件 dsh-compatibility-evidence.md 记录了实际发布 API、最小组合差异、flush 实验和浏览器未验证状态后续证据不通过就保持对应任务待完成不把这份规划自身作为验收成果。9. 结合仓库源码的落地观察规划虽是拟议契约但仓库中已有一批代码与它直接对应可以作为理解契约落地方式的参照ACP 适配层acp-adapter.ts 以DSH_ACP_ADAPTER_REVISION 3标识适配器版本通过writeDshAcpAdapter对官方deepseek-ai/dsh-acp的lib/index.js做八处字符串级受控替换每个修改点校验出现次数不匹配即抛422 DSH_CAPABILITY_UNSUPPORTED并将相对导入改写为绝对模块 URL确保适配器解析的是已安装发布的依赖身份而非 Studio 自身 SDK。MIT 许可随生成文件保留。宿主与命令执行host.ts 封装 DSH 命令发现findCommandPaths区分 Windows 的 npm shim 与 POSIX 裸命令、DSH_HOME解析process.env.DSH_HOME优先否则取 host 提供的 source Home、子进程执行30 万毫秒超时、killOwnedProcessTree清理、stderr 截断采样以及DSH_DEPENDENCY_UNAVAILABLE/DSH_OPERATION_INTERRUPTED/DSH_OPERATION_TIMEOUT等 503 系错误的构造——与第 3.2 节错误码表一一对应。包操作参数校验plugins.ts 只接受packageexact-versionregistry或github:owner/repo#commit7–40 位十六进制两种 spec其余返回400 DSH_SELECTION_INVALID同目标串行操作由runningMap 加AbortController保证对应 409 冲突码与幂等/取消语义。M0 实验 fixturetests/fixtures/dsh-m0/README.md 与 dsh-m0-real.test.ts 展示了可复现实验的完整做法独立 lockfile、SHA-256 上游哈希核对、acp-rc1.patch八处补丁含_ekko/m0/*私有观测方法、回环 Responses SSE 模型服务、临时 Home/workspace以及只证明两个接缝、不声称任意 Web 配置可转换的边界声明。机器可读结果在 evidence/dsh-m0-darwin-arm64.json平台 darwin/arm64、Node v24.16.0、全套deepseek-ai/dsh-*固定 0.1.5-rc.1。综上这份实施契约的价值在于把复用 DSH 配置这个大目标拆成了可逐项验收的小步技术决定定方向用户路径定体验API/错误码定协议进程/事件契约定运行时快照事务定数据安全T01–T16 定任务依赖A01–A15 定验收证据。任何后续实现只要严格对照这套契约推进就能避免实验原型冒充生产功能单平台成功外推全平台浏览器未验证却宣称兼容这三类最容易出现的交付偏差。【免费下载链接】hermes-studioEkko Studio is a local-first AI workspace for multi-agent chat, coding, and visual workflows, available on desktop and the web.项目地址: https://gitcode.com/gh_mirrors/he/hermes-studio创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考