flockbay 0.10.49 → 0.10.52

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 (74) hide show
  1. package/README.md +60 -60
  2. package/bin/flockbay-mcp.mjs +62 -62
  3. package/bin/flockbay.mjs +95 -95
  4. package/dist/{index-r3VTdgFI.cjs → index-IntvnrmZ.cjs} +71 -14
  5. package/dist/{index-D8AeVbvv.mjs → index-wkeSi0iC.mjs} +70 -13
  6. package/dist/index.cjs +2 -2
  7. package/dist/index.mjs +2 -2
  8. package/dist/lib.cjs +1 -1
  9. package/dist/lib.mjs +1 -1
  10. package/dist/{migratePlugin-CEvGPul8.mjs → migratePlugin-C71hAoc5.mjs} +12 -2
  11. package/dist/{migratePlugin-wFK-k3Wk.cjs → migratePlugin-D1XjjWFq.cjs} +12 -2
  12. package/dist/{runCodex-DuyuYqoB.cjs → runCodex-B7i_ICoQ.cjs} +34 -23
  13. package/dist/{runCodex-ZfUyhHF6.mjs → runCodex-BSx-hCu6.mjs} +34 -23
  14. package/dist/{runGemini-DBU1mMdp.mjs → runGemini-Dwyh7_WI.mjs} +2 -2
  15. package/dist/{runGemini-D7j5Y5TF.cjs → runGemini-gBKR3rdL.cjs} +2 -2
  16. package/dist/{types-DNr0xwSy.cjs → types-5z8UADAi.cjs} +224 -15
  17. package/dist/{types-BRJuZQj_.mjs → types-Bgzap7qR.mjs} +224 -16
  18. package/package.json +131 -131
  19. package/scripts/claude_local_launcher.cjs +72 -72
  20. package/scripts/claude_remote_launcher.cjs +15 -15
  21. package/scripts/claude_version_utils.cjs +445 -445
  22. package/scripts/ripgrep_launcher.cjs +32 -32
  23. package/scripts/run-with-root-env.mjs +37 -32
  24. package/scripts/session_hook_forwarder.cjs +49 -49
  25. package/scripts/test-codex-abort-history.mjs +77 -77
  26. package/scripts/unpack-tools.cjs +244 -244
  27. package/tools/licenses/difftastic-LICENSE +21 -21
  28. package/tools/licenses/ripgrep-LICENSE +3 -3
  29. package/tools/unreal-mcp/UPSTREAM_VERSION.md +8 -8
  30. package/tools/unreal-mcp/upstream/Docs/README.md +8 -8
  31. package/tools/unreal-mcp/upstream/Docs/Tools/README.md +6 -6
  32. package/tools/unreal-mcp/upstream/Docs/Tools/actor_tools.md +183 -183
  33. package/tools/unreal-mcp/upstream/Docs/Tools/blueprint_tools.md +268 -268
  34. package/tools/unreal-mcp/upstream/Docs/Tools/editor_tools.md +104 -104
  35. package/tools/unreal-mcp/upstream/Docs/Tools/node_tools.md +274 -274
  36. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/FlockbayMCP/Config/FilterPlugin.ini +8 -8
  37. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/FlockbayMCP/FlockbayMCP.uplugin +36 -36
  38. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/FlockbayMCP/Source/FlockbayMCP/FlockbayMCP.Build.cs +82 -82
  39. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/FlockbayMCP/Source/FlockbayMCP/Private/Commands/UnrealMCPBlueprintCommands.cpp +1364 -1364
  40. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/FlockbayMCP/Source/FlockbayMCP/Private/Commands/UnrealMCPBlueprintNodeCommands.cpp +1310 -1310
  41. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/FlockbayMCP/Source/FlockbayMCP/Private/Commands/UnrealMCPCommandSchema.cpp +756 -756
  42. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/FlockbayMCP/Source/FlockbayMCP/Private/Commands/UnrealMCPCommonUtils.cpp +1177 -1177
  43. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/FlockbayMCP/Source/FlockbayMCP/Private/Commands/UnrealMCPEditorCommands.cpp +2618 -2618
  44. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/FlockbayMCP/Source/FlockbayMCP/Private/Commands/UnrealMCPProjectCommands.cpp +71 -71
  45. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/FlockbayMCP/Source/FlockbayMCP/Private/Commands/UnrealMCPUMGCommands.cpp +543 -543
  46. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/FlockbayMCP/Source/FlockbayMCP/Private/MCPServerRunnable.cpp +372 -372
  47. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/FlockbayMCP/Source/FlockbayMCP/Private/UnrealMCPBridge.cpp +457 -457
  48. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/FlockbayMCP/Source/FlockbayMCP/Private/UnrealMCPModule.cpp +21 -21
  49. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/FlockbayMCP/Source/FlockbayMCP/Public/Commands/UnrealMCPBlueprintCommands.h +35 -35
  50. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/FlockbayMCP/Source/FlockbayMCP/Public/Commands/UnrealMCPBlueprintNodeCommands.h +30 -30
  51. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/FlockbayMCP/Source/FlockbayMCP/Public/Commands/UnrealMCPCommandSchema.h +41 -41
  52. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/FlockbayMCP/Source/FlockbayMCP/Public/Commands/UnrealMCPCommonUtils.h +59 -59
  53. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/FlockbayMCP/Source/FlockbayMCP/Public/Commands/UnrealMCPEditorCommands.h +61 -61
  54. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/FlockbayMCP/Source/FlockbayMCP/Public/Commands/UnrealMCPProjectCommands.h +20 -20
  55. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/FlockbayMCP/Source/FlockbayMCP/Public/Commands/UnrealMCPUMGCommands.h +82 -82
  56. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/FlockbayMCP/Source/FlockbayMCP/Public/MCPServerRunnable.h +33 -33
  57. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/FlockbayMCP/Source/FlockbayMCP/Public/UnrealMCPBridge.h +64 -64
  58. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/FlockbayMCP/Source/FlockbayMCP/Public/UnrealMCPModule.h +22 -22
  59. package/tools/unreal-mcp/upstream/Python/README.md +39 -39
  60. package/tools/unreal-mcp/upstream/Python/pyproject.toml +22 -22
  61. package/tools/unreal-mcp/upstream/Python/scripts/actors/test_cube.py +202 -202
  62. package/tools/unreal-mcp/upstream/Python/scripts/blueprints/test_create_and_spawn_blueprints_with_different_components.py +496 -496
  63. package/tools/unreal-mcp/upstream/Python/scripts/blueprints/test_create_and_spawn_cube_blueprint.py +193 -193
  64. package/tools/unreal-mcp/upstream/Python/scripts/node/test_component_reference.py +266 -266
  65. package/tools/unreal-mcp/upstream/Python/scripts/node/test_create_bird_blueprint_with_input_and_camera.py +617 -617
  66. package/tools/unreal-mcp/upstream/Python/scripts/node/test_input_mapping.py +365 -365
  67. package/tools/unreal-mcp/upstream/Python/scripts/node/test_physics_variables.py +389 -389
  68. package/tools/unreal-mcp/upstream/Python/tools/blueprint_tools.py +419 -419
  69. package/tools/unreal-mcp/upstream/Python/tools/editor_tools.py +369 -369
  70. package/tools/unreal-mcp/upstream/Python/tools/node_tools.py +429 -429
  71. package/tools/unreal-mcp/upstream/Python/tools/project_tools.py +63 -63
  72. package/tools/unreal-mcp/upstream/Python/tools/umg_tools.py +332 -332
  73. package/tools/unreal-mcp/upstream/Python/unreal_mcp_server.py +398 -398
  74. package/tools/unreal-mcp/upstream/Python/uv.lock +521 -521
