Commit Graph

149 Commits

Author SHA1 Message Date
浅念 45b0ff6891 docs: site-import spec 复审建议四项(测试覆盖/时间口径/max_tokens 目标值/非 HTML 入口映射)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-20 16:37:03 +08:00
浅念 2942a8d511 docs: site-import spec 新视角评审收口(7 硬伤+9 建议:品牌四件生成路径/审核页墙尾巴区/POST 限流/超时对齐/anyio/模型上限/空值兜底等)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-20 16:33:53 +08:00
浅念 0fe12b261c docs: site-import spec 用户终审九项补强(主色排除/logo 格式/总超时/retry形状/联合索引/JSON容错/内容不足/UX细节/中文关键词)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-20 16:22:37 +08:00
浅念 f29f4bc3d6 docs: site-import spec 终审两个文案 nit(API 数/retry 语义引 §3.3)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-20 16:16:58 +08:00
浅念 13e6c06c4d docs: site-import spec 评审收口(403 语义/es 尾巴/SSRF 连接层实现细节/GC 坑等)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-20 16:14:48 +08:00
浅念 ff5095168e docs: 网站自动导入知识库设计 spec
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-20 16:02:32 +08:00
浅念 6b6f35d64f chore(deploy): compose 宿主端口 env 化(APP_HOST/APP_PORT,默认 127.0.0.1:8018)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-20 09:54:19 +08:00
浅念 f6a8d51aa0 chore: 收口——终审 Minor 2 注释修正 + 各 Batch 完成记档
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-19 20:00:48 +08:00
浅念 9315dba228 docs(deploy): 共享域名模式部署工件
模板:共享域名 server 块注释示例(kefu.example.com 占位,WS 升级头
落 regex location ^/t/[a-z0-9-]+/ws/——路径模式 WS 真实路径带 /t 前缀);
XFF 追加式语义注记(登录限流取末段,勿改覆盖式);--root-path 禁用
边界(root_path 前移 raw_path,路径前缀解析永不命中)。

手册:§3.6 共享域名模式(概念/零 DNS 接入流程/地址形态表/无尾斜杠
404 语义/部署注记三条);§6.5 加租户补共享域名零反代路径;1Panel
注记补 ws.conf regex 形态。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-19 19:44:46 +08:00
浅念 e1eae007b4 feat(admin): 创建向导域名可跳过(纯路径模式租户)
步骤②本就无强制域名校验(validateWizardStep 只门控步骤 0/2,
提交侧 filter(Boolean) 空列表即 domains:[],后端 default_factory=list
默认空)——本次只补文案引导:ElStep 标题加(可跳过)、步骤内 tip 写明
留空即共享域名路径模式租户(嵌入代码在配置中心-品牌与外观生成)、
头注释同步。向导无摘要步骤,域名数 0 展示属正常,均无需改动。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-19 19:37:35 +08:00
浅念 5813fc91c7 feat(admin): 嵌入代码双形态 + shared_widget_domain 平台键
- 后端 GET /api/platform/settings/widget-domain:读平台设置键
  shared_widget_domain(settings_store 内存快照,PUT settings 后热刷新
  即时可见);platform_user 两种角色可读(超管配置/租户管理员生成嵌入
  代码——与 settings CRUD 的 require_super 不同,非密钥无敏感面);
  空串/非字符串视同未配置 → null
- config/center 嵌入卡双形态(spec 2026-10-19 §5):域名形态 +
  共享域名形态(/t/<slug>/static/widget.js,路径前缀即租户标识);
  可用性规则(两料齐双形态/无域名仅共享/共享未配仅域名/都无引导文案)
  与生效态回退;data-site 两形态通用
- normalizeSharedDomain 主机名字符集校验(拒引号/尖括号/空格——防
  配置侧把恶意字符注入生成的 script src 串)+ buildEmbedCode 纯函数,
  vitest 6 例钉位
