AIDAWORK / SEQUENCE

单条消息全链路沙盘模拟:从回车发送到本机回执与终态核销

独立图页 ↗

按问题找答案

机制说明(SoT)图是辅读 · 结论以说明与证据为准

新人第一站。本页讲 AidaWork 整站怎么跑(三仓归属 → 一轮用户话 → 本机/云端 → 产品包口径 → 信任门 → 失败落点)。图是辅读;结论以 NOTES + evidence 为准。 钉点:Agent 7f2e519936b5 · Desktop 4346d79eb364 · Plugins a33ce3733365。产品口径旁挂见 product-narrative(非 tip 源码事实)。

本页可直接往下读完整机制说明,不需要「演示 / 播放故事」。术语不熟先看 术语表。

先读机制说明,结论以说明与证据为准 · 基于固定代码版本核验 · 部署状态另行确认

机制说明(全文)

整站运行

新人第一站。本页讲 AidaWork 整站怎么跑(三仓归属 → 一轮用户话 → 本机/云端 → 产品包口径 → 信任门 → 失败落点)。图是辅读;结论以 NOTES + evidence 为准。 钉点:Agent 7f2e519936b5 · Desktop 4346d79eb364 · Plugins a33ce3733365。产品口径旁挂见 product-narrative(非 tip 源码事实)。

一句话

用户在 Desktop 说话 → Agent 受理并持有 Run / IX / 账本 → 模型与工具在执行切片里干活;要本机能力时跨回 Desktop Main(PluginHost / LF / LE);Plugins 只供协议、SDK 与不可变包,不持有服务端任务状态。写有没有落地只看账本,不看聊天气泡。

谁拥有什么(三仓)

仓 拥有 不拥有
aida-agent Gateway 受理、控制面、Orchestrator、Run / IX / 效应账本、租户与配额 本机绝对路径、Plugin Worker 进程
aida-desktop Renderer 呈现;Main 本机执行上下文、授权夹、PluginHost、本机回执 Run / IX / 业务效应 SoT(断线只拉投影)
aida-plugins 协议、SDK、不可变插件包与发布 服务端任务状态、租户 SoT

深挖地图:PANORAMA · 拓扑图主题 overview。

一轮用户话怎么走

  1. Desktop Main prepareEnterpriseChatInput 组装输入(本机能力广告 / 可选插件投影 / LF 附件)→ Work IPC 提交 → POST /api/chat。
  2. Gateway 校验与会话绑定 → ChatSubmissionStore.admit 持久受理 direct/routed(忙时进入原会话队列)→ RunExecutionWorker 按原 lease/epoch 领取。执行切片的准备与模型循环仍复用各自驱动,不由 HTTP 连接存活决定。
  3. 工具经 ExecutionHostRouter 分到 Server / LF / Plugin / LE;要人确认时 InteractionKernel 挂起,settle 后 continuation 再跑。
  4. Desktop Main 观察原 Work,并由原本机 owner 执行本机请求和交付回执;Renderer 只呈现。观察断线不取消或重放执行。

五阶段跨仓源码对照速查(Desktop ↔ Agent)

阶段 aida-desktop 核心入口与职责 aida-agent 核心入口与职责 关键持久化 / 权威边界
1. 提交与持久受理 prepareEnterpriseChatInput 组装无路径附件与本机能力广告;RuntimeWorkDelivery.submit 冻结请求写入本地 Outbox chat-routes.ts 校验协议门(v3 / runtime-work-v1);ChatSubmissionStore.admit 持久受理或入会话队列,冻结初始 C0 clientRequestId 幂等;断网恢复先 query 原提交,不盲目重发
2. 领取与路由装配 只读观察,不参与服务端领取 RunExecutionWorker 按租约与公平策略领取;routed 经 CapabilityRouter(11 步管道)→ WorkbenchWorkExecution,direct 经 prepareExecution → orchestrate agent_runs 租约与 claim fence;单会话同一时刻仅一个活跃顶层 Run
3. 模型循环与工具 不直接跑模型循环 driveReActLoop 维护 OwnedRoundProjection、RepeatedToolCallBreaker 熔断与 slimToolResultsForNextRound 上下文裁剪 服务端工具直接完成;本机工具抛 LocalToolSuspendedSignal 将 carrier 置为 suspended
4. 挂起、回执与续办 deliverRuntimeWorkSkill / Local File executor.ts / PluginHost 复核 live 权限并执行,写入 ArtifactRegistry 并回调回执 api-local-file-v4 / api-local-execution-receipts 幂等落账,DurableLocalExecutionWorker 或 resumeOriginalToolRound 续跑;人工交互由 InteractionKernel + InteractionResumeOwnerWorker 推进 绝对路径不出 Main;每次 operationId / workStepRef 仅激活一次续办
5. 观察、水合与终态 runtimeWorkObservation / coldStartHydration 按 controlRevision 水位合成 UI;Stop 由 RuntimeWorkDelivery.stop 绑定 rootRunId 投递 RuntimeWorkObservation 组合 Root/carrier/公开过程;终态事务复核 readConditionalArtifactCompletionInTx SSE 与本地 store 只是投影,旧水位不能覆盖新事实

单条消息全链路 12 跳沙盘模拟(对应视图 message-trace)

以用户在 Desktop 输入 「帮我读取授权夹里的 10月考勤表.xlsx 并生成异常汇总表」 为例,单条消息跨进程与数据库的 12 跳精确状态演进如下:

跳序 发生位置 触发函数 / 接口 关键载荷与状态变更(Identity / DB / Wire)
T1 Desktop Renderer useDesktopSSEChat.sendMessage 生成幂等 clientRequestId,写入 useSubmissionContinuityStore.pending[clientRequestId],乐观插入本地 user/assistant 占位消息
T2 Desktop Main RuntimeWorkIpcCoordinator.submitSubmission prepareEnterpriseChatInput 组装 localFileCapability 与可准备 Skill 目录(不含本机绝对路径);先写 SubmissionObservationJournal
T3 Main → Agent HTTP POST /api/chat 请求头带 X-AIDA-Desktop-Protocol: 3、X-AIDA-Runtime-Protocol: runtime-work-skill-v2 与 Idempotency-Key
T4 Agent Gateway & Router CapabilityRouter.route 11 步路由命中 local_workbench.spreadsheet_ops;resolveRouteFiles 收窄本轮可见文件范围
T5 Agent PG 受理事务 ChatSubmissionStore.admit + bindAdmittedWork 同一事务写 messages(user 行)+ agent_runs(status='pending', original_root_run_id=id, quota_bucket='foreground', 冻结 command_envelope 与 C0 runtimeWorkEffects)
T6 Agent Worker 领取 RunExecutionWorker → WorkbenchWorkExecution.execute claimNextExecutableRun 拿到 RunLease(status='running');authorize 二次复核租户权限与 capability 指纹后进入 driveReActLoop
T7 ReAct Round 0 driveReActLoop → readSkillFile 模型返回 tool-call(readSkillFile);写待办请求并抛 LocalToolSuspendedSignal,事务写 run_checkpoints 并将 carrier 置为 status='suspended',推进 control_revision
T8 Desktop Main 投递 deliverRuntimeWorkSkill 拉取 queryPendingLocalReadRequest,核对 rootRunId / carrierRunId / invocationId / workStepRef,读取本地 SKILL.md 并回传 outcome='succeeded' 回执
T9 ReAct Round 0→1 resumeOriginalToolRound → runSkillScript 核对 6 项签名直接消费回执完成 readSkillFile(不重调 LLM);进入 Round 1 模型调用 runSkillScript,再次写待办并置 status='suspended'
T10 Desktop 本机效应栅栏 LocalEffectContinuationStore + ArtifactRegistry begin(phase='executing') → claimOriginalSkillDispatch(state='issued') → Python 进程树退出且校验输出后写 executionProof(processTreeStopped=true, outputsValidated=true)→ stageReceipt(phase='receipt_pending') → 上送回执(artifactCount=1)→ acknowledge(phase='settled')
T11 ReAct Round 1→2 & 终态 safeProjectionText → finishRuntimeWorkCarrierInTx resumeOriginalToolRound 复跑完成进入 Round 2 生成总结;通过 safeProjectionText 安全投影门禁;终态事务调用 readConditionalArtifactCompletionInTx 复核条件产物与读取证据,将 agent_runs 置为 status='completed'
T12 Agent → Desktop 核销 releaseRespondedChatSubmission Work 观察流收到终态投影与 settlement.status='completed';Main acknowledgeSubmissionObservation 落盘,Renderer 从 useSubmissionContinuityStore.pending 移除 clientRequestId 并展示最终回复与产物卡片

人话六步(控制面 vs 执行面)→ enterprise-tour-narrative。密时序与 fail/ok → enterprise-task-e2e。

本机 / 桌面 vs 云端 Agent

面 在哪 记住
云端 Agent 服务端进程 真相(SoT)、lease、配额、模型循环
桌面 Main 用户机器(交付优先 Windows;Linux/macOS 亦有实现) 绝对路径、Plugin Worker、本机凭证与回执;本地仓是投影
Renderer 同一桌面 只呈现;显示中的状态 ≠ 独立业务权威

交付顺序(产品口径,非 tip):先稳住桌面尤其 Windows,再核 VMS / MSP 路径——见 product-narrative。机制侧桌面边界 → desktop-client · desktop-runtime。

VMS / MSP · Pack × Edition(产品口径)

  • MSP ≠ 单纯多租户。 MSP = 原中台算薪运维等能力装进 AidaWork 交付(算薪运维、复杂考勤、多客户账单)。
  • AidaWork = VMS / MSP 产品包(标准 Pack × 有界 Edition)。
  • 多实例配额 / 租户公平(scaling-roles)是运行扩缩,不是 MSP 产品定义。
  • 技术装配(目录仓库所有、租户订阅)→ agent-config-pipeline;非 VMS 零业务订购收窄 → enterprise-task-e2e ADR-0097 D1-2a。

完整会前口径 → product-narrative。

信任 / 鉴权门(进门就挡)

  1. 身份:Aida JWT → TenantContext;Server session ≠ Desktop session(auth-tenant)。
  2. Desktop 协议 v3:显式不匹配,或缺头却携带本机执行载荷时,返回 426 DESKTOP_UPGRADE_REQUIRED。无头、无本机载荷可进入后续受理;不能只凭过门就断言工具集合。另有 IX 协议门、Runtime Work 协议门。
  3. Path-free LF:绝对路径只在 Main;Agent 只见 relativePath / saveDestinationId。
  4. Plugin:不可变包 + 投影绑定 + 签名校验;Host 在 Desktop Main。安装即信任取代通用逐次确认,但仍检查当前身份、原请求、executor、包完整性和原任务;目录、电脑、连接与文件资源授权各自保留。

总览 → trust-boundaries。

失败落在哪

现象 先看 主题
协议 / 426 不创建 Run;升级客户端 trust-boundaries
工具宿主 fail / timeout singleflight + reconcile,禁盲重试 enterprise-task-e2e fail-host
IX 取消 / 过期 / settle 拒 仅 accepted+resolved 才续跑 enterprise-task-e2e fail-ix
lease 丢失 / 忙 SSE retryable;可能进人工恢复 enterprise-task-e2e / state-authority
配额 / LLM_BUSY 背压,非业务结案 scaling-roles
诊断码总表 码 → 产出面 → 落点 observability-map

总索引 → FAILURE-CHAINS。

读完下一站

  1. enterprise-tour-narrative — 一条任务的控制面 / 权威读法
  2. overview — 三仓全景地图
  3. enterprise-task-e2e — 密时序与 fail/ok
  4. 按需:trust / write-authority / local-file / scaling / observability

单条消息 12-Hop 代码与 SQL 状态微追踪(message-trace)

对应交互图 /topics/site-runtime/message-trace/(analyses/aidawork/site-runtime/message-lifecycle-trace.sequence.json),将一条携带本机 Excel 附件与技能调用的完整消息拆解为 12 个源码与数据库事务跳点:

