Commit Graph

20 Commits

Author SHA1 Message Date
浅念 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
浅念 0c296ca1ba fix: Registry 审查修复(JSON定位/校验测试/竞态窗口/TenantDisabledError/路径锚定/seed_dir)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-12 18:54:30 +08:00
浅念 607baff83c feat: TenantRuntime/Registry——每租户懒建 engine(WAL/pool2)+文件加载器+站点解析
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-12 18:24:47 +08:00
浅念 f5f54383fc fix: 词表墙的四项审查修复(es 池降级/占位符白名单校验/键 allowlist/提取自检+防呆测试)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-12 18:05:55 +08:00
浅念 bc903a273e feat: 词表数据化——AST 提取脚本 + wall.json + 编译器 + boundary/conversation 数据源切换(等价回归全绿)
- scripts/extract_config.py: AST 解析两老项目源码取常量(不 import 源模块),
  生成 seed_profiles/<slug>/{wall.json, brand_values.json, prompts/};幂等可重跑
- app/engine/wall_schema.py: compile_wall(json)→CompiledWall,坏结构/坏 regex
  编译期显性失败(WallConfigError 含字段路径)
- boundary_filter/conversation: 墙词表/话术数据源切换为 DEFAULT_WALL
  (jiancai 出厂 seed),函数逻辑不动、常量名保留为 wall 视图(既有测试零修改);
  wall 数据化新增 pivots/pivots_contact/zero_number/reask_patterns 字段
- 脆锚点迁移: test_inline_prohibitions 断言对象从 conversation.py 源码改为
  wall.json 数据文件,语义等价(唯一允许的测试修改)
- 回归: 322 既有全绿 + 10 新增 wall_schema 测试 = 332;提取脚本两遍无 diff

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-12 17:31:57 +08:00
浅念 8a16a2959b test: 钉住 deep_merge 的 None 替换与列表替换语义 + 只读约定注释
- characterization:显式 None 整体替换且兄弟键保留默认(Task 9 回退契约依赖);列表整体替换不与默认拼接
- DEFAULT_CONFIG 与 TenantConfig.data/Site.brand 补只读约定注释
- platform 包依赖章程改明确:defaults/tenant_config 为叶子模块供 engine 反向消费,registry 组装层可 import app/engine

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-12 16:59:31 +08:00
浅念 89339868db feat: 出厂默认与快照深合并(E4 配置演进)
- app/platform/defaults.py:DEFAULT_CONFIG(spec §5.1 九组,brand/wall 待 Task 4 填充)+ deep_merge(补缺/不动入参/兄弟保留)
- app/platform/tenant_config.py:TenantConfig/Site frozen dataclass;site.brand 以租户级 data["brand"] 为合并基线,租户自定义可被站点继承
- tests/test_config_merge.py:merge 三性质 + 站点覆盖/继承/无 sites 共 5 用例

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-12 16:44:49 +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
浅念 0ae5952002 chore: 骨架审查修复(venv/覆盖率忽略 + pytest-asyncio 下界与 loop scope)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-12 16:15:48 +08:00
浅念 d5f6feca47 chore: 仓库骨架(gitignore/依赖/pytest/CLAUDE.md)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-12 16:10:18 +08:00
浅念 befdd48c63 docs: 统计分析页入 spec(漏斗/趋势/分布/推送健康,逐库聚合无新表)+ 计划修 3红3黄
- Task3 TenantConfig 站点化(Site dataclass,消除与 Task5 的结构矛盾)
- Task5 拆 5a(Registry 单元级)/5b(装配切换+conftest 迁移+默认租户过渡兜底)
- conftest teardown dispose_all(Windows 文件锁)
- 提取脚本改 AST 解析(不 import 源模块);REST session 收 ?site=
- resolve=resolve_site 便捷形式注明

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-12 15:52:59 +08:00
浅念 9cb6c095c9 docs: 站点模型(一租户多官网多门面)+ 6 项缺口修正落档 spec 与 Phase 1 计划
- spec:域名→站点→租户解析链、sites/site_domains 表、站点管理页、brand 接口 ?site=、
  词表补轮中提醒话术、头像按(租户,站点)解析
- 计划:Task4 加 extract_config.py 前置与 reminders 组、Task5 tenant.json 站点化、
  Task7 中间件带站点、Task9 扩为七类接线(AI凭据/行为开关/映射表/种子键)、
  Task10 站点覆盖下发+每租户头像资产+data-site+会话站点标

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-12 15:43:17 +08:00
浅念 daccc37519 docs: 计划复审收尾(anti_kill 残留清除/7个测试文件/health 断言/config 注记/static 拷贝去 admin.html)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-12 15:07:39 +08:00
浅念 c4772a9f3f docs: 计划评审修复(Task9 改为配置接线/过渡main照抄jc/词表schema补全/conftest工厂/审计步骤)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-12 15:04:37 +08:00
浅念 c82bc79bea docs: Phase 1 实施计划(引擎合并与租户化,12 任务)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-12 14:55:54 +08:00
浅念 d1c10f3281 docs: spec 定稿补丁(ATTACH 改逐库合并/gitignore/导入幂等/slug 不可变/last-write-wins/嵌入代码块/出厂语义/恢复演练/mem_limit/md sanitize/部署文档继承)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-12 14:52:19 +08:00
浅念 163bd3900a docs: spec 补 12 条工程执行项(上传挂载卷/知识库上限/备份backupAPI/迁移保状态/日志封顶/零同步IO/WS限流/WAL池/保留策略/安全四项/运维三项/告警二期)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-12 14:43:43 +08:00
浅念 026eb056ce docs: spec 评审意见落档(brand 响应携带 tenant slug、测试计数勘误、Redis 死配置显式丢弃、admin 域名占位注记)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-12 14:28:12 +08:00
浅念 e24b2109ac docs: 统一 AI 客服平台设计 spec(all-kefu)
单进程多租户架构:Host 识别租户、每租户独立 SQLite、
统一后台(art-design-pro)超管/租户两级、配置热加载+版本快照+试金石、
引擎以 jc 为主线合并上游、存量迁移保留会话 ID。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-12 14:24:08 +08:00