feat: Docker 容器化、Cookie 鉴权、Coordinator 编排、FTS5 搜索与 P1-P3 全面收尾
Docker 容器化部署
- 提供 Mode A (Alpine musl, ~23MB) 和 Mode B (Distroless glibc, ~87MB)
两种镜像,Docker Compose 一键启动
- build.rs 支持 SKIP_DASHBOARD_BUILD 跳过前端构建
- 国内镜像加速 (npm/apt/apk) 通过 USE_MIRRORS build-arg 控制
安全:Cookie-Based 鉴权系统
- HttpOnly/SameSite=Strict Cookie 会话管理(24h 过期自动清理)
- 登录/登出/验证接口 + 中间件注入
- 前端登录页面 + 退出按钮
- 三层 CORS:localhost 鉴权 / 全放通 bookmarklet / 受保护路由
- 书签脚本 fetch 添加 credentials:'include'
Coordinator 模式 (P2)
- 4 个 meta-tool (delegate_task/check_task/task_stop/synthesize)
- WorkerPool + Semaphore 并发控制 + 超时保护
- 前端协调者模式开关
Hook 系统:UserPromptSubmit 事件 (P2)
- 第 13 个生命周期事件,fire-and-forget 审计
FTS5 全文搜索 (P3)
- agent_sessions_fts + agent_messages_fts 虚拟表
- search_history Agent 工具 + /api/search/history HTTP 接口
- 前端防抖搜索框 + 仅当前会话筛选
工具加载优化 (P3)
- defer_loading 延迟加载 (7 个重型工具)
- is_readonly 只读标记 (9 个查询工具)
- classifier_summary 工具目录供 LLM 按需判断
模型回退策略 (P3)
- LLM_FALLBACK_MODEL 优先回退 + LLM_FALLBACK_CHAIN 链式轮换
- LlmClient model 改为 Arc<RwLock> 支持运行时切换
- 连续 3 次过载后自动切换
压缩记忆桥接 (P3)
- 压缩丢弃消息 → 子代理提取持久记忆 (extract_memories_from_compaction)
git2 依赖修复
- 切换到 vendored-libgit2,消除 OpenSSL 系统依赖
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# Agent Hooks — 生命周期事件系统
|
||||
|
||||
参考 Claude Code hooks 协议,提供 **12 种生命周期事件回调**,基于 **观察者模式 + 责任链模式** 实现。核心目标:在 Agent ReAct 循环的各个关键节点插入横切关注点(取消检查、指标采集、审计日志、权限增强等),**不污染主循环代码**。
|
||||
参考 Claude Code hooks 协议,提供 **13 种生命周期事件回调**,基于 **观察者模式 + 责任链模式** 实现。核心目标:在 Agent ReAct 循环的各个关键节点插入横切关注点(取消检查、指标采集、审计日志、权限增强等),**不污染主循环代码**。
|
||||
|
||||
---
|
||||
|
||||
@@ -25,7 +25,7 @@ src/agent/hooks/
|
||||
mindmap
|
||||
root((Hook 系统<br/>设计原则))
|
||||
接口隔离
|
||||
10 个生命周期方法
|
||||
11 个生命周期方法
|
||||
+2 个权限专用方法 (on_permission_request/on_permission_denied)
|
||||
全部有默认空实现
|
||||
只覆写关心的 hook 点
|
||||
@@ -112,6 +112,7 @@ classDiagram
|
||||
+timeout() Option~Duration~
|
||||
+match_filter() ToolMatchFilter
|
||||
+on_session_start(ctx)
|
||||
+on_user_prompt_submit(ctx)
|
||||
+pre_tool_use(ctx) PreToolUseAction
|
||||
+post_tool_use(ctx) PostToolUseAction
|
||||
+on_post_tool_use_failure(ctx) PostToolUseAction
|
||||
@@ -137,6 +138,7 @@ classDiagram
|
||||
class HookEvent {
|
||||
<<enumeration>>
|
||||
OnSessionStart
|
||||
UserPromptSubmit
|
||||
PreToolUse
|
||||
PostToolUse
|
||||
PostToolUseFailure
|
||||
@@ -252,6 +254,7 @@ classDiagram
|
||||
+run_pre_tool_use(ctx) PreToolUseResult
|
||||
+run_post_tool_use(ctx) PostToolUseResult
|
||||
+run_on_session_start(ctx)
|
||||
+run_on_user_prompt_submit(ctx)
|
||||
+run_on_step_complete(ctx)
|
||||
+run_on_session_stop(ctx)
|
||||
+run_on_subagent_start(ctx)
|
||||
@@ -285,6 +288,7 @@ classDiagram
|
||||
| 事件 | 上下文类型 | 关键字段 |
|
||||
|------|-----------|---------|
|
||||
| OnSessionStart | `SessionStartContext` | session_id, turn_index, is_resume |
|
||||
| UserPromptSubmit | `UserPromptSubmitContext` | session_id, prompt, turn_index (fire-and-forget) |
|
||||
| PreToolUse | `PreToolUseContext` | session_id, tool_name, tool_args, step |
|
||||
| PostToolUse | `PostToolUseContext` | session_id, agent_name, tool_name, tool_args, output_content, is_error, step, elapsed_ms |
|
||||
| PostToolUseFailure | `PostToolUseFailureContext` | session_id, agent_name, tool_name, error_message, is_interrupt, step, elapsed_ms |
|
||||
@@ -525,6 +529,8 @@ sequenceDiagram
|
||||
RT->>HR: with_builtins(db, cancelled, metrics)
|
||||
RT->>HR: run_on_session_start(ctx) ⚡并行
|
||||
Note over HR: ① OnSessionStart
|
||||
RT->>HR: run_on_user_prompt_submit(ctx) 🔥fire-and-forget
|
||||
Note over HR: ⑬ UserPromptSubmit
|
||||
|
||||
Note over API,CMP: ═══ Phase 2: ReAct 循环 ═══
|
||||
loop 每步 (1..max_steps)
|
||||
@@ -598,7 +604,7 @@ sequenceDiagram
|
||||
flowchart LR
|
||||
subgraph Register["add(hook)"]
|
||||
H["hook: Box<dyn AgentHook>"] --> Subs{"subscribed_events()"}
|
||||
Subs -->|"空 = 全部"| All["遍历所有 12 个 HookEvent<br/>event_index[event].push(idx)"]
|
||||
Subs -->|"空 = 全部"| All["遍历所有 13 个 HookEvent<br/>event_index[event].push(idx)"]
|
||||
Subs -->|"指定"| Spec["仅注册声明的事件<br/>event_index[event].push(idx)"]
|
||||
end
|
||||
|
||||
@@ -842,6 +848,7 @@ registry.remove_session_hook(&session_id, "MyTempHook");
|
||||
| 文件 | 集成点 | 方法 |
|
||||
|------|--------|------|
|
||||
| `runtime/mod.rs` | 会话启动 | `run_on_session_start()` |
|
||||
| `runtime/mod.rs` | 用户输入提交后 | `run_on_user_prompt_submit()` (fire-and-forget) |
|
||||
| `runtime/mod.rs` | ReAct 循环 | `run_on_step_complete()` |
|
||||
| `runtime/mod.rs` | Hook 上下文注入 | `hook_contexts → [system-reminder]` |
|
||||
| `runtime/mod.rs` | 会话终止 | `run_on_session_stop()` |
|
||||
@@ -893,6 +900,7 @@ registry.remove_session_hook(&session_id, "MyTempHook");
|
||||
| 2026-06-22 | Phase 4: AsyncAgentHook trait + async hook 调度 |
|
||||
| 2026-06-22 | 模块拆分: mod.rs(537) ← types/traits/matcher/registry/dispatch/builtins |
|
||||
| 2026-06-22 | Phase 5: PermissionRequest/PermissionDenied 事件 — 权限决策钩子 + fire-and-forget 审计 |
|
||||
| 2026-06-23 | Phase 6: UserPromptSubmit hook — 第 13 个生命周期事件,在用户提交提示词后、context building 前触发(fire-and-forget),hooks 可以检查/记录用户输入 | 120 |
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user