58 lines
2.5 KiB
Python
58 lines
2.5 KiB
Python
"""从已领取步骤装配 S02 只读工具集;接入层只转交,不写来源规则。
|
|
|
|
合同依据:文件设计/后端-装配与接入.md、接口契约/任务工具与事件.md。
|
|
- 工具范围完全取自任务冻结输入;本文件不重新解释作者、作品或截止。
|
|
- 只安装任务范围实际授权的工具:历史文稿、目标章细纲与时点事实;
|
|
未实现的方法、资料等工具不伪返回成功。
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from uuid import uuid4
|
|
|
|
from muse.上下文.接口 import 上下文服务, 事实工具, 历史正文工具, 细纲工具
|
|
from muse.任务运行.执行合同 import 模型协议错误
|
|
from muse.任务运行.接口 import 事件类型, 任务服务, 只读工具集, 工具定义, 工具范围, 领取凭证
|
|
|
|
|
|
def 领取只读工具(上下文: 上下文服务, 运行: 任务服务, 领取: 领取凭证) -> 只读工具集:
|
|
"""按任务冻结范围安装已授权工具;成功读取复用 S02 工具读取事件留痕。"""
|
|
任务 = 运行.读取任务(领取.任务ID)
|
|
冻结 = 上下文.恢复冻结范围(任务)
|
|
步骤 = next(s for s in 任务.流程.步骤 if s.步骤ID == 领取.步骤ID)
|
|
固定 = 任务.冻结输入
|
|
登记: tuple[工具定义, ...] = ()
|
|
if 冻结["documents"]:
|
|
登记 += (历史正文工具(上下文.数据库, 冻结),)
|
|
if isinstance(冻结.get("target_plan"), dict):
|
|
登记 += (细纲工具(上下文.数据库, 冻结, 上下文.规划引用解析),)
|
|
if isinstance(冻结.get("facts"), dict):
|
|
登记 += (事实工具(上下文.数据库, 冻结),)
|
|
|
|
def 记录(载荷: dict) -> None:
|
|
运行.追加事件(领取, 事件类型.工具读取, 载荷, 事件ID=str(uuid4()))
|
|
|
|
# 声明的工具与冻结范围实际安装的交集才可用:没有历史文稿时读取工具
|
|
# 合法缺席,不应让整个探索步骤失败;全部缺席仍视为流程配置错误。
|
|
已登记 = {定义.名称 for 定义 in 登记}
|
|
可用 = tuple(名 for 名 in 步骤.工具 if 名 in 已登记)
|
|
if 步骤.工具 and not 可用:
|
|
raise 模型协议错误("工具未登记、重复或所需工具加载失败")
|
|
|
|
return 只读工具集(
|
|
登记,
|
|
可用,
|
|
工具范围(
|
|
任务.任务ID,
|
|
冻结["work_id"],
|
|
tuple(冻结["source_ids"]),
|
|
冻结["as_of"],
|
|
固定["执行用途"],
|
|
固定["内容用途"],
|
|
),
|
|
记录,
|
|
)
|
|
|
|
|
|
__all__ = ["领取只读工具"]
|