Initial checkin of Blueprint-MCP plugin

This commit is contained in:
2026-03-05 19:26:46 -05:00
parent 9cc1cb502b
commit 8367bd2221
4571 changed files with 1211887 additions and 7 deletions

62
tools/blueprint-mcp/dist/helpers.js vendored Normal file
View File

@@ -0,0 +1,62 @@
// --- Type name format documentation (shared across tool descriptions) ---
export const TYPE_NAME_DOCS = `Type name formats: C++ USTRUCTs use F-prefixed name (e.g. 'FVitals', 'FDeviceState'), BP structs (UserDefinedStruct) use asset name (e.g. 'S_Vitals'), enums use enum name (e.g. 'ELungSound'). Object references use colon syntax: 'object:Actor', 'softobject:Actor', 'class:Actor' (TSubclassOf), 'softclass:Actor', 'interface:MyInterface'.`;
// --- Warning marker for unresolved types ---
export const UNRESOLVED_TYPE_PATTERNS = ["<None>", "<unknown>", "None", "NONE"];
export function flagType(typeName) {
if (!typeName)
return "\u26A0 <None>";
for (const pat of UNRESOLVED_TYPE_PATTERNS) {
if (typeName === pat || typeName.includes(pat)) {
return `\u26A0 ${typeName}`;
}
}
return typeName;
}
export function formatVarType(v) {
let t = v.type || "unknown";
if (v.subtype)
t = v.subtype;
if (v.isMap)
return `Map<${v.type}, ${v.subtype || "?"}>`;
if (v.isSet)
return `Set<${t}>`;
if (v.isArray)
return `${t}[]`;
return t;
}
/** Format parameter list for functions/events/delegates with type flagging (#9) */
export function formatParams(params) {
if (!params || params.length === 0)
return "";
const parts = params.map((p) => {
const name = p.name || "?";
const type = p.type || p.pinType || "";
return `${name}: ${flagType(type)}`;
});
return ` \u2014 Params: ${parts.join(", ")}`;
}
/** Format updated state returned by mutation tools (#11) */
export function formatUpdatedState(data) {
const lines = [];
if (data.updatedState) {
lines.push(`\nUpdated state:`);
const state = data.updatedState;
if (state.variables?.length) {
lines.push(` Variables: ${state.variables.map((v) => `${v.name}: ${v.type}`).join(", ")}`);
}
if (state.pins?.length) {
lines.push(` Pins:`);
for (const pin of state.pins) {
lines.push(` ${pin.direction === "Output" ? "\u2192" : "\u2190"} ${pin.name}: ${pin.type}${pin.subtype ? ` (${pin.subtype})` : ""}`);
}
}
if (state.nodeCount !== undefined) {
lines.push(` Nodes: ${state.nodeCount}`);
}
if (state.graphCount !== undefined) {
lines.push(` Graphs: ${state.graphCount}`);
}
}
return lines;
}
//# sourceMappingURL=helpers.js.map