Hop 跨仓调用链(函数级) 本地 Store / PostgreSQL 事务写放大与状态变迁(BEFORE -> AFTER)
T1 · Renderer 入队与冻结 useDesktopSSEChat.sendMessage → runtimeWorkClient.prepareSubmission → IPC runtime-work:prepare-submission → RuntimeWorkIpcCoordinator.prepareSubmission RuntimeWorkDeliveryStore.prepare(frozen) 将冻结 JSON body 落盘:<commandId>.json phase: null -> 'prepared';submissionTransports.set(key, prepared.transport) 绑定当前身份与传输对象。
T2 · Main 投递与服务端幂等受理 IPC runtime-work:submit-submission → RuntimeWorkDelivery.submit (beginSending) → POST /api/v1/runtime/work/submissions → admitRuntimeWorkSubmission → createRunInTransaction Desktop: phase: 'prepared' -> 'sending'。<br>PG 同一事务: chat_submission_idempotency (INSERT client_request_id, message_digest) → conversations (UPSERT) → messages (INSERT role='user') → agent_runs (INSERT status='pending', runtime_protocol_version='aida.runtime.work.v1', original_root_run_id=id, attempt_epoch=1) → runtime_invocations (INSERT status='pending', invocation_index=0) → run_checkpoints (INSERT status='active', model_boundary_seq=0, model_request_state='idle') → run_projection_events (INSERT seq=1, event_type='run.accepted').
T3 · 200 受理绑定与草稿文件重绑 RuntimeWorkDelivery.submit 收到 DesktopRuntimeWorkAdmission → store.accept(frozen, binding) → bindAcceptedDraftFiles(submitted) Desktop: <commandId>.json phase: 'sending' -> 'accepted',记录 acceptedBinding: { rootRunId, runId, invocationId, conversationId, userMessageId };rebindDraftSelectionSession(draftSessionId, conversationId) 将草稿期选中的本地文件句柄迁入正式会话;Renderer 切换至 observeRuntimeWork(rootRunId)。
T4 · Worker Claim 与 Attempt Fence RuntimeWorkWorker.poll → claimNextPendingRun → beginRuntimeWorkAttempt (lockRoot + lockCarrier) → executeClaimedRun PG 事务: agent_runs status: 'pending' -> 'running', lease_owner, lease_token, lease_expires_at, attempt_epoch: 1;runtime_invocations status: 'pending' -> 'running';后续所有控制面写操作必须通过 assertRuntimeWorkAttemptInTx(tx, claim) 校验 (runId, invocationId, attemptEpoch, leaseToken)。
T5 · 控制面解析与模型请求准入 (Seq 0) resolveAndRun → prepareExecution → rebuildWorkModelContext → admitWorkModelRequestInTx(expectedSeq=0n) PG 事务: FOR UPDATE 锁 run_checkpoints,校验 snapshot.inputMessageId === binding.inputMessageId、checkHistory(binding)(重算 messages 集合的 canonicalJsonSha256 === binding.tailDigest);UPDATE run_checkpoints SET model_boundary_seq=0, current_input_binding=..., accepted_response_ref=NULL, model_request_state='dispatched'。
T6 · Round 0 流式输出与 Response CAS 绑定 streamText → run_projection_events (text-delta, tool-call) → INSERT INTO messages (role='assistant') → bindWorkModelAcceptedResponseInTx(boundarySeq=0n) PG 事务: 先插入 messages (role='assistant', 含 tool-call: runSkillScript),再执行 CAS:UPDATE run_checkpoints SET accepted_response_ref={messageRef, digest}, model_request_state='completed' WHERE model_boundary_seq=0 AND accepted_response_ref IS NULL;UPDATE agent_runs SET iteration_count = iteration_count + 1;若携带 rebuildRef 则写入 runtime_work_model_rebuild_closures。
T7 · 本机工具挂起与 5 表 Join 不变量校验 ExecutionHostRouter 路由 runSkillScript 至 desktop_local → suspendForLocalExecution → suspendRuntimeWorkLocalExecutionInTx PG 同一事务: 1) 写入 pending_interactions (kind='local_tool_result', status='pending') 与 continuation_requests (status='pending', work_root_run_id, work_step_ref='model:0:tool:0', work_effect_ref='execute_script');2) 执行 5 表 Join (run_checkpoints ⋈ runtime_invocations ⋈ messages ⋈ pending_interactions ⋈ continuation_requests FOR SHARE OF p, c),校验 canonicalJsonSha256(m.content) === cp.accepted_response_ref.digest;3) suspendRuntimeWorkCarrierInTx 将 agent_runs.status: 'running' -> 'suspended', error_code='LOCAL_TOOL_SUSPENDED',runtime_invocations.status: 'running' -> 'suspended',run_checkpoints 记入 pending_interaction_id 与 pending_tool_call_id;4) 发射 run_projection_events (tool.local_execution_requested) 并释放 Worker lease。
T8 · Desktop 拉取 Outbox 与本地一次性屏障準備 RuntimeWorkInboxLoop 轮询发现挂起请求 → executeToolRequest → LocalEffectContinuationStore.prepareExecution Desktop: LocalEffectContinuationStore 在 <userData>/local-effect-continuations/ 原子写入记录:phase: null -> 'executing', 绑定 (scopeDigest, interactionId, continuationId, requestDigest)。若发现同名 interactionId 已处于 'RecoveryRequired' 或 'ExecutedPendingAck',直接拦截(绝不二次执行副作用)。
T9 · Workbench 暂存输入、跑 Python 脚本、收集产物 LocalExecutor.runSkillScript → stageSelectedInputFiles → runManagedPython → 扫描 output/ → 上传文件至文件服务 → recordExecuted Desktop: 1) 校验选中句柄授权并在 workDir/inputs/ 下生成相对路径副本(模型与脚本全程不接触宿主机绝对路径);2) 启动受管 Python 执行脚本并收集 output/ 产物;3) LocalEffectContinuationStore.recordExecuted 在网络回传前先把 receiptEnvelope + responseDigest 持久化落盘:phase: 'executing' -> 'executed_pending_ack'。
T10 · 提交签名回执与单事务唤醒 (settleRuntimeWorkSkillReceiptInTx) POST /api/v1/runtime/work/Continuations/:id/receipt → settleInteractionInTransaction + settleRuntimeWorkSkillReceiptInTx PG 同一事务: 1) pending_interactions status: 'pending' -> 'resolved',写入 interaction_receipts;2) 7 表 Join (continuation_requests ⋈ pending_interactions ⋈ agent_runs r ⋈ agent_runs original ⋈ chat_submission_idempotency ⋈ runtime_invocations ⋈ interaction_receipts) 校验 user_id === original_user_id、receipt.requestDigest === payload.requestDigest、originEpoch <= carrier.attempt_epoch;3) recordRuntimeWorkDomainFactInTx 记录领域事实;4) INSERT INTO messages (role='tool', tool_name='runSkillScript', metadata={receiptId});5) continuation_requests.status: 'pending' -> 'completed';6) 唤醒载体:agent_runs.status: 'suspended' -> 'pending', runtime_invocations.status: 'suspended' -> 'pending', run_checkpoints 清空 pending_interaction_id / pending_tool* 并设 resume_point='skill_receipt:<continuationId>'。Desktop: 收到 ACK 后 markAcknowledged (phase -> 'acknowledged')。
T11 · Worker 续跑 Round 1 与模型上下文确定性重建 RuntimeWorkWorker 重新 Claim pending Run (attempt_epoch: 2) → rebuildWorkModelContext → admitWorkModelRequestInTx(expectedSeq=1n) PG 事务: admitWorkModelRequestInTx 检测到上一轮 row.model_request_state === 'completed' 且 expectedSeq === seq + 1n (1n),强制校验 next.tailMessageRefs 前缀与 row.current_input_binding.tailMessageRefs 完全一致,且包含上一轮 accepted_response_ref.messageRef 与新插入的 role='tool' 消息;校验通过后 UPDATE run_checkpoints SET model_boundary_seq=1, model_request_state='dispatched', accepted_response_ref=NULL。
T12 · Round 1 收口、Complete Carrier 与桌面产物上架 streamText 输出最终总结 → bindWorkModelAcceptedResponseInTx(boundarySeq=1n) → completeRuntimeWorkCarrierInTx PG 事务: INSERT INTO messages (role='assistant');run_checkpoints model_request_state: 'dispatched' -> 'completed';completeRuntimeWorkCarrierInTx 将 agent_runs 设为 status='completed', completion_outcome='succeeded', finished_at=clock_timestamp(),runtime_invocations 设为 status='completed', terminal_at=clock_timestamp(),run_checkpoints 设为 status='completed',追加 run_projection_events (run.completed)。Desktop: observeRuntimeWork 消费终态投影,展示最终回复与本地生成文件卡片,释放 sessionRunSlot。

证据与范围

本页为入口叙事,机制主张合成自已核主题;产品 Pack×Edition / MSP 定义来自会前口径(无 code evidence)。钉点源码锚点:

  • aida-desktop · apps/desktop/electron/agent-loop/enterprise-adapter.ts · prepareEnterpriseChatInput · 4346d79eb364
  • aida-agent · packages/agent/src/gateway/orchestrator-runtime.ts · resolveAndRun / prepareExecution · e2adc9a3c325
  • aida-agent · packages/agent/src/execution-host/router.ts · ExecutionHostRouter · e2adc9a3c325
  • aida-desktop · apps/desktop/electron/plugin-host/plugin-host.ts · PluginHost · 4346d79eb364
  • aida-agent · packages/agent/src/session/run-store.ts · UPDATE agent_runs · e2adc9a3c325
  • aida-agent · packages/agent/src/gateway/chat-routes.ts · DESKTOP_UPGRADE_REQUIRED · e2adc9a3c325

实现存在、默认开关、生产启用分别判断。不升 tip 钉;不新造边界几何,主图为理解型 workflow,深挖链到既有视图。

Mermaid 速读路线

责任图、Worker UML 与组件依赖、持久执行时序、条件产物、队列、IX 与 attempt 状态、邮箱分页 · Desktop UML、Stop 时序、artifact 输入、信任边界、提交状态、lease/inbox、产物回执与更新策略。图册随本文直接展示,源代码可展开核对。

按问题找答案

故障与恢复 · 跨仓协议 · 数据生命周期 · 开发改动导航 · 实现与验收。新指南保留已实现、计划、未验证边界,不将手工操作建议视为已执行。

服务端运行 Mermaid 图册

本图册补充原有 Archify 交互视图,按「谁负责 → 如何执行 → 如何结案 → 如何恢复」阅读。基于 2026-10-29 可访问的 GitHub 默认分支快照:Agent 7f2e519936b53035646a70f152e734298abed2fb,Desktop 4346d79eb364b502ef87c0869a494dfed7964419。GitHub 镜像不证明 GitLab 当前 tip 或线上部署;图不代替真实模型、数据库和原生平台验收。

配套:Desktop 实现图册 · 状态权威 · 完整失败链。

图索引

M01 责任与事实归属

这是一张概念责任图,不是部署拓扑。模型循环、持久控制、物理效应和界面展示各有主人。

AidaWork 责任与事实归属

图形正在加载;下方源代码始终可读。

Mermaid 源代码
flowchart TB
  accTitle: AidaWork 责任与事实归属
  accDescr: 用户经 Desktop Main 提交,Agent 持久受理与 Worker 执行;Main 拥有本机事实,界面仅呈现观察结果。
  UI["Renderer:输入与展示"] --> Main["Desktop Main:身份与持久提交"]
  Main --> Gateway["Agent Gateway:校验与受理"]
  Gateway --> PG["PostgreSQL:Root、carrier、claim、回执"]
  PG --> Worker["RunExecutionWorker:领取与驱动"]
  Worker --> Control["Work 共同控制:原身份与 fence"]
  Control --> Model["模型:建议下一步"]
  Model --> Control
  Control --> Server["服务端工具 owner"]
  Control --> Main
  Main --> Local["本机 effect owner:文件、Plugin、Skill"]
  Local -->|"绑定原请求的事实与回执"| PG
  PG -->|"观察水位,不是万能重放日志"| UI

Effect 管理进程内 fiber/Scope;PostgreSQL 与 Work 共同控制拥有领取、终态和恢复事实。runtime_events 不是完整 prompt 或通用恢复日志。Scheduler、Child、Summary、Memory、Title、Quality 也不能一律画成已迁移的统一 Command 路径。

证据:当前运行总则。

M02 一次持久执行与断线观察

持久执行与断线观察时序

图形正在加载;下方源代码始终可读。

Mermaid 源代码
sequenceDiagram
  accTitle: 持久执行与断线观察时序
  accDescr: Gateway 持久受理后 Worker 独立执行,断开观察流不取消或重放工作,本机结果依原请求结算。
  participant Main as Desktop Main
  participant API as Chat Gateway
  participant DB as 持久受理与 PG
  participant W as RunExecutionWorker
  participant C as Work 共同控制
  participant M as 模型
  participant H as 本机 effect owner
  Main->>API: clientRequestId 与当前身份、材料、能力
  API->>DB: admit 原请求或排队
  DB-->>API: Root binding 或 queued receipt
  API-->>Main: 持久受理结果
  W->>DB: 按 lease 与 epoch 领取 carrier
  W->>C: 核验原 Work 与冻结输入
  C->>DB: 预留原模型请求边界
  W->>M: 派发模型请求
  M-->>C: 绑定原 invocation 的结果
  C->>DB: 持久化本机请求并挂起
  DB-->>H: 经交付通道投递原请求
  H->>H: 当前身份、原任务与资源复核
  H->>DB: 经 API 结算原请求回执
  DB-->>W: 结算事实;仅符合原恢复门时可继续
  W->>C: 符合资格并重新领取后推进
  C->>DB: 终态 guard 与 fence 复核
  Main->>API: 重连查询原 Work
  API->>DB: 读取当前 Root 与效果事实
  API-->>Main: 当前观察结果
  Note over Main,DB: 断线不取消、不重发执行;传输协议不选择另一条执行通道

图中 DB→本机 owner 是持久请求经 API/inbox 的逻辑交付,不表示数据库直接连用户机器。带 runtime-work-v1 和不带 Runtime 头的生产 Chat 共用持久受理;旧协议显式拒绝。回执到达不等于必然恢复:Stop、unknown、证据冲突或缺失材料仍可能禁止推进;迟到事实可结算但不能重新激活已停止 Root。具体 lease/inbox 见 Desktop 图册。

证据:共同受理与传输。

M03 条件产物完成判定

下图是 owner 判定步骤,不是新增的 RunStatus。not_applicable 不能单独代表任务完成。

条件产物完成的 owner 判定

图形正在加载;下方源代码始终可读。

Mermaid 源代码
stateDiagram-v2
  accTitle: 条件产物完成的 owner 判定
  accDescr: 精确绑定原 producer 和 scope,基于真实回执核验产物与独立源文件读取,在原终态 fence 内复核。
  state "冻结 producer 与 scope" as Frozen
  state "重建原请求及回执事实" as Facts
  state "保留未完成或拒绝" as Blocked
  state "条件未满足且累计零产物" as NoOutput
  state "已有真实产物" as Produced
  state "验证产物读取" as ArtifactRead
  state "验证独立源材料读取" as SourceRead
  state "满足本条件的完成要求" as Ready
  state "原 claim fence 内再次复核" as Fence
  [*] --> Frozen
  Frozen --> Facts: 原 producer 回执已结算
  Facts --> Blocked: 错绑定、撤销、未结算或冲突
  Facts --> NoOutput: 最新 not_applicable 且累计零产物
  Facts --> Produced: 累计产物存在且最新 produced 或 not_applicable
  Produced --> ArtifactRead
  ArtifactRead --> SourceRead: 全部原 artifactRef 与 hash 已读
  NoOutput --> SourceRead
  SourceRead --> Ready: 不要求独立读取或证据齐全
  Ready --> Fence
  Fence --> Blocked: 当前条件已变化
  Fence --> [*]: 本条件通过,仍服从其他终态门

Agent 从 continuation、interaction receipt、tool message、settlement 和原模型 tool call 重建事实;模型文本、空列表、Worker 自报 success 都不够。Main 还会校验声明、返回列表、实际 committed artifact ID 集合一致。既有 Work 不因升级自动补入新合同。

证据:owner 事实重建与完成公式;终态事务复核。

M04 会话队列的真实状态

以下使用 ConversationTurnQueueStatus 的实际状态值。admitted 只表示队列请求已受理为 Run,不等于业务完成。

会话队列状态

图形正在加载;下方源代码始终可读。

Mermaid 源代码
stateDiagram-v2
  accTitle: 会话队列状态
  accDescr: 身份绑定的加密快照排队,可重试错误在次数预算内保留 queued;受理、取消和失败分别结案。
  [*] --> queued: 保存身份绑定的加密快照
  queued --> queued: 同错误码次数小于 3,持久 retryAfter
  queued --> admitted: 当前准入成功并绑定 runId
  queued --> cancelled: 取消此排队请求
  queued --> failed: 不可重试或同错误码第 3 次失败
  admitted --> [*]
  cancelled --> [*]
  failed --> [*]

可重试失败按错误码计数,前两次分别等待 10 秒、20 秒;第 3 次仍失败则进入 failed。出队会恢复并复核原身份、材料和能力,不能换账号或新建内容来掩盖原请求失败。后台 Root 不占用前台槽位,队列不等于任意后台任务总线。

证据:状态定义;原 queued 快照重试;受理及队列终态。

M05 Interaction 与提交尝试分开

这是 INTERACTION_TRANSITION_RULES 的 合同局部视图,不是把所有 producer 的生产迁移状态都声明完成。运行状态、IX 状态、attempt 状态、业务效应 outcome 不可互换。

Interaction 合同终态

图形正在加载;下方源代码始终可读。

Mermaid 源代码
stateDiagram-v2
  accTitle: Interaction 合同终态
  accDescr: pending 在权威接受后 resolved;普通到期、取消、损坏需无活跃 attempt,权威拒绝后已到期则 expired;刷新另建关联交互。
  [*] --> pending: 原 owner wait 与 outbox 原子建立
  pending --> resolved: authority accepted,同事务写 resume intent
  pending --> expired: 无活跃 attempt 且到期,或权威拒绝时已到期
  pending --> cancelled: 无活跃 attempt,turn cancelled
  pending --> failed: 无活跃 attempt,永久损坏
  pending --> pending: task_scope 且活跃 attempt 时,任务取消请求延后
  resolved --> [*]
  expired --> [*]
  cancelled --> [*]
  failed --> [*]

