更新日志

reglow-library 后端基础库版本更新记录

当前发布版本:v0.14.3(reglow Python;Node.js / Java / Rust 为 0.14.2)。

0.14.3 (2026-10-26)

修复版 0.14.3(Python):类内 list 方法遮蔽内置类型,导致三个模块加载失败。

Fixed

  • 注解求值错误:open_api / tenant / principal_member 的 Service/Repository 在类中定义了 list() 方法,其后方法注解里的 list[int] 在类体作用域内被解析成该方法对象,Python 3.12 导入时抛 TypeError: 'function' object is not subscriptable,reglow.modules.{open_api,tenant,principal_member}.router 均加载失败
  • 统一修复方式:上述模块以及其他定义了 list() 的模块(principal、studio.tools.registry)统一补 from __future__ import annotations,注解延迟求值;同时覆盖从 0.9.0 升级到 0.14.2 后暴露的同类隐患
  • 生成模板:reglow-agent 的 service.py.j2 / repository.py.j2 同步加上该导入,重新生成的业务模块不再复现
  • 版本常量:APP_VERSION 同步为 0.14.3

0.14.2 (2026-10-25)

修复版 0.14.2(四语言同步):多租户存量库补列,并补齐审计链跨语言互校与支付测试覆盖。

Fixed

  • 存量库缺列:启动自愈 / 迁移阶段幂等补 sys_tenant.principal_id 列与索引(Python reglow/scripts/migrate_tenant_principal.py、Node.js reglow/scripts/schema.ts P0 补列计划、Rust 迁移 m20261024_000009_tenant_principal_id);此前该列只在建表脚本中,早于该列创建的库读取租户列表会报 no such column
  • Rust:支付用例对 unionpay 的断言改为「不支持的支付服务商」(银联尚未接入 Rust 版),与实现一致

Changed

  • Java 审计链:AuditChain 抽出静态 verifyRows(CryptoProvider, List<SecurityAuditLog>),verify() 改为复用,跨语言互校可直接复用生产校验逻辑

Tests

  • Java 跨语言互校:新增 AuditChainCrossVerifyTest(sqlite-jdbc),正向校验 Python 写入的 fixture、反向追加后由 Python / Node / Rust 校验通过,四语言互校闭环
  • 支付覆盖:Node.js 补齐微信退款 / 关单 / 分账 / 渠道注册表用例(790 用例全绿);Java 新增 PaymentEventsTest / PaymentProviderRefundSplitTest 等支付用例,覆盖率基线按实测上调

0.14.1 (2026-10-24)

修复版 0.14.1(四语言同步):版本常量滞后、Python 包形态冲突与 Node.js 依赖安全问题。

Fixed

  • 版本常量:APP_VERSION / OpenAPI 文档版本默认值此前仍为 0.13.0,现同步为 0.14.1
  • Python 包形态:补 reglow/__init__.py,将 reglow 显式声明为常规包,避免与 site-packages 中同名旧版本合并为 PEP 420 命名空间包(MultiplexedPath),修复 importlib.resources.files("reglow") 定位静态资源失败
  • Node.js:Fastify 生态升级至 5.x(消除 @fastify/static 路径穿越等漏洞,npm audit 0 告警);运行时要求 Node.js >= 26

0.14.0 (2026-10-24)

四语言同步发布 0.14.0:7 个 Python 先行模块全部转为 L2 同构(ai_usage / principal / principal_member / tenant / billing / open_api / workflow),Python 已无 L3 独有模块;智能客服转人工排队与坐席并发容量四语言对齐;多租户部署模式 DEPLOY_MODE 落地。

Added

  • ai_usage 转为 L2:表 sys_ai_usage / sys_ai_model_price / sys_ai_price_sync_log;六种计价模式(per_token / per_image / per_second / per_request / per_megapixel / per_video_token)、北京时间工作日峰谷档位、append-only 价格快照、记账 upsert、报表聚合、价格 CRUD、XLSX/CSV 导入导出、官方价格同步适配器与媒体任务对账退避
  • principal / principal_member 转为 L2:主体(个人 / 企业 / 个体户)+ 认证状态机(unverified → pending → approved/rejected,可重提 / 吊销)、自动编码、许可证 JSON、审核留痕;成员双轨关联(user_id / employee_id 二选一)、owner/admin/staff、owner 每主体唯一、邀请态 pending → active
  • tenant 转为 L2:租户 CRUD / 详情 / 成员 / 批量删除;新增 DEPLOY_MODE(single_tenant / saas_multi_tenant)双轨,JWT claim → X-Tenant-Id 优先级解析、fail-closed、startupGuard(只信数据不信声明)
  • billing 转为 L2:表 sys_billing_plan / sys_billing_account / sys_billing_usage;套餐 / 账户 / 计量;开关 BILLING_ENABLED 且需 DEPLOY_MODE=saas_multi_tenant,关闭时除 GET /plans 外统一 403;收款复用 payment
  • open_api 转为 L2:表 sys_open_api_app / sys_open_api_log;应用密钥、HMAC-SHA256 签名 v1(key = sha256(secret)、±5 分钟时间窗、nonce 防重放)、配额与调用审计
  • workflow 转为 L2:表 sys_workflow_def / sys_workflow_instance / sys_workflow_task;JSON DSL(start / approve / end 节点)、条件求值(无 eval)、串行单分支推进、任务审批
  • 智能客服转人工排队:坐席并发容量 max_sessions(默认 5)、FIFO 派单 dispatch_queue、queue_position / waiting_total / online_agents;新增 GET /cs/queue-status;无在线坐席时不排队直接提示「当前人工坐席忙,请稍后重试」
  • 客服 SDK 模板同步:sdk_template.html 支持排队位次提示、10s 轮询与 queue_update 推送、SSE transfer_required 携带 status / queue_position

Changed

  • 契约升级:contract/modules.json v7(共同模块集 27 → 34,Python 已无 L3 独有模块)、contract/permissions.json v13(四语言各 172 个控制器强制点)、contract/tenant.json v3
  • 数据库:db/schema.sql 补齐 13 张新表;新增 migrate_cs_agent_max_sessions.py(坐席容量列迁移)

0.13.0 (2026-10-24)

四语言同步发布 0.13.0:支付退款/分账/关单闭环 + Provider 注册表与能力声明 + 支付事件总线;照片管理默认相册重复记录自愈。

