ue-mcp 1.1.35 → 1.1.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/README.md +7 -5
  2. package/dist/editor-control.d.ts +4 -1
  3. package/dist/editor-control.js +145 -46
  4. package/dist/editor-control.js.map +1 -1
  5. package/dist/engine-observer.d.ts +143 -0
  6. package/dist/engine-observer.js +426 -0
  7. package/dist/engine-observer.js.map +1 -0
  8. package/dist/feedback-cli.js +43 -7
  9. package/dist/feedback-cli.js.map +1 -1
  10. package/dist/feedback-deferred.d.ts +8 -0
  11. package/dist/feedback-deferred.js +2 -0
  12. package/dist/feedback-deferred.js.map +1 -1
  13. package/dist/feedback-routing.d.ts +78 -0
  14. package/dist/feedback-routing.js +472 -0
  15. package/dist/feedback-routing.js.map +1 -0
  16. package/dist/flow/bridge-task.js +8 -14
  17. package/dist/flow/bridge-task.js.map +1 -1
  18. package/dist/flow/flow-tool.js +10 -1
  19. package/dist/flow/flow-tool.js.map +1 -1
  20. package/dist/flow/rollback.d.ts +16 -0
  21. package/dist/flow/rollback.js +26 -0
  22. package/dist/flow/rollback.js.map +1 -0
  23. package/dist/flow/task-factory.js +21 -7
  24. package/dist/flow/task-factory.js.map +1 -1
  25. package/dist/github-app.d.ts +9 -0
  26. package/dist/github-app.js +44 -17
  27. package/dist/github-app.js.map +1 -1
  28. package/dist/index.js +9 -0
  29. package/dist/index.js.map +1 -1
  30. package/dist/instructions.d.ts +2 -2
  31. package/dist/instructions.js +10 -1
  32. package/dist/instructions.js.map +1 -1
  33. package/dist/plugin/manifest.d.ts +10 -10
  34. package/dist/plugin-freshness.d.ts +17 -0
  35. package/dist/plugin-freshness.js +170 -0
  36. package/dist/plugin-freshness.js.map +1 -0
  37. package/dist/registry-catalog.d.ts +64 -0
  38. package/dist/registry-catalog.js +125 -0
  39. package/dist/registry-catalog.js.map +1 -0
  40. package/dist/tool-counts.json +12 -12
  41. package/dist/tools/animation.js +9 -3
  42. package/dist/tools/animation.js.map +1 -1
  43. package/dist/tools/asset.js +15 -6
  44. package/dist/tools/asset.js.map +1 -1
  45. package/dist/tools/blueprint.js +19 -8
  46. package/dist/tools/blueprint.js.map +1 -1
  47. package/dist/tools/chooser.js +11 -0
  48. package/dist/tools/chooser.js.map +1 -1
  49. package/dist/tools/editor.js +60 -19
  50. package/dist/tools/editor.js.map +1 -1
  51. package/dist/tools/feedback.js +304 -18
  52. package/dist/tools/feedback.js.map +1 -1
  53. package/dist/tools/gameplay.js +22 -16
  54. package/dist/tools/gameplay.js.map +1 -1
  55. package/dist/tools/landscape.js +11 -2
  56. package/dist/tools/landscape.js.map +1 -1
  57. package/dist/tools/level.js +31 -16
  58. package/dist/tools/level.js.map +1 -1
  59. package/dist/tools/networking.js +8 -2
  60. package/dist/tools/networking.js.map +1 -1
  61. package/dist/tools/niagara.js +68 -5
  62. package/dist/tools/niagara.js.map +1 -1
  63. package/dist/tools/pcg.js +1 -1
  64. package/dist/tools/pcg.js.map +1 -1
  65. package/dist/tools/project.js +35 -1
  66. package/dist/tools/project.js.map +1 -1
  67. package/dist/tools/reflection.js +1 -1
  68. package/dist/tools/reflection.js.map +1 -1
  69. package/dist/ue-mcp.default.yml +126 -46
  70. package/package.json +3 -3
  71. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/BridgeServer.cpp +48 -3
  72. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/EngineStatus.cpp +386 -0
  73. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/EngineStatus.h +105 -0
  74. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/GameThreadExecutor.cpp +71 -31
  75. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/GameThreadExecutor.h +13 -2
  76. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers.cpp +1 -0
  77. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers.h +2 -0
  78. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_ControlRig.cpp +226 -0
  79. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_MotionMatching.cpp +11 -2
  80. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_StateMachine.cpp +24 -0
  81. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers.cpp +453 -23
  82. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers.h +1 -0
  83. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers.cpp +74 -3
  84. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Graph.cpp +44 -8
  85. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers_Properties.cpp +153 -38
  86. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/ChooserHandlers.cpp +2 -0
  87. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/ChooserHandlers.h +3 -0
  88. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/ChooserHandlers_Nested.cpp +537 -0
  89. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/DemoHandlers.cpp +6 -1
  90. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/DialogHandlers.cpp +101 -94
  91. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/DialogHandlers.h +9 -0
  92. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers.cpp +148 -24
  93. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers.h +7 -2
  94. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers_PIE.cpp +48 -82
  95. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers_PIERuntime.cpp +831 -0
  96. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers.cpp +335 -27
  97. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers.h +2 -1
  98. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers_Input.cpp +0 -61
  99. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers_InputRuntime.cpp +246 -0
  100. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LandscapeHandlers.cpp +35 -6
  101. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LandscapeHandlers.h +4 -0
  102. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LandscapeHandlers_Sculpt.cpp +449 -0
  103. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers.cpp +188 -39
  104. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers.h +6 -0
  105. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_Lights.cpp +1 -1
  106. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers_WorldPartition.cpp +372 -0
  107. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/NiagaraHandlers.cpp +202 -9
  108. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PhysicsHandlers.cpp +1 -1
  109. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/ReflectionHandlers.cpp +68 -3
  110. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SequencerHandlers.cpp +56 -16
  111. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SplineHandlers.cpp +1 -1
  112. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/UE_MCP_Bridge.cpp +19 -0
  113. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Public/HandlerUtils.h +53 -3
  114. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/UE_MCP_Bridge.Build.cs +4 -0
  115. package/skills/ue-mcp-workflow/SKILL.md +1 -1
