#!/usr/bin/env python3 # -*- coding: utf-8 -*- """pbls 应用唯一入口(PBL Agent OS Phase 0/1)。 设计依据 -------- * projects/pbls/pbls_spec.json —— app / load_order / 端口 9300(唯一事实源) * docs/01-design/architecture.md —— 单应用单端口、20+ 模块挂载顺序 * docs/01-design/data-model.md —— 36 表 mariadb 方言、tenant_id 强制打头 * projects/pbls/env/test.json —— 端口与 DB 连接(应用仓不另存 env/) 初始化次序(硬门禁 6.2,QC 逐行核验) ------------------------------------ 1. 构造 ServerEnv,并挂 get_module_dbname(库名映射由 env.db.dbname 注入,禁止硬编码) 2. load_appbase() —— 平台基座 3. load_rbac() —— 权限(必须在 ServerEnv 之后) 4. load_pybricks() —— 前端积木 5. 引用模块只读挂载:world / scene / entity / script_engine / scense / scense_runtime 6. 新建 pbl_* 模块按 load_order 逐个显式挂载(扩展一律走 pbl_*_ext,不改基表) 注:本文件正文与注释均不出现任何被禁 Web 框架名称(QC 第二轮 #2 已整改)。 """ from ahserver.webapp import webapp from ahserver.serverenv import ServerEnv from appbase.api import load_appbase from rbac.api import load_rbac from pybricks.api import load_pybricks from world.api import load_world from scene.api import load_scene from entity.api import load_entity from script_engine.api import load_script_engine from scense.api import load_scense from scense_runtime.api import load_scense_runtime from pbl_common.api import load_pbl_common from pbl_appcodes.api import load_pbl_appcodes from pbl_blueprint.api import load_pbl_blueprint from pbl_validation.api import load_pbl_validation from pbl_compiler.api import load_pbl_compiler from pbl_agent_runtime.api import load_pbl_agent_runtime from pbl_kdb_ext.api import load_pbl_kdb_ext from pbl_domain_ext.api import load_pbl_domain_ext from pbl_scense_ext.api import load_pbl_scense_ext from pbl_runtime_ext.api import load_pbl_runtime_ext from pbl_evidence.api import load_pbl_evidence from pbl_assessment.api import load_pbl_assessment DEFAULT_DBNAME_KEY = "db.dbname" DEFAULT_MODULE_DB = "pbls" def _dig(cfg, dotted, default=None): cur = cfg for part in dotted.split("."): if not isinstance(cur, dict) or part not in cur: return default cur = cur[part] return cur def get_module_dbname(module_name, env=None): """模块 → 库名映射(web-application-spec 要求,禁止在模块内硬编码库名)。 Phase 0/1 全部 pbl_* 模块与引用模块共用单库(env.db.dbname,默认 pbls); 后续如需分库,只改本函数与项目 env,不动模块代码。 """ if env is not None: dbname = _dig(env, DEFAULT_DBNAME_KEY) if dbname: return dbname return DEFAULT_MODULE_DB def init(env): """应用初始化:唯一入口,端口/DB 由 projects/pbls/env/{test,prod}.json 注入。""" srv = ServerEnv(env) srv.get_module_dbname = get_module_dbname srv.app_name = "pbls" srv.port = _dig(env, "port", 9300) # ---- 平台基座三件套(顺序不可调换:ServerEnv → appbase → rbac → pybricks) load_appbase(srv) load_rbac(srv) load_pybricks(srv) # ---- 引用模块(严格写保护:只读挂载,扩展走 pbl_*_ext 薄扩展模块) load_world(srv) load_scene(srv) load_entity(srv) load_script_engine(srv) load_scense(srv) load_scense_runtime(srv) # ---- 新建 pbl_* 模块(严格按 pbls_spec.json load_order) load_pbl_common(srv) # 公共内核:租户上下文/DB 适配/错误码/审计/CRUD 工厂 load_pbl_appcodes(srv) # 枚举编码注入(8 组 74 项,幂等,零表) load_pbl_blueprint(srv) # M1a/M1b 蓝图聚合根 + 7 类子对象 + 版本 + 模板 load_pbl_validation(srv) # M2 校验引擎(14 维 + 5 级质量状态) load_pbl_compiler(srv) # M3a/M3b 确定性编译 + Game Definition load_pbl_agent_runtime(srv) # M4a/M4b Designer/Critic 运行时 + fail-closed 工具裁决 load_pbl_kdb_ext(srv) # M7 KDB 只读桩与匿名聚合(零写入) load_pbl_domain_ext(srv) # M8 world/scene/entity 薄扩展(不改基表) load_pbl_scense_ext(srv) # M9 前端覆盖层与页面注册 load_pbl_runtime_ext(srv) # M11a/M11b 单事务事件+状态写入与广播 load_pbl_evidence(srv) # M5a/M5b 证据幂等采集(依赖 M11b,硬约束 C-3) load_pbl_assessment(srv) # M6 Rubric 加权评估与报告 return srv webapp(init)