caoqianming
|
02e7d2cb14
|
feat(files): create folders from file panel
|
2026-08-06 15:04:15 +08:00 |
caoqianming
|
e73521b3c9
|
fix(chat): keep model label on one line
|
2026-08-06 14:24:41 +08:00 |
caoqianming
|
4873dd0ae5
|
fix(chat): keep new conversation model controls inline
|
2026-08-06 14:14:38 +08:00 |
caoqianming
|
689059eb8e
|
feat(chat): choose model for new conversations
|
2026-08-06 14:00:48 +08:00 |
caoqianming
|
7e544827c0
|
feat(files): toggle task hidden directories
|
2026-08-06 12:05:36 +08:00 |
caoqianming
|
80fbc7ab4a
|
feat(external-systems): support generic OpenAPI integrations
|
2026-08-05 17:18:29 +08:00 |
caoqianming
|
af0ad934bb
|
feat(external-systems): guide MES aggregate queries
|
2026-08-05 15:01:43 +08:00 |
caoqianming
|
cb9a39f33d
|
feat(external-systems): add managed MES connections
|
2026-08-04 16:53:58 +08:00 |
caoqianming
|
eedaf2c1fe
|
feat(web): add compact message actions
|
2026-08-04 11:33:27 +08:00 |
caoqianming
|
8cf08c0f23
|
feat(web): widen artifact previews and refine file chips
|
2026-08-04 09:11:32 +08:00 |
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
|
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
|
328607671a
|
feat(web): preview HTML and source files
|
2026-08-03 11:16:40 +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
|
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
|
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
|
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
|
eab623d5b5
|
fix(web): kb 条目与单篇页补显原件文件名
已入库条目此前只把 source 用于查看/下载按钮,原件名(含后缀)无处显示。
标题后加灰色小字原件名(悬停提示同步带上),单篇页头部加「原件: xxx」,
新增 .kb-src-name 样式两处共用;不破坏单行精简版式。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-24 16:17:39 +08:00 |
caoqianming
|
0c74a44224
|
style(web): kb 已入库条目精简为标题+单行摘要
- 行内去掉关键词、摘要 CSS 单行省略(原 .sk-desc 省略规则只覆盖左栏
.sk-item,右栏 kb-entry 整段换行铺开导致每条过高)
- 完整摘要+关键词挪进悬停 title,信息不丢
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-24 15:45:05 +08:00 |
caoqianming
|
0ceb4c5bd9
|
feat(web): kb 查看原件(复用文件预览弹框)+ 预览层级抬到 modal 之上
- kb.js: 已入库条目行/单篇页/待入库列表三处加「查看原件」,直接
openFilePreview(.kb 相对路径,与下载同通道 /v1/files/download)
- dev.html: file-preview-modal z 90→114(盖过 kb/skills/memory 等 112 层
modal,仍低于 app-dialog 130)、fp-open chat-form 95→115、mini 96→116
- main.js: Esc 关栈顺序同步(小预览→文件预览→各 112 层 modal→选入→新任务)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-24 15:38:37 +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
|
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
|
fd79edb344
|
test(web): DB 面路由测试(tasks CRUD/files DB-aware/upload)+ 修 restore 500
测试库基建落地(docker postgres:16-alpine @5433 + migration 0001-0022,
RUN.md 补一键命令),tests/test_web_routes_db.py 10 用例补齐 nodb 套件留待面:
- tasks CRUD 全链:建(默认模型/working_dir)/列(分页壳)/详(上下文压力
字段)/PATCH 校验/软删→列表消失→恢复/同 wd 共享 + folders 计数
- files 顶层目录 DB-aware(§7.4):rename 级联改 tasks.working_dir(tasks_
updated=1 且 DB 生效)、running→409、move 被引用→409、递归删被引用→409、
软删 task 后放行
- upload 配额 gate 路径 + 根目录列表(system_wd_names)+ 非法文件名 400
- clear/cancel 状态闸、models 档位列表、schedules 404 路径
修 bug(本套件抓出的存量缺陷,重构前即有):POST /v1/tasks/{id}/restore
用 ORM 脏标记恢复,updated_at 是 server-side onupdate,flush 后列被标记
expired,session 关闭后序列化读它抛 DetachedInstanceError——真软删过的
任务恢复必 500(幂等路径无脏标记故此前未暴露)。修法:flush+refresh 后
在 session 内完成 task_dict 序列化。
带测试库全量 344 全过;未设 ZCBOT_TEST_DB_URL 时干净 skip;测试库零残留。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-23 13:50:57 +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
|
546cb34d94
|
refactor(web): lifespan 后台协程按域析出——app.py 收敛为纯编排(732→200 行)
- web/scheduler_runner.py:定时任务执行引擎(claim→抢锁→run_agent_bg→
超时协作 cancel→投递记账),start_scheduler 一个入口
- web/wechat_runner.py:ClawBot 入站长轮询 + PG advisory lock 选主
- web/background.py:磁盘扫描/线程池监控/工具失败巡检/sandbox 池初始化+
reaper/proc 清扫/孤儿 run 收割/优雅 drain,统一 start_*/cancel_and_wait
- app.py lifespan 只剩:executor 接管、state 装配、协程起停编排、收尾顺序
行为零变化(启动钩子与关停顺序逐一保持);286 测试全过,TestClient
lifespan 起停冒烟干净。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-23 10:24:36 +08:00 |
caoqianming
|
25d8a6572f
|
refactor(web): app.py 拆分——73 路由迁 11 个 router 模块,3972 行减至 732
照 admin.py 的 register_*_routes 注册范式把 create_app 巨型闭包拆开,
依赖(require_user/auth_cfg)显式传参,对外 /v1 契约零变化:
- web/routers/:misc/models/authroutes/wechat(含企微)/kb/schedules/
skills_memory/files/asr/tasks/messages 共 11 个模块
- web/common.py:跨 router 常量与 helper(task_dict/usage_aggregates/
sse_event/assert_owns_task 等)
- web/schemas.py:13 个 Pydantic 请求模型独立成文件
- web/model_gate.py:模型档位门控 + image/video variant 解析
- web/runs.py:run_agent_bg + run_channel_conversation(BG worker 与
渠道入站对话核心,从 app.py 模块级函数析出)
- web/userfiles.py:路径安全原语(safe_join 越界校验/transfer 预检)收口
- app.py 只剩 App 工厂 + lifespan 后台协程群
验证:286 测试全过;路由面 81 条逐条一致;TestClient 冒烟
(healthz 200/坏 platform_key 403/未鉴权 401/lifespan 正常启动)。
test_changelog/test_pptx_render 的 import 指向同步更新。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-23 10:18:57 +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 |
caoqianming
|
fc53d21620
|
fix(web): 长对话点目录圆点首次跳不到位——重建窗口瞬时定位+跳转期抑制 sentinel 补载
根因链:loadMessagesAround 后 renderMessages 尾部无条件滚底,把视口钉到
新窗口末尾;底部 sentinel 落在视口内立刻触发 loadNewerMessages,其整窗
重渲染(innerHTML 清空)删掉平滑滚动的目标元素、再把 scrollTop 恢复到
fetch 前位置——首次点击停在窗口底部附近,第二次点击才能到位。
- renderMessages 加 stickBottom 参数(默认 true 保持首屏/发送行为);
loadEarlier/loadNewer/loadMessagesAround 三个调窗口路径传 false
- jumpToMessage 重建窗口后用瞬时定位(auto),不给补载/图片异步撑高留
动画窗口期;已在 DOM 的近距离跳转保留平滑
- _msgScrollObserver 在 _outlineJumpLock 期间不补载;解锁时
_repokeMsgSentinels 对 sentinel unobserve+observe 补投一次交叉状态,
避免 sentinel 停留在视口内时解锁后无人触发加载
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-21 16:42:41 +08:00 |