图中的取消延后仅对应 task_scope 的 task_cancellation_requested,不把任意取消都解释为延后。终态刷新建立 linked interaction,不把原 IX 改回 pending。accepted + resolved 才产生恢复意图;显示了“已发送”不代表恢复成功。

证据:IX 转换与 guard。

M06 Settlement attempt 的不确定结果

这仍是同一合同的局部状态图。checking 是 attempt 状态,IX 保持 pending;超时不表示权威拒绝。

交互提交尝试的核对状态

图形正在加载;下方源代码始终可读。

Mermaid 源代码
stateDiagram-v2
  accTitle: 交互提交尝试的核对状态
  accDescr: 传输失败进入 reconciling,权威结果未知进入 checking;只有原权威回执能接受或拒绝,checking 超时保留原状态。
  [*] --> submitting: 通过 actor、version、deadline 门
  submitting --> reconciling: 可重试交付失败
  reconciling --> reconciling: 原交付仍未确认
  submitting --> checking: 权威结果未知
  reconciling --> checking: 权威结果未知
  checking --> checking: 检查超时,提供恢复入口
  submitting --> accepted: 原权威接受
  reconciling --> accepted: 原权威接受
  checking --> accepted: 原权威接受
  submitting --> rejected: 原权威拒绝
  reconciling --> rejected: 原权威拒绝
  checking --> rejected: 原权威拒绝
  accepted --> [*]
  rejected --> [*]

已拒绝且未过期时,IX 可以仍为 pending;后续重新提交必须是新的 attempt,并再次通过 guard,不能重写旧 attempt。不要用此图宣称 ADR-0098 的 parked-card 产品方案已经实现。

证据:attempt 与 IX 独立状态;提交、核对、接受与拒绝;超时不伪造终态。

M07 邮箱读取的范围与分页

邮箱范围拒绝与 UIDNEXT 回退

图形正在加载;下方源代码始终可读。

Mermaid 源代码
sequenceDiagram
  accTitle: 邮箱范围拒绝与 UIDNEXT 回退
  accDescr: 先核验原 connectionId,越界请求不派发;选定邮箱内校验 UIDVALIDITY,UIDNEXT 缺省时按原游标或末序号 UID 选择搜索窗口。
  participant Tool as 原 Work 工具调用
  participant Scope as Agent 范围门
  participant Conn as 邮箱连接器
  participant IMAP as 原邮箱服务器
  Tool->>Scope: connectionId 与原工具参数
  alt 连接或工具超出原 connectorRead
    Scope-->>Tool: SCOPE_VIOLATION,尚未派发
    Note over Tool,Scope: 不是查询失败,不允许换账号探测
  else 原范围内
    Scope->>Conn: 派发原连接调用
    Conn->>IMAP: readonly 打开 folder
    IMAP-->>Conn: UIDVALIDITY、exists、可选 UIDNEXT
    Conn->>Conn: 校验 mailbox identity 与字段
    alt 空邮箱
      Conn-->>Tool: 空页
    else UIDNEXT 缺省且没有 beforeUid
      Conn->>IMAP: 读取最后 sequence 的 UID
      IMAP-->>Conn: last UID
      Conn->>Conn: upperUid = last UID + 1
    else 有合法 UIDNEXT 或原 beforeUid
      Conn->>Conn: 使用原游标与合法上界
    end
    opt 非空且上界有效
      Conn->>IMAP: 有界 UID 窗口 search 与 fetch
      IMAP-->>Conn: 匹配邮件
      Conn-->>Tool: uidValidity、messages、nextBeforeUid
    end
  end

缺省不等于非法值:非空邮箱提供了错误 UIDNEXT 时仍失败(空邮箱在此检查前直接返回空页);不能把坏数据当“省略了字段”继续。图只说明当前服务端读取路径,不证明 Desktop 未合并的本地邮件归档 PR 已落地或真实账号联调通过。

证据:派发前范围门;邮箱分页与缺省回退。

M08 UML:Worker、配置接口与观测快照

这是 Mermaid classDiagram 表达的 UML 类/接口局部视图,成员只摘录与运行控制有关的部分。RunExecutionWorker 是实际类;两个 Options 和 Snapshot 是 TypeScript interface,不是数据库实体。实线泛化只用于源码明确的 extends;虚线表示参数或返回值依赖,不暗示对象生命周期所有权。

Worker 类与配置接口的 UML 关系

图形正在加载;下方源代码始终可读。

Mermaid 源代码
classDiagram
  accTitle: Worker 类与配置接口的 UML 关系
  accDescr: Worker 接收扩展自 AttemptOptions 的 WorkerOptions,并返回观测 Snapshot;接口扩展不是 Worker 类继承。
  class RunExecutionWorker {
    +start() void
    +tick() Promise
    +snapshot() RunExecutionWorkerSnapshot
  }
  class RunExecutionWorkerOptions {
    <<interface>>
    +string workerId
    +string workerVersion
    +number maxConcurrency
    +number maxBackgroundConcurrency
    +number claimCooldownMs
  }
  class RunExecutionAttemptOptions {
    <<interface>>
    +ConfigDb db
    +OrchestratorRuntime runtime
    +number leaseTtlMs
    +number heartbeatMs
  }
  class RunExecutionWorkerSnapshot {
    <<interface>>
    +number active
    +number limit
    +number claimed
    +number watchdogFired
  }
  RunExecutionAttemptOptions <|-- RunExecutionWorkerOptions : extends
  RunExecutionWorker ..> RunExecutionWorkerOptions : constructor 参数
  RunExecutionWorker ..> RunExecutionWorkerSnapshot : snapshot 返回

WorkerOptions 图示的三个并发/间隔字段在源码中均可选;省略了其他配置和 Snapshot 的 nullable oldestActiveAgeMs。Snapshot 是进程内观测 DTO,不是持久队列、Run 状态或恢复权威。

证据:接口扩展与观测字段;实际类、构造器与 snapshot;start 与 tick;AttemptOptions 的依赖字段。

M09 组件关系:Worker 的领取、维护与执行依赖

这是 Mermaid flowchart 表达的组件关系视图,不是 UML componentDiagram 语法,也不是部署图。节点按源码模块聚合;箭头是函数调用依赖,而非不同服务间的网络请求。

Worker 的模块级组件关系

图形正在加载;下方源代码始终可读。

Mermaid 源代码
flowchart TB
  accTitle: Worker 的模块级组件关系
  accDescr: Worker 通过 storage 领取与恢复,通过 work control 对账,通过 quota 结算,并把成功领取的 claim 和 snapshot 交给 attempt。
  W["run-execution-worker"]
  S["run-execution-storage"]
  C["run-work-control"]
  Q["run-execution-quota"]
  B["background-work-queue / run-background-work-control"]
  A["run-execution-attempt"]
  W -->|"领取 / 过期恢复 / 取消对账"| S
  W -->|"Work 回执核对 / 未启动租约归还"| C
  W -->|"配额结算"| Q
  W -->|"后台队列维护 / 过期收口"| B
  W -->|"执行已领取 claim 与 snapshot"| A

每次 poll 先处理取消、过期、quota 和 receipt,再经过后台维护与容量/cooldown 判断才尝试领取。Attempt 在 FiberSet 中执行,不让慢模型调用阻塞下一次 tick 的取消对账。领取后若已停止,Worker 交还尚未派发的 ownership,不进入 Attempt。图不将这些模块包装成新的类或微服务。

证据:poll 的维护与领取门;领取、停止后交还与 FiberSet 执行。

开发者改动导航:从需求到合同与验收

本页是 服务端图册 的改动入口,不新增运行主题。基线为 Agent 7f2e519936b53035646a70f152e734298abed2fb、Desktop 4346d79eb364b502ef87c0869a494dfed7964419。以下是源码定位与待执行验收建议,不是测试通过报告;先确认目标仓版本,再跟实际调用者,不从旧测试名猜目录。

场景 → 入口 → 合同 → 回归

想改什么 首读代码与关联模块 必须保持的合同 / 安全回归 最小验收结果
消息排队、重复提交、忙时受理 队列真实状态;排队快照加密写入;队列终态清空载荷;ChatSubmissionStore 与 Work admission clientRequestId 幂等、原加密快照、FIFO 与终态载荷清空;不得复用别人的 conversation 或把晚到材料塞进旧 Work 同 ID 重试无第二次执行;队首失败/取消后可推进;成功与拒绝均无残留 queue 正文
Worker 并发、停机与领取 Worker poll、领取与执行;执行存储与 attempt 模块 claim/fence 与原 Root 的控制归属;stop 后不得以新 worker 重复副作用 领取后停机、lease 丢失、重复唤醒、依赖失败各有确定结果;未知效应不伪装零效应
文件读取、授权、材料清理 附件关系与冻结范围;临时正文读取、消费与引用保留;Main locator / 原生授权 Local File path-free、原设备/账号/attachment、no-follow;paired 活跃引用不能被 TTL 清理 越界/撤权拒绝;消费可清空;活跃引用到期仍可读;清理不恢复模型、不删用户文件
条件产物生成后读取 条件产物冻结合同;产物事实与完成判定;terminal commit producer 的 plugin/version/digest/revision/tool/outputKey 与冻结范围匹配;模型输出不能证明完成 applicable=false、真实产物、错误 producer、缺读取、独立源文件读取分别断言;只在原 owner 事实满足时完成
Interaction 卡片、提交与恢复 Interaction 与 attempt 转换;Main durable settlement 与 Renderer 投影 IX 状态与 settlement attempt 分离;请求 ID、原作用域、撤权和过期不可绕过 重复点击、超时后冷重开、旧响应晚到、取消与提交竞态均不产生新副作用;未知提交不直接标失败
Plugin 工具或本机资源权限 Plugin 原请求授权与宿主访问;bundle/manifest、task binding 与授权模块 输入 schema、origin、runtimeRevision、任务当前性;installedPlugin 是 os_user + network,不是假沙箱 无授权/错误 digest/已撤权均拒绝;授权界面真实呈现文件及网络权限;重试不得移植另一任务许可
凭据或登录持久性 凭据读写、session-only 与删除;Connector 显式 principal;Main locator 加密与 scope ref 与 principal 分离;session-only 不可变为明文;账号/endpoint/scope 切换不串用 safeStorage 可用/不可用、删除、切换账号、损坏文件都验证;不把客户端删除等同远端撤销
SSE、运行详情或诊断字段 运行入口、观察与恢复合同;展示账本界限;Desktop 观察投影 观察只读,旧水位不覆盖新事实;不泄露正文/凭据;展示失败不能改 Work 终态 断流重连不重跑、旧响应被拒、权限变化停止披露;超限呈截断而非错误成功
统一入口路由、澄清与工作台派发 CapabilityRouter 11 步管道;WorkbenchWorkExecution 授权与执行 显式插件绑定优先、未核实恢复拒绝、文件目标收窄(restrictFileTargets)、内置 local_workbench.spreadsheet_ops 不被配置表覆盖 缺关键字段挂起澄清、焦点续接继承原对象、越界文件不进入本轮目标
ReAct 轮次证明、断点续跑与熔断 OwnedRoundProjection;resumeOriginalToolRound;RepeatedToolCallBreaker 恢复必须核对原 runId/invocationId/boundarySeq/argsDigest;未决本机挂起不计入重复熔断;read_files 免于上下文截断 挂起恢复不重调 LLM;连续 3 轮同参同结果触发 REPEATED_IDENTICAL_TOOL_CALL

不要将 Scheduler、Child、Summary、Memory、Title、Quality 一概改成“统一 Command 已迁移”;当前入口的例外与调用关系由 运行入口、观察与恢复合同 说明。

建议检查顺序

  1. 写清改变的是输入、权威状态、物理效应、展示还是清理;指定唯一 owner。
  2. 对照 Desktop 图册、状态权威、数据生命周期 标出受影响边界。
  3. 先改合同与解析,再改写入 owner、读取投影及恢复入口;不能只让 UI 隐藏错误。
  4. 同时查同名 type 的 Agent tool-client 与 Desktop 副本/消费者。字段兼容性、版本门、schema identity、发布顺序分别写清;若需要迁移,评审和执行授权另列,不在启动时偷跑。
  5. 每个 happy path 配拒绝、重复、断线/重启、撤权、迟到事实案例。真实外部效应的验收用隔离材料与明确授权,不把 stub 通过叫作真机通过。

已有测试入口与命令来源

Agent 的 运行入口、观察与恢复合同 内列有真实导航入口:packages/agent/tests/unit/runtime/local-file-v4-tool.test.ts、packages/agent/tests/unit/session/local-file-transient-result.test.ts、packages/agent/tests/integration/runtime-v2-work-resume.test.ts、packages/agent/tests/integration/runtime-v2-work-stop.test.ts。它们是源码 README 指向的定位入口;本次缓存不完整,未运行,也未确认每个测试文件均已物化。完整 checkout 应先读 README 指向的 docs/agents/verification-matrix.md 再选执行命令;此处不臆造 Agent test script。

Desktop 的 package scripts 已读取,以下在完整 Desktop checkout 的 apps/desktop 目录执行,均为现有脚本,不代表本次已运行:

pnpm test
pnpm typecheck
pnpm assert:secret-hygiene

来源:Desktop scripts。test 为 vitest run;typecheck 还会执行 typecheck:e2e。E2E、平台能力和外部服务验收需要对应原生环境及授权;以上命令不替代这些验收。不要为本次文档变更安装依赖、运行共享库迁移或发布应用。

合并前可核对的交付清单

  • 入口和每条跨仓合同附固定 commit / 路径 / 行范围;实现存在、默认开启、目标环境启用分开说明。
  • 改状态:列真实 enum 与合法转换;概念图阶段不冒充 enum。
  • 改副作用:记录幂等身份、claim/fence、超时未知状态及恢复 owner;断线不是取消。
  • 改数据:列来源、读者、传输、清理条件与保留未知项;不得只写“加密所以安全”。
  • 测试报告分为已通过、失败、未运行、被阻塞;包含命令、环境、证据与限制,不把候选用例当现有覆盖。
  • UI/文档另做浏览器与视觉检查:文字不裁切、链接可达、Mermaid 可读、冷重开及旧状态不覆盖新状态。源码语义核验与视觉检查分别结论。

这份导航帮助确定改动范围,不授权部署、远端写入、数据库迁移或业务操作。

实现状态与验收清单

本页回答「代码里有什么、什么仍受门控、还缺哪种证明」,不是上线承诺。源码存在 ≠ 默认开启 ≠ 生产部署 ≠ 验收通过。 状态可以叠加:同一能力既已实现,又受身份/配置门控,原生验收仍未完成。

基线与证据读法

本页沿用 catalog 的固定源码版本,不把分支最新状态混入实现图:

仓 固定 commit 证据用途
Agent 7f2e519936b53035646a70f152e734298abed2fb 服务端控制、持久状态与执行合同
Desktop 4346d79eb364b502ef87c0869a494dfed7964419 Main 执行、投递、回执与更新策略
Plugins a33ce3733365836eefc25ab2dbf55a71d4164f61 协议、SDK 与包;不宣称本轮升级该仓

主题 NOTES 中保留部分历史钉点与迁移说明;当前声明的完整 SHA、路径和行范围以对应 evidence 为准。GitHub 可访问快照不证明 GitLab 当前 tip,也不证明目标环境已经安装这些版本。方法见 增量复核记录。

  • 已实现:在固定源码找到入口、调用与归属;不是产品端到端实测。
  • 受门控:代码存在,但协议、身份、权限、能力或配置仍须满足;只有具体源码支持时才写「默认开/关」。
  • 方案待实施:设计方向或 ADR 已存在,不代表状态、迁移和生产者已接入;ADR 的 Accepted/Proposed 标签不能独立判定代码状态。
  • 未合并增量:具体 PR 的额外改动,独立于固定基线;PR 开放不能反推整个能力不存在。
  • 未验证:缺少对应环境、执行或结果证据;不是「失败」,更不能按通过处理。

状态矩阵

能力 / 边界 实现状态 门控或默认值 还不能宣称什么 源码 / 主题证据
Chat 持久受理、Worker 领取与观察 已实现:direct/routed 经 ChatSubmissionStore.admit;执行不依赖观察连接存活 原 Work 身份为 runtime-work-v1;提交 wire 与 policy 配对,另支持 runtime-work-skill-v2;v2.1 不是新入口 未核实生产全量切流;断线不意味着可重发模型/写工具 Runtime 主题 · 当前声明与源码范围 · M02 时序
Desktop / Interaction / Work 协议门 已实现 + 受门控:三类入口分别拒绝不匹配协议 Desktop v3、Interaction v2、Runtime Work 各有门;无头且无本机载荷通过 Desktop 门,不等于取得本机工具权限 未完成真实跨端升级兼容验收;不能把所有 426 合并为同一原因 协议门说明 · 证据
服务端确认写与未知结果 已实现 + 受门控:授权、凭证、CAS、派发、读回分离 凭证解析先于授权消费;结果未知须核对原事实,不因聊天回复或停止而重派 缺凭证不是「已授权待补凭证」新状态;静态审阅不是源系统写入验收 写权限链 · 证据
Desktop 原提交与 Stop 已实现:原 command/binding、一次首次发送屏障、unknown 查询 身份与原目标复核;本地 Store 磁盘发布为异步 best-effort 不保证记录丢失/断电后的 exactly-once;Stop ACK 不等于撤销已经发生的效应 D02 提交 · D08 Stop · 证据
Plugin / Skill 本机执行 已实现 + 受门控:安装信任与 Main 的原任务/身份/包完整性检查 不再要求通用逐调用确认,但目录、Computer Use 窗口、连接、文件与业务授权分别保留 不是 OS sandbox;不能以开放 PR 推断 master 没有 Computer Use;未证明所有真实业务包已通过 D01 信任边界 · 宿主说明 · 证据
条件产物完成判定 已实现 + 受门控:Main 核对 committed IDs,Agent 按原 producer/scope 重建事实 只对声明的合同判定 required / not_applicable;后者不免除独立源读取 专用 report fixture 不能证明全部官方业务包接入或产品目标完成 M03 条件产物 · 证据
自动安装策略 已实现 + 配置门控:启动待安装与 idle-install 分开 idle-install 初始值为 false;启用后仍检查 busy/idle、静默和尝试次数 ready / apply 不等于 installed;未验证 Windows/macOS/Linux 真机更新 D06 策略与源码 · 默认值源码
可回访待办 / parked Interaction 方案待实施:ADR-0098 方向 Accepted,止血之外尚未实施 具体字段、guard、DDL、迁移、接入与测试仍须单独批准;一期候选不是全能力开关 不承诺所有旧卡都保留、执行授权不失效、unknown 可以重派 固定版本 ADR-0098 · 复核范围
stable / beta / preview 独立发布渠道 未合并增量:2026-10-29 实时读取 PR #4,为 open + draft,merged=false base 为本页 Desktop 钉点;head 2eb1d524a9c9050c81beb8f77c38174f471ac3a7 不放入 master 实现图;PR 自述 81 项局部测试不等于完整应用、签名、原生安装或发布通过 Desktop PR #4;状态是读取时快照,后续须重查
远程 Desktop、原生安装与生产运行 源码部分已实现,对应验收未验证 当前设备、租约、账号和部署配置须在目标环境分别核实 设备目录代码不证明真机跨设备成功;源码 pin 不证明安装版本或线上配置 远程设备边界 · 证据 · 验证范围

本站验证不是产品验收

前次 UML 补充的收据对应文档 PR #8 基线 0b1d2888f34b564c287d45208ed07e20936e0763:18 张 Mermaid parser、98 张 Archify 静态 showcase、构建与 32 项测试通过。这是历史验证覆盖,不自动覆盖本页及之后的变更;本次整合者须对最终工作树重跑并记录结果。见 UML 验证记录。

浏览器 / 人工目检尚未通过。 前次具体阻塞:ARCHIFY_CHROME=/usr/bin/chromium node scripts/browser-mermaid.mjs 启动 Chromium 时被 socket 权限阻止;正常提权重试又在执行环境初始化阶段失败。完整 check:browser 因同一依赖未继续,没有真实渲染截图可供目检。JSDOM/parser、showcase 和构建均不能替代浏览器布局。目标、错误与未执行项见 验证记录。

有界验收清单

以下是待执行的验收合同,不是已通过打勾表。责任按代码/运行边界划分,不虚构人员。每项须记录目标 SHA、环境/平台、配置、实际输入、结果证据及 通过 / 失败 / 阻塞 / 未执行;达到所列结果才收口。仅在批准的测试环境使用隔离账号和无业务副作用材料。

检查 责任边界 最小有界场景 / 收口标准 必留证据
文档与证据一致 Atlas 内容与构建维护边界 最终工作树执行 pnpm evidence:check、pnpm check、pnpm build、pnpm test;新文档已进入导航且所有受影响链接可到达;任何失败不写总通过 精确 revision、工具链、各命令退出码、引用/图/测试计数;新增修改后重跑
浏览器与视觉 Atlas 浏览器 QA 边界 在允许 Chromium 的环境运行 pnpm check:browser、pnpm check:mermaid;桌面/移动、明暗主题检查图文、连接线、嵌入布局、源代码、放大/关闭、锚点与 SVG 下载;实际查看截图且无未处理可读性问题 浏览器版本、截图与自动收据、人工目检结论;soft-pass 或启动失败单列,不算目检通过
持久受理 / 观察中断 Agent Gateway + Work owner + Desktop Coordinator 隔离的只读 Work:提交一次,断开并重新观察;核对同一 root/command,没有因重连产生第二份提交或模型请求 原 clientRequestId/rootRunId、持久受理与观察记录、受控请求计数;不拿 SSE 文本代替账本
unknown / Stop 竞争 Desktop Delivery + Agent Work 控制 使用受控传输故障:提交 ACK 丢失、Stop ACK 丢失、重复 Stop、切换账号;unknown 仅查原命令,Stop 不绑定新任务,迟到事实不使停止 Root 继续 原 command/binding、Store 状态与服务端控制记录;记录 best-effort 持久性限制
协议与授权拒绝 Agent 准入 + Desktop Main + effect owner 受控测试不匹配协议、缺本机头却带本机载荷、过期/错误身份授权;按各入口合同拒绝且没有执行副作用;无本机载荷通过协议门也不得被记作取得能力 请求头/载荷脱敏摘要、错误码、Run/效应记录与零派发证据
写结果不确定与恢复 原 effect owner:连接器 / LF / Plugin 仅在获准的隔离 fixture 中注入「确定未发送」与「已发送结果未知」;验证原键/摘要/fence、原事实读回及禁止盲重派;没有恢复权限时停在 unknown/manual_recovery 脱敏原请求标识、派发次数、账本/Journal、读回结果;不得通过真实业务重试来证明安全
条件产物与本机材料 Desktop Main + Agent 产物 owner 隔离 fixture 各测 required 缺失、合法 committed 产物、not_applicable、错误 scope;只有当前合同允许的分支可完成,scope 错误拒绝 原 producer/scope、committed IDs、结算记录;fixture 结论不外推所有包
原生安装 / 更新 Desktop updater 与平台发行边界 获准后分别在目标平台核对 busy 阻止、默认 idle 关闭、启用后的门控、失败保留 pending;安装后重启确认实际版本;跨渠道仅在 PR 对应版本单独验收 安装包 hash、渠道/版本、签名或明确 unsigned、运行日志、重启版本;每平台分别判定
部署一致性 目标环境运维 / 发布边界 获准只读核对实际 Agent/Desktop/Plugins 版本、配置与必要数据迁移状态,逐一对照合同;拿不到环境证据则保持未验证 部署版本与配置脱敏快照、环境标识;不要用 PR 合并或 CI 绿灯替代部署记录

执行与授权边界

  • 本页允许规划验收,不授权创建/运行 GitHub Actions、合并 PR、启用 auto-merge、发布主站、上传安装包、改 feed、执行 DDL/迁移或改变生产配置。
  • 不为补齐验收擅自安装浏览器/依赖、运行真实业务写、操作用户文件或切换发布渠道;所需权限/环境另行确认。
  • 受阻时只记录具体动作、目标、原因、当前状态与最小所需条件。例如「本地 Mermaid Chromium 渲染:socket 权限阻止启动,未执行布局检查;需可启动 Chromium 的受支持环境」,而不是泛称整个实现失败。
  • 新证据到来后,只升级它实际覆盖的维度。原生单平台通过不升级其他平台;测试 fixture 通过不升级生产部署;代码合入不自动升级任何运行验收。

机制说明

整站运行

新人第一站。本页讲 AidaWork 整站怎么跑(三仓归属 → 一轮用户话 → 本机/云端 → 产品包口径 → 信任门 → 失败落点)。图是辅读;结论以 NOTES + evidence 为准。 钉点:Agent 7f2e519936b5 · Desktop 4346d79eb364 · Plugins a33ce3733365。产品口径旁挂见 product-narrative(非 tip 源码事实)。

一句话

用户在 Desktop 说话 → Agent 受理并持有 Run / IX / 账本 → 模型与工具在执行切片里干活;要本机能力时跨回 Desktop Main(PluginHost / LF / LE);Plugins 只供协议、SDK 与不可变包,不持有服务端任务状态。写有没有落地只看账本,不看聊天气泡。

谁拥有什么(三仓)

仓 拥有 不拥有
aida-agent Gateway 受理、控制面、Orchestrator、Run / IX / 效应账本、租户与配额 本机绝对路径、Plugin Worker 进程
aida-desktop Renderer 呈现;Main 本机执行上下文、授权夹、PluginHost、本机回执 Run / IX / 业务效应 SoT(断线只拉投影)
aida-plugins 协议、SDK、不可变插件包与发布 服务端任务状态、租户 SoT

深挖地图:PANORAMA · 拓扑图主题 overview。

一轮用户话怎么走

  1. Desktop Main prepareEnterpriseChatInput 组装输入(本机能力广告 / 可选插件投影 / LF 附件)→ Work IPC 提交 → POST /api/chat。
  2. Gateway 校验与会话绑定 → ChatSubmissionStore.admit 持久受理 direct/routed(忙时进入原会话队列)→ RunExecutionWorker 按原 lease/epoch 领取。执行切片的准备与模型循环仍复用各自驱动,不由 HTTP 连接存活决定。
  3. 工具经 ExecutionHostRouter 分到 Server / LF / Plugin / LE;要人确认时 InteractionKernel 挂起,settle 后 continuation 再跑。
  4. Desktop Main 观察原 Work,并由原本机 owner 执行本机请求和交付回执;Renderer 只呈现。观察断线不取消或重放执行。

五阶段跨仓源码对照速查(Desktop ↔ Agent)

阶段 aida-desktop 核心入口与职责 aida-agent 核心入口与职责 关键持久化 / 权威边界
1. 提交与持久受理 prepareEnterpriseChatInput 组装无路径附件与本机能力广告;RuntimeWorkDelivery.submit 冻结请求写入本地 Outbox chat-routes.ts 校验协议门(v3 / runtime-work-v1);ChatSubmissionStore.admit 持久受理或入会话队列,冻结初始 C0 clientRequestId 幂等;断网恢复先 query 原提交,不盲目重发
2. 领取与路由装配 只读观察,不参与服务端领取 RunExecutionWorker 按租约与公平策略领取;routed 经 CapabilityRouter(11 步管道)→ WorkbenchWorkExecution,direct 经 prepareExecution → orchestrate agent_runs 租约与 claim fence;单会话同一时刻仅一个活跃顶层 Run
3. 模型循环与工具 不直接跑模型循环 driveReActLoop 维护 OwnedRoundProjection、RepeatedToolCallBreaker 熔断与 slimToolResultsForNextRound 上下文裁剪 服务端工具直接完成;本机工具抛 LocalToolSuspendedSignal 将 carrier 置为 suspended
4. 挂起、回执与续办 deliverRuntimeWorkSkill / Local File executor.ts / PluginHost 复核 live 权限并执行,写入 ArtifactRegistry 并回调回执 api-local-file-v4 / api-local-execution-receipts 幂等落账,DurableLocalExecutionWorker 或 resumeOriginalToolRound 续跑;人工交互由 InteractionKernel + InteractionResumeOwnerWorker 推进 绝对路径不出 Main;每次 operationId / workStepRef 仅激活一次续办
5. 观察、水合与终态 runtimeWorkObservation / coldStartHydration 按 controlRevision 水位合成 UI;Stop 由 RuntimeWorkDelivery.stop 绑定 rootRunId 投递 RuntimeWorkObservation 组合 Root/carrier/公开过程;终态事务复核 readConditionalArtifactCompletionInTx SSE 与本地 store 只是投影,旧水位不能覆盖新事实

单条消息全链路 12 跳沙盘模拟(对应视图 message-trace)

以用户在 Desktop 输入 「帮我读取授权夹里的 10月考勤表.xlsx 并生成异常汇总表」 为例,单条消息跨进程与数据库的 12 跳精确状态演进如下:

