pbls/app/pbls.py
2026-09-16 19:57:39 +08:00

131 lines
5.3 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""pbls 应用唯一入口PBL Agent OS Phase 0/1
设计依据
--------
* projects/pbls/pbls_spec.json —— app / load_order / 端口(唯一事实源在 projects/pbls/env/
* docs/01-design/architecture.md —— 单应用单端口、模块挂载顺序
* docs/01-design/data-model.md —— 36 表 mariadb 方言、tenant_id 强制打头
* projects/pbls/env/test.json —— 端口与 DB 连接(应用仓不另存 env/、不硬编码端口)
规范对齐web-application-spec 固定模板QC 第 4 轮 #1/#2/#3/#4/#8 已整改)
--------------------------------------------------------------------------
* init() 无参签名,函数体内 `env = ServerEnv()`ahserver webapp(init) 以无参调用 init
* 平台基座导入路径按规范字面appbase.init / rbac.init / bricks_for_python(+.init)
* 业务模块导入路径按 module-development-spec 标准出口:{module}.init
* 入口内不出现任何端口字面量(端口只由 projects/pbls/env/{test,prod}.json 注入)
* webapp(init) 置于 __main__ 守卫内,被 import 不触发启动
"""
import json
import os
from ahserver.webapp import webapp
from ahserver.serverenv import ServerEnv
import bricks_for_python # noqa: F401 registers bui processor
from bricks_for_python.init import load_pybricks # registers UiWindow etc.
from appbase.init import load_appbase
from rbac.init import load_rbac
# ---- 引用模块(严格写保护:只读挂载,扩展一律走 pbl_*_ext 薄扩展模块)
from world.init import load_world
from scene.init import load_scene
from entity.init import load_entity
from script_engine.init import load_script_engine
from scense_runtime.init import load_scense_runtime
from scense.init import load_scense
# ---- 新建 pbl_* 模块(严格按 pbls_spec.json load_order
from pbl_common.init import load_pbl_common
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_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_kdb_ext.init import load_pbl_kdb_ext
CONF_PATH = os.path.join(
os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "conf", "config.json"
)
_MODULE_DBNAME_MAP = None
def _load_module_dbname_map():
"""从应用 conf/config.json 的 module_dbname 段读取「模块名 → 库名」映射。
库名唯一事实源是 conf/config.json由 build.sh 依据 projects/pbls/env/*.json 生成),
代码内不写死任何库名。
"""
global _MODULE_DBNAME_MAP
if _MODULE_DBNAME_MAP is None:
with open(CONF_PATH, "r", encoding="utf-8") as fp:
cfg = json.load(fp)
_MODULE_DBNAME_MAP = cfg.get("module_dbname") or {}
return _MODULE_DBNAME_MAP
def get_module_dbname(m):
"""返回模块 m 对应的数据库名web-application-spec / module-development-spec 要求)。"""
mapping = _load_module_dbname_map()
if m in mapping:
return mapping[m]
if "default" in mapping:
return mapping["default"]
raise RuntimeError(
"module_dbname mapping missing for module %r; check %s" % (m, CONF_PATH)
)
def password_encode(s):
if s is None:
return ''
from ahserver.globalEnv import password_encode as _orig
return _orig(s)
def init():
"""应用初始化:唯一入口。端口/DB 连接由 projects/pbls/env/{test,prod}.json 注入。"""
env = ServerEnv() # ← MUST be before load_rbac
env.get_module_dbname = get_module_dbname
env.password_encode = password_encode
# ---- 平台基座三件套顺序固定ServerEnv → appbase → rbac → bricks_for_python
load_appbase()
load_rbac()
load_pybricks()
# ---- 引用模块(只读挂载,不改基表)
load_world()
load_scene()
load_entity()
load_script_engine()
load_scense_runtime()
load_scense()
# ---- 新建 pbl_* 模块(严格按 pbls_spec.json load_order
load_pbl_common() # 公共内核:租户上下文/DB 适配/错误码/审计/CRUD 工厂
load_pbl_appcodes() # 枚举编码注入8 组 74 项,幂等,零表)
load_pbl_blueprint() # M1a/M1b 蓝图聚合根 + 7 类子对象 + 版本 + 模板
load_pbl_validation() # M2 校验引擎14 维 + 5 级质量状态)
load_pbl_compiler() # M3a/M3b 确定性编译 + Game Definition
load_pbl_agent_runtime() # M4a/M4b Designer/Critic 运行时 + fail-closed 工具裁决
load_pbl_evidence() # M5a/M5b 证据幂等采集
load_pbl_assessment() # M6 Rubric 加权评估与报告
load_pbl_domain_ext() # M8 world/scene/entity 薄扩展(不改基表)
load_pbl_scense_ext() # M9 前端覆盖层与页面注册
load_pbl_runtime_ext() # M11a/M11b 单事务事件+状态写入与广播
load_pbl_kdb_ext() # M7 KDB 只读桩与匿名聚合(零写入)
return env
if __name__ == '__main__':
webapp(init)