载入中...
搜索中...
未找到
AgentDevelopmentMcp.cpp
浏览该文件的文档.
2
4
5#include <Poco/Dynamic/Var.h>
6#include <Poco/JSON/Array.h>
7#include <Poco/JSON/Stringifier.h>
8
9#include <sstream>
10#include <utility>
11
12namespace eve::dev {
13namespace {
14
15std::string stringify(const Poco::Dynamic::Var& value) {
16 std::ostringstream output;
17 Poco::JSON::Stringifier::stringify(value, output, 0, 0);
18 return output.str();
19}
20
21std::string stringField(Poco::JSON::Object::Ptr object, const char* key) {
22 if (!object || !object->has(key)) return {};
23 try {
24 return object->get(key).convert<std::string>();
25 } catch (...) {
26 return {};
27 }
28}
29
30Poco::JSON::Object::Ptr resultObject(const AgentDevelopmentResult& result) {
31 Poco::JSON::Object::Ptr output(new Poco::JSON::Object());
32 output->set("status", result.code);
33 if (!result.message.empty()) output->set("error", result.message);
34 return output;
35}
36
37Poco::JSON::Object::Ptr snapshot(const AgentDevelopmentResult& result) {
38 auto output = resultObject(result);
40 output->set("schema", "eve.agent-development-session");
41 output->set("schemaVersion", 1);
42 output->set("active", session.active());
43 output->set("sessionId", session.sessionId());
44 output->set("objective", session.objective());
45 output->set("phase", std::string(agentDevelopmentPhaseName(session.phase())));
46 output->set("readyToComplete", session.readyToComplete());
47 if (!session.summary().empty()) output->set("summary", session.summary());
48
49 Poco::JSON::Array::Ptr criteria(new Poco::JSON::Array());
50 for (const auto& criterion : session.criteria()) {
51 Poco::JSON::Object::Ptr item(new Poco::JSON::Object());
52 item->set("id", criterion.id);
53 item->set("description", criterion.description);
54 item->set("required", criterion.required);
55 item->set("passed", criterion.passed);
56 criteria->add(item);
57 }
58 output->set("criteria", criteria);
59
60 Poco::JSON::Array::Ptr evidence(new Poco::JSON::Array());
61 for (const auto& receipt : session.evidence()) {
62 Poco::JSON::Object::Ptr item(new Poco::JSON::Object());
63 item->set("sequence", receipt.sequence);
64 item->set("criterionId", receipt.criterionId);
65 item->set("kind", receipt.kind);
66 item->set("status", receipt.status);
67 item->set("summary", receipt.summary);
68 if (!receipt.artifact.empty()) item->set("artifact", receipt.artifact);
69 evidence->add(item);
70 }
71 output->set("evidence", evidence);
72 return output;
73}
74
75AgentDevelopmentResult invalid(std::string code, std::string message) { return {std::move(code), std::move(message)}; }
76
77} // namespace
78
79bool isAgentDevelopmentTool(std::string_view name) {
80 return name == "eve_agent_session_start" || name == "eve_agent_session_advance" ||
81 name == "eve_agent_session_evidence" || name == "eve_agent_session_status" ||
82 name == "eve_agent_session_complete" || name == "eve_agent_session_abort";
83}
84
85std::string callAgentDevelopmentTool(std::string_view name, Poco::JSON::Object::Ptr args) {
87 AgentDevelopmentResult result{"applied", {}};
88 if (name == "eve_agent_session_start") {
89 std::vector<AgentAcceptanceCriterion> criteria;
90 try {
91 auto array = args ? args->getArray("criteria") : nullptr;
92 if (array) {
93 for (std::size_t index = 0; index < array->size(); ++index) {
94 auto item = array->getObject(static_cast<unsigned>(index));
95 if (!item) {
96 result = invalid("invalid-criterion", "each criterion must be an object");
97 break;
98 }
99 criteria.push_back({stringField(item, "id"), stringField(item, "description"),
100 item->optValue<bool>("required", true), false});
101 }
102 }
103 } catch (...) {
104 result = invalid("invalid-criteria", "criteria must be an array of objects");
105 }
106 if (result.isAccepted()) result = session.start(stringField(args, "objective"), std::move(criteria));
107 } else if (name == "eve_agent_session_advance") {
109 result = parseAgentDevelopmentPhase(stringField(args, "phase"), &phase);
110 if (result.isAccepted()) result = session.advance(stringField(args, "sessionId"), phase);
111 } else if (name == "eve_agent_session_evidence") {
113 evidence.criterionId = stringField(args, "criterionId");
114 evidence.kind = stringField(args, "kind");
115 evidence.status = stringField(args, "status");
116 evidence.summary = stringField(args, "summary");
117 evidence.artifact = stringField(args, "artifact");
118 result = session.record(stringField(args, "sessionId"), std::move(evidence));
119 } else if (name == "eve_agent_session_complete") {
120 result = session.complete(stringField(args, "sessionId"), stringField(args, "summary"));
121 } else if (name == "eve_agent_session_abort") {
122 result = session.abort(stringField(args, "sessionId"), stringField(args, "reason"));
123 } else if (name != "eve_agent_session_status") {
124 result = invalid("unknown-tool", "unknown Agent development-session tool");
125 }
126 return stringify(Poco::Dynamic::Var(snapshot(result)));
127}
128
129std::string_view agentDevelopmentToolSchemas() {
130 return R"json({"name":"eve_agent_session_start","description":"Start an evidence-driven Agent game-development workflow with explicit acceptance criteria.","inputSchema":{"type":"object","properties":{"objective":{"type":"string"},"criteria":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"description":{"type":"string"},"required":{"type":"boolean"}},"required":["id","description"]}}},"required":["objective","criteria"]}},{"name":"eve_agent_session_advance","description":"Advance the active workflow through discover, modify, run, observe, verify, or recover.","inputSchema":{"type":"object","properties":{"sessionId":{"type":"string"},"phase":{"type":"string","enum":["discover","modify","run","observe","verify","recover"]}},"required":["sessionId","phase"]}},{"name":"eve_agent_session_evidence","description":"Record an immutable evidence receipt against one declared acceptance criterion.","inputSchema":{"type":"object","properties":{"sessionId":{"type":"string"},"criterionId":{"type":"string"},"kind":{"type":"string","enum":["runtime-observation","test","screenshot","checkpoint","artifact","manual","play-trace"]},"status":{"type":"string","enum":["pass","fail","pending"]},"summary":{"type":"string"},"artifact":{"type":"string"}},"required":["sessionId","criterionId","kind","status","summary"]}},{"name":"eve_agent_session_status","description":"Read the versioned workflow snapshot, criteria, evidence ledger, and completion readiness.","inputSchema":{"type":"object","properties":{}}},{"name":"eve_agent_session_complete","description":"Complete from verify only when every required criterion has passing evidence.","inputSchema":{"type":"object","properties":{"sessionId":{"type":"string"},"summary":{"type":"string"}},"required":["sessionId","summary"]}},{"name":"eve_agent_session_abort","description":"Abort an active workflow with an explicit reason.","inputSchema":{"type":"object","properties":{"sessionId":{"type":"string"},"reason":{"type":"string"}},"required":["sessionId","reason"]}})json";
131}
132
133} // namespace eve::dev
double value
std::string output
float phase
Definition CaveMesh.cpp:58
std::string message
DiagnosticCode code
std::uint32_t key
std::string name
std::optional< InteractionSession > session
Definition Tactics.cpp:39
Json object
uint32_t index
static AgentDevelopmentSession & instance()
Return the process-lifetime session authority.
bool isAgentDevelopmentTool(std::string_view name)
Whether a tool name belongs to the Agent development-session protocol.
std::string_view agentDevelopmentToolSchemas()
Comma-separated MCP tool schema fragments without surrounding array brackets.
AgentDevelopmentResult parseAgentDevelopmentPhase(std::string_view name, AgentDevelopmentPhase *phase)
Parse a stable JSON protocol phase name.
AgentDevelopmentPhase
Ordered stage of an Agent-driven game-development session.
std::string callAgentDevelopmentTool(std::string_view name, Poco::JSON::Object::Ptr args)
Execute one Agent development-session tool and return compact JSON.
std::string_view agentDevelopmentPhaseName(AgentDevelopmentPhase phase)
Stable JSON protocol name for a development phase.
Immutable evidence recorded against an acceptance condition.
Structured result for development-session state transitions.