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

115 lines
4.6 KiB
Python
Raw 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 / 端口 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.2QC 逐行核验)
------------------------------------
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)