拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Warp 云端会话接力编排层技术解析:HandoffCloudCloud 特性标志与 Follow-up 会话热切换机制

桌面应用开发者工具人工智能AI 应用AI Agent代码智能体【免费下载链接】warpWarp is an agentic development environment, born out of the terminal.项目地址https://gitcode.com/GitHub_Trending/wa/warp点击查看免费下载本篇技术指南以 Warp 仓库中 handoff-cloud-cloud-pr2 技术规格 为骨架系统拆解 Cloud-to-cloud handoff PR 2 的完整设计如何把一次已结束的云端 Agent 运行cloud agent run编排成一次 follow-up 执行并把新产生的共享会话shared session交给既有的 hotswap 热切换路径。读完本文你将掌握可复用的运行轮询流设计、SessionStartupKind状态建模、FollowupSessionReady事件链路以及该特性如何在默认关闭的前提下安全落地。一、背景与问题定义什么是 Cloud-to-cloud handoff PR 2在 Warp 的 Cloud Mode云端模式中一次 ambient agent 运行run会经历创建运行 → 轮询get_ambient_agent_task获取任务状态 → 直到第一个可加入joinable的共享会话出现 → 通过connect_to_session挂接会话。当一次运行结束后用户往往希望在同一运行run上继续追加新的提示词prompt让云端在既有上下文中产生一次新的执行execution这就是 handoff接力场景当接力发生在云端到云端之间时即为 cloud-to-cloud handoff。PR 2 的职责是添加编排层orchestration layer把一次已存在的 cloud agent run 转变为一次 follow-up 执行并将结果生成的全新共享会话交给 hotswap 路径。其核心边界是模型/API 行为未来某个 UI 只需调用一个 ambient-model 方法并传入 follow-up 提示词客户端提交POST agent/runs/{runId}/followups持续轮询同一个 run 直到出现新的可加入会话忽略已结束的旧会话最终发出FollowupSessionReady事件让既有的 viewer manager 以 append 模式挂接新会话。目标Goals提供可复用的 follow-up 编排向既有 run 提交提示词并等待一个全新的活跃执行会话让 ambient view model 显式区分等待初始会话与等待 follow-up 会话跟踪活跃的或上一次已结束的执行会话 ID使 follow-up 轮询能忽略旧会话带来的陈旧就绪信号在新会话就绪时发出已被支持的FollowupSessionReady事件复用既有 hotswap 路径挂接复用既有 Cloud Mode 的 setup/loading/error 状态机制处理 follow-up 等待与失败但不新增可见的 Continue 入口实现整体保持在FeatureFlag::HandoffCloudCloud之后特性关闭时行为保持不变。非目标Non-goalsPR 2 刻意收敛边界以下内容明确不在本次范围内不新增 tombstone 上的 Continue 按钮、action 或文案改动不做终端输入路由terminal input submission route来提交 follow-up 提示词不在 tombstone 内嵌入 follow-up 提示词编辑器不做 tombstone 堆叠或原地更新update-in-place的产品决策不做一等的服务端 execution 数组解析除非本分支的公开 API 响应形状已经暴露它不开启HandoffCloudCloud的 rollout。这一组非目标解释了 PR 2 的设计哲学编排能力先行、产品 UI 后置保证该 PR 在默认禁用状态下保持可合并mergeable把用户可见的入口Continue 按钮、输入路由留给后续 UX PR。二、现状盘点PR 1 打下的基础设施PR 2 构建在 PR 1 的成果之上。PR 1 已经完成了以下基础工作特性标志与编译期依赖新增默认禁用的HandoffCloudCloud标志并在 app/Cargo.toml 中编码了对cloud_mode_setup_v2的 Cargo feature 依赖。API 请求模型与客户端方法在 app/src/server/server_api/ai.rs 中新增RunFollowupRequest请求体携带message字段位于 ai.rsAIClient::submit_run_followup通过post_public_api_unit(build_run_followup_url(run_id), request)提交URL 构造器build_run_followup_url(run_id)其实现位于 ai.rs即把请求路由到agent/runs/{runId}/followups端点端点/序列化测试位于 ai_test.rs。任务访问器AmbientAgentTask新增run_id()、conversation_id()、active_run_execution()访问器把当前扁平化的响应字段投影为RunExecution视图位于 app/src/ai/ambient_agents/task.rs。SessionJoinInfo::from_task已消费该投影其实现位于 app/src/ai/ambient_agents/spawn.rs从active_run_execution()取出session_id字符串并解析为SessionId优先使用服务端下发的session_link否则用shared_session::join_link(session_id)自行构造。会话热切换接收端create_cloud_mode_view已把SessionReady路由到connect_to_session、把ExecutionSessionReady路由到attach_execution_session位于 app/src/terminal/view/ambient_agent/mod.rsviewer manager 的 follow-up 挂接路径会替换活跃网络并以 append-mode 滚动回放加入相关实现见 app/src/terminal/shared_session/viewer/terminal_manager.rs事件循环侧的 append 滚动回放逻辑见 event_loop.rs。PR 2 需要填补的缺口初始云端启动目前是一个单一的组合 helperspawn_task创建 run → 轮询get_ambient_agent_task→ 发状态变更事件 → 在第一个会话可加入时结束位于 app/src/ai/ambient_agents/spawn.rs。尚不存在可复用的轮询既有 run 直到新执行会话就绪的 helper。AmbientAgentViewModel仍把启动建模为Status::WaitingForSession { progress }无法区分初始 run 与 follow-up 执行原状态位于 app/src/terminal/view/ambient_agent/model.rs。既有SessionStarted处理逻辑依赖当前状态恰好在AgentRunning来隐式推断 follow-up 就绪这种隐式推断对模型驱动的 follow-up 流程过于脆弱。既有的attach_followup_session方法只是为已知会话 ID 发出FollowupSessionReady作为测试脚手架可用但不会真正提交或轮询 follow-up。UI 存在与初始 dispatch 强绑定的副作用DispatchedAgent事件会在TerminalView::handle_ambient_agent_event中插入初始的乐观用户查询并驱动 ambient entry-block 的插入订阅位于 app/src/terminal/view/ambient_agent/view_impl.rs。PR 2 明确不应为 follow-up 复用该事件否则会在 UX PR 落地前就混淆初始 run 与 follow-up 的行为。三、核心设计一可复用的运行轮询与 follow-up helper3.1 从spawn_task中抽取轮询能力规格要求重构spawn_taskapp/src/ai/ambient_agents/spawn.rs让创建 run与监控 run 就绪分离同时保持公开spawn_task(request, ai_client, timeout)的行为不变内部在spawn_agent成功后调用新的轮询 helper。源码中的落地形态spawn_task只负责调用ai_client.spawn_agent拿到(task_id, run_id, at_capacity)然后转发给新抽取的monitor_spawned_task而monitor_spawned_task先发出TaskSpawned以及条件性的AtCapacity再进入poll_run_until_joinable_session轮询循环。这正好满足了规格中拥有任务创建权的调用方可以避免发出第二次 spawn 请求的诉求——后续 follow-up 场景只需直接进入轮询无需重新创建 run。轮询过程的关键参数均在 spawn.rs 中定义常量值含义TASK_STATUS_POLLING_DURATION80s轮询 Agent 就绪的总体时长上限应足够长以覆盖共享会话可加入TASK_STATUS_POLL_INTERVAL3s生产/ 1ms测试单次状态轮询的间隔MAX_STALE_POLLS_BEFORE_FAILURE10连续观察到非 working、非 cancelled 状态的次数上限超限即视为失败按生产 3s 间隔换算约 30s长于 dispatcher 的ProcessingInterval加典型 worker 认领延迟3.2RunPollMode区分初始运行与 follow-up规格提议一个形如poll_run_until_joinable_session(run_id, ai_client, previous_session_id, timeout)的 helper。源码以RunPollMode枚举实现了这一语义enum RunPollMode { InitialRun, Followup { previous_session_id: OptionSessionId, }, }poll_run_until_joinable_session会反复调用get_ambient_agent_task(run_id)外层包裹with_bounded_retry对 429/5xx 等瞬时 HTTP 错误做指数退避重试在状态变化时发出StateChanged事件并仅在任务处于InProgress且SessionJoinInfo::from_task解析出与previous_session_id不同的session_id时才返回SessionStarted。3.3 一个重要的实现细节陈旧终态跳过stale-state skipping规格强调终端状态不应让 follow-up 等待无限期滞留而源码的注释进一步揭示了一个微妙问题服务端在submit_run_followup返回时并不会同步地把任务从先前的终态转移出去——转移发生在 dispatcher 循环拾取新入队的执行、worker 认领之后是异步发生的。如果轮询把第一次观察到的状态当作 follow-up 的结果就会把先前 run 的status_message误报为失败并结束流导致模型永久卡在Failed尽管新 run 其实即将开始。为此源码引入了seen_working_state门控初始 run 从全新任务开始首次观察即反映 spawn 本身所以seen_working_state初始为truefollow-up 的seen_working_state初始为false必须先观察到至少一个 working 状态task.state.is_working()才允许发出事件在观察到 working 状态之前非 working、非 cancelled 的状态会被当作先前 run 的残留终态跳过skipped_stale_polls计数直到超过MAX_STALE_POLLS_BEFORE_FAILURE才放弃Cancelled是特例它只能经由显式的用户/管理员/服务端取消到达且服务端不会自行转移出该状态因此始终穿透跳过逻辑。3.4 follow-up helper 的完整契约规格提出的submit_run_followup(prompt, run_id, previous_session_id, ai_client, timeout)在源码中的落点为 spawn.rs 的同名函数契约如下先构造RunFollowupRequest { message: prompt }并调用ai_client.submit_run_followup(run_id, request)API 在受理前失败则直接返回错误、绝不进入轮询受理成功后进入poll_run_until_joinable_session轮询错误与初始 spawn 走同一错误通道。此外规格对会话元数据的容差做了明确区分初始 spawn保留对存在会话链接但解析不出会话 ID的既有容忍SessionJoinInfo::from_task内部要求解析出session_id但对session_link的空链接做过滤回退follow-up 就绪必须解析出会话 ID因为 hotswap API 需要SessionId。3.5 终端状态的错误语义规格要求在新会话出现之前follow-up 等待不得无限滞留。失败类状态应发出状态变更并把任务状态消息作为错误浮出成功的终端完成terminal completion却没有新会话时应以明确的没有可用的 follow-up 会话错误收尾。源码中对应逻辑为task.state.is_terminal()时follow-up 模式区分两种错误文案——若因跳过计数耗尽则报Cloud follow-up did not start in time否则优先取status_message失败类状态回退到Cloud agent failed非失败类终态回退到Cloud follow-up finished before a new session became available。四、核心设计二显式化的会话启动类型SessionStartupKind4.1 状态建模Status::WaitingForSession携带启动类型规格提议引入小枚举SessionStartupKind { InitialRun, Followup }并让Status::WaitingForSession携带{ progress, kind }同时保持既有访问器如agent_progress()、is_waiting_for_session()行为不变。源码落点为 app/src/terminal/view/ambient_agent/model.rspub enum SessionStartupKind { InitialRun, Followup, } pub enum Status { Setup, Composing, WaitingForSession { progress: AgentProgress, kind: SessionStartupKind, }, AgentRunning, Failed { progress: AgentProgress, error_message: String }, NeedsGithubAuth { progress: AgentProgress, error_message: String, auth_url: String }, Cancelled { progress: AgentProgress }, // ... }注意is_waiting_for_session()使用matches!(self.status, Status::WaitingForSession { .. })的通配匹配因此携带kind后访问器依然行为保持。4.2 事件分派SessionReadyvsExecutionSessionReady规格要求初始 spawn 置WaitingForSession { kind: InitialRun }AmbientAgentEvent::SessionStarted处理逻辑改为依据kind决定发SessionReady初始还是FollowupSessionReadyfollow-up而不是依赖当前状态恰好在AgentRunning。源码中的实际落点model.rs在SessionStarted处理器内按kind匹配InitialRun→ 发AmbientAgentViewModelEvent::SessionReady { session_id }Followup以及兼容的AgentRunning→ 发AmbientAgentViewModelEvent::ExecutionSessionReady { session_id }其余状态Setup/Composing/Failed/NeedsGithubAuth/Cancelled直接返回不发出会话事件。同时在收到SessionStarted后统一收尾停止进度定时器、更新active_execution_session_id、清空last_ended_execution_session_id与pending_followup_prompt、置status Status::AgentRunning。事件枚举的完整定义见 model.rs其中ExecutionSessionReady的文档注释明确了它的语义一次执行已开始为既有的 canonical ambient pane 共享会话即前一次运行结束后新 VM 上的 follow-up 运行驱动视图侧TerminalManager::attach_execution_session的会话交换。4.3 模型新增字段与提交方法规格要求为AmbientAgentViewModel增加 follow-up 记账字段活跃执行的SessionId、可用的最近一次已结束执行的SessionId、当前已提交的 follow-up 提示词该字段为 PR 3 的乐观渲染预留PR 2 只存储、不插入可见的 follow-up 查询块。源码字段落点为 model.rs。新增方法AmbientAgentViewModel::submit_cloud_followup(prompt, ctx)model.rs的完整前置条件与流程特性门控要求FeatureFlag::HandoffCloudCloud已启用否则仅记录 warn 日志并直接返回任务存在要求已有task_idrun ID否则 warn 返回捕获前一会话previous_session_id active_execution_session_id.or(last_ended_execution_session_id)——这是规格若会话结束通知丢失则回退到最后活跃执行会话 ID的风险缓解措施的落地置状态status Status::WaitingForSession { progress: AgentProgress::new(), kind: SessionStartupKind::Followup }启动计时start_progress_timer(ctx)记录待处理提示词pending_followup_prompt Some(prompt)发出独立事件ctx.emit(AmbientAgentViewModelEvent::FollowupDispatched)启动 helper 流ctx.spawn_stream_local(stream, ...)消费submit_run_followup流事件结果交给handle_ambient_agent_event_result。成功路径停止计时器、置AgentRunning、更新活跃执行会话 ID、清空待处理提示词、发ExecutionSessionReady { session_id }失败路径复用既有的 failed/auth/quota/capacity 映射逻辑handle_spawn_error等使 follow-up 的 setup 错误与初始 setup 错误渲染在同一套状态上。模型侧还提供了is_ready_for_cloud_followup_prompt()model.rs判定既有 ambient task 是否可以接受 follow-up 提示词要求存在task_id、无活跃执行会话、无待处理提示词、且状态为AgentRunning。其注释点明Cloud Mode 执行结束后状态保持AgentRunning而活跃会话被清空这个可编辑的运行后状态正是允许 follow-up 的时刻——它构成了未来 PR 3 中 Continue 入口的启用条件。五、核心设计三执行结束记账与事件/视图集成5.1 执行结束的纯记账扩展规格要求仅扩展 ambient session 结束路径做记账。viewer::TerminalManager::ambient_session_ended目前让 pane 保持可恢复并清空活跃网络PR 2 在HandoffCloudCloud开关后通知 ambient view model 记录已结束会话 ID以便模型拒绝来自该会话的重复就绪信号。源码落点record_ambient_execution_ended(session_id, ctx)model.rs若该会话恰是active_execution_session_id则清空并发出RunLifecycleChanged然后写入last_ended_execution_session_id。关键约束规格明确列出源码遵守该通知不得调用TerminalView::on_session_share_ended、不得插入 tombstone、不得设置SharedSessionStatus::FinishedViewer、不得取消本地会话——这些 UI 与生命周期决策全部留在 PR 3。5.2 新事件与视图接线新增模型事件FollowupDispatchedmodel.rs不复用DispatchedAgent避免再次插入初始 run 的 UI 痕迹create_cloud_mode_viewapp/src/terminal/view/ambient_agent/mod.rs只需对新事件做穷尽匹配更新因为ExecutionSessionReady已接入attach_execution_sessionTerminalView::handle_ambient_agent_event处理FollowupDispatched时仅通知/重渲染进度 UI、若存在活跃 ambient 会话则将其标记为ConversationStatus::InProgress不插入CloudModeInitialUserQuery、不插入第二个AmbientAgentEntryBlock、不自动打开超出既有 setup/progress 渲染的新 UI见 app/src/terminal/view/ambient_agent/view_impl.rs既有加载屏view_impl.rs 的 loading 渲染区域在 PR 2 中继续从AgentProgress派生消息如需为 follow-up 调整文案保持最小改动并基于SessionStartupKind区分且规格允许将用户可见文案推迟到 PR 3。六、测试策略以流级测试验证编排契约规格要求的测试重点集中在 app/src/ai/ambient_agents/spawn_tests.rs源码中已存在覆盖以下关键路径的用例测试用例验证点followup_submits_before_polling_and_ignores_previous_session_idhelper 先调用submit_run_followup再轮询忽略服务端返回的旧会话 IDfollowup_api_error_does_not_pollAPI 在受理前失败时不进入轮询followup_terminal_failure_surfaces_status_message轮询前就出现终端失败时浮出状态消息followup_without_previous_session_id_accepts_joinable_session未提供旧会话 ID 时接受任何可加入会话followup_without_previous_session_id_errors_if_run_finishes_before_session无旧会话 ID 时运行先于会话结束则报错followup_skips_prior_terminal_state_until_working_then_attaches跳过先前终态、观察到 working 后挂接新会话followup_skips_prior_terminal_then_surfaces_real_failure跳过残留终态后浮出真实失败followup_cancelled_state_breaks_skip_loopCancelled状态穿透跳过逻辑followup_bounded_skip_for_server_stall服务端卡死时跳过有上限、最终失败同时要求保留既有spawn_task测试确保重构后初始 spawn 行为不变模型级测试若有轻量 harness 则补充否则保持模型改动小、以流测试加定向编译检查验证。模型断言应覆盖submit_cloud_followup前置条件、WaitingForSession { kind: Followup }以及新会话上的ExecutionSessionReady发出。规格给出的定向验证命令cargo nextest run -p warp ai::ambient_agents::spawn::tests \ server::server_api::ai::tests::build_run_followup_url_routes_to_run_followups \ server::server_api::ai::tests::serialize_run_followup_request cargo check -p warp --features handoff_cloud_cloud若新增模型或终端视图测试需包含对应模块过滤器。注意不要使用cargo fmt --all或针对单个文件的cargo fmt仅在准备 PR 更新时使用仓库的标准格式化命令。七、发布、兼容性与风险缓解7.1 双重门控下的安全性标志关闭时生产 UI 不会调用新的 follow-up 方法既有初始 Cloud Mode 启动行为与今天完全一致spawn_task公开流契约不变、初始spawn_task测试保持绿色标志开启时PR 2 只暴露内部/模型级 follow-up 路径由于没有可见入口可以安全地在产品 UX 落地前合并单元测试仍可完整演练编排路径运行时代码在HandoffCloudCloud启用时可假定CloudModeSetupV2可用因为该 Cargo feature 依赖已在 PR 1 编码进 app/Cargo.toml。7.2 风险与缓解对照风险缓解措施服务端受理 follow-up 后短暂返回已结束执行的会话字段把旧会话 ID 传入轮询 helper要求解析出的会话 ID 与旧 ID 不同才发就绪复用DispatchedAgent导致初始 run 的 UI 痕迹再次出现使用独立的FollowupDispatched事件与显式SessionStartupKind重构spawn_task回归初始 Cloud Mode 启动保持公开流契约、既有 spawn 测试全绿follow-up 被受理但新会话始终不可加入复用既有 failed/auth/quota/capacity UI 状态未来 UI 可从 tombstone 重试PR 3会话结束通知丢失导致模型记账漂移提交 follow-up 时回退到最后活跃执行会话 ID7.3 并行化路径该 PR 体量较小可顺序实现如需并行可拆成两条独立轨道轨道 A用 mockedAIClient重构并测试 spawn.rs 的 follow-up 轮询轨道 B接线AmbientAgentViewModel的状态/事件与 terminal-manager 的记账。两条轨道在submit_cloud_followup汇合——它消费 follow-up helper 并发出ExecutionSessionReady。八、完成定义Definition of Done对照规格PR 2 的完成标准如下这也是评审者逐项验收的清单抽取可复用轮询后spawn_task对初始 run 的行为与之前完全一致follow-up helper 提交提示词、轮询稳定 run、忽略陈旧会话 ID、返回全新可加入会话AmbientAgentViewModel::submit_cloud_followup存在于HandoffCloudCloud开关之后并驱动WaitingForSession { kind: Followup }走完成功与错误状态新会话发出ExecutionSessionReady并继续通过既有 hotswap 路径挂接本 PR 不新增 tombstone Continue UI 或终端输入 follow-up 路由定向测试与cargo check -p warp --features handoff_cloud_cloud全部通过。九、从规格到代码如何继续深入若要进一步研究本机制的实现细节建议按以下路径阅读仓库编排流核心app/src/ai/ambient_agents/spawn.rsspawn_task/monitor_spawned_task/submit_run_followup/poll_run_until_joinable_session/SessionJoinInfo及其测试 spawn_tests.rs任务与执行投影app/src/ai/ambient_agents/task.rsAmbientAgentTask、active_run_execution、RunExecution、AmbientAgentLiveSessionStateAPI 客户端app/src/server/server_api/ai.rsRunFollowupRequest、submit_run_followup、build_run_followup_url与 ai_test.rs视图模型状态机app/src/terminal/view/ambient_agent/model.rsSessionStartupKind、Status、submit_cloud_followup、record_ambient_execution_ended、事件枚举视图与热切换接线app/src/terminal/view/ambient_agent/mod.rs、view_impl.rs、app/src/terminal/shared_session/viewer/terminal_manager.rs。整体来看PR 2 通过可复用的轮询流 显式的启动类型枚举 纯记账的会话结束通知 独立的分派事件四层设计把 cloud-to-cloud handoff 的编排骨架与既有 hotswap 机制无缝衔接同时以特性标志与严格非目标保住合并安全——这是一份典型的能力先行、UI 后置的分阶段落地范本也为后续 PR 3 的 tombstone Continue 交互预留了清晰的挂载点is_ready_for_cloud_followup_prompt、pending_followup_prompt与SessionStartupKind::Followup。赞分享桌面应用开发者工具人工智能AI 应用AI Agent代码智能体【免费下载链接】warpWarp is an agentic development environment, born out of the terminal.项目地址https://gitcode.com/GitHub_Trending/wa/warp点击查看免费下载相关推荐Warp Cloud Mode 执行接力Cloud-to-Cloud Follow-up技术规范基于 HandoffCloudCloud 的共享会话热切换实现Warp Cloud Mode 执行接力Cloud to Cloud Follow up技术规范基于 HandoffCloudCloud 的共享会话热切换桌面应用开发者工具人工智能AI 应用AI Agent代码智能体Open-Sora 2.0 图生视频单卡实战指南60 秒跑出你的第一条 256px 视频Open Sora 2.0 图生视频单卡实战指南60 秒跑出你的第一条 256px 视频 Open Sora 2.0 是一个全开源的 11B 视频生成模型一人工智能大模型媒体生成音视频预训练分布式训练Bokeh 3.8.0 新特性全解析HoverTool 过滤排序、SizeBar 尺寸标注与会话重连机制Bokeh 3.8.0 新特性全解析HoverTool 过滤排序、SizeBar 尺寸标注与会话重连机制 本文以 Bokeh 官方 3.8.0 版本发布说明数据可视化图表库上一篇Sketchfab下载器入门一个Firefox用户脚本让3D模型下载从25分钟缩到90秒下一篇9种格式一键导出全部成就YaeAchievement 原神成就导出工具上手全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门