package/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
  [![stars](https://img.shields.io/github/stars/db-lyon/ue-mcp)](https://github.com/db-lyon/ue-mcp/stargazers)
6
6
  [![MIT](https://img.shields.io/npm/l/ue-mcp)](LICENSE)
7
7
 
8
- **Unreal Engine Model Context Protocol Server** - gives AI assistants deep read/write access to the Unreal Editor through <!-- count:tools -->24<!-- /count --> category tools covering <!-- count:actions -->744+<!-- /count --> actions, plus a YAML flow engine for multi-step workflows and an npm plugin system for extending the surface.
8
+ **Unreal Engine Model Context Protocol Server** - gives AI assistants deep read/write access to the Unreal Editor through <!-- count:tools -->24<!-- /count --> category tools covering <!-- count:actions -->760+<!-- /count --> actions, plus a YAML flow engine for multi-step workflows and an npm plugin system for extending the surface.
9
9
 
10
10
  On UE 5.8+ it also wraps Epic's entire native AI Toolset Registry - 830 official Unreal tools, called in-process and surfaced as `epic_*` actions in the matching category: Sequencer in `animation`, PCG in `pcg`, static meshes in `asset`.
11
11
 
@@ -90,7 +90,7 @@ Nothing is pre-authored. Every asset in the scene is created by the agent at run
90
90
  | **Assets** | CRUD, import meshes/textures/animations, datatables, mesh bounds/collision/nav |
91
91
  | **Animation** | Anim blueprints, montages, blendspaces, skeletons |
92
92
  | **VFX** | Niagara systems, emitters, modules, renderers, parameters |
93
- | **Landscape** | Sculpt terrain, paint layers, import heightmaps |
93
+ | **Landscape** | Sculpt terrain, paint weight layers, materials, splines, proxies |
94
94
  | **Foliage** | Painting, foliage types, instance queries |
95
95
  | **PCG** | Author and execute Procedural Content Generation graphs |
96
96
  | **Audio** | SoundCues, MetaSounds, attenuation, ambient audio, submixes |
@@ -137,7 +137,7 @@ flows:
137
137
  flow(action="run", flowName="build_and_check")
138
138
  ```
139
139
 
140
- Every one of the <!-- count:actions -->744+<!-- /count --> actions is also a flow task. Flows support step references, retries, rollback, custom tasks in your own `.js`/`.ts`, and shell steps. See [Flows](https://ue-mcp.com/docs/flows/).
140
+ Every one of the <!-- count:actions -->760+<!-- /count --> actions is also a flow task. Flows support step references, retries, rollback, custom tasks in your own `.js`/`.ts`, and shell steps. See [Flows](https://ue-mcp.com/docs/flows/).
141
141
 
142
142
  ## Plugins
143
143
 
@@ -176,10 +176,12 @@ Details: [Guards](https://ue-mcp.com/docs/plugins-guards/) and [Handler Conventi
176
176
 
177
177
  | | |
178
178
  |---|---|
179
- | **Unreal Engine** | 5.4-5.8 (Windows), 5.6+ (Linux). `epic` category needs 5.8+. |
179
+ | **Unreal Engine** | 5.4-5.8 (Windows), 5.6+ (Linux and macOS). `epic` category needs 5.8+. |
180
180
  | **Node.js** | 18 or newer |
181
181
  | **UE plugins** | `PythonScriptPlugin` (ships with the engine); `init` enables the rest for you |
182
- | **C++ toolchain** | Required - the bridge is a C++ plugin and compiles on first editor launch. On Windows that means Visual Studio with the C++ workload. |
182
+ | **C++ toolchain** | Required - the bridge is a C++ plugin and compiles on first editor launch. On Windows that means Visual Studio with the C++ workload; on macOS, Xcode command line tools. |
183
+
184
+ Editor process control (`editor(start_editor)` / `stop_editor` / `restart_editor`) works on Windows, macOS and Linux. Set `UE_EDITOR_PATH` if the engine is installed somewhere non-standard.
183
185
 
184
186
  ## Documentation
185
187
 
@@ -1,7 +1,9 @@
1
1
  import type { ProjectContext } from "./project.js";
2
- export declare function startEditor(project: ProjectContext): Promise<{
2
+ import { type EngineState } from "./engine-observer.js";
3
+ export declare function startEditor(project: ProjectContext, timeoutSeconds?: number): Promise<{
3
4
  success: boolean;
4
5
  message: string;
6
+ state?: EngineState;
5
7
  }>;
6
8
  /**
7
9
  * Stop the editor by asking it to quit ITSELF through the bridge. ue-mcp NEVER
@@ -14,6 +16,7 @@ export declare function startEditor(project: ProjectContext): Promise<{
14
16
  export declare function stopEditor(force?: boolean, projectDir?: string): Promise<{
15
17
  success: boolean;
16
18
  message: string;
19
+ state?: EngineState;
17
20
  }>;
18
21
  export declare function restartEditor(project: ProjectContext, bridge?: {
19
22
  connect: (timeoutMs?: number) => Promise<void>;
@@ -1,13 +1,15 @@
1
1
  import * as fs from "node:fs";
2
2
  import * as path from "node:path";
3
- import { spawn, execSync } from "child_process";
3
+ import { spawn } from "child_process";
4
4
  import * as net from "net";
5
5
  import WebSocket from "ws";
6
6
  import { findEngineInstall } from "./deployer.js";
7
- // editor-control relies on Windows-only tools (tasklist/taskkill, Build.bat).
8
- // The MCP server itself is cross-platform; only process control is gated.
7
+ import { invalidatePluginFreshness } from "./plugin-freshness.js";
8
+ import { findInteractiveEditors, readEngineState } from "./engine-observer.js";
9
+ // Process control is cross-platform: the editor binary path and the running-
10
+ // process probe differ per OS, and stopping goes through the bridge (#790).
9
11
  const IS_WINDOWS = process.platform === "win32";
10
- const WINDOWS_ONLY_MSG = "editor start/stop/restart is Windows-only. On macOS/Linux, start and stop the Unreal Editor manually; ue-mcp will reconnect when the bridge is reachable.";
12
+ const NO_EDITOR_BINARY_MSG = "Unreal Editor executable not found. Set UE_EDITOR_PATH to the editor binary (on macOS that is inside UnrealEditor.app/Contents/MacOS/), or install the engine to a default location.";
11
13
  /** Read EngineAssociation from a .uproject, or null if unreadable. */
12
14
  function readEngineAssociation(projectPath) {
13
15
  try {
@@ -68,42 +70,56 @@ function findUEBuildTool(engineAssociation) {
68
70
  }
69
71
  return null;
70
72
  }
73
+ /**
74
+ * #766/#790: the editor binary lives at a different path per platform. Only the
75
+ * Win64 path was ever checked, which is the whole reason start_editor was
76
+ * Windows-only - engine discovery itself (findUEBuildTool) has always worked
77
+ * cross-platform. On macOS the launchable binary is inside the .app bundle.
78
+ */
79
+ function editorBinaryCandidates(engineRoot) {
80
+ const binaries = path.join(engineRoot, "Engine", "Binaries");
81
+ if (IS_WINDOWS) {
82
+ return [path.join(binaries, "Win64", "UnrealEditor.exe")];
83
+ }
84
+ if (process.platform === "darwin") {
85
+ return [
86
+ path.join(binaries, "Mac", "UnrealEditor.app", "Contents", "MacOS", "UnrealEditor"),
87
+ path.join(binaries, "Mac", "UnrealEditor"),
88
+ ];
89
+ }
90
+ return [path.join(binaries, "Linux", "UnrealEditor")];
91
+ }
71
92
  function findEditorExecutable(project) {
72
93
  const envPath = process.env.UE_EDITOR_PATH;
73
94
  if (envPath)
74
95
  return envPath;
75
96
  const associatedEngineRoot = findEngineInstall(project?.engineAssociation ?? null);
76
97
  if (associatedEngineRoot) {
77
- const associatedEditorExe = path.join(associatedEngineRoot, "Engine", "Binaries", "Win64", "UnrealEditor.exe");
78
- if (fs.existsSync(associatedEditorExe)) {
79
- return associatedEditorExe;
98
+ for (const candidate of editorBinaryCandidates(associatedEngineRoot)) {
99
+ if (fs.existsSync(candidate))
100
+ return candidate;
80
101
  }
81
102
  }
82
103
  const buildTool = findUEBuildTool(project?.engineAssociation ?? null);
83
104
  if (!buildTool)
84
105
  return null;
85
106
  const engineRoot = path.resolve(buildTool, "..", "..", "..", "..");
86
- const editorExe = path.join(engineRoot, "Engine", "Binaries", "Win64", "UnrealEditor.exe");
87
- if (fs.existsSync(editorExe)) {
88
- return editorExe;
107
+ for (const candidate of editorBinaryCandidates(engineRoot)) {
108
+ if (fs.existsSync(candidate))
109
+ return candidate;
89
110
  }
90
111
  return null;
91
112
  }
92
- function isEditorRunning() {
93
- if (!IS_WINDOWS)
94
- return false;
95
- try {
96
- // Use /NH (no header) and check output directly avoids pipe/find issues
97
- const output = execSync('tasklist /NH /FI "IMAGENAME eq UnrealEditor.exe"', {
98
- stdio: "pipe",
99
- encoding: "utf-8",
100
- });
101
- // tasklist returns "INFO: No tasks..." when not found, or the process line when found
102
- return output.toLowerCase().includes("unrealeditor.exe");
103
- }
104
- catch {
105
- return false;
106
- }
113
+ /**
114
+ * #804: this used to be a `tasklist /FI "IMAGENAME eq UnrealEditor.exe"` string
115
+ * match, which cannot tell an interactive editor apart from a headless shard
116
+ * (`-server -game -nullrhi`) or from an editor holding a completely different
117
+ * project. Two shards on the box made start_editor refuse with "Editor is
118
+ * already running" while get_status reported nothing connected. The probe now
119
+ * matches on PID + command line and scopes to the project being asked about.
120
+ */
121
+ async function isEditorRunning(projectPath) {
122
+ return (await findInteractiveEditors(projectPath ?? null)).length > 0;
107
123
  }
108
124
  async function isBridgeAvailable(host = process.env.UE_MCP_HOST ?? "127.0.0.1", port = 9877, timeoutMs = 1000) {
109
125
  return new Promise((resolve) => {
@@ -134,28 +150,72 @@ async function isBridgeAvailable(host = process.env.UE_MCP_HOST ?? "127.0.0.1",
134
150
  socket.connect(port, host);
135
151
  });
136
152
  }
137
- async function waitForBridge(maxWaitSeconds = 120, checkIntervalMs = 2000) {
153
+ // #758: the readiness probe used to poll a hardcoded 9877 while the bridge
154
+ // binds a per-project port and publishes it to Saved/UE_MCP_Bridge/port.json.
155
+ // On any project not on the default port this waited out the whole timeout and
156
+ // reported failure even though the editor and bridge were up - which the very
157
+ // next tool call would then prove by succeeding immediately. The lockfile does
158
+ // not exist until the bridge starts, so the port must be re-read every poll
159
+ // rather than resolved once up front.
160
+ async function waitForBridge(projectDir, maxWaitSeconds = 120, checkIntervalMs = 2000, projectPath) {
138
161
  const startTime = Date.now();
139
162
  const maxWaitMs = maxWaitSeconds * 1000;
163
+ let lastState = null;
140
164
  while (Date.now() - startTime < maxWaitMs) {
141
- if (await isBridgeAvailable()) {
142
- return true;
165
+ if (await isBridgeAvailable(undefined, resolveBridgePort(projectDir))) {
166
+ return { available: true, state: lastState };
167
+ }
168
+ // The wait used to be blind: 120 seconds of sleeping, then a message that
169
+ // said nothing about why the bridge never appeared. The engine publishes
170
+ // its real state in its own log and in native windows the whole time, so
171
+ // read it. A prompt waiting on a human, or a crash, will never resolve by
172
+ // waiting - stop immediately and say what is on screen.
173
+ lastState = await readEngineState(projectPath ?? null);
174
+ if (lastState.log.phase === "crashed") {
175
+ return { available: false, state: lastState };
176
+ }
177
+ if (lastState.log.blocking) {
178
+ const withWindows = await readEngineState(projectPath ?? null, { probeWindows: true });
179
+ return { available: false, state: withWindows };
180
+ }
181
+ // Nothing in the process table and nothing moving in the log means the
182
+ // launch died rather than being slow.
183
+ if (!lastState.running && (lastState.log.secondsSinceWrite ?? 0) > 10 && Date.now() - startTime > 15000) {
184
+ return { available: false, state: lastState };
143
185
  }
144
186
  await new Promise((resolve) => setTimeout(resolve, checkIntervalMs));
145
187
  }
146
- return false;
188
+ // One last look before declaring failure: the bridge may have come up during
189
+ // the final sleep, and reporting "not available" for a bridge that is in fact
190
+ // serving sends the caller off debugging a problem that does not exist.
191
+ if (await isBridgeAvailable(undefined, resolveBridgePort(projectDir))) {
192
+ return { available: true, state: lastState };
193
+ }
194
+ return { available: false, state: await readEngineState(projectPath ?? null, { probeWindows: true }) };
147
195
  }
148
- export async function startEditor(project) {
149
- if (!IS_WINDOWS)
150
- return { success: false, message: WINDOWS_ONLY_MSG };
151
- if (isEditorRunning()) {
152
- return { success: false, message: "Editor is already running" };
196
+ export async function startEditor(project, timeoutSeconds = 120) {
197
+ // Fast signal first: a bridge answering on this project's port is proof its
198
+ // editor is up, costs a millisecond, and needs no process table at all. The
199
+ // process probe (seconds, on Windows) only runs when that fails, which is
200
+ // also the only case where its extra detail is worth anything.
201
+ const projectDirForPort = project.projectPath ? path.dirname(project.projectPath) : undefined;
202
+ if (await isBridgeAvailable(undefined, resolveBridgePort(projectDirForPort))) {
203
+ return { success: false, message: "Editor is already running for this project (its bridge is answering)." };
204
+ }
205
+ const alreadyRunning = await findInteractiveEditors(project.projectPath ?? null);
206
+ if (alreadyRunning.length > 0) {
207
+ const state = await readEngineState(project.projectPath ?? null, { probeWindows: true });
208
+ return {
209
+ success: false,
210
+ message: `Editor is already running for this project (pid ${alreadyRunning.map((p) => p.pid).join(", ")}) but its bridge is not answering yet. ${state.summary}`,
211
+ state,
212
+ };
153
213
  }
154
214
  const editorExe = findEditorExecutable(project);
155
215
  if (!editorExe) {
156
216
  return {
157
217
  success: false,
158
- message: "Unreal Editor executable not found. Set UE_EDITOR_PATH environment variable or install UE5.3+ to default location.",
218
+ message: NO_EDITOR_BINARY_MSG,
159
219
  };
160
220
  }
161
221
  if (!project.projectPath) {
@@ -168,11 +228,16 @@ export async function startEditor(project) {
168
228
  });
169
229
  editorProcess.unref();
170
230
  // Wait for bridge to become available (editor fully started)
171
- const bridgeAvailable = await waitForBridge(120, 2000);
172
- if (!bridgeAvailable) {
231
+ const projectDir = path.dirname(project.projectPath);
232
+ const { available, state } = await waitForBridge(projectDir, timeoutSeconds, 2000, project.projectPath);
233
+ if (!available) {
234
+ const detail = state
235
+ ? ` ${state.summary}`
236
+ : "";
173
237
  return {
174
238
  success: false,
175
- message: "Editor launched but bridge did not become available within 120 seconds. Editor may still be starting up.",
239
+ message: `Editor launched but the bridge did not answer on port ${resolveBridgePort(projectDir)}.${detail}`,
240
+ ...(state ? { state } : {}),
176
241
  };
177
242
  }
178
243
  return { success: true, message: `Editor launched and bridge available: ${editorExe}` };
@@ -196,6 +261,22 @@ const EDITOR_SELF_QUIT_PY = [
196
261
  " unreal.log_error('ue-mcp quit_editor failed: ' + str(e))",
197
262
  "unreal.register_slate_post_tick_callback(_ue_mcp_quit)",
198
263
  ].join("\n");
264
+ /**
265
+ * The .uproject inside a project directory. The stop/restart paths are handed a
266
+ * directory, but the process probe matches editors by the project file they
267
+ * have open, so resolve one from the other.
268
+ */
269
+ function uprojectInDir(projectDir) {
270
+ if (!projectDir)
271
+ return null;
272
+ try {
273
+ const match = fs.readdirSync(projectDir).find((f) => f.toLowerCase().endsWith(".uproject"));
274
+ return match ? path.join(projectDir, match) : null;
275
+ }
276
+ catch {
277
+ return null;
278
+ }
279
+ }
199
280
  /** Read the project's live bridge port from its lockfile, else env, else 9877. */
200
281
  function resolveBridgePort(projectDir) {
201
282
  if (projectDir) {
@@ -244,17 +325,21 @@ function requestEditorSelfQuit(port) {
244
325
  */
245
326
  export async function stopEditor(force = false, projectDir) {
246
327
  void force;
247
- if (!IS_WINDOWS)
248
- return { success: false, message: WINDOWS_ONLY_MSG };
328
+ const projectPath = uprojectInDir(projectDir);
249
329
  const port = resolveBridgePort(projectDir);
250
330
  const bridgeUp = await isBridgeAvailable("127.0.0.1", port);
251
- if (!bridgeUp && !isEditorRunning()) {
331
+ if (!bridgeUp && !(await isEditorRunning(projectPath))) {
252
332
  return { success: false, message: "Editor is not running" };
253
333
  }
254
334
  if (!bridgeUp) {
335
+ // "Unreachable" is where the user is left guessing, so say what the engine
336
+ // is actually doing: a modal dialog waiting on an answer, a slow task at
337
+ // 60%, or a game thread that stopped ticking are all visible from outside.
338
+ const state = await readEngineState(projectPath, { probeWindows: true });
255
339
  return {
256
340
  success: false,
257
- message: "Editor appears to be running but its bridge is unreachable, so it cannot be asked to quit cleanly. Close it manually - ue-mcp never force-kills processes.",
341
+ message: `Editor is running but its bridge is unreachable, so it cannot be asked to quit cleanly. ${state.summary} Close it manually - ue-mcp never force-kills processes.`,
342
+ state,
258
343
  };
259
344
  }
260
345
  const quitSent = await requestEditorSelfQuit(port);
@@ -278,7 +363,7 @@ export async function stopEditor(force = false, projectDir) {
278
363
  }
279
364
  export async function restartEditor(project, bridge) {
280
365
  const stopResult = await stopEditor(false, project.projectDir ?? undefined);
281
- if (!stopResult.success && isEditorRunning()) {
366
+ if (!stopResult.success && (await isEditorRunning(project.projectPath ?? null))) {
282
367
  return { success: false, message: `Failed to stop editor: ${stopResult.message}` };
283
368
  }
284
369
  // Wait for process to fully terminate and release locks
@@ -321,16 +406,26 @@ export async function buildProject(projectPath, opts = {}) {
321
406
  const projectName = path.basename(resolvedPath, ".uproject");
322
407
  const target = `${projectName}Editor`;
323
408
  const platform = getPlatformString();
324
- const buildArgs = [target, platform, "Development", `-Project="${resolvedPath}"`, "-WaitMutex", "-FromMsBuild"];
409
+ // #740: the quotes around the project path are SHELL syntax, not part of the
410
+ // value. On Windows the args are joined into a single `cmd /c` string, so
411
+ // they are required. Off Windows the args go straight into argv with no shell
412
+ // to strip them, so UnrealBuildTool received a path containing literal quote
413
+ // characters and reported "Unable to find project file" for a file that was
414
+ // plainly there - while the same command pasted into a terminal worked,
415
+ // because the shell removed them first.
416
+ const commonArgs = [target, platform, "Development"];
417
+ const tailArgs = ["-WaitMutex", "-FromMsBuild"];
418
+ const windowsArgs = [...commonArgs, `-Project="${resolvedPath}"`, ...tailArgs];
419
+ const posixArgs = [...commonArgs, `-Project=${resolvedPath}`, ...tailArgs];
325
420
  return new Promise((resolve) => {
326
421
  let proc;
327
422
  if (IS_WINDOWS) {
328
423
  const quotedCommand = `"${buildTool}"`;
329
- const fullCommand = `cmd /c "${quotedCommand} ${buildArgs.join(" ")}"`;
424
+ const fullCommand = `cmd /c "${quotedCommand} ${windowsArgs.join(" ")}"`;
330
425
  proc = spawn(fullCommand, [], { shell: true, stdio: "pipe" });
331
426
  }
332
427
  else {
333
- proc = spawn(buildTool, buildArgs, { stdio: "pipe" });
428
+ proc = spawn(buildTool, posixArgs, { stdio: "pipe" });
334
429
  }
335
430
  const forward = (data) => {
336
431
  const text = data.toString();
@@ -344,6 +439,10 @@ export async function buildProject(projectPath, opts = {}) {
344
439
  if (proc.stderr)
345
440
  proc.stderr.on("data", forward);
346
441
  proc.on("close", (code) => {
442
+ // A build is the only event that can turn a "stale plugin" verdict fresh
443
+ // ahead of the cache TTL, so drop the cached answer here rather than
444
+ // making the next get_status report a binary that no longer exists.
445
+ invalidatePluginFreshness();
347
446
  resolve(code === 0
348
447
  ? { success: true, exitCode: 0, message: "Build succeeded" }
349
448
  : { success: false, exitCode: code, message: `Build failed with exit code ${code}` });
@@ -1 +1 @@
1
- {"version":3,"file":"editor-control.js","sourceRoot":"","sources":["../src/editor-control.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"editor-control.js","sourceRoot":"","sources":["../src/editor-control.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Out-of-process observability for a running (or starting, or wedged) editor.
3
+ *
4
+ * Every other sensor in ue-mcp runs on the game thread: `ExecuteOnGameThread`
5
+ * gates each bridge request, so when the game thread sits inside a modal loop,
6
+ * a long FSlowTask, or a startup phase that predates the plugin module, the
7
+ * bridge can only answer "Handler execution timed out". That is the whole
8
+ * problem class behind #804 and its predecessors - the agent goes blind exactly
9
+ * when the user needs to know what the engine is doing.
10
+ *
11
+ * Nothing in this file touches the bridge. It reads state the OS and the engine
12
+ * publish regardless of what the game thread is doing:
13
+ *
14
+ * - the process table (PID + command line + hung/responding state)
15
+ * - `Saved/Logs/<Project>.log`, written from the first millisecond of startup
16
+ * - native top-level windows (the pre-Slate "modules are out of date" prompt
17
+ * is a plain Win32 message box and is readable from outside)
18
+ * - `Saved/UE_MCP_Bridge/status.json`, the snapshot the plugin flushes from a
19
+ * writer thread that keeps running while the game thread is blocked
20
+ */
21
+ export interface EditorProcess {
22
+ pid: number;
23
+ commandLine: string;
24
+ /** The .uproject this process has open, absolute and normalised, if any. */
25
+ projectPath: string | null;
26
+ /**
27
+ * #804: a headless shard (`-server` / `-game` / `-nullrhi` / `-unattended` /
28
+ * a commandlet) is the same binary as an interactive editor. Matching by
29
+ * image name alone made two running shards look like "the editor is already
30
+ * running" while the bridge simultaneously reported nothing connected.
31
+ */
32
+ headless: boolean;
33
+ /** false when the OS says the window is not pumping messages (wedged). */
34
+ responding: boolean;
35
+ windowTitle: string | null;
36
+ }
37
+ /**
38
+ * Every UnrealEditor process on this machine, with enough detail to tell an
39
+ * interactive editor for one project apart from a headless shard for another.
40
+ */
41
+ export declare function listEditorProcesses(): Promise<EditorProcess[]>;
42
+ /**
43
+ * The interactive editor(s) holding `projectPath` open. Headless shards are
44
+ * excluded, and when a project path is known, editors for other projects are
45
+ * too - launching a second project while a shard or another project's editor
46
+ * runs is legitimate (#804).
47
+ */
48
+ export declare function findInteractiveEditors(projectPath?: string | null): Promise<EditorProcess[]>;
49
+ export interface StartupPhase {
50
+ /** Short phase label derived from the newest matching marker. */
51
+ phase: string;
52
+ /** True when the marker means the editor is waiting on a human. */
53
+ blocking: boolean;
54
+ /** The log line the phase was derived from. */
55
+ evidence: string;
56
+ }
57
+ export interface LogState {
58
+ logPath: string | null;
59
+ /** Seconds since the log file was last written. High = the process is stuck. */
60
+ secondsSinceWrite: number | null;
61
+ phase: string;
62
+ blocking: boolean;
63
+ lastLine: string | null;
64
+ tail: string[];
65
+ errors: string[];
66
+ warnings: string[];
67
+ }
68
+ /**
69
+ * What the engine's own log says right now. This is the only sensor that works
70
+ * before the plugin module exists, which is where the "editor launched but the
71
+ * bridge never came up" reports have always come from.
72
+ */
73
+ export declare function readLogState(projectPath: string | null | undefined, tailLines?: number): LogState;
74
+ export interface NativeWindow {
75
+ handle: string;
76
+ className: string;
77
+ title: string;
78
+ /** Static text children, which is where a message box keeps its message. */
79
+ text: string[];
80
+ hung: boolean;
81
+ }
82
+ /**
83
+ * Visible top-level windows belonging to the given PIDs, with their child text.
84
+ * Windows only; returns [] elsewhere. Compiling the interop type costs about a
85
+ * second, so call this on demand (a stalled wait, an explicit state query),
86
+ * never on a hot path.
87
+ */
88
+ export declare function readNativeWindows(pids: number[]): Promise<NativeWindow[]>;
89
+ /** Windows that look like a prompt waiting on a human. */
90
+ export declare function dialogLikeWindows(windows: NativeWindow[]): NativeWindow[];
91
+ export interface EngineSnapshot {
92
+ writtenAt?: string;
93
+ ageSeconds?: number;
94
+ phase?: string;
95
+ gameThreadStalledSeconds?: number;
96
+ slowTask?: {
97
+ name: string;
98
+ fraction: number;
99
+ stack?: Array<{
100
+ name: string;
101
+ fraction: number;
102
+ }>;
103
+ } | null;
104
+ modal?: {
105
+ title: string;
106
+ message: string;
107
+ buttons: string[];
108
+ } | null;
109
+ compiling?: {
110
+ shaders: number;
111
+ assets: number;
112
+ };
113
+ handler?: {
114
+ method: string;
115
+ elapsedSeconds: number;
116
+ } | null;
117
+ [key: string]: unknown;
118
+ }
119
+ /**
120
+ * The snapshot the plugin flushes to disk from a dedicated writer thread. It
121
+ * keeps updating while the game thread is inside a modal loop or a slow task,
122
+ * which is precisely when a bridge request cannot be answered.
123
+ */
124
+ export declare function readEngineSnapshot(projectPath: string | null | undefined): EngineSnapshot | null;
125
+ export interface EngineState {
126
+ running: boolean;
127
+ processes: EditorProcess[];
128
+ log: LogState;
129
+ snapshot: EngineSnapshot | null;
130
+ dialogs: NativeWindow[];
131
+ /** One line an agent can act on without reading any of the above. */
132
+ summary: string;
133
+ /** True when something is waiting on a human answer. */
134
+ blocked: boolean;
135
+ }
136
+ /**
137
+ * Everything that can be known about the editor without asking the game thread.
138
+ * `probeWindows` costs about a second on Windows, so it defaults off and should
139
+ * be turned on when something already looks wrong.
140
+ */
141
+ export declare function readEngineState(projectPath: string | null | undefined, opts?: {
142
+ probeWindows?: boolean;
143
+ }): Promise<EngineState>;