@floless/app 0.73.0 → 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.
- package/dist/floless-server.cjs +334 -209
- package/dist/web/app.css +62 -1
- package/dist/web/index.html +5 -0
- package/dist/web/steel-3d-view.js +46 -22
- package/dist/web/steel-editor.html +75 -30
- package/dist/web/workspaces.js +139 -0
- package/package.json +1 -1
package/dist/floless-server.cjs
CHANGED
|
@@ -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:
|
|
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"] ||
|
|
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:
|
|
6009
|
+
var { existsSync: existsSync28 } = require("node:fs");
|
|
6010
6010
|
var getCallers = require_caller();
|
|
6011
|
-
var { join:
|
|
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) && !
|
|
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"] ||
|
|
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"] ||
|
|
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
|
|
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
|
|
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
|
-
|
|
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 +=
|
|
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 += `${
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
-
|
|
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 +=
|
|
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 += `${
|
|
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
|
-
|
|
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 =
|
|
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
|
|
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 +=
|
|
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 += `${
|
|
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
|
|
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,
|
|
7437
|
+
res += stringifyTypedArray(value, join32, maximumBreadth);
|
|
7438
7438
|
keys = keys.slice(value.length);
|
|
7439
7439
|
maximumPropertiesToStringify -= value.length;
|
|
7440
|
-
separator =
|
|
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 =
|
|
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 =
|
|
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
|
|
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(
|
|
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 =
|
|
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
|
|
50830
|
+
var import_node_path31 = require("node:path");
|
|
50831
50831
|
var import_node_os21 = require("node:os");
|
|
50832
|
-
var
|
|
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.
|
|
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.
|
|
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
|
|
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
|
-
//
|
|
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,
|
|
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,
|
|
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
|
|
55148
|
+
var import_node_path19 = require("node:path");
|
|
55050
55149
|
|
|
55051
55150
|
// node_modules/write-excel-file/modules/export/writeXlsxFileNode.js
|
|
55052
|
-
var
|
|
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,
|
|
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,
|
|
59250
|
-
return (0,
|
|
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
|
|
59279
|
-
var
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
59402
|
+
(0, import_node_fs23.writeFileSync)(sourcePath, doc.toString());
|
|
59304
59403
|
}
|
|
59305
59404
|
function writeViewer3dApp(dir, appId, scene) {
|
|
59306
|
-
(0,
|
|
59307
|
-
const flo = (0,
|
|
59308
|
-
(0,
|
|
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,
|
|
59330
|
-
const flo = (0,
|
|
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,
|
|
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,
|
|
59357
|
-
const flo = (0,
|
|
59358
|
-
(0,
|
|
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
|
|
59865
|
+
var import_node_fs26 = require("node:fs");
|
|
59767
59866
|
var import_node_os16 = require("node:os");
|
|
59768
|
-
var
|
|
59867
|
+
var import_node_path23 = require("node:path");
|
|
59769
59868
|
|
|
59770
59869
|
// routines.ts
|
|
59771
|
-
var
|
|
59772
|
-
var
|
|
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
|
|
59908
|
+
var import_node_fs24 = require("node:fs");
|
|
59810
59909
|
var import_node_os15 = require("node:os");
|
|
59811
|
-
var
|
|
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,
|
|
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,
|
|
59831
|
-
if (!(0,
|
|
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,
|
|
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,
|
|
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,
|
|
60253
|
+
if (!(0, import_node_fs25.existsSync)(ROUTINES_FILE)) return [];
|
|
60155
60254
|
let text;
|
|
60156
60255
|
try {
|
|
60157
|
-
text = (0,
|
|
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,
|
|
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,
|
|
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,
|
|
60176
|
-
(0,
|
|
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,
|
|
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,
|
|
60686
|
+
return (0, import_node_path23.join)(appsDir(), id);
|
|
60588
60687
|
}
|
|
60589
60688
|
function appInstalled(id) {
|
|
60590
|
-
return APP_ID3.test(id) && (0,
|
|
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
|
|
60805
|
+
var import_node_fs27 = require("node:fs");
|
|
60707
60806
|
var import_node_os17 = require("node:os");
|
|
60708
|
-
var
|
|
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,
|
|
60821
|
-
(0,
|
|
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,
|
|
60830
|
-
(0,
|
|
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,
|
|
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
|
|
60876
|
-
var
|
|
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
|
|
60978
|
+
var import_node_path26 = require("node:path");
|
|
60880
60979
|
|
|
60881
60980
|
// post-update-marker.mjs
|
|
60882
|
-
var
|
|
60981
|
+
var import_node_fs28 = require("node:fs");
|
|
60883
60982
|
var import_node_os18 = require("node:os");
|
|
60884
|
-
var
|
|
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,
|
|
60890
|
-
return (0,
|
|
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,
|
|
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,
|
|
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,
|
|
60918
|
-
const ageMs = Date.now() - (0,
|
|
60919
|
-
(0,
|
|
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,
|
|
61035
|
+
return (0, import_node_path26.dirname)((0, import_node_path26.dirname)(process.execPath));
|
|
60937
61036
|
}
|
|
60938
61037
|
function updateExePath() {
|
|
60939
|
-
return (0,
|
|
61038
|
+
return (0, import_node_path26.join)(installRoot(), "Update.exe");
|
|
60940
61039
|
}
|
|
60941
61040
|
function packagesDir() {
|
|
60942
|
-
return (0,
|
|
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,
|
|
61035
|
-
await (0, import_promises.pipeline)((0,
|
|
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,
|
|
61043
|
-
const dest = (0,
|
|
61044
|
-
if ((0,
|
|
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,
|
|
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,
|
|
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
|
|
61398
|
+
var import_node_path27 = require("node:path");
|
|
61300
61399
|
var import_node_url3 = require("node:url");
|
|
61301
|
-
var
|
|
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,
|
|
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,
|
|
61377
|
-
if ((0,
|
|
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,
|
|
61531
|
-
const scriptMatch = isNpmChannel ? (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,
|
|
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
|
|
61869
|
+
var import_node_fs31 = require("node:fs");
|
|
61771
61870
|
var import_node_os19 = require("node:os");
|
|
61772
|
-
var
|
|
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,
|
|
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,
|
|
61819
|
-
(0,
|
|
61820
|
-
(0,
|
|
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,
|
|
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,
|
|
61832
|
-
{ runtime: "codex", dir: (0,
|
|
61833
|
-
{ runtime: "opencode", dir: (0,
|
|
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,
|
|
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,
|
|
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,
|
|
61983
|
+
const dir = (0, import_node_path28.join)(root, name);
|
|
61885
61984
|
let isDir = false;
|
|
61886
61985
|
try {
|
|
61887
|
-
isDir = (0,
|
|
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,
|
|
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,
|
|
61906
|
-
const skillsDir = (0,
|
|
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,
|
|
61909
|
-
const installedMd = (0,
|
|
61910
|
-
const installed = (0,
|
|
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,
|
|
61915
|
-
(0,
|
|
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
|
|
61930
|
-
var
|
|
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
|
|
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,
|
|
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,
|
|
62088
|
-
entry2 = { path: (0,
|
|
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) ===
|
|
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,
|
|
63631
|
-
const rb = (0,
|
|
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,
|
|
63636
|
-
const rd = (0,
|
|
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 +
|
|
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,
|
|
63642
|
-
const credentialsDir = (0,
|
|
63643
|
-
if (!(0,
|
|
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,
|
|
63744
|
+
(0, import_node_fs32.mkdirSync)(credentialsDir, { recursive: true });
|
|
63646
63745
|
} catch {
|
|
63647
63746
|
}
|
|
63648
63747
|
}
|
|
63649
|
-
if (!(0,
|
|
63748
|
+
if (!(0, import_node_fs32.existsSync)(uiDir)) {
|
|
63650
63749
|
try {
|
|
63651
|
-
(0,
|
|
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,
|
|
63656
|
-
if ((0,
|
|
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,
|
|
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(
|
|
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,
|
|
63699
|
-
var WEB_ROOT = [(0,
|
|
63700
|
-
(p) => (0,
|
|
63701
|
-
) ?? (0,
|
|
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,
|
|
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,
|
|
64015
|
-
(0,
|
|
64016
|
-
(0,
|
|
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,
|
|
64028
|
-
(0,
|
|
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,
|
|
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)
|
|
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,
|
|
64520
|
+
const path = (0, import_node_path31.join)(dir, filename);
|
|
64396
64521
|
let exportedAt = null;
|
|
64397
64522
|
try {
|
|
64398
|
-
const st = (0,
|
|
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,
|
|
64483
|
-
if (project) (0,
|
|
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,
|
|
64507
|
-
const content = (0,
|
|
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,
|
|
64597
|
-
const dir = (0,
|
|
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,
|
|
64724
|
+
(0, import_node_fs33.mkdirSync)(dir, { recursive: true });
|
|
64600
64725
|
if (format === "csv") {
|
|
64601
64726
|
const text = bomToCsv(bom);
|
|
64602
|
-
(0,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
64757
|
-
(0,
|
|
64758
|
-
(0,
|
|
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,
|
|
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,
|
|
64783
|
-
const backupDir2 = (0,
|
|
64784
|
-
const bakeDir = (0,
|
|
64785
|
-
(0,
|
|
64786
|
-
(0,
|
|
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,
|
|
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,
|
|
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,
|
|
64942
|
+
if (appInstalled2) (0, import_node_fs33.rmSync)(tmpRoot, { recursive: true, force: true });
|
|
64818
64943
|
}
|
|
64819
64944
|
});
|
|
64820
|
-
const graftAgentsDir = () => (0,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
65460
|
+
finishedAt = (0, import_node_fs33.statSync)(latest.path).mtime.toISOString();
|
|
65336
65461
|
} catch {
|
|
65337
65462
|
finishedAt = null;
|
|
65338
65463
|
}
|