oudecheng
|
6901659849
|
fix(mcp): 限制 server 名称字符并兜底 tool_name 清洗
OpenAI 要求 function name 匹配 ^[a-zA-Z0-9_-]+$,否则整个请求 400。MCP 工具名由 mcp_{server_key}_{tool_name} 拼成,两个输入源:server_key 用户可控(前端 addMcp/renameMcp 正则校验 + toast),tool_name 由 MCP server 上报(后端 sanitize_tool_name 替换非法字符为 _)。
前端:MCP 卡片头部改用 MapEntryHeader 支持点击重命名,状态指示灯移到上方独立行。顺手修了 MapEntryHeader 进入编辑时 val 未同步当前 name 的 bug。
后端:保留 server_key 和 tool_name 原值用于路由,仅清洗 LLM 可见的 full_name,并在发生清洗时打 warn 日志便于定位。
|
2026-08-04 11:17:41 +08:00 |
|
oudecheng
|
c724bbf864
|
chore(web): prettier 一次性格式化并在 CI 启用 format:check
对 47 个前端文件统一执行 npm run format,消除存量格式差异。
随后在 CI 与 Makefile check 中启用 format:check,确保后续提交强制遵守 prettier 风格。
|
2026-08-03 23:25:22 +08:00 |
|
oudecheng
|
5ff1e8455c
|
feat(web,docs): 前端支持模型下拉选择并更新 README 专家系统章节
- 前端类型 ExpertItem/SubagentItem 新增 provider/model 字段,新增 ModelOptionsResponse 类型
- API 层 createExpert/updateExpert/updateSubagent payload 支持 provider/model,新增 listModelOptions
- ConfigPage 专家/子代理模态框新增模型配置 SectionCard(Provider/Model 下拉框,留空继承默认)
- 空字符串转 undefined 传后端,避免 P0 反序列化为 Some(vec![]) 导致全禁
- README 新增第 8 节专家系统,更新子代理 SUBAGENT.md 字段说明(含 provider/model 和子代理黑白名单)
- README 新增 max_nesting_depth 配置项说明,重排后续章节编号
|
2026-07-30 22:44:28 +08:00 |
|
oudecheng
|
003eab4f21
|
fix(web): 修复点击设置后白屏(React hooks 顺序违规)
子模态框 ESC 处理的 useEffect 被放在 if(loading)/if(!config) 条件 return 之后,导致首次渲染(loading=true)时不执行该 hook,config 加载后重新渲染才执行 → hooks 数量不一致 → React error #310 白屏崩溃。
修复:将 useEffect 移到所有条件 return 之前,与其他 hooks 放在一起。
|
2026-07-30 18:56:43 +08:00 |
|
oudecheng
|
951e31aca4
|
feat(web): 子代理模态框改造并暴露 max_nesting_depth 配置项
对抗审查修复 4 个 P0 问题:
- 子代理 modal handleSave 缺失 allowed_subagents/denied_subagents 字段,导致保存时既有策略被后端 #[serde(default)] 静默清空(数据丢失)
- 子代理 modal 缺失子代理黑白名单 CheckboxList UI
- 子代理 modal 未改造为 ModalHeader/ModalFooter/SectionCard,无 X 关闭按钮与遮罩 onClick
- experts tab 未加载 subagentList,编辑专家时子代理勾选列表显示空
新增改动:
- ui.tsx 新增 ModalHeader/ModalFooter 通用组件
- ConfigPage renderTools 新增最大嵌套深度输入框(后端 TaskConfig.max_nesting_depth 早已存在,默认 2)
- 子代理 modal 子代理选项排除自身避免意外自递归
|
2026-07-30 17:38:08 +08:00 |
|
oudecheng
|
9381ed5dd4
|
feat(web): 专家/子代理 capability 字段改为勾选式编辑
- 专家编辑模态框:4 个 textarea 替换为 CheckboxList,技能/工具按来源分组展示
- 新增子代理编辑模态框:非 builtin 子代理显示编辑按钮,支持描述 + 4 个 capability 勾选字段
- 进入 experts/subagents 标签页时自动拉取技能与工具列表
- allowed_* 为空时传 undefined(后端 None=不限),避免空数组触发白名单空集语义
|
2026-07-30 16:55:38 +08:00 |
|
oudecheng
|
cea4bd3cfb
|
feat: 子代理支持数据驱动的工具过滤(白名单+黑名单),删除内置 explore
SUBAGENT.md frontmatter 新增 denied_tools 黑名单字段,启用已有的 allowed_tools 白名单;新增 ToolRegistry::only 白名单方法;抽取 build_subagent_tools_registry(白名单→黑名单→depth 兜底);安全修复:resume 在 def 失踪时拒绝恢复而非降级为完整工具集(避免权限提升);depth 阈值改为引用 max_nesting_depth 配置;SubagentWithStatus 暴露工具字段供前端只读展示;删除内置 explore 子代理及专属 explore_max_execution_secs 配置(全栈清理);新增 23 个测试覆盖过滤矩阵、frontmatter 解析、状态投影
|
2026-07-09 14:42:38 +08:00 |
|
oudecheng
|
46a1ca6853
|
refactor: 修复 3 项 P1 技术债(硬编码 URL / any 类型 / dead_code)
P1-1: 硬编码 wechat URL 抽常量统一两处
- config/mod.rs: 定义 pub const WECHAT_DEFAULT_BASE_URL
- cli/init.rs: import 并引用常量,消除字面量重复
- 消除两处不一致风险(default_wechat_base_url 与 init 向导)
P1-2: ConfigPage any 类型定义具体类型(8 处)
- types.ts: 新增 FeishuChannelConfig/WechatChannelConfig/ChannelConfig/
SchedulerJobConfig 类型;jobs?: any[] → SchedulerJobConfig[];
channels: Record<string, any> → Record<string, ChannelConfig>
- api/config.ts: 新增 RestartResponse 类型,data: any → RestartResponse
- ConfigPage.tsx: catch (e: any) ×2 → catch (e: unknown) + 类型守卫;
as any → as SchedulerConfig['misfire_policy'];
Record<string, any> → Partial<ChannelConfig>;(ch: any) → (ch: ChannelConfig)
P1-3: dead_code 18 处逐一审查清理
- 删除 10 处未使用函数/struct(YAGNI 原则):
context_compressor.rs (into_messages, is_tool_round)
agent_loop.rs (EmptySkillProvider struct + impl)
memory_maintenance.rs (run_for_scope)
session.rs (try_start/finish_background_compaction)
session_history.rs (try_start/finish_background_compaction)
tool_registry_factory.rs (shell_session_manager)
task/runtime.rs (effective_allowed_tools)
- 保留 8 处 serde 反序列化字段(删除会破坏 JSON 反序列化):
feishu.rs/openai.rs/anthropic.rs/skills/mod.rs/task/runtime.rs
|
2026-07-08 14:51:42 +08:00 |
|
oudecheng
|
ffc1f79de4
|
refactor: 建立前端 API 客户端层,消除硬编码路径与重复 fetch
- 新增 web/src/api/ 目录(6 个文件):client.ts 基础设施 + 5 个领域模块
- 封装 18 处 fetch 调用为强类型函数,消除 17 处硬编码 /api/ 路径
- 统一 13 处重复的 fetch+json+错误处理模式
- 删除旧 web/src/components/Settings/api/expert.ts,合并到新 api/experts.ts
- ConfigPage.tsx 替换 15 处 fetch 调用,ExpertSelector.tsx 改用新 API
- 保持现有组件行为不变(静默失败仍静默,错误处理等价)
|
2026-07-08 10:03:34 +08:00 |
|
oudecheng
|
c8660df14b
|
refactor: 拆分 storage/mod.rs 与 ConfigPage.tsx (P2)
storage/mod.rs (2957 -> 1834 行):
- 抽出 tests.rs: 17 个测试函数
- 抽出 row_mapping.rs: 8 个 row<->record 映射与单记录查询函数
- 抽出 migrations.rs: 7 个 schema 迁移函数 (ensure_*_schema, has_column, add_column_if_missing)
ConfigPage.tsx (1568 -> 1235 行):
- 抽出 types.ts: 所有接口/类型定义
- 抽出 constants.ts: TABS, inputCls, selectCls, TIMEZONE_OPTIONS
- 抽出 ui.tsx: Field, Toggle, TagEditor, SectionCard, SourceEditor, MapEntryHeader
- 抽出 api/expert.ts: getSelectedExpert, selectExpert (经 ConfigPage 再导出保持兼容)
验证: cargo build, cargo test --lib storage:: 17/17, npm run build
对抗性检查: 8/8 通过 (无丢失/重复函数, 无循环依赖, 无未使用导入)
|
2026-07-07 18:36:23 +08:00 |
|
oudecheng
|
f8d5f0253a
|
refactor: 清理 P1 类型债与 React key 债
- 消除 useChat.ts 中 13 处 (message as any).timestamp,改用已收窄变量的 .timestamp
- 给 ExecutionCancelled 接口补 timestamp?: number 字段,与后端对齐
- 修复 MessageInput 附件列表 key={index}: 给 FileAttachment 加 id 字段(crypto.randomUUID())
- 修复 ConfigPage TagEditor key={i} → key={t}(tag 值唯一)
- 修复 ConfigPage SourceEditor customPaths key={i} → key={p}(路径值唯一)
|
2026-07-07 17:53:53 +08:00 |
|
oudecheng
|
7eecd0b6bb
|
feat: 专家配置保存后即时生效,无需重启网关
experts/mod.rs: config 改为 RwLock 支持 update_config 运行时更新; ExpertWithStatus 增加 body 字段供前端编辑模态框直接显示; 空 sources 时不再兜底返回 [User,Project],尊重用户关闭所有源的意图。
gateway/http.rs: save_config 同步调用 experts.update_config,返回消息从'需要重启'改为'已保存'。
ConfigPage.tsx: 编辑模态框宽度扩大到 max-w-3xl,textarea 高度增加到 360px,提示文案明确正文与名称/描述的注入关系。
|
2026-07-07 14:13:09 +08:00 |
|
oudecheng
|
5651c4ae7f
|
feat: 设置页新增专家 Tab,支持专家增删改查与启用切换
- 新增 ExpertsConfig/ExpertItem/ExpertListResponse 类型与 AppConfig.experts 字段
- TABS 数组加入专家 Tab (UserCheck 图标),TabId 含 'experts'
- renderExperts 渲染启用开关、来源目录编辑器、已发现专家列表与添加按钮
- 专家编辑 modal 含 name(编辑时只读)/description(必填)/body(textarea) 三字段
- 导出 selectExpert 与 getSelectedExpert 模块级函数供 ExpertSelector 复用
- Tab 切换自动拉取列表,专家 toggle 即时生效不触发未保存警告
- initialTab prop 支持从对话框入口直达专家 Tab
|
2026-07-06 18:07:54 +08:00 |
|
oudecheng
|
8d30ccd020
|
feat: 新增子代理管理API,支持获取子代理列表和切换子代理状态
|
2026-07-06 14:41:30 +08:00 |
|
oudecheng
|
38b9f661ee
|
feat: 新增技能管理API,支持获取技能列表和切换技能状态
|
2026-07-06 11:59:11 +08:00 |
|
oudecheng
|
76abdbd1de
|
feat: MCP stdio 命令解析与错误诊断增强
- 新增 resolve_command_path:Windows 上搜索 .exe/.cmd/.bat 后缀
- 启动失败时给出友好错误信息(含 PATH 和建议)
- 捕获子进程 stderr 并在连接失败时回显
- ConfigPage 新增 cwd 工作目录字段
- 添加单元测试覆盖路径解析逻辑
|
2026-07-03 19:31:52 +08:00 |
|
oudecheng
|
1af0fab3ad
|
feat: 更新配置管理,支持异步读取和写入;添加 MCP 服务器状态接口
|
2026-07-03 08:37:02 +08:00 |
|
|
|
d802534abe
|
feat(gateway): 支持网关平滑重启功能
- 在 Gateway 运行逻辑中增加重启循环,可根据重启信号自动重启服务
- 添加取消管理器功能,支持取消所有运行中的 Agent 以便平滑重启
- 在 HTTP API 新增 /api/restart 接口,实现基于任务活动检测的安全重启
- GatewayState 增加重启信号通道,支持异步触发重启流程
- 修改主运行逻辑支持重启等待机制,实现优雅关闭或重启
- 日志初始化修复防止重复初始化导致的问题
- 技能和子代理加载支持自定义绝对路径来源,增加灵活性和扩展性
- 调整技能与子代理来源枚举,增加 Custom 选项支持动态路径
- 优化工具与任务运行时代码,完善路径处理和克隆逻辑
- 前端配置页增加时区选择下拉菜单,提供常用时区选项
- 新增来源路径编辑组件,支持启用/禁用已知来源及添加自定义绝对路径
- 配置页新增保存配置后重启提示,支持用户确认立即重启网关
- 实现重启操作的前端调用及重启状态展示,包括任务冲突提示与重启轮询恢复
- 频道绑定 Agent 字段由输入框改为下拉选择,提升配置体验和正确性
|
2026-06-19 10:40:00 +08:00 |
|
oudecheng
|
edc1a50d1c
|
feat(todos): 修改 todos 表结构,迁移至复合主键并添加索引
|
2026-06-16 16:17:12 +08:00 |
|
oudecheng
|
66e40fc714
|
feat(config): 增加 Feishu 渠道支持及 MCP 服务器管理界面
- 为配置中的 Channel 添加对 Feishu 配置的可变访问接口
- 在 HTTP 掩码和恢复中支持 Feishu 的 app_secret 字段处理
- 在前端配置页面新增 MCP 服务器配置面板,支持多类型参数编辑
- 在前端配置页面新增渠道管理面板,支持 Feishu 和 Wechat 渠道的增删改查
- 优化配置保存后的提示与刷新,提示需要重启服务生效
- 更新模型配置字段提示,使说明更加友好和明确
- 增加界面图标及样式调整,提升用户操作体验
|
2026-06-16 14:57:22 +08:00 |
|
oudecheng
|
37f417007e
|
feat(gateway): 添加配置管理功能支持敏感信息脱敏
- 实现 API 端点 /api/config 用于获取和保存配置
- 添加配置信息脱敏功能,保护 API 密钥等敏感数据
- 集成配置验证逻辑,确保时区等参数有效性
- 在前端添加完整的配置管理页面界面
- 实现配置项的动态编辑和保存功能
- 添加连接设置功能用于 WebSocket 连接配置
- 提供多标签页界面分别管理不同配置模块
- 实现配置变更后的实时预览和保存确认
|
2026-06-15 17:22:32 +08:00 |
|