#!/usr/bin/env python3 """dispatch-agent-task CLI:装配见 muse.flow.dispatch,执行见 runtime。""" from __future__ import annotations import argparse import json import sys from pathlib import Path PROJECT_ROOT = next( parent for parent in (Path(__file__).resolve().parent, *Path(__file__).resolve().parents) if (parent / "AGENTS.md").is_file() and (parent / ".git").exists() ) if str(PROJECT_ROOT) not in sys.path: sys.path.insert(0, str(PROJECT_ROOT)) from framework.adapters.pi.runner import DEFAULT_PI_BIN, ExecutionPolicy # noqa: E402 from muse.flow.dispatch import ( # noqa: E402 DEFAULT_RUN_DIR_ROOT, EXIT_EVIDENCE_FAILED, EXIT_FRAMEWORK_FAILED, EXIT_OK, EXIT_OUTPUT_INVALID, EXIT_SPEC_INVALID, run_dispatch, ) def main(argv: list[str] | None = None) -> int: parser = argparse.ArgumentParser(description="把冻结任务包派发给 Agent 框架子代理并自动留痕") parser.add_argument("--spec", required=True, help="AgentTaskSpec JSON 文件路径") parser.add_argument("--provider", required=True, help="显式框架 provider") parser.add_argument("--model", required=True, help="显式框架模型") parser.add_argument("--thinking", default=None, help="思考等级 off/low/medium/high") parser.add_argument("--pi-bin", default=DEFAULT_PI_BIN, help="框架二进制(默认 pi)") parser.add_argument("--repo-root", default=".", help="仓库根(解析 .agent/agents 角色文件)") parser.add_argument("--run-id", default=None, help="指定 run_id(默认自动生成)") parser.add_argument("--run-dir", default=None, help="运行目录(默认 /tmp/muse-agent-runs/)") parser.add_argument("--trigger-source", default="user", choices=["user", "replay_eval", "diagnostic"]) parser.add_argument("--session-id", default=None, help="框架会话 ID(复用=继续原会话,缺省=一次性会话)") parser.add_argument("--session-dir", default=None, help="框架会话目录(与 --session-id 同给)") parser.add_argument("--enable-read-tools", action="store_true", help="启用只读探索工具 server") args = parser.parse_args(argv) policy = ExecutionPolicy( provider=args.provider, model=args.model, thinking=args.thinking, pi_bin=args.pi_bin ) receipt, code = run_dispatch( args.spec, repo_root=args.repo_root, policy=policy, run_id=args.run_id, run_dir=args.run_dir, trigger_source=args.trigger_source, session_id=args.session_id, session_dir=args.session_dir, enable_read_tools=args.enable_read_tools, ) print(json.dumps(receipt, ensure_ascii=False, indent=2)) return code if __name__ == "__main__": raise SystemExit(main())