@@ -2,7 +2,7 @@ import{createRequire as _pkgrollCR}from"node:module";const require=_pkgrollCR(im
2
2
  import * as os from 'node:os';
3
3
  import os__default, { homedir } from 'node:os';
4
4
  import { randomUUID, createCipheriv, randomBytes, createHash as createHash$1 } from 'node:crypto';
5
- import { l as logger, e as projectPath, f as backoff, g as delay, R as RawJSONLinesSchema, c as configuration, h as readDaemonState, j as clearDaemonState, p as packageJson, r as readSettings, k as readCredentials, u as updateSettings, o as openBrowser, w as writeCredentials, m as unrealMcpPythonDir, n as acquireDaemonLock, q as writeDaemonState, s as ApiMachineClient, t as releaseDaemonLock, v as sendUnrealMcpTcpCommand, A as ApiClient, x as validatePath, y as run, z as run$1, B as buildShellInvocation, C as clearCredentials, D as clearMachineId, E as authenticateCodex, F as syncCodexCliAuth, G as authenticateClaude, H as authenticateGemini, d as installUnrealMcpPluginToEngine, I as buildAndInstallUnrealMcpPlugin, i as installUnrealMcpPluginToProject, b as isInstalledEngineRoot, J as getLatestDaemonLog, K as normalizeServerUrlForNode } from './types-BRJuZQj_.mjs';
5
+ import { l as logger, e as projectPath, f as backoff, g as delay, R as RawJSONLinesSchema, c as configuration, h as readDaemonState, j as clearDaemonState, p as packageJson, r as readSettings, k as readCredentials, u as updateSettings, o as openBrowser, w as writeCredentials, m as unrealMcpPythonDir, n as acquireDaemonLock, s as writeDaemonState, t as ApiMachineClient, v as releaseDaemonLock, x as sendUnrealMcpTcpCommand, A as ApiClient, y as validatePath, z as run, B as run$1, C as buildShellInvocation, D as clearCredentials, E as clearMachineId, F as authenticateCodex, G as syncCodexCliAuth, H as authenticateClaude, I as authenticateGemini, d as installUnrealMcpPluginToEngine, J as buildAndInstallUnrealMcpPlugin, i as installUnrealMcpPluginToProject, b as isInstalledEngineRoot, K as getLatestDaemonLog, L as normalizeServerUrlForNode } from './types-Bgzap7qR.mjs';
6
6
  import { spawn, execFileSync, execSync } from 'node:child_process';
7
7
  import * as path from 'node:path';
8
8
  import path__default, { resolve, join, dirname } from 'node:path';
@@ -960,7 +960,11 @@ async function claudeLocalLauncher(session) {
960
960
  } catch (e) {
961
961
  logger.debug("[local]: launch error", e);
962
962
  if (!exitReason) {
963
- session.client.sendSessionEvent({ type: "message", message: "Process exited unexpectedly" });
963
+ const details = e instanceof Error ? e.message : String(e);
964
+ session.client.sendSessionEvent({
965
+ type: "message",
966
+ message: `Process exited unexpectedly${details ? `: ${details}` : ""}`
967
+ });
964
968
  continue;
965
969
  } else {
966
970
  break;
@@ -1500,6 +1504,40 @@ async function streamToStdin(stream, stdin, abort) {
1500
1504
  stdin.end();
1501
1505
  }
1502
1506
 
1507
+ function trimProcessDiagnostic(text) {
1508
+ const lines = String(text || "").split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
1509
+ if (lines.length === 0) return "";
1510
+ return lines.slice(-8).join("\n");
1511
+ }
1512
+ function buildClaudeProcessExitMessage(args) {
1513
+ const stderrText = String(args.stderrText || "");
1514
+ const stderr = trimProcessDiagnostic(stderrText);
1515
+ const combined = [stderrText, args.spawnError?.message || ""].filter(Boolean).join("\n");
1516
+ if (/claude code is not installed/i.test(combined)) {
1517
+ return [
1518
+ "Claude Code is not installed on this machine.",
1519
+ "Install it, then restart Flockbay:",
1520
+ process$1.platform === "win32" ? " npm install -g @anthropic-ai/claude-code" : " npm install -g @anthropic-ai/claude-code"
1521
+ ].join("\n");
1522
+ }
1523
+ if (/not recognized as an internal or external command|command not found|spawn .*enoent|enoent/i.test(combined)) {
1524
+ return [
1525
+ "Claude Code could not be found on PATH.",
1526
+ "Install it, then restart Flockbay:",
1527
+ " npm install -g @anthropic-ai/claude-code"
1528
+ ].join("\n");
1529
+ }
1530
+ if (/git bash|bash\.exe|claude_code_git_bash_path/i.test(combined)) {
1531
+ return [
1532
+ "Claude Code could not start because Git Bash is missing or not configured.",
1533
+ "Install Git for Windows, then set CLAUDE_CODE_GIT_BASH_PATH to your bash.exe path and restart Flockbay."
1534
+ ].join("\n");
1535
+ }
1536
+ if (stderr) {
1537
+ return `Claude Code process exited with code ${args.code}. Details: ${stderr}`;
1538
+ }
1539
+ return `Claude Code process exited with code ${args.code}`;
1540
+ }
1503
1541
  class Query {
1504
1542
  constructor(childStdin, childStdout, processExitPromise, canCallTool) {
1505
1543
  this.childStdin = childStdin;
@@ -1769,11 +1807,17 @@ function query(config) {
1769
1807
  streamToStdin(prompt, child.stdin, config.options?.abort);
1770
1808
  childStdin = child.stdin;
1771
1809
  }
1772
- if (process$1.env.DEBUG) {
1773
- child.stderr.on("data", (data) => {
1810
+ let stderrTail = "";
1811
+ const appendStderr = (chunk) => {
1812
+ stderrTail += chunk.toString();
1813
+ if (stderrTail.length > 32e3) stderrTail = stderrTail.slice(-16e3);
1814
+ };
1815
+ child.stderr.on("data", (data) => {
1816
+ appendStderr(data);
1817
+ if (process$1.env.DEBUG) {
1774
1818
  console.error("Claude Code stderr:", data.toString());
1775
- });
1776
- }
1819
+ }
1820
+ });
1777
1821
  const cleanup = () => {
1778
1822
  if (!child.killed) {
1779
1823
  child.kill("SIGTERM");
@@ -1787,7 +1831,7 @@ function query(config) {
1787
1831
  query2.setError(new AbortError("Claude Code process aborted by user"));
1788
1832
  }
1789
1833
  if (code !== 0) {
1790
- query2.setError(new Error(`Claude Code process exited with code ${code}`));
1834
+ query2.setError(new Error(buildClaudeProcessExitMessage({ code, stderrText: stderrTail })));
1791
1835
  } else {
1792
1836
  resolve();
1793
1837
  }
@@ -1798,7 +1842,7 @@ function query(config) {
1798
1842
  if (config.options?.abort?.aborted) {
1799
1843
  query2.setError(new AbortError("Claude Code process aborted by user"));
1800
1844
  } else {
1801
- query2.setError(new Error(`Failed to spawn Claude Code process: ${error.message}`));
1845
+ query2.setError(new Error(buildClaudeProcessExitMessage({ code: null, stderrText: stderrTail, spawnError: error })));
1802
1846
  }
1803
1847
  });
1804
1848
  processExitPromise.finally(() => {
@@ -2030,11 +2074,24 @@ function normalizeFilePathToken(token) {
2030
2074
  function resolveCandidatePath(candidate, cwd) {
2031
2075
  const raw = normalizeFilePathToken(candidate);
2032
2076
  if (!raw) return raw;
2077
+ const isWindowsPath = (value) => {
2078
+ const v = String(value || "").trim();
2079
+ if (!v) return false;
2080
+ if (/^[a-zA-Z]:[\\/]/.test(v)) return true;
2081
+ if (v.startsWith("\\\\")) return true;
2082
+ return false;
2083
+ };
2084
+ const isPosixPath = (value) => String(value || "").trim().startsWith("/");
2085
+ const resolveApi = (() => {
2086
+ if (isWindowsPath(raw) || isWindowsPath(cwd)) return path__default.win32;
2087
+ if (isPosixPath(raw) || isPosixPath(cwd)) return path__default.posix;
2088
+ return path__default;
2089
+ })();
2033
2090
  if (raw.startsWith("~/")) {
2034
2091
  const home = process.env.HOME || process.env.USERPROFILE || "";
2035
- if (home) return path__default.join(home, raw.slice(2));
2092
+ if (home) return resolveApi.join(home, raw.slice(2));
2036
2093
  }
2037
- return path__default.isAbsolute(raw) ? raw : path__default.resolve(cwd, raw);
2094
+ return resolveApi.isAbsolute(raw) ? raw : resolveApi.resolve(cwd, raw);
2038
2095
  }
2039
2096
  function isImageBlock(block) {
2040
2097
  if (!block || typeof block !== "object") return false;
@@ -15190,7 +15247,7 @@ async function authAndSetupMachineIfNeeded() {
15190
15247
  process.exit(1);
15191
15248
  }
15192
15249
  try {
15193
- const { migrateUnrealMcpToFlockbayMcp } = await import('./migratePlugin-CEvGPul8.mjs');
15250
+ const { migrateUnrealMcpToFlockbayMcp } = await import('./migratePlugin-C71hAoc5.mjs');
15194
15251
  const result = migrateUnrealMcpToFlockbayMcp({
15195
15252
  engineRoot,
15196
15253
  projectUprojectPath: project || void 0,
@@ -15346,7 +15403,7 @@ ${engineRoot}`;
15346
15403
  } else if (subcommand === "codex") {
15347
15404
  try {
15348
15405
  await chdirToNearestUprojectRootIfPresent();
15349
- const { runCodex } = await import('./runCodex-ZfUyhHF6.mjs');
15406
+ const { runCodex } = await import('./runCodex-BSx-hCu6.mjs');
15350
15407
  let startedBy = void 0;
15351
15408
  let sessionId = void 0;
15352
15409
  for (let i = 1; i < args.length; i++) {
@@ -15448,7 +15505,7 @@ ${engineRoot}`;
15448
15505
  }
15449
15506
  try {
15450
15507
  await chdirToNearestUprojectRootIfPresent();
15451
- const { runGemini } = await import('./runGemini-DBU1mMdp.mjs');
15508
+ const { runGemini } = await import('./runGemini-Dwyh7_WI.mjs');
15452
15509
  let startedBy = void 0;
15453
15510
  let sessionId = void 0;
15454
15511
  for (let i = 1; i < args.length; i++) {
package/dist/index.cjs CHANGED
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
3
  require('chalk');
4
- require('./index-r3VTdgFI.cjs');
5
- require('./types-DNr0xwSy.cjs');
4
+ require('./index-IntvnrmZ.cjs');
5
+ require('./types-5z8UADAi.cjs');
6
6
  require('zod');
7
7
  require('node:child_process');
8
8
  require('node:fs');
package/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import 'chalk';
2
- import './index-D8AeVbvv.mjs';
3
- import './types-BRJuZQj_.mjs';
2
+ import './index-wkeSi0iC.mjs';
3
+ import './types-Bgzap7qR.mjs';
4
4
  import 'zod';
5
5
  import 'node:child_process';
6
6
  import 'node:fs';
package/dist/lib.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var types = require('./types-DNr0xwSy.cjs');
3
+ var types = require('./types-5z8UADAi.cjs');
4
4
  require('axios');
5
5
  require('node:fs');
6
6
  require('node:os');
package/dist/lib.mjs CHANGED
@@ -1,4 +1,4 @@
1
- export { A as ApiClient, a as ApiSessionClient, R as RawJSONLinesSchema, c as configuration, l as logger } from './types-BRJuZQj_.mjs';
1
+ export { A as ApiClient, a as ApiSessionClient, R as RawJSONLinesSchema, c as configuration, l as logger } from './types-Bgzap7qR.mjs';
2
2
  import 'axios';
3
3
  import 'node:fs';
4
4
  import 'node:os';
@@ -1,6 +1,6 @@
1
1
  import fs__default from 'node:fs';
2
2
  import path__default from 'node:path';
3
- import { i as installUnrealMcpPluginToProject, b as isInstalledEngineRoot, d as installUnrealMcpPluginToEngine } from './types-BRJuZQj_.mjs';
3
+ import { i as installUnrealMcpPluginToProject, b as isInstalledEngineRoot, q as quarantineLegacyEnginePlugins, d as installUnrealMcpPluginToEngine } from './types-Bgzap7qR.mjs';
4
4
  import 'axios';
5
5
  import 'node:os';
6
6
  import 'node:events';
@@ -141,9 +141,19 @@ Error: ${message}` };
141
141
  if (projectUprojectPath) {
142
142
  const installedProject = installUnrealMcpPluginToProject(projectUprojectPath);
143
143
  if (!installedProject.ok) return { ok: false, errorMessage: installedProject.errorMessage };
144
+ if (isInstalledEngineRoot(engineRoot)) {
145
+ const quarantine = quarantineLegacyEnginePlugins(engineRoot);
146
+ if (!quarantine.ok) return { ok: false, errorMessage: quarantine.errorMessage };
147
+ }
144
148
  return { ok: true, installedDestDir: installedProject.destDir, changedProjectPath, removedLegacyPluginDirs };
145
149
  }
146
150
  if (isInstalledEngineRoot(engineRoot)) {
151
+ const quarantine = quarantineLegacyEnginePlugins(engineRoot);
152
+ if (!quarantine.ok) return { ok: false, errorMessage: quarantine.errorMessage };
153
+ const disabledMeta = quarantine.disabledUpluginPaths.length ? `
154
+
155
+ Detected and disabled legacy engine plugin descriptor(s) to unblock builds:
156
+ ` + quarantine.disabledUpluginPaths.map((p) => `- ${p}`).join("\n") : "";
147
157
  return {
148
158
  ok: false,
149
159
  errorMessage: [
@@ -152,7 +162,7 @@ Error: ${message}` };
152
162
  "",
153
163
  "Fix: re-run migration with a project path to install as a project plugin:",
154
164
  " flockbay unreal-mcp migrate --engine-root <ENGINE_ROOT> --project <PATH_TO_.UPROJECT> --remove-legacy"
155
- ].join("\n")
165
+ ].join("\n") + disabledMeta
156
166
  };
157
167
  }
158
168
  const installed = installUnrealMcpPluginToEngine(engineRoot);
@@ -2,7 +2,7 @@
2
2
 
3
3
  var fs = require('node:fs');
4
4
  var path = require('node:path');
5
- var types = require('./types-DNr0xwSy.cjs');
5
+ var types = require('./types-5z8UADAi.cjs');
6
6
  require('axios');
7
7
  require('node:os');
8
8
  require('node:events');
@@ -143,9 +143,19 @@ Error: ${message}` };
143
143
  if (projectUprojectPath) {
144
144
  const installedProject = types.installUnrealMcpPluginToProject(projectUprojectPath);
145
145
  if (!installedProject.ok) return { ok: false, errorMessage: installedProject.errorMessage };
146
+ if (types.isInstalledEngineRoot(engineRoot)) {
147
+ const quarantine = types.quarantineLegacyEnginePlugins(engineRoot);
148
+ if (!quarantine.ok) return { ok: false, errorMessage: quarantine.errorMessage };
149
+ }
146
150
  return { ok: true, installedDestDir: installedProject.destDir, changedProjectPath, removedLegacyPluginDirs };
147
151
  }
148
152
  if (types.isInstalledEngineRoot(engineRoot)) {
153
+ const quarantine = types.quarantineLegacyEnginePlugins(engineRoot);
154
+ if (!quarantine.ok) return { ok: false, errorMessage: quarantine.errorMessage };
155
+ const disabledMeta = quarantine.disabledUpluginPaths.length ? `
156
+
157
+ Detected and disabled legacy engine plugin descriptor(s) to unblock builds:
158
+ ` + quarantine.disabledUpluginPaths.map((p) => `- ${p}`).join("\n") : "";
149
159
  return {
150
160
  ok: false,
151
161
  errorMessage: [
@@ -154,7 +164,7 @@ Error: ${message}` };
154
164
  "",
155
165
  "Fix: re-run migration with a project path to install as a project plugin:",
156
166
  " flockbay unreal-mcp migrate --engine-root <ENGINE_ROOT> --project <PATH_TO_.UPROJECT> --remove-legacy"
157
- ].join("\n")
167
+ ].join("\n") + disabledMeta
158
168
  };
159
169
  }
160
170
  const installed = types.installUnrealMcpPluginToEngine(engineRoot);
@@ -2,7 +2,7 @@
2
2
 
3
3
  var ink = require('ink');
4
4
  var React = require('react');
5
- var types = require('./types-DNr0xwSy.cjs');
5
+ var types = require('./types-5z8UADAi.cjs');
6
6
  var index_js = require('@modelcontextprotocol/sdk/client/index.js');
7
7
  var z = require('zod');
8
8
  var types_js = require('@modelcontextprotocol/sdk/types.js');
@@ -16,7 +16,7 @@ var process$1 = require('node:process');
16
16
  var node_stream = require('node:stream');
17
17
  var stdio_js$1 = require('@modelcontextprotocol/sdk/client/stdio.js');
18
18
  var stdio_js = require('@modelcontextprotocol/sdk/shared/stdio.js');
19
- var index = require('./index-r3VTdgFI.cjs');
19
+ var index = require('./index-IntvnrmZ.cjs');
20
20
  require('axios');
21
21
  require('node:events');
22
22
  require('socket.io-client');
@@ -2350,38 +2350,50 @@ function hashCodexSessionModeFromEnhancedMode(mode) {
2350
2350
  }
2351
2351
 
2352
2352
  const MIN_CODEX_CLI_FOR_GPT_53_CODEX = { major: 0, minor: 104, patch: 0 };
2353
- function readCodexAuthIsChatGptAccount() {
2354
- try {
2355
- const authPath = path.join(os.homedir(), ".codex", "auth.json");
2356
- const raw = fs.readFileSync(authPath, "utf8");
2357
- const parsed = JSON.parse(raw);
2358
- const accessToken = parsed?.tokens?.access_token;
2359
- if (typeof accessToken !== "string" || !accessToken) return false;
2360
- return Boolean(parsed?.tokens?.account_id) && parsed?.OPENAI_API_KEY === null;
2361
- } catch {
2362
- return false;
2353
+ function normalizeLegacyModelAlias(model) {
2354
+ const trimmed = String(model || "").trim();
2355
+ if (!trimmed) return "";
2356
+ switch (trimmed) {
2357
+ case "gpt-5":
2358
+ case "gpt-5-minimal":
2359
+ case "gpt-5-low":
2360
+ return "gpt-5.4-low";
2361
+ case "gpt-5-medium":
2362
+ return "gpt-5.4-medium";
2363
+ case "gpt-5-high":
2364
+ return "gpt-5.4-high";
2365
+ case "gpt-5-codex":
2366
+ case "gpt-5-codex-low":
2367
+ return "gpt-5.3-codex-low";
2368
+ case "gpt-5-codex-medium":
2369
+ return "gpt-5.3-codex-medium";
2370
+ case "gpt-5-codex-high":
2371
+ return "gpt-5.3-codex-high";
2372
+ default:
2373
+ return trimmed;
2363
2374
  }
2364
2375
  }
2365
2376
  function parseEffortSuffix(model) {
2366
2377
  const m = String(model || "").trim();
2367
2378
  if (!m) return null;
2379
+ if (m.endsWith("-xhigh")) return "xhigh";
2368
2380
  if (m.endsWith("-low")) return "low";
2369
2381
  if (m.endsWith("-medium")) return "medium";
2370
2382
  if (m.endsWith("-high")) return "high";
2371
2383
  return null;
2372
2384
  }
2373
2385
  function parseCodexModelTarget(model) {
2374
- const trimmed = String(model || "").trim();
2386
+ const trimmed = normalizeLegacyModelAlias(model);
2375
2387
  if (!trimmed) return null;
2376
- if (trimmed === "gpt-5-minimal" || trimmed === "gpt-5-low" || trimmed === "gpt-5-medium" || trimmed === "gpt-5-high" || trimmed === "gpt-5-codex" || trimmed.startsWith("gpt-5-codex-") || trimmed === "gpt-5.3-codex" || trimmed.startsWith("gpt-5.3-codex-")) {
2377
- if (trimmed === "gpt-5-codex" || trimmed.startsWith("gpt-5-codex-")) return "gpt-5.2-codex";
2388
+ const isGpt54ReasoningToken = trimmed === "gpt-5.4" || trimmed === "gpt-5.4-low" || trimmed === "gpt-5.4-medium" || trimmed === "gpt-5.4-high" || trimmed === "gpt-5.4-xhigh";
2389
+ if (isGpt54ReasoningToken || trimmed === "gpt-5.3-codex" || trimmed.startsWith("gpt-5.3-codex-")) {
2378
2390
  if (trimmed === "gpt-5.3-codex" || trimmed.startsWith("gpt-5.3-codex-")) return "gpt-5.3-codex";
2379
- return "gpt-5.2";
2391
+ return "gpt-5.4";
2380
2392
  }
2381
2393
  return null;
2382
2394
  }
2383
2395
  function resolveCodexModelOverride(rawModel) {
2384
- const model = typeof rawModel === "string" ? rawModel.trim() : "";
2396
+ const model = normalizeLegacyModelAlias(typeof rawModel === "string" ? rawModel.trim() : "");
2385
2397
  if (!model) return {};
2386
2398
  const effort = parseEffortSuffix(model);
2387
2399
  const codexModelTarget = parseCodexModelTarget(model);
@@ -2401,12 +2413,6 @@ function resolveCodexModelOverride(rawModel) {
2401
2413
  }
2402
2414
  };
2403
2415
  }
2404
- const isChatGptAuth = readCodexAuthIsChatGptAccount();
2405
- if (!isChatGptAuth) return { config: { model } };
2406
- if (model.startsWith("gpt-5-")) {
2407
- const nextEffort = effort ?? "medium";
2408
- return { config: { model: "gpt-5.2", model_reasoning_effort: nextEffort } };
2409
- }
2410
2416
  return { config: { model } };
2411
2417
  }
2412
2418
 
@@ -3771,6 +3777,11 @@ Error: ${message}`,
3771
3777
  }
3772
3778
  messageBuffer.addMessage(message.message, "user");
3773
3779
  currentModeHash = message.hash;
3780
+ if (!thinking) {
3781
+ types.logger.debug("thinking started (turn begin)");
3782
+ thinking = true;
3783
+ session.keepAlive(thinking, "remote");
3784
+ }
3774
3785
  let skipAutoFinalize = false;
3775
3786
  let turnCleanupExecIsError = false;
3776
3787
  let turnCleanupExecReason = "turn_cleanup";
@@ -1,6 +1,6 @@
1
1
  import { useStdout, useInput, Box, Text, render } from 'ink';
2
2
  import React, { useState, useRef, useEffect, useCallback } from 'react';
3
- import { l as logger, A as ApiClient, p as packageJson, c as configuration, r as readSettings, e as projectPath } from './types-BRJuZQj_.mjs';
3
+ import { l as logger, A as ApiClient, p as packageJson, c as configuration, r as readSettings, e as projectPath } from './types-Bgzap7qR.mjs';
4
4
  import { Client } from '@modelcontextprotocol/sdk/client/index.js';
5
5
  import { z } from 'zod';
6
6
  import { ElicitRequestSchema } from '@modelcontextprotocol/sdk/types.js';
@@ -14,7 +14,7 @@ import process$1 from 'node:process';
14
14
  import { PassThrough } from 'node:stream';
15
15
  import { getDefaultEnvironment } from '@modelcontextprotocol/sdk/client/stdio.js';
16
16
  import { ReadBuffer, serializeMessage } from '@modelcontextprotocol/sdk/shared/stdio.js';
17
- import { s as shouldCountToolCall, c as consumeToolQuota, f as formatQuotaDeniedReason, h as hashObject, e as enforceCliVersionPolicy, i as initialMachineMetadata, E as ElicitationHub, n as notifyDaemonSessionStarted, M as MessageQueue2, P as PLATFORM_SYSTEM_PROMPT, a as setLatestUserImages, w as withUserImagesMarker, r as registerKillSessionHandler, b as MessageBuffer, d as startFlockbayServer, g as buildProjectCapsule, t as trimIdent, j as autoFinalizeCoordinationWorkItem, k as detectScreenshotsForGate, l as applyCoordinationSideEffectsFromMcpToolResult, m as stopCaffeinate } from './index-D8AeVbvv.mjs';
17
+ import { s as shouldCountToolCall, c as consumeToolQuota, f as formatQuotaDeniedReason, h as hashObject, e as enforceCliVersionPolicy, i as initialMachineMetadata, E as ElicitationHub, n as notifyDaemonSessionStarted, M as MessageQueue2, P as PLATFORM_SYSTEM_PROMPT, a as setLatestUserImages, w as withUserImagesMarker, r as registerKillSessionHandler, b as MessageBuffer, d as startFlockbayServer, g as buildProjectCapsule, t as trimIdent, j as autoFinalizeCoordinationWorkItem, k as detectScreenshotsForGate, l as applyCoordinationSideEffectsFromMcpToolResult, m as stopCaffeinate } from './index-wkeSi0iC.mjs';
18
18
  import 'axios';
19
19
  import 'node:events';
20
20
  import 'socket.io-client';
@@ -2348,38 +2348,50 @@ function hashCodexSessionModeFromEnhancedMode(mode) {
2348
2348
  }
2349
2349
 
2350
2350
  const MIN_CODEX_CLI_FOR_GPT_53_CODEX = { major: 0, minor: 104, patch: 0 };
2351
- function readCodexAuthIsChatGptAccount() {
2352
- try {
2353
- const authPath = path__default.join(os__default.homedir(), ".codex", "auth.json");
2354
- const raw = fs__default.readFileSync(authPath, "utf8");
2355
- const parsed = JSON.parse(raw);
2356
- const accessToken = parsed?.tokens?.access_token;
2357
- if (typeof accessToken !== "string" || !accessToken) return false;
2358
- return Boolean(parsed?.tokens?.account_id) && parsed?.OPENAI_API_KEY === null;
2359
- } catch {
2360
- return false;
2351
+ function normalizeLegacyModelAlias(model) {
2352
+ const trimmed = String(model || "").trim();
2353
+ if (!trimmed) return "";
2354
+ switch (trimmed) {
2355
+ case "gpt-5":
2356
+ case "gpt-5-minimal":
2357
+ case "gpt-5-low":
2358
+ return "gpt-5.4-low";
2359
+ case "gpt-5-medium":
2360
+ return "gpt-5.4-medium";
2361
+ case "gpt-5-high":
2362
+ return "gpt-5.4-high";
2363
+ case "gpt-5-codex":
2364
+ case "gpt-5-codex-low":
2365
+ return "gpt-5.3-codex-low";
2366
+ case "gpt-5-codex-medium":
2367
+ return "gpt-5.3-codex-medium";
2368
+ case "gpt-5-codex-high":
2369
+ return "gpt-5.3-codex-high";
2370
+ default:
2371
+ return trimmed;
2361
2372
  }
2362
2373
  }
2363
2374
  function parseEffortSuffix(model) {
2364
2375
  const m = String(model || "").trim();
2365
2376
  if (!m) return null;
2377
+ if (m.endsWith("-xhigh")) return "xhigh";
2366
2378
  if (m.endsWith("-low")) return "low";
2367
2379
  if (m.endsWith("-medium")) return "medium";
2368
2380
  if (m.endsWith("-high")) return "high";
2369
2381
  return null;
2370
2382
  }
2371
2383
  function parseCodexModelTarget(model) {
2372
- const trimmed = String(model || "").trim();
2384
+ const trimmed = normalizeLegacyModelAlias(model);
2373
2385
  if (!trimmed) return null;
2374
- if (trimmed === "gpt-5-minimal" || trimmed === "gpt-5-low" || trimmed === "gpt-5-medium" || trimmed === "gpt-5-high" || trimmed === "gpt-5-codex" || trimmed.startsWith("gpt-5-codex-") || trimmed === "gpt-5.3-codex" || trimmed.startsWith("gpt-5.3-codex-")) {
2375
- if (trimmed === "gpt-5-codex" || trimmed.startsWith("gpt-5-codex-")) return "gpt-5.2-codex";
2386
+ const isGpt54ReasoningToken = trimmed === "gpt-5.4" || trimmed === "gpt-5.4-low" || trimmed === "gpt-5.4-medium" || trimmed === "gpt-5.4-high" || trimmed === "gpt-5.4-xhigh";
2387
+ if (isGpt54ReasoningToken || trimmed === "gpt-5.3-codex" || trimmed.startsWith("gpt-5.3-codex-")) {
2376
2388
  if (trimmed === "gpt-5.3-codex" || trimmed.startsWith("gpt-5.3-codex-")) return "gpt-5.3-codex";
2377
- return "gpt-5.2";
2389
+ return "gpt-5.4";
2378
2390
  }
2379
2391
  return null;
2380
2392
  }
2381
2393
  function resolveCodexModelOverride(rawModel) {
2382
- const model = typeof rawModel === "string" ? rawModel.trim() : "";
2394
+ const model = normalizeLegacyModelAlias(typeof rawModel === "string" ? rawModel.trim() : "");
2383
2395
  if (!model) return {};
2384
2396
  const effort = parseEffortSuffix(model);
2385
2397
  const codexModelTarget = parseCodexModelTarget(model);
@@ -2399,12 +2411,6 @@ function resolveCodexModelOverride(rawModel) {
2399
2411
  }
2400
2412
  };
2401
2413
  }
2402
- const isChatGptAuth = readCodexAuthIsChatGptAccount();
2403
- if (!isChatGptAuth) return { config: { model } };
2404
- if (model.startsWith("gpt-5-")) {
2405
- const nextEffort = effort ?? "medium";
2406
- return { config: { model: "gpt-5.2", model_reasoning_effort: nextEffort } };
2407
- }
2408
2414
  return { config: { model } };
2409
2415
  }
2410
2416
 
@@ -3769,6 +3775,11 @@ Error: ${message}`,
3769
3775
  }
3770
3776
  messageBuffer.addMessage(message.message, "user");
3771
3777
  currentModeHash = message.hash;
3778
+ if (!thinking) {
3779
+ logger.debug("thinking started (turn begin)");
3780
+ thinking = true;
3781
+ session.keepAlive(thinking, "remote");
3782
+ }
3772
3783
  let skipAutoFinalize = false;
3773
3784
  let turnCleanupExecIsError = false;
3774
3785
  let turnCleanupExecReason = "turn_cleanup";
@@ -4,8 +4,8 @@ import { randomUUID, createHash } from 'node:crypto';
4
4
  import os__default from 'node:os';
5
5
  import path__default, { resolve, join as join$1, basename } from 'node:path';
6
6
  import { mkdir, writeFile, readFile } from 'node:fs/promises';
7
- import { l as logger, p as packageJson, A as ApiClient, c as configuration, r as readSettings, e as projectPath } from './types-BRJuZQj_.mjs';
8
- import { s as shouldCountToolCall, c as consumeToolQuota, f as formatQuotaDeniedReason, h as hashObject, e as enforceCliVersionPolicy, i as initialMachineMetadata, n as notifyDaemonSessionStarted, M as MessageQueue2, g as buildProjectCapsule, a as setLatestUserImages, b as MessageBuffer, w as withUserImagesMarker, r as registerKillSessionHandler, d as startFlockbayServer, o as extractUserImagesMarker, p as getLatestUserImages, P as PLATFORM_SYSTEM_PROMPT, j as autoFinalizeCoordinationWorkItem, E as ElicitationHub, k as detectScreenshotsForGate, m as stopCaffeinate } from './index-D8AeVbvv.mjs';
7
+ import { l as logger, p as packageJson, A as ApiClient, c as configuration, r as readSettings, e as projectPath } from './types-Bgzap7qR.mjs';
8
+ import { s as shouldCountToolCall, c as consumeToolQuota, f as formatQuotaDeniedReason, h as hashObject, e as enforceCliVersionPolicy, i as initialMachineMetadata, n as notifyDaemonSessionStarted, M as MessageQueue2, g as buildProjectCapsule, a as setLatestUserImages, b as MessageBuffer, w as withUserImagesMarker, r as registerKillSessionHandler, d as startFlockbayServer, o as extractUserImagesMarker, p as getLatestUserImages, P as PLATFORM_SYSTEM_PROMPT, j as autoFinalizeCoordinationWorkItem, E as ElicitationHub, k as detectScreenshotsForGate, m as stopCaffeinate } from './index-wkeSi0iC.mjs';
9
9
  import { spawn, spawnSync } from 'node:child_process';
10
10
  import { ndJsonStream, ClientSideConnection } from '@agentclientprotocol/sdk';
11
11
  import { existsSync, readFileSync, mkdirSync, writeFileSync } from 'fs';
@@ -6,8 +6,8 @@ var node_crypto = require('node:crypto');
6
6
  var os = require('node:os');
7
7
  var path = require('node:path');
8
8
  var fs$2 = require('node:fs/promises');
9
- var types = require('./types-DNr0xwSy.cjs');
10
- var index = require('./index-r3VTdgFI.cjs');
9
+ var types = require('./types-5z8UADAi.cjs');
10
+ var index = require('./index-IntvnrmZ.cjs');
11
11
  var node_child_process = require('node:child_process');
12
12
  var sdk = require('@agentclientprotocol/sdk');
13
13
  var fs = require('fs');