115 lines
4.6 KiB
Python
115 lines
4.6 KiB
Python
#!/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)
|