浅念
|
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 |
|
浅念
|
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 |
|
浅念
|
c7fd533320
|
feat: TenantSource 抽象——File源(测试/档案)与DB源(生产),registry 数据源可切换+reload upsert
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-13 08:50:16 +08:00 |
|
浅念
|
3d6064dc14
|
docs: 上游吸收审查修补(注释纠偏/上游标点恢复/交叉引用闭合)
- test_lead_push_cc: 两处"双钉"注释与模块头改为如实的跨文件互补分工
(常量同源钉本文件,字节级措辞钉 test_lead_push_service.py /
test_email_rendering.py)
- chat_rest: _server_ip/_merge_client_info docstring 与调用点注释恢复
上游半角标点原文(逐字同步,便于将来 diff 式跟上游)
- chat.py WS 自报注释补 REST 侧交叉引用,闭合悬空不对称说明
全量回归 459 passed(不变)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-12 23:44:02 +08:00 |
|
浅念
|
d1aed8e722
|
feat: 吸收上游 7 个测试文件断言与 placeholder 配置化对齐
上游 ai-kefu → phase1 吸收(Task 11 unit 12):
- 拷入 7 个测试文件,import/夹具按目标库重锚(app.engine.* / conftest
async_db+build_jiancai_runtime / seed_profiles 提示词锚点)
- 补实现(同步自上游): chat_rest 服务端可信 IP(_server_ip/
_merge_client_info,直连场景自报假 IP 不再原样落库);widget.js 与
chat.js 的 data-placeholder 读取(叠加 Task 10 管道:data-* > brand >
中性兜底,tests/test_placeholder_static.py 守卫)
- 断言重锚以 jc 主线为准: ev.contact_info 存裸号+等待尾注(e164 走
_cc 派生)、source 值 fallback/customer_stated 口径、推送标注键
号码补全说明、prompt 静态锚按租户(seed_profiles)双测
- 全量回归 459 passed(基线 421 + 吸收 38)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-12 23:19:02 +08:00 |
|
浅念
|
7697673a3b
|
fix: 品牌下发审查修复(esc统一/语料中性化/穿越加固/反向断言动态化)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-12 22:52:08 +08:00 |
|
浅念
|
bbc7bc520e
|
feat: brand 白名单下发(站点覆盖/租户头像/CORS) + widget/chat 客户端 key 租户化 + 会话站点标
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-12 22:26:15 +08:00 |
|
浅念
|
49e2b476f5
|
fix: 配置接线审查修复(push数值哨兵化/恒真测试修正/哨兵防漂移/种子映射消双路径)
Important-1: push 数值字段(timeout/max_attempts/retry_backoff_base)
出厂默认改 None 哨兵(与 ai.model 同款),resolve_push_settings 对 None
回退 env——根治 truthy 出厂默认永久遮住 env 覆盖;恒真测试修正(env 数值
patch 成 7.5/5/2.0 与出厂区分)+租户显式数值优先断言;ai.provider 遮
env 的边界记入 docstring。Minor-2: 出厂 model 哨兵与 DEFAULT_CONFIG
一致性测试 + defaults.py 双源注释(model/rate_limit_per_hour)。
Minor-4: allowed_seed_keys → context_seed_map(返回映射,单一取值路径)。
Minor-6/7/3/8: WS 配置冻结时机注释/name_to_region 查表序注释改准确/
chat_rest limit 0 语义注释/resolver None 路径仅供测试注释。404 全绿。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-12 21:57:57 +08:00 |
|
浅念
|
32b582aac8
|
feat: 服务层配置接线——email/push/rate_limit/AI凭据/行为开关/映射表/种子键
Task 9: 服务层对全局 settings 的业务引用清零,每个 DEFAULT_CONFIG 组
都有真实消费方。resolve_*_settings(email/push/ai)以空槽回退 env
(平台默认层);contact 行为开关/种子白名单/国名扩表/限流上限经
manager 的 runtime.config 接线。收口: lead_push session_factory 必填、
config.py 死代码清理、PromptProvider frozen、no_contact 视图直取、
AIService wall 参数定型 CompiledWall。403 测试全绿(389+14)。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-12 21:37:48 +08:00 |
|
浅念
|
8453d3cc56
|
test: conn_limiter 差异覆盖与导入清理
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-12 21:05:54 +08:00 |
|
浅念
|
54a65ed7da
|
feat: WS 每 IP 并发连接上限(默认10,(租户,IP) 键,finally 释放)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-12 20:54:28 +08:00 |
|
浅念
|
eaa5bf7e51
|
feat: Host 中间件租户路由(纯ASGI覆盖WS/未知404/停用503暂停页/health豁免)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-12 20:30:30 +08:00 |
|
浅念
|
20dddc151e
|
fix: 装配切换审查修复(启动异常路径韧性/清扫隔离/文案与夹具卫生)
- main.lifespan: 预热+清扫挪进 try,finally dispose_all 覆盖启动半途
失败(幂等于更少引擎,堵 engine 泄漏);清扫循环体 per-tenant
try/except + logger.exception 后继续——一个租户坏库不炸平台启动,
resolve/load_from_dir 保持 fail-fast
- routes/runtime.py: RuntimeError 文案补 registry_reload dispose 旧
runtime 成因;TenantRuntime 注解挪 TYPE_CHECKING(engine 包运行期
零 import platform)
- conftest client: teardown 置空 app.state.registry(关残留窗);
rmtree 先正常删,失败 warnings.warn 留痕后再 ignore_errors 兜底
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-12 19:37:51 +08:00 |
|
浅念
|
d041077bb6
|
feat: 装配切换——main/服务构造线/conftest 迁至 Registry(含默认租户过渡兜底)
- main.py: 删全局 engine/async_session;lifespan 装配 TenantRegistry
(seed_profiles → 仓库根 tenants/,路径锚定),预热默认租户 jiancai 挂
app.state.default_runtime,逐 active 租户(库文件已存在)跑
sweep_stale_pending,退出 dispose_all。app.state.registry 预置即沿用
(测试注入缝)
- routes/runtime.py(过渡,Task 7 删): get_runtime——state.tenant 优先,
缺省落 default_runtime;chat.py/chat_rest.py 全部改走它,消除
main↔routes 循环依赖
- ConversationManager 构造线: 新增 runtime 可选参(持 session_factory/
compiled_wall/config 引用;prompts 仍模块级,Task 6;业务接线 Task 9),
fire_pending_pushes 随任务传 session_factory(后台写回派发租户的库)
- lead_push_service: 去 app.main import;写库入口显式收 session_factory,
模块级 async_session=None 仅作测试注入兜底
- conftest: client 夹具 = 每测试独立 Registry(tmp data_dir)+ 真实
lifespan 在 TestClient 循环内预热;删 _dispose_main_engine;
async_db 保持 NullPool(跨 asyncio.run 循环安全,刻意不换 Registry 引擎)
- 测试仅动夹具/桩签名(断言零改动): wiring 桩补 session_factory 形参;
history-404 用例改经真实 WS 路由造 widget 会话(引擎常驻连接绑定
TestClient 循环,测试线程不得直开 session_factory)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-12 19:15:46 +08:00 |
|
浅念
|
603c03eb4a
|
feat: jc 引擎主线搬入 app/engine(315 测试基线全绿:320 去掉 admin 5 用例)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-12 16:25:32 +08:00 |
|