浅念
|
5ae32589da
|
docs: 终态基线 632+2skip
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-14 14:04:54 +08:00 |
|
浅念
|
a20d53887d
|
fix: 终审微修(admin no-cache/PII挂账/死配置清理)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-14 14:03:50 +08:00 |
|
浅念
|
dcf9d4b54c
|
chore: Phase 4 收尾——部署工件齐备,项目四阶段完成
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-14 13:45:14 +08:00 |
|
浅念
|
7cdb4fc970
|
chore: 锁屏与通知组件删除(enabled:false的最终清理)
Phase 3 终审 M-1/M-2 摘入口后组件保留待决,本提交最终删除:
- art-screen-lock/ 与 art-notification/ 组件目录
- component.ts screen-lock 全局组件项、headerBar.ts notification 项
- types/config HeaderBarFeatureConfig.notification 字段、
useHeaderBar shouldShowNotification
- art-header-bar 通知按钮/挂载/showNotice/visibleNotice/
bodyCloseNotice 与 document 点击监听、.notice-button 样式
- components.d.ts 两条目;crypto-js 依赖全套(env.d.ts 声明/
package.json/lockfile/optimizeDeps)——唯一消费方是锁屏
- en/zh 孤儿语言键(notice.* / lockScreen.* / topBar.user.lockScreen)
与 mittBus openLockScreen 事件类型(无发射/订阅方)
grep 零残留;vitest 164 passed;build 通过(主 chunk 358.45→355.84 kB,
crypto-js 出预构建);auto-imports.d.ts 行尾漂移已还原。
CLAUDE.md Phase 4 清理单 6/7 结项(并补记 8/9 随 Task 5E/5D 结项)。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-14 10:43:13 +08:00 |
|
浅念
|
b02326036f
|
refactor: 租户切换器useTenantOptions收拢三页
新建 composables/useTenantOptions.ts:会话/配置/统计三页各自的
tenants/tenantsLoading/tenantsError/loadTenants 拷贝收拢为单一
composable。两种形态:
- 默认(会话/配置页):loadTenants 成功选中首个租户 +
bootstrapTenantContext()(原两页 onMounted 公共体:超管拉列表/
租户管理员固定自己/无 slug 防御不动),选中后的 watch 仍留各页
(重置逻辑页面各异);
- selectFirst: false(统计页):纯下拉数据源,activeSlug 以
tenantFilter 别名解构('' = 全部租户合并视图),模板零改动。
dashboard 控制台是租户卡片墙(非下拉切换),不在此列。
composable 显式 import vue API——vitest 不跑 unplugin-auto-import。
新增 8 个 composable 测试(mock api/auth store,不装 pinia)。
vitest 164 passed(156+8);build 通过;dts 行尾漂移已还原。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-14 10:36:30 +08:00 |
|
浅念
|
a50ed866ed
|
perf: ECharts按需收窄
全仓 grep 确认存活消费方只有 views/stats/overview(line/bar/pie 系列
+ tooltip/grid/legend/title 组件)与 hooks/core/useChart(core 自带
的 init/setOption/resize/dispose);art-* 图表库组件(scatter/radar/
k-line 及 dataZoom/toolbox/brush/geo/visualMap/markLine/markPoint)
无任何页面挂载。
echarts.use 收窄为 Bar/Line/Pie + Title/Tooltip/Grid/Legend +
CanvasRenderer。graphic 与类型导出不动(未挂载库组件的 import 仍需
编译通过);组件文件保留,属模板库代码不在本任务删除范围。
构建对比(同机 pnpm build):
- echarts chunk: 767,864 B → 559,737 B(-208 KB / -27.1%;gzip
251 KB → 187 KB)
- dist 总体积: 3,256,483 B → 2,983,300 B(-273 KB / -8.4%)
(chunk 内残留的 candlestick/radar/scatter 字样为核心 locale 名表
与主题色表,非图表实现。)
vitest 156 passed;build 通过;components.d.ts/auto-imports.d.ts
行尾漂移已还原。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-14 10:31:54 +08:00 |
|
浅念
|
24902c3c43
|
feat: breach_rate随迁(多租户--tenant适配)
从 ai-kefu-jc/scripts/breach_rate.py 拷入并适配多租户: CLI 改为
--tenant <slug> 必填, 经 platform.db 门禁(租户须已 bootstrap 注册,
同 import_legacy/archive 纪律)后只读打开 tenants/<slug>.db; 新增
--platform-db/--tenants-dir 覆盖参数(默认 repo 根约定路径)。
其余逻辑与 jc 原版一致: PATTERNS 锚定式匹配(美元符/货币单位多语言/
价格名词前置/交期承诺/号码回显≥10位/邮箱回显), 逐 assistant 轮次
首模式命中即计, 汇总破防率(>10% 启动方案B 输出过滤)。观察漏放侧
偏差——误杀侧不在本脚本口径(人工复核)。
冒烟: 临时库验证 happy path(5 轮 3 中 60%, user 行排除/NULL 内容
守卫/中文标签)与四类门禁拒绝(未注册/库缺文件/platform.db 缺/
schema 未就位), 临时文件已清。全量 pytest 630 passed 2 skipped。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-14 10:27:41 +08:00 |
|
浅念
|
fff4f27e98
|
feat: 测试端点限流(每租户5次/15分钟)
- email/test 与 push/test 复用 LoginLimiter 滑动窗模式: (kind, tenant_slug)
键每租户 15 分钟 5 次真实出站,超限 429——guard 在端点最前(鉴权后),
被限流的租户连 400 预检也不触发;record 只落在通过全部预检真正出站
的那次(校验失败/未配置不消耗预算,两端口预算按 kind 互不挤占)
- conftest autouse 复位限流器(跨测试隔离);新增三测: 第 6 次 429+
不同租户独立+email/push 互不挤占、校验失败不耗预算
- 回归: 后端 630 passed(627+3)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-14 10:17:52 +08:00 |
|
浅念
|
d734ed6d2a
|
feat: resolver回退链接入platform_settings(三级回退/快照热刷新)
- app/platform/settings_store.py 新模块: lifespan 启动把 platform_settings
全表快照进进程内存(load_snapshot/get/refresh,workers=1 单进程纪律);
PUT /api/platform/settings 提交后 refresh 热刷新,回退链即时生效
- config_views email/ai 两组改三级回退: 租户槽位 → 平台设置快照
(键名对齐平台设置页推荐键 ai.*/smtp.*)→ env settings(env 键名
不变做最终兜底);push 无平台推荐键保持两级;smtp.port 自由 KV 容错
归一(数字串转 int,脏值视同未设置落 env)
- conftest autouse 复位快照(resolver 直调测试隔离);新增
test_platform_settings_fallback 六测(启动装载/三级链/端口容错/
push 不接线钉死/PUT 即时生效)
- 平台设置页"仅存储"注记移除(CLAUDE.md 与前端页头同步改为已接线)
- 回归: 后端 627 passed(621+6)/ 前端 vitest 156 / build 零错误
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-14 10:10:52 +08:00 |
|
浅念
|
7808f8a299
|
docs: 手册审查修正(前缀同键空间表述/WS验证预期)
- .env PUSH_EXTERNAL_KEY_PREFIX 注释纠错: 两租户前缀与各自老项目完全
相同(同键空间)——这正是切换/回滚不产生重复 UniService 线索的依据;
原稿写成'与老项目隔离'方向反了。两租户之间互异即可, 勿改。
- WS 验证预期收敛为 HTTP/1.1 101(curl 已强制 --http1.1, 不可能是 HTTP/2),
模板与手册 §3.5 同步。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-14 09:52:23 +08:00 |
|
浅念
|
96131ebdec
|
docs: 部署手册(继承jc血泪+切换runbook+备份演练)+ openresty模板
- docs/deploy-production.md: 环境前置(.env 逐项/Compose>=2.24 依据/容器自含
pip 免装) → 首次部署(build/bootstrap/up/health 分级解读/domains=3 口径) →
1Panel 反代(Host 透传/WS 单套升级头/client_max_body_size 5m/api public
放行/include 行检查) → 存量迁移(停容器或 backup API 导出, 禁运行时裸 cp;
经 data/ 卷喂 import_legacy) → 切换 runbook(隧道+hosts 全功能验证 → 逐域名
切反代 → 观察一周日检 → 老项目归档; 30 秒回滚预案) → 日常运维(backup API
备份+季度恢复演练/日志封顶+PII 现状如实记/archive 维护窗口/tag 发版纪律/
加租户零容器操作/bootstrap 幂等) → 踩坑实录 13 条(jc 五条承继+本项目八条,
含 Host 头漏传全站 404 与头像 413 两条新增预判)
- deploy/openresty-all-kefu.conf.template: upstream + 租户 server 块(WS 单套
升级头/XFF/上传体积) + admin 形态 A/B(注释切换) + 1Panel 适配注记(include
行位置/片段直写 IP/验证重载命令)
- CLAUDE.md: 文档索引落位(手册+模板已存在, 补 Phase 4 计划链接)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-14 09:44:28 +08:00 |
|
浅念
|
78755d491b
|
fix: 归档脚本微审修复(fsync/文件名防覆盖/VACUUM容错/导出删除对账)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-14 09:34:19 +08:00 |
|
浅念
|
3a3292c239
|
feat: 数据归档脚本(导出/清理/VACUUM/dry-run)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-14 09:23:42 +08:00 |
|
浅念
|
ac9a4da51d
|
feat: 存量导入脚本(保ID/session/status、pending→failed、幂等、对账报告)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-14 09:00:39 +08:00 |
|
浅念
|
6100b4eb15
|
fix: P4T1审查修复(platform.db入data卷/tzdata注释/corepack钉版/compose版本注记)
- main.py: PLATFORM_DB 挪到 <repo>/data/platform.db——data/ 是 compose
bind mount,容器/镜像重建不再丢租户注册表;lifespan 对父目录兜底
mkdir(冷机 data/ 不存在,sqlite 不建父目录)。bootstrap 脚本 --db
默认值同步锚定 data/。
- 新测试 test_platform_db_defaults_into_data_dir: 常量形状钉死(回退
仓库根即红)+ 冷机形态下 lifespan 建库于 data/ 内(全量 603)。
- Dockerfile: corepack 钉实测通过的具体版本 0.36.0(不追 latest,构建
可复现);tzdata 注释照实改写(trixie slim 实测已自带,安装留作基
镜像漂移保险)。
- docker-compose: 头注释改准确(tenants/=租户库,data/=platform.db+
uploads);env_file 注记对象式写法需 Docker Compose >= 2.24。
- 实证: compose down/up 重建容器后宿主 ./data/platform.db 仍在,
healthcheck healthy,/admin/ 200;docker compose build 复验通过。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-14 08:42:50 +08:00 |
|
浅念
|
4f38522759
|
feat: admin生产服务(/admin SPA fallback+health分级) + Docker两阶段构建 + 生产compose
- app/main.py: AdminSPA 纯 ASGI 挂载 /admin(dist 存在=StaticFiles html
+ SPA fallback(非 /admin/api 的 404 回 index.html 200);缺失=503 说明页);
ADMIN_DIST env 覆盖、请求期现势解析(构建后不重启生效/测试可注入)。
/health 分级: {status, tenants:[{slug,status,engine_ok}], domains}——
懒建未就绪 engine_ok=None 不探库;单租户库损坏只 degraded 仍 200,
不让 healthcheck 杀容器。
- host_middleware: /admin 与 /admin/ 前缀豁免租户解析(平台面;/admin-evil
仍 404,前缀精确到斜杠)。
- admin: .env.production VITE_BASE_URL=/admin/(产物资源引用与挂载同源,
单一事实源,不靠构建期 env 注入);package.json 钉 packageManager
pnpm@10.7.1(corepack 与本地同版本)。
- Dockerfile 两阶段: node:20-alpine 构建 admin/dist(corepack 按清单钉版)
→ python:3.13-slim 只带运行时(app/static/seed_profiles/scripts+dist,
含 tzdata 使 TZ 生效)。
- docker-compose: 生产编排(8018/env_file 可缺省/TZ/数据 bind mount/
mem_limit 768m/日志轮转/python urllib healthcheck/restart)。
- .dockerignore 防泄(.env 不进镜像)+ .gitattributes 钉部署文件 LF。
- tests/test_admin_serving.py: 假 dist 夹具 7 例(服务/fallback 边界/
Host 豁免/缺失降级/health 分级含坏库 degraded)。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-14 08:22:26 +08:00 |
|
浅念
|
4829baf9c1
|
docs: Phase 4 计划评审修复(health分级/VITE_BASE_URL/healthcheck无curl/dockerignore通配/resolver快照方向/老库拷贝纪律等)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-14 08:01:05 +08:00 |
|
浅念
|
e0ad95915f
|
docs: Phase 4 实施计划(admin生产服务/Docker两阶段/导入归档脚本/部署手册/清理单批次,6 任务)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-14 07:56:07 +08:00 |
|
浅念
|
ebf86439c1
|
Merge branch 'phase3-admin'
|
2026-10-14 00:13:29 +08:00 |
|
浅念
|
051c7f2735
|
docs: 终审复审 nit——清理单#9 文件名指针修正(charts.ts→plugins/echarts.ts)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-14 00:13:17 +08:00 |
|
浅念
|
6af8c186d8
|
fix: Phase3 终审修复(env入库/通用配置组面板/锁屏通知摘除/记档修正)
- I-2: admin/.env(被根 .gitignore 误伤)删除,内容并入入库的
.env.development/.env.production(公共块两份都写,PORT 仅 dev)
- I-1: 配置中心补 contact/engine/misc 三组通用 JSON 编辑面板
(JsonGroupPane:等宽 textarea 整组编辑 + JSON.parse 预检 +
PUT 整组 + 重置出厂 + 顶部字段说明;挂进 GROUP_NAV 三入口);
修组键缺失租户的禁存 bug(父层快照加载后挂载,空组可建组)
- I-3: config_routes.py docstring 改「接线归 Phase 4」;
CLAUDE.md Phase 4 清理单补 resolver 回退链与 email/push test 限流
- M-1: 锁屏摘除入口(用户菜单项删 + 全局组件 enabled:false)
- M-2: 顶栏通知铃铛隐藏(headerBar notification.enabled:false)
- M-5/M-8: admin/README 换三行指针(删模板 README.zh-CN.md);
quickLinks 删「登录」项
- M-3/M-4 不做记档入 Phase 4 清理单
- 测试基线:后端 pytest 595 / 前端 vitest 156(+3 通用 JSON 组)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-14 00:05:40 +08:00 |
|
浅念
|
65aad53e12
|
chore: Phase 3 收尾——平台设置页+全页冒烟+文档
Task 9(Phase 3 最后任务):
- 平台设置页实装(settings/platform):推荐键表单(ai.* 三键 /
smtp.* 四键,键名为前端约定——PlatformSetting 是自由 KV 表)+
存储总览表格;保存 = 逐键 PUT 只提交脏键(与 config 组整组替换
不同);密钥键哨兵交互与凭据页同款(已设置占位 / 清除 / 恢复
保持 / 端口 1-65535 校验);页头注记 resolver 回退链未接线、
现阶段仅存储。
- api/settings.ts:fetchPlatformSettings / putPlatformSetting 实装
(GET items 列表 / PUT 单键 upsert 形态钉在 docstring)。
- vitest +14(model 10 + api 4):掩码判定后端镜像、归一/脏检测/
提交值/校验/展示全覆盖;前端基线 139 → 153。
- 全页面浏览器冒烟通过(登录→强制改密→仪表盘双视角→租户管理→
会话与线索→配置中心全组→统计分析→平台设置→退出→租户管理员
视角菜单收敛)。
- CLAUDE.md:新增 Phase 3 完成状态段(基线 595/153、本地起法、
admin 能力一览、前端约定);Phase 3 清理单结项 7/11/12(掩码
哨兵 / 站点权限 / push enabled 显式化);Phase 4 清理单增补四项
(components.dts 行尾漂移 / 推送探测 env 回退真址 / 生产反代
/api/public / VITE_TENANT_PREVIEW_HOST 单域名)。README 现状
刷新至 Phase 3。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-13 23:29:31 +08:00 |
|
浅念
|
230eb2d86c
|
feat: 统计分析(卡片/漏斗/趋势/分布/推送健康,ECharts)
- admin 统计分析页(views/stats/overview): 指标卡四张(口径文案沿用
仪表盘)/ 漏斗横向条形(有序单色明度阶梯,标注 数量·占上一级%)/
按日趋势双线(窗口内无数据日期前端补零)/ 意向环形(分类三槽固定
指派,色随实体不随筛选)/ 来源·站点·国家 Top10 横向条形(名义类目
统一单色)/ 推送健康表(四状态计数 + duplicated 子集行)
- 筛选一行作用全部图表: 时间档(今天/近7天/近30天/自定义区间,自定义
不完整不发请求并提示)+ 租户切换(超管含"全部"合并选项,停用租户
标注;租户管理员固定自己)
- charts.ts 纯函数层(选项构建 + 双模式主题档),配色经
validate_palette.js 明暗双模式校验(分类/漏斗 ordinal 全过;
意向饼语义红绿组 CVD 硬伤弃用改分类槽)
- statsRange.ts 扩展自定义区间解析(既有仪表盘导出不动);
新增 charts/resolveStatsRange 单测 19 例(vitest 120→139)
- 修复 merge_stats distributions 尾随逗号 1 元组 bug(合并端点曾把
distributions 序列化成 JSON 数组,单租户路径不受累)+ 回归钉子;
后端 595 测试全过
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-13 22:33:55 +08:00 |
|
浅念
|
481243b958
|
feat: 配置中心-版本历史(列表/两版对比/回滚/组级重置出厂)
Task 7d——Phase 3 配置中心四连收尾:
- API(api/config.ts):fetchConfigVersions / fetchConfigVersionDetail /
rollbackConfig / resetConfigGroup 四函数补齐(骨架端点与类型已就位;
响应形态对照 config_routes 实测——列表无 config 本体、详情整份+掩码、
reset 响应与 PUT 分组保存同形)
- VersionsPane:版本 tab 实装(导航占位转正)——列表倒序(版本/时间/
作者/备注,当前版标记)+ 详情抽屉整份 JSON;勾两版(限两个,第三个
自动撤销最早勾选行)并排等宽 JSON 对比(spec §7.3 最低形态,范围
下拉可聚焦单组——wall 20KB+ 场景);回滚确认框明示「将产生新版本,
历史不变」→ 响应内新快照直接回写页头版本/快照/品牌表单,无需再 GET
- 组级重置出厂:六个已实装编辑卡(品牌/提示词/词表/邮件/推送/AI)头部
危险色小按钮 → reset.ts 共用确认入口(明示组名与「恢复出厂档案值」)
→ POST config/{group}/reset → 表单/密钥态/版本刷新(RESET_GROUP_
LABELS 九组镜像后端 CONFIG_GROUPS,含待实装的联系方式/引擎/杂项)
- 测试:vitest 120(+13——API 四函数调用形态 5 条 + model 辅助 8 条);
后端不动 595;冒烟 jiancai:v1-v10 列表 → v1/v10 并排对比(push 组
__SET__ 掩码可见)→ 回滚 v1 产 v11 且品牌回 v1 值 → 改占位存 v12 →
重置品牌产 v13 表单回档案值 → 回滚 v10 复原现场(v14)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-13 21:39:16 +08:00 |
|
浅念
|
bf923d9cf7
|
feat: 配置中心-凭据(邮件推送AI表单/掩码交互/SMTP测试/推送探测端点)
- 后端 POST /tenants/{slug}/email/test:resolve_email_settings 当前配置
真发测试邮件(主题 [all-kefu] SMTP 测试邮件+租户名+UTC+8 时间);
回退后 host/user 仍空 → 400;成败如实返回 {sent, error},密钥不进响应
- 后端 POST /tenants/{slug}/push/test:连通性探测——与 _do_post 同款
连接形态 POST 空 messages 批量(红线:绝不携带线索数据);不可达
reason 分类 dns/timeout/connect(Windows 裸 ConnectError 文案兜底),
auth_ok 三态(2xx 真 / 401·403 假 / 其余 null),单次无重试
- email_service 抽 _smtp_send 共用连接逻辑(_send 契约不变)+
send_test_email(成败+错误串如实返回,不走吞异常 bool)
- 前端 CredsPane:邮件/推送/AI 三组凭据表单(数值/邮箱前端预检 +
后端 400 双层);密钥哨兵交互(__SET__ 占位符/不动保存保持库值/
清除按钮显式清空可撤销);SMTP 测试与推送探测三态内联展示
- 测试:pytest 新增 18(email/test 7 + push/test 11),全量 595 通过;
vitest 新增 20(model 哨兵往返/预检边界 + API 调用形态),107 通过
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-13 20:55:40 +08:00 |
|
浅念
|
39d72c53aa
|
feat: 配置中心-提示词与词表(四件套编辑/结构化词表/试金石面板/保存前验证)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-13 20:05:42 +08:00 |
|
浅念
|
cac91e9e3e
|
feat: 配置中心-品牌(表单/本地预览/嵌入代码/头像上传)+ 站点覆盖层编辑入口
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-13 19:27:08 +08:00 |
|
浅念
|
6f22e51908
|
feat: 租户管理与站点管理(创建向导/停用/域名/门面覆盖)
- API 层实装(api/tenants.ts):创建/详情/PATCH 租户、建站/改站、
域名绑定解绑——400 撞车 detail(slug/域名归属/prefix 引导)经
showErrorMessage:false 关全局 toast、由向导与绑域名弹窗内联常驻展示
- 租户列表:slug/名称/状态/域名数/版本/管理员概要 + 状态筛选 +
行操作(详情/停用复启用/改名);停用确认框写明 503 服务暂停语义
- 创建向导(ElSteps 四步):名称+slug(^[a-z0-9-]+$ 与撞车内联拦截)
→ 域名多填 → 出厂档案(auto/jiancai 提示 prefix 全局唯一撞车引导
改 blank;blank 提示墙与提示词取建材出厂档案)→ 管理员账号;
201 后列表刷新并提示首登需改密
- 站点管理(详情抽屉):站点表/新建站(门面覆盖层表单——brand 组
子集字段留空=继承租户默认)/停用复启用(404 语义提示)/域名绑定
(撞车归属内联)与解绑(标签 × 确认)
- vitest +9(API 层 URL/方法/请求体契约);页面仅超管(菜单 roles 已挡)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-13 18:27:56 +08:00 |
|
浅念
|
ce668eaf2f
|
feat: 会话与线索(列表/筛选/租户切换/详情消息流/推送日志/删除)
- 会话列表页签:分页表格 + 筛选(意向三值/站点精确/日期区间 daterange,
筛选变化重置第一页)+ 行操作(详情抽屉/删除确认框,级联消息画像评估
推送日志,末页删空自动回退一页)
- 租户切换器:超管专用(fetchTenantList 下拉,默认第一个,切换联动双页签
并关抽屉);租户管理员固定登录态 tenant_slug,无切换器只有标签
- 详情抽屉:元数据(状态/来源/站点/IP 归国/session/设备)+ 画像 chips
(ElTag 键值)+ 评估块(意向/理由/联系方式/更正次数)+ 消息流气泡
(user 右 assistant 左,时间直显库内 naive UTC 不换算,与筛选同口径)
- 推送日志页签(列表平行):状态筛选(pending/success/failed/skipped)
+ 分页表格(类型/状态/尝试/outcome/HTTP/payload 大小/会话/错误)——
列表接口不回大 payload,仅服务端 payload_size
- api/conversations.ts 实装调用函数并按 data_routes.py 实际响应修正类型
(IntentLevel 三值/messages.time/详情扁平 evaluation+profile 块/
PushLogItem 全字段),新增枚举中文映射(intentLabel 等,未知值回退原样)
- vitest +9(conversations API 契约:URL/参数/白名单/映射),总 45;
后端不动(pytest 577 基线复核)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-13 17:31:12 +08:00 |
|
浅念
|
775c104ca9
|
docs: 硬约束新增临时文件用完即删纪律(用户要求)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-13 17:23:02 +08:00 |
|
浅念
|
f640889f22
|
feat: 仪表盘(租户卡片墙/平台总览/时间切换)+ 顺手:409契约锁与死代码
- 仪表盘视图:超管=平台总览四指标卡(/api/platform/stats 合并视图)+
租户卡片墙(逐租户 ?tenant= 下钻,含停用租户);租户管理员=自己
指标卡(/tenants/{slug}/stats,slug 取登录态);口径文案照
stats.py docstring(线索=留资三选一/成功率分母0显—等)
- 时间范围快捷切换(今天/近7天/近30天)→ from/to 本地日期串;
utils/statsRange.ts 纯函数 + epoch 防快速切换过期响应竞写
- 空数据态:无租户 ElEmpty / 单租户零数据自然显 0 与 —
- api/stats.ts 补 fetchPlatformStats/fetchTenantStats;tenants.ts 补
fetchTenantList(卡片墙枚举,其余仍留 Task 6)
- vitest +11(statsRange 6 + stats API 5,总 36)
- 顺手1:test_auth must_change 409 测试补 detail 断言,锁死前后端
契约文案(client.ts MUST_CHANGE_DETAIL)
- 顺手2:删除 beforeEach.ts 的 isUnauthorizedError 死分支与 ApiStatus
import(模板 isHttpError 判自建 ApiError 恒 false,分支不可达)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-13 16:59:12 +08:00 |
|
浅念
|
3973abea8b
|
feat: API层与认证流(client拦截/守卫/登录改密实装/域API骨架/vitest)
- 自建轻量 axios client(src/api/client.ts):Bearer 注入、401 清会话跳登录
(login 请求除外)、409 精确匹配"必须先修改初始密码"跳强制改密(区别于并发
冲突 409)、429/网络错误统一 ElMessage、ApiError 标准化、showErrorMessage
可opt-out——模板 utils/http 的 {code,msg,data} 信封与后端裸 HTTP 语义不符故弃用
- Pinia auth store(src/store/modules/auth.ts):token/role/tenant_slug/
must_change 落地并持久化(all-kefu-auth key),login/logout/changePassword/
会话过期/强制改密跳转(动态 import 断循环)
- 路由守卫:token 事实源判定、must_change 全站门(除改密页)、UserInfo 由登录
快照派生(后端无用户信息端点);user store 残留自愈
- 登录页实装(去除角色调试开关)、强制改密页实装;用户菜单/锁屏对接真实 logout
- 域 API 骨架:tenants/config/conversations/stats/settings(类型+端点常量)
- mask 哨兵助手:__SET__ ↔ 已设置 表单语义
- vitest 25 例(client 11/store 8/mask 6);登录页拖拽验证 reset 空引用修复
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-13 16:28:11 +08:00 |
|
浅念
|
6afa31ec85
|
fix: 脚手架审查修复(dts入库保首跑/esnext注释/模板changelog清理)
- auto-imports.d.ts / components.d.ts 出 .gitignore 并入库(已重新生成):新克隆/CI 首跑 pnpm build 直接可用,Phase 4 部署依赖
- vite.config.ts build.target=esnext 补注释:Windows 本机 es2015 曾触发 esbuild 0xC0000409 原生崩溃,改后稳定;管理后台仅面向现代浏览器
- 删除模板自带 CHANGELOG.md / CHANGELOG.zh-CN.md(约 650 行 x2,与本项目无关)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-13 15:03:30 +08:00 |
|
浅念
|
78ff060420
|
feat: art-design-pro 脚手架落地与品牌化(八页骨架/代理配置/权限菜单)
- 模板 art-design-pro(MIT)GitHub 直连克隆后裁剪落地 admin/:删除演示页面/示例数据/mock/未用组件,保留构建与依赖清单
- 品牌化:应用名/标题/侧栏与登录页 logo/浏览器 favicon 全部替换为 all-kefu 自有资源(static/kefu-small.png),中文界面
- 八页骨架:login / force-change-password / dashboard / tenants / conversations / config / stats / settings 占位页 + 6 组路由模块
- 权限菜单:meta.roles 前端过滤,super 全量,tenant 隐藏 租户管理/平台设置(角色值与后端一致)
- 开发代理:/api 直转 + /api/public 与 /static 携带租户 Host 改写(VITE_TENANT_PREVIEW_HOST),适配后端 TenantHostMiddleware
- 认证 API 为开发桩(角色调试开关),Task 3 对接真实登录
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-13 14:51:24 +08:00 |
|
浅念
|
0c25287c19
|
feat: 密钥掩码哨兵(__SET__)四处响应 + 站点管理权限放开租户管理员
- config_routes: push.api_key/ai.api_key/email.smtp.password 掩码助手
(MASKED="__SET__";非空才掩,空串/None 原样)。作用于 GET config、
GET versions/{n}、POST rollback 响应、GET settings(计划四处),并盖
PUT/reset/PUT settings 的写回显——哨兵还原后的库值不经任何响应外泄。
- PUT 哨兵还原: 密钥字段收到 __SET__ → 当前快照原值替换后再写版本
(前端"不改就原样传回");传新值照常覆盖;空串传回仍=清空(既有语义
不变)。settings 同款(密钥名含 key/password/secret,递归嵌套 dict;
设置 key 本身命中也算)。库行/版本历史永远存原值。
- tenant_routes: 站点/域名四端点(POST sites/PATCH sites/POST domains/
DELETE domains)require_super → _tenant_guard;租户生命周期三端点
(POST /tenants/GET 列表/PATCH /tenants/{slug})保持超管专属。
- 测试: 掩码四处响应+落库分离断言(_current_snapshot 直查库)、哨兵
往返/新值/清空/嵌套路径/未设还原 None、settings 标量+嵌套+非密钥
字面量;租户管理员四端点自助(201/200)+他租户 403+生命周期仍 403。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-13 13:39:23 +08:00 |
|
浅念
|
0741069f49
|
docs: Phase 3 计划评审修复(掩码盖四处响应/权限端点计数与不动清单/推送探测端点/Task7拆四/增量瘦身/嵌入代码data-site/两版对比)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-13 13:26:38 +08:00 |
|
浅念
|
584bb24091
|
docs: Phase 3 实施计划(admin SPA 九任务,含掩码哨兵与站点权限两项前置决策)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-13 13:23:06 +08:00 |
|
浅念
|
6839cb94d2
|
fix: 终审修复——站点停用接线/prefix查重补创建reset/默认凭据警示+取舍补录
- I-1 站点停用全链接线: Site 数据类加 status 字段; DB 源 _load_one 与
文件源 read_tenant 均只输出 active 站点(停用站点域名不进 registry
索引 → 该域名 404;全停用=合法运营状态输出空 sites;文件源无 status
键默认 active 兼容)。E2E: PATCH 站点 disabled → 其域名 404、复启用
恢复;源级直测两源过滤。
- I-3 prefix 跨租户查重补两口: db.other_push_prefixes 共用助手
(MAX(version) 逐租户当前前缀,排除自身);创建向导(出厂档案前缀被占
→ 400 提示改 blank/改占用方)与 reset push(重置回出厂撞车 → 400 提示
走 PUT)接入;PUT 原有查重改用同一助手。rollback 维持豁免(历史不可变
语义优先,取舍清单记档)。既有测试第二租户改 blank profile 避撞。
- I-4 默认凭据警示: lifespan 启动检测 ADMIN_PASSWORD 仍为 Settings 字段
默认值(非硬编码第二份,防双源漂移)→ logger.warning 醒目提示;
CLAUDE.md Phase 4 部署记档补 ADMIN_PASSWORD 生产要求。
- I-2/M-2 取舍补录: 密钥掩码未实现(GET config/settings 明文返回
api_key/smtp 密码,Phase 3 前须定 __SET__ 哨兵方案);站点管理权限现为
仅超管(Phase 3 对接时决策放开或改 spec);取舍清单第 2 条同步刷新
(rollback 现为唯一豁免口)。
全量回归: 571 passed(基线 566 + 新增 5)。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-13 12:40:21 +08:00 |
|
浅念
|
6cd343e24a
|
chore: Phase 2 收尾——平台层完成(审计+安全自查+文档+清理单)
- 全量回归 566 passed(根目录与 tests/ 双跑一致),基线数字刷新(459→566)
- 零同步 IO 审计复查:app/ 无 requests/urllib/time.sleep/open,scrypt CPU 注记在案
- 安全自查全过:platform 层零 logger(凭据不进日志)、gitignore 覆盖实证
(tenants/*.db* / platform.db* / data/)、登录限流在 /api/platform 豁免
路径仍生效(豁免只跳过租户解析,测试钉位在)、上传目录不可执行
(魔数+uuid 重命名,avatar 下发防路径穿透,content-type 按扩展名映射)
- CLAUDE.md:新增 Phase 2 完成状态(基线/审计/安全/平台层能力一览/
admin API 速览)、Phase 2 沉淀取舍 10 项 + Phase 3 清理单(旧 12 项中
#1#2#3 Task 10、#10 Task 7 已完成划除)、Phase 4 部署记档、
Phase 3 计划编写注意(conftest 三坑 + db_source_app/super_client 夹具 +
config_views 单入口 + stats 口径表)
- README:现状刷新至 Phase 2 收尾时点
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-13 12:21:10 +08:00 |
|
浅念
|
7d16ae6318
|
feat: 生产装配切换DbTenantSource + bootstrap脚本(超管/两租户幂等导入)
- app/main.py: lifespan registry 装配按 env TENANT_SOURCE 切换(db|file,
默认 db)——db 走 TenantRegistry(DbTenantSource(platform_engine)) +
schema 就绪后 async load_all;file 回退旧 load_from_dir。空 platform.db
冷启动不炸:显式预检 tenants 表(非捕 ValueError——坏数据同样抛
ValueError,一揽子吞会把数据损坏静默成空平台),空表保持空注册表
(域名全 404 直到 bootstrap 导入),清扫循环对空 runtimes() 安全。
非法值在创建任何 engine 前显性炸。conftest 预置缝优先于 env 装配,
既有 558 测试零改动全绿。
- scripts/bootstrap_platform.py: init(schema+超管,env/.env 凭据,空表
才建)+ 出厂档案幂等导入(已存在 slug 跳过;FileTenantSource.read_tenant
同构快照 → Tenant+sites+domains+版本1,版本走 write_config_version 单一
路径;域名 _normalize_host 归一)。不建租户管理员——导入是存量迁移
形态,租户管理员按需走后台创建向导补。CLI 照 extract_config.py 的
argparse 风格(--db/--profiles/--seed)。
- tests/test_bootstrap_script.py: 幂等两遍零变化(行数/版本数逐项断言)、
超管 env 凭据、未知档案显性炸、bootstrap→DbTenantSource→registry 两租户
resolve 冒烟(jc 蓝/17 条/ai-kefu-jc,auto 橙/13 条/ai-kefu,es 覆盖层)、
TENANT_SOURCE 三态装配(db 空/库冷启动、file 回退、非法值炸)。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-13 12:05:42 +08:00 |
|
浅念
|
71e11c317f
|
refactor: config_views 单入口 + 0语义统一 + FakeAI 收敛(清理单#1#2#3)
- #3 六个消费视图 resolver 收拢 app/platform/config_views(单一定义点):
resolve_email/push/ai_settings ← 各服务文件, resolve_contact_flags/
context_seed_map ← conversation, name_to_region_extras ← manager
__init__ 内联取值(or None 语义原样)——函数体逐字搬入,服务层 import 之,
旧定义删;Phase 3 编辑器/试金石与该模块对接
- #2 限流 0 语义统一: conn_limiter.try_acquire 的 limit 与 chat_rest 的
rate_limit_per_hour 取值同款——0 或负 = 回退出厂默认(与姊妹键一致),
原 conn_limiter 0=全拒改为回退;chat_rest 取值抽 _resolve_rate_limit
纯函数供锚定
- #1 FakeAI 收敛进 conftest(超集: extract/evaluate/eval_calls),四份拷贝
删(test_lead_email_trigger/test_cc_integration/test_channel_hygiene/
test_lead_push_wiring——计划记三份,grep 实有四份;push_wiring 经
evaluate 参数注入原本地固定返回值,断言零改动)
全量 558 passed(554 + 新增 4: 单入口/内联等价/两处 0 语义)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-13 11:45:42 +08:00 |
|
浅念
|
acf5777ff2
|
feat: 统计API(卡片/漏斗/趋势/分布/推送健康,逐库聚合禁ATTACH)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-13 11:24:30 +08:00 |
|
浅念
|
ec55bc38ab
|
feat: 数据视图API(会话/详情/推送日志/删除,租户scope强制)
查询语义自 jc admin.py 移植,路由多租户化(/api/platform/tenants/{slug}/...):
- runtime 按 slug 取: registry.runtimes() 匹配 + ensure_ready(resolve 需域名,
平台后台只有 slug);未懒建租户首次查询触发建库不炸
- 会话列表: ≥1 消息的会话、created_at 倒序、intent/site(client_info.site)/
日期区间 from-to(边界含,to 日期-only 含全天)筛选,分页 page/page_size≤100,
每行含意向/联系方式/email_sent/IP 归国(ip_service 复用);total 对筛选后
集合计数(修 jc 旧缺陷: 其会话列表 total 不随 intent 变)
- 详情: 元数据+client_info+画像 chips(raw_info 去 _ 前缀键)+消息全量+意向块
- 删除: jc 原序逐表显式删,补齐 lead_push_logs(兑现 FK 声明的 CASCADE,
免孤儿行);不存在 404
- push-logs: load_only 排除 request_payload 大列,payload_size(func.length
服务端算)作省略标记;status/conversation_id 筛选
- 鉴权 _tenant_guard(slug): 他租户 403/未认证 401 有测试钉住;非法筛选值
显性 400(jc 静默忽略)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-13 11:00:39 +08:00 |
|
浅念
|
a43c654337
|
feat: 头像上传(uuid重命名/魔数校验/2MB/配置版本管线)与三级解析链
- POST /api/platform/tenants/{slug}/brand/avatar(require_tenant):
multipart 收文件,魔数判定类型(\x89PNG/\xff\xd8\xff/RIFF....WEBP,
优先于扩展名——改后缀骗不过,存盘扩展名取自内容)、≤2MB(413,
upload.size 预检免拷贝)、服务端 uuid4 重命名(原始文件名不参与
路径),落 data/uploads/<slug>/(目录懒建,gitignore 已忽略)
- 走 Task 6 配置版本管线(复用 config_routes 内部 helper):读当前
快照 → brand 组只替换 avatar 字段 → validate_group →
write_config_version(comment=头像上传) → registry_reload 热生效
- /api/public/avatar 三级解析链:uploads → seed 资产 → 静态兜底;
Phase 1 文件名穿越防线(拒 / \ . ..)扩到 uploads 段
- registry.uploads_root:自 data_dir.parent 派生(生产=<repo>/data/
uploads;测试注入 tmp data_dir 时自动落 tmp 内,隔离免污染)
- 新依赖 python-multipart(multipart 表单解析)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-13 10:35:41 +08:00 |
|
浅念
|
7502176190
|
feat: 配置API(分组校验管线/整份版本/回滚/重置出厂/试金石/平台设置)
- config_validation.validate_group: 九组校验管线(类型/键 allowlist/数值
范围/prompts 大小上限 50KB·100KB/wall 全量交 compile_wall/push.prefix
跨租户查重 spec E1),错误清单中文带字段路径
- config_routes: GET/PUT config(整组替换原样入版本,MAX+1,热 reload)/
reset(按 Tenant.profile 取出厂档案组)/versions 列表·详情/rollback
(旧版复制为新版本,历史不可变)/wall/test 试金石(逐句判定,不落库
不 bump)/settings 平台设置 CRUD(仅超管,resolver 接线归 Phase 3)
- db.write_config_version: 版本写入公共路径(创建向导与配置 API 单一
事实源);Tenant 落 profile 列(重置出厂按它取对应档案)
- _profile_snapshot/_blankify 迁 tenant_source(两路由模块共用);
db_source_app/super_client 夹具收拢 conftest(两测试文件共用)
- 测试: 519 → 537 全绿
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-13 10:07:40 +08:00 |
|
浅念
|
ec2e17d5e3
|
feat: 租户管理API(创建向导消费出厂档案/blank保留jc墙/域名/停用/slug不可变)
POST /api/platform/tenants: profile ∈ {auto,jiancai,blank}——首版快照复用
FileTenantSource(seed).read_tenant(profile).snapshot(Task 4 审查指定);
blank=jiancai 档案 _blankify 去身份组但保留 wall/prompts(compile_wall/
PromptProvider 的硬要求)。建 Tenant+main 站点+版本1+租户管理员
(must_change_password=True),创建后 registry_reload(upsert)立即可用。
站点 CRUD(brand_overlay 整字典赋值,M-2a)/域名绑定解绑(全局唯一,
撞车 400 带现有归属)/PATCH 租户(name/status;slug 不可变 400;停用走
reload 路径 dispose 引擎)。列表/详情管理员概要显式挑字段,凭据永不外泄。
鉴权: 写操作+列表 require_super;GET 详情放宽 require_tenant(slug)。
测试: db_source_app 夹具(registry 用 DbTenantSource 生产形态指向临时
platform.db,跨循环纪律: 直查走独立 NullPool 连接),16 项全绿,全量 519。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-13 09:20:28 +08:00 |
|
浅念
|
1bd341c21a
|
fix: 数据源审查小修(from_config 类型守卫/PROMPTS_KEYS 消重/契约措辞)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-13 09:05:09 +08:00 |
|
浅念
|
c7fd533320
|
feat: TenantSource 抽象——File源(测试/档案)与DB源(生产),registry 数据源可切换+reload upsert
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-13 08:50:16 +08:00 |
|
浅念
|
386b5eb90a
|
feat: /api/platform 豁免租户解析(认证守护)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-13 08:32:55 +08:00 |
|
浅念
|
c5e8dd6ded
|
fix: 认证审查修复(角色依赖连锁409门/停用租户token取舍注记/公共面整理)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-13 08:29:01 +08:00 |
|