flockbay 0.10.48 → 0.10.49

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.
@@ -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, b as projectPath, d as backoff, e as delay, R as RawJSONLinesSchema, c as configuration, f as readDaemonState, g as clearDaemonState, p as packageJson, r as readSettings, h as readCredentials, u as updateSettings, o as openBrowser, w as writeCredentials, j as unrealMcpPythonDir, k as acquireDaemonLock, m as writeDaemonState, n as ApiMachineClient, q as releaseDaemonLock, s as sendUnrealMcpTcpCommand, A as ApiClient, v as validatePath, t as run, x as run$1, y as buildShellInvocation, z as clearCredentials, B as clearMachineId, C as authenticateCodex, D as syncCodexCliAuth, E as authenticateClaude, F as authenticateGemini, i as installUnrealMcpPluginToEngine, G as buildAndInstallUnrealMcpPlugin, H as installUnrealMcpPluginToProject, I as getLatestDaemonLog, J as normalizeServerUrlForNode } from './types-KJ7kAYwk.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, 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';
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';
@@ -15190,7 +15190,7 @@ async function authAndSetupMachineIfNeeded() {
15190
15190
  process.exit(1);
15191
15191
  }
15192
15192
  try {
15193
- const { migrateUnrealMcpToFlockbayMcp } = await import('./migratePlugin-BPUAeqI_.mjs');
15193
+ const { migrateUnrealMcpToFlockbayMcp } = await import('./migratePlugin-CEvGPul8.mjs');
15194
15194
  const result = migrateUnrealMcpToFlockbayMcp({
15195
15195
  engineRoot,
15196
15196
  projectUprojectPath: project || void 0,
@@ -15300,19 +15300,36 @@ async function authAndSetupMachineIfNeeded() {
15300
15300
  if (!parsed.skipUnreal) {
15301
15301
  const engineRoot = readArgValue(startArgs, "--engine-root") || (process.env.UE_ENGINE_ROOT || "").trim() || (process.env.ENGINE_ROOT || "").trim() || null;
15302
15302
  if (engineRoot) {
15303
- const shouldInstall = await promptYesNo(`Install Flockbay MCP plugin into this Unreal Engine folder?
15304
- ${engineRoot}`, {
15305
- defaultYes: true
15306
- });
15307
- if (shouldInstall) {
15308
- const result = installUnrealMcpPluginToEngine(engineRoot);
15309
- if (result.ok) {
15310
- console.log(`Flockbay MCP plugin installed: ${result.destDir}`);
15311
- process.env.FLOCKBAY_UNREAL_MCP_ENABLED = "1";
15312
- process.env.ENGINE_ROOT = engineRoot;
15313
- } else {
15314
- console.error(chalk.yellow("Flockbay MCP plugin install skipped:"));
15315
- console.error(chalk.gray(result.errorMessage));
15303
+ const installedEngine = isInstalledEngineRoot(engineRoot);
15304
+ const detection = await detectUnrealProject(process.cwd());
15305
+ const uproject = detection.ok ? detection.uprojectFile : null;
15306
+ const promptTarget = installedEngine ? uproject ? `Install Flockbay MCP plugin into this Unreal project?
15307
+ ${uproject}` : null : `Install Flockbay MCP plugin into this Unreal Engine folder?
15308
+ ${engineRoot}`;
15309
+ if (installedEngine && !uproject) {
15310
+ console.error(chalk.yellow("Unreal MCP plugin install skipped:"));
15311
+ console.error(
15312
+ chalk.gray(
15313
+ [
15314
+ "This engine appears to be an Installed Build (Epic Launcher).",
15315
+ "Engine-scope install can break builds. Run `flockbay start` from a project folder, or pass --project <path> to install as a project plugin."
15316
+ ].join("\n")
15317
+ )
15318
+ );
15319
+ } else {
15320
+ const shouldInstall = await promptYesNo(promptTarget, {
15321
+ defaultYes: true
15322
+ });
15323
+ if (shouldInstall) {
15324
+ const result = installedEngine && uproject ? installUnrealMcpPluginToProject(uproject) : installUnrealMcpPluginToEngine(engineRoot);
15325
+ if (result.ok) {
15326
+ console.log(`Flockbay MCP plugin installed: ${result.destDir}`);
15327
+ process.env.FLOCKBAY_UNREAL_MCP_ENABLED = "1";
15328
+ process.env.ENGINE_ROOT = engineRoot;
15329
+ } else {
15330
+ console.error(chalk.yellow("Flockbay MCP plugin install skipped:"));
15331
+ console.error(chalk.gray(result.errorMessage));
15332
+ }
15316
15333
  }
15317
15334
  }
15318
15335
  }
@@ -15329,7 +15346,7 @@ ${engineRoot}`, {
15329
15346
  } else if (subcommand === "codex") {
15330
15347
  try {
15331
15348
  await chdirToNearestUprojectRootIfPresent();
15332
- const { runCodex } = await import('./runCodex-BkdEucuI.mjs');
15349
+ const { runCodex } = await import('./runCodex-ZfUyhHF6.mjs');
15333
15350
  let startedBy = void 0;
15334
15351
  let sessionId = void 0;
15335
15352
  for (let i = 1; i < args.length; i++) {
@@ -15431,7 +15448,7 @@ ${engineRoot}`, {
15431
15448
  }
15432
15449
  try {
15433
15450
  await chdirToNearestUprojectRootIfPresent();
15434
- const { runGemini } = await import('./runGemini-p_aKQRTi.mjs');
15451
+ const { runGemini } = await import('./runGemini-DBU1mMdp.mjs');
15435
15452
  let startedBy = void 0;
15436
15453
  let sessionId = void 0;
15437
15454
  for (let i = 1; i < args.length; i++) {
@@ -3,7 +3,7 @@
3
3
  var chalk = require('chalk');
4
4
  var os = require('node:os');
5
5
  var node_crypto = require('node:crypto');
6
- var types = require('./types-DbQtXaZC.cjs');
6
+ var types = require('./types-DNr0xwSy.cjs');
7
7
  var node_child_process = require('node:child_process');
8
8
  var path = require('node:path');
9
9
  var node_readline = require('node:readline');
@@ -1319,7 +1319,7 @@ function buildDaemonSafeEnv(baseEnv, binPath) {
1319
1319
  env[pathKey] = [...prepend, ...existingParts].join(pathSep);
1320
1320
  return env;
1321
1321
  }
1322
- const __filename$1 = node_url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index-jd6DaTy_.cjs', document.baseURI).href)));
1322
+ const __filename$1 = node_url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index-r3VTdgFI.cjs', document.baseURI).href)));
1323
1323
  const __dirname$1 = path.join(__filename$1, "..");
1324
1324
  function getGlobalClaudeVersion(claudeExecutable) {
1325
1325
  try {
@@ -15212,7 +15212,7 @@ async function authAndSetupMachineIfNeeded() {
15212
15212
  process.exit(1);
15213
15213
  }
15214
15214
  try {
15215
- const { migrateUnrealMcpToFlockbayMcp } = await Promise.resolve().then(function () { return require('./migratePlugin-CyWWA8GW.cjs'); });
15215
+ const { migrateUnrealMcpToFlockbayMcp } = await Promise.resolve().then(function () { return require('./migratePlugin-wFK-k3Wk.cjs'); });
15216
15216
  const result = migrateUnrealMcpToFlockbayMcp({
15217
15217
  engineRoot,
15218
15218
  projectUprojectPath: project || void 0,
@@ -15322,19 +15322,36 @@ async function authAndSetupMachineIfNeeded() {
15322
15322
  if (!parsed.skipUnreal) {
15323
15323
  const engineRoot = readArgValue(startArgs, "--engine-root") || (process.env.UE_ENGINE_ROOT || "").trim() || (process.env.ENGINE_ROOT || "").trim() || null;
15324
15324
  if (engineRoot) {
15325
- const shouldInstall = await promptYesNo(`Install Flockbay MCP plugin into this Unreal Engine folder?
15326
- ${engineRoot}`, {
15327
- defaultYes: true
15328
- });
15329
- if (shouldInstall) {
15330
- const result = types.installUnrealMcpPluginToEngine(engineRoot);
15331
- if (result.ok) {
15332
- console.log(`Flockbay MCP plugin installed: ${result.destDir}`);
15333
- process.env.FLOCKBAY_UNREAL_MCP_ENABLED = "1";
15334
- process.env.ENGINE_ROOT = engineRoot;
15335
- } else {
15336
- console.error(chalk.yellow("Flockbay MCP plugin install skipped:"));
15337
- console.error(chalk.gray(result.errorMessage));
15325
+ const installedEngine = types.isInstalledEngineRoot(engineRoot);
15326
+ const detection = await detectUnrealProject(process.cwd());
15327
+ const uproject = detection.ok ? detection.uprojectFile : null;
15328
+ const promptTarget = installedEngine ? uproject ? `Install Flockbay MCP plugin into this Unreal project?
15329
+ ${uproject}` : null : `Install Flockbay MCP plugin into this Unreal Engine folder?
15330
+ ${engineRoot}`;
15331
+ if (installedEngine && !uproject) {
15332
+ console.error(chalk.yellow("Unreal MCP plugin install skipped:"));
15333
+ console.error(
15334
+ chalk.gray(
15335
+ [
15336
+ "This engine appears to be an Installed Build (Epic Launcher).",
15337
+ "Engine-scope install can break builds. Run `flockbay start` from a project folder, or pass --project <path> to install as a project plugin."
15338
+ ].join("\n")
15339
+ )
15340
+ );
15341
+ } else {
15342
+ const shouldInstall = await promptYesNo(promptTarget, {
15343
+ defaultYes: true
15344
+ });
15345
+ if (shouldInstall) {
15346
+ const result = installedEngine && uproject ? types.installUnrealMcpPluginToProject(uproject) : types.installUnrealMcpPluginToEngine(engineRoot);
15347
+ if (result.ok) {
15348
+ console.log(`Flockbay MCP plugin installed: ${result.destDir}`);
15349
+ process.env.FLOCKBAY_UNREAL_MCP_ENABLED = "1";
15350
+ process.env.ENGINE_ROOT = engineRoot;
15351
+ } else {
15352
+ console.error(chalk.yellow("Flockbay MCP plugin install skipped:"));
15353
+ console.error(chalk.gray(result.errorMessage));
15354
+ }
15338
15355
  }
15339
15356
  }
15340
15357
  }
@@ -15351,7 +15368,7 @@ ${engineRoot}`, {
15351
15368
  } else if (subcommand === "codex") {
15352
15369
  try {
15353
15370
  await chdirToNearestUprojectRootIfPresent();
15354
- const { runCodex } = await Promise.resolve().then(function () { return require('./runCodex-D8On-xj7.cjs'); });
15371
+ const { runCodex } = await Promise.resolve().then(function () { return require('./runCodex-DuyuYqoB.cjs'); });
15355
15372
  let startedBy = void 0;
15356
15373
  let sessionId = void 0;
15357
15374
  for (let i = 1; i < args.length; i++) {
@@ -15453,7 +15470,7 @@ ${engineRoot}`, {
15453
15470
  }
15454
15471
  try {
15455
15472
  await chdirToNearestUprojectRootIfPresent();
15456
- const { runGemini } = await Promise.resolve().then(function () { return require('./runGemini-BPLO-OFS.cjs'); });
15473
+ const { runGemini } = await Promise.resolve().then(function () { return require('./runGemini-D7j5Y5TF.cjs'); });
15457
15474
  let startedBy = void 0;
15458
15475
  let sessionId = void 0;
15459
15476
  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-jd6DaTy_.cjs');
5
- require('./types-DbQtXaZC.cjs');
4
+ require('./index-r3VTdgFI.cjs');
5
+ require('./types-DNr0xwSy.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-BLsRYyPq.mjs';
3
- import './types-KJ7kAYwk.mjs';
2
+ import './index-D8AeVbvv.mjs';
3
+ import './types-BRJuZQj_.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-DbQtXaZC.cjs');
3
+ var types = require('./types-DNr0xwSy.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-KJ7kAYwk.mjs';
1
+ export { A as ApiClient, a as ApiSessionClient, R as RawJSONLinesSchema, c as configuration, l as logger } from './types-BRJuZQj_.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 installUnrealMcpPluginToEngine } from './types-KJ7kAYwk.mjs';
3
+ import { i as installUnrealMcpPluginToProject, b as isInstalledEngineRoot, d as installUnrealMcpPluginToEngine } from './types-BRJuZQj_.mjs';
4
4
  import 'axios';
5
5
  import 'node:os';
6
6
  import 'node:events';
@@ -138,6 +138,23 @@ Error: ${message}` };
138
138
  }
139
139
  }
140
140
  }
141
+ if (projectUprojectPath) {
142
+ const installedProject = installUnrealMcpPluginToProject(projectUprojectPath);
143
+ if (!installedProject.ok) return { ok: false, errorMessage: installedProject.errorMessage };
144
+ return { ok: true, installedDestDir: installedProject.destDir, changedProjectPath, removedLegacyPluginDirs };
145
+ }
146
+ if (isInstalledEngineRoot(engineRoot)) {
147
+ return {
148
+ ok: false,
149
+ errorMessage: [
150
+ "This Unreal Engine install appears to be an Installed Build (Epic Launcher / precompiled engine).",
151
+ "Engine-scope install of a source-only plugin can break builds.",
152
+ "",
153
+ "Fix: re-run migration with a project path to install as a project plugin:",
154
+ " flockbay unreal-mcp migrate --engine-root <ENGINE_ROOT> --project <PATH_TO_.UPROJECT> --remove-legacy"
155
+ ].join("\n")
156
+ };
157
+ }
141
158
  const installed = installUnrealMcpPluginToEngine(engineRoot);
142
159
  if (!installed.ok) return installed;
143
160
  return { ok: true, installedDestDir: installed.destDir, changedProjectPath, removedLegacyPluginDirs };
@@ -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-DbQtXaZC.cjs');
5
+ var types = require('./types-DNr0xwSy.cjs');
6
6
  require('axios');
7
7
  require('node:os');
8
8
  require('node:events');
@@ -140,6 +140,23 @@ Error: ${message}` };
140
140
  }
141
141
  }
142
142
  }
143
+ if (projectUprojectPath) {
144
+ const installedProject = types.installUnrealMcpPluginToProject(projectUprojectPath);
145
+ if (!installedProject.ok) return { ok: false, errorMessage: installedProject.errorMessage };
146
+ return { ok: true, installedDestDir: installedProject.destDir, changedProjectPath, removedLegacyPluginDirs };
147
+ }
148
+ if (types.isInstalledEngineRoot(engineRoot)) {
149
+ return {
150
+ ok: false,
151
+ errorMessage: [
152
+ "This Unreal Engine install appears to be an Installed Build (Epic Launcher / precompiled engine).",
153
+ "Engine-scope install of a source-only plugin can break builds.",
154
+ "",
155
+ "Fix: re-run migration with a project path to install as a project plugin:",
156
+ " flockbay unreal-mcp migrate --engine-root <ENGINE_ROOT> --project <PATH_TO_.UPROJECT> --remove-legacy"
157
+ ].join("\n")
158
+ };
159
+ }
143
160
  const installed = types.installUnrealMcpPluginToEngine(engineRoot);
144
161
  if (!installed.ok) return installed;
145
162
  return { ok: true, installedDestDir: installed.destDir, changedProjectPath, removedLegacyPluginDirs };
@@ -2,7 +2,7 @@
2
2
 
3
3
  var ink = require('ink');
4
4
  var React = require('react');
5
- var types = require('./types-DbQtXaZC.cjs');
5
+ var types = require('./types-DNr0xwSy.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-jd6DaTy_.cjs');
19
+ var index = require('./index-r3VTdgFI.cjs');
20
20
  require('axios');
21
21
  require('node:events');
22
22
  require('socket.io-client');
@@ -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, b as projectPath } from './types-KJ7kAYwk.mjs';
3
+ import { l as logger, A as ApiClient, p as packageJson, c as configuration, r as readSettings, e as projectPath } from './types-BRJuZQj_.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-BLsRYyPq.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-D8AeVbvv.mjs';
18
18
  import 'axios';
19
19
  import 'node:events';
20
20
  import 'socket.io-client';
@@ -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-DbQtXaZC.cjs');
10
- var index = require('./index-jd6DaTy_.cjs');
9
+ var types = require('./types-DNr0xwSy.cjs');
10
+ var index = require('./index-r3VTdgFI.cjs');
11
11
  var node_child_process = require('node:child_process');
12
12
  var sdk = require('@agentclientprotocol/sdk');
13
13
  var fs = require('fs');
@@ -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, b as projectPath } from './types-KJ7kAYwk.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-BLsRYyPq.mjs';
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';
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';
@@ -23,7 +23,7 @@ import { createServer } from 'http';
23
23
  import open$2 from 'open';
24
24
 
25
25
  var name = "flockbay";
26
- var version = "0.10.48";
26
+ var version = "0.10.49";
27
27
  var description = "Flockbay CLI (local agent + daemon)";
28
28
  var author = "Eduardo Orellana";
29
29
  var license = "UNLICENSED";
@@ -3455,6 +3455,14 @@ function createBackoff(opts) {
3455
3455
  }
3456
3456
  let backoff = createBackoff();
3457
3457
 
3458
+ function isInstalledEngineRoot(engineRootRaw) {
3459
+ const engineRoot = String(engineRootRaw || "").trim();
3460
+ if (!engineRoot) return false;
3461
+ if (fs__default.existsSync(path__default.join(engineRoot, "Engine", "Build", "InstalledBuild.txt"))) return true;
3462
+ if (fs__default.existsSync(path__default.join(engineRoot, "Engine", "Build", "InstalledBuild.xml"))) return true;
3463
+ return false;
3464
+ }
3465
+
3458
3466
  function looksLikeEngineRoot$1(engineRoot) {
3459
3467
  if (!engineRoot) return false;
3460
3468
  return fs__default.existsSync(path__default.join(engineRoot, "Engine")) && fs__default.existsSync(path__default.join(engineRoot, "Engine", "Plugins"));
@@ -3493,6 +3501,24 @@ function installUnrealMcpPluginToEngine(engineRootRaw) {
3493
3501
  errorMessage: `Invalid engine root (expected an Unreal Engine install folder containing Engine/\u2026): ${engineRoot || "(empty)"}`
3494
3502
  };
3495
3503
  }
3504
+ if (isInstalledEngineRoot(engineRoot)) {
3505
+ return {
3506
+ ok: false,
3507
+ errorMessage: [
3508
+ "This Unreal Engine install appears to be an Installed Build (Epic Launcher / precompiled engine).",
3509
+ "",
3510
+ "Installing a source-only plugin into Engine/Plugins can break builds with errors like:",
3511
+ ` Expecting to find a type to be declared in a module rules named 'FlockbayMCP' in 'UE5Rules'`,
3512
+ "",
3513
+ "Fix: install the Flockbay MCP plugin into your project instead:",
3514
+ " <YourProject>/Plugins/FlockbayMCP",
3515
+ "",
3516
+ "If you are using the Flockbay UI/CLI, choose a project-scope install or pass a project path.",
3517
+ "Example:",
3518
+ " flockbay unreal-mcp migrate --engine-root <ENGINE_ROOT> --project <PATH_TO_.UPROJECT> --remove-legacy"
3519
+ ].join("\n")
3520
+ };
3521
+ }
3496
3522
  const srcDir = unrealMcpPluginSourceDir();
3497
3523
  if (!fs__default.existsSync(srcDir)) {
3498
3524
  return { ok: false, errorMessage: `Missing Flockbay MCP plugin source folder: ${srcDir}` };
@@ -4725,9 +4751,35 @@ class ApiMachineClient {
4725
4751
  const enginePluginDir = path__default.join(enginePluginsDir, "FlockbayMCP");
4726
4752
  const enginePluginUplugin = path__default.join(enginePluginDir, "FlockbayMCP.uplugin");
4727
4753
  const enginePluginHasBinaries = fs__default.existsSync(path__default.join(enginePluginDir, "Binaries"));
4728
- const shouldUseProject = scope === "project" || scope === "auto" && // If the engine plugin is already installed+built, keep using it (no project mutation).
4729
- !(fs__default.existsSync(enginePluginUplugin) && enginePluginHasBinaries) && // Otherwise, use a project-scope install when the engine folder isn't writable.
4730
- !canWriteDir(enginePluginsDir) && Boolean(projectUprojectPath);
4754
+ const installedEngine = isInstalledEngineRoot(engineRoot);
4755
+ if (scope === "engine" && installedEngine) {
4756
+ return {
4757
+ success: false,
4758
+ error: [
4759
+ "Refusing engine-scope install: this engine is an Installed Build (Epic Launcher / precompiled rules).",
4760
+ "Install the Flockbay MCP plugin into your project instead (recommended).",
4761
+ "Provide projectUprojectPath and use installScope=project, or installScope=auto."
4762
+ ].join("\n")
4763
+ };
4764
+ }
4765
+ if (scope === "auto" && installedEngine && !projectUprojectPath) {
4766
+ return {
4767
+ success: false,
4768
+ error: [
4769
+ "This engine is an Installed Build (Epic Launcher / precompiled rules).",
4770
+ "To avoid breaking Unreal builds, Flockbay must install the plugin into a project.",
4771
+ "Missing required param: projectUprojectPath"
4772
+ ].join("\n")
4773
+ };
4774
+ }
4775
+ const shouldUseProject = scope === "project" || scope === "auto" && (installedEngine ? (
4776
+ // Installed engines: always use project plugin install (even if an engine copy already exists).
4777
+ Boolean(projectUprojectPath)
4778
+ ) : (
4779
+ // Non-installed engines: if the engine plugin is already installed+built, keep using it (no project mutation).
4780
+ !(fs__default.existsSync(enginePluginUplugin) && enginePluginHasBinaries) && // Otherwise, use a project-scope install when the engine folder isn't writable.
4781
+ !canWriteDir(enginePluginsDir) && Boolean(projectUprojectPath)
4782
+ ));
4731
4783
  if (shouldUseProject) {
4732
4784
  if (!projectUprojectPath) return { success: false, error: "Missing projectUprojectPath (required for project-scope install)." };
4733
4785
  const installedProject = installUnrealMcpPluginToProject(projectUprojectPath);
@@ -5293,4 +5345,4 @@ const RawJSONLinesSchema = z$1.discriminatedUnion("type", [
5293
5345
  }).passthrough()
5294
5346
  ]);
5295
5347
 
5296
- export { ApiClient as A, clearMachineId as B, authenticateCodex as C, syncCodexCliAuth as D, authenticateClaude as E, authenticateGemini as F, buildAndInstallUnrealMcpPlugin as G, installUnrealMcpPluginToProject as H, getLatestDaemonLog as I, normalizeServerUrlForNode as J, RawJSONLinesSchema as R, ApiSessionClient as a, projectPath as b, configuration as c, backoff as d, delay as e, readDaemonState as f, clearDaemonState as g, readCredentials as h, installUnrealMcpPluginToEngine as i, unrealMcpPythonDir as j, acquireDaemonLock as k, logger as l, writeDaemonState as m, ApiMachineClient as n, openBrowser as o, packageJson as p, releaseDaemonLock as q, readSettings as r, sendUnrealMcpTcpCommand as s, run$1 as t, updateSettings as u, validatePath as v, writeCredentials as w, run as x, buildShellInvocation as y, clearCredentials as z };
5348
+ export { ApiClient as A, buildShellInvocation as B, clearCredentials as C, clearMachineId as D, authenticateCodex as E, syncCodexCliAuth as F, authenticateClaude as G, authenticateGemini as H, buildAndInstallUnrealMcpPlugin as I, getLatestDaemonLog as J, normalizeServerUrlForNode as K, RawJSONLinesSchema as R, ApiSessionClient as a, isInstalledEngineRoot as b, configuration as c, installUnrealMcpPluginToEngine as d, projectPath as e, backoff as f, delay as g, readDaemonState as h, installUnrealMcpPluginToProject as i, clearDaemonState as j, readCredentials as k, logger as l, unrealMcpPythonDir as m, acquireDaemonLock as n, openBrowser as o, packageJson as p, writeDaemonState as q, readSettings as r, ApiMachineClient as s, releaseDaemonLock as t, updateSettings as u, sendUnrealMcpTcpCommand as v, writeCredentials as w, validatePath as x, run$1 as y, run as z };
@@ -44,7 +44,7 @@ function _interopNamespaceDefault(e) {
44
44
  var z__namespace = /*#__PURE__*/_interopNamespaceDefault(z);
45
45
 
46
46
  var name = "flockbay";
47
- var version = "0.10.48";
47
+ var version = "0.10.49";
48
48
  var description = "Flockbay CLI (local agent + daemon)";
49
49
  var author = "Eduardo Orellana";
50
50
  var license = "UNLICENSED";
@@ -832,7 +832,7 @@ class RpcHandlerManager {
832
832
  }
833
833
  }
834
834
 
835
- const __dirname$1 = path$1.dirname(url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('types-DbQtXaZC.cjs', document.baseURI).href))));
835
+ const __dirname$1 = path$1.dirname(url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('types-DNr0xwSy.cjs', document.baseURI).href))));
836
836
  function projectPath() {
837
837
  const path = path$1.resolve(__dirname$1, "..");
838
838
  return path;
@@ -3476,6 +3476,14 @@ function createBackoff(opts) {
3476
3476
  }
3477
3477
  let backoff = createBackoff();
3478
3478
 
3479
+ function isInstalledEngineRoot(engineRootRaw) {
3480
+ const engineRoot = String(engineRootRaw || "").trim();
3481
+ if (!engineRoot) return false;
3482
+ if (fs.existsSync(path.join(engineRoot, "Engine", "Build", "InstalledBuild.txt"))) return true;
3483
+ if (fs.existsSync(path.join(engineRoot, "Engine", "Build", "InstalledBuild.xml"))) return true;
3484
+ return false;
3485
+ }
3486
+
3479
3487
  function looksLikeEngineRoot$1(engineRoot) {
3480
3488
  if (!engineRoot) return false;
3481
3489
  return fs.existsSync(path.join(engineRoot, "Engine")) && fs.existsSync(path.join(engineRoot, "Engine", "Plugins"));
@@ -3514,6 +3522,24 @@ function installUnrealMcpPluginToEngine(engineRootRaw) {
3514
3522
  errorMessage: `Invalid engine root (expected an Unreal Engine install folder containing Engine/\u2026): ${engineRoot || "(empty)"}`
3515
3523
  };
3516
3524
  }
3525
+ if (isInstalledEngineRoot(engineRoot)) {
3526
+ return {
3527
+ ok: false,
3528
+ errorMessage: [
3529
+ "This Unreal Engine install appears to be an Installed Build (Epic Launcher / precompiled engine).",
3530
+ "",
3531
+ "Installing a source-only plugin into Engine/Plugins can break builds with errors like:",
3532
+ ` Expecting to find a type to be declared in a module rules named 'FlockbayMCP' in 'UE5Rules'`,
3533
+ "",
3534
+ "Fix: install the Flockbay MCP plugin into your project instead:",
3535
+ " <YourProject>/Plugins/FlockbayMCP",
3536
+ "",
3537
+ "If you are using the Flockbay UI/CLI, choose a project-scope install or pass a project path.",
3538
+ "Example:",
3539
+ " flockbay unreal-mcp migrate --engine-root <ENGINE_ROOT> --project <PATH_TO_.UPROJECT> --remove-legacy"
3540
+ ].join("\n")
3541
+ };
3542
+ }
3517
3543
  const srcDir = unrealMcpPluginSourceDir();
3518
3544
  if (!fs.existsSync(srcDir)) {
3519
3545
  return { ok: false, errorMessage: `Missing Flockbay MCP plugin source folder: ${srcDir}` };
@@ -4746,9 +4772,35 @@ class ApiMachineClient {
4746
4772
  const enginePluginDir = path.join(enginePluginsDir, "FlockbayMCP");
4747
4773
  const enginePluginUplugin = path.join(enginePluginDir, "FlockbayMCP.uplugin");
4748
4774
  const enginePluginHasBinaries = fs.existsSync(path.join(enginePluginDir, "Binaries"));
4749
- const shouldUseProject = scope === "project" || scope === "auto" && // If the engine plugin is already installed+built, keep using it (no project mutation).
4750
- !(fs.existsSync(enginePluginUplugin) && enginePluginHasBinaries) && // Otherwise, use a project-scope install when the engine folder isn't writable.
4751
- !canWriteDir(enginePluginsDir) && Boolean(projectUprojectPath);
4775
+ const installedEngine = isInstalledEngineRoot(engineRoot);
4776
+ if (scope === "engine" && installedEngine) {
4777
+ return {
4778
+ success: false,
4779
+ error: [
4780
+ "Refusing engine-scope install: this engine is an Installed Build (Epic Launcher / precompiled rules).",
4781
+ "Install the Flockbay MCP plugin into your project instead (recommended).",
4782
+ "Provide projectUprojectPath and use installScope=project, or installScope=auto."
4783
+ ].join("\n")
4784
+ };
4785
+ }
4786
+ if (scope === "auto" && installedEngine && !projectUprojectPath) {
4787
+ return {
4788
+ success: false,
4789
+ error: [
4790
+ "This engine is an Installed Build (Epic Launcher / precompiled rules).",
4791
+ "To avoid breaking Unreal builds, Flockbay must install the plugin into a project.",
4792
+ "Missing required param: projectUprojectPath"
4793
+ ].join("\n")
4794
+ };
4795
+ }
4796
+ const shouldUseProject = scope === "project" || scope === "auto" && (installedEngine ? (
4797
+ // Installed engines: always use project plugin install (even if an engine copy already exists).
4798
+ Boolean(projectUprojectPath)
4799
+ ) : (
4800
+ // Non-installed engines: if the engine plugin is already installed+built, keep using it (no project mutation).
4801
+ !(fs.existsSync(enginePluginUplugin) && enginePluginHasBinaries) && // Otherwise, use a project-scope install when the engine folder isn't writable.
4802
+ !canWriteDir(enginePluginsDir) && Boolean(projectUprojectPath)
4803
+ ));
4752
4804
  if (shouldUseProject) {
4753
4805
  if (!projectUprojectPath) return { success: false, error: "Missing projectUprojectPath (required for project-scope install)." };
4754
4806
  const installedProject = installUnrealMcpPluginToProject(projectUprojectPath);
@@ -5333,6 +5385,7 @@ exports.delay = delay;
5333
5385
  exports.getLatestDaemonLog = getLatestDaemonLog;
5334
5386
  exports.installUnrealMcpPluginToEngine = installUnrealMcpPluginToEngine;
5335
5387
  exports.installUnrealMcpPluginToProject = installUnrealMcpPluginToProject;
5388
+ exports.isInstalledEngineRoot = isInstalledEngineRoot;
5336
5389
  exports.logger = logger;
5337
5390
  exports.normalizeServerUrlForNode = normalizeServerUrlForNode;
5338
5391
  exports.openBrowser = openBrowser;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "flockbay",
3
- "version": "0.10.48",
3
+ "version": "0.10.49",
4
4
  "description": "Flockbay CLI (local agent + daemon)",
5
5
  "author": "Eduardo Orellana",
6
6
  "license": "UNLICENSED",