flockbay 0.10.25 → 0.10.27

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.
@@ -672,8 +672,6 @@ async function main() {
672
672
  ),
673
673
  baselineAction: z.z.enum(["none", "compare", "set"]).optional().describe("compare=report differences vs baseline. set=overwrite baseline with this run. Default none."),
674
674
  failOnBaselineDiff: z.z.boolean().optional().describe("When baselineAction=compare, fail if screenshots differ from baseline. Default false."),
675
- applyAssetKits: z.z.boolean().optional().describe("Apply .flockbay asset kit adapters (TileMeshLibrary/ScatterCategoryRegistry/LayoutPropRegistry) to Config/DefaultGame.ini before preview. Default false (non-mutating)."),
676
- kitIds: z.z.array(z.z.string()).optional().describe("When applyAssetKits=true, limit to these kitIds. Default: all kits in .flockbay/assets/kits.json."),
677
675
  contentLint: z.z.boolean().optional().describe("Fail-hard if config/DefaultGame.ini reference missing /Game assets on disk. Default false."),
678
676
  previewDurationBudgetMs: z.z.number().int().positive().optional().describe("Fail-hard if the final preview run exceeds this duration (ms). Optional."),
679
677
  perfBudgetLint: z.z.boolean().optional().describe("Run Tools/run-perf-budget-lint.mjs (scatter budgets + perf budgets file sanity). Module-only (requires configRelPath). Default false."),
@@ -670,8 +670,6 @@ async function main() {
670
670
  ),
671
671
  baselineAction: z.enum(["none", "compare", "set"]).optional().describe("compare=report differences vs baseline. set=overwrite baseline with this run. Default none."),
672
672
  failOnBaselineDiff: z.boolean().optional().describe("When baselineAction=compare, fail if screenshots differ from baseline. Default false."),
673
- applyAssetKits: z.boolean().optional().describe("Apply .flockbay asset kit adapters (TileMeshLibrary/ScatterCategoryRegistry/LayoutPropRegistry) to Config/DefaultGame.ini before preview. Default false (non-mutating)."),
674
- kitIds: z.array(z.string()).optional().describe("When applyAssetKits=true, limit to these kitIds. Default: all kits in .flockbay/assets/kits.json."),
675
673
  contentLint: z.boolean().optional().describe("Fail-hard if config/DefaultGame.ini reference missing /Game assets on disk. Default false."),
676
674
  previewDurationBudgetMs: z.number().int().positive().optional().describe("Fail-hard if the final preview run exceeds this duration (ms). Optional."),
677
675
  perfBudgetLint: z.boolean().optional().describe("Run Tools/run-perf-budget-lint.mjs (scatter budgets + perf budgets file sanity). Module-only (requires configRelPath). Default false."),
@@ -1,7 +1,7 @@
1
1
  import{createRequire as _pkgrollCR}from"node:module";const require=_pkgrollCR(import.meta.url);import chalk from 'chalk';
2
2
  import os, { homedir } from 'node:os';
3
3
  import { randomUUID, createCipheriv, randomBytes } from 'node:crypto';
4
- import { l as logger, p as projectPath, d as backoff, e as delay, R as RawJSONLinesSchema, c as configuration, f as readDaemonState, g as clearDaemonState, b as packageJson, r as readSettings, h as readCredentials, u as updateSettings, w as writeCredentials, i as unrealMcpPythonDir, j as acquireDaemonLock, k as writeDaemonState, m as ApiMachineClient, n as releaseDaemonLock, s as sendUnrealMcpTcpCommand, A as ApiClient, o as clearCredentials, q as clearMachineId, t as installUnrealMcpPluginToEngine, v as buildAndInstallUnrealMcpPlugin, x as getLatestDaemonLog, y as normalizeServerUrlForNode } from './types-Cg6Y04sc.mjs';
4
+ import { l as logger, p as projectPath, d as backoff, e as delay, R as RawJSONLinesSchema, c as configuration, f as readDaemonState, g as clearDaemonState, b as packageJson, r as readSettings, h as readCredentials, u as updateSettings, w as writeCredentials, i as unrealMcpPythonDir, j as acquireDaemonLock, k as writeDaemonState, m as ApiMachineClient, n as releaseDaemonLock, s as sendUnrealMcpTcpCommand, A as ApiClient, o as clearCredentials, q as clearMachineId, t as installUnrealMcpPluginToEngine, v as buildAndInstallUnrealMcpPlugin, x as getLatestDaemonLog, y as normalizeServerUrlForNode } from './types-DYcgk0yQ.mjs';
5
5
  import { spawn, execFileSync, execSync } from 'node:child_process';
