caoqianming
|
137d27acdd
|
fix(security): 强化工程类型检查与依赖审计
|
2026-08-03 16:59:32 +08:00 |
caoqianming
|
bc45753f77
|
feat(models): unify thinking controls
|
2026-08-03 14:36:50 +08:00 |
caoqianming
|
dfda6fd772
|
feat(image): support GPT image editing
|
2026-08-03 14:31:38 +08:00 |
caoqianming
|
57655984dd
|
feat(web): add task-scoped artifact references
|
2026-08-03 13:49:20 +08:00 |
caoqianming
|
4ec2638d38
|
feat(web): embed interactive HTML artifacts
|
2026-08-03 11:34:35 +08:00 |
caoqianming
|
f217672365
|
feat(web): render Mermaid diagrams in chat
|
2026-08-03 10:26:39 +08:00 |
caoqianming
|
a00ebfe50e
|
fix(markdown): repair nested code fences
|
2026-08-03 10:11:25 +08:00 |
caoqianming
|
a8b84b1d6f
|
feat(web): allow attachments to start conversations
|
2026-08-03 09:57:21 +08:00 |
caoqianming
|
b0e0182b73
|
fix(agent): route PDF ingestion through markitdown
|
2026-08-03 09:43:57 +08:00 |
caoqianming
|
8999fb1b77
|
fix(rendering): detect LibreOffice components
|
2026-08-03 09:27:30 +08:00 |
caoqianming
|
21a90cf201
|
fix(rendering): route PDF conversion through platform tools
|
2026-08-03 08:55:54 +08:00 |
caoqianming
|
75bb482015
|
feat(media): support GPT image output controls
|
2026-07-31 17:32:15 +08:00 |
caoqianming
|
59c238bd34
|
fix(media): use dedicated GPT image model
|
2026-07-31 17:01:46 +08:00 |
caoqianming
|
683bdf993d
|
fix(web): restore conversation clearing
|
2026-07-31 16:37:39 +08:00 |
caoqianming
|
13e3e50371
|
fix(web): sort tasks by recent activity
|
2026-07-31 15:02:13 +08:00 |
caoqianming
|
cd6a76cba9
|
fix(storage): 兼容消息中的 NUL 字符
|
2026-07-31 14:43:10 +08:00 |
caoqianming
|
afdcf46577
|
feat(tasks): streamline task creation and embedded entry
|
2026-07-31 14:31:50 +08:00 |
caoqianming
|
da265b88d5
|
fix(web): open embedded task working directory
|
2026-07-31 13:54:22 +08:00 |
caoqianming
|
3c022494f5
|
fix(web): retitle cleared conversations
|
2026-07-31 13:00:34 +08:00 |
caoqianming
|
5c80fb202b
|
fix(web): hide lifecycle actions for channel chats
|
2026-07-31 11:30:50 +08:00 |
caoqianming
|
61648f1114
|
Add context menus to task and file lists
|
2026-07-29 16:35:20 +08:00 |
caoqianming
|
bcdbdd4738
|
Streamline conversation activity UI
|
2026-07-29 15:59:00 +08:00 |
caoqianming
|
02b278b175
|
Refine mobile conversation layout
|
2026-07-29 15:13:51 +08:00 |
caoqianming
|
369c74483c
|
Refine workspace reading and mobile layout
|
2026-07-29 14:59:10 +08:00 |
caoqianming
|
07eba5c402
|
Polish web workspace visual foundation
|
2026-07-29 14:34:46 +08:00 |
caoqianming
|
ff3bc75fed
|
合并工作目录新建入口
|
2026-07-29 14:00:04 +08:00 |
caoqianming
|
03ee37e201
|
改进工作目录可搜索选择
|
2026-07-29 13:48:16 +08:00 |
caoqianming
|
d75df5a4b4
|
优化新对话目录选择
|
2026-07-29 13:38:20 +08:00 |
caoqianming
|
cfc1d17af7
|
优化工具失败观测与重复保护
|
2026-07-29 09:29:44 +08:00 |
caoqianming
|
6f2840a5d0
|
统一运行生命周期入口
|
2026-07-28 15:34:42 +08:00 |
caoqianming
|
7cfeebfa89
|
增强消息运行可靠性
|
2026-07-27 17:50:31 +08:00 |
caoqianming
|
70683b7d09
|
增强知识库文件写入一致性
|
2026-07-27 16:37:56 +08:00 |
caoqianming
|
ade3a847f6
|
Fix web search date handling
|
2026-07-27 12:50:07 +08:00 |
caoqianming
|
c3a6f7deee
|
Add workspace-first new conversation flow
|
2026-07-27 12:28:56 +08:00 |
caoqianming
|
85c918dc2f
|
Add safe conversational workspace rename
|
2026-07-27 11:23:20 +08:00 |
caoqianming
|
98713bb7fa
|
feat(seedance): support image-to-video references
|
2026-07-27 10:50:13 +08:00 |
caoqianming
|
e03a1ee7eb
|
docs: bump 0.59.4 + CHANGELOG(kb 冷启动/查看原件/条目精简)+ PROGRESS
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-24 15:50:05 +08:00 |
caoqianming
|
e0aa8130af
|
fix(kb): 零库时注入冷启动契约,修「放进知识库」被误写进记忆
根因:kb_block 零库返回空串,agent 不知道 KB 机制存在,用户点名"知识库"
被就近理解成记忆写进 .memory/(真实用户事故)。与 memory 空契约常驻同一课。
- core/kb.py: 新增 _KB_COLD_START(建库步骤 + INDEX 行格式 + KB/记忆分工,
~百 token);kb_block 零库分支改注该契约,有库分支不变
- tests/test_kb_block.py: 锁两分支(冷启动文案/路径展示/全量 INDEX/空库)
- DESIGN.md §3.8: "有库才注入"取舍更新为冷启动注入 + 事故记录
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-24 15:31:50 +08:00 |
caoqianming
|
0cd5b07124
|
feat(web): kb 下载入口(原件+解析 Markdown)+ bump 0.59.3
- kb.js:已入库条目行「⬇ 下载原件」、单篇页头「下载原件/下载
Markdown」、待入库列表逐项下载;复用 media.js downloadFile 走现成
/v1/files/download(.kb 在 user_root 下,safe_join 天然放行),零后端改动
- dev.html:新按钮三行 CSS(hover 淡入同删除按钮、待入库行间距)
- 弃选:kb 专属下载端点(与 files 下载重复,公测期白养对外契约)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-23 21:33:23 +08:00 |
caoqianming
|
8751f71f5a
|
feat(web): 移动端对话附件入口(拍照/照片库/选文件)+ bump 0.59.2
chat 输入区此前仅粘贴/拖拽两条附件路,移动端双双不可用。加 [附件] 按钮:
触屏弹三项菜单(拍照 capture=environment / 照片库 accept=image,video /
选取文件无 accept),桌面端直开文件选择器;三入口 change 统一走既有
uploadAttachFiles 链路,只读镜像随 applyChannelComposerLock 禁用。
纯前端改动,无后端/schema 变化。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-23 14:49:16 +08:00 |
caoqianming
|
1332139c9e
|
docs: bump 0.59.1 + PROGRESS 汇总 15 commit 重构 + DESIGN §2 架构树同步
- core/__init__.py 0.59.0 → 0.59.1(patch:全部内部重构/测试/修复,对外行为零变化)
- PROGRESS:07-23 条目(七项重构 + 2 bug + 测试 286→351 + 测试库基建)、
文件清单刷新(loop/llm_transport/tool_registry/storage 三分/web routers 布局)、
最后更新行
- DESIGN §2:架构树补 llm_transport/tool_registry/storage 三分/web 拆分后布局
(实施后与代码偏离,按「同步改回」条款修正);CHANGELOG 按「纯内部重构/修复
不记」规则不动
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-23 14:29:19 +08:00 |
caoqianming
|
bcd2b90942
|
refactor(storage): 失败埋点拆出 telemetry.py + kind 契约常量化;补 wecom 加解密测试
收官三小项(架构审查残余):
- core/storage/telemetry.py:四个留痕函数(malformed/salvaged/empty/run_error,
cost 恒 0)从 usage.py 迁出——「usage=计费」心智不再被埋点污染(数据层 Top4);
kind 字符串升为常量,loop/llm_transport(写)与 toolfail(读 SQL)两侧共用
同一事实源,此前靠字面量约定、改名会静默漏读。core.storage.__init__ 转发
出口不变,调用面仅 web/runs.py 一处改 import
- tests/test_wecom_crypto.py:7 用例,企微回调加解密(WXBizMsgCrypt 等价实现)
测试侧按同方案自造密文,覆盖验签/receiveid/padding 各失败路径——wechat 子系统
(审查 Top3 零测试)中唯一可纯测的一块补上
- DB 测试探针补 connect_timeout=5:测试库挂掉时快速降级 skip,不再把整个
discovery 挂死在 TCP 建连上(Docker engine 打嗝时实测挂死过)
带测试库 351 全过 / 无测试库 341 过(DB 组干净 skip)。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-23 14:21:45 +08:00 |
caoqianming
|
5a5ebfbe24
|
refactor(tools): 输出处理原语移出 base.py——base 只留 Tool 基类与路径边界
compact_tool_output / format_timeout_result 是「工具输出处理」关注点,与
Tool ABC / FileOutOfBounds 路径安全混装在 base.py(审查小项)。析出
tools/output.py,8 处引用(5 工具 + executor_docker + 2 测试)同步改。
318 测试全过。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-23 13:15:04 +08:00 |
caoqianming
|
8300631a1c
|
refactor(core): export_docx 字体助手复用 rendering.common——消除逐字重复
_set_run_fonts 与 rendering/common.py::set_run_fonts 逐字相同,改为 import
复用(单一事实源)。方向说明:rendering/ 会 bind-mount 进沙箱、必须保持无
core 依赖,故 export_docx(读 PG)留在 core、反向引 rendering —— 修正架构
审查里「迁 rendering/docx_chat.py」的建议,搬过去会破坏该层的沙箱可用性。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-23 12:51:04 +08:00 |
caoqianming
|
cac0bfcfe4
|
refactor(core): loop.py 传输健壮性层析出 llm_transport.py + _execute_tool_call 拆分
架构审查 P1#4:loop.py 把「provider wire 层瞬态故障自愈」与「agent 控制流」
塞在同一文件;_execute_tool_call 一个函数线性堆 10 个关注点(148 行)。
- 新增 core/llm_transport.py(438 行):畸形/必填 key 被吞/空响应检测、三类
故障留痕、usage/delta 提取、robust_stream 重试策略(首败降级非流式 +
salvage 可救当轮续)。取流两路径与 salvage 以 callable 注入——不 import
loop,单测在 AgentLoop 实例上打桩 _collect_stream_once/_nonstream_once
的现有缝隙原样保留
- loop.py 1158→812 行,回归 ReAct 主干:_stream_llm 只留上下文压缩准备
(context 关注点),wire 健壮性委托 robust_stream;_collect_stream_once/
_nonstream_once/_try_salvage_response 留在 loop(持 llm/emit 态 + 测试缝)
- _execute_tool_call 148 行拆为编排 + 4 个正交方法:_check_repeat_block
(两道拦截)/_maybe_skill_model_switch(热切)/_repeat_feedback(登记+
软提示)/_maybe_pptx_guard(产物机检)
- 4 个测试文件 import 指向同步更新(is_empty_response 等改公有名)
292 测试全过(loop 重试/空响应/repeat-guard/salvage 套件覆盖改动路径)。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-23 12:44:22 +08:00 |
caoqianming
|
1197d73432
|
refactor(core): 工具注册声明式化 core/tool_registry.py——四种 env-gate 风格收敛为一张表
架构审查 P0#3:build_agent 内 ~220 行注册代码,同一个「有 key/开关才注册」
意图混用四种写法(inline getenv / *_configured() / Config.load() 返 None /
caps 开关),范式靠注释口头传承。
- 新增 core/tool_registry.py:注册表 = (组名, gate, factory) 列表。gate 统一
零参 bool(§7.5 #7 "secret-bearing 工具仅 env 存在才注册"由此获得代码强制);
factory 内做 variant 选择(seedance/vision 取 yaml 段),选不出返 [] 自然不挂;
新增工具 = 表里加一行
- ToolContext 承载 build_agent 已解析的上下文(路径/身份/媒体配置),注册层
不重复读 env/yaml
- agent_builder.py 892→649 行:注册块换成一次 build_tools 调用,26 个工具类
import 随之迁走
验证:292 测试全过;真实配置冒烟 32 个工具逐名符合预期,scheduled_run
门控(少 4 个 schedule_*)生效。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-23 10:36:38 +08:00 |
caoqianming
|
7354578aaa
|
refactor(storage): 计费读侧收口 core/storage/usage_report.py + 首批 DB 级测试
风险点(架构审查 P0#2):UsageEvent.units JSONB 的 key 由 usage.py 写入,
读侧 cast(units[...].astext) 却散在 web/admin.py 与 web 各处硬编码——写读
跨文件隐式耦合且零测试,改 key 会静默算错计费统计。
- 新增 core/storage/usage_report.py:units 读侧唯一出口(列表达式单一事实
源),含 task_usage_aggregates(逐 task 批量)/ usage_overview(全局+7d
趋势)/ models_usage(按模型)/ user_usage_page(按用户分页)
- web/admin.py 三个内联聚合函数删除,改调 usage_report;web 层不再出现
任何 JSONB cast(grep 已核)
- web/common.usage_aggregates 移除,tasks/schedules 路由改引 core 版
- tests/test_usage_report.py:6 个 DB 级测试锁口径(cost 全 kind 合计、
token/cache_hit 仅 chat、task_id 可空的 kb_ingest 不进 task 聚合、cutoff
过滤、用户分页含档案字段)。无 PG 自动 skip;只插/删测试专属 user 的行。
发现并记录:ZCBOT_DB_URL 平时靠 import litellm 的隐式 dotenv 进 env,
测试显式从 .env 抠 key 不背 8s 重依赖。
292 测试全过,测试数据零残留。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-23 10:33:13 +08:00 |
caoqianming
|
2e063e2ac0
|
fix(prompt): Word 渲染段命令行按 backend 换路径——host 不再注容器路径
_build_system_prompt 渲染段原硬编码 /sandbox/rendering/render.py,host 模式
(本地 dogfood)下该容器路径不存在,agent 照调必 FileNotFoundError。
按 is_docker 分支:docker 原样不变;host 换 venv 解释器 + 宿主真实路径。
skill 文档里的 /sandbox 写法是 docker 专属管线,不动。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-22 16:13:56 +08:00 |
caoqianming
|
6e455d37be
|
fix(kb): 注入契约改主动查阅——相关即先读无需点名,去掉 document_search 路由
- _KB_CONTRACT 第一条换成主动性规矩:INDEX 条目与问题相关就先 read 正文再答,
用户无需说"从我的知识库里查";此前契约只写"怎么用"没写"何时主动用",
flash 容易把 INDEX 当背景略过
- 去掉契约里的 document_search 路由条(契约只管 .kb 自己怎么用,路由靠各自
工具描述自然分流,少一层耦合)
- DESIGN §3.8 两处描述同步收窄
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-22 15:43:01 +08:00 |
caoqianming
|
c6232d8325
|
feat(kb): 个人知识库——.kb/ 纯文件机制+/v1/kb* API+前端 modal+注入契约(bump 0.59.0)
- core/kb.py: 状态/视图层(INDEX 单行格式 parse/format、已入库判据=INDEX 有条目、
删单篇连带原件与索引行、kb_block 注入——有库才注)
- core/kb_ingest.py: 入库管线 markitdown→扫描件 OCR 兜底(方舟)→flash 摘要(失败降级
不阻塞)→追加 INDEX;编排 to_thread+per-(user,库) 锁,幂等可续跑
- 0022 迁移: usage_events.task_id 放宽可 NULL(kb 入库无 task 上下文);
记账溯源 kind="kb_ingest"/"vision" + units {"kb","source"}
- web/app.py: /v1/kb* 8 端点(列/建/删库、详情带进度、上传即入库、手动 ingest、看/删单篇),
不设 HTTP 检索端点(agent 走 fs 工具)
- 前端: kb.js 两栏 modal(上传 XHR/进度轮询/删除确认);rail 左下新增知识库入口,
四按钮改图标+小字两行布局
- agent_builder 在 memory_block 后注 kb_block(docker/host 路径换算同 .memory);
documents skill「何时不用」补自建资料路由行
- DESIGN §3.8 机制小节 / CHANGELOG 0.59.0 / PROGRESS
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-22 15:20:43 +08:00 |