跳序 发生位置 触发函数 / 接口 关键载荷与状态变更(Identity / DB / Wire)
T1 Desktop Renderer useDesktopSSEChat.sendMessage 生成幂等 clientRequestId,写入 useSubmissionContinuityStore.pending[clientRequestId],乐观插入本地 user/assistant 占位消息
T2 Desktop Main RuntimeWorkIpcCoordinator.submitSubmission prepareEnterpriseChatInput 组装 localFileCapability 与可准备 Skill 目录(不含本机绝对路径);先写 SubmissionObservationJournal
T3 Main → Agent HTTP POST /api/chat 请求头带 X-AIDA-Desktop-Protocol: 3、X-AIDA-Runtime-Protocol: runtime-work-skill-v2 与 Idempotency-Key
T4 Agent Gateway & Router CapabilityRouter.route 11 步路由命中 local_workbench.spreadsheet_ops;resolveRouteFiles 收窄本轮可见文件范围
T5 Agent PG 受理事务 ChatSubmissionStore.admit + bindAdmittedWork 同一事务写 messages(user 行)+ agent_runs(status='pending', original_root_run_id=id, quota_bucket='foreground', 冻结 command_envelope 与 C0 runtimeWorkEffects)
T6 Agent Worker 领取 RunExecutionWorker → WorkbenchWorkExecution.execute claimNextExecutableRun 拿到 RunLease(status='running');authorize 二次复核租户权限与 capability 指纹后进入 driveReActLoop
T7 ReAct Round 0 driveReActLoop → readSkillFile 模型返回 tool-call(readSkillFile);写待办请求并抛 LocalToolSuspendedSignal,事务写 run_checkpoints 并将 carrier 置为 status='suspended',推进 control_revision
T8 Desktop Main 投递 deliverRuntimeWorkSkill 拉取 queryPendingLocalReadRequest,核对 rootRunId / carrierRunId / invocationId / workStepRef,读取本地 SKILL.md 并回传 outcome='succeeded' 回执
T9 ReAct Round 0→1 resumeOriginalToolRound → runSkillScript 核对 6 项签名直接消费回执完成 readSkillFile(不重调 LLM);进入 Round 1 模型调用 runSkillScript,再次写待办并置 status='suspended'
T10 Desktop 本机效应栅栏 LocalEffectContinuationStore + ArtifactRegistry begin(phase='executing') → claimOriginalSkillDispatch(state='issued') → Python 进程树退出且校验输出后写 executionProof(processTreeStopped=true, outputsValidated=true)→ stageReceipt(phase='receipt_pending') → 上送回执(artifactCount=1)→ acknowledge(phase='settled')
T11 ReAct Round 1→2 & 终态 safeProjectionText → finishRuntimeWorkCarrierInTx resumeOriginalToolRound 复跑完成进入 Round 2 生成总结;通过 safeProjectionText 安全投影门禁;终态事务调用 readConditionalArtifactCompletionInTx 复核条件产物与读取证据,将 agent_runs 置为 status='completed'
T12 Agent → Desktop 核销 releaseRespondedChatSubmission Work 观察流收到终态投影与 settlement.status='completed';Main acknowledgeSubmissionObservation 落盘,Renderer 从 useSubmissionContinuityStore.pending 移除 clientRequestId 并展示最终回复与产物卡片

人话六步(控制面 vs 执行面)→ enterprise-tour-narrative。密时序与 fail/ok → enterprise-task-e2e。

本机 / 桌面 vs 云端 Agent

面 在哪 记住
云端 Agent 服务端进程 真相(SoT)、lease、配额、模型循环
桌面 Main 用户机器(交付优先 Windows;Linux/macOS 亦有实现) 绝对路径、Plugin Worker、本机凭证与回执;本地仓是投影
Renderer 同一桌面 只呈现;显示中的状态 ≠ 独立业务权威

交付顺序(产品口径,非 tip):先稳住桌面尤其 Windows,再核 VMS / MSP 路径——见 product-narrative。机制侧桌面边界 → desktop-client · desktop-runtime。

VMS / MSP · Pack × Edition(产品口径)

  • MSP ≠ 单纯多租户。 MSP = 原中台算薪运维等能力装进 AidaWork 交付(算薪运维、复杂考勤、多客户账单)。
  • AidaWork = VMS / MSP 产品包(标准 Pack × 有界 Edition)。
  • 多实例配额 / 租户公平(scaling-roles)是运行扩缩,不是 MSP 产品定义。
  • 技术装配(目录仓库所有、租户订阅)→ agent-config-pipeline;非 VMS 零业务订购收窄 → enterprise-task-e2e ADR-0097 D1-2a。

完整会前口径 → product-narrative。

信任 / 鉴权门(进门就挡)

  1. 身份:Aida JWT → TenantContext;Server session ≠ Desktop session(auth-tenant)。
  2. Desktop 协议 v3:显式不匹配,或缺头却携带本机执行载荷时,返回 426 DESKTOP_UPGRADE_REQUIRED。无头、无本机载荷可进入后续受理;不能只凭过门就断言工具集合。另有 IX 协议门、Runtime Work 协议门。
  3. Path-free LF:绝对路径只在 Main;Agent 只见 relativePath / saveDestinationId。
  4. Plugin:不可变包 + 投影绑定 + 签名校验;Host 在 Desktop Main。安装即信任取代通用逐次确认,但仍检查当前身份、原请求、executor、包完整性和原任务;目录、电脑、连接与文件资源授权各自保留。

总览 → trust-boundaries。

失败落在哪

现象 先看 主题
协议 / 426 不创建 Run;升级客户端 trust-boundaries
工具宿主 fail / timeout singleflight + reconcile,禁盲重试 enterprise-task-e2e fail-host
IX 取消 / 过期 / settle 拒 仅 accepted+resolved 才续跑 enterprise-task-e2e fail-ix
lease 丢失 / 忙 SSE retryable;可能进人工恢复 enterprise-task-e2e / state-authority
配额 / LLM_BUSY 背压,非业务结案 scaling-roles
诊断码总表 码 → 产出面 → 落点 observability-map

总索引 → FAILURE-CHAINS。

读完下一站

  1. enterprise-tour-narrative — 一条任务的控制面 / 权威读法
  2. overview — 三仓全景地图
  3. enterprise-task-e2e — 密时序与 fail/ok
  4. 按需:trust / write-authority / local-file / scaling / observability

单条消息 12-Hop 代码与 SQL 状态微追踪(message-trace)

对应交互图 /topics/site-runtime/message-trace/(analyses/aidawork/site-runtime/message-lifecycle-trace.sequence.json),将一条携带本机 Excel 附件与技能调用的完整消息拆解为 12 个源码与数据库事务跳点:

Hop 跨仓调用链(函数级) 本地 Store / PostgreSQL 事务写放大与状态变迁(BEFORE -> AFTER)
T1 · Renderer 入队与冻结 useDesktopSSEChat.sendMessage → runtimeWorkClient.prepareSubmission → IPC runtime-work:prepare-submission → RuntimeWorkIpcCoordinator.prepareSubmission RuntimeWorkDeliveryStore.prepare(frozen) 将冻结 JSON body 落盘:<commandId>.json phase: null -> 'prepared';submissionTransports.set(key, prepared.transport) 绑定当前身份与传输对象。
T2 · Main 投递与服务端幂等受理 IPC runtime-work:submit-submission → RuntimeWorkDelivery.submit (beginSending) → POST /api/v1/runtime/work/submissions → admitRuntimeWorkSubmission → createRunInTransaction Desktop: phase: 'prepared' -> 'sending'。<br>PG 同一事务: chat_submission_idempotency (INSERT client_request_id, message_digest) → conversations (UPSERT) → messages (INSERT role='user') → agent_runs (INSERT status='pending', runtime_protocol_version='aida.runtime.work.v1', original_root_run_id=id, attempt_epoch=1) → runtime_invocations (INSERT status='pending', invocation_index=0) → run_checkpoints (INSERT status='active', model_boundary_seq=0, model_request_state='idle') → run_projection_events (INSERT seq=1, event_type='run.accepted').
T3 · 200 受理绑定与草稿文件重绑 RuntimeWorkDelivery.submit 收到 DesktopRuntimeWorkAdmission → store.accept(frozen, binding) → bindAcceptedDraftFiles(submitted) Desktop: <commandId>.json phase: 'sending' -> 'accepted',记录 acceptedBinding: { rootRunId, runId, invocationId, conversationId, userMessageId };rebindDraftSelectionSession(draftSessionId, conversationId) 将草稿期选中的本地文件句柄迁入正式会话;Renderer 切换至 observeRuntimeWork(rootRunId)。
T4 · Worker Claim 与 Attempt Fence RuntimeWorkWorker.poll → claimNextPendingRun → beginRuntimeWorkAttempt (lockRoot + lockCarrier) → executeClaimedRun PG 事务: agent_runs status: 'pending' -> 'running', lease_owner, lease_token, lease_expires_at, attempt_epoch: 1;runtime_invocations status: 'pending' -> 'running';后续所有控制面写操作必须通过 assertRuntimeWorkAttemptInTx(tx, claim) 校验 (runId, invocationId, attemptEpoch, leaseToken)。
T5 · 控制面解析与模型请求准入 (Seq 0) resolveAndRun → prepareExecution → rebuildWorkModelContext → admitWorkModelRequestInTx(expectedSeq=0n) PG 事务: FOR UPDATE 锁 run_checkpoints,校验 snapshot.inputMessageId === binding.inputMessageId、checkHistory(binding)(重算 messages 集合的 canonicalJsonSha256 === binding.tailDigest);UPDATE run_checkpoints SET model_boundary_seq=0, current_input_binding=..., accepted_response_ref=NULL, model_request_state='dispatched'。
T6 · Round 0 流式输出与 Response CAS 绑定 streamText → run_projection_events (text-delta, tool-call) → INSERT INTO messages (role='assistant') → bindWorkModelAcceptedResponseInTx(boundarySeq=0n) PG 事务: 先插入 messages (role='assistant', 含 tool-call: runSkillScript),再执行 CAS:UPDATE run_checkpoints SET accepted_response_ref={messageRef, digest}, model_request_state='completed' WHERE model_boundary_seq=0 AND accepted_response_ref IS NULL;UPDATE agent_runs SET iteration_count = iteration_count + 1;若携带 rebuildRef 则写入 runtime_work_model_rebuild_closures。
T7 · 本机工具挂起与 5 表 Join 不变量校验 ExecutionHostRouter 路由 runSkillScript 至 desktop_local → suspendForLocalExecution → suspendRuntimeWorkLocalExecutionInTx PG 同一事务: 1) 写入 pending_interactions (kind='local_tool_result', status='pending') 与 continuation_requests (status='pending', work_root_run_id, work_step_ref='model:0:tool:0', work_effect_ref='execute_script');2) 执行 5 表 Join (run_checkpoints ⋈ runtime_invocations ⋈ messages ⋈ pending_interactions ⋈ continuation_requests FOR SHARE OF p, c),校验 canonicalJsonSha256(m.content) === cp.accepted_response_ref.digest;3) suspendRuntimeWorkCarrierInTx 将 agent_runs.status: 'running' -> 'suspended', error_code='LOCAL_TOOL_SUSPENDED',runtime_invocations.status: 'running' -> 'suspended',run_checkpoints 记入 pending_interaction_id 与 pending_tool_call_id;4) 发射 run_projection_events (tool.local_execution_requested) 并释放 Worker lease。
T8 · Desktop 拉取 Outbox 与本地一次性屏障準備 RuntimeWorkInboxLoop 轮询发现挂起请求 → executeToolRequest → LocalEffectContinuationStore.prepareExecution Desktop: LocalEffectContinuationStore 在 <userData>/local-effect-continuations/ 原子写入记录:phase: null -> 'executing', 绑定 (scopeDigest, interactionId, continuationId, requestDigest)。若发现同名 interactionId 已处于 'RecoveryRequired' 或 'ExecutedPendingAck',直接拦截(绝不二次执行副作用)。
T9 · Workbench 暂存输入、跑 Python 脚本、收集产物 LocalExecutor.runSkillScript → stageSelectedInputFiles → runManagedPython → 扫描 output/ → 上传文件至文件服务 → recordExecuted Desktop: 1) 校验选中句柄授权并在 workDir/inputs/ 下生成相对路径副本(模型与脚本全程不接触宿主机绝对路径);2) 启动受管 Python 执行脚本并收集 output/ 产物;3) LocalEffectContinuationStore.recordExecuted 在网络回传前先把 receiptEnvelope + responseDigest 持久化落盘:phase: 'executing' -> 'executed_pending_ack'。
T10 · 提交签名回执与单事务唤醒 (settleRuntimeWorkSkillReceiptInTx) POST /api/v1/runtime/work/Continuations/:id/receipt → settleInteractionInTransaction + settleRuntimeWorkSkillReceiptInTx PG 同一事务: 1) pending_interactions status: 'pending' -> 'resolved',写入 interaction_receipts;2) 7 表 Join (continuation_requests ⋈ pending_interactions ⋈ agent_runs r ⋈ agent_runs original ⋈ chat_submission_idempotency ⋈ runtime_invocations ⋈ interaction_receipts) 校验 user_id === original_user_id、receipt.requestDigest === payload.requestDigest、originEpoch <= carrier.attempt_epoch;3) recordRuntimeWorkDomainFactInTx 记录领域事实;4) INSERT INTO messages (role='tool', tool_name='runSkillScript', metadata={receiptId});5) continuation_requests.status: 'pending' -> 'completed';6) 唤醒载体:agent_runs.status: 'suspended' -> 'pending', runtime_invocations.status: 'suspended' -> 'pending', run_checkpoints 清空 pending_interaction_id / pending_tool* 并设 resume_point='skill_receipt:<continuationId>'。Desktop: 收到 ACK 后 markAcknowledged (phase -> 'acknowledged')。
T11 · Worker 续跑 Round 1 与模型上下文确定性重建 RuntimeWorkWorker 重新 Claim pending Run (attempt_epoch: 2) → rebuildWorkModelContext → admitWorkModelRequestInTx(expectedSeq=1n) PG 事务: admitWorkModelRequestInTx 检测到上一轮 row.model_request_state === 'completed' 且 expectedSeq === seq + 1n (1n),强制校验 next.tailMessageRefs 前缀与 row.current_input_binding.tailMessageRefs 完全一致,且包含上一轮 accepted_response_ref.messageRef 与新插入的 role='tool' 消息;校验通过后 UPDATE run_checkpoints SET model_boundary_seq=1, model_request_state='dispatched', accepted_response_ref=NULL。
T12 · Round 1 收口、Complete Carrier 与桌面产物上架 streamText 输出最终总结 → bindWorkModelAcceptedResponseInTx(boundarySeq=1n) → completeRuntimeWorkCarrierInTx PG 事务: INSERT INTO messages (role='assistant');run_checkpoints model_request_state: 'dispatched' -> 'completed';completeRuntimeWorkCarrierInTx 将 agent_runs 设为 status='completed', completion_outcome='succeeded', finished_at=clock_timestamp(),runtime_invocations 设为 status='completed', terminal_at=clock_timestamp(),run_checkpoints 设为 status='completed',追加 run_projection_events (run.completed)。Desktop: observeRuntimeWork 消费终态投影,展示最终回复与本地生成文件卡片,释放 sessionRunSlot。

证据与范围

本页为入口叙事,机制主张合成自已核主题;产品 Pack×Edition / MSP 定义来自会前口径(无 code evidence)。钉点源码锚点:

  • aida-desktop · apps/desktop/electron/agent-loop/enterprise-adapter.ts · prepareEnterpriseChatInput · 4346d79eb364
  • aida-agent · packages/agent/src/gateway/orchestrator-runtime.ts · resolveAndRun / prepareExecution · e2adc9a3c325
  • aida-agent · packages/agent/src/execution-host/router.ts · ExecutionHostRouter · e2adc9a3c325
  • aida-desktop · apps/desktop/electron/plugin-host/plugin-host.ts · PluginHost · 4346d79eb364
  • aida-agent · packages/agent/src/session/run-store.ts · UPDATE agent_runs · e2adc9a3c325
  • aida-agent · packages/agent/src/gateway/chat-routes.ts · DESKTOP_UPGRADE_REQUIRED · e2adc9a3c325

