- 桌面应用
- 开发者工具
- 人工智能
- AI 应用
- AI Agent
- 代码智能体
【免费下载链接】warp
Warp is an agentic development environment, born out of the terminal.
当 Warp 的 Agent 以「编排者(Orchestrator)」身份派生子代理(child agent)并行工作时,父会话原有的信用消耗统计只反映编排者自身,子代理产生的信用消耗被完全隐藏。本篇技术指南围绕仓库中的 specs/QUALITY-671/TECH.md 及其配套产品规格 specs/QUALITY-671/PRODUCT.md,深入剖析 Warp 如何通过
compute_orchestration_rollup聚合编排者与全部本地已知后代的信用消耗,在折叠 footer 药丸与展开的使用摘要(USAGE SUMMARY)中呈现「编排总成本」,并支持按代理展开明细。读完本文,你将理解 rollup 纯函数的聚合与排序规则、children_by_parent拓扑索引的遍历方式、展开/折叠 footer 的本地 UI 状态管理,以及这套自门控(self-gating)机制如何在不引入新 feature flag 的前提下保持旧 UI 完全兼容。
背景:orchestration 场景下被隐藏的真实成本
Warp 的 agent-mode footer 在两种层级渲染:
- 折叠 footer(credits + 折叠箭头的小药丸):由 app/src/ai/blocklist/block/view_impl/output.rs 中的
render_usage_button构建,读取conversation.credits_spent()、credits_spent_for_last_block()、token_usage()与tool_usage_metadata().total_tool_calls()。当这些数据全部为空时按钮被完全抑制。 - 展开 footer(完整使用摘要):由 app/src/ai/blocklist/usage/conversation_usage_view.rs 中的
ConversationUsageView持有,输出 "USAGE SUMMARY"、"TOOL CALL SUMMARY" 与 "LAST RESPONSE TIME" 三个区块。
当某个会话是编排者时,它派生的子代理(children)、孙代理(grandchildren)在远端或本地持续消费信用,但这些消耗从未出现在父会话的 footer 上——父会话展示的永远只是自己的「自我消耗」。这让用户无法直观判断一次 orchestration run 的端到端真实成本,尤其是当编排者本身只做了少量「调度」工作而把大部分 token 消耗分发给子代理时。
QUALITY-671 的目标正是修复这一信息缺口:在父会话的展开 footer 中,将 "Credits spent (total)" 行替换为编排总成本(编排者 + 所有本地已知后代,传递性地求和),并在其下方提供一个可点击展开的按代理(per-agent)信用明细列表。同时,折叠 footer 的药丸 headline 数字也切换到编排总数,让用户无需展开即可一眼看到真实成本。
产品行为总览(PRODUCT invariants)
specs/QUALITY-671/PRODUCT.md 以 17 条行为不变量(invariants)锁定 v1 范围,核心几条如下:
- invariant 1:凡是没有本地加载后代会话、或加载的后代全部零消耗的会话,footer 渲染与今天完全一致,不新增任何 UI。
- invariant 2:当 footer 所属会话是编排者且至少有一个本地加载、已消耗信用的后代时:
- 2a:"Credits spent (total)" 数值变为编排总数(orchestrator + 所有本地已知后代,传递求和);
- 2b:数值行右侧同一行出现带下箭头图标的 "View details" 链接;
- 2c:点击后链接变为 "Hide details" + 上箭头图标,并在该行下方展示 per-agent 明细列表;
- 2d:再次点击折叠,恢复 "View details"。
- invariant 3:"Credits spent (last response)" 行永远只反映编排者自身最近一个 block 的信用,绝不参与 rollup。
- invariant 4:v1 只做信用(credits)的 rollup;Tool calls、Models、Context window、TOOL CALL SUMMARY 与 LAST RESPONSE TIME 全部保持自我(self-only)。
- invariant 5:per-agent 列表按信用降序排列,平局按 spawn 顺序(先 spawn 在前);每行展示头像圆盘、显示名与
format_credits格式化的信用值;只包含消耗 > 0 的代理;≤5 行全展示,>5 行展示前 5 行加 "Show N more" 链接,点击后全部展示且链接消失(不会变成 "Show fewer");v1 中列表行不可点击。 - invariant 6:折叠 footer 再展开时,"View details" 与 "Show N more" 的本地 UI 状态自动重置。
- invariant 7:footer 打开期间,rollup 总数、列表内容与 "Show N more" 计数随子代理流式消耗实时更新。
- invariant 10:本地未加载的后代会话不参与 rollup、不进入列表,且 v1 不做任何警告提示(best-effort 求和)。
- invariant 11:折叠药丸显示编排总数;
(+N)增量注解仍使用编排者自身最近 block 的信用;「无使用数据则隐藏按钮」的判定基于 rollup 总数。 - invariant 17:设置页(Settings-mode)的 usage 视图完全不变,rollup 仅作用于
DisplayMode::Footer。
聚合核心:rollup.rs的纯函数实现
新增模块 app/src/ai/blocklist/usage/rollup.rs 暴露了 rollup 的全部数据模型与计算入口。TECH.md 中定义的核心结构(实现后略有扩充)如下:
pub enum AgentAvatar { /// 编排者本身:渲染 Oz 字形于 ansi_fg_cyan。 Orchestrator, /// 后代代理:复用 orchestration pill bar 的确定性颜色 + 大写首字母。 Child, } pub struct PerAgentCreditEntry { pub conversation_id: AIConversationId, pub display_name: String, pub avatar: AgentAvatar, pub credits_spent: f32, } pub struct OrchestrationCreditRollup { pub total_credits: f32, pub total_cost_in_cents: Option<f32>, pub total_tokens: Option<u32>, pub per_agent: Vec<PerAgentCreditEntry>, } pub fn compute_orchestration_rollup( parent_id: AIConversationId, history: &BlocklistAIHistoryModel, ) -> Option<OrchestrationCreditRollup>;返回None的两个条件
对照 rollup.rs 的实现,compute_orchestration_rollup在以下情况返回None:
- 编排者没有任何本地加载的后代:先调用
descendant_conversation_ids_in_spawn_order(history, parent_id)获取后代 ID 列表,为空则直接返回None(对应 invariant 1)。 - 所有候选代理(编排者 + 后代)信用均为零:
entries列表为空时返回None(对应 invariant 7)。
值得注意的是一个微妙点:编排者自身即使有大量消耗,只要没有后代,就不会触发 rollup——rollup 的存在意义就是聚合整个编排树,而不是单独替编排者改变显示。
逐会话累加与零信用跳过
对编排者本身以及每个加载的后代,代码执行:
let credits = orchestrator.credits_spent(); total_credits += credits; // 零信用贡献者跳过 cost/token 累加:它尚未上报任何使用量, // 其 None 计费元数据不得污染已产生贡献的累加总和。 if credits > 0.0 { let usage_totals = orchestrator.usage_totals(); accumulate_cost(&mut total_cost_in_cents, usage_totals.total_cost_in_cents()); accumulate_tokens(&mut total_tokens, usage_totals.charged_usage.map(|u| u.total_tokens())); entries.push(PerAgentCreditEntry { /* ... */ }); }这条「零信用跳过」逻辑非常关键:新 spawn 的子代理在首次上报使用量之前,其charges元数据是None;如果把它当作未知基线参与累加,会通过accumulate_cost/accumulate_tokens的(Some, None) => None传播逻辑,把整个美元成本或 token 总数永久置为None。而「尚未消费任何东西」的代理不应该拥有这种否决权——它什么都没贡献,自然也不应破坏已贡献者的汇总。这正是 rollup_tests 中zero_credit_descendant_does_not_poison_cost_or_token_totals用例要锁定的行为。
total_cost_in_cents与total_tokens的全有或全无语义
与total_credits不同,美元成本与 token 总数是Option类型,遵循全有或全无语义:
- 当每个有信用贡献的会话都有已知的计费基线(charged usage)时,返回完整求和(如
Some(66.0)); - 只要任意一个贡献者缺失基线(例如遗留会话、
PricingTransparencyflag 关闭的源),累加器就永久传播None——与其展示一个不完整的部分和,不如整体省略美元/ token 数字,避免误导。
在折叠药丸的 headline 区域,render_usage_button同样遵循这条拆分规则:rollup 存在时,美元成本与 token 取自rollup.total_cost_in_cents/rollup.total_tokens;rollup 为None的非编排会话则回退到会话自身的usage_totals()(见 output.rs 中headline_cost_in_cents/headline_tokens的unwrap_or_else分支)。
排序规则:信用降序 + spawn 顺序平局
entries以(spawn_idx, PerAgentCreditEntry)元组收集:编排者固定以spawn_idx = 0插入(因此信用相同时编排者永远排在后代之前),后代按遍历顺序从 1 开始编号。最终排序:
entries.sort_by(|a, b| { b.1.credits_spent.partial_cmp(&a.1.credits_spent) .unwrap_or(Ordering::Equal) .then(a.0.cmp(&b.0)) });即信用降序,平局时早 spawn 者在前。这精确实现了 invariant 5b。
显示名回退
- 编排者行:优先
agent_name(),为空则回退为"Orchestrator"; - 子代理行:优先
agent_name(),为空则回退为"Agent"——这与 orchestration pill bar 的标签回退保持一致(见 orchestration_pill_bar.rs 中的同名回退),保证 footer 明细与 pill bar 的命名观感统一。
拓扑遍历:children_by_parent索引与 spawn-order walker
rollup 依赖的遍历能力来自共享模块 app/src/ai/blocklist/orchestration_topology.rs,这正是 TECH.md 强调的「从 pill bar 提取、禁止重复实现」的落地成果:
BlocklistAIHistoryModel维护一个children_by_parent父子索引(由start_new_child_conversation与set_parent_for_conversation维护,见 history_model.rs 中child_conversation_ids_of等 API)。descendant_conversation_ids_in_spawn_order通过递归的collect_descendant_conversation_ids_in_spawn_order,以**先序(pre-order)**遍历整棵子树,每一层保持父节点的子注册顺序,返回扁平化列表:
pub fn collect_descendant_conversation_ids_in_spawn_order( history: &BlocklistAIHistoryModel, parent_id: AIConversationId, descendants: &mut Vec<AIConversationId>, ) { for child_id in history.child_conversation_ids_of(&parent_id) { descendants.push(*child_id); collect_descendant_conversation_ids_in_spawn_order(history, *child_id, descendants); } }两个实现要点:
- walker 只读
children_by_parent索引,因此即使子会话尚未加载进conversations_by_id,其 ID 也会被返回;rollup 侧再通过history.conversation(&id)过滤——查不到AIConversation的「未加载后代」被静默跳过(invariant 10)。 - 遍历顺序天然构成 spawn-order 平局依据,rollup 无需再引入时间戳比较。
该模块还沉淀了其他编排拓扑工具(如orchestration_root_conversation_id、aggregated_orchestrator_status、loaded_subtree_rollup),说明这套 walker 已成为键盘导航、pill bar 状态汇总与信用 rollup 共享的基础设施。
展开 footer:ConversationUsageView的 rollup 接线
两种构造路径与rollup()短路
conversation_usage_view.rs 中ConversationUsageView扩展出两类构造:
new(...):Settings 模式与旧 footer 路径使用,parent_conversation_id置为None;new_footer_with_rollup(...):footer 构造方始终使用,持有父会话 ID,并在渲染期调用compute_orchestration_rollup。
内部rollup()方法先做两道短路检查:
fn rollup(&self, app: &AppContext) -> Option<OrchestrationCreditRollup> { if self.display_mode != DisplayMode::Footer { return None; // Settings 模式直接短路 } let parent_id = self.parent_conversation_id?; // 非 rollup 构造路径 let history = BlocklistAIHistoryModel::as_ref(app); compute_orchestration_rollup(parent_id, history) }因此 Settings 模式即使误传了 rollup 数据也不会渲染任何 rollup UI(invariant 17 的防御性行为)。
渲染管线:总数行、toggle 与 per-agent 列表
render_unified_layout中,"Credits spent (total)" 的数值来源被替换:
let total_credits_value = rollup .as_ref() .map(|r| r.total_credits) .unwrap_or(self.usage_info.credits_spent + self.usage_info.platform_credits_spent);当rollup.is_some()时,render_total_usage_value_row在数值右侧追加render_toggle_link("View details" +Icon::ChevronDown/ "Hide details" +Icon::ChevronUp,采用ansi_fg_blue超链接色、Cursor::PointingHand,可键盘聚焦、Enter/Space 激活——满足 invariant 14)。
append_per_agent_rows在details_expanded == true时把每行代理压入 label/value 双列布局:
- 头像圆盘:
AgentAvatar::Orchestrator用render_orchestrator_avatar_disc(Oz 字形 +ansi_fg_cyan),Child用render_agent_avatar_disc(按名字的确定性颜色 + 大写首字母),圆盘直径 16px; - 名称列:使用
text_disabled色(与 USAGE SUMMARY 区块标题同色,让明细行读起来是区块的子列表而非竞争主标签),并钳制在PER_AGENT_LABEL_MAX_WIDTH = 110.0内、超长省略号截断——与 pill bar 的PILL_LABEL_MAX_WIDTH镜像,防止长代理名把信用值列挤出屏幕; - 数值列:
format_credits(entry.credits_spent)并使用text_sub色,视觉上与 "Credits spent" 标签呼应。
5 行截断与 "Show N more"
PER_AGENT_BREAKDOWN_TRUNCATION_CAP = 5常量实现 invariant 5e/5f:
let shown_entries = if total_entries > PER_AGENT_BREAKDOWN_TRUNCATION_CAP && !self.show_all_clicked { PER_AGENT_BREAKDOWN_TRUNCATION_CAP } else { total_entries };隐藏行数N = total_entries - shown_entries时,左侧渲染 "Show N more" 超链接(dispatchShowAllAgentRows动作),右侧渲染一个单空格Text占位符——这里有个值得注意的细节:Empty元素高度为零,会让右列少一行,导致后续 "Tool calls" 与 "Show N more" 错位配对;单空格Text强制产生与链接等高的行高,保证双列 flex 布局行对齐(见render_value_text_placeholder的注释)。
本地 UI 状态与动作管线
ConversationUsageViewAction提供类型化动作面:
ToggleDetailsExpanded:翻转details_expanded;折叠时同时把show_all_clicked复位为false,使用户下次展开时回到截断列表;ShowAllAgentRows:置show_all_clicked = true;ToggleContextWindowExpanded:控制既有 context-window 分段明细(与本特性无关的既有能力)。
关键设计:展开 footer 的视图实例在is_usage_footer_expanded每次翻转为 true 时由render_usage_footer全新构建,折叠期间并不持有实例。因此details_expanded/show_all_clicked在折叠再展开时天然复位(invariant 6),无需显式清理。TECH.md 同时提醒:若未来实现将视图实例跨折叠缓存,则必须在打开过渡时显式复位,或把布尔量提升为父级重建的 props。
折叠药丸:render_usage_button的 rollup 消费
output.rs 中的render_usage_button无条件调用:
let rollup = compute_orchestration_rollup(conversation.id(), BlocklistAIHistoryModel::as_ref(app));随后三处决策切换为 rollup 语义:
- headline 数字(invariant 11):
headline_credits = rollup.map(|r| r.total_credits).unwrap_or_else(|| conversation.credits_spent()); - 美元/ token headline:分别取
rollup.total_cost_in_cents/rollup.total_tokens,回退到会话自身usage_totals(); - 「无使用数据则隐藏按钮」判定(invariant 11b):
has_any_usage中的headline_credits > 0.0检查用的是 rollup 总数——只要任意贡献代理消费了一个信用,药丸就会出现,即使编排者自身还没花任何钱。
而(+N)增量注解完全不变(output.rs 中credits_spent_for_last_block > 0.0 && total_credits_spent != credits_spent_for_last_block && 无错误的既有条件):它继续读取编排者自身的credits_spent_for_last_block(),语义变为「编排者最近一次响应为编排总数新增的信用」。rollup 激活时 headline ≫ last block,因此只要编排者最近有响应,注解就会出现——这正是 invariant 11a 期望的行为。
自门控在这里同样成立:会话没有后代时 helper 返回None,药丸与今天逐像素一致。
实时更新:事件订阅驱动的 footer 重渲染
invariant 7/8/9 要求 footer 打开期间 rollup 随子代理消耗实时变化。new_footer_with_rollup通过ctx.subscribe_to_model(&history_model, ...)订阅BlocklistAIHistoryModel,事件过滤逻辑值得细读:
let touched_id = match event { BlocklistAIHistoryEvent::ConversationUsageMetadataUpdated { conversation_id } | BlocklistAIHistoryEvent::RemoveConversation { conversation_id, .. } | BlocklistAIHistoryEvent::DeletedConversation { conversation_id, .. } => *conversation_id, _ => return, }; if touched_id == parent_conversation_id { ctx.notify(); return; } if descendant_conversation_ids_in_spawn_order(history, parent_conversation_id).contains(&touched_id) { ctx.notify(); }三个设计决策:
- 窄化事件过滤:只对
ConversationUsageMetadataUpdated与两类删除事件唤醒,避免「终端输入风暴」扇出到所有 rollup 订阅者导致昂贵的全量重渲染; StartedNewConversation刻意排除:新 spawn 的子代理信用必为零,rollup 结果不变,直到它首次ConversationUsageMetadataUpdated(invariant 8 由信用更新路径满足,而非 spawn 事件本身);- 删除事件的特殊时序:
RemoveConversation/DeletedConversation在会话从conversations_by_id移除之后才触发,但children_by_parent索引在移除时并不清理,因此被剪枝的后代仍能被contains(&touched_id)命中——这允许父 footer 在剪枝时正确重渲染,渲染期 rollup 再通过「已加载过滤」跳过缺失会话,行随之消失(invariant 9)。
此外订阅还涵盖了AISettingsChangedEvent::UsageDisplayUnit,切换信用显示单位时同步重渲染。ConversationUsageMetadataUpdated事件本身由 history_model.rs 在会话使用元数据变更(StreamFinished处理路径)时ctx.emit(...)产生。
自门控:为什么不需要独立 feature flag
TECH.md 明确:没有专门的OrchestrationCreditRollupflag。rollup 的激活完全由数据驱动:
- 无本地加载后代 →
None; - 所有加载后代零信用 →
None; - Settings 模式 →
rollup()短路None。
而「创建子代理」的能力本就受FeatureFlag::OrchestrationV2门控,「展开 footer 表面」受FeatureFlag::AgentView门控——rollup 只可能在两个 flag 均已开启、用户本来就具备创建与查看编排能力时触达。再加第三个 flag 只会提供 kill-switch,而数据自检已经提供了同样的安全网(rollup 无内容可加时保留今天 UI),且免除了 flag 清理负担。
测试与验证体系
单元测试(rollup_tests.rs)
通过#[cfg(test)] #[path = "rollup_tests.rs"] mod tests;内联进模块,覆盖:
| 测试用例 | 锁定 invariant |
|---|---|
returns_none_when_orchestrator_has_no_descendants | 编排者自身有信用但无后代 →None(invariant 1) |
sums_orchestrator_and_loaded_descendants | 编排者 3 + 子代理 30 → total 33,per_agent 2 行降序(2a, 5a, 5b) |
excludes_zero_credit_descendants_from_breakdown | 混合信用含零信用子代 → 排除后 3 行降序(5b, 5d) |
rolls_up_grandchildren_transitively | 父→子→孙三代传递求和(2a) |
returns_six_contributors_for_show_n_more_caller | 6 贡献者 → per_agent.len()==6(5e/5f 的 caller 侧) |
returns_none_when_only_orchestrator_has_zero_credits_with_loaded_children | 全部零信用 →None(invariant 7) |
ties_break_by_spawn_order_earlier_first | 等信用平局 → 先 spawn 在前(5b) |
unloaded_descendant_id_is_silently_skipped | 拓扑索引中有 ID 但conversations_by_id缺失 → 静默跳过(invariant 10) |
sums_cost_in_cents_when_all_contributors_have_a_baseline/omits_cost_in_cents_... | 美元成本全有/全无语义 |
zero_credit_descendant_does_not_poison_cost_or_token_totals | 零信用后代不污染 cost/token 汇总 |
测试通过set_credits_spent_for_test/set_cost_in_cents_for_test/set_charged_usage_for_test等测试辅助方法注入数据,并借助start_new_child_conversation构建编排树。
渲染器测试(conversation_usage_view_tests.rs)
DisplayMode::Footer+Some(rollup):总数行显示 rollup 总数与 "View details ▼",点击后展开为 "Hide details ▲"(invariant 2a–2d);- 5 行列表全展示、无 "Show N more";6 行列表展示 5 行 + "Show 1 more",点击后第 6 行出现且链接消失(invariant 5e/5f);
- 折叠再展开重建视图 →
details_expanded == false且show_all_clicked == false(invariant 6); DisplayMode::Settings即使传入 rollup 也不渲染 toggle 与列表(防御性,invariant 17);- 无后代会话(
rollup() == None):总数行与今天完全一致(invariant 13); - "Credits spent (last response)" 无论 rollup 状态都不变(invariant 3)。
折叠药丸测试(output_tests.rs区域)
- 非空 rollup:headline 等于
rollup.total_credits(invariant 11); - rollup
None(无后代或仅零信用后代):headline 等于conversation.credits_spent()(invariants 11, 13); (+N)注解始终基于credits_spent_for_last_block(invariant 11a);- 隐藏按钮判定在适用时基于 rollup 总数(invariant 11b)。
手动验证清单
TECH.md 给出完整手测路径:启动带三个子代理的本地编排(oz-local或应用内编排器),观察折叠药丸显示编排总数、展开 footer 总数一致、"View details" 按信用降序展示编排者与子代理;在视图打开时让子代理完成一次响应,确认药丸数字与展开 rollup 无需重新展开即更新;spawn 7+ 子代理验证 5 + "Show N more" 交互;折叠再展开确认列表回到截断态;在非编排会话上打开同一 footer 确认与今天渲染一致、无 "View details" 入口。提交前运行./script/presubmit,格式化、clippy 与测试必须通过。
方案取舍与备选设计
TECH.md 记录了 v1 决策过程:
- 客户端聚合(选定):每个已加载后代的元数据本就在客户端,遍历求和为 O(n),n 受限于本地加载的编排树(实践中很小)。限制是远端独占后代静默不可见(invariant 10 接受)——实践中该缺口很小,因为服务端使用更新会流式到达客户端。
- 服务端 rollup(v1 拒绝):在 GraphQL 增加
conversationUsageRollup(parentId)字段在服务端遍历 run 树。优点是可覆盖远端后代;缺点是新查询生命周期、与 per-conversation 元数据可能漂移的第二真相源、服务端工作量。若真实场景的偏差造成困惑,作为后续推荐方案。 - 独立 "ORCHESTRATION TOTAL" 区块(拒绝,先前的 strawman):在 USAGE SUMMARY 下新增区块会重复信用数字并视觉割裂 footer;Figma 设计将 rollup 融入既有 "Credits spent (total)" 行更干净。
- 其他指标一并 rollup(推迟):v1 只做信用;helper 未来可拓宽到 tool_calls、files_changed 等。
- 折叠药丸取编排总数 vs 自我总数:取编排总数(invariant 11)让真实成本无需展开即见;
(+N)增量保持编排者自身 last-block 信用,因为这是无需追踪代理间时序即可获得的唯一有意义的每响应增量。
风险与缓解
- 每次渲染的树遍历成本:实践中编排树很小(≪100 节点),O(n) 常数可忽略;折叠药丸每帧渲染,若 profiling 表明必要,可在
BlocklistAIHistoryModel上记忆化 rollup(或缓存于父视图),并在驱动实时更新的同一事件上失效。 - 子代理 spawn 时药丸数字跳变:只盯药丸的用户可能对子代理开始消耗后的突然增长感到意外;这是「一眼见真实成本」的合理代价——既有
(+N)增量仍显示编排者自身最近响应,用户可据此归因跳变。 - 显示名回退:部分子代理
agent_name == None(如 v1 编排或命名前 spawn),回退到 "Agent" 短标签(与 pill bar 一致),需要时记录于DECISIONS.md。 - rollup 前元数据陈旧:fork 或恢复的会话在下次
StreamFinished或 GraphQL hydrate 完成前可能短暂携带陈旧conversation_usage_metadata;下次渲染即纠正,可接受。
后续方向
TECH.md 列出的 follow-ups:
- 将 rollup 拓宽到其他指标(tool calls、代码编辑次数)——v1 仅限信用;
- 服务端 rollup 查询,使远端独占后代始终计入(invariant 10 的收尾);
- per-agent 行可点击(打开对应代理会话)——invariant 5g 当前禁止,留待 v1 之后;
- 在 orchestration pill bar 的编排者药丸上展示 rollup 信用 chip(orchestration_pill_bar.rs 的 hover 卡片在
1044-1314行附近留有空间)。
关键源码路径速查
| 关注点 | 文件 |
|---|---|
| 技术规格(本文主体) | specs/QUALITY-671/TECH.md |
| 产品行为不变量 | specs/QUALITY-671/PRODUCT.md |
| rollup 纯函数实现 | app/src/ai/blocklist/usage/rollup.rs |
| rollup 单元测试 | app/src/ai/blocklist/usage/rollup_tests.rs |
| 展开 footer 视图 | app/src/ai/blocklist/usage/conversation_usage_view.rs |
| 折叠药丸渲染 | app/src/ai/blocklist/block/view_impl/output.rs |
| 编排拓扑 walker | app/src/ai/blocklist/orchestration_topology.rs |
| 父子索引与使用元数据事件 | app/src/ai/blocklist/history_model.rs |
| 头像/显示名辅助来源 | app/src/ai/blocklist/agent_view/orchestration_pill_bar.rs |
| 会话使用元数据 GraphQL 填充 | crates/graphql/src/api/queries/get_conversation_usage.rs |
- 桌面应用
- 开发者工具
- 人工智能
- AI 应用
- AI Agent
- 代码智能体
【免费下载链接】warp
Warp is an agentic development environment, born out of the terminal.
相关推荐
Warp TUI 的 Token/成本透明度:footer 用量入口与响应摘要行的设计与实现(CODE-1828)
Warp TUI 的 Token/成本透明度:footer 用量入口与响应摘要行的设计与实现(CODE 1828) 导读 本指南围绕 Warp 开源仓库中 sp
桌面应用开发者工具人工智能AI 应用AI Agent代码智能体OpenRig Orchestration Team 技能实战:构建自运行 Agent 编排 Pod 的完整指南
OpenRig Orchestration Team 技能实战:构建自运行 Agent 编排 Pod 的完整指南 导读 本指南以 OpenRig 仓库中编排 P
人工智能AI Agent多智能体Agent 编排代码智能体CLIBilibiliSummary:智能视频摘要生成工具完整使用指南
BilibiliSummary是一款专为B站视频设计的Chrome扩展插件,能够快速分析视频内容并生成精炼摘要。通过智能字幕解析技术,用户可在5秒内获取视频的核
人工智能AI 应用大模型
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考