402 Commits

Author SHA1 Message Date
Wenjie Zhang 17cd376204 feat(debug): 支持 AgentRun 精确跳转 Langfuse 2026-08-24 20:51:18 +08:00
Wenjie Zhang ad63ddec6d feat(debug): 按 Run 分组消息调试数据 2026-08-24 19:35:55 +08:00
Wenjie Zhang dc545dfbd0 feat(debug): 优化调试面板与消息时序检视 2026-08-24 18:50:03 +08:00
Wenjie Zhang 5b7d7a1b40 fix(storage): 统一数据库 Schema 迁移入口 2026-08-24 13:27:00 +08:00
Wenjie Zhang 6975a797d3 fix(user): 用户管理改用服务端分页 2026-08-24 10:26:33 +08:00
Wenjie Zhang d03fbfd93b feat(dashboard): 优化数据总览与会话分析 2026-08-24 10:26:23 +08:00
Wenjie Zhang 82e719ef2d chore(release): 发布 0.7.2 beta1 2026-08-24 00:35:18 +08:00
Wenjie Zhang ca8a3d837b docs(decision): 记录沙盒原生异步读取决策 2026-08-23 22:19:34 +08:00
Wenjie Zhang a3e337b510 feat(agent): 新增用户级 Memory MVP
- 主 Agent 在用户开启开关后注入 MEMORY.md 有界提示,并注册
  remember_memory / search_thread_messages / read_thread_messages
  三个受限工具,工具 schema 不含 uid/path 等身份参数
- 写入经 advisory lock + SELECT FOR UPDATE 串行化,执行处重查开关、
  顶层 Run 归属与 lease owner,fail-closed;文件发布失败保留旧文件
- MEMORY.md 被用户删除或清空时读取侧视为无记忆,下一次写入按空
  文件语义原子重建
- 历史查询遵守主线程可见性与字段 allowlist,默认不含 ToolCall 详情
- 前端新增 RememberMemoryTool 渲染与 CollapseTransition 组件

决策记录:docs/develop-guides/decisions/implemented/2026-08-23-user-memory-mvp.md
2026-08-23 19:37:00 +08:00
Wenjie Zhang fca77cc514 fix(agent): 为 LangGraph checkpoint 连接池启用连接健康检查
PostgreSQL 重启后连接池中的失效连接不再导致 checkpoint 读写失败,
通过 AsyncConnectionPool.check_connection 在取用连接时剔除死连接。