实现存在、默认开关、生产启用分别判断。不升 tip 钉;不新造边界几何,主图为理解型 workflow,深挖链到既有视图。

Mermaid 速读路线

责任图、Worker UML 与组件依赖、持久执行时序、条件产物、队列、IX 与 attempt 状态、邮箱分页 · Desktop UML、Stop 时序、artifact 输入、信任边界、提交状态、lease/inbox、产物回执与更新策略。图册随本文直接展示,源代码可展开核对。

按问题找答案

故障与恢复 · 跨仓协议 · 数据生命周期 · 开发改动导航 · 实现与验收。新指南保留已实现、计划、未验证边界,不将手工操作建议视为已执行。

服务端运行 Mermaid 图册

本图册补充原有 Archify 交互视图,按「谁负责 → 如何执行 → 如何结案 → 如何恢复」阅读。基于 2026-10-29 可访问的 GitHub 默认分支快照:Agent 7f2e519936b53035646a70f152e734298abed2fb,Desktop 4346d79eb364b502ef87c0869a494dfed7964419。GitHub 镜像不证明 GitLab 当前 tip 或线上部署;图不代替真实模型、数据库和原生平台验收。

配套:Desktop 实现图册 · 状态权威 · 完整失败链。

图索引

M01 责任与事实归属

这是一张概念责任图,不是部署拓扑。模型循环、持久控制、物理效应和界面展示各有主人。

flowchart TB
  accTitle: AidaWork 责任与事实归属
  accDescr: 用户经 Desktop Main 提交,Agent 持久受理与 Worker 执行;Main 拥有本机事实,界面仅呈现观察结果。
  UI["Renderer:输入与展示"] --> Main["Desktop Main:身份与持久提交"]
  Main --> Gateway["Agent Gateway:校验与受理"]
  Gateway --> PG["PostgreSQL:Root、carrier、claim、回执"]
  PG --> Worker["RunExecutionWorker:领取与驱动"]
  Worker --> Control["Work 共同控制:原身份与 fence"]
  Control --> Model["模型:建议下一步"]
  Model --> Control
  Control --> Server["服务端工具 owner"]
  Control --> Main
  Main --> Local["本机 effect owner:文件、Plugin、Skill"]
  Local -->|"绑定原请求的事实与回执"| PG
  PG -->|"观察水位,不是万能重放日志"| UI

Effect 管理进程内 fiber/Scope;PostgreSQL 与 Work 共同控制拥有领取、终态和恢复事实。runtime_events 不是完整 prompt 或通用恢复日志。Scheduler、Child、Summary、Memory、Title、Quality 也不能一律画成已迁移的统一 Command 路径。

证据:当前运行总则。

M02 一次持久执行与断线观察

sequenceDiagram
  accTitle: 持久执行与断线观察时序
  accDescr: Gateway 持久受理后 Worker 独立执行,断开观察流不取消或重放工作,本机结果依原请求结算。
  participant Main as Desktop Main
  participant API as Chat Gateway
  participant DB as 持久受理与 PG
  participant W as RunExecutionWorker
  participant C as Work 共同控制
  participant M as 模型
  participant H as 本机 effect owner
  Main->>API: clientRequestId 与当前身份、材料、能力
  API->>DB: admit 原请求或排队
  DB-->>API: Root binding 或 queued receipt
  API-->>Main: 持久受理结果
  W->>DB: 按 lease 与 epoch 领取 carrier
  W->>C: 核验原 Work 与冻结输入
  C->>DB: 预留原模型请求边界
  W->>M: 派发模型请求
  M-->>C: 绑定原 invocation 的结果
  C->>DB: 持久化本机请求并挂起
  DB-->>H: 经交付通道投递原请求
  H->>H: 当前身份、原任务与资源复核
  H->>DB: 经 API 结算原请求回执
  DB-->>W: 结算事实;仅符合原恢复门时可继续
  W->>C: 符合资格并重新领取后推进
  C->>DB: 终态 guard 与 fence 复核
  Main->>API: 重连查询原 Work
  API->>DB: 读取当前 Root 与效果事实
  API-->>Main: 当前观察结果
  Note over Main,DB: 断线不取消、不重发执行;传输协议不选择另一条执行通道

图中 DB→本机 owner 是持久请求经 API/inbox 的逻辑交付,不表示数据库直接连用户机器。带 runtime-work-v1 和不带 Runtime 头的生产 Chat 共用持久受理;旧协议显式拒绝。回执到达不等于必然恢复:Stop、unknown、证据冲突或缺失材料仍可能禁止推进;迟到事实可结算但不能重新激活已停止 Root。具体 lease/inbox 见 Desktop 图册。

证据:共同受理与传输。

M03 条件产物完成判定

下图是 owner 判定步骤,不是新增的 RunStatus。not_applicable 不能单独代表任务完成。

stateDiagram-v2
  accTitle: 条件产物完成的 owner 判定
  accDescr: 精确绑定原 producer 和 scope,基于真实回执核验产物与独立源文件读取,在原终态 fence 内复核。
  state "冻结 producer 与 scope" as Frozen
  state "重建原请求及回执事实" as Facts
  state "保留未完成或拒绝" as Blocked
  state "条件未满足且累计零产物" as NoOutput
  state "已有真实产物" as Produced
  state "验证产物读取" as ArtifactRead
  state "验证独立源材料读取" as SourceRead
  state "满足本条件的完成要求" as Ready
  state "原 claim fence 内再次复核" as Fence
  [*] --> Frozen
  Frozen --> Facts: 原 producer 回执已结算
  Facts --> Blocked: 错绑定、撤销、未结算或冲突
  Facts --> NoOutput: 最新 not_applicable 且累计零产物
  Facts --> Produced: 累计产物存在且最新 produced 或 not_applicable
  Produced --> ArtifactRead
  ArtifactRead --> SourceRead: 全部原 artifactRef 与 hash 已读
  NoOutput --> SourceRead
  SourceRead --> Ready: 不要求独立读取或证据齐全
  Ready --> Fence
  Fence --> Blocked: 当前条件已变化
  Fence --> [*]: 本条件通过,仍服从其他终态门

Agent 从 continuation、interaction receipt、tool message、settlement 和原模型 tool call 重建事实;模型文本、空列表、Worker 自报 success 都不够。Main 还会校验声明、返回列表、实际 committed artifact ID 集合一致。既有 Work 不因升级自动补入新合同。

证据:owner 事实重建与完成公式;终态事务复核。

M04 会话队列的真实状态

以下使用 ConversationTurnQueueStatus 的实际状态值。admitted 只表示队列请求已受理为 Run,不等于业务完成。

stateDiagram-v2
  accTitle: 会话队列状态
  accDescr: 身份绑定的加密快照排队,可重试错误在次数预算内保留 queued;受理、取消和失败分别结案。
  [*] --> queued: 保存身份绑定的加密快照
  queued --> queued: 同错误码次数小于 3,持久 retryAfter
  queued --> admitted: 当前准入成功并绑定 runId
  queued --> cancelled: 取消此排队请求
  queued --> failed: 不可重试或同错误码第 3 次失败
  admitted --> [*]
  cancelled --> [*]
  failed --> [*]

可重试失败按错误码计数,前两次分别等待 10 秒、20 秒;第 3 次仍失败则进入 failed。出队会恢复并复核原身份、材料和能力,不能换账号或新建内容来掩盖原请求失败。后台 Root 不占用前台槽位,队列不等于任意后台任务总线。

证据:状态定义;原 queued 快照重试;受理及队列终态。

M05 Interaction 与提交尝试分开

这是 INTERACTION_TRANSITION_RULES 的 合同局部视图,不是把所有 producer 的生产迁移状态都声明完成。运行状态、IX 状态、attempt 状态、业务效应 outcome 不可互换。

stateDiagram-v2
  accTitle: Interaction 合同终态
  accDescr: pending 在权威接受后 resolved;普通到期、取消、损坏需无活跃 attempt,权威拒绝后已到期则 expired;刷新另建关联交互。
  [*] --> pending: 原 owner wait 与 outbox 原子建立
  pending --> resolved: authority accepted,同事务写 resume intent
  pending --> expired: 无活跃 attempt 且到期,或权威拒绝时已到期
  pending --> cancelled: 无活跃 attempt,turn cancelled
  pending --> failed: 无活跃 attempt,永久损坏
  pending --> pending: task_scope 且活跃 attempt 时,任务取消请求延后
  resolved --> [*]
  expired --> [*]
  cancelled --> [*]
  failed --> [*]

图中的取消延后仅对应 task_scope 的 task_cancellation_requested,不把任意取消都解释为延后。终态刷新建立 linked interaction,不把原 IX 改回 pending。accepted + resolved 才产生恢复意图;显示了“已发送”不代表恢复成功。

证据:IX 转换与 guard。

M06 Settlement attempt 的不确定结果

这仍是同一合同的局部状态图。checking 是 attempt 状态,IX 保持 pending;超时不表示权威拒绝。

stateDiagram-v2
  accTitle: 交互提交尝试的核对状态
  accDescr: 传输失败进入 reconciling,权威结果未知进入 checking;只有原权威回执能接受或拒绝,checking 超时保留原状态。
  [*] --> submitting: 通过 actor、version、deadline 门
  submitting --> reconciling: 可重试交付失败
  reconciling --> reconciling: 原交付仍未确认
  submitting --> checking: 权威结果未知
  reconciling --> checking: 权威结果未知
  checking --> checking: 检查超时,提供恢复入口
  submitting --> accepted: 原权威接受
  reconciling --> accepted: 原权威接受
  checking --> accepted: 原权威接受
  submitting --> rejected: 原权威拒绝
  reconciling --> rejected: 原权威拒绝
  checking --> rejected: 原权威拒绝
  accepted --> [*]
  rejected --> [*]

已拒绝且未过期时,IX 可以仍为 pending;后续重新提交必须是新的 attempt,并再次通过 guard,不能重写旧 attempt。不要用此图宣称 ADR-0098 的 parked-card 产品方案已经实现。

证据:attempt 与 IX 独立状态;提交、核对、接受与拒绝;超时不伪造终态。

M07 邮箱读取的范围与分页

sequenceDiagram
  accTitle: 邮箱范围拒绝与 UIDNEXT 回退
  accDescr: 先核验原 connectionId,越界请求不派发;选定邮箱内校验 UIDVALIDITY,UIDNEXT 缺省时按原游标或末序号 UID 选择搜索窗口。
  participant Tool as 原 Work 工具调用
  participant Scope as Agent 范围门
  participant Conn as 邮箱连接器
  participant IMAP as 原邮箱服务器
  Tool->>Scope: connectionId 与原工具参数
  alt 连接或工具超出原 connectorRead
    Scope-->>Tool: SCOPE_VIOLATION,尚未派发
    Note over Tool,Scope: 不是查询失败,不允许换账号探测
  else 原范围内
    Scope->>Conn: 派发原连接调用
    Conn->>IMAP: readonly 打开 folder
    IMAP-->>Conn: UIDVALIDITY、exists、可选 UIDNEXT
    Conn->>Conn: 校验 mailbox identity 与字段
    alt 空邮箱
      Conn-->>Tool: 空页
    else UIDNEXT 缺省且没有 beforeUid
      Conn->>IMAP: 读取最后 sequence 的 UID
      IMAP-->>Conn: last UID
      Conn->>Conn: upperUid = last UID + 1
    else 有合法 UIDNEXT 或原 beforeUid
      Conn->>Conn: 使用原游标与合法上界
    end
    opt 非空且上界有效
      Conn->>IMAP: 有界 UID 窗口 search 与 fetch
      IMAP-->>Conn: 匹配邮件
      Conn-->>Tool: uidValidity、messages、nextBeforeUid
    end
  end

缺省不等于非法值:非空邮箱提供了错误 UIDNEXT 时仍失败(空邮箱在此检查前直接返回空页);不能把坏数据当“省略了字段”继续。图只说明当前服务端读取路径,不证明 Desktop 未合并的本地邮件归档 PR 已落地或真实账号联调通过。

证据:派发前范围门;邮箱分页与缺省回退。

M08 UML:Worker、配置接口与观测快照

这是 Mermaid classDiagram 表达的 UML 类/接口局部视图,成员只摘录与运行控制有关的部分。RunExecutionWorker 是实际类;两个 Options 和 Snapshot 是 TypeScript interface,不是数据库实体。实线泛化只用于源码明确的 extends;虚线表示参数或返回值依赖,不暗示对象生命周期所有权。

classDiagram
  accTitle: Worker 类与配置接口的 UML 关系
  accDescr: Worker 接收扩展自 AttemptOptions 的 WorkerOptions,并返回观测 Snapshot;接口扩展不是 Worker 类继承。
  class RunExecutionWorker {
    +start() void
    +tick() Promise
    +snapshot() RunExecutionWorkerSnapshot
  }
  class RunExecutionWorkerOptions {
    <<interface>>
    +string workerId
    +string workerVersion
    +number maxConcurrency
    +number maxBackgroundConcurrency
    +number claimCooldownMs
  }
  class RunExecutionAttemptOptions {
    <<interface>>
    +ConfigDb db
    +OrchestratorRuntime runtime
    +number leaseTtlMs
    +number heartbeatMs
  }
  class RunExecutionWorkerSnapshot {
    <<interface>>
    +number active
    +number limit
    +number claimed
    +number watchdogFired
  }
  RunExecutionAttemptOptions <|-- RunExecutionWorkerOptions : extends
  RunExecutionWorker ..> RunExecutionWorkerOptions : constructor 参数
  RunExecutionWorker ..> RunExecutionWorkerSnapshot : snapshot 返回

WorkerOptions 图示的三个并发/间隔字段在源码中均可选;省略了其他配置和 Snapshot 的 nullable oldestActiveAgeMs。Snapshot 是进程内观测 DTO,不是持久队列、Run 状态或恢复权威。

证据:接口扩展与观测字段;实际类、构造器与 snapshot;start 与 tick;AttemptOptions 的依赖字段。

M09 组件关系:Worker 的领取、维护与执行依赖

这是 Mermaid flowchart 表达的组件关系视图,不是 UML componentDiagram 语法,也不是部署图。节点按源码模块聚合;箭头是函数调用依赖,而非不同服务间的网络请求。

flowchart TB
  accTitle: Worker 的模块级组件关系
  accDescr: Worker 通过 storage 领取与恢复,通过 work control 对账,通过 quota 结算,并把成功领取的 claim 和 snapshot 交给 attempt。
  W["run-execution-worker"]
  S["run-execution-storage"]
  C["run-work-control"]
  Q["run-execution-quota"]
  B["background-work-queue / run-background-work-control"]
  A["run-execution-attempt"]
  W -->|"领取 / 过期恢复 / 取消对账"| S
  W -->|"Work 回执核对 / 未启动租约归还"| C
  W -->|"配额结算"| Q
  W -->|"后台队列维护 / 过期收口"| B
  W -->|"执行已领取 claim 与 snapshot"| A