- 平台设置页新增「共享域名」组(shared_widget_domain 推荐键,表驱动
  渲染自动生效);settings API 模块加 getWidgetDomain

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-19 19:24:56 +08:00
浅念 f938118fee feat(limits): 限流器过期键周期清扫(内存上限铁律)
LoginLimiter._fails 与 rate_limit._buckets 只增不删——懒清理只覆盖被
回访的键,扫号换 IP/设备轮换产生的键永不被回访 → 进程长跑缓慢累积。
两处各加 sweep()(全表清「全部时间戳均已出窗」的键,窗沿 <= 与既有
保留判据 t > now - W 同沿),main.lifespan 起周期任务(300s loop)
启动创建/关停取消(cancel 后 await 落地,不留 pending task)。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-19 18:59:22 +08:00
浅念 4f58398ac2 feat(auth): 登录限流 IP 取 XFF 末段(防首段轮换伪造)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-19 18:40:47 +08:00
浅念 a1dc1ff7a3 feat(chat): 页面级 basePath 引导(路径模式静态面)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-19 18:28:22 +08:00
浅念 0baa9ab2ed feat(widget): 脚本地址自推导 basePath(路径模式端点前缀)
spec 2026-10-19 §4: 路径模式(/t/<slug>/static/widget.js)下从 script.src
剥尾推导 basePath,brand/avatar 三分支/WS 四处端点构造统一加前缀;
Host 模式 indexOf 命中在 0 → basePath="" 端点零变化。
test_theme_static.py 头像锚定守卫随构造更新(wsBase + basePath + …,
语义不变:绝对锚定 + 禁相对路径)。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-19 18:13:49 +08:00
浅念 3862577143 test: 路径模式全链与限流隔离钉位
Task 3:TestPathPrefixRouting 追加 5 用例——
- chat REST 全链(建会话/resume/公开历史,全程 /t/ 前缀 + 未知 Host)
- 限流隔离:同 IP 同设备双租户独立计数(打满 jiancai 30 上限 429,
  auto 消息通路仍 200——Task 2 桶键含 slug 的验收钉位)
- _PREFIX_RE.groupindex == {}(TENANT_SLUG_RE 派生捕获组漂移守护)
- WS 停用租户路径模式 1013(Host 未知,1013 只能出自路径分支)
- 双层前缀 /t/a/t/b 仅剥一层(剩余路径无路由 → 路由层 JSON 404)

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-19 17:51:46 +08:00
浅念 9b97eafa1c feat(middleware): /t/<slug>/ 路径前缀解析(与 Host 模式共存)
- TenantHostMiddleware 增路径前缀分支:raw_path 直判 slug 段(未编码
  [a-z0-9-],%61uto/大写/点号不匹配落 Host 解析);仅带尾斜杠形态剥离;
  path 定长切割(保留前缀尾斜杠为剩余路径领头斜杠),raw_path 按解码
  path 重编码重算(非长度截断),orig_path 留痕;未知 404/ws 1008、
  停用 503/ws 1013 与 Host 模式同语义
- _PREFIX_RE 字符类取自 registry.TENANT_SLUG_RE(掐 ^$ 锚)单一事实源;
  tenant_routes 的 SLUG_RE 换源同常量别名 import(删本地定义与 import re)
- 评审折入:registry 空 sites 分支注释纠正为生产可达(DB 源全站点停用
  合法状态),test_registry 用例 docstring 同步;conftest ADMIN_PASSWORD
  注释补硬编码登录用例警示
- 新增 TestPathPrefixRouting 13 用例(全链/拒绝族/停用/site 覆盖/豁免
  优先/direct-ASGI 改写钉位/WS 双例/路径优先)

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-19 17:27:01 +08:00
浅念 6fc43c1f1c fix(tests): conftest 钉 ADMIN_PASSWORD 出厂值——测试对本地 .env 封闭
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-19 16:52:36 +08:00
浅念 e08a675363 feat(registry): resolve_by_slug 路径模式解析 + TENANT_SLUG_RE 常量上提
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-19 16:36:13 +08:00
浅念 85627901d0 docs: 计划评审收口(TDD 判别用例/实测锚点/签名对齐/拼接安全四防线)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-19 16:21:36 +08:00
浅念 1c91870c76 docs: 单域名多租户实施计划(11 任务 4 批)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-19 15:55:35 +08:00
浅念 e0e49144d4 docs: spec 用户终审两处补强(空串 XFF 回退/无尾斜杠措辞)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-19 15:48:01 +08:00
浅念 5e289b9eb6 docs: spec 终审收尾(§1 末段一词/§3.1 raw_path 直判为准)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-19 15:27:37 +08:00
浅念 b4c03181ce docs: spec 评审收口(XFF 取末段纠偏/raw_path 重算/清扫范围修正)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-19 15:23:00 +08:00
浅念 5b7c828777 docs: 单域名多租户(路径前缀路由)+ 上线收口项设计 spec
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-19 15:10:13 +08:00
浅念 6d6d8a8e32 chore: Batch 4 收口——终审 Minor 处置记档 + WallAdvanced 注释修正
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-14 21:56:02 +08:00
浅念 1df1fc7922 fix(admin): 重建 watch 补 slug 源(防缺组租户切换草稿泄漏)
c6bd542 拆分后的分组 watch 只盯组 props 引用——seed 租户快照可能缺组
(如无 ai/contact/misc 组),两家租户都缺时切租户该组 prop 走
undefined→undefined 引用不变、watch 不触发,上一家租户的草稿留在当前
租户界面(dirty 也残留)。旧的全量耦合顺带防住了它,拆分后暴露。