决策记录:docs/develop-guides/decisions/implemented/2026-08-23-langgraph-checkpoint-pool-recovery.md
2026-08-23 19:37:00 +08:00
Wenjie Zhang 3d76a43d0f feat(web): 完善前端展示与流式细节 2026-08-23 19:05:58 +08:00
Yuchuan 07034cc024 feat(agent): 完成 DeepAgents 0.7 迁移与全仓依赖安全升级 (#971)
* feat(agent): 完成 DeepAgents 0.7 迁移与全仓依赖安全升级

* fix(storage): 修复 Project created_at/updated_at 约束与 cutover 默认值

* style: 格式化 storage models 与 paths 以满足 ruff 检查

---------

Co-authored-by: Wenjie Zhang <xerrors@163.com>
2026-08-23 14:35:06 +08:00
Wenjie Zhang 99549d7d82 feat(project): 支持 Project 业务资源持久化与新建对话项目选择 2026-08-23 03:48:32 +08:00
Yuchuan Huang 05fd233c3a fix(agent): 收敛 Skill 预加载运行资产 2026-08-22 16:21:07 +08:00
Yuchuan Huang 19ef486b14 Merge remote-tracking branch 'upstream/main' into integrate/pr-924-skill-preload 2026-08-22 15:48:29 +08:00
Yuchuan Huang 6deb9b4b34 fix(web): 修复文件面板预览与刷新生命周期 2026-08-22 15:35:13 +08:00
Yuchuan fd639016a9 feat: 增加 Skill 预加载机制 2026-08-21 18:54:19 +08:00
Yuchuan aef9a64c48 refactor: 收敛 UserWorkspace、Workdir 与 Sandbox 存储边界 (#969)
* refactor: 收紧 API 与 Worker 宿主机依赖

* refactor: 分离 API 与 Worker 运行目录

* feat: 从对象存储恢复沙盒附件

* feat: 持久化线程输出版本

* docs: 重定向实时项目工作目录方案

* feat: 建立 Project Workdir 与 Sandbox runtime 基础

* feat(storage): 切换到实时 Project Workdir

* refactor(storage): 删除旧文件 revision 主链路

* refactor(storage): 收敛 Skill 与部署存储边界

* refactor(storage): 收敛存储边界并复用持久化挂载判定

- skills/service: 拆分 legacy 路径分支,统一迁移来源校验,
  让 dir_path 收敛与缺失拒绝逻辑在单一分支内闭合
- mention_search_service: 删除仅在单点使用的 _workspace_root
  与 _scan_virtual_root 抽象,内联扫描与虚拟路径拼接
- sandbox_provisioner: 抽取 PERSISTENT_SANDBOX_MOUNT_ROOTS 常量与
  _is_persistent_sandbox_mount_path 判定,Local 与 K8s 后端共用

以上都是本分支既有 storage decoupling 收尾;只缩小代码体量,
不改变外部行为。

* feat(langgraph): 移除对于 SQLite 的 checkpoint 支持

* docs: 修正文档契约表达

* refactor: 简化 Workdir 与 Sandbox 存储边界

* style: 修复 Ruff 格式检查

* refactor: 收敛 Workdir 目录与附件链路

* style: 对齐附件服务 Ruff 格式

* refactor: 统一宿主侧安全目录遍历

* refactor: 收敛 v0.7.1 迁移与测试清理

* style: 对齐 rebase 后 Ruff 格式

* style: 对齐迁移模块 import gate

* test: 对齐存储运行时迁移契约

* fix: 稳定 Sandbox 创建与运行上下文

* fix: 统一 UserWorkspace 跨运行时权限

* test: 清理 Skill 旧存储测试依赖

* fix: 收敛 Workdir 迁移和运行边界

* refactor: 统一 Skill 运行边界与 Workspace 身份

* fix(storage): 闭合工作目录派发与文件写入边界

* refactor: 简化运行时与工作区边界

* refactor: 收敛 Workspace 文件 Owner

* chore(docs): 移除架构图生成物

* refactor: 简化存储与运行时边界

* fix: 恢复 Agent 运行时上下文更新

---------

Co-authored-by: Yuchuan <28227133+Yuchuan925@users.noreply.github.com>
Co-authored-by: Wenjie Zhang <xerrors@163.com>
2026-08-21 17:49:16 +08:00
Yuchuan Huang 6185168f5e feat(web): 完成 xhome #36 前端细节优化
- HTML 加载占位高度 360→180px
- 侧边栏 header-actions 按钮组与折叠态搜索入口
- AgentPanel 平级 Tab:file-tree / 文件预览 / 子智能体线程
- 子智能体会话进入面板 Tab,独立生命周期 + SSE 重连
- 已完成对话过程摘要改为耗时分隔行
- Markdown 渲染在 Shiki 不可用时优雅降级
- 知识库三步创建向导(类型/配置/权限)
- 快速访问文件夹图标统一为普通文件夹

决策记录:
- implemented/2026-08-19-frontend-detail-optimizations.md
- implemented/2026-08-20-agent-panel-sections.md
2026-08-20 01:33:48 +08:00
Yuchuan Huang 9e2679b9e7 fix(ci): 关闭常规依赖更新 PR 2026-08-19 23:11:18 +08:00
Yuchuan Huang 40783a6462 fix(ci): 缩小依赖聚合更新范围 2026-08-19 13:14:50 +08:00
Yuchuan Huang 0a5f1234fc chore(ci): 优化依赖更新与审计流程
Taskr: 2026-08-19-dependabot-ci
2026-08-19 12:03:22 +08:00
Yuchuan b6999953a8 chore(ci): 增加依赖漏洞审计与许可证报告 (#927)
* chore(ci): 增加依赖漏洞审计与许可证报告

Closes #870

Taskr: 2026-08-18-task-c5bbf857

* fix(ci): 修复依赖审计缓存清理失败

* fix(ci): 补充依赖审计负向控制
2026-08-19 11:17:21 +08:00
Yuchuan f8aded2dab docs: 完善文档信息架构与机制详解 (#925) 2026-08-18 15:09:49 +08:00
Wenjie Zhang bc4c6b117a fix: 修正镜像版本与许可证边界说明 2026-08-18 10:49:40 +08:00
Yuchuan 545b13a277 docs: PR 模板验证情况改为逐条分组格式并联动治理表述 2026-08-18 10:49:40 +08:00
Yuchuan cd558fdd14 chore: 锁定 Redis 镜像版本并同步许可证文档与决策记录 2026-08-18 10:49:40 +08:00
Yuchuan 6d51aa49fd chore: 锁定 Neo4j 镜像版本并补充第三方组件许可证边界说明 2026-08-18 10:49:40 +08:00
Wenjie Zhang faeb6d4308 merge: 侧边栏文件树优化并新增文件搜索(PR #15 直接合并) 2026-08-16 23:44:36 +08:00
Yuchuan925 37165da364 feat(run): AgentRun 固化运行清单指纹并持久化 RunAttempt 执行事实
- AgentRun 新增 manifest/manifest_fingerprint/manifest_recorded_at:
  worker 取得 lease 并完成输入校验后、构造执行上下文前,以当前 owner
  身份 write-once 固化脱敏运行清单(agent/backend、已解析 model spec、
  tools/mcps/skills 标识与版本、实际生效 limits、config SHA-256 摘要),
  指纹为规范化 JSON 的 SHA-256;固化失败置 manifest_persist_failed,
  执行不开始;历史 Run 保持 NULL 表示 unknown。
- 新增 agent_run_attempts 表:每次执行占有一行不可变事实(run_id 与
  attempt_no 唯一、owner token、started/heartbeat/lease/finished、
  outcome 与错误分类),claim 创建、renew 续租、retry 释放、
  终态终结、lease 过期收敛分别写入;不改写已终结 attempt。
- 决策记录两份;集成/E2E 覆盖真实 PostgreSQL 与真实 worker 链路。
2026-08-16 22:57:51 +08:00
Wenjie Zhang 8c46da4b4f merge: 合并 main 修复 PR #15 冲突 2026-08-16 21:27:52 +08:00
Wenjie Zhang eaf561dde9 feat: 建立 Yuxi Spec Loop 工程闭环与确定性 Agent E2E 门禁
统一非平凡变更从提案到证据收敛的流程,固定任务类型,proposed 决策与
PR 共用逐主张验收证据矩阵,verifier 派生契约并配负向测试。

新增无密钥 OpenAI-compatible deterministic replay E2E(真实经 API、
worker、SSE 与 PostgreSQL 因果回读)和 workflow_dispatch 触发的真实
provider 探针;PR 模板按 Agent/非 Agent 分层,简化模板不豁免高风险变更。

补充 postmortem Owner 与模板、spec-loop 文档、决策记录及测试基础设施,
修复契约 verifier 空证据矩阵与 workflow 漂移等负向覆盖。
2026-08-16 20:59:44 +08:00
Wenjie Zhang edcd532e78 fix(ci): 修复工程信任、单测、系统测试与 ruff 四项 CI 失败
- 补充 implemented 决策记录并恢复决策记录可追踪,满足 trust verifier
- 为 CLI auth 单测注入 API_KEY_DERIVATION_SECRET,恢复 CI 单测
- system-tests workflow 在 Prepare 步骤用 CI secret 填充 .env,
  避免 load_dotenv(override=True) 用空值覆盖容器环境变量
- 修复 5 个 backend 文件的 I001 import 排序
2026-08-16 15:46:04 +08:00
Wenjie Zhang acf1d0de88 refactor: Agent-first 工程信任体系与治理重构 2026-08-16 14:51:41 +08:00
Wenjie Zhang da77733e09 docs: Agent-first 工程信任体系与治理重构 2026-08-16 14:50:07 +08:00
Yuchuan Huang a9f02755df feat(search): 统一对话与工作区文件全局搜索弹窗
- 新建 GlobalSearchModal 合并对话搜索与文件搜索,支持模式筛选
- 模式选项置于搜索框下方,segmented control 样式,含图标
- 侧边栏入口默认搜索对话,可切换到工作区文件搜索
- 工作区与 Agent 面板入口默认对应文件搜索(仅文件模式)
- 侧边栏搜索到工作区文件后跳转 /workspace?open= 并自动打开预览
- 删除旧的 ConversationSearchModal 与 FileSearchModal
- 模式按钮改用 Linear/VSCode 风格的极简 underline indicator(黑色 2px 短下划线),不再用突兀的背景色块
2026-08-15 22:33:36 +08:00
Yuchuan Huang 67b1e7fe8f Merge main into feat/agent-panel-file-search 2026-08-15 15:54:45 +08:00
Yuchuan Huang 8becf5e242 Merge fix/login-ip-rate-limit: 登录新增 IP 级失败限速并修复锁定计数残留 (#14) 2026-08-15 14:36:35 +08:00
Yuchuan Huang 7b0b024ff8 feat(agent): 侧边栏文件树优化并新增文件搜索
- 侧边栏 outputs/uploads 预取子项,空目录不再展示;workspace 预取并默认展开
- 新增 FileSearchModal 文件搜索弹窗(样式与对话搜索一致,支持高亮与键盘操作)
- 后端新增 viewer 命名空间与个人工作区的按文件名递归搜索接口(含遍历上限保护),列表与搜索共用目录列举逻辑
- Agent 面板搜索命中直接打开预览;工作区页面搜索命中跳转所在目录并打开预览
- 补充两个搜索服务单元测试
2026-08-15 10:18:32 +08:00
Yuchuan Huang 6e7f0695d7 fix(auth): 登录新增 IP 级失败限速并修复锁定计数残留
- 新增 Redis 滑动窗口失败计数:IP+账号 10 次、IP 全局 30 次(10 分钟),跨 worker 与重启有效,超限返回 429 与 Retry-After
- 未知用户与密码错误均记录失败;登录成功清除 IP+账号维度计数
- 账号锁定到期后首次访问惰性清零失败计数,解锁后首次失败不再立即重新锁定
- 保留 main.py 内存中间件作为每 worker 快速防线,并在服务注释说明 XFF 信任前提
- 新增 7 个单元测试与 2 个集成测试(429 触发、锁定过期重置回归)
2026-08-15 09:32:03 +08:00
Wenjie Zhang ce3ab2ff92 test: 清理测试套件冗余与低质量测试 (#919)
删除 5 个自证式/假绿/重复覆盖的测试文件,合并约 50 个文件的重复场景与参数转发断言,抽取 eval 与 e2e 共享 helper。净减约 2900 行测试代码,真实回归覆盖不变。

- 删除 test_hash_utils、test_skills_backend_error_handling、test_graph_router_list、test_agent_sync_e2e、test_viewer_filesystem_e2e
- 修复 test_agent_request_queue_service 两处假绿测试、test_attachment_and_agent_state 缺失核心断言
- 新增 test/unit/knowledge/eval/conftest.py 与 test/e2e/e2e_helpers.py 共享 helper
- 同步更新 changelog
2026-08-15 09:07:26 +08:00
Wenjie Zhang f60765447c fix(preview): 产物 Word 文件支持 PDF 预览并优化对话时间与 loading 展示
- 查看器文件预览路径(outputs/uploads/沙盒文件)与工作区一致:docx/pptx 先经 LibreOffice 转 PDF 再预览,转换失败返回 400 明确错误
- 消息时间紧挨复制按钮以纯文本展示,去掉背景色块与图标;按相对规则格式化(今天/昨天/周几/月-日/年-月-日)
- 流式 loading 去掉外层背景块,文字改为轻微呼吸动画,耗时改为纯文本
- 新增产物 office 预览与 formatChatTime 单元测试
2026-08-15 02:18:54 +08:00
Wenjie Zhang 07bd9bb05c feat(chat): 对话输入草稿按线程保存与还原
- 新增 thread_draft 工具:草稿按线程 ID 写入 localStorage,空草稿即时清理,存储异常静默降级
- 切换对话时保存旧线程草稿并还原新线程草稿,新建对话使用独立草稿,刷新后仍可还原
- 发送创建线程后清理新建对话草稿;附件上传建线程保留并迁移已输入文本
- 删除对话时同步清理对应草稿;旧线程已删除时丢弃输入,避免孤儿缓存
- 补充 web/test/unit/thread_draft.test.js 覆盖切换、迁移、发送清理与异常回退
2026-08-15 01:57:43 +08:00
Yuchuan Huang 877a305bbd chore(release): 升级版本到 0.7.2.dev0 2026-08-15 00:38:50 +08:00
Yuchuan e44c79f1e9 feat(chat): 对话消息补充结束时间与执行耗时,流式 loading 实时计时 (#918)
* feat(chat): 对话消息补充结束时间与执行耗时,流式 loading 实时计时

历史接口为 assistant 消息附上关联 run 的 started_at/finished_at;
点赞栏最右侧显示消息完成时间(HH:mm),点击切换为执行耗时
再点切回。流式生成时 loading 旁实时显示已执行时长并优化
loading 指示器样式。naive UTC 时间补 Z 后缀序列化,避免前端
时区偏移。

* fix(chat): 保持流式计时连续并统一完成时间

---------

Co-authored-by: Yuchuan <Yuchuan925@users.noreply.github.com>
2026-08-14 23:00:01 +08:00
Yuchuan 00dd1743ac feat(preview): HTML 预览支持缩放比例调节,默认 90% (#917)
* feat(preview): HTML 预览支持缩放比例调节,默认 90%

Agent 文件预览的 HTML 预览新增缩放调节控件:内联、顶部工具栏
与全屏预览均提供缩小/放大按钮与百分比显示,默认 90%,范围
60%-150% 步进 10%;切换文件时重置默认比例,编辑模式隐藏缩放
控件。原缩放为固定常量(内联 0.75 / 全屏 1),现改为可调节。

* fix(preview): 避免切换文件重复重建预览

---------

Co-authored-by: Yuchuan <Yuchuan925@users.noreply.github.com>
2026-08-14 22:56:23 +08:00
Yuchuan 514f7a77f8 fix(kb): 修复知识库图片公开访问风险 (#916)
* fix(kb): 修复知识库图片公开访问风险

知识库解析产生的图片原先写入 public bucket,nginx 无鉴权代理
/minio/public/,知道图片 URL 即可匿名访问。现将图片迁移到私有
kb-images bucket,新增带知识库读权限校验的后端代理接口按需读取,
Markdown 预览对代理图片携带鉴权头加载为 blob URL;头像/Agent
图标等公开资源不受影响。新增代理接口鉴权与非法路径集成测试。

* test(kb): 收紧图片代理路径契约

---------

Co-authored-by: Yuchuan <Yuchuan925@users.noreply.github.com>
2026-08-14 22:55:39 +08:00
Yuchuan ffd21795cf refactor: 迁移运行时配置与 LangGraph checkpoint (#915)
* refactor: 迁移运行时配置与 LangGraph checkpoint

* refactor: 收敛附件生命周期与模型解析

* style(web): 统一组件格式

* fix: 修正配置迁移与附件预处理边界
2026-08-14 22:26:03 +08:00
Wenjie Zhang 6bde1bb633 feat: 侧边栏对话列表显示 Thread 运行状态 (#911)
* feat: 侧边栏对话列表显示 Thread 运行状态

以 AgentRun 为事实来源,列表接口按线程批量聚合最新顶层 chat/resume Run
并映射 loading/ready/done 三态;Conversation 新增 last_viewed_run_id 持久化
查看边界并新增幂等标记已读接口,历史线程一次性回填为已读、新建线程写入
未读哨兵。前端打开线程或收到终态/中断事件时自动标记已读,发送或恢复 Run
时置为 loading,侧边栏可见时低频轮询刷新后台线程状态。

* fix: 避免 last_viewed_run_id 回填在每次启动时全表扫描 agent_runs

ensure_business_schema 在 api/worker 每次启动时都会执行,回填语句原先无条件
对 agent_runs 做 DISTINCT ON 聚合后再按 conversations.last_viewed_run_id IS NULL
过滤,首次回填完成后这个聚合仍会在每次重启时对全表重复执行。改为先用轻量
EXISTS 探测 conversations 是否还有待回填的行,仅在探测为真时才执行回填语句;
探测失败时保守地按需要回填处理,行为与探测前一致。

* fix: 修复 Thread 运行状态自动已读与回填收敛问题

按 PR review 修复两个正确性问题:

1. 前端终态/中断事件仅在事件线程等于当前打开线程时才自动标记已读,
   后台线程完成保留 ready 点直至用户打开,不再误清未读状态。

2. 无 chat/resume Run 的历史会话(agent_call / agent_evaluation 调用、
   从未对话过的线程)在回填时写入未读哨兵,使回填探测条件首次执行后
   收敛为 false,避免每次启动都重复对 agent_runs 全表聚合。

UNVIEWED_RUN_MARKER 从 conversation_repository 上移到 models_business,
供 repository 与 manager 回填共享;补充 manager 回填探测语句单测。

* Delete web/test/unit/chatThreads.test.js

---------

Co-authored-by: Yuchuan <Yuchuan925@users.noreply.github.com>
2026-08-14 10:22:27 +08:00
Wenjie Zhang d37809891c Merge pull request #912 from Yuchuan925/feat/agent-token-usage
feat: 完善 Agent Token 用量统计
2026-08-13 23:04:09 +08:00