每次 poll 先处理取消、过期、quota 和 receipt,再经过后台维护与容量/cooldown 判断才尝试领取。Attempt 在 FiberSet 中执行,不让慢模型调用阻塞下一次 tick 的取消对账。领取后若已停止,Worker 交还尚未派发的 ownership,不进入 Attempt。图不将这些模块包装成新的类或微服务。

证据:poll 的维护与领取门;领取、停止后交还与 FiberSet 执行。

开发者改动导航:从需求到合同与验收

本页是 服务端图册 的改动入口,不新增运行主题。基线为 Agent 7f2e519936b53035646a70f152e734298abed2fb、Desktop 4346d79eb364b502ef87c0869a494dfed7964419。以下是源码定位与待执行验收建议,不是测试通过报告;先确认目标仓版本,再跟实际调用者,不从旧测试名猜目录。

场景 → 入口 → 合同 → 回归

想改什么 首读代码与关联模块 必须保持的合同 / 安全回归 最小验收结果
消息排队、重复提交、忙时受理 队列真实状态;排队快照加密写入;队列终态清空载荷;ChatSubmissionStore 与 Work admission clientRequestId 幂等、原加密快照、FIFO 与终态载荷清空;不得复用别人的 conversation 或把晚到材料塞进旧 Work 同 ID 重试无第二次执行;队首失败/取消后可推进;成功与拒绝均无残留 queue 正文
Worker 并发、停机与领取 Worker poll、领取与执行;执行存储与 attempt 模块 claim/fence 与原 Root 的控制归属;stop 后不得以新 worker 重复副作用 领取后停机、lease 丢失、重复唤醒、依赖失败各有确定结果;未知效应不伪装零效应
文件读取、授权、材料清理 附件关系与冻结范围;临时正文读取、消费与引用保留;Main locator / 原生授权 Local File path-free、原设备/账号/attachment、no-follow;paired 活跃引用不能被 TTL 清理 越界/撤权拒绝;消费可清空;活跃引用到期仍可读;清理不恢复模型、不删用户文件
条件产物生成后读取 条件产物冻结合同;产物事实与完成判定;terminal commit producer 的 plugin/version/digest/revision/tool/outputKey 与冻结范围匹配;模型输出不能证明完成 applicable=false、真实产物、错误 producer、缺读取、独立源文件读取分别断言;只在原 owner 事实满足时完成
Interaction 卡片、提交与恢复 Interaction 与 attempt 转换;Main durable settlement 与 Renderer 投影 IX 状态与 settlement attempt 分离;请求 ID、原作用域、撤权和过期不可绕过 重复点击、超时后冷重开、旧响应晚到、取消与提交竞态均不产生新副作用;未知提交不直接标失败
Plugin 工具或本机资源权限 Plugin 原请求授权与宿主访问;bundle/manifest、task binding 与授权模块 输入 schema、origin、runtimeRevision、任务当前性;installedPlugin 是 os_user + network,不是假沙箱 无授权/错误 digest/已撤权均拒绝;授权界面真实呈现文件及网络权限;重试不得移植另一任务许可
凭据或登录持久性 凭据读写、session-only 与删除;Connector 显式 principal;Main locator 加密与 scope ref 与 principal 分离;session-only 不可变为明文;账号/endpoint/scope 切换不串用 safeStorage 可用/不可用、删除、切换账号、损坏文件都验证;不把客户端删除等同远端撤销
SSE、运行详情或诊断字段 运行入口、观察与恢复合同;展示账本界限;Desktop 观察投影 观察只读,旧水位不覆盖新事实;不泄露正文/凭据;展示失败不能改 Work 终态 断流重连不重跑、旧响应被拒、权限变化停止披露;超限呈截断而非错误成功
统一入口路由、澄清与工作台派发 CapabilityRouter 11 步管道;WorkbenchWorkExecution 授权与执行 显式插件绑定优先、未核实恢复拒绝、文件目标收窄(restrictFileTargets)、内置 local_workbench.spreadsheet_ops 不被配置表覆盖 缺关键字段挂起澄清、焦点续接继承原对象、越界文件不进入本轮目标
ReAct 轮次证明、断点续跑与熔断 OwnedRoundProjection;resumeOriginalToolRound;RepeatedToolCallBreaker 恢复必须核对原 runId/invocationId/boundarySeq/argsDigest;未决本机挂起不计入重复熔断;read_files 免于上下文截断 挂起恢复不重调 LLM;连续 3 轮同参同结果触发 REPEATED_IDENTICAL_TOOL_CALL

不要将 Scheduler、Child、Summary、Memory、Title、Quality 一概改成“统一 Command 已迁移”;当前入口的例外与调用关系由 运行入口、观察与恢复合同 说明。

建议检查顺序

  1. 写清改变的是输入、权威状态、物理效应、展示还是清理;指定唯一 owner。
  2. 对照 Desktop 图册、状态权威、数据生命周期 标出受影响边界。
  3. 先改合同与解析,再改写入 owner、读取投影及恢复入口;不能只让 UI 隐藏错误。
  4. 同时查同名 type 的 Agent tool-client 与 Desktop 副本/消费者。字段兼容性、版本门、schema identity、发布顺序分别写清;若需要迁移,评审和执行授权另列,不在启动时偷跑。
  5. 每个 happy path 配拒绝、重复、断线/重启、撤权、迟到事实案例。真实外部效应的验收用隔离材料与明确授权,不把 stub 通过叫作真机通过。

已有测试入口与命令来源

Agent 的 运行入口、观察与恢复合同 内列有真实导航入口:packages/agent/tests/unit/runtime/local-file-v4-tool.test.ts、packages/agent/tests/unit/session/local-file-transient-result.test.ts、packages/agent/tests/integration/runtime-v2-work-resume.test.ts、packages/agent/tests/integration/runtime-v2-work-stop.test.ts。它们是源码 README 指向的定位入口;本次缓存不完整,未运行,也未确认每个测试文件均已物化。完整 checkout 应先读 README 指向的 docs/agents/verification-matrix.md 再选执行命令;此处不臆造 Agent test script。

Desktop 的 package scripts 已读取,以下在完整 Desktop checkout 的 apps/desktop 目录执行,均为现有脚本,不代表本次已运行:

pnpm test
pnpm typecheck
pnpm assert:secret-hygiene

来源:Desktop scripts。test 为 vitest run;typecheck 还会执行 typecheck:e2e。E2E、平台能力和外部服务验收需要对应原生环境及授权;以上命令不替代这些验收。不要为本次文档变更安装依赖、运行共享库迁移或发布应用。

合并前可核对的交付清单

  • 入口和每条跨仓合同附固定 commit / 路径 / 行范围;实现存在、默认开启、目标环境启用分开说明。
  • 改状态:列真实 enum 与合法转换;概念图阶段不冒充 enum。
  • 改副作用:记录幂等身份、claim/fence、超时未知状态及恢复 owner;断线不是取消。
  • 改数据:列来源、读者、传输、清理条件与保留未知项;不得只写“加密所以安全”。
  • 测试报告分为已通过、失败、未运行、被阻塞;包含命令、环境、证据与限制,不把候选用例当现有覆盖。
  • UI/文档另做浏览器与视觉检查:文字不裁切、链接可达、Mermaid 可读、冷重开及旧状态不覆盖新状态。源码语义核验与视觉检查分别结论。

这份导航帮助确定改动范围,不授权部署、远端写入、数据库迁移或业务操作。

实现状态与验收清单

本页回答「代码里有什么、什么仍受门控、还缺哪种证明」,不是上线承诺。源码存在 ≠ 默认开启 ≠ 生产部署 ≠ 验收通过。 状态可以叠加:同一能力既已实现,又受身份/配置门控,原生验收仍未完成。

基线与证据读法

本页沿用 catalog 的固定源码版本,不把分支最新状态混入实现图:

仓 固定 commit 证据用途
Agent 7f2e519936b53035646a70f152e734298abed2fb 服务端控制、持久状态与执行合同
Desktop 4346d79eb364b502ef87c0869a494dfed7964419 Main 执行、投递、回执与更新策略
Plugins a33ce3733365836eefc25ab2dbf55a71d4164f61 协议、SDK 与包;不宣称本轮升级该仓

主题 NOTES 中保留部分历史钉点与迁移说明;当前声明的完整 SHA、路径和行范围以对应 evidence 为准。GitHub 可访问快照不证明 GitLab 当前 tip,也不证明目标环境已经安装这些版本。方法见 增量复核记录。

  • 已实现:在固定源码找到入口、调用与归属;不是产品端到端实测。
  • 受门控:代码存在,但协议、身份、权限、能力或配置仍须满足;只有具体源码支持时才写「默认开/关」。
  • 方案待实施:设计方向或 ADR 已存在,不代表状态、迁移和生产者已接入;ADR 的 Accepted/Proposed 标签不能独立判定代码状态。
  • 未合并增量:具体 PR 的额外改动,独立于固定基线;PR 开放不能反推整个能力不存在。
  • 未验证:缺少对应环境、执行或结果证据;不是「失败」,更不能按通过处理。

状态矩阵

能力 / 边界 实现状态 门控或默认值 还不能宣称什么 源码 / 主题证据
Chat 持久受理、Worker 领取与观察 已实现:direct/routed 经 ChatSubmissionStore.admit;执行不依赖观察连接存活 原 Work 身份为 runtime-work-v1;提交 wire 与 policy 配对,另支持 runtime-work-skill-v2;v2.1 不是新入口 未核实生产全量切流;断线不意味着可重发模型/写工具 Runtime 主题 · 当前声明与源码范围 · M02 时序
Desktop / Interaction / Work 协议门 已实现 + 受门控:三类入口分别拒绝不匹配协议 Desktop v3、Interaction v2、Runtime Work 各有门;无头且无本机载荷通过 Desktop 门,不等于取得本机工具权限 未完成真实跨端升级兼容验收;不能把所有 426 合并为同一原因 协议门说明 · 证据
服务端确认写与未知结果 已实现 + 受门控:授权、凭证、CAS、派发、读回分离 凭证解析先于授权消费;结果未知须核对原事实,不因聊天回复或停止而重派 缺凭证不是「已授权待补凭证」新状态;静态审阅不是源系统写入验收 写权限链 · 证据
Desktop 原提交与 Stop 已实现:原 command/binding、一次首次发送屏障、unknown 查询 身份与原目标复核;本地 Store 磁盘发布为异步 best-effort 不保证记录丢失/断电后的 exactly-once;Stop ACK 不等于撤销已经发生的效应 D02 提交 · D08 Stop · 证据
Plugin / Skill 本机执行 已实现 + 受门控:安装信任与 Main 的原任务/身份/包完整性检查 不再要求通用逐调用确认,但目录、Computer Use 窗口、连接、文件与业务授权分别保留 不是 OS sandbox;不能以开放 PR 推断 master 没有 Computer Use;未证明所有真实业务包已通过 D01 信任边界 · 宿主说明 · 证据
条件产物完成判定 已实现 + 受门控:Main 核对 committed IDs,Agent 按原 producer/scope 重建事实 只对声明的合同判定 required / not_applicable;后者不免除独立源读取 专用 report fixture 不能证明全部官方业务包接入或产品目标完成 M03 条件产物 · 证据
自动安装策略 已实现 + 配置门控:启动待安装与 idle-install 分开 idle-install 初始值为 false;启用后仍检查 busy/idle、静默和尝试次数 ready / apply 不等于 installed;未验证 Windows/macOS/Linux 真机更新 D06 策略与源码 · 默认值源码
可回访待办 / parked Interaction 方案待实施:ADR-0098 方向 Accepted,止血之外尚未实施 具体字段、guard、DDL、迁移、接入与测试仍须单独批准;一期候选不是全能力开关 不承诺所有旧卡都保留、执行授权不失效、unknown 可以重派 固定版本 ADR-0098 · 复核范围
stable / beta / preview 独立发布渠道 未合并增量:2026-10-29 实时读取 PR #4,为 open + draft,merged=false base 为本页 Desktop 钉点;head 2eb1d524a9c9050c81beb8f77c38174f471ac3a7 不放入 master 实现图;PR 自述 81 项局部测试不等于完整应用、签名、原生安装或发布通过 Desktop PR #4;状态是读取时快照,后续须重查
远程 Desktop、原生安装与生产运行 源码部分已实现,对应验收未验证 当前设备、租约、账号和部署配置须在目标环境分别核实 设备目录代码不证明真机跨设备成功;源码 pin 不证明安装版本或线上配置 远程设备边界 · 证据 · 验证范围

本站验证不是产品验收

前次 UML 补充的收据对应文档 PR #8 基线 0b1d2888f34b564c287d45208ed07e20936e0763:18 张 Mermaid parser、98 张 Archify 静态 showcase、构建与 32 项测试通过。这是历史验证覆盖,不自动覆盖本页及之后的变更;本次整合者须对最终工作树重跑并记录结果。见 UML 验证记录。

浏览器 / 人工目检尚未通过。 前次具体阻塞:ARCHIFY_CHROME=/usr/bin/chromium node scripts/browser-mermaid.mjs 启动 Chromium 时被 socket 权限阻止;正常提权重试又在执行环境初始化阶段失败。完整 check:browser 因同一依赖未继续,没有真实渲染截图可供目检。JSDOM/parser、showcase 和构建均不能替代浏览器布局。目标、错误与未执行项见 验证记录。

有界验收清单

以下是待执行的验收合同,不是已通过打勾表。责任按代码/运行边界划分,不虚构人员。每项须记录目标 SHA、环境/平台、配置、实际输入、结果证据及 通过 / 失败 / 阻塞 / 未执行;达到所列结果才收口。仅在批准的测试环境使用隔离账号和无业务副作用材料。