修复:六个 pane 的重建 watch 源统一加 () => props.slug 兜底——slug 变化
即强制重建(缺组时空槽归位、dirty 归 false);单卡保存路径不受影响
(组引用照常换新触发)。覆盖 CredsPane 三卡 + WallPane / PromptsPane /
ContactFormPane / EngineFormPane / MiscFormPane(均已声明 slug prop,
index.vue 挂载处均已传 activeSlug,零接线改动)。

顺手:CredsPane 测试态注释仍提已删除的 resetAll → 改提三卡 watch;
计划文档 Task 15 段落末补 Batch 1 遗留打磨项处置注记(色列宽度/头像
提示样式经 Task 16 走查目检后定夺)。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-14 21:40:29 +08:00
浅念 c6bd54229d fix(admin): CredsPane 单卡保存不再联动重置兄弟卡
旧 array-source watch 盯 [emailGroup, pushGroup, aiGroup] 三元数组——任一
组引用变化即 resetAll 三卡齐重建:单卡保存(如 email)后父层 onPaneSaved
换整份快照引用,push/ai 卡上未保存的编辑被静默丢弃(Task 14 评审挂账)。

改为三表各自 watch 本组 props 引用:父层保存回写是 {...snapshot, [group]:
config} 展开——只有被保存组引用换新,兄弟组引用不动 → 只重建该卡;切租户/
回滚时快照先置 null 再整份换新,三组引用齐变 → 三卡全量重置(行为保持)。
resetAll 相应拆为 resetEmailCard / resetPushCard / resetAiCard(备注/错误/
测试态随所属卡重置)。

自查两场景:改 email 保存 → push 草稿与 dirty 均保留;切租户 → 三卡齐重置。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-14 21:23:18 +08:00
浅念 f92a4be139 polish(admin): 各页空态与文案轻量打磨
- 会话列表/推送日志表空态给动作指引(empty-text,不再落 Element 默认「暂无数据」)
- 统计六图空态文案经 useChart 新增 emptyText 参数下发「暂无数据——产生会话后展示分析」
  (textContent 替代 innerHTML,缺省值不变,其余消费方零影响)
- 平台设置存储总览空表指引「暂无设置项——从上方推荐键开始」
- 租户详情站点表空态指引「暂无站点——点右上角「新建站点」创建」
- CredsPane 邮件测试 hint 的字面 **已保存** 星号改 <b>(模板不吃 markdown)
- 品牌预览卡右侧副标去掉与新增副标题重复的「本地简化」字样
- 仪表盘/租户列表/会话页既有 ElEmpty 已是动作指引文案,核对后无需改动

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-14 21:21:53 +08:00
浅念 914bd49128 docs: Batch 3 完成记档
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-14 21:16:10 +08:00
浅念 26dc93bc31 fix(admin): 头像上传基线只回写持久化字段(防脏检测假阴性)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-14 21:14:23 +08:00
浅念 e2aa166701 fix(admin): 脏保护三缺陷(brand 丢弃空操作/头像假脏/取消高亮错位)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-14 21:08:57 +08:00
浅念 edf58ce0a0 feat(admin): 未保存离开保护(Batch 3 收口)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-14 20:42:18 +08:00
浅念 250ffdfa53 feat(admin): contact/engine/misc 表单 pane + JsonGroup 退役
Task 13(feature/config-ux Batch 3):contact/engine/misc 三组从通用
JSON 整组编辑退役为专用表单卡——ContactFormPane(双开关 + 模板语言)、
EngineFormPane(限流数值 + context_seed_keys 高级折叠)、MiscFormPane
(国名 → 区号行编辑),共用新 KeyValueEditor 行编辑器(直改 reactive
rows,与 ScenarioCard 同契约);JsonGroupPane.vue 删除,model.ts 通用
JSON 组区块(JsonGroupKey/jsonGroupDraft/parseJsonGroupDraft/
JSON_GROUP_FIELDS)与对应测试一并退役;rowsToRecord/recordToRows 补
JSDoc(Task 12 评审折入)。

