# -*- coding: utf-8 -*- """ pbls 应用唯一入口(PBL Agent OS Phase 0/1) 约定(web-application-spec): - 一个应用 = 一个入口 = 一个端口(本项目 9300,与 conf/config.json、 projects/pbls/env/{test,prod}.json 三方同值) - init() 内 ServerEnv() 先于 load_rbac(),再逐个显式 load_XXX() - 模块取库名一律走 ServerEnv().get_module_dbname('模块名'),禁止硬编码 DBNAME - 挂载顺序以 projects/pbls/pbls_spec.json 的 load_order 为准(23 个模块) - HTTP 服务只由 ahserver 提供,不引入任何第三方 Web 框架或自建路由/序列化装饰器 """ import os import sys from ahserver.webapp import webapp from ahserver.serverenv import ServerEnv # ---- 基础层(已存在,直接复用,不重复开发)---- from appbase.init import load_appbase from rbac.init import load_rbac from pybricks.init import load_pybricks # ---- PBL 公共内核(必须最先挂载,其余 pbl_* 模块依赖它)---- from pbl_common.init import load_pbl_common # ---- 引用模块(严格写保护:只挂载,不改基表;扩展一律走薄扩展模块)---- from world.init import load_world from scene.init import load_scene from entity.init import load_entity from scense.init import load_scense from scense_runtime.init import load_scense_runtime from script_engine.init import load_script_engine from kdb.init import load_kdb from world_snapshot.init import load_world_snapshot # ---- PBL 业务模块(M1~M15)---- from pbl_appcodes.init import load_pbl_appcodes from pbl_blueprint.init import load_pbl_blueprint from pbl_validation.init import load_pbl_validation from pbl_compiler.init import load_pbl_compiler from pbl_agent_runtime.init import load_pbl_agent_runtime from pbl_evidence.init import load_pbl_evidence from pbl_assessment.init import load_pbl_assessment from pbl_kdb_ext.init import load_pbl_kdb_ext from pbl_domain_ext.init import load_pbl_domain_ext from pbl_scense_ext.init import load_pbl_scense_ext from pbl_runtime_ext.init import load_pbl_runtime_ext from pbl_template.init import load_pbl_template from pbl_analytics.init import load_pbl_analytics from pbl_governance.init import load_pbl_governance # 主库名(可被环境变量覆盖,默认 pbls) DBNAME = os.environ.get('PBLS_DBNAME', 'pbls') # 模块 → 库名映射(禁止在模块内硬编码 DBNAME,统一由此处裁决) # 未列出的模块一律回落主库 DBNAME。 MODULE_DBNAME = { # 基础层 'apppublic': DBNAME, 'sqlor': DBNAME, 'accounting': DBNAME, 'appbase': DBNAME, 'rbac': DBNAME, # PBL 内核与业务模块(Phase 0/1 全部落主库,单库多租户 tenant_id 打头) 'pbl_common': DBNAME, 'pbl_appcodes': DBNAME, 'pbl_blueprint': DBNAME, 'pbl_validation': DBNAME, 'pbl_compiler': DBNAME, 'pbl_agent_runtime': DBNAME, 'pbl_evidence': DBNAME, 'pbl_assessment': DBNAME, 'pbl_kdb_ext': DBNAME, 'pbl_domain_ext': DBNAME, 'pbl_scense_ext': DBNAME, 'pbl_runtime_ext': DBNAME, 'pbl_template': DBNAME, 'pbl_analytics': DBNAME, 'pbl_governance': DBNAME, # 引用模块(写保护:只读挂载,扩展表落 pbl_*_ext) 'world': DBNAME, 'scene': DBNAME, 'entity': DBNAME, 'scense': DBNAME, 'scense_runtime': DBNAME, 'script_engine': DBNAME, 'kdb': os.environ.get('PBLS_KDB_DBNAME', DBNAME), 'world_snapshot': DBNAME, } def get_module_dbname(module_name): """模块 → 库名映射(挂到 ServerEnv,供各模块 ServerEnv().get_module_dbname(x) 调用)""" return MODULE_DBNAME.get(module_name, DBNAME) def init(): """应用初始化:显式按 load_order 逐个挂载 23 个模块""" env = ServerEnv() # 注入库名裁决函数(必须先于任何 load_*,模块建表/取连接都依赖它) env.get_module_dbname = get_module_dbname env.app_name = 'pbls' # ---- 基础层(ServerEnv() 之后、load_rbac 之前的固定次序)---- load_appbase(env) load_rbac(env) load_pybricks(env) # ---- PBL 公共内核(其余 pbl_* 的依赖底座)---- load_pbl_common(env) # ---- 引用模块(写保护,仅挂载复用)---- load_world(env) load_scene(env) load_entity(env) load_scense(env) load_scense_runtime(env) load_script_engine(env) load_kdb(env) load_world_snapshot(env) # ---- PBL 业务模块(枚举注入 → 蓝图 → 校验 → 编译 → Agent 运行时 → 证据 → 评估 # → 四个薄扩展 → 模板/分析/治理)---- load_pbl_appcodes(env) load_pbl_blueprint(env) load_pbl_validation(env) load_pbl_compiler(env) load_pbl_agent_runtime(env) load_pbl_evidence(env) load_pbl_assessment(env) load_pbl_kdb_ext(env) load_pbl_domain_ext(env) load_pbl_scense_ext(env) load_pbl_runtime_ext(env) load_pbl_template(env) load_pbl_analytics(env) load_pbl_governance(env) return env if __name__ == '__main__': sys.exit(0) webapp(init)