检查 责任边界 最小有界场景 / 收口标准 必留证据
文档与证据一致 Atlas 内容与构建维护边界 最终工作树执行 pnpm evidence:check、pnpm check、pnpm build、pnpm test;新文档已进入导航且所有受影响链接可到达;任何失败不写总通过 精确 revision、工具链、各命令退出码、引用/图/测试计数;新增修改后重跑
浏览器与视觉 Atlas 浏览器 QA 边界 在允许 Chromium 的环境运行 pnpm check:browser、pnpm check:mermaid;桌面/移动、明暗主题检查图文、连接线、嵌入布局、源代码、放大/关闭、锚点与 SVG 下载;实际查看截图且无未处理可读性问题 浏览器版本、截图与自动收据、人工目检结论;soft-pass 或启动失败单列,不算目检通过
持久受理 / 观察中断 Agent Gateway + Work owner + Desktop Coordinator 隔离的只读 Work:提交一次,断开并重新观察;核对同一 root/command,没有因重连产生第二份提交或模型请求 原 clientRequestId/rootRunId、持久受理与观察记录、受控请求计数;不拿 SSE 文本代替账本
unknown / Stop 竞争 Desktop Delivery + Agent Work 控制 使用受控传输故障:提交 ACK 丢失、Stop ACK 丢失、重复 Stop、切换账号;unknown 仅查原命令,Stop 不绑定新任务,迟到事实不使停止 Root 继续 原 command/binding、Store 状态与服务端控制记录;记录 best-effort 持久性限制
协议与授权拒绝 Agent 准入 + Desktop Main + effect owner 受控测试不匹配协议、缺本机头却带本机载荷、过期/错误身份授权;按各入口合同拒绝且没有执行副作用;无本机载荷通过协议门也不得被记作取得能力 请求头/载荷脱敏摘要、错误码、Run/效应记录与零派发证据
写结果不确定与恢复 原 effect owner:连接器 / LF / Plugin 仅在获准的隔离 fixture 中注入「确定未发送」与「已发送结果未知」;验证原键/摘要/fence、原事实读回及禁止盲重派;没有恢复权限时停在 unknown/manual_recovery 脱敏原请求标识、派发次数、账本/Journal、读回结果;不得通过真实业务重试来证明安全
条件产物与本机材料 Desktop Main + Agent 产物 owner 隔离 fixture 各测 required 缺失、合法 committed 产物、not_applicable、错误 scope;只有当前合同允许的分支可完成,scope 错误拒绝 原 producer/scope、committed IDs、结算记录;fixture 结论不外推所有包
原生安装 / 更新 Desktop updater 与平台发行边界 获准后分别在目标平台核对 busy 阻止、默认 idle 关闭、启用后的门控、失败保留 pending;安装后重启确认实际版本;跨渠道仅在 PR 对应版本单独验收 安装包 hash、渠道/版本、签名或明确 unsigned、运行日志、重启版本;每平台分别判定
部署一致性 目标环境运维 / 发布边界 获准只读核对实际 Agent/Desktop/Plugins 版本、配置与必要数据迁移状态,逐一对照合同;拿不到环境证据则保持未验证 部署版本与配置脱敏快照、环境标识;不要用 PR 合并或 CI 绿灯替代部署记录

执行与授权边界

  • 本页允许规划验收,不授权创建/运行 GitHub Actions、合并 PR、启用 auto-merge、发布主站、上传安装包、改 feed、执行 DDL/迁移或改变生产配置。
  • 不为补齐验收擅自安装浏览器/依赖、运行真实业务写、操作用户文件或切换发布渠道;所需权限/环境另行确认。
  • 受阻时只记录具体动作、目标、原因、当前状态与最小所需条件。例如「本地 Mermaid Chromium 渲染:socket 权限阻止启动,未执行布局检查;需可启动 Chromium 的受支持环境」,而不是泛称整个实现失败。
  • 新证据到来后,只升级它实际覆盖的维度。原生单平台通过不升级其他平台;测试 fixture 通过不升级生产部署;代码合入不自动升级任何运行验收。

代码证据

引用核验检查固定 commit 的文件与范围;实现结论来自代码阅读。自动检查不证明生产环境已启用。

已核验实现

三仓分工:Agent 持企业执行机制与 Run/IX 真相;Desktop Main 承载本机能力与 PluginHost;Plugins 仓提供协议、SDK 和不可变包,不持有服务端任务状态。

aida-agentpackages/agent/src/gateway/orchestrator-runtime.ts:434–4627f2e519936b57902d4907ed8026fe1ecdd146e82符号:prepareExecution
aida-desktopapps/desktop/electron/plugin-host/plugin-host.ts:96–1274346d79eb36402355e51118df0edf1f98586880c符号:export class PluginHost
aida-agentpackages/agent/src/execution-host/router.ts:50–807f2e519936b57902d4907ed8026fe1ecdd146e82符号:ExecutionHostRouter
已核验实现

一轮用户话:Desktop Main 组装并持久提交;ChatSubmissionStore.admit 共同受理 direct/routed,RunExecutionWorker 领取后由 Work 共同控制推进,HTTP 仅为受理和观察传输,不拥有执行寿命。

aida-agentpackages/agent/src/runtime/README.md:14–757f2e519936b57902d4907ed8026fe1ecdd146e82
aida-desktopapps/desktop/electron/agent-loop/enterprise-adapter.ts:119–1774346d79eb36402355e51118df0edf1f98586880c符号:prepareEnterpriseChatInput
已核验实现

Run 状态是可更新的持久化记录(agent_runs);Desktop 本地仓与 SSE 投影不能反写服务端 SoT。

aida-agentpackages/agent/src/session/run-store.ts:668–6987f2e519936b57902d4907ed8026fe1ecdd146e82符号:UPDATE agent_runs
aida-agentpackages/agent/src/shared/interaction-kernel-state.ts:11–417f2e519936b57902d4907ed8026fe1ecdd146e82符号:INTERACTION_STATUSES
已核验实现

Desktop 协议门对显式错误版本,以及缺头但携带本机执行载荷的请求返回426;无头且无本机载荷只证明通过该门,不单独证明最终工具集合。IX与Runtime Work协议另行校验。

aida-agentpackages/agent/src/gateway/chat-routes.ts:326–3647f2e519936b57902d4907ed8026fe1ecdd146e82符号:DESKTOP_UPGRADE_REQUIRED_BODY
aida-agentpackages/agent/src/gateway/chat-routes.ts:401–4087f2e519936b57902d4907ed8026fe1ecdd146e82符号:RUNTIME_EXECUTION_PROTOCOL_UNSUPPORTED
aida-desktopapps/desktop/shared/generated/protocol-version.ts:1–84346d79eb36402355e51118df0edf1f98586880c符号:DESKTOP_PROTOCOL_VERSION
未核实

MSP / Pack×Edition 为产品会前口径(MSP≠单纯多租户;AidaWork=VMS/MSP 产品包),本主题不另证代码完备;运行扩缩与租户配额见 scaling-roles,≠ MSP 产品定义。

产品口径历史记录,不作代码实现或部署证明。

已核验实现

Mermaid M01 责任与事实归属:按相应源码表达责任、调用或状态;区分类、接口、依赖、合同与概念视图。

静态源码复核,不证明真实浏览器布局、所有 producer 迁移或生产部署;持久性只按实现保证。

aida-agentpackages/agent/src/runtime/README.md:1–757f2e519936b57902d4907ed8026fe1ecdd146e82
已核验实现

Mermaid M02 一次持久执行与断线观察:按相应源码表达责任、调用或状态;区分类、接口、依赖、合同与概念视图。

静态源码复核,不证明真实浏览器布局、所有 producer 迁移或生产部署;持久性只按实现保证。

aida-agentpackages/agent/src/runtime/README.md:14–757f2e519936b57902d4907ed8026fe1ecdd146e82
已核验实现

Mermaid M03 条件产物完成判定:按相应源码表达责任、调用或状态;区分类、接口、依赖、合同与概念视图。

静态源码复核,不证明真实浏览器布局、所有 producer 迁移或生产部署;持久性只按实现保证。

aida-agentpackages/agent/src/runtime/work/run-work-conditional-artifact.ts:88–3657f2e519936b57902d4907ed8026fe1ecdd146e82
aida-agentpackages/agent/src/runtime/work/run-work-carrier-terminal.ts:15–507f2e519936b57902d4907ed8026fe1ecdd146e82
已核验实现

Mermaid M04 会话队列的真实状态:按相应源码表达责任、调用或状态;区分类、接口、依赖、合同与概念视图。

静态源码复核,不证明真实浏览器布局、所有 producer 迁移或生产部署;持久性只按实现保证。

aida-agentpackages/agent/src/session/conversation-turn-queue.ts:24–367f2e519936b57902d4907ed8026fe1ecdd146e82
aida-agentpackages/agent/src/session/conversation-turn-queue.ts:370–4357f2e519936b57902d4907ed8026fe1ecdd146e82
aida-agentpackages/agent/src/session/conversation-turn-queue.ts:539–6297f2e519936b57902d4907ed8026fe1ecdd146e82
已核验实现

Mermaid M05 Interaction 与提交尝试分开:按相应源码表达责任、调用或状态;区分类、接口、依赖、合同与概念视图。

静态源码复核,不证明真实浏览器布局、所有 producer 迁移或生产部署;持久性只按实现保证。

aida-agentpackages/agent/src/shared/interaction-kernel-state.ts:234–4137f2e519936b57902d4907ed8026fe1ecdd146e82
已核验实现

Mermaid M06 Settlement attempt 的不确定结果:按相应源码表达责任、调用或状态;区分类、接口、依赖、合同与概念视图。

静态源码复核,不证明真实浏览器布局、所有 producer 迁移或生产部署;持久性只按实现保证。

aida-agentpackages/agent/src/shared/interaction-kernel-state.ts:10–457f2e519936b57902d4907ed8026fe1ecdd146e82
aida-agentpackages/agent/src/shared/interaction-kernel-state.ts:245–3357f2e519936b57902d4907ed8026fe1ecdd146e82
aida-agentpackages/agent/src/shared/interaction-kernel-state.ts:376–4007f2e519936b57902d4907ed8026fe1ecdd146e82
已核验实现

Mermaid M07 邮箱读取的范围与分页:按相应源码表达责任、调用或状态;区分类、接口、依赖、合同与概念视图。

静态源码复核,不证明真实浏览器布局、所有 producer 迁移或生产部署;持久性只按实现保证。

aida-agentpackages/agent/src/gateway/delegated-desktop-capabilities.ts:218–2297f2e519936b57902d4907ed8026fe1ecdd146e82
aida-agentpackages/agent/src/connectors/email/imap-mailbox-client.ts:394–4777f2e519936b57902d4907ed8026fe1ecdd146e82
已核验实现

Mermaid M08 UML:Worker、配置接口与观测快照:按相应源码表达责任、调用或状态;区分类、接口、依赖、合同与概念视图。

静态源码复核,不证明真实浏览器布局、所有 producer 迁移或生产部署;持久性只按实现保证。

aida-agentpackages/agent/src/runtime/execution/run-execution-worker.ts:42–757f2e519936b57902d4907ed8026fe1ecdd146e82
aida-agentpackages/agent/src/runtime/execution/run-execution-worker.ts:90–1627f2e519936b57902d4907ed8026fe1ecdd146e82
aida-agentpackages/agent/src/runtime/execution/run-execution-worker.ts:164–1897f2e519936b57902d4907ed8026fe1ecdd146e82
aida-agentpackages/agent/src/runtime/execution/run-execution-attempt.ts:81–1027f2e519936b57902d4907ed8026fe1ecdd146e82
已核验实现

Mermaid M09 组件关系:Worker 的领取、维护与执行依赖:按相应源码表达责任、调用或状态;区分类、接口、依赖、合同与概念视图。

静态源码复核,不证明真实浏览器布局、所有 producer 迁移或生产部署;持久性只按实现保证。

aida-agentpackages/agent/src/runtime/execution/run-execution-worker.ts:192–2627f2e519936b57902d4907ed8026fe1ecdd146e82
aida-agentpackages/agent/src/runtime/execution/run-execution-worker.ts:265–3447f2e519936b57902d4907ed8026fe1ecdd146e82
已核验实现

开发者指南 change:定位代码改动,按当前固定源码与关联主题定位责任和边界;建议操作与验收计划不是已执行结果。

只核对当前代码与文档结构;生产配置、所有真实客户端、清理作业及原生/浏览器验收另行举证。PR状态仅为读取时快照。

aida-agentpackages/agent/src/session/conversation-turn-queue.ts:24–367f2e519936b57902d4907ed8026fe1ecdd146e82
aida-agentpackages/agent/src/session/conversation-turn-queue.ts:307–3597f2e519936b57902d4907ed8026fe1ecdd146e82
aida-agentpackages/agent/src/session/conversation-turn-queue.ts:539–5967f2e519936b57902d4907ed8026fe1ecdd146e82
aida-agentpackages/agent/src/runtime/execution/run-execution-worker.ts:192–3447f2e519936b57902d4907ed8026fe1ecdd146e82
aida-agentpackages/agent/src/session/local-file-message-attachment.ts:11–457f2e519936b57902d4907ed8026fe1ecdd146e82
aida-agentpackages/agent/src/session/local-file-operation-store.ts:545–6747f2e519936b57902d4907ed8026fe1ecdd146e82
aida-agentpackages/agent/src/routing/conditional-artifact-contract.ts:15–1037f2e519936b57902d4907ed8026fe1ecdd146e82
aida-agentpackages/agent/src/runtime/work/run-work-conditional-artifact.ts:89–3657f2e519936b57902d4907ed8026fe1ecdd146e82
aida-agentpackages/agent/src/shared/interaction-kernel-state.ts:234–4137f2e519936b57902d4907ed8026fe1ecdd146e82
aida-desktopapps/desktop/electron/plugin-host/plugin-host.ts:1452–15574346d79eb36402355e51118df0edf1f98586880c
aida-desktopapps/desktop/electron/auth/credential-vault.ts:87–1634346d79eb36402355e51118df0edf1f98586880c
aida-agentpackages/agent/src/connectors/credential-provider.ts:55–1447f2e519936b57902d4907ed8026fe1ecdd146e82
aida-desktopapps/desktop/electron/security/local-secure-envelope.ts:79–1394346d79eb36402355e51118df0edf1f98586880c
aida-agentpackages/agent/src/runtime/README.md:14–757f2e519936b57902d4907ed8026fe1ecdd146e82
aida-agentpackages/agent/src/runtime/stream/work-chat-sse-ledger.ts:21–497f2e519936b57902d4907ed8026fe1ecdd146e82
aida-desktopapps/desktop/package.json:44–654346d79eb36402355e51118df0edf1f98586880c
aida-agentpackages/agent/src/routing/router.ts:21–757f2e519936b57902d4907ed8026fe1ecdd146e82符号:CapabilityRouter
aida-agentpackages/agent/src/gateway/workbench-work-execution.ts:154–2357f2e519936b57902d4907ed8026fe1ecdd146e82符号:WorkbenchWorkExecution
aida-agentpackages/agent/src/orchestrator/drive-react-loop.ts:159–2387f2e519936b57902d4907ed8026fe1ecdd146e82符号:OwnedRoundProjection
aida-agentpackages/agent/src/orchestrator/resume-original-tool.ts:14–757f2e519936b57902d4907ed8026fe1ecdd146e82符号:resumeOriginalToolRound
aida-agentpackages/agent/src/orchestrator/repeated-tool-call-breaker.ts:65–1227f2e519936b57902d4907ed8026fe1ecdd146e82符号:RepeatedToolCallBreaker
已核验实现

开发者指南 acceptance:看实现与验收,按当前固定源码与关联主题定位责任和边界;建议操作与验收计划不是已执行结果。

只核对当前代码与文档结构;生产配置、所有真实客户端、清理作业及原生/浏览器验收另行举证。PR状态仅为读取时快照。

aida-desktopapps/desktop/electron/update/automatic-update-installation.ts:12–424346d79eb36402355e51118df0edf1f98586880c
aida-agentdocs/adr/0098-revisitable-pending-cards.md:1–177f2e519936b57902d4907ed8026fe1ecdd146e82