@floless/app 0.73.1 → 0.74.0

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.
@@ -5489,7 +5489,7 @@ var require_thread_stream = __commonJS({
5489
5489
  var { version } = require_package();
5490
5490
  var { EventEmitter: EventEmitter2 } = require("events");
5491
5491
  var { Worker: Worker2 } = require("worker_threads");
5492
- var { join: join31 } = require("path");
5492
+ var { join: join32 } = require("path");
5493
5493
  var { pathToFileURL } = require("url");
5494
5494
  var { wait } = require_wait();
5495
5495
  var {
@@ -5540,7 +5540,7 @@ var require_thread_stream = __commonJS({
5540
5540
  function createWorker(stream, opts) {
5541
5541
  const { filename, workerData } = opts;
5542
5542
  const bundlerOverrides = "__bundlerPathsOverrides" in globalThis ? globalThis.__bundlerPathsOverrides : {};
5543
- const toExecute = bundlerOverrides["thread-stream-worker"] || join31(__dirname, "lib", "worker.js");
5543
+ const toExecute = bundlerOverrides["thread-stream-worker"] || join32(__dirname, "lib", "worker.js");
5544
5544
  const worker = new Worker2(toExecute, {
5545
5545
  ...opts.workerOpts,
5546
5546
  name: opts.workerOpts?.name || "thread-stream",
@@ -6006,9 +6006,9 @@ var require_transport = __commonJS({
6006
6006
  "node_modules/pino/lib/transport.js"(exports2, module2) {
6007
6007
  "use strict";
6008
6008
  var { createRequire: createRequire5 } = require("module");
6009
- var { existsSync: existsSync27 } = require("node:fs");
6009
+ var { existsSync: existsSync28 } = require("node:fs");
6010
6010
  var getCallers = require_caller();
6011
- var { join: join31, isAbsolute: isAbsolute2, sep: sep4 } = require("node:path");
6011
+ var { join: join32, isAbsolute: isAbsolute2, sep: sep4 } = require("node:path");
6012
6012
  var { fileURLToPath: fileURLToPath6 } = require("node:url");
6013
6013
  var sleep = require_atomic_sleep();
6014
6014
  var onExit = require_on_exit_leak_free();
@@ -6080,7 +6080,7 @@ var require_transport = __commonJS({
6080
6080
  return false;
6081
6081
  }
6082
6082
  }
6083
- return isAbsolute2(path) && !existsSync27(path);
6083
+ return isAbsolute2(path) && !existsSync28(path);
6084
6084
  }
6085
6085
  function stripQuotes(value) {
6086
6086
  const first = value[0];
@@ -6161,7 +6161,7 @@ var require_transport = __commonJS({
6161
6161
  throw new Error("only one of target or targets can be specified");
6162
6162
  }
6163
6163
  if (targets) {
6164
- target = bundlerOverrides["pino-worker"] || join31(__dirname, "worker.js");
6164
+ target = bundlerOverrides["pino-worker"] || join32(__dirname, "worker.js");
6165
6165
  options.targets = targets.filter((dest) => dest.target).map((dest) => {
6166
6166
  return {
6167
6167
  ...dest,
@@ -6179,7 +6179,7 @@ var require_transport = __commonJS({
6179
6179
  });
6180
6180
  });
6181
6181
  } else if (pipeline2) {
6182
- target = bundlerOverrides["pino-worker"] || join31(__dirname, "worker.js");
6182
+ target = bundlerOverrides["pino-worker"] || join32(__dirname, "worker.js");
6183
6183
  options.pipelines = [pipeline2.map((dest) => {
6184
6184
  return {
6185
6185
  ...dest,
@@ -6202,7 +6202,7 @@ var require_transport = __commonJS({
6202
6202
  return origin;
6203
6203
  }
6204
6204
  if (origin === "pino/file") {
6205
- return join31(__dirname, "..", "file.js");
6205
+ return join32(__dirname, "..", "file.js");
6206
6206
  }
6207
6207
  let fixTarget2;
6208
6208
  for (const filePath of callers) {
@@ -7182,7 +7182,7 @@ var require_safe_stable_stringify = __commonJS({
7182
7182
  return circularValue;
7183
7183
  }
7184
7184
  let res = "";
7185
- let join31 = ",";
7185
+ let join32 = ",";
7186
7186
  const originalIndentation = indentation;
7187
7187
  if (Array.isArray(value)) {
7188
7188
  if (value.length === 0) {
@@ -7196,7 +7196,7 @@ var require_safe_stable_stringify = __commonJS({
7196
7196
  indentation += spacer;
7197
7197
  res += `
7198
7198
  ${indentation}`;
7199
- join31 = `,
7199
+ join32 = `,
7200
7200
  ${indentation}`;
7201
7201
  }
7202
7202
  const maximumValuesToStringify = Math.min(value.length, maximumBreadth);
@@ -7204,13 +7204,13 @@ ${indentation}`;
7204
7204
  for (; i < maximumValuesToStringify - 1; i++) {
7205
7205
  const tmp2 = stringifyFnReplacer(String(i), value, stack, replacer, spacer, indentation);
7206
7206
  res += tmp2 !== void 0 ? tmp2 : "null";
7207
- res += join31;
7207
+ res += join32;
7208
7208
  }
7209
7209
  const tmp = stringifyFnReplacer(String(i), value, stack, replacer, spacer, indentation);
7210
7210
  res += tmp !== void 0 ? tmp : "null";
7211
7211
  if (value.length - 1 > maximumBreadth) {
7212
7212
  const removedKeys = value.length - maximumBreadth - 1;
7213
- res += `${join31}"... ${getItemCount(removedKeys)} not stringified"`;
7213
+ res += `${join32}"... ${getItemCount(removedKeys)} not stringified"`;
7214
7214
  }
7215
7215
  if (spacer !== "") {
7216
7216
  res += `
@@ -7231,7 +7231,7 @@ ${originalIndentation}`;
7231
7231
  let separator = "";
7232
7232
  if (spacer !== "") {
7233
7233
  indentation += spacer;
7234
- join31 = `,
7234
+ join32 = `,
7235
7235
  ${indentation}`;
7236
7236
  whitespace = " ";
7237
7237
  }
@@ -7245,13 +7245,13 @@ ${indentation}`;
7245
7245
  const tmp = stringifyFnReplacer(key2, value, stack, replacer, spacer, indentation);
7246
7246
  if (tmp !== void 0) {
7247
7247
  res += `${separator}${strEscape(key2)}:${whitespace}${tmp}`;
7248
- separator = join31;
7248
+ separator = join32;
7249
7249
  }
7250
7250
  }
7251
7251
  if (keyLength > maximumBreadth) {
7252
7252
  const removedKeys = keyLength - maximumBreadth;
7253
7253
  res += `${separator}"...":${whitespace}"${getItemCount(removedKeys)} not stringified"`;
7254
- separator = join31;
7254
+ separator = join32;
7255
7255
  }
7256
7256
  if (spacer !== "" && separator.length > 1) {
7257
7257
  res = `
@@ -7292,7 +7292,7 @@ ${originalIndentation}`;
7292
7292
  }
7293
7293
  const originalIndentation = indentation;
7294
7294
  let res = "";
7295
- let join31 = ",";
7295
+ let join32 = ",";
7296
7296
  if (Array.isArray(value)) {
7297
7297
  if (value.length === 0) {
7298
7298
  return "[]";
@@ -7305,7 +7305,7 @@ ${originalIndentation}`;
7305
7305
  indentation += spacer;
7306
7306
  res += `
7307
7307
  ${indentation}`;
7308
- join31 = `,
7308
+ join32 = `,
7309
7309
  ${indentation}`;
7310
7310
  }
7311
7311
  const maximumValuesToStringify = Math.min(value.length, maximumBreadth);
@@ -7313,13 +7313,13 @@ ${indentation}`;
7313
7313
  for (; i < maximumValuesToStringify - 1; i++) {
7314
7314
  const tmp2 = stringifyArrayReplacer(String(i), value[i], stack, replacer, spacer, indentation);
7315
7315
  res += tmp2 !== void 0 ? tmp2 : "null";
7316
- res += join31;
7316
+ res += join32;
7317
7317
  }
7318
7318
  const tmp = stringifyArrayReplacer(String(i), value[i], stack, replacer, spacer, indentation);
7319
7319
  res += tmp !== void 0 ? tmp : "null";
7320
7320
  if (value.length - 1 > maximumBreadth) {
7321
7321
  const removedKeys = value.length - maximumBreadth - 1;
7322
- res += `${join31}"... ${getItemCount(removedKeys)} not stringified"`;
7322
+ res += `${join32}"... ${getItemCount(removedKeys)} not stringified"`;
7323
7323
  }
7324
7324
  if (spacer !== "") {
7325
7325
  res += `
@@ -7332,7 +7332,7 @@ ${originalIndentation}`;
7332
7332
  let whitespace = "";
7333
7333
  if (spacer !== "") {
7334
7334
  indentation += spacer;
7335
- join31 = `,
7335
+ join32 = `,
7336
7336
  ${indentation}`;
7337
7337
  whitespace = " ";
7338
7338
  }
@@ -7341,7 +7341,7 @@ ${indentation}`;
7341
7341
  const tmp = stringifyArrayReplacer(key2, value[key2], stack, replacer, spacer, indentation);
7342
7342
  if (tmp !== void 0) {
7343
7343
  res += `${separator}${strEscape(key2)}:${whitespace}${tmp}`;
7344
- separator = join31;
7344
+ separator = join32;
7345
7345
  }
7346
7346
  }
7347
7347
  if (spacer !== "" && separator.length > 1) {
@@ -7399,20 +7399,20 @@ ${originalIndentation}`;
7399
7399
  indentation += spacer;
7400
7400
  let res2 = `
7401
7401
  ${indentation}`;
7402
- const join32 = `,
7402
+ const join33 = `,
7403
7403
  ${indentation}`;
7404
7404
  const maximumValuesToStringify = Math.min(value.length, maximumBreadth);
7405
7405
  let i = 0;
7406
7406
  for (; i < maximumValuesToStringify - 1; i++) {
7407
7407
  const tmp2 = stringifyIndent(String(i), value[i], stack, spacer, indentation);
7408
7408
  res2 += tmp2 !== void 0 ? tmp2 : "null";
7409
- res2 += join32;
7409
+ res2 += join33;
7410
7410
  }
7411
7411
  const tmp = stringifyIndent(String(i), value[i], stack, spacer, indentation);
7412
7412
  res2 += tmp !== void 0 ? tmp : "null";
7413
7413
  if (value.length - 1 > maximumBreadth) {
7414
7414
  const removedKeys = value.length - maximumBreadth - 1;
7415
- res2 += `${join32}"... ${getItemCount(removedKeys)} not stringified"`;
7415
+ res2 += `${join33}"... ${getItemCount(removedKeys)} not stringified"`;
7416
7416
  }
7417
7417
  res2 += `
7418
7418
  ${originalIndentation}`;
@@ -7428,16 +7428,16 @@ ${originalIndentation}`;
7428
7428
  return '"[Object]"';
7429
7429
  }
7430
7430
  indentation += spacer;
7431
- const join31 = `,
7431
+ const join32 = `,
7432
7432
  ${indentation}`;
7433
7433
  let res = "";
7434
7434
  let separator = "";
7435
7435
  let maximumPropertiesToStringify = Math.min(keyLength, maximumBreadth);
7436
7436
  if (isTypedArrayWithEntries(value)) {
7437
- res += stringifyTypedArray(value, join31, maximumBreadth);
7437
+ res += stringifyTypedArray(value, join32, maximumBreadth);
7438
7438
  keys = keys.slice(value.length);
7439
7439
  maximumPropertiesToStringify -= value.length;
7440
- separator = join31;
7440
+ separator = join32;
7441
7441
  }
7442
7442
  if (deterministic) {
7443
7443
  keys = sort(keys, comparator);
@@ -7448,13 +7448,13 @@ ${indentation}`;
7448
7448
  const tmp = stringifyIndent(key2, value[key2], stack, spacer, indentation);
7449
7449
  if (tmp !== void 0) {
7450
7450
  res += `${separator}${strEscape(key2)}: ${tmp}`;
7451
- separator = join31;
7451
+ separator = join32;
7452
7452
  }
7453
7453
  }
7454
7454
  if (keyLength > maximumBreadth) {
7455
7455
  const removedKeys = keyLength - maximumBreadth;
7456
7456
  res += `${separator}"...": "${getItemCount(removedKeys)} not stringified"`;
7457
- separator = join31;
7457
+ separator = join32;
7458
7458
  }
7459
7459
  if (separator !== "") {
7460
7460
  res = `
@@ -41991,7 +41991,7 @@ var require_send = __commonJS({
41991
41991
  var { parseTokenList } = require_parseTokenList();
41992
41992
  var { createHttpError } = require_createHttpError();
41993
41993
  var extname3 = path.extname;
41994
- var join31 = path.join;
41994
+ var join32 = path.join;
41995
41995
  var normalize2 = path.normalize;
41996
41996
  var resolve6 = path.resolve;
41997
41997
  var sep4 = path.sep;
@@ -42078,7 +42078,7 @@ var require_send = __commonJS({
42078
42078
  return { statusCode: 403 };
42079
42079
  }
42080
42080
  parts = path2.split(sep4);
42081
- path2 = normalize2(join31(root, path2));
42081
+ path2 = normalize2(join32(root, path2));
42082
42082
  } else {
42083
42083
  if (UP_PATH_REGEXP.test(path2)) {
42084
42084
  debug('malicious path "%s"', path2);
@@ -42361,7 +42361,7 @@ var require_send = __commonJS({
42361
42361
  let err2;
42362
42362
  for (let i = 0; i < options.index.length; i++) {
42363
42363
  const index = options.index[i];
42364
- const p = join31(path2, index);
42364
+ const p = join32(path2, index);
42365
42365
  const { error, stat: stat4 } = await tryStat(p);
42366
42366
  if (error) {
42367
42367
  err2 = error;
@@ -50827,9 +50827,9 @@ var import_node_readline2 = require("node:readline");
50827
50827
 
50828
50828
  // index.ts
50829
50829
  var import_node_url5 = require("node:url");
50830
- var import_node_path30 = require("node:path");
50830
+ var import_node_path31 = require("node:path");
50831
50831
  var import_node_os21 = require("node:os");
50832
- var import_node_fs32 = require("node:fs");
50832
+ var import_node_fs33 = require("node:fs");
50833
50833
  var import_node_child_process8 = require("node:child_process");
50834
50834
 
50835
50835
  // log.mjs
@@ -53022,7 +53022,7 @@ function appVersion() {
53022
53022
  return resolveVersion({
53023
53023
  isSea: isSea2(),
53024
53024
  sqVersionXml: readSqVersionXml(),
53025
- define: true ? "0.73.1" : void 0,
53025
+ define: true ? "0.74.0" : void 0,
53026
53026
  pkgVersion: readPkgVersion()
53027
53027
  });
53028
53028
  }
@@ -53032,7 +53032,7 @@ function resolveChannel(s) {
53032
53032
  return "dev";
53033
53033
  }
53034
53034
  function appChannel() {
53035
- return resolveChannel({ isSea: isSea2(), define: true ? "0.73.1" : void 0 });
53035
+ return resolveChannel({ isSea: isSea2(), define: true ? "0.74.0" : void 0 });
53036
53036
  }
53037
53037
 
53038
53038
  // workflow-update.ts
@@ -53397,7 +53397,7 @@ function extractSavedPath(events) {
53397
53397
  var aisc_shapes_default = { "C10X15.3": 2.6, C10X20: 2.74, C10X25: 2.89, C10X30: 3.03, "C12X20.7": 2.94, C12X25: 3.05, C12X30: 3.17, "C15X33.9": 3.4, C15X40: 3.52, C15X50: 3.72, "C3X3.5": 1.37, "C3X4.1": 1.41, C3X5: 1.5, C3X6: 1.6, "C4X4.5": 1.52, "C4X5.4": 1.58, "C4X6.25": 1.65, "C4X7.25": 1.72, "C5X6.7": 1.75, C5X9: 1.89, "C6X10.5": 2.03, C6X13: 2.16, "C6X8.2": 1.92, "C7X12.25": 2.19, "C7X14.75": 2.3, "C7X9.8": 2.09, "C8X11.5": 2.26, "C8X13.75": 2.34, "C8X18.75": 2.53, "C9X13.4": 2.43, C9X15: 2.49, C9X20: 2.65, HP10X42: 10.1, HP10X57: 10.2, HP12X53: 12, HP12X63: 12.1, HP12X74: 12.2, HP12X84: 12.3, HP12X89: 12.3, HP14X102: 14.8, HP14X117: 14.9, HP14X73: 14.6, HP14X89: 14.7, HP16X101: 15.8, HP16X121: 15.9, HP16X141: 16, HP16X162: 16.1, HP16X183: 16.3, HP16X88: 15.7, HP18X135: 17.8, HP18X157: 17.9, HP18X181: 18, HP18X204: 18.1, HP8X36: 8.16, "M10X7.5": 2.69, M10X8: 2.69, M10X9: 2.69, "M12.5X11.6": 3.5, "M12.5X12.4": 3.75, M12X10: 3.25, "M12X10.8": 3.07, "M12X11.8": 3.07, "M3X2.9": 2.25, "M4X3.2": 2.25, "M4X3.45": 2.25, "M4X4.08": 2.25, M4X6: 3.8, "M5X18.9": 5, "M6X3.7": 2, "M6X4.4": 1.84, "M8X6.2": 2.28, "M8X6.5": 2.28, MC10X22: 3.32, MC10X25: 3.41, "MC10X28.5": 3.95, "MC10X33.6": 4.1, "MC10X41.1": 4.32, "MC10X6.5": 1.17, "MC10X8.4": 1.5, "MC12X10.6": 1.5, "MC12X14.3": 2.12, MC12X31: 3.67, MC12X35: 3.77, MC12X40: 3.89, MC12X45: 4.01, MC12X50: 4.14, "MC13X31.8": 4, MC13X35: 4.07, MC13X40: 4.19, MC13X50: 4.41, "MC18X42.7": 3.95, "MC18X45.8": 4, "MC18X51.9": 4.1, MC18X58: 4.2, "MC3X7.1": 1.94, "MC4X13.8": 2.5, MC6X12: 2.5, "MC6X15.1": 2.94, "MC6X15.3": 3.5, "MC6X16.3": 3, MC6X18: 3.5, "MC6X6.5": 1.85, MC6X7: 1.88, "MC7X19.1": 3.45, "MC7X22.7": 3.6, "MC8X18.7": 2.98, MC8X20: 3.03, "MC8X21.4": 3.45, "MC8X22.8": 3.5, "MC8X8.5": 1.87, "MC9X23.9": 3.45, "MC9X25.4": 3.5, "MT2.5X9.45": 5, MT2X3: 3.8, "MT3X1.85": 2, "MT3X2.2": 1.84, "MT4X3.1": 2.28, "MT4X3.25": 2.28, "MT5X3.75": 2.69, MT5X4: 2.69, "MT5X4.5": 2.69, "MT6.25X5.8": 3.5, "MT6.25X6.2": 3.75, MT6X5: 3.25, "MT6X5.4": 3.07, "MT6X5.9": 3.07, "S10X25.4": 4.66, S10X35: 4.94, "S12X31.8": 5, S12X35: 5.08, "S12X40.8": 5.25, S12X50: 5.48, "S15X42.9": 5.5, S15X50: 5.64, "S18X54.7": 6, S18X70: 6.25, S20X66: 6.26, S20X75: 6.39, S20X86: 7.06, S20X96: 7.2, S24X100: 7.25, S24X106: 7.87, S24X121: 8.05, S24X80: 7, S24X90: 7.13, "S3X5.7": 2.33, "S3X7.5": 2.51, "S4X7.7": 2.66, "S4X9.5": 2.8, S5X10: 3, "S6X12.5": 3.33, "S6X17.25": 3.57, "S8X18.4": 4, S8X23: 4.17, "ST1.5X2.85": 2.33, "ST1.5X3.75": 2.51, ST10X33: 6.26, "ST10X37.5": 6.39, ST10X43: 7.06, ST10X48: 7.2, ST12X40: 7, ST12X45: 7.13, ST12X50: 7.25, ST12X53: 7.87, "ST12X60.5": 8.05, "ST2.5X5": 3, "ST2X3.85": 2.66, "ST2X4.75": 2.8, "ST3X6.25": 3.33, "ST3X8.6": 3.57, "ST4X11.5": 4.17, "ST4X9.2": 4, "ST5X12.7": 4.66, "ST5X17.5": 4.94, "ST6X15.9": 5, "ST6X17.5": 5.08, "ST6X20.4": 5.25, ST6X25: 5.48, "ST7.5X21.45": 5.5, "ST7.5X25": 5.64, "ST9X27.35": 6, ST9X35: 6.25, W10X100: 10.3, W10X112: 10.4, W10X12: 3.96, W10X15: 4, W10X17: 4.01, W10X19: 4.02, W10X22: 5.75, W10X26: 5.77, W10X30: 5.81, W10X33: 7.96, W10X39: 7.99, W10X45: 8.02, W10X49: 10, W10X54: 10, W10X60: 10.1, W10X68: 10.1, W10X77: 10.2, W10X88: 10.3, W12X106: 12.2, W12X120: 12.3, W12X136: 12.4, W12X14: 3.97, W12X152: 12.5, W12X16: 3.99, W12X170: 12.6, W12X19: 4.01, W12X190: 12.7, W12X210: 12.8, W12X22: 4.03, W12X230: 12.9, W12X252: 13, W12X26: 6.49, W12X279: 13.1, W12X30: 6.52, W12X305: 13.2, W12X336: 13.4, W12X35: 6.56, W12X40: 8.01, W12X45: 8.05, W12X50: 8.08, W12X53: 10, W12X58: 10, W12X65: 12, W12X72: 12, W12X79: 12.1, W12X87: 12.1, W12X96: 12.2, W14X109: 14.6, W14X120: 14.7, W14X132: 14.7, W14X145: 15.5, W14X159: 15.6, W14X176: 15.7, W14X193: 15.7, W14X211: 15.8, W14X22: 5, W14X233: 15.9, W14X257: 16, W14X26: 5.03, W14X283: 16.1, W14X30: 6.73, W14X311: 16.2, W14X34: 6.75, W14X342: 16.4, W14X370: 16.5, W14X38: 6.77, W14X398: 16.6, W14X426: 16.7, W14X43: 8, W14X455: 16.8, W14X48: 8.03, W14X500: 17, W14X53: 8.06, W14X550: 17.2, W14X605: 17.4, W14X61: 10, W14X665: 17.7, W14X68: 10, W14X730: 17.9, W14X74: 10.1, W14X808: 18.6, W14X82: 10.1, W14X873: 18.8, W14X90: 14.5, W14X99: 14.6, W16X100: 10.4, W16X26: 5.5, W16X31: 5.53, W16X36: 6.99, W16X40: 7, W16X45: 7.04, W16X50: 7.07, W16X57: 7.12, W16X67: 10.2, W16X77: 10.3, W16X89: 10.4, W18X106: 11.2, W18X119: 11.3, W18X130: 11.2, W18X143: 11.2, W18X158: 11.3, W18X175: 11.4, W18X192: 11.5, W18X211: 11.6, W18X234: 11.7, W18X258: 11.8, W18X283: 11.9, W18X311: 12, W18X35: 6, W18X40: 6.02, W18X46: 6.06, W18X50: 7.5, W18X55: 7.53, W18X60: 7.56, W18X65: 7.59, W18X71: 7.64, W18X76: 11, W18X86: 11.1, W18X97: 11.1, W21X101: 12.3, W21X111: 12.3, W21X122: 12.4, W21X132: 12.4, W21X147: 12.5, W21X166: 12.4, W21X182: 12.5, W21X201: 12.6, W21X223: 12.7, W21X248: 12.8, W21X275: 12.9, W21X44: 6.5, W21X48: 8.14, W21X50: 6.53, W21X55: 8.22, W21X57: 6.56, W21X62: 8.24, W21X68: 8.27, W21X73: 8.3, W21X83: 8.36, W21X93: 8.42, W24X103: 9, W24X104: 12.8, W24X117: 12.8, W24X131: 12.9, W24X146: 12.9, W24X162: 13, W24X176: 12.9, W24X192: 13, W24X207: 13, W24X229: 13.1, W24X250: 13.2, W24X279: 13.3, W24X306: 13.4, W24X335: 13.5, W24X370: 13.7, W24X55: 7.01, W24X62: 7.04, W24X68: 8.97, W24X76: 8.99, W24X84: 9.02, W24X94: 9.07, W27X102: 10, W27X114: 10.1, W27X129: 10, W27X146: 14, W27X161: 14, W27X178: 14.1, W27X194: 14, W27X217: 14.1, W27X235: 14.2, W27X258: 14.3, W27X281: 14.4, W27X307: 14.4, W27X336: 14.6, W27X368: 14.7, W27X539: 15.3, W27X84: 10, W27X94: 10, W30X108: 10.5, W30X116: 10.5, W30X124: 10.5, W30X132: 10.5, W30X148: 10.5, W30X173: 15, W30X191: 15, W30X211: 15.1, W30X235: 15.1, W30X261: 15.2, W30X292: 15.3, W30X326: 15.4, W30X357: 15.5, W30X391: 15.6, W30X90: 10.4, W30X99: 10.5, W33X118: 11.5, W33X130: 11.5, W33X141: 11.5, W33X152: 11.6, W33X169: 11.5, W33X201: 15.7, W33X221: 15.8, W33X241: 15.9, W33X263: 15.8, W33X291: 15.9, W33X318: 16, W33X354: 16.1, W33X387: 16.2, W36X135: 12, W36X150: 12, W36X160: 12, W36X170: 12, W36X182: 12.1, W36X194: 12.1, W36X210: 12.2, W36X231: 16.5, W36X232: 12.1, W36X247: 16.5, W36X256: 12.2, W36X262: 16.6, W36X282: 16.6, W36X302: 16.7, W36X330: 16.6, W36X361: 16.7, W36X395: 16.8, W36X441: 17, W36X487: 17.1, W36X529: 17.2, W36X652: 17.6, W36X723: 17.8, W36X802: 18, W36X853: 18.2, W36X925: 18.6, W40X149: 11.8, W40X167: 11.8, W40X183: 11.8, W40X199: 15.8, W40X211: 11.8, W40X215: 15.8, W40X235: 11.9, W40X249: 15.8, W40X264: 11.9, W40X277: 15.8, W40X278: 12, W40X294: 12, W40X297: 15.8, W40X324: 15.9, W40X327: 12.1, W40X331: 12.2, W40X362: 16, W40X372: 16.1, W40X392: 12.4, W40X397: 16.1, W40X431: 16.2, W40X503: 16.4, W40X593: 16.7, W40X655: 16.9, W44X230: 15.8, W44X262: 15.8, W44X290: 15.8, W44X335: 15.9, W4X13: 4.06, W5X16: 5, W5X19: 5.03, W6X12: 4, W6X15: 5.99, W6X16: 4.03, W6X20: 6.02, W6X25: 6.08, "W6X8.5": 3.94, W6X9: 3.94, W8X10: 3.94, W8X13: 4, W8X15: 4.02, W8X18: 5.25, W8X21: 5.27, W8X24: 6.5, W8X28: 6.54, W8X31: 8, W8X35: 8.02, W8X40: 8.07, W8X48: 8.11, W8X58: 8.22, W8X67: 8.28, "WT10.5X100.5": 12.6, "WT10.5X111.5": 12.7, "WT10.5X124": 12.8, "WT10.5X137.5": 12.9, "WT10.5X22": 6.5, "WT10.5X24": 8.14, "WT10.5X25": 6.53, "WT10.5X27.5": 8.22, "WT10.5X28.5": 6.56, "WT10.5X31": 8.24, "WT10.5X34": 8.27, "WT10.5X36.5": 8.3, "WT10.5X41.5": 8.36, "WT10.5X46.5": 8.42, "WT10.5X50.5": 12.3, "WT10.5X55.5": 12.3, "WT10.5X61": 12.4, "WT10.5X66": 12.4, "WT10.5X73.5": 12.5, "WT10.5X83": 12.4, "WT10.5X91": 12.5, "WT12X103.5": 13, "WT12X114.5": 13.1, WT12X125: 13.2, "WT12X139.5": 13.3, WT12X153: 13.4, "WT12X167.5": 13.5, WT12X185: 13.7, "WT12X27.5": 7.01, WT12X31: 7.04, WT12X34: 8.97, WT12X38: 8.99, WT12X42: 9.02, WT12X47: 9.07, "WT12X51.5": 9, WT12X52: 12.8, "WT12X58.5": 12.8, "WT12X65.5": 12.9, WT12X73: 12.9, WT12X81: 13, WT12X88: 12.9, WT12X96: 13, "WT13.5X108.5": 14.1, "WT13.5X117.5": 14.2, "WT13.5X129": 14.3, "WT13.5X140.5": 14.4, "WT13.5X153.5": 14.4, "WT13.5X168": 14.6, "WT13.5X184": 14.7, "WT13.5X269.5": 15.3, "WT13.5X42": 10, "WT13.5X47": 10, "WT13.5X51": 10, "WT13.5X57": 10.1, "WT13.5X64.5": 10, "WT13.5X73": 14, "WT13.5X80.5": 14, "WT13.5X89": 14.1, "WT13.5X97": 14, "WT15X105.5": 15.1, "WT15X117.5": 15.1, "WT15X130.5": 15.2, WT15X146: 15.3, WT15X163: 15.4, "WT15X178.5": 15.5, "WT15X195.5": 15.6, WT15X45: 10.4, "WT15X49.5": 10.5, WT15X54: 10.5, WT15X58: 10.5, WT15X62: 10.5, WT15X66: 10.5, WT15X74: 10.5, "WT15X86.5": 15, "WT15X95.5": 15, "WT16.5X100.5": 15.7, "WT16.5X110.5": 15.8, "WT16.5X120.5": 15.9, "WT16.5X131.5": 15.8, "WT16.5X145.5": 15.9, "WT16.5X159": 16, "WT16.5X177": 16.1, "WT16.5X193.5": 16.2, "WT16.5X59": 11.5, "WT16.5X65": 11.5, "WT16.5X70.5": 11.5, "WT16.5X76": 11.6, "WT16.5X84.5": 11.5, WT18X105: 12.2, "WT18X115.5": 16.5, WT18X116: 12.1, "WT18X123.5": 16.5, WT18X128: 12.2, WT18X131: 16.6, WT18X141: 16.6, WT18X151: 16.7, WT18X165: 16.6, "WT18X180.5": 16.7, "WT18X197.5": 16.8, "WT18X220.5": 17, "WT18X243.5": 17.1, "WT18X264.5": 17.2, WT18X326: 17.6, "WT18X361.5": 17.8, WT18X401: 18, "WT18X426.5": 18.2, "WT18X462.5": 18.6, "WT18X67.5": 12, WT18X75: 12, WT18X80: 12, WT18X85: 12, WT18X91: 12.1, WT18X97: 12.1, "WT2.5X8": 5, "WT2.5X9.5": 5.03, "WT20X105.5": 11.8, "WT20X107.5": 15.8, "WT20X117.5": 11.9, "WT20X124.5": 15.8, WT20X132: 11.9, "WT20X138.5": 15.8, WT20X139: 12, WT20X147: 12, "WT20X148.5": 15.8, WT20X162: 15.9, "WT20X163.5": 12.1, "WT20X165.5": 12.2, WT20X181: 16, WT20X186: 16.1, WT20X196: 12.4, "WT20X198.5": 16.1, "WT20X215.5": 16.2, "WT20X251.5": 16.4, "WT20X296.5": 16.7, "WT20X327.5": 16.9, "WT20X74.5": 11.8, "WT20X83.5": 11.8, "WT20X91.5": 11.8, "WT20X99.5": 15.8, WT22X115: 15.8, WT22X131: 15.8, WT22X145: 15.8, "WT22X167.5": 15.9, "WT2X6.5": 4.06, WT3X10: 6.02, "WT3X12.5": 6.08, "WT3X4.25": 3.94, "WT3X4.5": 3.94, WT3X6: 4, "WT3X7.5": 5.99, WT3X8: 4.03, "WT4X10.5": 5.27, WT4X12: 6.5, WT4X14: 6.54, "WT4X15.5": 8, "WT4X17.5": 8.02, WT4X20: 8.07, WT4X24: 8.11, WT4X29: 8.22, "WT4X33.5": 8.28, WT4X5: 3.94, "WT4X6.5": 4, "WT4X7.5": 4.02, WT4X9: 5.25, WT5X11: 5.75, WT5X13: 5.77, WT5X15: 5.81, "WT5X16.5": 7.96, "WT5X19.5": 7.99, "WT5X22.5": 8.02, "WT5X24.5": 10, WT5X27: 10, WT5X30: 10.1, WT5X34: 10.1, "WT5X38.5": 10.2, WT5X44: 10.3, WT5X50: 10.3, WT5X56: 10.4, WT5X6: 3.96, "WT5X7.5": 4, "WT5X8.5": 4.01, "WT5X9.5": 4.02, WT6X105: 12.8, WT6X11: 4.03, WT6X115: 12.9, WT6X126: 13, WT6X13: 6.49, "WT6X139.5": 13.1, WT6X15: 6.52, "WT6X152.5": 13.2, WT6X168: 13.4, "WT6X17.5": 6.56, WT6X20: 8.01, "WT6X22.5": 8.05, WT6X25: 8.08, "WT6X26.5": 10, WT6X29: 10, "WT6X32.5": 12, WT6X36: 12, "WT6X39.5": 12.1, "WT6X43.5": 12.1, WT6X48: 12.2, WT6X53: 12.2, WT6X60: 12.3, WT6X68: 12.4, WT6X7: 3.97, WT6X76: 12.5, WT6X8: 3.99, WT6X85: 12.6, "WT6X9.5": 4.01, WT6X95: 12.7, "WT7X105.5": 15.8, WT7X11: 5, "WT7X116.5": 15.9, "WT7X128.5": 16, WT7X13: 5.03, "WT7X141.5": 16.1, WT7X15: 6.73, "WT7X155.5": 16.2, WT7X17: 6.75, WT7X171: 16.4, WT7X185: 16.5, WT7X19: 6.77, WT7X199: 16.6, "WT7X21.5": 8, WT7X213: 16.7, "WT7X227.5": 16.8, WT7X24: 8.03, WT7X250: 17, "WT7X26.5": 8.06, WT7X275: 17.2, "WT7X30.5": 10, "WT7X302.5": 17.4, "WT7X332.5": 17.7, WT7X34: 10, WT7X365: 17.9, WT7X37: 10.1, WT7X404: 18.6, WT7X41: 10.1, "WT7X436.5": 18.8, WT7X45: 14.5, "WT7X49.5": 14.6, "WT7X54.5": 14.6, WT7X60: 14.7, WT7X66: 14.7, "WT7X72.5": 15.5, "WT7X79.5": 15.6, WT7X88: 15.7, "WT7X96.5": 15.7, WT8X13: 5.5, "WT8X15.5": 5.53, WT8X18: 6.99, WT8X20: 7, "WT8X22.5": 7.04, WT8X25: 7.07, "WT8X28.5": 7.12, "WT8X33.5": 10.2, "WT8X38.5": 10.3, "WT8X44.5": 10.4, WT8X50: 10.4, "WT9X105.5": 11.6, WT9X117: 11.7, WT9X129: 11.8, "WT9X141.5": 11.9, "WT9X155.5": 12, "WT9X17.5": 6, WT9X20: 6.02, WT9X23: 6.06, WT9X25: 7.5, "WT9X27.5": 7.53, WT9X30: 7.56, "WT9X32.5": 7.59, "WT9X35.5": 7.64, WT9X38: 11, WT9X43: 11.1, "WT9X48.5": 11.1, WT9X53: 11.2, "WT9X59.5": 11.3, WT9X65: 11.2, "WT9X71.5": 11.2, WT9X79: 11.3, "WT9X87.5": 11.4, WT9X96: 11.5 };
53398
53398
 
53399
53399
  // index.ts
53400
- var import_node_crypto8 = require("node:crypto");
53400
+ var import_node_crypto9 = require("node:crypto");
53401
53401
 
53402
53402
  // graft.ts
53403
53403
  var TEKLA_MARKER = "Recipe: Tekla model plug-in";
@@ -54061,11 +54061,110 @@ function archiveProject(id) {
54061
54061
  (0, import_node_fs19.renameSync)(dir, dest);
54062
54062
  }
54063
54063
 
54064
- // contract-bake.ts
54064
+ // project-versions-store.ts
54065
+ var import_node_crypto7 = require("node:crypto");
54065
54066
  var import_node_fs20 = require("node:fs");
54067
+ var import_node_path18 = require("node:path");
54068
+ var BLOB_MIN = 8192;
54069
+ var BLOB_KEY = "__blobRef__";
54070
+ var HASH_RE = /^[0-9a-f]{64}$/;
54071
+ var versionsDir = (id) => (0, import_node_path18.join)(projectDir(id), "versions");
54072
+ var objectsDir = (id) => (0, import_node_path18.join)(projectDir(id), "objects");
54073
+ var logPath = (id) => (0, import_node_path18.join)(versionsDir(id), "log.json");
54074
+ function writeAtomic(path, text) {
54075
+ const tmp = `${path}.${process.pid}.tmp`;
54076
+ (0, import_node_fs20.writeFileSync)(tmp, text);
54077
+ (0, import_node_fs20.renameSync)(tmp, path);
54078
+ }
54079
+ function isVersionMeta(v) {
54080
+ if (!v || typeof v !== "object") return false;
54081
+ const r = v;
54082
+ return Number.isInteger(r.n) && typeof r.ts === "string" && typeof r.author === "string" && typeof r.message === "string" && (r.gate === "model" || r.gate === null) && (r.kind === "approve" || r.kind === "rollback" || r.kind === "rebake");
54083
+ }
54084
+ function loadLog(id) {
54085
+ try {
54086
+ const parsed = JSON.parse((0, import_node_fs20.readFileSync)(logPath(id), "utf8"));
54087
+ const raw = parsed && typeof parsed === "object" && Array.isArray(parsed.versions) ? parsed.versions : [];
54088
+ return { versions: raw.filter(isVersionMeta) };
54089
+ } catch {
54090
+ return { versions: [] };
54091
+ }
54092
+ }
54093
+ function dehydrate(node, blobs) {
54094
+ if (typeof node === "string") {
54095
+ if (node.length > BLOB_MIN) {
54096
+ const hash = (0, import_node_crypto7.createHash)("sha256").update(node).digest("hex");
54097
+ blobs.set(hash, node);
54098
+ return { [BLOB_KEY]: hash };
54099
+ }
54100
+ return node;
54101
+ }
54102
+ if (Array.isArray(node)) return node.map((x) => dehydrate(x, blobs));
54103
+ if (node && typeof node === "object") {
54104
+ const out = {};
54105
+ for (const [k, v] of Object.entries(node)) out[k] = dehydrate(v, blobs);
54106
+ return out;
54107
+ }
54108
+ return node;
54109
+ }
54110
+ function rehydrate(node, id) {
54111
+ if (Array.isArray(node)) return node.map((x) => rehydrate(x, id));
54112
+ if (node && typeof node === "object") {
54113
+ const obj = node;
54114
+ const keys = Object.keys(obj);
54115
+ const ref = obj[BLOB_KEY];
54116
+ if (keys.length === 1 && keys[0] === BLOB_KEY && typeof ref === "string" && HASH_RE.test(ref)) {
54117
+ return (0, import_node_fs20.readFileSync)((0, import_node_path18.join)(objectsDir(id), ref), "utf8");
54118
+ }
54119
+ const out = {};
54120
+ for (const [k, v] of Object.entries(obj)) out[k] = rehydrate(v, id);
54121
+ return out;
54122
+ }
54123
+ return node;
54124
+ }
54125
+ function createVersion(id, contract, meta) {
54126
+ (0, import_node_fs20.mkdirSync)(versionsDir(id), { recursive: true });
54127
+ (0, import_node_fs20.mkdirSync)(objectsDir(id), { recursive: true });
54128
+ const blobs = /* @__PURE__ */ new Map();
54129
+ const skeleton = dehydrate(contract, blobs);
54130
+ for (const [hash, text] of blobs) {
54131
+ const p = (0, import_node_path18.join)(objectsDir(id), hash);
54132
+ if (!(0, import_node_fs20.existsSync)(p)) writeAtomic(p, text);
54133
+ }
54134
+ const log2 = loadLog(id);
54135
+ const n = (log2.versions.at(-1)?.n ?? 0) + 1;
54136
+ const row = {
54137
+ n,
54138
+ ts: (/* @__PURE__ */ new Date()).toISOString(),
54139
+ author: meta.author,
54140
+ message: meta.message,
54141
+ gate: meta.gate,
54142
+ kind: meta.kind
54143
+ };
54144
+ writeAtomic((0, import_node_path18.join)(versionsDir(id), `${n}.json`), JSON.stringify({ meta: row, contract: skeleton }, null, 2));
54145
+ log2.versions.push(row);
54146
+ writeAtomic(logPath(id), JSON.stringify(log2, null, 2));
54147
+ return row;
54148
+ }
54149
+ function listVersions(id) {
54150
+ const versions = loadLog(id).versions;
54151
+ const tip = versions.at(-1)?.n;
54152
+ return versions.map((v) => ({ ...v, current: v.n === tip })).reverse();
54153
+ }
54154
+ function readVersion(id, n) {
54155
+ try {
54156
+ const snap = JSON.parse((0, import_node_fs20.readFileSync)((0, import_node_path18.join)(versionsDir(id), `${n}.json`), "utf8"));
54157
+ return rehydrate(snap.contract, id);
54158
+ } catch {
54159
+ return null;
54160
+ }
54161
+ }
54162
+
54163
+ // contract-bake.ts
54164
+ var import_node_fs21 = require("node:fs");
54066
54165
  var import_yaml5 = __toESM(require_dist6(), 1);
54067
54166
  function bakeContractIntoApp(sourcePath, contract) {
54068
- const doc = (0, import_yaml5.parseDocument)((0, import_node_fs20.readFileSync)(sourcePath, "utf8"));
54167
+ const doc = (0, import_yaml5.parseDocument)((0, import_node_fs21.readFileSync)(sourcePath, "utf8"));
54069
54168
  if (doc.errors.length > 0) {
54070
54169
  throw new Error(`contract bake: source is not valid YAML: ${doc.errors[0]?.message ?? "parse error"}`);
54071
54170
  }
@@ -54115,7 +54214,7 @@ function bakeContractIntoApp(sourcePath, contract) {
54115
54214
  );
54116
54215
  }
54117
54216
  doc.setIn(["nodes", idx, "config", "takeoff"], baked);
54118
- (0, import_node_fs20.writeFileSync)(sourcePath, doc.toString());
54217
+ (0, import_node_fs21.writeFileSync)(sourcePath, doc.toString());
54119
54218
  }
54120
54219
 
54121
54220
  // vectorize.ts
@@ -55046,10 +55145,10 @@ function contractToBom(contractInput) {
55046
55145
 
55047
55146
  // bom-export.ts
55048
55147
  var import_node_os14 = require("node:os");
55049
- var import_node_path18 = require("node:path");
55148
+ var import_node_path19 = require("node:path");
55050
55149
 
55051
55150
  // node_modules/write-excel-file/modules/export/writeXlsxFileNode.js
55052
- var import_node_fs21 = __toESM(require("node:fs"), 1);
55151
+ var import_node_fs22 = __toESM(require("node:fs"), 1);
55053
55152
 
55054
55153
  // node_modules/write-excel-file/modules/xlsx/helpers/features/getAdditionalContent.js
55055
55154
  function _createForOfIteratorHelperLoose(r, e) {
@@ -59221,7 +59320,7 @@ function writeXlsxFile(arg1, arg2, arg3) {
59221
59320
  },
59222
59321
  toFile: function toFile(filePath) {
59223
59322
  return createReadableStream().then(function(readableStream) {
59224
- return pipe(readableStream, import_node_fs21.default.createWriteStream(filePath));
59323
+ return pipe(readableStream, import_node_fs22.default.createWriteStream(filePath));
59225
59324
  });
59226
59325
  }
59227
59326
  };
@@ -59246,8 +59345,8 @@ function pipe(readableStream, writableStream) {
59246
59345
 
59247
59346
  // bom-export.ts
59248
59347
  function bomExportPath(appId, format) {
59249
- const root = process.env.FLOLESS_HOME ?? (0, import_node_path18.join)((0, import_node_os14.homedir)(), ".floless");
59250
- return (0, import_node_path18.join)(root, "exports", appId, `${appId}-bom.${format}`);
59348
+ const root = process.env.FLOLESS_HOME ?? (0, import_node_path19.join)((0, import_node_os14.homedir)(), ".floless");
59349
+ return (0, import_node_path19.join)(root, "exports", appId, `${appId}-bom.${format}`);
59251
59350
  }
59252
59351
  function csvField(v) {
59253
59352
  let s = String(v);
@@ -59275,11 +59374,11 @@ async function bomToXlsx(bom) {
59275
59374
  }
59276
59375
 
59277
59376
  // scene-bake.ts
59278
- var import_node_fs22 = require("node:fs");
59279
- var import_node_path19 = require("node:path");
59377
+ var import_node_fs23 = require("node:fs");
59378
+ var import_node_path20 = require("node:path");
59280
59379
  var import_yaml6 = __toESM(require_dist6(), 1);
59281
59380
  function bakeSceneIntoApp(sourcePath, scene, agent = "viewer-3d") {
59282
- const doc = (0, import_yaml6.parseDocument)((0, import_node_fs22.readFileSync)(sourcePath, "utf8"));
59381
+ const doc = (0, import_yaml6.parseDocument)((0, import_node_fs23.readFileSync)(sourcePath, "utf8"));
59283
59382
  if (doc.errors.length > 0) {
59284
59383
  throw new Error(`scene bake: source is not valid YAML: ${doc.errors[0]?.message ?? "parse error"}`);
59285
59384
  }
@@ -59288,10 +59387,10 @@ function bakeSceneIntoApp(sourcePath, scene, agent = "viewer-3d") {
59288
59387
  const idx = items.findIndex((it) => ((0, import_yaml6.isMap)(it) ? it.toJSON() : null)?.agent === agent);
59289
59388
  if (idx < 0) throw new Error(`no ${agent} render node to bake the scene into`);
59290
59389
  doc.setIn(["nodes", idx, "config", "scene"], scene);
59291
- (0, import_node_fs22.writeFileSync)(sourcePath, doc.toString());
59390
+ (0, import_node_fs23.writeFileSync)(sourcePath, doc.toString());
59292
59391
  }
59293
59392
  function bakeNodeConfigById(sourcePath, nodeId, patch2) {
59294
- const doc = (0, import_yaml6.parseDocument)((0, import_node_fs22.readFileSync)(sourcePath, "utf8"));
59393
+ const doc = (0, import_yaml6.parseDocument)((0, import_node_fs23.readFileSync)(sourcePath, "utf8"));
59295
59394
  if (doc.errors.length > 0) {
59296
59395
  throw new Error(`node bake: source is not valid YAML: ${doc.errors[0]?.message ?? "parse error"}`);
59297
59396
  }
@@ -59300,12 +59399,12 @@ function bakeNodeConfigById(sourcePath, nodeId, patch2) {
59300
59399
  const idx = items.findIndex((it) => ((0, import_yaml6.isMap)(it) ? it.toJSON() : null)?.id === nodeId);
59301
59400
  if (idx < 0) throw new Error(`no node with id "${nodeId}"`);
59302
59401
  for (const [key, value] of Object.entries(patch2)) doc.setIn(["nodes", idx, "config", key], value);
59303
- (0, import_node_fs22.writeFileSync)(sourcePath, doc.toString());
59402
+ (0, import_node_fs23.writeFileSync)(sourcePath, doc.toString());
59304
59403
  }
59305
59404
  function writeViewer3dApp(dir, appId, scene) {
59306
- (0, import_node_fs22.mkdirSync)(dir, { recursive: true });
59307
- const flo = (0, import_node_path19.join)(dir, `${appId}.flo`);
59308
- (0, import_node_fs22.writeFileSync)(flo, [
59405
+ (0, import_node_fs23.mkdirSync)(dir, { recursive: true });
59406
+ const flo = (0, import_node_path20.join)(dir, `${appId}.flo`);
59407
+ (0, import_node_fs23.writeFileSync)(flo, [
59309
59408
  `app: ${appId}`,
59310
59409
  "version: 0.1.0",
59311
59410
  "display-name: Steel 3D",
@@ -59326,11 +59425,11 @@ function writeViewer3dApp(dir, appId, scene) {
59326
59425
  return flo;
59327
59426
  }
59328
59427
  function writeIfcApp(dir, appId, scene, outputPath, opts = {}) {
59329
- (0, import_node_fs22.mkdirSync)(dir, { recursive: true });
59330
- const flo = (0, import_node_path19.join)(dir, `${appId}.flo`);
59428
+ (0, import_node_fs23.mkdirSync)(dir, { recursive: true });
59429
+ const flo = (0, import_node_path20.join)(dir, `${appId}.flo`);
59331
59430
  const displayName = opts.displayName ?? "Steel IFC";
59332
59431
  const description = opts.description ?? "IFC file written from an approved steel.takeoff/v1 contract (a companion export; the contract is the source of truth).";
59333
- (0, import_node_fs22.writeFileSync)(flo, [
59432
+ (0, import_node_fs23.writeFileSync)(flo, [
59334
59433
  `app: ${appId}`,
59335
59434
  "version: 0.1.0",
59336
59435
  `display-name: ${displayName}`,
@@ -59353,9 +59452,9 @@ function writeIfcApp(dir, appId, scene, outputPath, opts = {}) {
59353
59452
  return flo;
59354
59453
  }
59355
59454
  function writeTeklaApp(dir, appId, scene, teklaVersion = "2026.0") {
59356
- (0, import_node_fs22.mkdirSync)(dir, { recursive: true });
59357
- const flo = (0, import_node_path19.join)(dir, `${appId}.flo`);
59358
- (0, import_node_fs22.writeFileSync)(flo, [
59455
+ (0, import_node_fs23.mkdirSync)(dir, { recursive: true });
59456
+ const flo = (0, import_node_path20.join)(dir, `${appId}.flo`);
59457
+ (0, import_node_fs23.writeFileSync)(flo, [
59359
59458
  `app: ${appId}`,
59360
59459
  "version: 0.1.0",
59361
59460
  "display-name: Steel to Tekla",
@@ -59763,13 +59862,13 @@ function scoreContract2(contractInput) {
59763
59862
  }
59764
59863
 
59765
59864
  // app-lifecycle.ts
59766
- var import_node_fs25 = require("node:fs");
59865
+ var import_node_fs26 = require("node:fs");
59767
59866
  var import_node_os16 = require("node:os");
59768
- var import_node_path22 = require("node:path");
59867
+ var import_node_path23 = require("node:path");
59769
59868
 
59770
59869
  // routines.ts
59771
- var import_node_fs24 = require("node:fs");
59772
- var import_node_path21 = require("node:path");
59870
+ var import_node_fs25 = require("node:fs");
59871
+ var import_node_path22 = require("node:path");
59773
59872
 
59774
59873
  // sse.ts
59775
59874
  var clients = /* @__PURE__ */ new Set();
@@ -59806,11 +59905,11 @@ function clientCount() {
59806
59905
  }
59807
59906
 
59808
59907
  // trigger-sessions.ts
59809
- var import_node_fs23 = require("node:fs");
59908
+ var import_node_fs24 = require("node:fs");
59810
59909
  var import_node_os15 = require("node:os");
59811
- var import_node_path20 = require("node:path");
59910
+ var import_node_path21 = require("node:path");
59812
59911
  var import_yaml7 = __toESM(require_dist6(), 1);
59813
- var AGENTS_DIR2 = process.env.AWARE_HOME ? (0, import_node_path20.join)(process.env.AWARE_HOME, "agents") : (0, import_node_path20.join)((0, import_node_os15.homedir)(), ".aware", "agents");
59912
+ var AGENTS_DIR2 = process.env.AWARE_HOME ? (0, import_node_path21.join)(process.env.AWARE_HOME, "agents") : (0, import_node_path21.join)((0, import_node_os15.homedir)(), ".aware", "agents");
59814
59913
  function summarizeFire(data) {
59815
59914
  if (!data) return "event";
59816
59915
  const type = typeof data.type === "string" ? data.type : "";
@@ -59827,10 +59926,10 @@ function mapTriggerState(phase) {
59827
59926
  function isHostBacked(agent, agentsDir = AGENTS_DIR2) {
59828
59927
  const safe = (n) => !n.includes("/") && !n.includes("\\") && !n.includes("..");
59829
59928
  if (!safe(agent)) return false;
59830
- const manifestPath = (0, import_node_path20.join)(agentsDir, agent, "manifest.yaml");
59831
- if (!(0, import_node_fs23.existsSync)(manifestPath)) return false;
59929
+ const manifestPath = (0, import_node_path21.join)(agentsDir, agent, "manifest.yaml");
59930
+ if (!(0, import_node_fs24.existsSync)(manifestPath)) return false;
59832
59931
  try {
59833
- const doc = (0, import_yaml7.parse)((0, import_node_fs23.readFileSync)(manifestPath, "utf8"));
59932
+ const doc = (0, import_yaml7.parse)((0, import_node_fs24.readFileSync)(manifestPath, "utf8"));
59834
59933
  const transport = doc?.transport;
59835
59934
  return !!(transport && typeof transport === "object" && "cli" in transport);
59836
59935
  } catch {
@@ -60115,7 +60214,7 @@ var RoutineError = class extends Error {
60115
60214
  }
60116
60215
  status;
60117
60216
  };
60118
- var ROUTINES_FILE = (0, import_node_path21.join)(flolessRoot, "routines.json");
60217
+ var ROUTINES_FILE = (0, import_node_path22.join)(flolessRoot, "routines.json");
60119
60218
  var routines = [];
60120
60219
  var loaded = false;
60121
60220
  function ensureLoaded() {
@@ -60151,10 +60250,10 @@ function sanitizeRoutine(raw) {
60151
60250
  };
60152
60251
  }
60153
60252
  function loadFromDisk() {
60154
- if (!(0, import_node_fs24.existsSync)(ROUTINES_FILE)) return [];
60253
+ if (!(0, import_node_fs25.existsSync)(ROUTINES_FILE)) return [];
60155
60254
  let text;
60156
60255
  try {
60157
- text = (0, import_node_fs24.readFileSync)(ROUTINES_FILE, "utf8");
60256
+ text = (0, import_node_fs25.readFileSync)(ROUTINES_FILE, "utf8");
60158
60257
  } catch {
60159
60258
  return [];
60160
60259
  }
@@ -60163,17 +60262,17 @@ function loadFromDisk() {
60163
60262
  return Array.isArray(parsed) ? parsed.map(sanitizeRoutine).filter((r) => r !== null) : [];
60164
60263
  } catch {
60165
60264
  try {
60166
- (0, import_node_fs24.renameSync)(ROUTINES_FILE, `${ROUTINES_FILE}.corrupt-${Date.now()}`);
60265
+ (0, import_node_fs25.renameSync)(ROUTINES_FILE, `${ROUTINES_FILE}.corrupt-${Date.now()}`);
60167
60266
  } catch {
60168
60267
  }
60169
60268
  return [];
60170
60269
  }
60171
60270
  }
60172
60271
  function saveRoutines() {
60173
- if (!(0, import_node_fs24.existsSync)(flolessRoot)) (0, import_node_fs24.mkdirSync)(flolessRoot, { recursive: true });
60272
+ if (!(0, import_node_fs25.existsSync)(flolessRoot)) (0, import_node_fs25.mkdirSync)(flolessRoot, { recursive: true });
60174
60273
  const tmp = `${ROUTINES_FILE}.${process.pid}.tmp`;
60175
- (0, import_node_fs24.writeFileSync)(tmp, JSON.stringify(routines, null, 2));
60176
- (0, import_node_fs24.renameSync)(tmp, ROUTINES_FILE);
60274
+ (0, import_node_fs25.writeFileSync)(tmp, JSON.stringify(routines, null, 2));
60275
+ (0, import_node_fs25.renameSync)(tmp, ROUTINES_FILE);
60177
60276
  }
60178
60277
  function listRoutines() {
60179
60278
  ensureLoaded();
@@ -60581,13 +60680,13 @@ var AppLifecycleError = class extends Error {
60581
60680
  }
60582
60681
  };
60583
60682
  function appsDir() {
60584
- return process.env.AWARE_HOME ? (0, import_node_path22.join)(process.env.AWARE_HOME, "apps") : (0, import_node_path22.join)((0, import_node_os16.homedir)(), ".aware", "apps");
60683
+ return process.env.AWARE_HOME ? (0, import_node_path23.join)(process.env.AWARE_HOME, "apps") : (0, import_node_path23.join)((0, import_node_os16.homedir)(), ".aware", "apps");
60585
60684
  }
60586
60685
  function appDirPath(id) {
60587
- return (0, import_node_path22.join)(appsDir(), id);
60686
+ return (0, import_node_path23.join)(appsDir(), id);
60588
60687
  }
60589
60688
  function appInstalled(id) {
60590
- return APP_ID3.test(id) && (0, import_node_fs25.existsSync)(appDirPath(id));
60689
+ return APP_ID3.test(id) && (0, import_node_fs26.existsSync)(appDirPath(id));
60591
60690
  }
60592
60691
  function logCascade(what, e) {
60593
60692
  console.error(`[app-lifecycle] cascade step failed (${what}):`, e instanceof Error ? e.message : e);
@@ -60703,9 +60802,9 @@ function isGatedAwareRoute(url, method) {
60703
60802
 
60704
60803
  // autostart.mjs
60705
60804
  var import_node_child_process5 = require("node:child_process");
60706
- var import_node_fs26 = require("node:fs");
60805
+ var import_node_fs27 = require("node:fs");
60707
60806
  var import_node_os17 = require("node:os");
60708
- var import_node_path23 = require("node:path");
60807
+ var import_node_path24 = require("node:path");
60709
60808
 
60710
60809
  // teardown.mjs
60711
60810
  var RUN_KEY = "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run";
@@ -60817,8 +60916,8 @@ function removeLegacyRunKey() {
60817
60916
  }
60818
60917
  function logLine(msg) {
60819
60918
  try {
60820
- (0, import_node_fs26.mkdirSync)(logDir(), { recursive: true });
60821
- (0, import_node_fs26.appendFileSync)(logFilePath(), `${(/* @__PURE__ */ new Date()).toISOString()} ${msg}
60919
+ (0, import_node_fs27.mkdirSync)(logDir(), { recursive: true });
60920
+ (0, import_node_fs27.appendFileSync)(logFilePath(), `${(/* @__PURE__ */ new Date()).toISOString()} ${msg}
60822
60921
  `);
60823
60922
  } catch {
60824
60923
  }
@@ -60826,8 +60925,8 @@ function logLine(msg) {
60826
60925
  function registerAutostart(exePath) {
60827
60926
  if (!isWin) return;
60828
60927
  const xml = buildAutostartTaskXml(exePath, currentUserId());
60829
- const tmp = (0, import_node_path23.join)((0, import_node_os17.tmpdir)(), `floless-autostart-${process.pid}-${Date.now()}.xml`);
60830
- (0, import_node_fs26.writeFileSync)(tmp, "\uFEFF" + xml, { encoding: "utf16le" });
60928
+ const tmp = (0, import_node_path24.join)((0, import_node_os17.tmpdir)(), `floless-autostart-${process.pid}-${Date.now()}.xml`);
60929
+ (0, import_node_fs27.writeFileSync)(tmp, "\uFEFF" + xml, { encoding: "utf16le" });
60831
60930
  try {
60832
60931
  (0, import_node_child_process5.execFileSync)("schtasks", ["/Create", "/TN", TASK_NAME, "/XML", tmp, "/F"], {
60833
60932
  stdio: ["ignore", "ignore", "ignore"],
@@ -60838,7 +60937,7 @@ function registerAutostart(exePath) {
60838
60937
  throw err2;
60839
60938
  } finally {
60840
60939
  try {
60841
- (0, import_node_fs26.rmSync)(tmp, { force: true });
60940
+ (0, import_node_fs27.rmSync)(tmp, { force: true });
60842
60941
  } catch {
60843
60942
  }
60844
60943
  }
@@ -60872,27 +60971,27 @@ function unregisterAutostart() {
60872
60971
 
60873
60972
  // updater.ts
60874
60973
  var import_node_child_process6 = require("node:child_process");
60875
- var import_node_crypto7 = require("node:crypto");
60876
- var import_node_fs28 = require("node:fs");
60974
+ var import_node_crypto8 = require("node:crypto");
60975
+ var import_node_fs29 = require("node:fs");
60877
60976
  var import_node_stream3 = require("node:stream");
60878
60977
  var import_promises = require("node:stream/promises");
60879
- var import_node_path25 = require("node:path");
60978
+ var import_node_path26 = require("node:path");
60880
60979
 
60881
60980
  // post-update-marker.mjs
60882
- var import_node_fs27 = require("node:fs");
60981
+ var import_node_fs28 = require("node:fs");
60883
60982
  var import_node_os18 = require("node:os");
60884
- var import_node_path24 = require("node:path");
60983
+ var import_node_path25 = require("node:path");
60885
60984
  var FRESH_MS = 12e4;
60886
60985
  function markerPath() {
60887
60986
  const override = (process.env.FLOLESS_POST_UPDATE_MARKER ?? "").trim();
60888
60987
  if (override) return override;
60889
- const root = process.env.FLOLESS_HOME ?? (0, import_node_path24.join)((0, import_node_os18.homedir)(), ".floless");
60890
- return (0, import_node_path24.join)(root, ".post-update");
60988
+ const root = process.env.FLOLESS_HOME ?? (0, import_node_path25.join)((0, import_node_os18.homedir)(), ".floless");
60989
+ return (0, import_node_path25.join)(root, ".post-update");
60891
60990
  }
60892
60991
  function legacyMarkerPath() {
60893
60992
  if ((process.env.FLOLESS_POST_UPDATE_MARKER ?? "").trim()) return null;
60894
60993
  try {
60895
- return (0, import_node_path24.join)((0, import_node_path24.dirname)((0, import_node_path24.dirname)(process.execPath)), ".floless-post-update");
60994
+ return (0, import_node_path25.join)((0, import_node_path25.dirname)((0, import_node_path25.dirname)(process.execPath)), ".floless-post-update");
60896
60995
  } catch {
60897
60996
  return null;
60898
60997
  }
@@ -60902,7 +61001,7 @@ function writePostUpdateMarker() {
60902
61001
  for (const p of [markerPath(), legacyMarkerPath()]) {
60903
61002
  if (!p) continue;
60904
61003
  try {
60905
- (0, import_node_fs27.writeFileSync)(p, (/* @__PURE__ */ new Date()).toISOString());
61004
+ (0, import_node_fs28.writeFileSync)(p, (/* @__PURE__ */ new Date()).toISOString());
60906
61005
  wrote = true;
60907
61006
  } catch {
60908
61007
  }
@@ -60914,9 +61013,9 @@ function consumePostUpdateMarker() {
60914
61013
  for (const p of [markerPath(), legacyMarkerPath()]) {
60915
61014
  if (!p) continue;
60916
61015
  try {
60917
- if (!(0, import_node_fs27.existsSync)(p)) continue;
60918
- const ageMs = Date.now() - (0, import_node_fs27.statSync)(p).mtimeMs;
60919
- (0, import_node_fs27.rmSync)(p, { force: true });
61016
+ if (!(0, import_node_fs28.existsSync)(p)) continue;
61017
+ const ageMs = Date.now() - (0, import_node_fs28.statSync)(p).mtimeMs;
61018
+ (0, import_node_fs28.rmSync)(p, { force: true });
60920
61019
  if (ageMs < FRESH_MS) fresh = true;
60921
61020
  } catch {
60922
61021
  }
@@ -60933,13 +61032,13 @@ function currentVersion() {
60933
61032
  return appVersion();
60934
61033
  }
60935
61034
  function installRoot() {
60936
- return (0, import_node_path25.dirname)((0, import_node_path25.dirname)(process.execPath));
61035
+ return (0, import_node_path26.dirname)((0, import_node_path26.dirname)(process.execPath));
60937
61036
  }
60938
61037
  function updateExePath() {
60939
- return (0, import_node_path25.join)(installRoot(), "Update.exe");
61038
+ return (0, import_node_path26.join)(installRoot(), "Update.exe");
60940
61039
  }
60941
61040
  function packagesDir() {
60942
- return (0, import_node_path25.join)(installRoot(), "packages");
61041
+ return (0, import_node_path26.join)(installRoot(), "packages");
60943
61042
  }
60944
61043
  function feedUrl() {
60945
61044
  const env2 = (process.env.FLOLESS_UPDATE_URL ?? "").trim().replace(/\/+$/, "");
@@ -61031,23 +61130,23 @@ async function checkForUpdate() {
61031
61130
  return { supported: true, currentVersion: cur, updateAvailable: true, targetVersion: latest.Version, asset: latest };
61032
61131
  }
61033
61132
  async function sha1OfFile(path) {
61034
- const hash = (0, import_node_crypto7.createHash)("sha1");
61035
- await (0, import_promises.pipeline)((0, import_node_fs28.createReadStream)(path), hash);
61133
+ const hash = (0, import_node_crypto8.createHash)("sha1");
61134
+ await (0, import_promises.pipeline)((0, import_node_fs29.createReadStream)(path), hash);
61036
61135
  return hash.digest("hex").toUpperCase();
61037
61136
  }
61038
61137
  async function downloadPackage(asset) {
61039
61138
  if (!NUPKG_NAME.test(asset.FileName)) throw new Error(`refusing suspicious package name: ${asset.FileName}`);
61040
61139
  const want = asset.SHA1.toUpperCase();
61041
61140
  const dir = packagesDir();
61042
- (0, import_node_fs28.mkdirSync)(dir, { recursive: true });
61043
- const dest = (0, import_node_path25.join)(dir, asset.FileName);
61044
- if ((0, import_node_fs28.existsSync)(dest) && await sha1OfFile(dest) === want) return dest;
61141
+ (0, import_node_fs29.mkdirSync)(dir, { recursive: true });
61142
+ const dest = (0, import_node_path26.join)(dir, asset.FileName);
61143
+ if ((0, import_node_fs29.existsSync)(dest) && await sha1OfFile(dest) === want) return dest;
61045
61144
  const res = await authedFetch(`${feedUrl()}/${encodeURIComponent(asset.FileName)}`, {
61046
61145
  redirect: "follow",
61047
61146
  signal: AbortSignal.timeout(DOWNLOAD_TIMEOUT_MS)
61048
61147
  });
61049
61148
  if (!res.ok || !res.body) throw new Error(`download failed: HTTP ${res.status} for ${asset.FileName}`);
61050
- await (0, import_promises.pipeline)(import_node_stream3.Readable.fromWeb(res.body), (0, import_node_fs28.createWriteStream)(dest));
61149
+ await (0, import_promises.pipeline)(import_node_stream3.Readable.fromWeb(res.body), (0, import_node_fs29.createWriteStream)(dest));
61051
61150
  const got = await sha1OfFile(dest);
61052
61151
  if (got !== want) throw new Error(`SHA1 mismatch for ${asset.FileName}: feed=${want} got=${got}`);
61053
61152
  return dest;
@@ -61056,7 +61155,7 @@ async function applyUpdate(check, opts) {
61056
61155
  if (!check.supported) return { applied: false, message: check.reason ?? "auto-update not supported in this runtime" };
61057
61156
  if (!check.updateAvailable || !check.asset) return { applied: false, message: check.reason ?? "no update available" };
61058
61157
  const exe = updateExePath();
61059
- if (!(0, import_node_fs28.existsSync)(exe)) {
61158
+ if (!(0, import_node_fs29.existsSync)(exe)) {
61060
61159
  return { applied: false, message: `Update.exe not found at ${exe} \u2014 is this a Velopack install?` };
61061
61160
  }
61062
61161
  const pkg = await downloadPackage(check.asset);
@@ -61296,12 +61395,12 @@ function isTraceCorrupt(events) {
61296
61395
 
61297
61396
  // launch.mjs
61298
61397
  var import_node_child_process7 = require("node:child_process");
61299
- var import_node_path26 = require("node:path");
61398
+ var import_node_path27 = require("node:path");
61300
61399
  var import_node_url3 = require("node:url");
61301
- var import_node_fs29 = require("node:fs");
61400
+ var import_node_fs30 = require("node:fs");
61302
61401
  var import_node_http = __toESM(require("node:http"), 1);
61303
61402
  var import_node_readline = require("node:readline");
61304
- var __dirname2 = (0, import_node_path26.dirname)((0, import_node_url3.fileURLToPath)(__import_meta_url));
61403
+ var __dirname2 = (0, import_node_path27.dirname)((0, import_node_url3.fileURLToPath)(__import_meta_url));
61305
61404
  var PORT = Number(process.env.PORT ?? 4317);
61306
61405
  var HEALTH_URL = `http://127.0.0.1:${PORT}/api/health`;
61307
61406
  var BROWSER_URL = `http://floless.localhost:${PORT}`;
@@ -61373,8 +61472,8 @@ async function waitHealthy(timeoutMs = 3e4) {
61373
61472
  function resolveServerStart() {
61374
61473
  const packaged = /flolessapp\.exe$/i.test(process.execPath);
61375
61474
  if (packaged) return { cmd: process.execPath, args: ["--serve"], shell: false };
61376
- const bundle = (0, import_node_path26.join)(__dirname2, "dist", "floless-server.cjs");
61377
- if ((0, import_node_fs29.existsSync)(bundle)) return { cmd: process.execPath, args: [bundle, "--serve"], shell: false };
61475
+ const bundle = (0, import_node_path27.join)(__dirname2, "dist", "floless-server.cjs");
61476
+ if ((0, import_node_fs30.existsSync)(bundle)) return { cmd: process.execPath, args: [bundle, "--serve"], shell: false };
61378
61477
  return { cmd: "npm", args: ["run", "start"], shell: isWin2 };
61379
61478
  }
61380
61479
  function startServerDetached() {
@@ -61527,8 +61626,8 @@ function taskkillArgs(pid, { tree = true } = {}) {
61527
61626
  }
61528
61627
  function killSupervisor({ tree = true } = {}) {
61529
61628
  if (!isWin2) return;
61530
- const isNpmChannel = /^node(\.exe)?$/i.test((0, import_node_path26.basename)(process.execPath));
61531
- const scriptMatch = isNpmChannel ? (0, import_node_path26.basename)((0, import_node_url3.fileURLToPath)(__import_meta_url)) : void 0;
61629
+ const isNpmChannel = /^node(\.exe)?$/i.test((0, import_node_path27.basename)(process.execPath));
61630
+ const scriptMatch = isNpmChannel ? (0, import_node_path27.basename)((0, import_node_url3.fileURLToPath)(__import_meta_url)) : void 0;
61532
61631
  const realExe = resolveRealInstallExe(process.execPath);
61533
61632
  const exeMatch = realExe === process.execPath ? process.execPath : [process.execPath, realExe];
61534
61633
  const pids = supervisorPidsToKill(enumerateProcesses(), process.pid, exeMatch, scriptMatch);
@@ -61693,7 +61792,7 @@ async function runAction(arg, flagArgv = [], selfVersion = null) {
61693
61792
  }
61694
61793
  await action(parseTeardownFlags(flagArgv));
61695
61794
  }
61696
- var entry = (0, import_node_path26.basename)(process.argv[1] ?? "").toLowerCase();
61795
+ var entry = (0, import_node_path27.basename)(process.argv[1] ?? "").toLowerCase();
61697
61796
  if (entry === "launch.mjs") {
61698
61797
  runAction(process.argv[2], process.argv.slice(3)).catch((e) => {
61699
61798
  log(`error: ${e?.message ?? e}`);
@@ -61767,9 +61866,9 @@ function awareUpgradeBlockReason(s) {
61767
61866
  }
61768
61867
 
61769
61868
  // skill-sync.ts
61770
- var import_node_fs30 = require("node:fs");
61869
+ var import_node_fs31 = require("node:fs");
61771
61870
  var import_node_os19 = require("node:os");
61772
- var import_node_path27 = require("node:path");
61871
+ var import_node_path28 = require("node:path");
61773
61872
  var import_node_url4 = require("node:url");
61774
61873
  var import_yaml8 = __toESM(require_dist6(), 1);
61775
61874
 
@@ -61812,14 +61911,14 @@ function selectShippedSkillNames(names) {
61812
61911
  }
61813
61912
 
61814
61913
  // skill-sync.ts
61815
- var __dirname3 = (0, import_node_path27.dirname)((0, import_node_url4.fileURLToPath)(__import_meta_url));
61914
+ var __dirname3 = (0, import_node_path28.dirname)((0, import_node_url4.fileURLToPath)(__import_meta_url));
61816
61915
  function bundledSkillsRoot() {
61817
61916
  const candidates = [
61818
- (0, import_node_path27.join)(__dirname3, "skills"),
61819
- (0, import_node_path27.join)((0, import_node_path27.dirname)(process.execPath), "skills"),
61820
- (0, import_node_path27.join)(__dirname3, "..", ".claude", "skills")
61917
+ (0, import_node_path28.join)(__dirname3, "skills"),
61918
+ (0, import_node_path28.join)((0, import_node_path28.dirname)(process.execPath), "skills"),
61919
+ (0, import_node_path28.join)(__dirname3, "..", ".claude", "skills")
61821
61920
  ];
61822
- return candidates.find((p) => (0, import_node_fs30.existsSync)(p)) ?? null;
61921
+ return candidates.find((p) => (0, import_node_fs31.existsSync)(p)) ?? null;
61823
61922
  }
61824
61923
  function targetConfigDirs() {
61825
61924
  const override = process.env.FLOLESS_SKILL_TARGETS;
@@ -61828,14 +61927,14 @@ function targetConfigDirs() {
61828
61927
  }
61829
61928
  const home = (0, import_node_os19.homedir)();
61830
61929
  return [
61831
- { runtime: "claude", dir: (0, import_node_path27.join)(home, ".claude") },
61832
- { runtime: "codex", dir: (0, import_node_path27.join)(home, ".codex") },
61833
- { runtime: "opencode", dir: (0, import_node_path27.join)(home, ".opencode") }
61930
+ { runtime: "claude", dir: (0, import_node_path28.join)(home, ".claude") },
61931
+ { runtime: "codex", dir: (0, import_node_path28.join)(home, ".codex") },
61932
+ { runtime: "opencode", dir: (0, import_node_path28.join)(home, ".opencode") }
61834
61933
  ];
61835
61934
  }
61836
61935
  function skillVersion(skillMdPath) {
61837
61936
  try {
61838
- const text = (0, import_node_fs30.readFileSync)(skillMdPath, "utf8");
61937
+ const text = (0, import_node_fs31.readFileSync)(skillMdPath, "utf8");
61839
61938
  const m = /^---\r?\n([\s\S]*?)\r?\n---/.exec(text);
61840
61939
  if (!m || m[1] === void 0) return null;
61841
61940
  const fm = (0, import_yaml8.parse)(m[1]);
@@ -61875,21 +61974,21 @@ function decideAction(installed, bundled) {
61875
61974
  function bundledSkills(root) {
61876
61975
  let entries = [];
61877
61976
  try {
61878
- entries = selectShippedSkillNames((0, import_node_fs30.readdirSync)(root));
61977
+ entries = selectShippedSkillNames((0, import_node_fs31.readdirSync)(root));
61879
61978
  } catch {
61880
61979
  return [];
61881
61980
  }
61882
61981
  const out = [];
61883
61982
  for (const name of entries) {
61884
- const dir = (0, import_node_path27.join)(root, name);
61983
+ const dir = (0, import_node_path28.join)(root, name);
61885
61984
  let isDir = false;
61886
61985
  try {
61887
- isDir = (0, import_node_fs30.statSync)(dir).isDirectory();
61986
+ isDir = (0, import_node_fs31.statSync)(dir).isDirectory();
61888
61987
  } catch {
61889
61988
  isDir = false;
61890
61989
  }
61891
61990
  if (!isDir) continue;
61892
- const v = skillVersion((0, import_node_path27.join)(dir, "SKILL.md"));
61991
+ const v = skillVersion((0, import_node_path28.join)(dir, "SKILL.md"));
61893
61992
  if (!v) continue;
61894
61993
  out.push({ name, dir, version: v });
61895
61994
  }
@@ -61902,17 +62001,17 @@ function syncSkills() {
61902
62001
  const skills = bundledSkills(root);
61903
62002
  if (!skills.length) return results;
61904
62003
  for (const { runtime, dir: cfg } of targetConfigDirs()) {
61905
- if (!(0, import_node_fs30.existsSync)(cfg)) continue;
61906
- const skillsDir = (0, import_node_path27.join)(cfg, "skills");
62004
+ if (!(0, import_node_fs31.existsSync)(cfg)) continue;
62005
+ const skillsDir = (0, import_node_path28.join)(cfg, "skills");
61907
62006
  for (const s of skills) {
61908
- const dest = (0, import_node_path27.join)(skillsDir, s.name);
61909
- const installedMd = (0, import_node_path27.join)(dest, "SKILL.md");
61910
- const installed = (0, import_node_fs30.existsSync)(installedMd) ? skillVersion(installedMd) : null;
62007
+ const dest = (0, import_node_path28.join)(skillsDir, s.name);
62008
+ const installedMd = (0, import_node_path28.join)(dest, "SKILL.md");
62009
+ const installed = (0, import_node_fs31.existsSync)(installedMd) ? skillVersion(installedMd) : null;
61911
62010
  const action = decideAction(installed, s.version);
61912
62011
  if (action === "installed" || action === "updated") {
61913
62012
  try {
61914
- if (action === "updated") (0, import_node_fs30.rmSync)(dest, { recursive: true, force: true });
61915
- (0, import_node_fs30.cpSync)(s.dir, dest, { recursive: true });
62013
+ if (action === "updated") (0, import_node_fs31.rmSync)(dest, { recursive: true, force: true });
62014
+ (0, import_node_fs31.cpSync)(s.dir, dest, { recursive: true });
61916
62015
  results.push({ runtime, skill: s.name, action, from: installed, to: s.version });
61917
62016
  } catch {
61918
62017
  }
@@ -61926,8 +62025,8 @@ function syncSkills() {
61926
62025
 
61927
62026
  // watch.ts
61928
62027
  var import_node_os20 = require("node:os");
61929
- var import_node_path29 = require("node:path");
61930
- var import_node_fs31 = require("node:fs");
62028
+ var import_node_path30 = require("node:path");
62029
+ var import_node_fs32 = require("node:fs");
61931
62030
 
61932
62031
  // node_modules/chokidar/esm/index.js
61933
62032
  var import_fs2 = require("fs");
@@ -61938,7 +62037,7 @@ var sysPath2 = __toESM(require("path"), 1);
61938
62037
  // node_modules/readdirp/esm/index.js
61939
62038
  var import_promises2 = require("node:fs/promises");
61940
62039
  var import_node_stream4 = require("node:stream");
61941
- var import_node_path28 = require("node:path");
62040
+ var import_node_path29 = require("node:path");
61942
62041
  var EntryTypes = {
61943
62042
  FILE_TYPE: "files",
61944
62043
  DIR_TYPE: "directories",
@@ -62013,7 +62112,7 @@ var ReaddirpStream = class extends import_node_stream4.Readable {
62013
62112
  this._wantsDir = type ? DIR_TYPES.has(type) : false;
62014
62113
  this._wantsFile = type ? FILE_TYPES.has(type) : false;
62015
62114
  this._wantsEverything = type === EntryTypes.EVERYTHING_TYPE;
62016
- this._root = (0, import_node_path28.resolve)(root);
62115
+ this._root = (0, import_node_path29.resolve)(root);
62017
62116
  this._isDirent = !opts.alwaysStat;
62018
62117
  this._statsProp = this._isDirent ? "dirent" : "stats";
62019
62118
  this._rdOptions = { encoding: "utf8", withFileTypes: this._isDirent };
@@ -62084,8 +62183,8 @@ var ReaddirpStream = class extends import_node_stream4.Readable {
62084
62183
  let entry2;
62085
62184
  const basename5 = this._isDirent ? dirent.name : dirent;
62086
62185
  try {
62087
- const fullPath = (0, import_node_path28.resolve)((0, import_node_path28.join)(path, basename5));
62088
- entry2 = { path: (0, import_node_path28.relative)(this._root, fullPath), fullPath, basename: basename5 };
62186
+ const fullPath = (0, import_node_path29.resolve)((0, import_node_path29.join)(path, basename5));
62187
+ entry2 = { path: (0, import_node_path29.relative)(this._root, fullPath), fullPath, basename: basename5 };
62089
62188
  entry2[this._statsProp] = this._isDirent ? dirent : await this._stat(fullPath);
62090
62189
  } catch (err2) {
62091
62190
  this._onError(err2);
@@ -62119,7 +62218,7 @@ var ReaddirpStream = class extends import_node_stream4.Readable {
62119
62218
  }
62120
62219
  if (entryRealPathStats.isDirectory()) {
62121
62220
  const len2 = entryRealPath.length;
62122
- if (full.startsWith(entryRealPath) && full.substr(len2, 1) === import_node_path28.sep) {
62221
+ if (full.startsWith(entryRealPath) && full.substr(len2, 1) === import_node_path29.sep) {
62123
62222
  const recursiveError = new Error(`Circular symlink detected: "${full}" points to "${entryRealPath}"`);
62124
62223
  recursiveError.code = RECURSIVE_ERROR_CODE;
62125
62224
  return this._onError(recursiveError);
@@ -63627,33 +63726,33 @@ function appIdFromLogPath(path) {
63627
63726
  return i >= 0 && parts[i + 1] ? parts[i + 1] : null;
63628
63727
  }
63629
63728
  function samePath(a, b) {
63630
- const ra = (0, import_node_path29.resolve)(a);
63631
- const rb = (0, import_node_path29.resolve)(b);
63729
+ const ra = (0, import_node_path30.resolve)(a);
63730
+ const rb = (0, import_node_path30.resolve)(b);
63632
63731
  return process.platform === "win32" ? ra.toLowerCase() === rb.toLowerCase() : ra === rb;
63633
63732
  }
63634
63733
  function underDir(path, dir) {
63635
- const rp = (0, import_node_path29.resolve)(path);
63636
- const rd = (0, import_node_path29.resolve)(dir);
63734
+ const rp = (0, import_node_path30.resolve)(path);
63735
+ const rd = (0, import_node_path30.resolve)(dir);
63637
63736
  const [p, d] = process.platform === "win32" ? [rp.toLowerCase(), rd.toLowerCase()] : [rp, rd];
63638
- return p === d || p.startsWith(d + import_node_path29.sep);
63737
+ return p === d || p.startsWith(d + import_node_path30.sep);
63639
63738
  }
63640
63739
  function startWatcher() {
63641
- const awareDir = process.env.AWARE_HOME ?? (0, import_node_path29.join)((0, import_node_os20.homedir)(), ".aware");
63642
- const credentialsDir = (0, import_node_path29.join)(awareDir, "credentials");
63643
- if (!(0, import_node_fs31.existsSync)(credentialsDir)) {
63740
+ const awareDir = process.env.AWARE_HOME ?? (0, import_node_path30.join)((0, import_node_os20.homedir)(), ".aware");
63741
+ const credentialsDir = (0, import_node_path30.join)(awareDir, "credentials");
63742
+ if (!(0, import_node_fs32.existsSync)(credentialsDir)) {
63644
63743
  try {
63645
- (0, import_node_fs31.mkdirSync)(credentialsDir, { recursive: true });
63744
+ (0, import_node_fs32.mkdirSync)(credentialsDir, { recursive: true });
63646
63745
  } catch {
63647
63746
  }
63648
63747
  }
63649
- if (!(0, import_node_fs31.existsSync)(uiDir)) {
63748
+ if (!(0, import_node_fs32.existsSync)(uiDir)) {
63650
63749
  try {
63651
- (0, import_node_fs31.mkdirSync)(uiDir, { recursive: true });
63750
+ (0, import_node_fs32.mkdirSync)(uiDir, { recursive: true });
63652
63751
  } catch {
63653
63752
  }
63654
63753
  }
63655
- const targets = ["apps", "logs", "credentials"].map((d) => (0, import_node_path29.join)(awareDir, d)).filter((p) => (0, import_node_fs31.existsSync)(p));
63656
- if ((0, import_node_fs31.existsSync)(uiDir)) targets.push(uiDir);
63754
+ const targets = ["apps", "logs", "credentials"].map((d) => (0, import_node_path30.join)(awareDir, d)).filter((p) => (0, import_node_fs32.existsSync)(p));
63755
+ if ((0, import_node_fs32.existsSync)(uiDir)) targets.push(uiDir);
63657
63756
  if (targets.length === 0) {
63658
63757
  return null;
63659
63758
  }
@@ -63682,11 +63781,11 @@ function startWatcher() {
63682
63781
  const isCredential = path.split(/[\\/]/).includes("credentials");
63683
63782
  const kind = isCredential ? "credential" : path.endsWith(".jsonl") ? "trace" : path.endsWith(".lock") ? "lock" : path.endsWith(".flo") || path.endsWith(".app") ? "source" : "file";
63684
63783
  broadcast({ type: "fs-change", kind, event, path });
63685
- if (kind === "trace" && event !== "unlink" && (0, import_node_fs31.existsSync)(path)) {
63784
+ if (kind === "trace" && event !== "unlink" && (0, import_node_fs32.existsSync)(path)) {
63686
63785
  const id = appIdFromLogPath(path);
63687
63786
  if (!id) return;
63688
63787
  try {
63689
- broadcast({ type: "trace-file", id, runId: path.split(import_node_path29.sep).pop()?.replace(/\.jsonl$/, "") ?? null, events: parseTrace((0, import_node_fs31.readFileSync)(path, "utf8")) });
63788
+ broadcast({ type: "trace-file", id, runId: path.split(import_node_path30.sep).pop()?.replace(/\.jsonl$/, "") ?? null, events: parseTrace((0, import_node_fs32.readFileSync)(path, "utf8")) });
63690
63789
  } catch {
63691
63790
  }
63692
63791
  }
@@ -63695,10 +63794,10 @@ function startWatcher() {
63695
63794
  }
63696
63795
 
63697
63796
  // index.ts
63698
- var __dirname4 = (0, import_node_path30.dirname)((0, import_node_url5.fileURLToPath)(__import_meta_url));
63699
- var WEB_ROOT = [(0, import_node_path30.join)(__dirname4, "web"), (0, import_node_path30.join)((0, import_node_path30.dirname)(process.execPath), "web"), (0, import_node_path30.join)(__dirname4, "..", "web")].find(
63700
- (p) => (0, import_node_fs32.existsSync)(p)
63701
- ) ?? (0, import_node_path30.join)(__dirname4, "..", "web");
63797
+ var __dirname4 = (0, import_node_path31.dirname)((0, import_node_url5.fileURLToPath)(__import_meta_url));
63798
+ var WEB_ROOT = [(0, import_node_path31.join)(__dirname4, "web"), (0, import_node_path31.join)((0, import_node_path31.dirname)(process.execPath), "web"), (0, import_node_path31.join)(__dirname4, "..", "web")].find(
63799
+ (p) => (0, import_node_fs33.existsSync)(p)
63800
+ ) ?? (0, import_node_path31.join)(__dirname4, "..", "web");
63702
63801
  var PORT2 = Number(process.env.PORT ?? 4317);
63703
63802
  var HOST = "127.0.0.1";
63704
63803
  var crashHandlersInstalled = false;
@@ -63714,7 +63813,7 @@ function installCrashHandlers() {
63714
63813
  ${stack}
63715
63814
  `;
63716
63815
  try {
63717
- (0, import_node_fs32.appendFileSync)(logFilePath(), line);
63816
+ (0, import_node_fs33.appendFileSync)(logFilePath(), line);
63718
63817
  } catch {
63719
63818
  }
63720
63819
  if (process.stderr.isTTY) process.stderr.write(line);
@@ -64011,9 +64110,9 @@ async function startServer() {
64011
64110
  const { id, templateId, templatePath, srcPath, appDirPath: appDirPath2, fromVersion, contract, verb } = opts;
64012
64111
  const bdir = backupDir(id, fromVersion, Date.now());
64013
64112
  try {
64014
- (0, import_node_fs32.mkdirSync)((0, import_node_path30.dirname)(bdir), { recursive: true });
64015
- (0, import_node_fs32.cpSync)(appDirPath2, bdir, { recursive: true });
64016
- (0, import_node_fs32.cpSync)(templatePath, srcPath);
64113
+ (0, import_node_fs33.mkdirSync)((0, import_node_path31.dirname)(bdir), { recursive: true });
64114
+ (0, import_node_fs33.cpSync)(appDirPath2, bdir, { recursive: true });
64115
+ (0, import_node_fs33.cpSync)(templatePath, srcPath);
64017
64116
  if (id !== templateId) stampSourceAppId(srcPath, id);
64018
64117
  if (contract != null) {
64019
64118
  bakeContractIntoApp(srcPath, contract);
@@ -64024,8 +64123,8 @@ async function startServer() {
64024
64123
  } catch (e) {
64025
64124
  const msg = e instanceof Error ? e.message : String(e);
64026
64125
  try {
64027
- (0, import_node_fs32.rmSync)(appDirPath2, { recursive: true, force: true });
64028
- (0, import_node_fs32.cpSync)(bdir, appDirPath2, { recursive: true });
64126
+ (0, import_node_fs33.rmSync)(appDirPath2, { recursive: true, force: true });
64127
+ (0, import_node_fs33.cpSync)(bdir, appDirPath2, { recursive: true });
64029
64128
  } catch (re) {
64030
64129
  const rmsg = re instanceof Error ? re.message : String(re);
64031
64130
  throw new TemplateSwapError(`${verb} failed (${msg}) AND rollback failed (${rmsg}) \u2014 restore manually from ${bdir}`, "rollback-failed", bdir);
@@ -64056,7 +64155,7 @@ async function startServer() {
64056
64155
  return reply.status(409).send({ ok: false, error: `"${id}" is already at ${fromVersion}`, code: "up-to-date" });
64057
64156
  }
64058
64157
  const contract = readContract(id);
64059
- if (contract == null && (0, import_node_fs32.existsSync)(contractPath(id))) {
64158
+ if (contract == null && (0, import_node_fs33.existsSync)(contractPath(id))) {
64060
64159
  return reply.status(409).send({ ok: false, error: `"${id}"'s saved data is unreadable \u2014 open it in the editor and re-save before updating`, code: "contract-corrupt" });
64061
64160
  }
64062
64161
  if (contract != null) {
@@ -64238,6 +64337,29 @@ async function startServer() {
64238
64337
  throw e;
64239
64338
  }
64240
64339
  });
64340
+ app.get("/api/projects/:id/versions", async (req, reply) => {
64341
+ const p = getProject(req.params.id);
64342
+ if (!p) return reply.status(404).send({ ok: false, error: `unknown project: ${req.params.id}` });
64343
+ return { ok: true, versions: listVersions(req.params.id), approvedAt: p.approvedAt ?? null };
64344
+ });
64345
+ app.post("/api/projects/:id/versions/:n/rollback", async (req, reply) => {
64346
+ const project = getProject(req.params.id);
64347
+ if (!project) return reply.status(404).send({ ok: false, error: `unknown project: ${req.params.id}` });
64348
+ const n = Number(req.params.n);
64349
+ if (!Number.isInteger(n) || n < 1) return reply.status(400).send({ ok: false, error: `invalid version: ${req.params.n}` });
64350
+ const doc = readVersion(project.id, n);
64351
+ if (doc == null) return reply.status(404).send({ ok: false, error: `could not read version v${n} (missing or corrupt)` });
64352
+ try {
64353
+ writeContract(project.app, doc, project.id);
64354
+ } catch (e) {
64355
+ if (e instanceof ContractError) return reply.status(400).send({ ok: false, error: e.message });
64356
+ throw e;
64357
+ }
64358
+ clearApproval(project.id);
64359
+ const row = createVersion(project.id, doc, { author: "You", message: `Rolled back to v${n}`, gate: null, kind: "rollback" });
64360
+ broadcast({ type: "contract-changed", appId: project.app, project: project.id });
64361
+ return { ok: true, version: row };
64362
+ });
64241
64363
  function projectAppMismatch(appId, project) {
64242
64364
  const p = getProject(project);
64243
64365
  if (!p) return `unknown project: ${project}`;
@@ -64320,7 +64442,10 @@ async function startServer() {
64320
64442
  }
64321
64443
  broadcast({ type: "compiled", id: req.params.appId, lockPath: result.lockPath });
64322
64444
  let approvedAt;
64323
- if (project) approvedAt = markApproved(project).approvedAt;
64445
+ if (project) {
64446
+ createVersion(project, doc, { author: "You", message: "Approved the model", gate: "model", kind: "approve" });
64447
+ approvedAt = markApproved(project).approvedAt;
64448
+ }
64324
64449
  return { ok: true, result, approvedAt };
64325
64450
  });
64326
64451
  app.post(
@@ -64392,10 +64517,10 @@ async function startServer() {
64392
64517
  if (bad) return reply.status(404).send({ ok: false, error: bad });
64393
64518
  const dir = projectExportsDir(project);
64394
64519
  const exports2 = projectExportFiles(req.params.appId).map(({ kind, filename }) => {
64395
- const path = (0, import_node_path30.join)(dir, filename);
64520
+ const path = (0, import_node_path31.join)(dir, filename);
64396
64521
  let exportedAt = null;
64397
64522
  try {
64398
- const st = (0, import_node_fs32.statSync)(path);
64523
+ const st = (0, import_node_fs33.statSync)(path);
64399
64524
  if (st.isFile()) exportedAt = st.mtime.toISOString();
64400
64525
  } catch {
64401
64526
  }
@@ -64479,8 +64604,8 @@ async function startServer() {
64479
64604
  }
64480
64605
  const companionId = `${req.params.appId}-ifc`;
64481
64606
  const filename = `${req.params.appId}.ifc`;
64482
- const outPath = project ? (0, import_node_path30.join)(projectExportsDir(project), filename) : (0, import_node_path30.join)(appPath(companionId), filename);
64483
- if (project) (0, import_node_fs32.mkdirSync)((0, import_node_path30.dirname)(outPath), { recursive: true });
64607
+ const outPath = project ? (0, import_node_path31.join)(projectExportsDir(project), filename) : (0, import_node_path31.join)(appPath(companionId), filename);
64608
+ if (project) (0, import_node_fs33.mkdirSync)((0, import_node_path31.dirname)(outPath), { recursive: true });
64484
64609
  let flo;
64485
64610
  try {
64486
64611
  flo = writeIfcApp(appPath(companionId), companionId, scene, outPath, writeOpts);
@@ -64503,8 +64628,8 @@ async function startServer() {
64503
64628
  }
64504
64629
  throw e;
64505
64630
  }
64506
- if (!(0, import_node_fs32.existsSync)(outPath)) return reply.send({ ok: false, error: "the IFC export produced no file" });
64507
- const content = (0, import_node_fs32.readFileSync)(outPath, "utf8");
64631
+ if (!(0, import_node_fs33.existsSync)(outPath)) return reply.send({ ok: false, error: "the IFC export produced no file" });
64632
+ const content = (0, import_node_fs33.readFileSync)(outPath, "utf8");
64508
64633
  broadcast({ type: "apps-changed" });
64509
64634
  return { ok: true, filename, savedTo: outPath, content, bytes: Buffer.byteLength(content), skipped, ...extrusionsSkipped ? { extrusionsSkipped } : {} };
64510
64635
  });
@@ -64593,17 +64718,17 @@ async function startServer() {
64593
64718
  return reply.status(422).send({ ok: false, error: "no priced members to export \u2014 every member is an RFI (no AISC size / weight yet)" });
64594
64719
  }
64595
64720
  const filename = `${appId}-bom.${format}`;
64596
- const outPath = project ? (0, import_node_path30.join)(projectExportsDir(project), filename) : bomExportPath(appId, format);
64597
- const dir = (0, import_node_path30.dirname)(outPath);
64721
+ const outPath = project ? (0, import_node_path31.join)(projectExportsDir(project), filename) : bomExportPath(appId, format);
64722
+ const dir = (0, import_node_path31.dirname)(outPath);
64598
64723
  try {
64599
- (0, import_node_fs32.mkdirSync)(dir, { recursive: true });
64724
+ (0, import_node_fs33.mkdirSync)(dir, { recursive: true });
64600
64725
  if (format === "csv") {
64601
64726
  const text = bomToCsv(bom);
64602
- (0, import_node_fs32.writeFileSync)(outPath, text, "utf8");
64727
+ (0, import_node_fs33.writeFileSync)(outPath, text, "utf8");
64603
64728
  return { ok: true, filename, encoding: "utf8", content: text, bytes: Buffer.byteLength(text), savedTo: outPath };
64604
64729
  }
64605
64730
  const buf = await bomToXlsx(bom);
64606
- (0, import_node_fs32.writeFileSync)(outPath, buf);
64731
+ (0, import_node_fs33.writeFileSync)(outPath, buf);
64607
64732
  return { ok: true, filename, encoding: "base64", content: buf.toString("base64"), bytes: buf.length, savedTo: outPath };
64608
64733
  } catch (e) {
64609
64734
  app.log.error({ appId, format, err: e instanceof Error ? e.message : e }, "export-bom: generation failed");
@@ -64673,7 +64798,7 @@ async function startServer() {
64673
64798
  return reply.status(404).send({ ok: false, error: `"${id}" is not installed`, code: "not-installed" });
64674
64799
  }
64675
64800
  const contract = readContract(id);
64676
- if (contract == null && (0, import_node_fs32.existsSync)(contractPath(id))) {
64801
+ if (contract == null && (0, import_node_fs33.existsSync)(contractPath(id))) {
64677
64802
  return reply.status(409).send({ ok: false, error: `"${id}"'s saved data is unreadable \u2014 open it in the editor and re-save before restoring`, code: "contract-corrupt" });
64678
64803
  }
64679
64804
  if (contract != null) {
@@ -64751,11 +64876,11 @@ async function startServer() {
64751
64876
  if (appExists(id)) {
64752
64877
  return reply.status(409).send({ ok: false, error: `a workflow named "${id}" is already installed \u2014 remove it first, or rename the file's app: id`, code: "exists", id });
64753
64878
  }
64754
- const stageRoot = (0, import_node_fs32.mkdtempSync)((0, import_node_path30.join)((0, import_node_os21.tmpdir)(), "floless-import-"));
64879
+ const stageRoot = (0, import_node_fs33.mkdtempSync)((0, import_node_path31.join)((0, import_node_os21.tmpdir)(), "floless-import-"));
64755
64880
  try {
64756
- const stageDir = (0, import_node_path30.join)(stageRoot, id);
64757
- (0, import_node_fs32.mkdirSync)(stageDir);
64758
- (0, import_node_fs32.writeFileSync)((0, import_node_path30.join)(stageDir, `${id}.flo`), content);
64881
+ const stageDir = (0, import_node_path31.join)(stageRoot, id);
64882
+ (0, import_node_fs33.mkdirSync)(stageDir);
64883
+ (0, import_node_fs33.writeFileSync)((0, import_node_path31.join)(stageDir, `${id}.flo`), content);
64759
64884
  await aware.install(stageDir);
64760
64885
  } catch (err2) {
64761
64886
  try {
@@ -64765,7 +64890,7 @@ async function startServer() {
64765
64890
  const msg = err2 instanceof AwareError ? err2.message : String(err2?.message ?? err2);
64766
64891
  return reply.status(502).send({ ok: false, error: `import failed: ${msg}` });
64767
64892
  } finally {
64768
- (0, import_node_fs32.rmSync)(stageRoot, { recursive: true, force: true });
64893
+ (0, import_node_fs33.rmSync)(stageRoot, { recursive: true, force: true });
64769
64894
  }
64770
64895
  broadcast({ type: "apps-changed", id });
64771
64896
  return { ok: true, id };
@@ -64779,13 +64904,13 @@ async function startServer() {
64779
64904
  }
64780
64905
  const inputs = appData.inputs.map((i) => ({ name: i.name, type: i.type }));
64781
64906
  const baked = bakeFloSource(appData.source.text, inputs);
64782
- const tmpRoot = (0, import_node_fs32.mkdtempSync)((0, import_node_path30.join)((0, import_node_os21.tmpdir)(), "floless-bake-"));
64783
- const backupDir2 = (0, import_node_path30.join)(tmpRoot, `${id}-backup`);
64784
- const bakeDir = (0, import_node_path30.join)(tmpRoot, id);
64785
- (0, import_node_fs32.cpSync)(appDir(id), backupDir2, { recursive: true });
64786
- (0, import_node_fs32.cpSync)(appDir(id), bakeDir, { recursive: true });
64907
+ const tmpRoot = (0, import_node_fs33.mkdtempSync)((0, import_node_path31.join)((0, import_node_os21.tmpdir)(), "floless-bake-"));
64908
+ const backupDir2 = (0, import_node_path31.join)(tmpRoot, `${id}-backup`);
64909
+ const bakeDir = (0, import_node_path31.join)(tmpRoot, id);
64910
+ (0, import_node_fs33.cpSync)(appDir(id), backupDir2, { recursive: true });
64911
+ (0, import_node_fs33.cpSync)(appDir(id), bakeDir, { recursive: true });
64787
64912
  const floName = appData.source.path.split(/[\\/]/).pop();
64788
- (0, import_node_fs32.writeFileSync)((0, import_node_path30.join)(bakeDir, floName), baked);
64913
+ (0, import_node_fs33.writeFileSync)((0, import_node_path31.join)(bakeDir, floName), baked);
64789
64914
  let appInstalled2 = true;
64790
64915
  try {
64791
64916
  await aware.uninstall(id);
@@ -64807,17 +64932,17 @@ async function startServer() {
64807
64932
  throw installErr;
64808
64933
  }
64809
64934
  try {
64810
- await aware.compile((0, import_node_path30.join)(appDir(id), floName));
64935
+ await aware.compile((0, import_node_path31.join)(appDir(id), floName));
64811
64936
  } catch (compileErr) {
64812
64937
  app.log.warn({ id, compileErr: String(compileErr) }, "bake: post-install recompile failed (app baked but may need a manual Compile)");
64813
64938
  }
64814
64939
  broadcast({ type: "baked", id });
64815
64940
  return { ok: true, id, agent: id, inputs };
64816
64941
  } finally {
64817
- if (appInstalled2) (0, import_node_fs32.rmSync)(tmpRoot, { recursive: true, force: true });
64942
+ if (appInstalled2) (0, import_node_fs33.rmSync)(tmpRoot, { recursive: true, force: true });
64818
64943
  }
64819
64944
  });
64820
- const graftAgentsDir = () => (0, import_node_path30.join)((0, import_node_os21.homedir)(), ".aware", "agents");
64945
+ const graftAgentsDir = () => (0, import_node_path31.join)((0, import_node_os21.homedir)(), ".aware", "agents");
64821
64946
  app.post("/api/graft/match", async (req, reply) => {
64822
64947
  const { glob } = req.body ?? {};
64823
64948
  if (!glob) return reply.status(400).send({ ok: false, error: "glob required" });
@@ -64834,7 +64959,7 @@ async function startServer() {
64834
64959
  if (!sourceKind || !sourceRef) {
64835
64960
  return reply.status(400).send({ ok: false, error: "sourceKind and sourceRef required" });
64836
64961
  }
64837
- const tempHome = (0, import_node_fs32.mkdtempSync)((0, import_node_path30.join)((0, import_node_os21.tmpdir)(), "floless-graft-"));
64962
+ const tempHome = (0, import_node_fs33.mkdtempSync)((0, import_node_path31.join)((0, import_node_os21.tmpdir)(), "floless-graft-"));
64838
64963
  let result;
64839
64964
  try {
64840
64965
  result = await aware.build({
@@ -64847,19 +64972,19 @@ async function startServer() {
64847
64972
  awareHome: tempHome
64848
64973
  });
64849
64974
  } catch (err2) {
64850
- (0, import_node_fs32.rmSync)(tempHome, { recursive: true, force: true });
64975
+ (0, import_node_fs33.rmSync)(tempHome, { recursive: true, force: true });
64851
64976
  const msg = err2 instanceof AwareError ? err2.message : String(err2?.message ?? err2);
64852
64977
  return reply.status(422).send({ ok: false, error: msg });
64853
64978
  }
64854
64979
  const manifest = readStagedManifest(result.agentDir);
64855
64980
  if (!manifest) {
64856
- (0, import_node_fs32.rmSync)(tempHome, { recursive: true, force: true });
64981
+ (0, import_node_fs33.rmSync)(tempHome, { recursive: true, force: true });
64857
64982
  return reply.status(502).send({ ok: false, error: `build produced output at ${result.agentDir} but no manifest.yaml` });
64858
64983
  }
64859
- const token = (0, import_node_crypto8.randomUUID)();
64984
+ const token = (0, import_node_crypto9.randomUUID)();
64860
64985
  registerStage(token, tempHome, result.agentId);
64861
64986
  const preview = buildPreview(manifest, sourceKind, sourceRef, token);
64862
- if ((0, import_node_fs32.existsSync)((0, import_node_path30.join)(graftAgentsDir(), result.agentId))) {
64987
+ if ((0, import_node_fs33.existsSync)((0, import_node_path31.join)(graftAgentsDir(), result.agentId))) {
64863
64988
  preview.warnings.unshift(`An agent named "${result.agentId}" is already installed \u2014 creating it will overwrite it.`);
64864
64989
  }
64865
64990
  return { ok: true, preview };
@@ -64878,7 +65003,7 @@ async function startServer() {
64878
65003
  registerStage(stagedRef, stage.tempDir, stage.agentId);
64879
65004
  return reply.status(409).send({ ok: false, error: err2.message, agentId: stage.agentId, collision: true });
64880
65005
  }
64881
- (0, import_node_fs32.rmSync)(stage.tempDir, { recursive: true, force: true });
65006
+ (0, import_node_fs33.rmSync)(stage.tempDir, { recursive: true, force: true });
64882
65007
  throw err2;
64883
65008
  }
64884
65009
  broadcast({ type: "grafted", id: stage.agentId });
@@ -65149,11 +65274,11 @@ async function startServer() {
65149
65274
  app.get("/api/requests/:id/snapshot/:n", async (req, reply) => {
65150
65275
  const n = Number.parseInt(req.params.n, 10);
65151
65276
  const p = Number.isInteger(n) ? snapshotPathFor(req.params.id, n) : null;
65152
- if (!p || !(0, import_node_fs32.existsSync)(p)) return reply.status(404).send({ ok: false, error: "snapshot not found" });
65277
+ if (!p || !(0, import_node_fs33.existsSync)(p)) return reply.status(404).send({ ok: false, error: "snapshot not found" });
65153
65278
  const ext = p.split(".").pop().toLowerCase();
65154
65279
  reply.header("Content-Type", ext === "png" ? "image/png" : ext === "webp" ? "image/webp" : ext === "pdf" ? "application/pdf" : "image/jpeg");
65155
65280
  reply.header("Cache-Control", "no-store");
65156
- return (0, import_node_fs32.readFileSync)(p);
65281
+ return (0, import_node_fs33.readFileSync)(p);
65157
65282
  });
65158
65283
  app.post(
65159
65284
  "/api/tweak",
@@ -65322,7 +65447,7 @@ async function startServer() {
65322
65447
  warn(`last-run-status:${ref} \u2014 trace exists but couldn't be parsed (corrupt/truncated)`);
65323
65448
  let finishedAt2 = null;
65324
65449
  try {
65325
- finishedAt2 = (0, import_node_fs32.statSync)(latest.path).mtime.toISOString();
65450
+ finishedAt2 = (0, import_node_fs33.statSync)(latest.path).mtime.toISOString();
65326
65451
  } catch {
65327
65452
  finishedAt2 = null;
65328
65453
  }
@@ -65332,7 +65457,7 @@ async function startServer() {
65332
65457
  let finishedAt = typeof runEnd?.ts === "string" ? runEnd.ts : null;
65333
65458
  if (!finishedAt) {
65334
65459
  try {
65335
- finishedAt = (0, import_node_fs32.statSync)(latest.path).mtime.toISOString();
65460
+ finishedAt = (0, import_node_fs33.statSync)(latest.path).mtime.toISOString();
65336
65461
  } catch {
65337
65462
  finishedAt = null;
65338
65463
  }