- 桌面应用
- 开发者工具
- 人工智能
- AI 应用
- AI Agent
- 代码智能体
【免费下载链接】warp
Warp is an agentic development environment, born out of the terminal.
导读
本文围绕 Warp(agentic 开发环境)中一项面向用户的新设置——**Suggested Rules(建议规则)**展开,讲解如何通过设置开关与 TOML 配置键,关闭 AI 在 agent 回复完成后展示的"建议保存规则"内联 chips。读者将了解该功能的产品行为定义、Settings → Oz → Knowledge 页面的呈现规则、agents.warp_agent.active_ai.rule_suggestions_enabled配置项的读写机制,以及底层渲染强制执行点与"Don't show again"按钮的实现细节。
该功能的产品规格见 specs/andy/ad-hoc/disable-suggested-rules/PRODUCT.md,技术设计见同目录下的 TECH.md,本文结合当前仓库源码对两者进行系统化展开。
一、功能背景:什么是规则建议 chips
在 Warp 的 Agent 模式下,一次 agent 回复结束后,AI 会在回复块的底部渲染一组内联规则建议 chips(rule-suggestion chips),用于提示用户可以将本次交互中总结出的行为保存为规则(Rules)。这些 chips 由FeatureFlag::SuggestedRules功能开关统一控制,相关枚举定义在 crates/warp_features/src/lib.rs(SuggestedRules与SuggestedAgentModeWorkflows相邻声明)。
"Suggested Rules" 设置的目标是:让用户可以通过一个用户可见的开关,彻底关闭这类规则建议 chips 的展示,从而在不需要"让 AI 帮忙沉淀规则"的工作流中获得更干净、更专注的回复界面。
二、产品行为总览
PRODUCT.md 将功能拆解为 11 条明确行为,核心结论可归纳如下:
| 行为维度 | 具体规则 |
|---|---|
| 设置位置 | Settings → Oz → Knowledge 的Knowledge分区,紧邻现有Rules开关下方 |
| 显示条件 | 仅当SuggestedRulesfeature flag 开启时,该开关才出现在设置界面 |
| 默认值 | 默认开启(true) |
| 开关描述 | "Let AI suggest rules to save based on your interactions." |
| 开启时 | 行为不变:agent 回复完成后仍会在回复块底部展示规则建议 chips |
| 关闭时 | 所有 agent 回复块不再展示规则建议 chips;已渲染的历史建议不会被回溯隐藏,只影响未来回复 |
| 与 Rules 开关的关系 | 相互独立:关闭 Rules 不会自动关闭 Suggested Rules,反之亦然 |
| 云同步 | 通过标准全局同步机制跨设备同步,与 Prompt Suggestions 等 Active AI 设置一致 |
| 全局 AI 关闭时 | 开关置灰不可交互,与所有其他 AI 子设置保持一致 |
| feature flag 关闭时 | 设置界面不显示该开关;但已持久化的值仍被保留,重新开启 flag 后恢复用户偏好 |
| 额外按钮 | 建议 footer 中出现"Don't show again"按钮(位于现有Dismiss左侧),点击后永久关闭该设置并立即移除当前块的建议 chips |
同时需注意边界:Agent mode workflow suggestion chips(无规则建议时的兜底提示)不受此设置影响,它们由SuggestedAgentModeWorkflows这个独立的 feature flag 控制。
三、设置入口与 UI 呈现
3.1 Knowledge 页面的挂载逻辑
Knowledge 页面的 widget 组装逻辑位于 app/src/settings_view/knowledge_page.rs 的build_page():
fn build_page() -> PageType<Self> { let mut widgets: Vec<Box<dyn SettingsWidget<View = Self>>> = Vec::new(); if FeatureFlag::AIRules.is_enabled() { widgets.push(Box::new(RulesWidget::default())); if FeatureFlag::SuggestedRules.is_enabled() { widgets.push(Box::new(SuggestedRulesWidget::default())); } widgets.extend([ Box::new(ManageRulesWidget::default()), Box::new(WarpDriveContextWidget::default()), ]); } PageType::new_uncategorized(widgets, Some(PageTitle::new(PAGE_TITLE))) }从源码可以确认两条页面组织规则:
- Suggested Rules 开关只有在
AIRules与SuggestedRules两个 flag 都开启时才渲染,且位置紧跟在RulesWidget之后、ManageRulesWidget与WarpDriveContextWidget之前,与 PRODUCT.md 中"直接位于 Rules 开关下方"的描述吻合; - 当
SuggestedRulesflag 关闭时,SuggestedRulesWidget不会进入 widget 列表,即设置界面完全不显示该开关(对应行为 9)。由于SuggestedRulesWidget仅在页面构建时按 flag 条件插入,此前已持久化的配置值不会丢失,后续 flag 重新开启即可恢复显示与用户偏好。
3.2 开关的渲染与交互
SuggestedRulesWidget通过render_ai_setting_toggle::<RuleSuggestionsEnabled>渲染开关行,读取ai_settings.rule_suggestions_enabled_internal作为当前状态,并使用is_any_ai_enabled作为is_toggleable参数——这与 Rules 开关(ToggleRules)使用同一参数口径,而不是更严格的is_active_ai_enabled。这意味着:只要全局 AI 开关(Oz)开启,Knowledge 分区内的子开关(包括 Suggested Rules)即可交互;全局 AI 关闭时,这些开关会统一置灰。
页面将开关动作建模为KnowledgePageAction::ToggleRuleSuggestions,其处理函数如下:
KnowledgePageAction::ToggleRuleSuggestions => { AISettings::handle(ctx).update(ctx, |settings, ctx| { let _ = settings .rule_suggestions_enabled_internal .toggle_and_save_value(ctx); }); ctx.notify(); }toggle_and_save_value是 settings 框架提供的原子操作:翻转内部值并立即落盘保存,这也是"点击开关即持久化、下次启动依然生效"(行为 7)的实现来源。
四、配置项:TOML 键与设置组定义
4.1rule_suggestions_enabled_internal字段
设置项本体定义在 app/src/settings/ai.rs 的define_settings_group!(AISettings, …)宏中(紧邻prompt_suggestions_enabled_internal之后):
// This field should not be referenced directly to lookup Rule Suggestions // enablement -- use the `is_rule_suggestions_enabled()` getter. rule_suggestions_enabled_internal: RuleSuggestionsEnabled { type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), surface: settings::SettingSurfaces::GUI, private: false, toml_path: "agents.warp_agent.active_ai.rule_suggestions_enabled", description: "Controls whether the agent suggests rules to save after responses.", feature_flag: FeatureFlag::SuggestedRules, }各字段含义与影响:
| 字段 | 值 | 说明 |
|---|---|---|
type | bool | 开关类型,默认值true对应行为 2(默认开启) |
supported_platforms | SupportedPlatforms::ALL | 全平台(macOS / Windows / Linux)可用 |
sync_to_cloud | Globally(RespectUserSyncSetting::Yes) | 走标准全局云同步,尊重用户自身的同步偏好设置,行为 6 的实现来源 |
surface | GUI | 仅暴露给图形界面设置页 |
private | false | 非私有设置 |
toml_path | agents.warp_agent.active_ai.rule_suggestions_enabled | 用户配置文件中对应的 TOML 键路径 |
feature_flag | FeatureFlag::SuggestedRules | 使该设置从用户可见 JSON schema 中排除,除非当前构建渠道启用了该 flag(行为 9 的机制来源) |
4.2 用户在配置文件中设置
由于toml_path为agents.warp_agent.active_ai.rule_suggestions_enabled,用户可以直接在 Warp 的 settings TOML 文件中写入:
[agents.warp_agent.active_ai] rule_suggestions_enabled = false保存后下次启动即生效(行为 7)。需要注意:该键位于active_ai分组下,与prompt_suggestions_enabled_internal(Prompt Suggestions)等"Active AI 功能开关"同组,共享同一套读取与同步逻辑。
4.3 读取入口:is_rule_suggestions_enabled()getter
设置组的注释明确要求:不得直接引用内部字段判断开关状态,必须使用 getter。getter 定义如下:
pub fn is_rule_suggestions_enabled(&self, app: &warpui::AppContext) -> bool { self.is_active_ai_enabled(app) && *self.rule_suggestions_enabled_internal }这个 getter 沿用了 Prompt Suggestions(is_prompt_suggestions_enabled)与 Code Suggestions(is_code_suggestions_enabled)完全相同的"opt-out Active AI 设置"模式:返回值是is_active_ai_enabled(app)与内部字段值的逻辑与。这意味着即使内部值仍为true,只要 Active AI 整体不可用(全局 AI 关闭或当前执行模式不允许 Active AI),该 getter 也会返回false——这正是"开关置灰 + 功能不生效"双重保证的源码级体现。
五、渲染强制执行点:handle_complete_output
规则建议 chips 的创建集中在 app/src/ai/blocklist/block.rs 的handle_complete_output中,这是唯一的渲染入口(TECH.md 明确"没有其他代码路径渲染规则建议 chips")。守卫条件从原先的单一 flag 检查扩展为双重检查:
if FeatureFlag::SuggestedRules.is_enabled() && AISettings::as_ref(ctx).is_rule_suggestions_enabled(ctx) { // Ensure we don't suggest rules that were already suggested and saved by checking the logging id. let existing_suggestions = self .suggested_rules .iter() .map(|rule| rule.read(ctx, |rule, _| rule.logging_id())) .collect_vec(); ... }从源码结构可以推断其工作流:
- 方法先读取历史模型中
existing_suggestions_for_conversation已存在的建议,并与本次output.suggestions合并; - 仅当 feature flag 开启且用户设置 getter 返回
true时,才进入"基于logging_id去重、生成SuggestionChipView实例"的逻辑分支; - 开关关闭时整个分支被短路,
suggested_rules保持为空,回复块底部不会渲染任何规则建议 chips(行为 4)。
由于handle_complete_output是唯一 chokepoint,因此无需在其他渲染路径重复检查——这是该实现"单点守卫"设计的核心优点,也保证了开关行为在 GUI 全场景(新对话、恢复会话、后续回复)的一致性。需要强调的是,该守卫只影响新完成回复的 chips 渲染;已在屏幕上渲染的历史建议不会因为开关翻转而被回溯隐藏,与行为 4 的描述完全一致。
六、"Don't show again"按钮的实现
当回复块底部展示规则建议 chips 时,footer 会额外出现"Don't show again"按钮(位于现有Dismiss按钮左侧)。其实现分散在三个文件中。
6.1 按钮创建(block.rs)
在AIBlock::new中,与既有的dismiss_suggestion_button并列创建:
let dismiss_suggestion_button = ctx.add_typed_action_view(|_| { ActionButton::new("Dismiss", SuggestionDismissButtonTheme) .with_icon(Icon::X) .with_size(ButtonSize::Small) .on_click(|ctx| { ctx.dispatch_typed_action(AIBlockAction::DismissSuggestionsSection); }) }); let disable_rule_suggestions_button = ctx.add_typed_action_view(|_| { ActionButton::new("Don't show again", SuggestionDismissButtonTheme) .with_size(ButtonSize::Small) .on_click(|ctx| { ctx.dispatch_typed_action(AIBlockAction::DisableRuleSuggestions); }) });两个按钮共用SuggestionDismissButtonTheme(视觉风格一致),差异在于点击后分发的 action 不同。
6.2 footer 组装(view_impl/output.rs)
TECH.md 描述render_suggested_rules_and_prompts_footer的改动:构造right_buttons行时,在has_suggested_rules为true的情况下,将disable_rule_suggestions_button(带margin_right: 4.0)前置插入到dismiss_suggestion_button之前。footer 的渲染同时负责规则建议 chips 与 workflow 建议 chips,仅当存在规则建议时才附加该按钮。Props通过新增字段disable_rule_suggestions_button: &'a ViewHandle<ActionButton>将句柄传入输出视图,并由 app/src/ai/blocklist/block/view_impl.rs 在构造Props时传递&self.disable_rule_suggestions_button。
6.3 点击处理(AIBlockAction::DisableRuleSuggestions)
action 处理器依次执行三步(见 block.rs 的 action 分发):
AIBlockAction::DisableRuleSuggestions => { // Dismiss the current suggestions and permanently disable future ones. BlocklistAIHistoryModel::handle(ctx).update(ctx, |model, _| { if let Some(conversation) = model.conversation_mut(&self.client_ids.conversation_id) { conversation.dismiss_current_suggestions(); } }); AISettings::handle(ctx).update(ctx, |settings, ctx| { report_if_error!( settings .rule_suggestions_enabled_internal .set_value(false, ctx) ); }); ctx.notify(); }- 持久化当前会话的 dismiss 状态:调用
conversation.dismiss_current_suggestions(),将本次会话中"已拒绝建议"的状态写入历史模型,保证该会话内不再重现; - 永久关闭设置:通过
rule_suggestions_enabled_internal.set_value(false, ctx)将设置写为false,与在设置页手动关闭开关效果完全一致(行为 11); - 立即清空当前块:
ctx.notify()触发重绘后,结合self.suggested_rules.clear()对 chip 视图的清除,即使conversation.existing_suggestions尚未由mark_request_completed填充,footer 也能立即消失。
set_value与toggle_and_save_value同样会持久化到用户配置,因此该按钮等效于"设置页开关关闭 + 当前块建议即时移除"的组合操作。
七、与其他开关、flag 的关系辨析
这一功能涉及多个易混淆的开关与 flag,理清边界对配置排查很有帮助:
| 名称 | 类型 | 作用范围 | 相互影响 |
|---|---|---|---|
| Rules(memory_enabled) | 设置开关 | 决定"已保存的规则是否包含进 agent 请求" | 与 Suggested Rules 相互独立,关闭一方不影响另一方(行为 5) |
| Suggested Rules(rule_suggestions_enabled_internal) | 设置开关 | 决定"回复完成后是否展示规则建议 chips" | 本文主角 |
| Oz 全局 AI(is_any_ai_enabled) | 顶层开关 | 控制所有 AI 子设置的可用性 | 关闭后 Suggested Rules 开关置灰不可交互(行为 8) |
| FeatureFlag::SuggestedRules | 构建期 feature flag | 控制功能在渠道中的可见性与代码分支 | 关闭时设置界面不显示该开关,但持久化值保留(行为 9) |
| FeatureFlag::SuggestedAgentModeWorkflows | 独立 feature flag | 控制 Agent mode workflow 建议 chips(无规则建议时的兜底) | 不受 Suggested Rules 设置影响(行为 10) |
从 Knowledge 页面的 action 绑定(add_toggle_setting_action_pairs_as_bindings)还可以看到,Suggested Rules绑定的启用条件是FeatureFlag::AIRules.is_enabled() && FeatureFlag::SuggestedRules.is_enabled(),而上下文约束为IS_ANY_AI_ENABLED,这从键盘/命令入口维度再次印证了"需要 Rules 功能存在 + 全局 AI 开启"的双重前提。
八、云同步与跨设备行为
rule_suggestions_enabled_internal配置了SyncToCloud::Globally(RespectUserSyncSetting::Yes),与 Prompt Suggestions(prompt_suggestions_enabled_internal,同一分组内的同构字段)保持一致:该设置值随全局同步机制跨设备传播,且尊重用户在"设置同步"中自行设定的偏好(即用户可以单独关闭该项的云同步)。由于是全局(非 per-device)同步,某一台设备上的开关翻转会反映到其他已登录设备,但最终生效值以各设备本地缓存与同步结果的合并为准。TECH.md 明确指出这是"其他 Active AI 设置(如 Prompt Suggestions)已存在的 opt-out 模式的原样复用",因此其读写、校验、冲突合并行为与既有同步设置完全一致,无需特殊处理。
九、测试与验证要点
TECH.md 给出了与该功能对应的行为级验证清单,覆盖全部 11 条产品行为中的关键项,可作为开发者自测或 QA 的对照表:
- 开关位置与默认值:打开 Settings → Knowledge,确认 Suggested Rules 开关出现在 Rules 开关下方且默认为开启(行为 1、2);
- 开启 = chips 正常展示:开关开启时发起一次会返回规则建议的 agent 交互,确认 chips 与历史行为一致(行为 3);
- 关闭 = chips 被抑制:关闭开关后发起新的 agent 交互,确认不再出现规则建议 chips;同会话内此前已渲染的 chips 仍然可见(行为 4);
- 独立性:关闭 Rules 开关,确认 Suggested Rules 状态不变,反之亦然(行为 5);
- 全局 AI 关闭:关闭全局 AI,确认 Suggested Rules 开关置灰且不可交互(行为 8);
- 无 flag 的构建:在未启用
SuggestedRules的构建中,确认设置界面不出现该开关(行为 9)。
十、小结
"Suggested Rules" 是 Warp 中一个典型的"opt-out Active AI 设置":产品层面通过 PRODUCT.md 定义了 11 条精确行为,技术层面通过 TECH.md 拆解为四处改动——设置组字段与 getter(app/src/settings/ai.rs)、渲染 chokepoint 守卫(app/src/ai/blocklist/block.rs)、Knowledge 页 UI 开关(app/src/settings_view/knowledge_page.rs)以及 footer 的 "Don't show again" 按钮。它复用了 Prompt Suggestions / Code Suggestions 的成熟模式,以单个 getter 加单一渲染守卫实现全场景一致性,并通过SyncToCloud::Globally获得跨设备同步能力。对用户而言,最直接的用法即是在 Settings → Oz → Knowledge 中关闭 Suggested Rules,或在任一回复块的建议 footer 中点击 "Don't show again";对开发者而言,只需记住agents.warp_agent.active_ai.rule_suggestions_enabled这个 TOML 键与is_rule_suggestions_enabled()这个唯一读取入口即可。
- 桌面应用
- 开发者工具
- 人工智能
- AI 应用
- AI Agent
- 代码智能体
【免费下载链接】warp
Warp is an agentic development environment, born out of the terminal.
相关推荐
Warp 规则建议(Suggested Rules)开关全链路实现解析:配置项、渲染守卫与设置页联动
Warp 规则建议(Suggested Rules)开关全链路实现解析:配置项、渲染守卫与设置页联动 本文围绕 Warp 开源仓库中"禁用 AI 规则建议(Su
桌面应用开发者工具人工智能AI 应用AI Agent代码智能体Warp 中的 figma-create-design-system-rules 技能实战:为 AI 编码代理生成项目级设计系统规则
Warp 中的 figma create design system rules 技能实战:为 AI 编码代理生成项目级设计系统规则 导读 figma crea
桌面应用开发者工具人工智能AI 应用AI Agent代码智能体Thanos 规则联邦:Global / Federated Rules API 的设计、去重算法与源码实现
Thanos 规则联邦:Global / Federated Rules API 的设计、去重算法与源码实现 Thanos 的 Rules gRPC 服务把 P
可观测性云原生时序数据库运维
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考