vitest 182 passed(185 − 3 旧 JSON 组用例);vue-tsc + vite build 零错误。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-14 20:23:26 +08:00
浅念 4dd74d6682 feat(admin): contact/engine/misc 表单映射纯函数
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-14 20:03:09 +08:00
浅念 8b430565d6 feat(admin): PromptsPane 重组(company_facts 主面+引擎级折叠)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-14 19:50:03 +08:00
浅念 f4907c1e27 docs: Batch 2 完成记档
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-14 19:45:45 +08:00
浅念 12b8dab5f0 feat(admin): WallPane 重组为场景卡+高级折叠(Batch 2 收口)
- 主面换 ConfigCard 卡壳:WALL_SCENARIOS 双状态场景卡 + no_contact 三键
  白话行编辑 + cc_templates 四组封闭语言集 + 试金石面板(整块平移)
- 高级区 WallAdvanced 挂载(正则/单正则/reminders,默认折叠);旧池区/
  正则区/提醒区/旧 collapse 结构与失效辅助全部删除(grep 零残留)
- 保存链加模板变量保护:collectRemovedWallVariables 集差检出被删的
  {intl}/{shown} 等运行期占位符 → ElMessageBox 二次确认(先于试金石)
- emits 追加 navigate;index.vue WallPane 挂载处接线 @navigate
- ScenarioCard 评审折入:requiredMissing 收紧(空白行保留但两池全空的
  必留语言也预警);× 删除钮键盘可达(role/tabindex/enter/space);
  addLang 严格正则注记(异常存量语言码可显示可删不可重加)

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-14 19:34:31 +08:00
浅念 0553ccc32c feat(admin): WallAdvanced 高级折叠区(正则/提醒迁移)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-14 19:20:58 +08:00
浅念 79374a5c1d docs: Task10 补 Task8 评审折入项(空白行预警/×键盘可达/正则注记)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-14 19:16:55 +08:00
浅念 ab0cf9f64e feat(admin): WallScenarioCard 双状态场景卡组件
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-14 19:08:59 +08:00
浅念 36fe534029 fix(admin): 变量集差替代配对递归(删尾行/整键检出)+ 标签契约钉位
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-14 19:03:36 +08:00
浅念 2e6811a55b feat(admin): wall 重组辅助纯函数(场景卡/语言并集/模板变量保护)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-14 18:49:04 +08:00
浅念 d480a9f04e docs: Batch 1 完成记档
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-14 18:46:41 +08:00
浅念 680c4bade6 feat(admin): 品牌卡套视觉基线(Batch 1 收口)
- 品牌表单 ElCard → ConfigCard(图标/副标题/信息条/footer/danger 行);
  表单双列 grid(标题|主色、WhatsApp|邮箱 同排;头像/欢迎语/话题/占位/隐私 span-2);
  保存备注移 footer-right、重置出厂移 #danger(既有 resetting/onResetBrand 逻辑不动)
- 预览卡头加副标题「本地简化预览(真机效果以嵌入站点为准)」(cc-subtitle 观感)
- CredsPane 挂载处补 @navigate=onGroupSelect 接线;email 卡 info 去「带 • 的」前缀
  (push/ai 卡核实无该串);头注释同步收口
- 剪除 pane 条件链尾部 v-else 占位死分支(activeGroupLabel/ALL_NAV_ITEMS/
  .placeholder-card/.save-bar 等配套同清)
- form-grid 样式与 CredsPane 同款规则就地复用(不建共用文件)

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-14 18:34:09 +08:00
浅念 20ab561859 docs: Task6 补评审折入项(navigate 接线/•文案清理/死分支剪除)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-14 18:26:18 +08:00
浅念 06e28e4435 feat(admin): 凭据页套视觉基线+SecretField 四件套
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-14 18:15:23 +08:00
浅念 712c5f9027 feat(admin): 配置中心导航分层双模式(常用/高级/版本独立)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-14 17:31:00 +08:00
浅念 f087b96adf docs: 计划 Task3 代码块同步组件变量名修正
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-14 17:24:35 +08:00
浅念 46dfbef176 fix(admin): ConfigCard footer 守卫修正(footer-left/right 判定)+ 主题变量对齐
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-14 17:21:38 +08:00