6
6
  import path, { resolve, join, dirname } from 'node:path';
7
7
  import { createInterface } from 'node:readline';
@@ -3561,7 +3561,11 @@ function truncateCommitSubject(value, maxLen) {
3561
3561
  return `${trimmed.slice(0, Math.max(0, maxLen - 1)).trimEnd()}\u2026`;
3562
3562
  }
3563
3563
  async function runGit(args, cwd, timeoutMs) {
3564
- const child = spawn("git", args, { cwd, stdio: ["ignore", "pipe", "pipe"] });
3564
+ const child = spawn("git", args, {
3565
+ cwd,
3566
+ stdio: ["ignore", "pipe", "pipe"],
3567
+ windowsHide: process.platform === "win32"
3568
+ });
3565
3569
  const stdout = [];
3566
3570
  const stderr = [];
3567
3571
  child.stdout?.on("data", (chunk) => stdout.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)));
@@ -3602,13 +3606,17 @@ async function runGit(args, cwd, timeoutMs) {
3602
3606
  }
3603
3607
  async function postJson(path, token, body) {
3604
3608
  const base = configuration.serverUrl.replace(/\/+$/, "");
3605
- const res = await fetch(`${base}${path}`, {
3609
+ const timeoutMsRaw = String(process.env.FLOCKBAY_COORDINATION_HTTP_TIMEOUT_MS || "").trim();
3610
+ const timeoutMs = Number.isFinite(Number(timeoutMsRaw)) && Number(timeoutMsRaw) > 0 ? Number(timeoutMsRaw) : 7e3;
3611
+ const url = `${base}${path}`;
3612
+ const res = await fetch(url, {
3606
3613
  method: "POST",
3607
3614
  headers: {
3608
3615
  Authorization: `Machine ${token}`,
3609
3616
  "Content-Type": "application/json"
3610
3617
  },
3611
- body: JSON.stringify(body ?? {})
3618
+ body: JSON.stringify(body ?? {}),
3619
+ signal: AbortSignal.timeout(timeoutMs)
3612
3620
  });
3613
3621
  const data = await res.json().catch(() => null);
3614
3622
  if (!res.ok) {
@@ -12670,7 +12678,7 @@ ${engineRoot}`, {
12670
12678
  } else if (subcommand === "codex") {
12671
12679
  try {
12672
12680
  await chdirToNearestUprojectRootIfPresent();
12673
- const { runCodex } = await import('./runCodex-DDxij6Wd.mjs');
12681
+ const { runCodex } = await import('./runCodex-Ujz1z7Tp.mjs');
12674
12682
  let startedBy = void 0;
12675
12683
  let sessionId = void 0;
12676
12684
  for (let i = 1; i < args.length; i++) {
@@ -12772,7 +12780,7 @@ ${engineRoot}`, {
12772
12780
  }
12773
12781
  try {
12774
12782
  await chdirToNearestUprojectRootIfPresent();
12775
- const { runGemini } = await import('./runGemini-BSz9-pJj.mjs');
12783
+ const { runGemini } = await import('./runGemini-BbdMLMnn.mjs');
12776
12784
  let startedBy = void 0;
12777
12785
  let sessionId = void 0;
12778
12786
  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-fWJj1SlT.cjs');
6
+ var types = require('./types-BVvMLtsa.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');
@@ -1273,7 +1273,7 @@ function buildDaemonSafeEnv(baseEnv, binPath) {
1273
1273
  env[pathKey] = [...prepend, ...existingParts].join(pathSep);
1274
1274
  return env;
1275
1275
  }
1276
- 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-CTYVAA_M.cjs', document.baseURI).href)));
1276
+ 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-YM6v-xgK.cjs', document.baseURI).href)));
1277
1277
  const __dirname$1 = path.join(__filename$1, "..");
1278
1278
  function getGlobalClaudeVersion(claudeExecutable) {
1279
1279
  try {
@@ -3583,7 +3583,11 @@ function truncateCommitSubject(value, maxLen) {
3583
3583
  return `${trimmed.slice(0, Math.max(0, maxLen - 1)).trimEnd()}\u2026`;
3584
3584
  }
3585
3585
  async function runGit(args, cwd, timeoutMs) {
3586
- const child = node_child_process.spawn("git", args, { cwd, stdio: ["ignore", "pipe", "pipe"] });
3586
+ const child = node_child_process.spawn("git", args, {
3587
+ cwd,
3588
+ stdio: ["ignore", "pipe", "pipe"],
3589
+ windowsHide: process.platform === "win32"
3590
+ });
3587
3591
  const stdout = [];
3588
3592
  const stderr = [];
3589
3593
  child.stdout?.on("data", (chunk) => stdout.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)));
@@ -3624,13 +3628,17 @@ async function runGit(args, cwd, timeoutMs) {
3624
3628
  }
3625
3629
  async function postJson(path, token, body) {
3626
3630
  const base = types.configuration.serverUrl.replace(/\/+$/, "");
3627
- const res = await fetch(`${base}${path}`, {
3631
+ const timeoutMsRaw = String(process.env.FLOCKBAY_COORDINATION_HTTP_TIMEOUT_MS || "").trim();
3632
+ const timeoutMs = Number.isFinite(Number(timeoutMsRaw)) && Number(timeoutMsRaw) > 0 ? Number(timeoutMsRaw) : 7e3;
3633
+ const url = `${base}${path}`;
3634
+ const res = await fetch(url, {
3628
3635
  method: "POST",
3629
3636
  headers: {
3630
3637
  Authorization: `Machine ${token}`,
3631
3638
  "Content-Type": "application/json"
3632
3639
  },
3633
- body: JSON.stringify(body ?? {})
3640
+ body: JSON.stringify(body ?? {}),
3641
+ signal: AbortSignal.timeout(timeoutMs)
3634
3642
  });
3635
3643
  const data = await res.json().catch(() => null);
3636
3644
  if (!res.ok) {
@@ -12692,7 +12700,7 @@ ${engineRoot}`, {
12692
12700
  } else if (subcommand === "codex") {
12693
12701
  try {
12694
12702
  await chdirToNearestUprojectRootIfPresent();
12695
- const { runCodex } = await Promise.resolve().then(function () { return require('./runCodex-DjisgfAa.cjs'); });
12703
+ const { runCodex } = await Promise.resolve().then(function () { return require('./runCodex-DqzFigke.cjs'); });
12696
12704
  let startedBy = void 0;
12697
12705
  let sessionId = void 0;
12698
12706
  for (let i = 1; i < args.length; i++) {
@@ -12794,7 +12802,7 @@ ${engineRoot}`, {
12794
12802
  }
12795
12803
  try {
12796
12804
  await chdirToNearestUprojectRootIfPresent();
12797
- const { runGemini } = await Promise.resolve().then(function () { return require('./runGemini-B1i5JUTA.cjs'); });
12805
+ const { runGemini } = await Promise.resolve().then(function () { return require('./runGemini-_3wOrKzX.cjs'); });
12798
12806
  let startedBy = void 0;
12799
12807
  let sessionId = void 0;
12800
12808
  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-CTYVAA_M.cjs');
5
- require('./types-fWJj1SlT.cjs');
4
+ require('./index-YM6v-xgK.cjs');
5
+ require('./types-BVvMLtsa.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-B22iDcA0.mjs';
3
- import './types-Cg6Y04sc.mjs';
2
+ import './index-D7iB7SzL.mjs';
3
+ import './types-DYcgk0yQ.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-fWJj1SlT.cjs');
3
+ var types = require('./types-BVvMLtsa.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-Cg6Y04sc.mjs';
1
+ export { A as ApiClient, a as ApiSessionClient, R as RawJSONLinesSchema, c as configuration, l as logger } from './types-DYcgk0yQ.mjs';
2
2
  import 'axios';
3
3
  import 'node:fs';
4
4
  import 'node:os';
@@ -2,7 +2,7 @@
2
2
 
3
3
  var ink = require('ink');
4
4
  var React = require('react');
5
- var types = require('./types-fWJj1SlT.cjs');
5
+ var types = require('./types-BVvMLtsa.cjs');
6
6
  var index_js = require('@modelcontextprotocol/sdk/client/index.js');
7
7
  var stdio_js = require('@modelcontextprotocol/sdk/client/stdio.js');
8
8
  var z = require('zod');
@@ -12,7 +12,7 @@ var fs = require('node:fs');
12
12
  var os = require('node:os');
13
13
  var path = require('node:path');
14
14
  var node_child_process = require('node:child_process');
15
- var index = require('./index-CTYVAA_M.cjs');
15
+ var index = require('./index-YM6v-xgK.cjs');
16
16
  require('axios');
17
17
  require('node:events');
18
18
  require('socket.io-client');
@@ -373,8 +373,9 @@ function buildCodexSpawnEnv(codexBin) {
373
373
  if (typeof value === "string") acc[key] = value;
374
374
  return acc;
375
375
  }, {});
376
- const existingPath = env.PATH || "";
377
- const existingParts = existingPath.split(":").filter(Boolean);
376
+ const pathKey = Object.keys(env).find((k) => k.toLowerCase() === "path") || "PATH";
377
+ const existingPath = env[pathKey] || "";
378
+ const existingParts = existingPath.split(path.delimiter).filter(Boolean);
378
379
  const prepend = [];
379
380
  const add = (p) => {
380
381
  if (!p) return;
@@ -390,7 +391,8 @@ function buildCodexSpawnEnv(codexBin) {
390
391
  add("/bin");
391
392
  add("/usr/sbin");
392
393
  add("/sbin");
393
- env.PATH = [...prepend, ...existingParts].join(":");
394
+ env[pathKey] = [...prepend, ...existingParts].join(path.delimiter);
395
+ if (pathKey !== "PATH") env.PATH = env[pathKey];
394
396
  return env;
395
397
  }
396
398
  function resolveCodexBin() {
@@ -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, r as readSettings, p as projectPath, c as configuration, b as packageJson } from './types-Cg6Y04sc.mjs';
3
+ import { l as logger, A as ApiClient, r as readSettings, p as projectPath, c as configuration, b as packageJson } from './types-DYcgk0yQ.mjs';
4
4
  import { Client } from '@modelcontextprotocol/sdk/client/index.js';
5
5
  import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
6
6
  import { z } from 'zod';
@@ -10,7 +10,7 @@ import fs__default from 'node:fs';
10
10
  import os from 'node:os';
11
11
  import path, { resolve, join } from 'node:path';
12
12
  import { spawnSync } from 'node:child_process';
13
- import { s as shouldCountToolCall, c as consumeToolQuota, f as formatQuotaDeniedReason, h as hashObject, 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, e as buildProjectCapsule, t as trimIdent, g as autoFinalizeCoordinationWorkItem, j as detectScreenshotsForGate, k as applyCoordinationSideEffectsFromMcpToolResult, l as stopCaffeinate } from './index-B22iDcA0.mjs';
13
+ import { s as shouldCountToolCall, c as consumeToolQuota, f as formatQuotaDeniedReason, h as hashObject, 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, e as buildProjectCapsule, t as trimIdent, g as autoFinalizeCoordinationWorkItem, j as detectScreenshotsForGate, k as applyCoordinationSideEffectsFromMcpToolResult, l as stopCaffeinate } from './index-D7iB7SzL.mjs';
14
14
  import 'axios';
15
15
  import 'node:events';
16
16
  import 'socket.io-client';
@@ -371,8 +371,9 @@ function buildCodexSpawnEnv(codexBin) {
371
371
  if (typeof value === "string") acc[key] = value;
372
372
  return acc;
373
373
  }, {});
374
- const existingPath = env.PATH || "";
375
- const existingParts = existingPath.split(":").filter(Boolean);
374
+ const pathKey = Object.keys(env).find((k) => k.toLowerCase() === "path") || "PATH";
375
+ const existingPath = env[pathKey] || "";
376
+ const existingParts = existingPath.split(path.delimiter).filter(Boolean);
376
377
  const prepend = [];
377
378
  const add = (p) => {
378
379
  if (!p) return;
@@ -388,7 +389,8 @@ function buildCodexSpawnEnv(codexBin) {
388
389
  add("/bin");
389
390
  add("/usr/sbin");
390
391
  add("/sbin");
391
- env.PATH = [...prepend, ...existingParts].join(":");
392
+ env[pathKey] = [...prepend, ...existingParts].join(path.delimiter);
393
+ if (pathKey !== "PATH") env.PATH = env[pathKey];
392
394
  return env;
393
395
  }
394
396
  function resolveCodexBin() {
@@ -4,8 +4,8 @@ import { randomUUID, createHash } from 'node:crypto';
4
4
  import os from 'node:os';
5
5
  import path, { resolve, join as join$1, basename } from 'node:path';
6
6
  import { mkdir, writeFile, readFile } from 'node:fs/promises';
7
- import { l as logger, b as packageJson, A as ApiClient, r as readSettings, p as projectPath, c as configuration } from './types-Cg6Y04sc.mjs';
8
- import { s as shouldCountToolCall, c as consumeToolQuota, f as formatQuotaDeniedReason, h as hashObject, i as initialMachineMetadata, n as notifyDaemonSessionStarted, M as MessageQueue2, e as buildProjectCapsule, a as setLatestUserImages, b as MessageBuffer, w as withUserImagesMarker, r as registerKillSessionHandler, d as startFlockbayServer, m as extractUserImagesMarker, o as getLatestUserImages, P as PLATFORM_SYSTEM_PROMPT, g as autoFinalizeCoordinationWorkItem, E as ElicitationHub, j as detectScreenshotsForGate, l as stopCaffeinate } from './index-B22iDcA0.mjs';
7
+ import { l as logger, b as packageJson, A as ApiClient, r as readSettings, p as projectPath, c as configuration } from './types-DYcgk0yQ.mjs';
8
+ import { s as shouldCountToolCall, c as consumeToolQuota, f as formatQuotaDeniedReason, h as hashObject, i as initialMachineMetadata, n as notifyDaemonSessionStarted, M as MessageQueue2, e as buildProjectCapsule, a as setLatestUserImages, b as MessageBuffer, w as withUserImagesMarker, r as registerKillSessionHandler, d as startFlockbayServer, m as extractUserImagesMarker, o as getLatestUserImages, P as PLATFORM_SYSTEM_PROMPT, g as autoFinalizeCoordinationWorkItem, E as ElicitationHub, j as detectScreenshotsForGate, l as stopCaffeinate } from './index-D7iB7SzL.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-fWJj1SlT.cjs');
10
- var index = require('./index-CTYVAA_M.cjs');
9
+ var types = require('./types-BVvMLtsa.cjs');
10
+ var index = require('./index-YM6v-xgK.cjs');
11
11
  var node_child_process = require('node:child_process');
12
12
  var sdk = require('@agentclientprotocol/sdk');
13
13
  var fs = require('fs');
@@ -42,7 +42,7 @@ function _interopNamespaceDefault(e) {
42
42
  var z__namespace = /*#__PURE__*/_interopNamespaceDefault(z);
43
43
 
44
44
  var name = "flockbay";
45
- var version = "0.10.25";
45
+ var version = "0.10.27";
46
46
  var description = "Flockbay CLI (local agent + daemon)";
47
47
  var author = "Eduardo Orellana";
48
48
  var license = "UNLICENSED";
@@ -95,7 +95,6 @@ var exports$1 = {
95
95
  var files = [
96
96
  "dist",
97
97
  "bin",
98
- "kits",
99
98
  "scripts",
100
99
  "tools/licenses",
101
100
  "tools/unreal-mcp",
@@ -770,7 +769,7 @@ class RpcHandlerManager {
770
769
  }
771
770
  }
772
771
 
773
- 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-fWJj1SlT.cjs', document.baseURI).href))));
772
+ 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-BVvMLtsa.cjs', document.baseURI).href))));
774
773
  function projectPath() {
775
774
  const path = path$1.resolve(__dirname$1, "..");
776
775
  return path;
@@ -1151,7 +1150,8 @@ async function runProcess({
1151
1150
  cwd,
1152
1151
  shell: false,
1153
1152
  env: env ? { ...process.env, ...env } : process.env,
1154
- stdio: ["ignore", "pipe", "pipe"]
1153
+ stdio: ["ignore", "pipe", "pipe"],
1154
+ windowsHide: process.platform === "win32"
1155
1155
  });
1156
1156
  child.stdout?.on("data", (chunk) => stdoutTail.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)));
1157
1157
  child.stderr?.on("data", (chunk) => stderrTail.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)));
@@ -1384,7 +1384,8 @@ async function runProcessToFile({
1384
1384
  const child = child_process.spawn(command, args, {
1385
1385
  cwd,
1386
1386
  shell: false,
1387
- stdio: ["ignore", "pipe", "pipe"]
1387
+ stdio: ["ignore", "pipe", "pipe"],
1388
+ windowsHide: process.platform === "win32"
1388
1389
  });
1389
1390
  child.stdout?.pipe(out);
1390
1391
  child.stderr?.on("data", (chunk) => stderrTail.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)));
@@ -1480,8 +1481,10 @@ function normalizeCoordinationFilePath(input) {
1480
1481
  function registerCommonHandlers(rpcHandlerManager, workingDirectory, coordination, options) {
1481
1482
  const bashEnabled = options?.bashEnabled !== false;
1482
1483
  const spawnEnv = (() => {
1483
- const basePath = process.env.PATH ?? "";
1484
- const existingEntries = basePath.split(":").filter(Boolean);
1484
+ const pathKey = Object.keys(process.env).find((k) => k.toLowerCase() === "path") || "PATH";
1485
+ const basePath = process.env[pathKey] ?? "";
1486
+ const delimiter = path.delimiter;
1487
+ const existingEntries = basePath.split(delimiter).filter(Boolean);
1485
1488
  const preferredEntries = [];
1486
1489
  if (process.platform === "darwin") {
1487
1490
  preferredEntries.push("/opt/homebrew/bin", "/opt/homebrew/sbin", "/usr/local/bin", "/usr/local/sbin");
@@ -1490,7 +1493,10 @@ function registerCommonHandlers(rpcHandlerManager, workingDirectory, coordinatio
1490
1493
  }
1491
1494
  const preferredSet = new Set(preferredEntries);
1492
1495
  const merged = [...preferredEntries, ...existingEntries.filter((p) => !preferredSet.has(p))];
1493
- return { ...process.env, PATH: merged.join(":") };
1496
+ const env = { ...process.env };
1497
+ env[pathKey] = merged.join(delimiter);
1498
+ if (pathKey !== "PATH") env.PATH = env[pathKey];
1499
+ return env;
1494
1500
  })();
1495
1501
  rpcHandlerManager.registerHandler("bash", async (data) => {
1496
1502
  if (!bashEnabled) {
@@ -1523,7 +1529,8 @@ function registerCommonHandlers(rpcHandlerManager, workingDirectory, coordinatio
1523
1529
  cwd,
1524
1530
  shell: true,
1525
1531
  env: spawnEnv,
1526
- stdio: ["ignore", "pipe", "pipe"]
1532
+ stdio: ["ignore", "pipe", "pipe"],
1533
+ windowsHide: process.platform === "win32"
1527
1534
  });
1528
1535
  child.stdout?.on("data", (chunk) => stdoutTail.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)));
1529
1536
  child.stderr?.on("data", (chunk) => stderrTail.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)));
@@ -2732,26 +2739,26 @@ Fix: re-read the file and retry (the file changed since you last read it).`
2732
2739
  return { success: false, error: validation.error };
2733
2740
  }
2734
2741
  const rootPath = validation.resolvedPath || data.path;
2735
- async function buildTree(path, name, currentDepth) {
2742
+ async function buildTree(path2, name, currentDepth) {
2736
2743
  try {
2737
- const stats = await fs$3.stat(path);
2744
+ const stats = await fs$3.stat(path2);
2738
2745
  const node = {
2739
2746
  name,
2740
- path,
2747
+ path: path2,
2741
2748
  type: stats.isDirectory() ? "directory" : "file",
2742
2749
  size: stats.size,
2743
2750
  modified: stats.mtime.getTime()
2744
2751
  };
2745
2752
  if (stats.isDirectory() && currentDepth < data.maxDepth) {
2746
- const entries = await fs$3.readdir(path, { withFileTypes: true });
2753
+ const entries = await fs$3.readdir(path2, { withFileTypes: true });
2747
2754
  const children = [];
2748
2755
  await Promise.all(
2749
2756
  entries.map(async (entry) => {
2750
2757
  if (entry.isSymbolicLink()) {
2751
- logger.debug(`Skipping symlink: ${path$1.join(path, entry.name)}`);
2758
+ logger.debug(`Skipping symlink: ${path$1.join(path2, entry.name)}`);
2752
2759
  return;
2753
2760
  }
2754
- const childPath = path$1.join(path, entry.name);
2761
+ const childPath = path$1.join(path2, entry.name);
2755
2762
  const childNode = await buildTree(childPath, entry.name, currentDepth + 1);
2756
2763
  if (childNode) {
2757
2764
  children.push(childNode);
@@ -2767,7 +2774,7 @@ Fix: re-read the file and retry (the file changed since you last read it).`
2767
2774
  }
2768
2775
  return node;
2769
2776
  } catch (error) {
2770
- logger.debug(`Failed to process ${path}:`, error instanceof Error ? error.message : String(error));
2777
+ logger.debug(`Failed to process ${path2}:`, error instanceof Error ? error.message : String(error));
2771
2778
  return null;
2772
2779
  }
2773
2780
  }
@@ -21,7 +21,7 @@ import net from 'node:net';
21
21
  import { spawn as spawn$1 } from 'node:child_process';
22
22
 
23
23
  var name = "flockbay";
24
- var version = "0.10.25";
24
+ var version = "0.10.27";
25
25
  var description = "Flockbay CLI (local agent + daemon)";
26
26
  var author = "Eduardo Orellana";
27
27
  var license = "UNLICENSED";
@@ -74,7 +74,6 @@ var exports$1 = {
74
74
  var files = [
75
75
  "dist",
76
76
  "bin",
77
- "kits",
78
77
  "scripts",
79
78
  "tools/licenses",
80
79
  "tools/unreal-mcp",
@@ -1130,7 +1129,8 @@ async function runProcess({
1130
1129
  cwd,
1131
1130
  shell: false,
1132
1131
  env: env ? { ...process.env, ...env } : process.env,
1133
- stdio: ["ignore", "pipe", "pipe"]
1132
+ stdio: ["ignore", "pipe", "pipe"],
1133
+ windowsHide: process.platform === "win32"
1134
1134
  });
1135
1135
  child.stdout?.on("data", (chunk) => stdoutTail.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)));
1136
1136
  child.stderr?.on("data", (chunk) => stderrTail.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)));
@@ -1363,7 +1363,8 @@ async function runProcessToFile({
1363
1363
  const child = spawn(command, args, {
1364
1364
  cwd,
1365
1365
  shell: false,
1366
- stdio: ["ignore", "pipe", "pipe"]
1366
+ stdio: ["ignore", "pipe", "pipe"],
1367
+ windowsHide: process.platform === "win32"
1367
1368
  });
1368
1369
  child.stdout?.pipe(out);
1369
1370
  child.stderr?.on("data", (chunk) => stderrTail.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)));
@@ -1459,8 +1460,10 @@ function normalizeCoordinationFilePath(input) {
1459
1460
  function registerCommonHandlers(rpcHandlerManager, workingDirectory, coordination, options) {
1460
1461
  const bashEnabled = options?.bashEnabled !== false;
1461
1462
  const spawnEnv = (() => {
1462
- const basePath = process.env.PATH ?? "";
1463
- const existingEntries = basePath.split(":").filter(Boolean);
1463
+ const pathKey = Object.keys(process.env).find((k) => k.toLowerCase() === "path") || "PATH";
1464
+ const basePath = process.env[pathKey] ?? "";
1465
+ const delimiter = path.delimiter;
1466
+ const existingEntries = basePath.split(delimiter).filter(Boolean);
1464
1467
  const preferredEntries = [];
1465
1468
  if (process.platform === "darwin") {
1466
1469
  preferredEntries.push("/opt/homebrew/bin", "/opt/homebrew/sbin", "/usr/local/bin", "/usr/local/sbin");
@@ -1469,7 +1472,10 @@ function registerCommonHandlers(rpcHandlerManager, workingDirectory, coordinatio
1469
1472
  }
1470
1473
  const preferredSet = new Set(preferredEntries);
1471
1474
  const merged = [...preferredEntries, ...existingEntries.filter((p) => !preferredSet.has(p))];
1472
- return { ...process.env, PATH: merged.join(":") };
1475
+ const env = { ...process.env };
1476
+ env[pathKey] = merged.join(delimiter);
1477
+ if (pathKey !== "PATH") env.PATH = env[pathKey];
1478
+ return env;
1473
1479
  })();
1474
1480
  rpcHandlerManager.registerHandler("bash", async (data) => {
1475
1481
  if (!bashEnabled) {
@@ -1502,7 +1508,8 @@ function registerCommonHandlers(rpcHandlerManager, workingDirectory, coordinatio
1502
1508
  cwd,
1503
1509
  shell: true,
1504
1510
  env: spawnEnv,
1505
- stdio: ["ignore", "pipe", "pipe"]
1511
+ stdio: ["ignore", "pipe", "pipe"],
1512
+ windowsHide: process.platform === "win32"
1506
1513
  });
1507
1514
  child.stdout?.on("data", (chunk) => stdoutTail.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)));
1508
1515
  child.stderr?.on("data", (chunk) => stderrTail.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)));
@@ -2711,26 +2718,26 @@ Fix: re-read the file and retry (the file changed since you last read it).`
2711
2718
  return { success: false, error: validation.error };
2712
2719
  }
2713
2720
  const rootPath = validation.resolvedPath || data.path;
2714
- async function buildTree(path, name, currentDepth) {
2721
+ async function buildTree(path2, name, currentDepth) {
2715
2722
  try {
2716
- const stats = await stat$1(path);
2723
+ const stats = await stat$1(path2);
2717
2724
  const node = {
2718
2725
  name,
2719
- path,
2726
+ path: path2,
2720
2727
  type: stats.isDirectory() ? "directory" : "file",
2721
2728
  size: stats.size,
2722
2729
  modified: stats.mtime.getTime()
2723
2730
  };
2724
2731
  if (stats.isDirectory() && currentDepth < data.maxDepth) {
2725
- const entries = await readdir(path, { withFileTypes: true });
2732
+ const entries = await readdir(path2, { withFileTypes: true });
2726
2733
  const children = [];
2727
2734
  await Promise.all(
2728
2735
  entries.map(async (entry) => {
2729
2736
  if (entry.isSymbolicLink()) {
2730
- logger.debug(`Skipping symlink: ${join$1(path, entry.name)}`);
2737
+ logger.debug(`Skipping symlink: ${join$1(path2, entry.name)}`);
2731
2738
  return;
2732
2739
  }
2733
- const childPath = join$1(path, entry.name);
2740
+ const childPath = join$1(path2, entry.name);
2734
2741
  const childNode = await buildTree(childPath, entry.name, currentDepth + 1);
2735
2742
  if (childNode) {
2736
2743
  children.push(childNode);
@@ -2746,7 +2753,7 @@ Fix: re-read the file and retry (the file changed since you last read it).`
2746
2753
  }
2747
2754
  return node;
2748
2755
  } catch (error) {
2749
- logger.debug(`Failed to process ${path}:`, error instanceof Error ? error.message : String(error));
2756
+ logger.debug(`Failed to process ${path2}:`, error instanceof Error ? error.message : String(error));
2750
2757
  return null;
2751
2758
  }
2752
2759
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "flockbay",
3
- "version": "0.10.25",
3
+ "version": "0.10.27",
4
4
  "description": "Flockbay CLI (local agent + daemon)",
5
5
  "author": "Eduardo Orellana",
6
6
  "license": "UNLICENSED",
@@ -53,7 +53,6 @@
53
53
  "files": [
54
54
  "dist",
55
55
  "bin",
56
- "kits",
57
56
  "scripts",
58
57
  "tools/licenses",
59
58
  "tools/unreal-mcp",
@@ -1,59 +0,0 @@
1
- {
2
- "manifestVersion": 1,
3
- "id": "kit.open_world",
4
- "version": "0.1.0",
5
- "displayName": "Open World Kit",
6
- "summary": "Opinionated workflows for large worlds (World Partition + streaming), built on top of universal SDK bricks.",
7
- "conflictsWith": [],
8
- "docs": {
9
- "path": "documentation/75-kit-open-world.md"
10
- },
11
- "activationModes": ["adopt", "parallel", "override"],
12
- "writeSet": {
13
- "defaultGameNamespace": "/Game/Flockbay/Kits/OpenWorld",
14
- "defaultConfigNamespace": ".flockbay/kits/kit.open_world"
15
- },
16
- "preflight": {
17
- "checks": [
18
- {
19
- "checkId": "kit.installed",
20
- "required": false
21
- },
22
- {
23
- "checkId": "kit.up_to_date",
24
- "required": false
25
- },
26
- {
27
- "checkId": "kit.conflicts",
28
- "required": false
29
- },
30
- {
31
- "checkId": "sdk.installed",
32
- "required": true
33
- },
34
- {
35
- "checkId": "ue.editor_cmd.available",
36
- "required": true
37
- },
38
- {
39
- "checkId": "project.default_map.configured",
40
- "required": false
41
- },
42
- {
43
- "checkId": "kit.open_world.default_map.wp_ready",
44
- "required": false
45
- },
46
- {
47
- "checkId": "ue.world_partition.detected",
48
- "required": false
49
- },
50
- {
51
- "checkId": "scm.git.detected",
52
- "required": false
53
- }
54
- ]
55
- },
56
- "evidence": {
57
- "requires": ["preflight_report", "activation_report"]
58
- }
59
- }