@foresthubai/workflow-cli 0.4.0 → 0.4.2

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.
package/dist/index.html CHANGED
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <link rel="icon" href="/favicon.png" type="image/png" />
7
7
  <title>ForestHub Builder</title>
8
- <script type="module" crossorigin src="/assets/index-DdVVqMsf.js"></script>
8
+ <script type="module" crossorigin src="/assets/index-B7syExE5.js"></script>
9
9
  <link rel="stylesheet" crossorigin href="/assets/index-CnM-MQ9w.css">
10
10
  </head>
11
11
  <body class="bg-background text-foreground">
package/dist-cli/cli.js CHANGED
@@ -16621,7 +16621,7 @@ var __toESM2 = (mod, isNodeMode, target) => (target = mod != null ? __create2(__
16621
16621
  value: mod,
16622
16622
  enumerable: true
16623
16623
  }) : target, mod));
16624
- var require_common = /* @__PURE__ */ __commonJSMin((exports, module) => {
16624
+ var require_common = /* @__PURE__ */ __commonJSMin(((exports, module) => {
16625
16625
  function isNothing(subject) {
16626
16626
  return typeof subject === "undefined" || subject === null;
16627
16627
  }
@@ -16657,8 +16657,8 @@ var require_common = /* @__PURE__ */ __commonJSMin((exports, module) => {
16657
16657
  module.exports.repeat = repeat;
16658
16658
  module.exports.isNegativeZero = isNegativeZero;
16659
16659
  module.exports.extend = extend2;
16660
- });
16661
- var require_exception = /* @__PURE__ */ __commonJSMin((exports, module) => {
16660
+ }));
16661
+ var require_exception = /* @__PURE__ */ __commonJSMin(((exports, module) => {
16662
16662
  function formatError2(exception, compact) {
16663
16663
  let where = "";
16664
16664
  const message = exception.reason || "(unknown reason)";
@@ -16683,8 +16683,8 @@ var require_exception = /* @__PURE__ */ __commonJSMin((exports, module) => {
16683
16683
  return this.name + ": " + formatError2(this, compact);
16684
16684
  };
16685
16685
  module.exports = YAMLException2;
16686
- });
16687
- var require_snippet = /* @__PURE__ */ __commonJSMin((exports, module) => {
16686
+ }));
16687
+ var require_snippet = /* @__PURE__ */ __commonJSMin(((exports, module) => {
16688
16688
  var common2 = require_common();
16689
16689
  function getLine(buffer, lineStart, lineEnd, position, maxLineLength) {
16690
16690
  let head = "";
@@ -16743,8 +16743,8 @@ var require_snippet = /* @__PURE__ */ __commonJSMin((exports, module) => {
16743
16743
  return result.replace(/\n$/, "");
16744
16744
  }
16745
16745
  module.exports = makeSnippet;
16746
- });
16747
- var require_type = /* @__PURE__ */ __commonJSMin((exports, module) => {
16746
+ }));
16747
+ var require_type = /* @__PURE__ */ __commonJSMin(((exports, module) => {
16748
16748
  var YAMLException2 = require_exception();
16749
16749
  var TYPE_CONSTRUCTOR_OPTIONS = [
16750
16750
  "kind",
@@ -16796,8 +16796,8 @@ var require_type = /* @__PURE__ */ __commonJSMin((exports, module) => {
16796
16796
  if (YAML_NODE_KINDS.indexOf(this.kind) === -1) throw new YAMLException2('Unknown kind "' + this.kind + '" is specified for "' + tag + '" YAML type.');
16797
16797
  }
16798
16798
  module.exports = Type2;
16799
- });
16800
- var require_schema = /* @__PURE__ */ __commonJSMin((exports, module) => {
16799
+ }));
16800
+ var require_schema = /* @__PURE__ */ __commonJSMin(((exports, module) => {
16801
16801
  var YAMLException2 = require_exception();
16802
16802
  var Type2 = require_type();
16803
16803
  function compileList(schema, name) {
@@ -16862,39 +16862,39 @@ var require_schema = /* @__PURE__ */ __commonJSMin((exports, module) => {
16862
16862
  return result;
16863
16863
  };
16864
16864
  module.exports = Schema2;
16865
- });
16866
- var require_str = /* @__PURE__ */ __commonJSMin((exports, module) => {
16865
+ }));
16866
+ var require_str = /* @__PURE__ */ __commonJSMin(((exports, module) => {
16867
16867
  module.exports = new (require_type())("tag:yaml.org,2002:str", {
16868
16868
  kind: "scalar",
16869
16869
  construct: function(data) {
16870
16870
  return data !== null ? data : "";
16871
16871
  }
16872
16872
  });
16873
- });
16874
- var require_seq = /* @__PURE__ */ __commonJSMin((exports, module) => {
16873
+ }));
16874
+ var require_seq = /* @__PURE__ */ __commonJSMin(((exports, module) => {
16875
16875
  module.exports = new (require_type())("tag:yaml.org,2002:seq", {
16876
16876
  kind: "sequence",
16877
16877
  construct: function(data) {
16878
16878
  return data !== null ? data : [];
16879
16879
  }
16880
16880
  });
16881
- });
16882
- var require_map = /* @__PURE__ */ __commonJSMin((exports, module) => {
16881
+ }));
16882
+ var require_map = /* @__PURE__ */ __commonJSMin(((exports, module) => {
16883
16883
  module.exports = new (require_type())("tag:yaml.org,2002:map", {
16884
16884
  kind: "mapping",
16885
16885
  construct: function(data) {
16886
16886
  return data !== null ? data : {};
16887
16887
  }
16888
16888
  });
16889
- });
16890
- var require_failsafe = /* @__PURE__ */ __commonJSMin((exports, module) => {
16889
+ }));
16890
+ var require_failsafe = /* @__PURE__ */ __commonJSMin(((exports, module) => {
16891
16891
  module.exports = new (require_schema())({ explicit: [
16892
16892
  require_str(),
16893
16893
  require_seq(),
16894
16894
  require_map()
16895
16895
  ] });
16896
- });
16897
- var require_null = /* @__PURE__ */ __commonJSMin((exports, module) => {
16896
+ }));
16897
+ var require_null = /* @__PURE__ */ __commonJSMin(((exports, module) => {
16898
16898
  var Type2 = require_type();
16899
16899
  function resolveYamlNull(data) {
16900
16900
  if (data === null) return true;
@@ -16931,8 +16931,8 @@ var require_null = /* @__PURE__ */ __commonJSMin((exports, module) => {
16931
16931
  },
16932
16932
  defaultStyle: "lowercase"
16933
16933
  });
16934
- });
16935
- var require_bool = /* @__PURE__ */ __commonJSMin((exports, module) => {
16934
+ }));
16935
+ var require_bool = /* @__PURE__ */ __commonJSMin(((exports, module) => {
16936
16936
  var Type2 = require_type();
16937
16937
  function resolveYamlBoolean(data) {
16938
16938
  if (data === null) return false;
@@ -16963,8 +16963,8 @@ var require_bool = /* @__PURE__ */ __commonJSMin((exports, module) => {
16963
16963
  },
16964
16964
  defaultStyle: "lowercase"
16965
16965
  });
16966
- });
16967
- var require_int = /* @__PURE__ */ __commonJSMin((exports, module) => {
16966
+ }));
16967
+ var require_int = /* @__PURE__ */ __commonJSMin(((exports, module) => {
16968
16968
  var common2 = require_common();
16969
16969
  var Type2 = require_type();
16970
16970
  function isHexCode(c) {
@@ -17070,8 +17070,8 @@ var require_int = /* @__PURE__ */ __commonJSMin((exports, module) => {
17070
17070
  hexadecimal: [16, "hex"]
17071
17071
  }
17072
17072
  });
17073
- });
17074
- var require_float = /* @__PURE__ */ __commonJSMin((exports, module) => {
17073
+ }));
17074
+ var require_float = /* @__PURE__ */ __commonJSMin(((exports, module) => {
17075
17075
  var common2 = require_common();
17076
17076
  var Type2 = require_type();
17077
17077
  var YAML_FLOAT_PATTERN = /* @__PURE__ */ new RegExp("^(?:[-+]?(?:[0-9]+)(?:\\.[0-9]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");
@@ -17131,19 +17131,19 @@ var require_float = /* @__PURE__ */ __commonJSMin((exports, module) => {
17131
17131
  represent: representYamlFloat,
17132
17132
  defaultStyle: "lowercase"
17133
17133
  });
17134
- });
17135
- var require_json = /* @__PURE__ */ __commonJSMin((exports, module) => {
17134
+ }));
17135
+ var require_json = /* @__PURE__ */ __commonJSMin(((exports, module) => {
17136
17136
  module.exports = require_failsafe().extend({ implicit: [
17137
17137
  require_null(),
17138
17138
  require_bool(),
17139
17139
  require_int(),
17140
17140
  require_float()
17141
17141
  ] });
17142
- });
17143
- var require_core5 = /* @__PURE__ */ __commonJSMin((exports, module) => {
17142
+ }));
17143
+ var require_core5 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
17144
17144
  module.exports = require_json();
17145
- });
17146
- var require_timestamp = /* @__PURE__ */ __commonJSMin((exports, module) => {
17145
+ }));
17146
+ var require_timestamp = /* @__PURE__ */ __commonJSMin(((exports, module) => {
17147
17147
  var Type2 = require_type();
17148
17148
  var YAML_DATE_REGEXP = /* @__PURE__ */ new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$");
17149
17149
  var YAML_TIMESTAMP_REGEXP = /* @__PURE__ */ new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");
@@ -17191,8 +17191,8 @@ var require_timestamp = /* @__PURE__ */ __commonJSMin((exports, module) => {
17191
17191
  instanceOf: Date,
17192
17192
  represent: representYamlTimestamp
17193
17193
  });
17194
- });
17195
- var require_merge = /* @__PURE__ */ __commonJSMin((exports, module) => {
17194
+ }));
17195
+ var require_merge = /* @__PURE__ */ __commonJSMin(((exports, module) => {
17196
17196
  var Type2 = require_type();
17197
17197
  function resolveYamlMerge(data) {
17198
17198
  return data === "<<" || data === null;
@@ -17201,8 +17201,8 @@ var require_merge = /* @__PURE__ */ __commonJSMin((exports, module) => {
17201
17201
  kind: "scalar",
17202
17202
  resolve: resolveYamlMerge
17203
17203
  });
17204
- });
17205
- var require_binary = /* @__PURE__ */ __commonJSMin((exports, module) => {
17204
+ }));
17205
+ var require_binary = /* @__PURE__ */ __commonJSMin(((exports, module) => {
17206
17206
  var Type2 = require_type();
17207
17207
  var BASE64_MAP = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r";
17208
17208
  function resolveYamlBinary(data) {
@@ -17286,8 +17286,8 @@ var require_binary = /* @__PURE__ */ __commonJSMin((exports, module) => {
17286
17286
  predicate: isBinary,
17287
17287
  represent: representYamlBinary
17288
17288
  });
17289
- });
17290
- var require_omap = /* @__PURE__ */ __commonJSMin((exports, module) => {
17289
+ }));
17290
+ var require_omap = /* @__PURE__ */ __commonJSMin(((exports, module) => {
17291
17291
  var Type2 = require_type();
17292
17292
  var _hasOwnProperty = Object.prototype.hasOwnProperty;
17293
17293
  var _toString = Object.prototype.toString;
@@ -17316,8 +17316,8 @@ var require_omap = /* @__PURE__ */ __commonJSMin((exports, module) => {
17316
17316
  resolve: resolveYamlOmap,
17317
17317
  construct: constructYamlOmap
17318
17318
  });
17319
- });
17320
- var require_pairs = /* @__PURE__ */ __commonJSMin((exports, module) => {
17319
+ }));
17320
+ var require_pairs = /* @__PURE__ */ __commonJSMin(((exports, module) => {
17321
17321
  var Type2 = require_type();
17322
17322
  var _toString = Object.prototype.toString;
17323
17323
  function resolveYamlPairs(data) {
@@ -17349,8 +17349,8 @@ var require_pairs = /* @__PURE__ */ __commonJSMin((exports, module) => {
17349
17349
  resolve: resolveYamlPairs,
17350
17350
  construct: constructYamlPairs
17351
17351
  });
17352
- });
17353
- var require_set = /* @__PURE__ */ __commonJSMin((exports, module) => {
17352
+ }));
17353
+ var require_set = /* @__PURE__ */ __commonJSMin(((exports, module) => {
17354
17354
  var Type2 = require_type();
17355
17355
  var _hasOwnProperty = Object.prototype.hasOwnProperty;
17356
17356
  function resolveYamlSet(data) {
@@ -17369,8 +17369,8 @@ var require_set = /* @__PURE__ */ __commonJSMin((exports, module) => {
17369
17369
  resolve: resolveYamlSet,
17370
17370
  construct: constructYamlSet
17371
17371
  });
17372
- });
17373
- var require_default = /* @__PURE__ */ __commonJSMin((exports, module) => {
17372
+ }));
17373
+ var require_default = /* @__PURE__ */ __commonJSMin(((exports, module) => {
17374
17374
  module.exports = require_core5().extend({
17375
17375
  implicit: [require_timestamp(), require_merge()],
17376
17376
  explicit: [
@@ -17380,8 +17380,8 @@ var require_default = /* @__PURE__ */ __commonJSMin((exports, module) => {
17380
17380
  require_set()
17381
17381
  ]
17382
17382
  });
17383
- });
17384
- var require_loader = /* @__PURE__ */ __commonJSMin((exports, module) => {
17383
+ }));
17384
+ var require_loader = /* @__PURE__ */ __commonJSMin(((exports, module) => {
17385
17385
  var common2 = require_common();
17386
17386
  var YAMLException2 = require_exception();
17387
17387
  var makeSnippet = require_snippet();
@@ -18422,8 +18422,8 @@ var require_loader = /* @__PURE__ */ __commonJSMin((exports, module) => {
18422
18422
  }
18423
18423
  module.exports.loadAll = loadAll2;
18424
18424
  module.exports.load = load3;
18425
- });
18426
- var require_dumper = /* @__PURE__ */ __commonJSMin((exports, module) => {
18425
+ }));
18426
+ var require_dumper = /* @__PURE__ */ __commonJSMin(((exports, module) => {
18427
18427
  var common2 = require_common();
18428
18428
  var YAMLException2 = require_exception();
18429
18429
  var DEFAULT_SCHEMA2 = require_default();
@@ -18646,7 +18646,7 @@ var require_dumper = /* @__PURE__ */ __commonJSMin((exports, module) => {
18646
18646
  return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE;
18647
18647
  }
18648
18648
  function writeScalar(state, string4, level, iskey, inblock) {
18649
- state.dump = function() {
18649
+ state.dump = (function() {
18650
18650
  if (string4.length === 0) return state.quotingType === QUOTING_TYPE_DOUBLE ? '""' : "''";
18651
18651
  if (!state.noCompatMode) {
18652
18652
  if (DEPRECATED_BOOLEANS_SYNTAX.indexOf(string4) !== -1 || DEPRECATED_BASE60_SYNTAX.test(string4)) return state.quotingType === QUOTING_TYPE_DOUBLE ? '"' + string4 + '"' : "'" + string4 + "'";
@@ -18671,7 +18671,7 @@ var require_dumper = /* @__PURE__ */ __commonJSMin((exports, module) => {
18671
18671
  default:
18672
18672
  throw new YAMLException2("impossible error: invalid scalar style");
18673
18673
  }
18674
- }();
18674
+ })();
18675
18675
  }
18676
18676
  function blockHeader(string4, indentPerLevel) {
18677
18677
  const indentIndicator = needIndentIndicator(string4) ? String(indentPerLevel) : "";
@@ -18683,12 +18683,12 @@ var require_dumper = /* @__PURE__ */ __commonJSMin((exports, module) => {
18683
18683
  }
18684
18684
  function foldString(string4, width) {
18685
18685
  const lineRe = /(\n+)([^\n]*)/g;
18686
- let result = function() {
18686
+ let result = (function() {
18687
18687
  let nextLF = string4.indexOf("\n");
18688
18688
  nextLF = nextLF !== -1 ? nextLF : string4.length;
18689
18689
  lineRe.lastIndex = nextLF;
18690
18690
  return foldLine(string4.slice(0, nextLF), width);
18691
- }();
18691
+ })();
18692
18692
  let prevMoreIndented = string4[0] === "\n" || string4[0] === " ";
18693
18693
  let moreIndented;
18694
18694
  let match;
@@ -18920,8 +18920,8 @@ var require_dumper = /* @__PURE__ */ __commonJSMin((exports, module) => {
18920
18920
  return "";
18921
18921
  }
18922
18922
  module.exports.dump = dump2;
18923
- });
18924
- var import_js_yaml = /* @__PURE__ */ __toESM2((/* @__PURE__ */ __commonJSMin((exports, module) => {
18923
+ }));
18924
+ var import_js_yaml = /* @__PURE__ */ __toESM2((/* @__PURE__ */ __commonJSMin(((exports, module) => {
18925
18925
  var loader = require_loader();
18926
18926
  var dumper = require_dumper();
18927
18927
  function renamed(from, to) {
@@ -18957,7 +18957,7 @@ var import_js_yaml = /* @__PURE__ */ __toESM2((/* @__PURE__ */ __commonJSMin((ex
18957
18957
  module.exports.safeLoad = renamed("safeLoad", "load");
18958
18958
  module.exports.safeLoadAll = renamed("safeLoadAll", "loadAll");
18959
18959
  module.exports.safeDump = renamed("safeDump", "dump");
18960
- }))(), 1);
18960
+ })))(), 1);
18961
18961
  var { Type, Schema, FAILSAFE_SCHEMA, JSON_SCHEMA, CORE_SCHEMA, DEFAULT_SCHEMA, load, loadAll, dump, YAMLException, types, safeLoad, safeLoadAll, safeDump } = import_js_yaml.default;
18962
18962
  var index_vite_proxy_tmp_default = import_js_yaml.default;
18963
18963
 
@@ -20199,7 +20199,7 @@ if (process.platform === "linux") {
20199
20199
 
20200
20200
  // ../node_modules/signal-exit/dist/mjs/index.js
20201
20201
  var processOk = (process5) => !!process5 && typeof process5 === "object" && typeof process5.removeListener === "function" && typeof process5.emit === "function" && typeof process5.reallyExit === "function" && typeof process5.listeners === "function" && typeof process5.kill === "function" && typeof process5.pid === "number" && typeof process5.on === "function";
20202
- var kExitEmitter = Symbol.for("signal-exit emitter");
20202
+ var kExitEmitter = /* @__PURE__ */ Symbol.for("signal-exit emitter");
20203
20203
  var global = globalThis;
20204
20204
  var ObjectDefineProperty = Object.defineProperty.bind(Object);
20205
20205
  var Emitter = class {
@@ -21730,7 +21730,7 @@ function $constructor(name, initializer3, params) {
21730
21730
  Object.defineProperty(_, "name", { value: name });
21731
21731
  return _;
21732
21732
  }
21733
- var $brand = Symbol("zod_brand");
21733
+ var $brand = /* @__PURE__ */ Symbol("zod_brand");
21734
21734
  var $ZodAsyncError = class extends Error {
21735
21735
  constructor() {
21736
21736
  super(`Encountered Promise during synchronous parse. Use .parseAsync() instead.`);
@@ -31473,8 +31473,8 @@ function yo_default() {
31473
31473
 
31474
31474
  // ../node_modules/zod/v4/core/registries.js
31475
31475
  var _a2;
31476
- var $output = Symbol("ZodOutput");
31477
- var $input = Symbol("ZodInput");
31476
+ var $output = /* @__PURE__ */ Symbol("ZodOutput");
31477
+ var $input = /* @__PURE__ */ Symbol("ZodInput");
31478
31478
  var $ZodRegistry = class {
31479
31479
  constructor() {
31480
31480
  this._map = /* @__PURE__ */ new WeakMap();
@@ -32511,7 +32511,7 @@ function _stringbool(Classes, _params) {
32511
32511
  type: "pipe",
32512
32512
  in: stringSchema,
32513
32513
  out: booleanSchema,
32514
- transform: (input, payload) => {
32514
+ transform: ((input, payload) => {
32515
32515
  let data = input;
32516
32516
  if (params.case !== "sensitive")
32517
32517
  data = data.toLowerCase();
@@ -32530,14 +32530,14 @@ function _stringbool(Classes, _params) {
32530
32530
  });
32531
32531
  return {};
32532
32532
  }
32533
- },
32534
- reverseTransform: (input, _payload) => {
32533
+ }),
32534
+ reverseTransform: ((input, _payload) => {
32535
32535
  if (input === true) {
32536
32536
  return truthyArray[0] || "true";
32537
32537
  } else {
32538
32538
  return falsyArray[0] || "false";
32539
32539
  }
32540
- },
32540
+ }),
32541
32541
  error: params.error
32542
32542
  });
32543
32543
  return codec2;
@@ -36124,7 +36124,7 @@ function composeYaml(cfg, req) {
36124
36124
  env.push("ENGINE_WEB_SEARCH_API_KEY: ${ENGINE_WEB_SEARCH_API_KEY:-}");
36125
36125
  }
36126
36126
  env.push("ENGINE_CONFIG_FILE: /etc/foresthub/workflow.json");
36127
- env.push("ENGINE_MEMORY_DIR: /var/forest/memory");
36127
+ env.push("ENGINE_MEMORY_DIR: /var/lib/foresthub/memory");
36128
36128
  if (hasHardware) env.push("ENGINE_DEVICE_MANIFEST_FILE: /etc/foresthub/device_manifest.json");
36129
36129
  if (hasExternal) env.push("ENGINE_EXTERNAL_RESOURCES_FILE: /etc/foresthub/external_resources.json");
36130
36130
  if (hasMapping) env.push("ENGINE_DEPLOYMENT_MAPPING_FILE: /etc/foresthub/deployment_mapping.json");
@@ -36132,7 +36132,7 @@ function composeYaml(cfg, req) {
36132
36132
  if (hasHardware) vols.push("./device_manifest.json:/etc/foresthub/device_manifest.json:ro");
36133
36133
  if (hasExternal) vols.push("./external_resources.json:/etc/foresthub/external_resources.json:ro");
36134
36134
  if (hasMapping) vols.push("./deployment_mapping.json:/etc/foresthub/deployment_mapping.json:ro");
36135
- vols.push("engine-memory:/var/forest/memory");
36135
+ vols.push("engine-memory:/var/lib/foresthub/memory");
36136
36136
  const cdev = /* @__PURE__ */ new Set();
36137
36137
  let needsPrivileged = false;
36138
36138
  for (const ch of req.hardwareChannels) {
@@ -36371,6 +36371,24 @@ scp fh-engine.tar docker-compose.yml workflow.json${transferExtraStr} .env \\
36371
36371
  \`\`\`bash
36372
36372
  ${runBlock}
36373
36373
  \`\`\`
36374
+
36375
+ ## Agent memory
36376
+
36377
+ The workflow's memory files live in the named volume \`engine-memory\` (mounted at
36378
+ \`/var/lib/foresthub/memory\`). They survive restarts and \`docker compose down\`;
36379
+ only \`docker compose down -v\` deletes them. The volume is namespaced by the
36380
+ compose project name, which defaults to the bundle directory's name \u2014 keep it
36381
+ stable across updates, or pin it via \`COMPOSE_PROJECT_NAME\`. In this standalone
36382
+ bundle the volume is the only copy of the memory.
36383
+
36384
+ To keep the data at a host path instead, replace the named volume with a bind
36385
+ mount. Named-volume ownership is handled by the image; a bind-mounted host
36386
+ directory you must create and chown to the engine's nonroot user yourself:
36387
+
36388
+ \`\`\`bash
36389
+ sudo mkdir -p /data/foresthub/memory && sudo chown -R 65532:65532 /data/foresthub/memory
36390
+ # docker-compose.yml: - /data/foresthub/memory:/var/lib/foresthub/memory
36391
+ \`\`\`
36374
36392
  `;
36375
36393
  }
36376
36394
  function ctxSizeVar(modelId) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@foresthubai/workflow-cli",
3
- "version": "0.4.0",
3
+ "version": "0.4.2",
4
4
  "type": "module",
5
5
  "description": "fh-workflow CLI — author, validate, and visually edit ForestHub workflow JSON. Bundles the visual builder; no other install required.",
6
6
  "license": "AGPL-3.0-only",
@@ -8,7 +8,7 @@
8
8
  "node": ">=20"
9
9
  },
10
10
  "bin": {
11
- "fh-workflow": "./dist-cli/cli.js"
11
+ "fh-workflow": "dist-cli/cli.js"
12
12
  },
13
13
  "files": [
14
14
  "dist",
@@ -49,7 +49,7 @@
49
49
  "ajv": "^8.20.0",
50
50
  "ajv-formats": "^3.0.1",
51
51
  "autoprefixer": "^10.4.0",
52
- "esbuild": "^0.24.0",
52
+ "esbuild": "^0.28.0",
53
53
  "i18next": "^25.3.2",
54
54
  "js-yaml": "^4.2.0",
55
55
  "lucide-react": "^0.462.0",