真实进程冒烟(灵台+神识起进程 → 登录 → 能力目录 → 授契 → 调用)抓到三处缺陷,全量测试因分支未覆盖而漏网: ① mirror_tree.list_trees:select(Character.id).scalars() 已返回 id 字符串,c.id 属性访问在有 character 的 owner 上必炸(M2a 引入,测试只走了无 character 分支)——改为直接收集 ② 内置能力种子写死 owner_scope=local-user,真实用户(UUID owner)查不到能力目录——引入 PLATFORM_SCOPE:builtin 能力挂平台域全局可见可授契,自定义能力仍按 owner 隔离 ③ ensure_governance_seed 缺 session.commit——种子数据未提交即随启动 session 回滚(直调误读为成功因同 session 可见未提交数据) 冒烟证据:未授契调用 403 HJ-1303 留痕 → 授行契 → 调用 ok 返回观察标证;能力目录 4 项(builtin.datetime/echo/qiankun.shell/web.fetch);全量回归 349 passed 不变 另:本地 .env 补入神识段(SHENSHI_BASE_URL=127.0.0.1:8080 接真神识)
94 lines
2.6 KiB
Python
94 lines
2.6 KiB
Python
"""百工能力种子(内置能力幂等登记;旧枢治理种子随 M8 退役)。"""
|
|
|
|
from sqlalchemy import select
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.domains.baigong.models import Capability
|
|
from app.domains.baigong.service import PLATFORM_SCOPE
|
|
|
|
_BUILTIN_CAPABILITIES = [
|
|
# name, 描述, 执行类型, 执行器, 四维风险, 数据范围, 目的地, consent
|
|
(
|
|
"builtin.echo",
|
|
"回显输入(无副作用演示能力)",
|
|
"builtin",
|
|
"echo",
|
|
{"capability": "L0", "data": "L0", "consequence": "L0", "context": "L0"},
|
|
"",
|
|
"",
|
|
"allow",
|
|
),
|
|
(
|
|
"builtin.datetime",
|
|
"读取当前时间",
|
|
"builtin",
|
|
"datetime.now",
|
|
{"capability": "L0", "data": "L0", "consequence": "L0", "context": "L0"},
|
|
"",
|
|
"",
|
|
"allow",
|
|
),
|
|
(
|
|
"qiankun.shell",
|
|
"在乾坤沙箱中执行命令(隔离执行,HMAC 授契)",
|
|
"qiankun",
|
|
"",
|
|
{"capability": "L2", "data": "L1", "consequence": "L3", "context": "L1"},
|
|
"沙箱工作目录",
|
|
"本机沙箱进程",
|
|
"ask",
|
|
),
|
|
(
|
|
"web.fetch",
|
|
"抓取指定 URL 内容(受限出站)",
|
|
"http",
|
|
"",
|
|
{"capability": "L1", "data": "L1", "consequence": "L2", "context": "L1"},
|
|
"目标 URL 响应体",
|
|
"目标站点",
|
|
"allow",
|
|
),
|
|
]
|
|
|
|
|
|
async def _seed_capabilities(session: AsyncSession) -> None:
|
|
"""内置能力按 (owner, name) 幂等登记(source=builtin,四维风险标注随代码演进)。"""
|
|
import json as _json
|
|
|
|
from sqlalchemy import select
|
|
|
|
existing = set(
|
|
(
|
|
await session.execute(
|
|
select(Capability.name).where(Capability.source == "builtin")
|
|
)
|
|
)
|
|
.scalars()
|
|
.all()
|
|
)
|
|
for name, desc, executor_type, ref, dims, scope, dests, consent in _BUILTIN_CAPABILITIES:
|
|
if name in existing:
|
|
continue
|
|
session.add(
|
|
Capability(
|
|
name=name,
|
|
owner_scope=PLATFORM_SCOPE,
|
|
description=desc,
|
|
executor_type=executor_type,
|
|
executor_ref=ref,
|
|
risk_dims_json=_json.dumps(dims),
|
|
data_scope=scope,
|
|
destinations=dests,
|
|
consent_mode=consent,
|
|
source="builtin",
|
|
)
|
|
)
|
|
|
|
|
|
|
|
|
|
async def ensure_governance_seed(session: AsyncSession) -> None:
|
|
"""启动幂等登记内置能力。"""
|
|
await _seed_capabilities(session)
|
|
await session.commit()
|