qing
a7a78d1424
docs: aggregate project documentation under docs/ with unified index
...
- Move all per-module security audit reports to docs/security/
- Move code review logs to docs/reviews/, analysis reports to docs/reports/
- Add docs/INDEX.md as single entry point for all project documentation
- Add documentation management conventions section to README.md
- Clean up empty per-module docs/ directories
2026-08-03 13:21:48 +08:00
qing
38a6e815f0
fix(static): __view.html 改为绝对路径,修复子目录下 CSS/JS 404
2026-08-02 16:41:08 +08:00
qing
c58ef2b873
fix(static): 修复令牌刷新死循环 + 补全 index/aibox 令牌管理
...
- expired estimate 改用 created_at 替代 iat,与网关校验逻辑一致
- index.html 和 aibox.html 补全 token_manager.js 引用
2026-08-02 16:11:23 +08:00
qing
c7364286b7
fix(static): getNode仅401跳登录,其他异常提示原因并上抛
2026-08-02 12:19:02 +08:00
qing
c3c07ab06d
Merge pull request 'Main' ( #17 ) from main into dev_qing
...
Reviewed-on: qing/micro_servers#17
2026-08-02 11:51:31 +08:00
qing
5a3dff9026
fix(static): 修复dnfs导航栈污染与返回键栈空越界
...
- 点卡片/返回上一层前先经 confirmLeaveIfDirty 守卫确认,用户选择
不放弃输入时不再执行 push/pop,stack 保持原样
- 返回键目标 id 判断由 length>=0(恒真,空栈取到 undefined)改为
length>0,空栈正确回根节点 0
2026-08-02 11:46:51 +08:00
shufeng2012
7e4fd7e54a
Add search input border.
2026-08-02 09:04:53 +08:00
qing
8200cbfba7
refix
2026-08-02 01:19:56 +08:00
qing
2bb1d69d8a
feat(static/aibox.js): 同步BotOps修复到Web前端
...
同步以下修复:
1. endReasoning()/abortReasoning() 结束后清除引用(DOM保留显示),
多轮工具调用时每轮创建独立思考区域,按时间顺序分布
2. 新增 breakAi() 分段函数,处理 ai_break 信号:工具调用前分段
AI文本,后续chunk创建新气泡,避免思考区域被夹在AI文本中间
3. line消息过滤前缀扩展:增加分析工具结果/需要调用工具等
4. 未知消息类型fallback从appendAi改为addTaskLine,防止非AI内容污染聊天区
2026-08-01 22:19:54 +08:00
qing
b60ac06d55
Merge branch 'dev_qing' of https://git.cancerai.top/qing/micro_servers into dev_qing
2026-08-01 20:57:02 +08:00
qing
66963092a3
feat(static): 优化社区首页 — Hero首屏+特性卡片+悬浮毛玻璃导航,CTA随登录态切换
2026-08-01 20:56:39 +08:00
shufeng2012
627950394d
✨ 添加代码块语法高亮功能
2026-08-01 20:08:51 +08:00
qing
f319686571
feat(static): aibox Web客户端重写为移动端专版
...
- 移除桌面端媒体查询与限宽居中,任务面板固定为抽屉形态
- 新增 enterkeyhint=send、overscroll-behavior、tap-highlight 等移动端触控优化
- 配合已提交的中断机制改动,协议与 BotOps 保持兼容
2026-08-01 14:17:36 +08:00
qing
08f737ba2c
fix(static): aibox Web客户端适配中断机制(Ctrl+C可靠停止)
...
问题(与BotOps v1.3修复一致):
- interrupt_ack只显示系统消息,没有立即收尾前端状态
- 思考区域一直停留在"💭 思考中..."状态(服务端中断不发reasoning_end)
- AI状态未重置,残留reasoning片段可能重新创建思考区域
修复:
- 新增abortReasoning()函数:中断时更新思考区域标签为"🛑 思考已中断"(保留已展示内容)
- appendReasoning()增加aiActive===false检查,中断后丢弃残留片段
- interrupt_ack处理改为:先abortReasoning()更新思考区域,再finishAi()收尾AI状态,最后显示通知
- 中断后残留chunk/reasoning/complete均被安全忽略(appendAi已有aiActive检查,finishAi幂等)
2026-08-01 14:14:53 +08:00
qing
d883dc620e
refactor(pymsg): 新增AsyncRpcQueue通用异步队列,log_client基于此重构
...
- pymsg新增AsyncRpcQueue:提供内存队列+后台线程+攒批处理的通用异步基础设施,
支持两种模式:简单RPC模式(client+method+serialize)和自定义handler模式
- confs/dnfs/static的log_client.py重构为基于AsyncRpcQueue的薄封装,
保持API完全向后兼容(push/info/error/warning/debug/critical + 全局logs单例)
- 消除了三份log_client副本中重复的队列/线程/攒批逻辑(约150行/份),
代码量净减少约50行
- LogClient的行为与旧版一致:逐条INSERT到db、fail-fast网络错误、队列满丢最旧
2026-08-01 12:59:33 +08:00
qing
101aed48be
feat(pymsg): RpcClient 新增 retry_on_refused 阻塞等待模式,解决微服务启动顺序依赖
...
pymsg 客户端:
- MsgClient.call() 新增 retry_on_refused/retry_interval 参数
- retry_on_refused=True 时,ConnectionRefusedError 不抛出,按 retry_interval(默认1s)阻塞重试
- 重试期间每5秒向 stderr 打印等待提示,避免日志刷屏
- 仅对 ConnectionRefusedError 重试;TimeoutError/ConnectionError/RpcError 仍立即抛出
- 默认 retry_on_refused=False,完全向后兼容
- RpcClient 构造函数新增同名关键字参数,call() 支持单次调用覆盖
- 新增 time 模块导入
- 更新 README 文档(新增"启动等待模式"章节和参数表)
各服务(db/dnfs/static):
- _fetch_from_confs() 改用 retry_on_refused=True,移除手动 ConnectionRefusedError 捕获和 sys.exit
- 保留 RpcError(如配置文件不存在)的友好错误处理和 sys.exit(1)
- 启动时不再因 confs 未就绪而退出:pymsg 自动阻塞等待 confs 启动后自动连接成功
- 启动顺序从"刚性要求 confs 先启动"变为"不严格要求启动顺序"
- log_client 保持默认 retry_on_refused=False,后台线程不阻塞(fail-safe 丢弃日志)
- 更新各服务 README 和 confs README 的启动顺序描述
测试验证:
- 基本 call() 正常工作
- retry_on_refused=False 连接拒绝立即抛 ConnectionRefusedError
- retry_on_refused=True 阻塞等待(延迟1.5s启动服务后成功连接,重试日志正常输出)
2026-08-01 12:47:08 +08:00
qing
0ae107f953
refactor(static): 删除默认配置与本地回退逻辑,confs 改为强依赖
...
- 配置加载从三层(内置默认值→confs→本地config.ini回退)改为两层(confs 强依赖→环境变量覆盖)
- confs 连接失败直接 sys.exit(1),不再静默使用内置默认值或回退本地 config.ini
- file_config 初始值改为空字符串白名单模板,移除所有内置默认值
- 新增配置完整性校验:server.host/port、directory.root、cors.allowed_origins 必须非空
- ssl 段保留合理默认(enabled=false、cert/key 默认文件名),不强制配置
- 区分错误类型:连接拒绝/RpcError/通用异常分别打印明确错误信息到 stderr
- confs 连接地址改为引导配置(环境变量 CONFS_HOST/CONFS_PORT 优先,默认 127.0.0.1:8010)
- 移除 --config 命令行参数(本地 config.ini 回退已删除)
- 删除 static/config.ini 本地回退文件
- 更新 _run.sh 移除 --config 参数
- 更新 static/README.md 与 confs/README.md 文档
- confs 集成关系描述更新为"confs 最先启动"
2026-08-01 12:38:51 +08:00
qing
de0e4168b2
refactor(static): 首页内联样式解耦至 css/index.css
...
- 新增页面级样式文件 css/index.css(与 view.css/aibox.css 惯例一致)
- index.html 移除内联 <style> 块与头像内联样式,改为外链
- 头像圆角 100px 优化为 border-radius: 50%
2026-08-01 12:37:19 +08:00
qing
1a5e9f7064
feat(static): 首页添加登录态检测与进入笔记入口
...
- index.html: lang 改为 zh-CN,新增"关于本站"介绍段落,按钮改为有 id 的登录/注册/进入/退出四按钮(默认隐藏进入/退出)
- 新增 index.js: POST /whoami 检测登录态(HttpOnly Cookie 自动携带),已登录则显示用户名+进入笔记/退出按钮,未登录显示登录/注册
- 退出按钮调用 POST /logout 后刷新页面
2026-08-01 12:34:53 +08:00
qing
46b66f8bd8
fix(gateway,static): 配置 /ws/aibox WS 反代路由;aibox 桌面端对话左对齐
2026-08-01 06:08:20 +08:00
qing
65580e7e50
refactor(static): aibox.html 拆分内联 CSS/JS 为独立文件
2026-08-01 05:27:02 +08:00
qing
cebef9fe70
docs: 各模块安全审计报告 + 补充 .gitignore 忽略规则
2026-08-01 05:21:23 +08:00
qing
6ed88feaa4
feat(static): 新增 aibox 智能体 Web 客户端(移动端适配)
...
- aibox.html:自包含移动端聊天页,经 gateway [WsProxy] 反向代理与 aibox 通信
- 协议兼容 BotOps client.py:chunk 流式渲染 / reasoning 思考区 / task 任务面板 / 指数退避重连
- 移动端适配:100dvh 动态视口 + safe-area 刘海屏 + 44px 触控目标 + 任务面板抽屉式
- 安全:握手由 gateway 强制 is_admin 验签,Token 全程 HttpOnly Cookie,CSP 合规(本地 markdown-it)
- README 同步页面清单与功能说明
2026-08-01 05:18:30 +08:00
qing
e007990594
feat(dnfs,static): 新增管理员特殊节点(链接/网页代码/图片/文件)
...
- 信封格式:content 为 {"_sp":...} JSON,普通 Markdown 节点不受影响
- dnfs:add_note/update_note 按 is_admin 强制特殊节点发布权(非管理员 403),
字段与大小校验(url≤2048、code≤512KB、base64≤3.5M 字符),AI 审核剔除 base64 负载
- dnfs:修复存量 bug —— 模块级 _sys.path.insert 未定义导致 import 即 NameError
- static:新增 GET /api/favicon 服务端代理(SSRF 防护:内网地址拦截 + 重定向校验 + 512KB 上限)
- 前端:管理员可见节点类型选择器;链接 favicon 卡片 / 网页可审计可运行 / 图片直显 / 文件下载
- theme.css 补充 select 与特殊节点样式;两个 README 同步更新
2026-08-01 04:34:23 +08:00
qing
1b9c727e80
fix(log_client): harden background flush thread against exceptions
...
- Wrap _flush_loop main body in outer try/except to prevent any
unexpected exception (network errors, serialization errors, etc.)
from killing the background thread (which would cause unbounded
queue growth and eventual OOM)
- Wrap _send() call in inner try/except as final safety net
- Wrap RpcClient() construction in try/except (connection failures
during client creation were previously unhandled)
- Add _safe_json() helper: unserializable extra fields fall back to
repr()/str() instead of raising TypeError that could kill thread
- Generate timestamp at push() (enqueue time) instead of _send() time,
so timestamps reflect actual event time even when queue is backed up
- Replace unreliable time.sleep(0.6) in flush() with _flush_done Event
for proper synchronization between caller and background thread
- Add _QUEUE_MAXSIZE=10000 with drop-oldest policy to prevent unbounded
memory growth even in pathological cases
- Use put_nowait with Full handling to ensure push() never blocks
business threads
- Sync fix to all 4 copies: confs/static/smtp/dnfs
2026-08-01 03:23:19 +08:00
qing
f003b4dfaa
style(static): 注册页图形验证码统一为 code-box 布局
...
- register.html 图形验证码改用 .code-box 行内布局,与邮箱验证码对齐
- theme.css 新增可复用 .captcha-img 类,替代内联样式
- README 功能列表补充表单组件说明
2026-08-01 02:51:55 +08:00
qing
6ee1eca789
feat(static): 注册页获取验证码接入图形验证码
...
配合 gateway v0.5.4 邮件轰炸防护(/register/send_code 强制 CAPTCHA):
- register.html: 邮箱与邮箱验证码之间新增图形验证码区块(图片+输入框,复用 login 页结构)
- register.js:
- 新增 refreshCaptcha() 复用 /captcha/image 代理路由(与 login.js 一致)
- 新增 checkCaptcha() 校验图形验证码非空且 Token 已加载
- 获取验证码按钮点击时先校验图形验证码,再携带 captcha_token + captcha_answer 发送
- 无论发送成败都刷新图形验证码(Token 一次性消费)
- 重置表单时清空图形验证码并刷新
方案 A:仅在「获取验证码」时要求 CAPTCHA,注册提交不加(邮箱验证码已是二次验证)
2026-08-01 02:42:15 +08:00
qing
287cab189d
feat(static): 配置接入 confs 统一配置服务
...
- fsys.py 启动时优先从 confs(127.0.0.1:8010)拉取 static.ini,
支持 CONFS_HOST/CONFS_PORT 环境变量覆盖
- confs 不可用时 fail-safe 回退本地 config.ini
- static.ini 纳入 confs/configs/ 统一分发
2026-08-01 02:30:14 +08:00
qing
ea670adde2
feat(static): dnfs 内容输入框随内容自动调整高度
...
- textarea 输入时自动增长,最小 120px,最大 400px
- 超过最大高度后出现滚动条,避免页面无限撑开
- 编辑已有节点时自动适配内容高度
- 提交/重置/退出编辑后恢复初始高度
- 禁用手动拖拽 resize,由自动增长统一控制
2026-07-30 22:21:24 +08:00
qing
5839172dae
迁移/whoami视图
2026-07-30 22:05:12 +08:00
qing
3f97dd92ef
update
2026-07-30 21:57:04 +08:00
qing
eec869a28d
style(dnfs): 增大节点表单输入框尺寸
2026-07-30 15:56:06 +08:00
qing
d309f41e47
refix
2026-07-30 15:52:18 +08:00
qing
6649b31e17
feat(static): add frontend token auto-refresh for dnfs page
...
- New token_manager.js: silent refresh timer (80% lifetime) + global
fetch 401 interceptor with one-shot retry.
- dnfs.py /whoami now returns iat, created_at, keep_time for expiry
estimation.
- Dnfs.html loads token_manager.js before dnfs.js (zero change to dnfs.js).
- Graceful fallback: stale tokens without new fields, refresh failures,
and /refresh_token 401 itself all degrade to the existing 401→login flow.
2026-07-30 12:25:11 +08:00
qing
62007e7848
docs(static): README 路由表、架构图、配置、依赖与实际代码同步
...
- 修正根路径 / 描述:index.html → login.html
- 补全全部 19 个路由(原仅 6 个),分组为核心/内部工具/OAuth/代理
- 架构图补全 waf:443 → gateway:8443 → static:9200 完整链路
- 配置示例新增 [cors] 段
- 依赖列表补全 waitress 和 pymsg
- 页面和功能列表补全遗漏项
2026-07-30 11:48:54 +08:00
qing
9765edac9b
fix(static): 前端脚本识别 WAF 拦截响应并正确提示
...
- validation.js 新增 WafTip 公共检测:403 + 响应体含 blocked by WAF 双重特征,
与 gateway 白名单拒绝的 403(JSON 错误消息)精确区分
- login/register/dnfs/view 各请求点在 JSON 解析前识别拦截,统一提示
「请求被 WAF 安全规则拦截,请检查输入内容」
- 修复 dnfs getNode 被 WAF 拦截时落入 catch 误跳登录页的问题
- 验证码图片加载识别 403 拦截,alt 提示点击重试
- __view.html 补充引入 validation.js
2026-07-30 11:01:34 +08:00
qing
40175eddb5
Revert "style(dnfs): 用户信息面板移到左边中间,与右侧 minimap 镜像对称"
...
This reverts commit 5c33dbe027 .
2026-07-30 09:52:08 +08:00
qing
5c33dbe027
style(dnfs): 用户信息面板移到左边中间,与右侧 minimap 镜像对称
2026-07-30 09:44:15 +08:00
qing
a58a0f97e3
feat(dnfs): minimap 与用户面板按视口宽度决定初始折叠态
...
新增 PANEL_EXPAND_MIN_WIDTH=768 断点:宽屏默认展开、窄屏默认折叠避免
遮挡内容;仅决定初始状态,用户手动折叠/展开不被 resize 覆盖。
2026-07-30 09:40:58 +08:00
qing
55b127747a
fix(dnfs): 用户面板用户名/角色改为纯展示,去除手型光标与 hover 变色
...
新增 .tag.no-hover 修饰类还原交互态;折叠按钮与退出登录保持可点样式。
2026-07-30 09:34:53 +08:00
qing
8c1956cdeb
feat(dnfs): 左上角用户信息面板(默认折叠),新增 /whoami 身份接口
...
dnfs 新增 POST /whoami:解 Token payload 返回 user/is_admin,无或畸形
Token 返回 login=false(HttpOnly Cookie 模式下 JS 无法读 Token,身份
必须由后端下发);static 加 /whoami 代理(Cookie 转 Bearer);前端
dnfs.html 左上新增 userpanel,镜像 minimap 样式默认折叠,展开显示
用户名/角色/退出登录(POST /logout 清 Cookie 后跳登录页)。
2026-07-30 09:31:28 +08:00
qing
1388fcb72b
feat(dnfs): 卡片移动按钮一并纳入 can_operate 权限显隐
...
编辑/移动/删除三个按钮合并为单次权限判断(移动本质也是 update_note),
未登录或无权时不渲染整个按钮组。
2026-07-30 09:21:15 +08:00
qing
b4e1cf462a
feat(dnfs): get_notes 按当前用户注入 can_operate,前端按权显隐编辑/删除按钮
...
dnfs get_notes 可选解析 Authorization(畸形 Token try 兜底),为每个节点
附带 can_operate 标记(is_admin 或 owner,口径与 delete/update 一致);
dnfs.js 卡片编辑/删除按钮仅 can_operate === true 时渲染,未登录或无权隐藏。
2026-07-30 09:17:28 +08:00
qing
949d274c22
获取节点失败后跳转
2026-07-30 08:22:53 +08:00
qing
c5dd8d198d
feat(smtp): 同一邮箱 60 秒发送冷却,gateway 429 透传 + 前端重发倒计时(gateway v0.5.3)
2026-07-29 20:54:56 +08:00
qing
f4a7aca2fa
update: smtp 验证码有效期 60s 调整为 10 分钟,邮件正文从 CODE_TTL 派生
...
60 秒对邮件送达延迟过于紧张;正文有效期文案改为按 TTL 自动生成避免漂移,前端提示与 README 同步。同时移除 .env 排查用的凭证明文调试打印。
2026-07-29 19:32:44 +08:00
qing
3bc4f9720f
fix(dnfs): 移动请求期间禁用按钮防止重复提交
...
后端 update_note 走 AI 审核耗时较长,confirmMove 期间禁用移动条
与表单按钮,finally 统一恢复
2026-07-29 14:37:27 +08:00
qing
3f9bffb9ea
feat(dnfs): 节点移动功能
...
- dnfs.js: 卡片新增移动按钮,startMove 暂存节点,底部悬浮移动条
提供移动到当前层/取消;confirmMove 经 update_note 改 pid 完成迁移;
拦截移动到自身与已在当前层的情况
- dnfs.html: 新增 #movebar 容器
- theme.css: act-move 描边按钮与 movebar 底部悬浮条样式
2026-07-29 11:40:35 +08:00
qing
ace98caff6
feat: 卡片编辑/删除按钮 + dnfs 管理员豁免
...
- dnfs.js: 卡片底部新增编辑/删除按钮,复用下方表单支持编辑模式
(startEdit/cancelEdit/updateNode/deleteChild),stopPropagation 防误触
- theme.css: 新增 card-actions/act-btn 按钮样式,编辑橙色/删除红色软底
- dnfs.py: ADMIN_USERS 统一管理豁免名单(admin, admin@qsont.me ),
update_note 新增管理员豁免,delete_note 同步改用名单
- dnfs/README.md: 同步更新所有权豁免说明
2026-07-29 11:22:30 +08:00
qing
a0f6a14b5d
style(dnfs): 笔记卡片尺寸随内容自适应
...
- recommend-list 改为 flex 纵向布局,gap 统一间距,隐藏 JS 遗留 <br> 分隔符
- 卡片宽度 fit-content 包裹内容,min-width 240px 保底、max-width 100% 封顶
- 内容图片限宽防撑破自适应布局
2026-07-29 11:05:20 +08:00