十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

hive 前端触发器系统清理指南:Colony 生命周期简化与 missed-trigger 追补握手

hive 前端触发器系统清理指南:Colony 生命周期简化与 missed-trigger 追补握手 人工智能AI Agent多智能体MCP 服务工具调用浏览器控制【免费下载链接】hiveMulti-Agent Harness for Production AI项目地址https://gitcode.com/gh_mirrors/hive48/hive点击查看免费下载本文档是 hiveMulti-Agent Harness for Production AI前端在触发器Trigger系统大幅简化后的清理与迁移指南。后端已经彻底塌缩了 colony-lifecycleColony 生命周期这一层加载一个 colony 的会话session即视为激活关闭即视为停用不再存在独立的激活/停用状态机。随之而来的是一批前端 UI 变为死代码需要删除、一个事件被重命名同时新增了一个错过触发器握手missed-trigger handshake的小型交互组件用于在会话加载时追补会话关闭期间错过的定时触发。阅读完本文你将掌握哪些端点/事件/字段/组件必须从现有前端代码中移除哪些触发器能力保持不变以及如何从零实现并接入missed_triggers事件与POST /colony/resolve_missed追补接口。全文按照原文档的Remove删除→ Keep保留→ Add新增→ Migration checklist迁移清单骨架组织并逐节结合当前仓库的后端实现core/framework/server/routes_sessions.py、core/framework/tools/queen_lifecycle_tools.py、core/framework/host/triggers.py、core/framework/host/event_bus.py与测试用例core/tests/test_missed_triggers.py、core/tests/test_missed_triggers_http_e2e.py给出源码级佐证。背景为什么这次简化会发生简化的本质是一个状态模型的收敛。旧前端需要在四个状态之间做对账状态来源含义loadedsession 是否已加载metadata.active磁盘上写死的激活标记per-triggeractive每个触发器自己的激活标记is_executing会话当前是否正在执行这四个状态塌缩成了一个用户真正关心的问题——该 colony 的会话是否已加载——外加一个面向高级用户的、每个触发器独立的enabled配置开关。其余全部是人为分层加载 colony 本身就是激活关闭 colony 本身就是停用没有已暂停但已加载paused but loaded这种中间态。由此得到触发系统的核心不变量也是全文所有改动的前提触发器仅在 colony 的会话已加载、且该触发器的enabled为 true 时才会触发。不存在额外的生命周期开关。Remove必须删除的前端代码已消失的端点全部返回 404以下三个端点已从后端路由注册表中移除。在 routes_sessions.py 的路由注册区段中已搜索不到任何colony/state、colony/activate、colony/deactivate注册项前端凡是还在请求这些 URL 的代码都会收到 404必须一并删除。Endpoint状态GET /api/sessions/{id}/colony/state404POST /api/sessions/{id}/colony/activate404POST /api/sessions/{id}/colony/deactivate404这些端点暴露的信息loaded / active / busy要么与现有 session 信号冗余要么是人为构造的没有独立存在的必要。已消失的事件事件类型状态colony_activated不再发出colony_deactivated不再发出activation_missed_triggers更名为missed_triggers需要取消订阅并删除前两个事件的全部 handler第三个事件则按新名字missed_triggers重新订阅细节见下文 Add 部分。在 core/framework/host/event_bus.py 的事件类型定义中当前保留的触发器事件族为trigger_available、trigger_activated、trigger_deactivated、trigger_fired、trigger_removed、trigger_updatedevent_bus.py而missed_triggers作为新增事件独立存在event_bus.py——colony_activated/colony_deactivated/activation_missed_triggers均不在其中。已消失的 tool 响应字段queen 的set_trigger工具不再在响应中返回colony_active也不再返回queued_for_next_activation状态字符串trigger_activated事件负载同样去掉了colony_active字段。当前set_trigger的响应已经统一为{ status: activated, ... }——触发器已注册并且因为 queen 能调用该工具时会话必然已加载正在触发中。源码可以佐证这一契约queen_lifecycle_tools.py 中 timer 分支返回的负载只有status、trigger_id、trigger_type、trigger_configwebhook 分支也只是追加了webhook_urlqueen_lifecycle_tools.py。同时 routes_sessions.py 广播的TRIGGER_ACTIVATED事件数据仅包含trigger_id、trigger_type、trigger_config、name、entry_node等字段PATCH 后的TRIGGER_UPDATED同样不含colony_active。必须删除的 UI 组件colony 头部的 Activate / Deactivate 切换开关。加载 colony 视图本身就是激活关闭它本身就是停用。该开关只是在重复已有的打开/关闭 colony 交互。由metadata.last_active_at驱动的 Active since … 徽章。该字段已不再落盘。如果确实需要一个会话开始于的时间戳现有 session 响应中的loaded_at即可覆盖。queen 对话记录中的 Queued for next activation 指示卡片。不再存在排队中间态一个触发器要么已配置会话打开期间运行要么已禁用/被移除。侧边栏上区分 loaded 与 active 的圆点。收敛为单一圆点仅表示该 session 当前是否已加载。已消失的metadata.json字段metadata.active与metadata.last_active_at不再由后端写入。任何在前端读取它们的逻辑都应删除——它们已不属于契约的一部分。Keep触发器系统本身不变触发器系统本身完全未变以下能力照旧工作触发器 CRUD UI通过 queen 的set_trigger/remove_trigger/list_triggers工具以及现有的每触发器 HTTP 路由/triggers/{id}/activate、/triggers/{id}/deactivate、/triggers/{id}/run、PATCH /triggers/{id}。这些路由在 routes_sessions.py 中完整注册分别对应handle_list_triggersL1154、handle_create_triggerL1173、handle_update_trigger_taskL1304、handle_run_triggerL1450、handle_activate_triggerL1551与handle_deactivate_triggerL1628。trigger_fired事件只要配置的触发器触发或resolve_missed注入追补事件就会发出前端照旧渲染即可。源码侧由_emit_trigger_fired负责广播参见 routes_sessions.py 与 queen_lifecycle_tools.py。trigger_available、trigger_activated、trigger_deactivated、trigger_removed、trigger_updated触发器 CRUD 时仍然发出数据形状不变仅去掉上文提及的colony_active字段。triggers.json中每个触发器的字段id、name、trigger_type、trigger_config、task、enabled、last_fired_at、next_due_at。注意字段名是enabled旧的每触发器active字段名已废弃。源码中set_trigger激活后即设置tdef.enabled Truequeen_lifecycle_tools.py与此一致。另外触发器列表的权威读取入口是GET /api/sessions/{session_id}/triggers它通过 core/framework/host/triggers.py 的build_trigger_view把持久化的triggers.json定义与运行时状态enabled、下次触发倒计时、触发统计合并成 UI 就绪的视图SSE 的trigger_*事件只负责在其上叠加实时增量。Add新增的 missed-trigger 握手会话关闭期间定时触发器不会触发。当会话重新加载时后端会计算这段时间错过的触发missed ticks并在 SSE 流上推送一个新事件前端用一个弹窗让用户决定每个错过的触发器如何处理最后把决定 POST 回去。订阅missed_triggers事件在会话加载时如果任一启用的 timer 触发器存在过期的last_fired_at即 cron / interval 的 tick 本应在会话关闭期间触发会话的 SSE 流上就会落下一个missed_triggers事件{ type: missed_triggers, stream_id: queen, data: { colony_id: ..., missed: [ { trigger_id: daily_outreach, trigger_type: timer, count: 3, ticks: [ 2026-05-19T09:00:0000:00, 2026-05-20T09:00:0000:00, 2026-05-21T09:00:0000:00 ], next_due_at: 2026-05-22T09:00:0000:00 } ] } }字段语义与渲染注意事项count是错过 tick 的真实总数必须忠实展示。ticks列表最多截断到 100 条——展示总数时如实呈现count但如果逐条展示时间戳列表需要截断。next_due_at是用户不做任何操作时下一次未来触发的时间。webhook 触发器永远不会被报告事件驱动型没有可重建的调度。所有时间戳都是带显式00:00/Z后缀的 UTC ISO 8601。渲染时用new Date(iso).toLocaleString()转换为本地时间不要直接展示原始 UTC 字符串。源码与测试佐证计算逻辑位于 core/framework/host/triggers.py 的compute_missed只考虑enabledtrue的条目非timer类型webhook直接跳过没有last_fired_at注册后从未触发过的触发器贡献 0 个 missed tick不会为注册之前的时段追溯触发cron 与interval_minutes两种调度各自计算count、ticks、next_due_at。函数是纯函数、无副作用。事件类型在 event_bus.py 中有明确注释说明会话加载时若某触发器的last_fired_at早于调度期望即会话在若干次调度触发期间处于关闭状态UI 弹出逐触发器的握手fire 一次追补 / skip / reschedule并把决定 POST 到/api/sessions/{id}/colony/resolve_missed。test_missed_triggers.py 验证了截断行为cron 每 6 秒一次、缺口 1 天时count 14400而len(ticks) 100截断生效另有针对禁用触发器、webhook 触发器、从未触发触发器、非法 cron 的各种跳过用例test_missed_triggers.py。展示 Catch up? 弹窗推荐形态标题Catch up while you were away?离开期间要追补吗副标题简要说明 colony 关闭期间触发器不会触发。missed数组的每一行触发器名称、错过次数、next due at 本地时间。三个按钮Fire latest触发最新一次/Skip跳过/Reschedule重新排期。一个Apply按钮把收集到的全部决定一次性 POST 出去。前端侧已经预留了实现锚点在 core/frontend/src/pages/colony-chat.tsx 中有一段明确注释说明后端会在会话加载后立刻发出missed_triggersSSE 事件弹窗打开后用户为每个触发器选择fire_latest/skip/reschedule随后前端 POST/colony/resolve_missed。POST 到/colony/resolve_missedPOST /api/sessions/{session_id}/colony/resolve_missed Body: { decisions: { trigger_id: fire_latest | skip | reschedule, ... } }每个触发器的决策语义fire_latest— 向 queen 注入一次追补触发器事件负载带catch_up: truequeen 据此压缩工作量并把last_fired_at推进到当前时间。skip— 不触发仅把last_fired_at推进到当前时间。reschedule— 把last_fired_at推进到当前时间并从当前时刻重新计算next_due_at到下一个未来 tick。不触发。响应 200{ results: { daily_outreach: fired, hourly_check: skipped, ghost: unknown_trigger, bad: invalid_decision:explode } }注意handler 永远不会因为某一行的坏数据而让整个请求失败——前端应展示部分成功而非整体中止。状态码状态码含义200请求已处理逐触发器读取results400decisions不是对象404未知 session409session 未绑定 colony源码级实现证据路由注册位于 routes_sessions.py处理函数为handle_resolve_missed_triggersL1509。其中session 解析失败返回对应错误未知 session → 404session.colony_id is None返回409L1523-L1524JSON 解析失败返回 400L1528-L1529decisions非 dict 返回 400L1531-L1536内部异常返回 500 并记录日志L1542-L1547。核心决策执行位于 queen_lifecycle_tools.py 的resolve_missed决策白名单为{fire_latest, skip, reschedule}L671未知决策返回invalid_decision:value、未知触发器返回unknown_triggerfire_latest会调用_inject_catch_upL696-L721构造一个带catch_up: True负载的TriggerEvent注入 queen 节点并广播TRIGGER_FIREDreschedule通过_next_due_fromL674-L693用 cronitercron 表达式或interval_minutes加法重新计算next_due_at。HTTP 层行为有端到端测试覆盖test_missed_triggers_http_e2e.py 验证了 200skip / fire_latest / 逐触发器标记、400decisions非 dict、404未知 session、409session 无 colony全部分支单测 test_missed_triggers.py 验证fire_latest注入追补inject_trigger被调用一次、skip不触发、reschedule设置未来next_due_at、unknown_trigger与invalid_decision的标记返回。Migration checklist迁移清单删除所有对/api/sessions/{id}/colony/state、/activate、/deactivate的调用。取消订阅colony_activated、colony_deactivated、activation_missed_triggers。订阅missed_triggers注意事件已重命名。删除 Activate/Deactivate 切换开关组件。删除 Active since… 徽章。删除 queen 对话记录中的 queued for next activation 卡片queen 工具不再返回该状态字符串。停止读取metadata.active/metadata.last_active_at。停止从trigger_activated与set_trigger响应中读取colony_active。侧边栏圆点简化成单一状态session 已加载 vs 未加载不再有每 colony 生命周期。新增 missed-trigger 握手弹窗并接入POST /colony/resolve_missed。为什么移除它一句话总结旧前端需要调和四个状态loaded、metadata.active、每触发器active、is_executing如今它们塌缩为一个面向用户的单一问题——该 colony 的会话是否已加载——外加一个面向高级用户的每触发器enabled配置开关其余都是人为分层。加载 colony 本身就是激活关闭它就是停用。触发器的触发条件只有两个colony 的会话已加载且触发器的enabled为 true。没有额外的生命周期开关也没有已暂停但已加载的状态。对前端开发者而言本次清理的收益是状态机的整体瘦身删除四个组件/字段来源的冗余逻辑之后触发器 UI 只剩下CRUD 实时状态 错过追补三块而后两块都已有清晰的后端契约SSE 事件 单一 POST 接口与测试兜底可放心重构。相关源码与测试索引前端握手实现锚点core/frontend/src/pages/colony-chat.tsxHTTP 路由与处理函数core/framework/server/routes_sessions.py、路由注册 L3060-L3093决策执行与追补注入core/framework/tools/queen_lifecycle_tools.py、L696-L721错过计算core/framework/host/triggers.py事件类型定义core/framework/host/event_bus.py单元测试core/tests/test_missed_triggers.pyHTTP 端到端测试core/tests/test_missed_triggers_http_e2e.py、core/tests/test_missed_triggers_routes_registered.py赞分享人工智能AI Agent多智能体MCP 服务工具调用浏览器控制【免费下载链接】hiveMulti-Agent Harness for Production AI项目地址https://gitcode.com/gh_mirrors/hive48/hive点击查看免费下载相关推荐Sir Trevor事件系统与扩展开发掌握编辑器的生命周期Sir Trevor事件系统与扩展开发掌握编辑器的生命周期 Sir Trevor是一款专为Web设计的富内容编辑器其核心优势在于强大的事件系统和灵活的生命周前端UI组件mojs动画事件系统从触发到完成的全生命周期mojs动画事件系统从触发到完成的全生命周期 动画交互是现代Web应用提升用户体验的核心手段但要实现流畅自然的动画效果离不开对事件生命周期的精准控制。mo前端终极指南掌握bootstrap-fileinput事件系统全生命周期终极指南掌握bootstrap fileinput事件系统全生命周期 想要构建功能强大的文件上传界面吗bootstrap fileinput事件系统就前端UI组件创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表