Added

  • 支付退款闭环:Provider 新增 refund()(微信 V3 / 支付宝 / 银联 / mock);新增 payment_refund 表、create_refund / retry_refund / list_refunds / auto_refund_payment / reconcile_abnormal_payments,支付单状态新增 refunding / refunded
  • 支付分账:Provider 新增 split() / query_split() / return_split() / finish_split() / bind_split_receiver() 与 SplitReceiver / SplitResult;新增 payment_split / payment_split_receiver / payment_split_return 表
  • Provider 注册表与能力声明:register_payment_provider() / list_payment_providers() / get_provider_capabilities();基类新增 capabilities(),业务扩展新渠道无需改基础库
  • 通用回调与能力接口:POST /payment/notify/{provider}、GET /payment/providers、GET /payment/capabilities
  • 支付事件总线:payment.succeeded / refund.succeeded / refund.failed / split.* 等事件,业务注册处理器即可扩展
  • 关单与退款查询:close_order()、query_refund()
  • AI 用量价格列表关键字搜索:GET /analytics/ai-usage/pricing 新增 keyword

Fixed

  • 照片管理接口 500:_ensure_default_album 遇到历史重复默认相册不再抛 MultipleResultsFound,保留最早一条、迁移照片后删除重复记录

0.12.1 (2026-10-23)

支付修复版 0.12.1(四语言同步)。

Fixed

  • 支付宝 RSA2 请求签名:待签名串此前剔除了 sign_type,与网关校验串不一致,表现为 invalid-signature、收银台无法打开;现改为只剔除 sign

Added

  • 支付宝 native 平台:create_trade_by_platform(platform="native") 走当面付 alipay.trade.precreate,未开通当面付时自动回退电脑网站支付
  • 支付宝小程序 JSAPI 前置:新增 AlipayProvider.get_user_id_by_code() 与 GET /api/v1/payment/alipay/buyer-id?code=
  • Mock Provider 支持 native

0.12.0 (2026-10-22)

Python 发布 0.12.0:入驻主体 / 成员、租户主体挂靠、仪表盘概览与照片访问量、技能种子并发安全、契约 v9。

Added

  • 入驻主体 principal(L3,Python 先行):sys_principal —— 主体类型 + 认证字段 + 审核留痕;认证状态机 unverified → pending → approved / rejected
  • 主体成员 principal_member:sys_principal_member —— user_id / employee_id 双轨 + 关系唯一约束 + owner/admin/staff + pending/active/disabled
  • 租户扩展:sys_tenant 新增 principal_id;租户列表支持按主体筛选;新增 GET /tenants/{id}/members
  • 仪表盘概览:新增 GET /dashboard/overview —— 基础统计 + 内容访问 Top10 + 客服待接入 + 工坊待审批
  • 照片访问量:cms_photo 新增 view_count,新增幂等补列脚本
  • 契约 v9:登记租户 / 主体 / 成员 14 个权限码;analytics 转为四语言 L2 同构

Changed

  • 技能种子并发安全:skill._ensure_seed 改为「按名称补齐缺失内置技能 + 事件循环级锁」

0.11.0 (2026-10-13)

Python 发布 0.11.0:智能工坊(技能库 + 角色 + 工作流 + 一句话自动编排 + 产物资产 + MCP 服务)由业务模块迁入基座,并同步移植 Java / Node / Rust;内容封面引用系统素材;照片 / 文章 / 视频系统默认分类与默认相册。

Added

  • 智能工坊 studio(L2 四语言同构):角色 / 工作流 / 运行三大核心 + 一句话任务(compose)
    • 一句话自动编排:POST /studio/compose/plan(LLM 从角色库自动组队 → 输出带依赖的 DAG)、/compose/run、/compose/polish
    • 编排引擎:轻量 DAG 执行器,依赖满足即并发执行,遇人工审批节点暂停,支持 approve / rework / retry
    • 角色库:CRUD + toggle;内置 44 个营销角色(10 个领域),人设 v2 结构化;用户自建角色永不改动
    • 产物资产 studio_asset:只记工坊语义 + 引用系统素材(material_id 为唯一真源)
    • 长任务 studio_job:图片 / 视频生成等耗时任务的外部 task_id 轮询与断点恢复
    • 工具注册表 / MCP 入向接入:ToolSpec / ToolRegistry;studio_mcp_server / studio_mcp_tool(http / stdio / sse)
  • 技能库 skill(L2,表 studio_skill):提示词(kind=prompt)或可执行工具(kind=tool,runtime 支持 builtin / http / mcp);内置 6 条技能种子
  • 智能工坊菜单:一级菜单 + 一句话任务 / 角色库 / 技能库 / 工作流 / 运行记录 / 产物资产 / MCP 服务 7 个二级菜单
  • 内容封面引用系统素材:cms_article / cms_video 新增 cover_material_id
  • 照片管理:新增 POST /photos/(先建占位、后上传)、POST /photos/upload、POST /photos/{photo_id}/image
  • 系统默认分类 / 默认相册:未指定分类 / 相册时自动归入,幂等创建且不可删除
  • 数据埋点与分析模块 analytics(Python 先行 / L3):应用 / 事件 / 会话 / 页面四张表;公开采集 POST /api/v1/analytics/collect;管理端应用 / 概览 / 事件 / 页面;后续 P1–P4 补齐元素维表、搜索与偏好聚合、漏斗 / 留存 / 热点图、埋点规则、治理配置、多租户与 ClickHouse 存储适配

Changed

  • 照片模型移除 material_id(落实素材中心去重)
  • 垃圾素材清理引用保护调整:改为「文章封面 / 视频封面 / 工坊产物 StudioAsset」
  • 存量库补列迁移:新增 migrate_studio_p0.py(幂等 ALTER TABLE ... ADD COLUMN)

0.10.0 (2026-10-03)

四语言发布 0.10.0:行政区划种子纳入种子脚本(存量库补齐)+ SQLite db 目录自动创建(Python)。

Changed

  • 行政区划种子纳入种子脚本(存量库补齐):init_data.py 新增 seed_regions 调用,存量库重跑 seed 也能补齐;播种失败仅告警不阻断
  • SQLite db 目录自动创建:初始化引擎前确保 DB_SQLITE_PATH 所在目录存在,修复默认 ./db/reglow_admin.db 首次启动报 "unable to open database file"

0.9.0 (2026-09-30)

四语言发布 0.9.0:客服管理菜单补全(坐席工作台 / 坐席管理 / 对话记录)+ 知识库权限码统一 cs:kb:* + 智能客服接口拉平(/search、/agents/assign、POST /sessions)+ 行政区划改名行政区域。

Added

  • 客服管理菜单补全:新增 坐席工作台(cs-agent,cs:session:list)、坐席管理(cs-agents,cs:agent:list,含 新增/编辑/删除坐席 cs:agent:create/update/delete)、对话记录(cs-sessions,cs:session:list,含 查看对话记录 cs:session:view)三个二级菜单;企业知识库按钮权限统一为 cs:kb:create/update/delete/import
  • 智能客服接口拉平(对齐 Java):新增 GET /configs/{config_id}/search(cs:kb:list,配置知识库检索)、POST /agents/assign(cs:agent:update,访客分配坐席,configId 缺失返回错误码 1001)、POST /sessions(cs:session:update,创建会话)

Changed

  • 知识库权限码统一为 cs:kb:*(前端 cs:knowledge_base:* 同步调整),消除前后端权限码不一致导致的知识库管理功能不可用
  • 智能客服菜单移除重复的「查看对话记录 / 删除对话记录」按钮权限(归属对话记录页面)
  • 行政区划菜单改名「行政区域」
  • 版本号 0.8.0 → 0.9.0,同步 pyproject.toml / APP_VERSION / reglow/README.md

0.8.0 (2026-09-29)

四语言发布 0.8.0:智能客服 SDK 展示配置(二维码 / 联系方式 / 常见问题 / 主题色)+ 行政区划模块 region(补齐四语言)+ 后台创建用户接口 + init_data 幂等修复。

Added

  • 智能客服 SDK 展示配置:每个客服配置独立支持二维码(标题 / 描述 / 图片URL)、联系方式(服务热线 / 邮箱 / 在线咨询链接 / 地址)、常见问题面板(开关 + 标题)、SDK 主题色 primary_color(留空默认 #4f46e5,作用于悬浮按钮与聊天窗主题色)
    • 新增客户端公开接口 GET /api/v1/cs/sdk-config,返回二维码 / 联系方式 / 常见问题 / 主题色等公开配置(常见问题自动从关联知识库提取,优先 source_type=faq,上限 50 条)
    • sdk_template.html 全面升级:按 primary_color 渲染悬浮按钮与聊天窗主题色
  • 行政区划模块 region(新增,L3 Python 先行):六级行政区划(国家 / 省 / 市 / 区县 / 街道乡镇 / 村),内置 pcas.json 种子;提供 /api/v1/regions/meta|children|path|resolve 懒加载接口,服务启动自动幂等播种国家级数据
  • 后台创建用户:新增 POST /admin/api/v1/users(权限码 system:user:create),新增 USERNAME_EXISTS = 9205 错误码;用户新增 nationality(国籍)字段(同步至 UserResponse / UserListResponse / UserInfoResponse 与资料编辑)

Changed

  • init_data.py _sync_seed_menus 幂等修复:空库跳过(交由 create_menus 全量创建)、新增按父目录同名的兜底匹配、执行顺序调整到 _repair_renamed_permissions 之后
  • 契约登记:contract/modules.json(python 27→28 登记 region,java 23→24 登记 seed)、contract/permissions.json(登记 system:region:create/delete/list/update 与 system:user:create)
  • 版本号 0.7.0 → 0.8.0,同步 pyproject.toml / APP_VERSION / reglow/README.md(模块数 26 → 27)

0.7.0 (2026-09-24)

四语言发布 0.7.0:菜单路由统一相对路径(G6)+ db/ 参考 SQL 目录 + 种子初始化幂等重构。

Added

  • 菜单路由统一相对路径约定(G6):页面(C)菜单 path 由平铺绝对路径改为相对父目录路径 (如 /articles → articles),目录(M)菜单保留绝对前缀,完整路由 = 父path + 子path
    • 新增 _repair_menu_paths() 幂等修复(在「已初始化即跳过」之前执行,存量库升级重跑 seed 即自动重写), ABSOLUTE_MENU_PATHS = {"/dashboard"} 例外清单(工作台落地页保持绝对路径)
    • 种子菜单树同步改为相对路径
  • db/ 参考 SQL 目录:新增 db/schema.sql 与 db/README.md,供查看 / 手工初始化; DB_SQLITE_PATH 默认值改为 ./db/reglow_admin.db(统一存放于 db/ 目录,已被 gitignore)
  • tests/test_init_data.py 新增菜单路径相对化 / 修复逻辑的回归测试

Changed

  • init_data.py 菜单树路径相对化;新增 repairSysVersion() 幂等同步系统版本
  • 版本号 0.6.0 → 0.7.0,同步 pyproject.toml / APP_VERSION / reglow/README.md

0.6.0 (2026-09-23)

四语言发布 0.6.0:AI-Native 迁出为独立包 reglow-agent + Scalar API 调试台 + 等保审计链 + 权限码契约收敛(G3/G8)+ 多租户安全收敛。

Added

  • Scalar API 调试台(/scalar,仅 DEBUG):现代 UI + 内嵌 Postman 式调试台(Test Request / Bearer 持久化 / 顶部搜索 / 分类折叠), 替代 Swagger UI 的联调体验;静态资源本地自托管(reglow/static/docs/scalar.standalone.js),不依赖境外 CDN; 原 /docs、/redoc 保留;文档标题统一为 ReglowAdmin
  • DEBUG 按部署环境自动判定(与 Node / Rust / Java 一致):新增 APP_ENV(dev 默认); 开发(未设置或 dev/test)默认开 DEBUG,生产(APP_ENV=production/prod)默认关;显式 DEBUG 永远优先。 原「Settings 过不了生产安全校验才回退 DEBUG」的判定废弃(开发配置 JWT_SECRET 不再被误判为生产)
  • 仪表盘模块(reglow/modules/dashboard,G1):原 server.py 内联路由抽出为独立模块 (controller.py / service.py / router.py),路径与返回不变(/admin/api/v1/dashboard/stats,5 项指标)。 抽出后四语言在「dashboard 是模块」这一点上形态一致(java / rust 早已是模块,node 本次一并补齐)
  • 跨语言契约门禁(P4):
    • tests/test_contract.py(轻档,pytest -m contract):权限码登记归属 / 模块清单双向一致 / 归属守卫 / C1 约束 / 业务残留守卫
    • tests/test_contract_permissions.py:按语言各用一条抽取规则,断言实际权限码集合与 contract/permissions.json 登记双向相等
    • tests/test_contract_modules.py(7 例):模块目录 ↔ 契约矩阵双向一致、L2 四语言齐、L4 不得回流、counts 必须等于实测
    • 本轮据此修正 contract/modules.json 两处失真(counts 21/26/22/21/22 → 23/27/23/23/23、security.impl → 四语言)
    • 实测结论:四语言共同模块集完全相同(各 23 个),python 另有 4 个 L3 模块(billing / open_api / tenant / workflow)
  • 端到端门禁(重档,P4):pytest -m release_gate —— 生成六层 → 产物可编译 → 可导入且列齐全 → 起服务跑通
  • 契约文件(contract/,需与代码同 PR 维护):modules.json / tenant.json / audit_chain.json;产品优化执行方案.md
  • 相册业务策略扩展点(modules/photo/policy.py,P3):AlbumPolicy(有效期天数 / 空间额度 / 默认来源)+ register_album_policy() / get_album_policy() / reset_album_policy(); 库只定义协议,业务值由消费方注册;基础库不对任何业务额度与时长做假设

Changed(破坏性)

  • AI-Native 生成能力迁出基础库:schema_dsl / agent / agent_runtime / eval / gen_templates 迁移至同仓库独立发行包 reglow-agent(Python-only)
    • 基础库不再包含这 5 个模块,也不再自动挂载 /agent/*、/schema/validate 等路由
    • 应用侧需显式挂载:import reglow_agent; reglow_agent.register(app)(同时注册本包 ORM 模型,须在 create_all 之前)
    • 迁移目的:使基础包在四语言间同构——AI-Native 不再是"Python 的对齐例外",而是库的一个消费者
  • schema_dsl.expr → reglow.core.expr(留在基础库):白名单表达式求值器是生成产物的运行时依赖(生成的 service.py / schema.py 会 import 它),因此不随生成引擎迁出;生成模板与既有产物的 import 路径需同步更新
  • core/plugin.py 增加路由发现扩展点:discover_routers(roots=...) / discover_client_routers(roots=...) 支持额外模块包;抽出 mount_admin_routers / mount_client_routers 供附加包复用标签前缀约定
  • 依赖瘦身:jinja2 / pyyaml 移出基础库依赖;coverage source 改回 ["reglow"];packages.find 显式排除 reglow-agent
  • 业务残留下沉到消费方(P3):
    • core/redis_keys.py 移除视觉业务 key(vision_cache_key / compose_daily_key 等 6 个,库内零使用),key 格式不变,已迁至消费方
    • modules/photo 的另存策略不再内置业务值:新增扩展点 modules/photo/policy.py,有效期 / 空间额度 / 默认来源改由业务注册;未注册时为中性默认
    • 清除库内行业名词:相册 code 示例(hair / clothing / photo_bg)、"智能证件照" 默认来源、列注释中的发型/证件照措辞、坐席注释中的「摄影师」
  • 权限码与菜单/前端对齐(G3 / G8,跨语言契约收敛):
    • 子实体改用细粒度权限码(破坏性 · 权限收紧/放开并存):文章/视频/照片的「分类 / 合集 / 相册」端点原先与父实体共用 content:article:create 一类粗码,而 init_data.py 的菜单按钮与前端 reglow-design 用的是 content:article_category:create 等细码 —— 结果是用户被授予细码后按钮可见、点击却 403。现控制器与菜单一致: content:{article|video|photo}_category:*、content:{article|video}_collection:*、content:photo_album:*; 父码只保留内容本体端点(含 publish/upload)。实际影响很小:只有「只授了父码按钮、没授对应子实体按钮」的自定义角色会失去该操作
    • 菜单排序 / 部门排序 / 协议发布各单列一个码:PUT /menus/batch-sort → operation:menu:sort、 PUT /depts/batch-sort → system:dept:sort、POST /agreements/{id}/publish → system:agreement:publish
    • AI 模块按内容域分码:/video/generate → content:video:create、/video/task/{id} → content:video:list、 /image/generate → content:photo:create、/image/task/{id} → content:photo:list;/models 与 /chat 仍为 content:article:create
    • 菜单种子改名 + 存量库自动修复:system:material:group_update → system:material_group:update(action 必须是最后一段); init_data.py 新增幂等的 _repair_renamed_permissions()(放在「已初始化即跳过」之前),升级后重跑一次 init_data 即自动完成改名,无需人工改库
    • 素材模块端点权限归位:POST /materials/fetch-images 与 /fetch-videos 由 content:video:create 改为 system:material:list(只返回 URL 列表、不落库,属读操作);DELETE /materials/recycle-bin/permanent 维持「仅超管」,与其余三语言一致
  • 版本号 0.5.0 → 0.6.0,同步 pyproject.toml / APP_VERSION 默认值 / README.md

Security

  • 素材上传端点补齐权限强制点(G3):POST /admin/api/v1/materials/upload 原先只校验登录、不校验权限(fail-open), 而初始化菜单里早已登记「上传素材」按钮(system:material:upload)—— 该权限此前只是一枚装饰性按钮。 现加 PermissionChecker("system:material:upload"),与 java 一致(node / rust 本次同步补齐)
    • 行为变更:原先任何已登录员工都能上传素材;现在需要 system:material:upload。超管不受影响, 但既有部署中未勾选该按钮的自定义角色会失去上传能力,升级时需在角色里补勾
  • 启动自检:多租户错配拒绝启动(T3 / T5 兜底):新增 reglow/modules/tenant/guard.py 的 assert_tenant_guard(), 在 server.py 的 lifespan 启动阶段执行 —— 库中任一表存在 tenant_id 非空数据,而当前又不处于「已实现隔离的多租户模式」时拒绝启动(TenantMismatchError)
    • 单租户轨 + 共享库是最危险的误配(single_tenant 是默认值,过滤完全旁路)→ 正是本自检的首要目标;列存在但全 NULL(预留列)不拦
    • saas 轨视为已实现隔离,但因隔离依赖生成代码显式调用 apply_tenant_filter(未做会话级强制注入,T2),此轨下额外输出一条 WARN
    • 逃生阀 TENANT_GUARD=enforce(默认)/ off(仅 WARN,且留痕);只信数据、不信声明
  • 修复多租户隔离 fail-open 缺陷(modules/tenant/context.py):apply_tenant_filter 原先在 tenant_id is None 时静默不过滤 —— 多租户轨下一次 Token 解析失败即退化为「跨租户全量可见」,这是越权而非降级。现改为 fail-closed: 多租户轨且解析不到租户上下文 → 抛 ForbiddenException 拒绝;单租户轨行为不变(完全旁路)

Fixed

  • 审计链改用独立的 ts 列作为哈希输入(重要 · 生产级隐患):原实现用 created_at 重算哈希, 而 TimestampMixin.created_at 无显式类型 → MySQL 上落 DATETIME(小数秒被丢弃), 导致写入时用真实微秒算出的 hash 与读回重算(微秒已变 0)的结果不一致 → verify() 会把整条链误报为「哈希被篡改」
    • SecurityAuditLog 新增 ts 列(String(32),写入时的规范化时间戳字符串),verify 直接读回,不再由 created_at 重新格式化
    • 新增 test_audit_chain_survives_datetime_precision_loss;存量表需加列并回填(见 contract/audit_chain.json 的 gaps.A3)
  • 审计链时间戳格式确定化(P5-b 前置):AuditChain 改用固定格式 YYYY-MM-DDTHH:MM:SS.ffffff(本地墙钟、微秒为 0 也补齐 6 位、不带时区后缀),新增 TS_FORMAT / format_ts() 作为跨语言参照
    • 原先用 datetime.now().isoformat():微秒为 0 时会省略小数部分,同一实现产出两种长度,java / node / rust 无法稳定复刻 → 跨语言链会静默断裂
    • 存量数据注意(见 contract/audit_chain.json 的 gaps.A1):微秒恰为 0 的旧记录需按链序补零重算
  • 套餐词汇统一(G4):tenant.package 由 free/standard/pro 改为与 billing 的 PLAN_FREE/PLAN_MEMBER/PLAN_METERED 一致的 free/member/metered (默认值 standard → free,CreateTenantRequest / UpdateTenantRequest 的正则同步收紧为 ^(free|member|metered)$)
    • 有意不 import billing 常量:私有化单租户部署下 BILLING_ENABLED 可关闭,tenant 不应依赖 billing

Tests

  • 新增 test_apply_tenant_filter_fail_closed(多租户轨缺上下文必须拒绝)
  • 新增 test_ai_native_routes_absent_from_base_library(基础库不得含 AI-Native 路由)
  • 新增 tests/test_contract.py / test_contract_permissions.py / test_contract_modules.py(契约门禁,见上)
  • 新增契约门禁 test_no_business_leakage_in_base_library:扫描 reglow/ 内的行业名词,防止业务概念再漂回基础库
  • 新增 test_save_my_photo_neutral_policy_by_default:未注册业务策略时不过期、不填来源
  • test_photo_client.py 改为显式注册业务策略(复刻消费方行为,同时验证扩展点生效);原 USER_PHOTO_QUOTA_BYTES 断言改为注册小额度策略
  • 修复 reglow-agent 生成器测试的跨用例污染:test_agent_engine.py 导入生成产物后未清理 sys.modules,导致同类用例无法单独运行
  • AI-Native 相关 13 个测试文件随包迁至 reglow-agent/tests/;test_expr.py 保留(测 reglow.core.expr)

0.5.0 (2026-09-22)

V1.0 内核补齐 + AI-Native 生成能力落地。

Features

  • 多租户(reglow/modules/tenant):single_tenant / saas_multi_tenant 双轨,DEPLOY_MODE 切换;提供租户 CRUD 与租户上下文(get_tenant_context / apply_tenant_filter),SaaS 轨按 tenant_id 行级隔离
  • 计量计费(reglow/modules/billing):免费 / 会员 / 按量三档(PLAN_FREE / PLAN_MEMBER / PLAN_METERED),复用 payment 收款,BILLING_ENABLED 开关(私有化单租户轨可关闭)
  • 开放 API(reglow/modules/open_api):应用密钥(app_key / app_secret)+ HMAC-SHA256 签名认证 + nonce 防重放 + 每日配额限流 + 调用审计(OpenApiApp / OpenApiCallLog)
  • 轻量流程审批(reglow/modules/workflow):表单化 JSON DSL(开始 / 审批 / 结束节点 + 条件分支),审批链复用 data_scope,审批通知挂靠 message
  • 等保支撑(reglow/modules/security):审计防篡改哈希链(AuditChain)+ 三员角色模板(系统管理员 / 安全管理员 / 审计管理员)+ 国密算法抽象(CryptoProvider / Sha256Provider / SmProvider),SECURITY_CRYPTO_PROVIDER 切换
  • AI-Native 生成能力:
    • schema_dsl:业务 Schema DSL v1 —— 13 种字段类型、聚合校验(保留字段 / 保留模块)、enum 自动建字典
    • agent:生成引擎 L1(Schema → 后端六层 + Alembic 迁移 + 菜单/字典种子 + 前端页面与 api.ts)与 L2 需求对话(自然语言 → Schema DSL,支持澄清追问与迭代修正)
    • agent_runtime:Agent 运行时骨架(ToolRegistry 工具中心 / AgentAudit 全量留痕 / DefaultAgentLoop 执行循环)
    • eval:生成评测集 v1(golden 10 场景 + 自动评分 CLI,通过率 ≥80% 为门槛)
  • Skill 体系 4 套:reglow-backend / reglow-frontend / reglow-deploy / reglow-business(.agents/skills/)

Fixes

  • 修复操作日志写入失败(result 变量遮蔽)
  • 修复协议历史版本站内提醒成功路径 TypeError
  • 修复 open_api 每日配额时区偏差
  • 修复运维迁移脚本 SQL 值解析的转义引号缺陷
  • 修复 payment / customer_service 三处已确认缺陷

Changed

  • 新增统一服务端排序契约(reglow/common/sort.py):管理端分页列表支持 sort_by(最多 3 项,field 或 field:dir)与 sort_order;逐项校验非法/敏感/未知字段并跳过,用户输入永不直接拼入 ORDER BY
  • schema_dsl 字段类型集增补 float
  • 测试覆盖率门槛提升至 ≥90%(TOTAL 66% → 97%)
  • 版本号 0.4.5 → 0.5.0,同步 pyproject.toml / APP_VERSION 默认值与 README.md

0.4.5 (2026-09-14)

Features

  • 新增微信模块(reglow/modules/wechat,客户端公开接口):POST /api/v1/wechat/miniapp/openid(小程序 code 换 openid)、POST /api/v1/wechat/miniapp/qrcode(生成小程序码,返回 data:image/png;base64,...)
  • 新增 reglow/core/wechat.py 微信基础能力:jscode2session / get_miniapp_access_token / get_miniapp_qrcode。access_token 为应用级单例资源,统一在此单点缓存(按 appid 加锁 + 双检),避免各业务模块各自刷新互相顶掉;小程序 AppSecret 读取 wechat_mini_app_secret

Fixes

  • 微信 JSAPI 下单 appid 按 openid 来源选择:miniapp(小程序,openid 来自 wx.login)改用小程序 AppID 下单,新增 mpweb(微信内置浏览器/公众号网页,openid 来自网页授权)用公众号 AppID,两者未配置时互相回退;修正 0.4.3 起「一律公众号优先」导致小程序 JSAPI 报「appid 和 openid 不匹配」的问题

Changed

  • WeChatPayProvider.create_jsapi_trade 新增可选参数 appid(不传保持旧行为);create_trade_by_platform 支持平台值 mpweb

0.4.4 (2026-09-11)

Features

  • 忘记密码找回(用户端):新增 POST /api/v1/auth/reset-password 找回密码接口(手机验证码重置),配套新增 sys.forgot_password_enabled 配置开关(config 模块),员工 schema 同步扩展
  • 智能客服:新增 GET /agent/me 当前坐席信息接口(返回 id / employee_id / display_name / status),供坐席工作台进入前预校验,未绑定坐席抛 403

0.4.3 (2026-09-06)

Fixes

  • 微信 JSAPI 下单 appid 改为公众号优先:create_jsapi_trade 原优先 mini_app_id(小程序),而本库 openid 一律来自公众号网页授权(self.appid),导致下单报「appid 和 openid 不匹配」;改为 appid = self.appid or self.mini_app_id,保证下单 appid 与 openid 来源一致(公众号未配置时才回退小程序)

Features

  • /docs 文档页本地自托管:swagger-ui / redoc 静态资源内置到包内(reglow/static/docs/),不再依赖境外 CDN;未打标签的路由兜底归入分类

0.4.2 (2026-09-02)

Fixes

  • 内置智能客服 SDK(sdk_template.html)成功判断对齐:历史恢复、转人工、图片上传三处成功判断由 code=1 改为 code=0,与 0.4.0 统一响应契约(code:0 + success)完全一致,杜绝 code==1 残留导致 SDK 接口误判失败
  • README.md 版本示例同步更新

0.4.1 (2026-09-02)

Changed

  • server.py 统一响应重构:dashboard 统计、字典下拉(单个/批量)等内联接口由手写裸 dict(code:1)改为 ApiResponse.success(...),与全库统一响应契约(code:0 + success)完全一致,杜绝手写响应遗漏 success 字段
  • README.md 版本示例同步更新

0.4.0 (2026-09-02)

Changed(破坏性契约变更)

  • 统一响应格式:成功码由 code=1 改为 code=0,并新增 success 布尔字段
    • 成功响应:{"code": 0, "success": true, "msg": "操作成功", "data": ...}
    • 失败响应:{"code": <错误码非0>, "success": false, "msg": "...", "data": null}
    • 分页响应:外层同上,data: {items, total, page, size}
    • ApiResponse.success 使用 @model_serializer 注入 success(避免字段与类方法命名冲突),成功码 code==0
    • ApiResponse.fail 默认错误码由 0 改为 1(保证 code==0 恒为成功)
  • 全局异常处理:AppException / 参数校验 / 兜底异常响应统一补充 success: false 字段

⚠️ 升级注意:依赖 code==1 判断成功的前端需同步升级(配合 @reglow/design v0.2.0),否则成功响应会被判为失败。

0.3.16 (2026-08-22)

Features

  • 多端登录会话管理:基于 Redis 实现有状态会话管理,叠加在无状态 JWT 之上
    • 设备类型识别:自动从 User-Agent 解析设备类型(mobile / tablet / desktop),支持浏览器、Android、iOS、鸿蒙、微信/支付宝/抖音/百度小程序、快应用
    • 同类型设备互斥:员工每设备类型最多 1 个会话,用户每设备类型最多 3 个会话(可配置 SESSION_MAX_PER_DEVICE_TYPE),超过上限自动踢出最早会话
    • 会话校验中间件:每次 API 请求校验 JWT 的 jti 与 Redis 会话一致性,不匹配返回 401
    • Redis 不可用降级:Redis 故障或重启时自动降级为纯 JWT 验证,不影响基本登录功能
    • 新增 API(用户端 GET/POST/DELETE/PUT /api/v1/auth/sessions):会话列表、强制登出、备注编辑
    • 新增配置:SESSION_ENABLED(总开关)、SESSION_MAX_PER_DEVICE_TYPE(每设备类型上限)
  • RedisStore 扩展:新增 sorted set 操作(zadd/zcard/zrange/zrem/zrangebyscore)和 hash 操作(hset/hget/hgetall/hdel/exists/expire/keys),均带熔断降级
  • JWT 签发扩展:create_access_token / create_refresh_token 支持可选参数 jti、session_id、device_type;新增 generate_jti() / generate_session_id() 工具函数
  • 员工端登出:POST /auth/logout 实际销毁服务端会话,Token 立即失效
  • 用户端登出:新增 POST /api/v1/auth/logout,销毁服务端会话

Improvements

  • parse_user_agent 新增鸿蒙系统(HarmonyOS / OpenHarmony)识别、ArkWeb 浏览器识别、小程序环境识别(微信/支付宝/抖音/百度/快应用)
  • LoginLog 模型新增 device_type、session_id 字段,登录日志记录设备类型和会话关联

部署注意事项

  1. 数据库迁移:sys_login_log 表需新增两列:
    ALTER TABLE sys_login_log ADD COLUMN device_type VARCHAR(20) COMMENT '设备类型: mobile/tablet/desktop';
    ALTER TABLE sys_login_log ADD COLUMN session_id VARCHAR(64) COMMENT '会话ID';
    
  2. Redis 持久化建议:开启 appendonly yes 减少重启对会话的影响(未开启时 Redis 重启后已登录用户不受影响,但设备互斥功能暂时失效,下次登录自动恢复)
  3. 配置项:在 .env 中可按需覆盖 SESSION_ENABLED 和 SESSION_MAX_PER_DEVICE_TYPE(默认启用,员工 1/1/1,用户 3/3/3)
  4. 旧 Token 兼容:不含 session_id 的旧 JWT 自动降级放行,不影响现有已登录用户

0.3.15 (2026-08-18)

Features

  • photo 我的相册:新增照片重命名接口 PATCH /api/v1/photos/my/{photo_id}
    • 仅能修改自己的照片(越权返回 403)
    • 新增 UserPhotoRenameRequest Schema(name 必填,1~200 字符)

Improvements

  • payment 支付单超时自动关闭:避免财务管理出现永久「待支付」挂起流水
    • 新增 PAYMENT_EXPIRE_SECONDS(默认 30 分钟)与 cancel_expired_pending_orders 批量清扫函数(幂等,返回本次关闭的支付单供上层联动关闭关联业务订单)
    • query_order_status 查询 pending 状态时先做惰性超时闭合:超过有效期直接标记 cancelled 返回,不再查询支付渠道
    • 覆盖所有业务类型(credit_recharge / photo_hd / print_order / receipt 等)

0.3.14 (2026-08-14)

Features

  • 用户邀请注册与积分奖励:注册支持携带邀请码,注册成功后按积分规则发放奖励(新注册奖励 + 邀请人邀请奖励)
    • 新增 modules/user/invite.py:邀请码编解码(用户 ID 加盐 base36 确定性生成,无需建表)
    • UserRegisterRequest 新增 invite_code 字段;注册服务懒加载接入方 app.modules.credits 发放奖励,失败不影响注册主流程
    • 新增 GET /api/v1/auth/invite:返回当前用户邀请码与奖励积分(分享链接由前端用自身域名拼接,避免代理环境返回后端地址)
  • 用户照片空间上限:save_my_photo 增加 100MB 空间校验(仅统计用户自行上传,管理员上传 source=管理员上传 不占空间),超限返回「相册空间不足(上限 100MB)」

Fixes

  • 滑动验证令牌支持 Redis 不可用时内存降级(_slide_verify_store),消费时校验过期时间;RedisStore.set_json 返回写入结果(成功 True / 失败 False),供调用方判断降级

0.3.13 (2026-08-12)

Fixes

  • 时区统一(修复时间少 8 小时):datetime.now(timezone.utc) 写入无时区 MySQL DATETIME 列时按 UTC 墙钟存储,比北京时间少 8 小时,全部改为 datetime.now()(北京时间,与全库约定一致)
    • user:registered_at 注册时间、last_login_at 最后登录(手机/邮箱/手机号+密码登录)
    • auth / employee:员工 last_login_at
    • 软删除:user / employee / dept / role / post 的 deleted_at
    • material:过期回收、AI 素材自动回收、垃圾素材清理、还原延期逻辑的 now 与 expire_at 比较统一为北京时间,修复素材回收站删除时间显示偏移、AI 素材 2 小时自动回收延迟约 8 小时的问题
    • photo:删除照片时联动素材软删除时间统一为北京时间

0.3.12 (2026-08-12)

Features

  • 数据权限(数据隔离)引擎:新增通用数据权限能力
    • 新增 core/data_scope.py:DataScopeProvider 维度提供者协议 + 维度注册表 + resolve_data_scope 解析(超管始终返回全部数据,维度未注册默认不限制)
    • 新增 modules/role/data_scope.py:部门维度内置实现 DeptScopeProvider、行级归属过滤 apply_owner_scope、角色范围解析 resolve_role_scope
    • 支持五种数据范围:仅本人 / 本部门 / 本部门及以下(递归下级)/ 自定义部门 / 全部数据;员工多角色时取并集,任一角色为"全部数据"则整体放行
    • 内容管理(文章 / 视频 / 照片)、智能客服(会话列表 / 会话消息)、日志(操作日志 / 登录日志)接入数据权限隔离,越权查看会话消息视为不存在
  • photo 照片管理与素材中心梳理
    • Photo 模型新增 creator_id 创建人字段(管理端上传员工,作为数据权限归属)
    • 相册 / 照片列表默认排除用户私有相册 / 私有照片(新增 include_user_albums / include_user_photos 查询参数)
    • 照片上传不再自动同步一份到素材中心(素材中心去重,仅存系统 / 业务资源)
    • 客户端新增 GET /my/albums:我的相册分组列表(默认相册 + 管理员创建的独立相册,含封面缩略图与照片数)
    • 客户端 GET /my 新增 album_id 相册筛选(不传返回全部相册照片)
  • video 视频管理独立保存:新增 POST /videos/upload 视频文件上传接口
    • 仅保存文件并返回 URL,不写入素材中心(封面图仍由前端上传到素材中心)
    • 新增 VideoUploadResponse Schema
  • core/config:新增 TENCENT_MAP_SK(腾讯地图 WebService 安全密钥,开启签名校验时必填)

Fixes

  • 修复 get_current_employee 的 Authorization Header 必填导致无 Token 请求控制台报错(改为可选 Header(None))

0.3.11 (2026-08-08)

Features

  • photo 用户相册:另存到「我的相册」的照片默认 365 天有效期
    • Photo 模型新增 expire_at 列(到期时间),另存时自动写入 now + 365 天
    • GET /photos/my 不再返回已到期照片(expire_at 为空的历史照片不受影响)
    • UserPhotoResponse 新增 expire_at 字段,前端展示「到期时间 / 剩余天数」

0.3.10 (2026-08-08)

Features

  • customer_service 会话列表:支持按应用筛选与应用名称展示
    • GET /cs/sessions 新增 app_id 查询参数(按应用筛选会话)
    • SessionResponse 新增 app_name 应用名称字段,列表批量填充(list_configs_by_app_ids)
  • customer_service 排队 AI 兜底:待接待排队中(status=1 且 agent_id 为空,管理员尚未接入)的会话,消息入库同时继续由 AI 兜底回复
    • 仅"已接入坐席"(agent_id 非空)的会话消息才直接转发坐席、不调用 LLM
    • 排队中跳过智能转人工重复判断(避免重复推送 transfer_required 事件导致消息丢失)
  • customer_service 知识库:重建索引支持失败块重试
    • rebuild_index / _rebuild_vector_cache 改为不过滤向量化状态(list_all_chunks),重建时对之前失败的 chunk 一并重试
  • 启动联调支持:新增 reglow.server 一键启动入口(reglow-serve 命令)与 scripts/init_data.py 初始化脚本
    • server.py 提供 FastAPI 应用工厂,自动加载基础模块路由,开箱即用
    • init_data.py 一键初始化菜单 / 权限 / 系统配置等基础数据

0.3.9 (2026-08-08)

Features

  • customer_service SDK(sdk_template.html):客户侧对话体验增强
    • 悬浮按钮新增未读消息角标(收起对话框时累计未读数,打开清零,99+ 封顶)
    • 消息气泡上方显示昵称 + 时间(HH:MM),头像右侧布局调整
    • 会话结束后客户重新咨询:自动创建新会话并重连 WebSocket(session_id 变化时断开旧连接重连),历史不写入已结束会话
    • 流式回复中断(连接重置/后端重启)时恢复输入框并提示「网络中断,请重新发送」,避免 UI 卡死
  • customer_service 后端:会话流转与坐席队列增强
    • 新增 new_session 事件:新会话 / 重新咨询创建时向所有在线坐席推送,坐席工作台实时刷新待接入队列
    • 会话已结束(status=2)后客户重新咨询自动创建新会话
    • LLM 上下文优化:历史消息角色归一化(agent → assistant,兼容 LLM API),跳过业务系统消息(转人工/评分等),避免污染上下文
  • core/customer_service ws:Redis pub/sub 改为 get_message(timeout=1.0) 轮询读取
    • 避免 socket_timeout 导致订阅频繁重启而丢失 publish 消息

Fixes

  • 修复智能客服通信问题
  • 修复打包遗漏 sdk_template.html(pyproject.toml 新增 package-data 配置),此前安装包中缺失该文件导致 SDK 接口无法返回模板

0.3.8 (2026-08-08)

Features

  • employee:新增 is_agent 字段(是否开启坐席)
    • 创建/更新员工开启坐席时自动生成坐席记录(无则创建、已关闭则恢复启用)
    • 关闭坐席时坐席记录置 enabled=0(不删除),删除员工时坐席记录一并物理删除
    • CreateEmployeeRequest / UpdateEmployeeRequest / EmployeeResponse / EmployeeListResponse 均新增 is_agent
  • customer_service:坐席模型与接口增强
    • 坐席接入标识 photographer_key → agent_key(页面 ?agent-key= 路由,如 2)
    • 坐席新增 enabled 字段(启用/关闭,关闭后不参与客户接入分配)
    • 新增 PUT /cs/agents/{agent_id}/enabled 启用/关闭坐席接口
    • 客服配置列表、会话列表新增 keyword 搜索(app_name/app_id、session_id/visitor_name/visitor_id/summary)
    • 坐席按员工 ID / agent_key 查重(含软删除记录,兼容唯一索引)
  • config:系统版本动态化
    • GET /configs/public 与 GET /configs 的 version 始终返回运行时 APP_VERSION(随系统升级自动更新)
    • 禁止通过设置接口写入 sys.version

Fixes

  • 修复 message 模块未读数统计中 not Message.is_read 布尔比较失效问题(改为 Message.is_read == False)

0.3.7 (2026-08-07)

Features

  • customer_service:智能客服功能完善(一期 + 二期)
    • 文档导入:POST /cs/knowledge-bases/{kb_id}/upload,支持 txt / md / pdf / docx(pymupdf + python-docx),自动段落切块 + 后台向量化入库(chunk.source_type="file")
    • 人工坐席:新增 cs_agent 坐席表(绑定员工 + 摄影师)、坐席工作台 WebSocket 双向通信(/admin/api/v1/cs/ws/agent)、Redis pub/sub 广播(cs:ws:*,Redis 挂掉降级进程内投递)
    • 转人工流程:POST /api/v1/cs/transfer 支持 agent_key 路由;无在线坐席时进入排队(status=1, agent_id=NULL),坐席上线自动接管
    • AI 辅助回复:POST /cs/agent/sessions/{sid}/ai-draft(LLM 非流式起草,坐席工作台"AI 起草")
    • 会话摘要自动生成:generate_session_summary(LLM 输出"问题/已处理/待办/情绪"存 session.summary + emotion,转人工与会话结束时后台异步生成)
    • 满意度评价:POST /api/v1/cs/rating(用户端会话结束后五星评价)
    • 智能转人工:_should_transfer(关键词命中 → LLM 确认输出 JSON → LLM 失败降级关键词直接触发),SSE 返回 transfer_required 事件
    • SDK v2(sdk_template.html):配置化 + 转人工常驻按钮 + AI 回复快捷入口 + 帮助助手(data-cs-question)+ WS 实时消息 + 评分 + transfer_required 事件
  • core/email:新增邮件发送基础能力
    • get_email_settings / update_email_settings(密码留空不修改)/ send_email / send_test_email
    • SMTP 465(SSL) / 587(STARTTLS),配置存系统设置表(group_key=email),发送失败仅记日志不抛异常
    • 管理端新增接口:GET /settings/email、PUT /settings/email、POST /settings/email/test
  • deps:新增 pymupdf>=1.24.0、python-docx>=1.1.0(文档解析)

Fixes

  • 统一 core/config.py 的 APP_VERSION 与 pyproject.toml 版本号

0.3.6 (2026-08-03)

Features

  • core/redis_keys:重命名 wan27_* 函数为模型无关的通用名称
    • wan27_compose_daily_key -> compose_daily_key
    • wan27_compose_cd_key -> compose_cd_key
    • wan27_expand_daily_key -> expand_daily_key
    • wan27_expand_cd_key -> expand_cd_key
    • 新增 compose_total_key:智能合成累计总次数(用于折扣阶梯,不随日重置)
  • core/dependencies_client:新增 get_optional_user 可选认证依赖
    • 未登录时返回 None 而非抛异常
    • 支持积分/支付等接口对未登录用户开放

0.3.5 (2026-08-03)

Features

  • photo:新增 alias 字段(照片别名),用于存储中文风格名
    • Photo 模型新增 alias 列(VARCHAR(200))
    • 所有 Schema(Upload/Update/Response/PublicPhotoResponse)新增 alias
    • 上传接口支持 alias Form 参数
    • 编辑接口支持更新 alias
  • photo:新增客户端公开接口 GET /api/v1/photos/public?album_code=xxx
    • 免登录,按相册编码拉取已发布照片
    • 支持按分类编码筛选
    • 返回 alias、category_name 等字段
    • router.py 导出 client_router 供自动发现
  • material:上传逻辑从硬编码本地存储改为使用 get_storage()
    • 支持 local / S3 / COS 自动切换
    • storage 字段动态反映实际后端
  • user:新增手机号+密码登录接口 POST /api/v1/auth/phone/login
    • UserPhoneLoginRequest Schema
    • phone_login Service 方法
    • 带登录频控
  • core/redis_keys:新增视觉缓存与频控 key
    • vision_cache_key:结果缓存去重
    • compose_daily_key / compose_cd_key:智能合成用户级频控
    • expand_daily_key / expand_cd_key:智能扩图 IP 级频控

0.3.4 (2026-07-31)

Features

  • auth:新增 C 端用户认证体系(手机号验证码登录、邮箱密码登录、用户注册、Token 刷新、个人资料管理)
  • sms:新增多服务商短信服务抽象层(阿里云/腾讯云/华为云/Mock),无外部 SDK 依赖,全部 httpx 实现
  • captcha:新增滑动拼图验证码一次性令牌机制,防止绕过验证直接发送短信
  • captcha:滑动验证码支持素材中心背景图和 6 种预设缺口形状(圆角矩形/心形/五角星/菱形/L 形/党徽)
  • employee:新增员工自助注册功能(短信验证 + 多部门关联 + 注册开关 + 审核通知)
  • payment:新增银联云闪付支付 Provider(扫码支付 + APP 支付 + 订单查询 + RSA-SHA256 回调验签)
  • ai:新增 AI 模块(多服务商大模型对话/图片生成/视频生成,支持 DeepSeek/阿里云/火山方舟/腾讯混元/智谱/Kimi 六大服务商)
  • core/rate_limit:新增频率限制(短信发送/登录/注册均接入 IP + 账号维度限流)

Improvements

  • core/redis_keys:Redis Key 集中管理,新增验证码令牌、频率限制、智能客服等 Key 命名函数
  • core/cache:验证码/短信码存储统一 Redis 优先、内存降级策略
  • payment:支付 Provider 新增多平台分发 create_trade_by_platform(web/miniapp/app/h5)

0.3.3 (2026-07-28)

Features

  • ai:AI 大模型配置 - 模型类型支持多选(逗号分隔字符串,后端数据结构不变,向前兼容)

Fixes

  • 统一 APP_VERSION 与 pyproject.toml 版本号

0.3.2 (2026-07-21)

Fixes

  • 修复后端上传接口权限
  • 修复后端中文编码错误

0.3.1 (2026-07-19)

Features

  • 精简仓库,删除非基础库内容(reglow-design / reglow-app 拆分至独立仓库)

Fixes

  • 更新基础库 env 配置
  • 修复菜单数据初始化问题

0.3.0 (2026-07-02)

首个正式发布版本,完成三阶段架构优化,已发布至 PyPI / npm。

第一阶段(紧急修复)

  • 修复 auth controller 变量名 Bug
  • 修复后端 Dockerfile
  • 统一版本号
  • print 替换为 logger
  • ruff 配置 + 修复 50+ lint 错误

第二阶段(质量基线)

  • 后端测试从 0 到 1(22 个用例)
  • 引入 mypy 类型检查
  • 修复 core -> modules 层级违反
  • 权限缓存迁移到 Redis
  • auth controller 职责下沉

第三阶段(架构升级)

  • 插件/Hook 系统
  • 前端 tree-shaking
  • 解耦 employee God Module
  • i18n 可扩展 API
  • 前端组件覆盖机制
  • customer_service SDK 前后端分离
  • monorepo 目录结构重构

工程实践

  • 新增 GitHub Actions CI/CD(ruff + mypy + pytest + vue-tsc + vitest)
  • Gitee Go 流水线
  • 简化 reglow-app 启动流程(移除 PYTHONPATH hack)

0.2.1 (2026-06-30)

Features

  • 初始化 Reglow 基础库仓库
  • 完成前后端快速开发模板搭建,19 个后端模块 + 前端组件库基座