@askexenow/exe-os 0.9.401 → 0.9.402

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 1,
3
- "verified_at": "2026-09-26T17:08:07.828Z",
4
- "manifest_sha256": "9cd5ff24de18ca7cf34761f3e394ddd5ac1fe1aed24d9e2422e5c1344d7218a5",
5
- "package_version": "0.9.401"
3
+ "verified_at": "2026-09-26T18:51:05.769Z",
4
+ "manifest_sha256": "8453d29aa87d378ca6644b157e4989f87e332b2c6801893aba9385ae4da324b6",
5
+ "package_version": "0.9.402"
6
6
  }
package/dist/bin/cli.js CHANGED
@@ -798,14 +798,14 @@ ${JSON.stringify(stormAlert, null, 2)}`);
798
798
  const { runStackUpdateCli } = await import("./stack-update.js");
799
799
  await runStackUpdateCli(args.slice(1));
800
800
  } else if (args[0] === "release") {
801
- const { parseReleaseArgs, runStackRelease } = await import("../stack-release-2Q2IYM4M.js");
801
+ const { parseReleaseArgs, runStackRelease } = await import("../stack-release-TWEFH7RF.js");
802
802
  const releaseFlags = parseReleaseArgs(args.slice(1));
803
803
  await runStackRelease(releaseFlags);
804
804
  } else if (args[0] === "stack-promote") {
805
- const { runStackPromoteCli } = await import("../stack-promote-IYD6GDSW.js");
805
+ const { runStackPromoteCli } = await import("../stack-promote-43W7XU5A.js");
806
806
  await runStackPromoteCli(args.slice(1));
807
807
  } else if (args[0] === "stack-generate-manifest") {
808
- const { runStackGenerateManifestCli } = await import("../stack-generate-manifest-TMLO7F3U.js");
808
+ const { runStackGenerateManifestCli } = await import("../stack-generate-manifest-53OIWKJJ.js");
809
809
  process.exit(await runStackGenerateManifestCli(args.slice(1)));
810
810
  } else if (args[0] === "repo-truth") {
811
811
  const { runRepoTruthCli } = await import("./exe-repo-truth.js");
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  registryProxyOptionsFromEnv,
4
4
  runRegistryProxy
5
- } from "../chunk-KWULIKOX.js";
5
+ } from "../chunk-FL2QIDNZ.js";
6
6
  import {
7
7
  isMainModule
8
8
  } from "../chunk-6Y4B3QF6.js";
@@ -50,7 +50,7 @@ import {
50
50
  verifyManifestImagesAvailable,
51
51
  warnUnmanagedManifestServices,
52
52
  withStackUpdateOperationLock
53
- } from "../chunk-LPQOPT5B.js";
53
+ } from "../chunk-AR2K7SUC.js";
54
54
  import "../chunk-EC5H53YD.js";
55
55
  import {
56
56
  runVerifyStack
@@ -66,7 +66,7 @@ import {
66
66
  import {
67
67
  logResult,
68
68
  runHealthGate
69
- } from "../chunk-IZXQFETE.js";
69
+ } from "../chunk-4FAJBCUY.js";
70
70
  import "../chunk-L25OAFOU.js";
71
71
  import "../chunk-RT57D7C4.js";
72
72
  import "../chunk-FTZET5YX.js";
@@ -8,7 +8,7 @@ import {
8
8
  logResult,
9
9
  main,
10
10
  runHealthGate
11
- } from "../chunk-IZXQFETE.js";
11
+ } from "../chunk-4FAJBCUY.js";
12
12
  import "../chunk-MLKGABMK.js";
13
13
  export {
14
14
  checkCRM,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 2,
3
- "generated_at": "2026-09-26T17:08:07.763Z",
3
+ "generated_at": "2026-09-26T18:51:05.708Z",
4
4
  "files": [
5
5
  {
6
6
  "path": "active-agent-3FVEAPPT.js",
@@ -179,7 +179,7 @@
179
179
  },
180
180
  {
181
181
  "path": "bin/cli.js",
182
- "sha256": "187f5c45e8bed17bdf4ec5cee3dfc517120b9075edfd5356f6adeda73abb6e24",
182
+ "sha256": "ca619c8d0e2db0e7b0865b9beb9ecec95a5f01065f5fa67b062c5e00af2261c0",
183
183
  "bytes": 69826
184
184
  },
185
185
  {
@@ -524,7 +524,7 @@
524
524
  },
525
525
  {
526
526
  "path": "bin/registry-proxy.js",
527
- "sha256": "ea701ba2b36369904b3102e5f6dff16ab29aead3eda646f2ad9de51587de4703",
527
+ "sha256": "3bc01618360147984d09607d1ce6a1983c6f587763f9a9ce0d8944f483153896",
528
528
  "bytes": 1885
529
529
  },
530
530
  {
@@ -549,7 +549,7 @@
549
549
  },
550
550
  {
551
551
  "path": "bin/stack-update.js",
552
- "sha256": "34b7c99470bc5b82a3a0d3b8f96c938cfe039285f5301995c15591fb5197fb3b",
552
+ "sha256": "0930d7fb000dfb0195941bb35b599148c0bf574934af7ff11d61b92b80526f8a",
553
553
  "bytes": 132136
554
554
  },
555
555
  {
@@ -569,7 +569,7 @@
569
569
  },
570
570
  {
571
571
  "path": "bin/vps-health-gate.js",
572
- "sha256": "4b10991c02787843516a2de5bacdd6ec2be0796e2b5249eb828eea18e28d8f24",
572
+ "sha256": "51e843f120210c8fdab734dcb7b844a4cc8b3d3b2dbea900f6547bf8061b0b6d",
573
573
  "bytes": 333
574
574
  },
575
575
  {
@@ -732,6 +732,11 @@
732
732
  "sha256": "95d9af04c423550e84bb843411c860bc16b99d2c6cdaf4f53892b4ae4ab8e661",
733
733
  "bytes": 854
734
734
  },
735
+ {
736
+ "path": "chunk-4FAJBCUY.js",
737
+ "sha256": "94c611c2d0cc509991a5fb2e0f3a3c8ab0f550b21599d93e56ca6bf9802fd075",
738
+ "bytes": 7587
739
+ },
735
740
  {
736
741
  "path": "chunk-4MUU33NJ.js",
737
742
  "sha256": "a8c0fb44a5b16c604a8db885b8e4a141c645ba22d2aa512a1e7b2ecf7369b76b",
@@ -917,6 +922,11 @@
917
922
  "sha256": "1fe1a2034e1adbd119d854017211729e4d4099d372f2c01203e019ee01e66414",
918
923
  "bytes": 28439
919
924
  },
925
+ {
926
+ "path": "chunk-AR2K7SUC.js",
927
+ "sha256": "862a533d706fc1f48121a865fd7c674be0c39c139dc6390921f4ce96004417ed",
928
+ "bytes": 274246
929
+ },
920
930
  {
921
931
  "path": "chunk-ARX6TAGN.js",
922
932
  "sha256": "2012774af162979e32828bdd3fc5bbcf8b39ef83320855cc08c21550aa3c2693",
@@ -962,6 +972,11 @@
962
972
  "sha256": "b36e68f4464d4936a0b81cc7d73952e13d154218c5900b829208f7dc6d1752f4",
963
973
  "bytes": 8793
964
974
  },
975
+ {
976
+ "path": "chunk-BPTTQRMJ.js",
977
+ "sha256": "73396a40dbd7bfc35f5787e7e9bb2542381f52fa9b0991b2c3fa15f0c91ca58c",
978
+ "bytes": 3766
979
+ },
965
980
  {
966
981
  "path": "chunk-BTSWFMEH.js",
967
982
  "sha256": "0f59755b7c14d9d84045f88dfa6cabae300fdf510b27d26ba999798aaf7613b1",
@@ -1147,6 +1162,11 @@
1147
1162
  "sha256": "a999baf6db449dcd8c856393a0721a50aceb27e74a49f71bbc6b553081d98fc2",
1148
1163
  "bytes": 6697
1149
1164
  },
1165
+ {
1166
+ "path": "chunk-FL2QIDNZ.js",
1167
+ "sha256": "93dd3dd3fb0c397639a936954a578838776f754852ab26c3b345e0ad169a7e8c",
1168
+ "bytes": 44776
1169
+ },
1150
1170
  {
1151
1171
  "path": "chunk-FS7XF7SE.js",
1152
1172
  "sha256": "7bc1072400b38de7aed6d597c83a46592cec28fe5bb0ced731637dbeae3a3a2e",
@@ -1312,11 +1332,6 @@
1312
1332
  "sha256": "c0b3a6372de1ceaaa0ee8077beab90baddb26d44c0fbf933543b963927819e16",
1313
1333
  "bytes": 57011
1314
1334
  },
1315
- {
1316
- "path": "chunk-IZXQFETE.js",
1317
- "sha256": "5ec76de5963c97e9cf65ca8762ec36cb243baa04db92be02bf5d794b58b0b2a7",
1318
- "bytes": 7587
1319
- },
1320
1335
  {
1321
1336
  "path": "chunk-J4MJ3DVJ.js",
1322
1337
  "sha256": "eef1ffda711ee7d7c4007eef11c8accb8a7a7334f0f0a88aa388dc1cf9bf68f0",
@@ -1402,11 +1417,6 @@
1402
1417
  "sha256": "b4b541043927616db5d90ebf7ac7a27a470db4e59da6c8a060a6bb1fa82725ba",
1403
1418
  "bytes": 2370
1404
1419
  },
1405
- {
1406
- "path": "chunk-KWULIKOX.js",
1407
- "sha256": "63a84e20e4831040f39d64196e0491b64afbf335df6df37758a1c5b4d33dd771",
1408
- "bytes": 44776
1409
- },
1410
1420
  {
1411
1421
  "path": "chunk-KZB2B7RM.js",
1412
1422
  "sha256": "69dbe01abcb9d3040d540aac97728e34f21bdea474d9a7d50389ddd2f43fc1ea",
@@ -1437,11 +1447,6 @@
1437
1447
  "sha256": "97c340d79a55dfa786143f7df0134ea0bea878faaaa25938d1ef05d7e664d5df",
1438
1448
  "bytes": 3519
1439
1449
  },
1440
- {
1441
- "path": "chunk-LPQOPT5B.js",
1442
- "sha256": "a9c2b1b06163db91f5b283387965033c1eaa379a6abe100f38868fc0947e8da9",
1443
- "bytes": 272808
1444
- },
1445
1450
  {
1446
1451
  "path": "chunk-LSH2UDUX.js",
1447
1452
  "sha256": "4b3425c974fb5ccbeaf9229f76f9ee7ed302387be89fef50826419ae4a2300ab",
@@ -1897,11 +1902,6 @@
1897
1902
  "sha256": "e90e2cf38ba91adb389b613bf6bf3bba8acd0eb455a496c8ab61d6c92d5de4bd",
1898
1903
  "bytes": 27577
1899
1904
  },
1900
- {
1901
- "path": "chunk-UX2IGPPW.js",
1902
- "sha256": "f075ec4648083b9c6fd5b12fef427e1a528d995775655cd759dc57a4ba680646",
1903
- "bytes": 3766
1904
- },
1905
1905
  {
1906
1906
  "path": "chunk-V4TZI6EO.js",
1907
1907
  "sha256": "697ecdef6991c061baab1e9759bc14aecd28631954b2edfdb721c98c72d41c82",
@@ -2579,7 +2579,7 @@
2579
2579
  },
2580
2580
  {
2581
2581
  "path": "hooks/manifest.json",
2582
- "sha256": "af662e825679ba4ed0b4104c13717bfb99f2b0e9c36f379d042345cb58b19484",
2582
+ "sha256": "9ca0a1c0c220c0e5b0548ef590779e2162bed221c117d7297fc3017d09810287",
2583
2583
  "bytes": 1841
2584
2584
  },
2585
2585
  {
@@ -2884,7 +2884,7 @@
2884
2884
  },
2885
2885
  {
2886
2886
  "path": "lib/registry-proxy.js",
2887
- "sha256": "1e66f3ce0b4c5491749475e3b879f945aa49bd78ba3ca73af24e6174d403e3a5",
2887
+ "sha256": "f75ff994266d2c65a434fcab76b25274332411b0da2173af45d65448b0c9b727",
2888
2888
  "bytes": 749
2889
2889
  },
2890
2890
  {
@@ -3473,8 +3473,8 @@
3473
3473
  "bytes": 111
3474
3474
  },
3475
3475
  {
3476
- "path": "stack-generate-manifest-TMLO7F3U.js",
3477
- "sha256": "394a03b110f850620ce0c6648dd00bc7fc0268ae009348fb3bbf328ed9b84809",
3476
+ "path": "stack-generate-manifest-53OIWKJJ.js",
3477
+ "sha256": "4299bd2de702861ececd5452c6bc1c8e51b4d09b959ba6d62ef4baef00bc26be",
3478
3478
  "bytes": 56960
3479
3479
  },
3480
3480
  {
@@ -3483,19 +3483,19 @@
3483
3483
  "bytes": 4761
3484
3484
  },
3485
3485
  {
3486
- "path": "stack-promote-IYD6GDSW.js",
3487
- "sha256": "c5365b6979037bba09a72d5c13ca67196e798fe58c87a57aebdc418bcd48ffaa",
3486
+ "path": "stack-promote-43W7XU5A.js",
3487
+ "sha256": "120716c6304c2b28c36afc6927b687882e8e3ffd3662f28efa6049d6056d53a3",
3488
3488
  "bytes": 7425
3489
3489
  },
3490
3490
  {
3491
- "path": "stack-release-2Q2IYM4M.js",
3492
- "sha256": "59ab0dda84ee7791fbbcc68505ba084a8d3848468db22fe3d691d526a0ca3c98",
3491
+ "path": "stack-release-TWEFH7RF.js",
3492
+ "sha256": "ac9da7724b6bdadeace5685cde290019a7a39ab33c2bd8ae13f7aee8fc2e5c87",
3493
3493
  "bytes": 117404
3494
3494
  },
3495
3495
  {
3496
- "path": "stack-update-WRS2QRK4.js",
3497
- "sha256": "fffa7477bb086c55287c56f9d349ff44520805e92868612e589d4a99577598f7",
3498
- "bytes": 8127
3496
+ "path": "stack-update-SPZKBTHQ.js",
3497
+ "sha256": "d62249adaa05eda4a824ef2867460be65087eafcc1bc854814e90ff81888319b",
3498
+ "bytes": 8231
3499
3499
  },
3500
3500
  {
3501
3501
  "path": "stalled-dispatch-escalation-MHLYH2PT.js",
@@ -212,7 +212,7 @@ async function main(args) {
212
212
  console.log("[health-gate] Starting rollback...");
213
213
  restorePreDeployBackup();
214
214
  try {
215
- const { rollbackStackUpdate, defaultStackPaths } = await import("./stack-update-WRS2QRK4.js");
215
+ const { rollbackStackUpdate, defaultStackPaths } = await import("./stack-update-SPZKBTHQ.js");
216
216
  const paths = defaultStackPaths();
217
217
  await rollbackStackUpdate({
218
218
  manifestRef: paths.manifestRef,
@@ -33,6 +33,15 @@ import { fileURLToPath } from "url";
33
33
  import { parseDocument as parseYamlDocument } from "yaml";
34
34
 
35
35
  // src/lib/erp-asset-smoke.ts
36
+ var REQUIRED_DESK_BUNDLES = {
37
+ "desk.bundle.js": "javascript",
38
+ "desk.bundle.css": "css"
39
+ };
40
+ var ASSET_PATH_PATTERN = /^\/assets\/[A-Za-z0-9_-]+\/dist\/(?:css|js)\/[^"' >]+$/;
41
+ var CONTENT_TYPE_PATTERN = {
42
+ javascript: /javascript/i,
43
+ css: /(?:^|\/)css/i
44
+ };
36
45
  async function verifyErpAssets(port, siteName, fetchPage = fetch) {
37
46
  if (!Number.isInteger(port) || port < 1 || port > 65535) {
38
47
  throw new Error("ERP asset smoke refused an invalid loopback port");
@@ -42,7 +51,6 @@ async function verifyErpAssets(port, siteName, fetchPage = fetch) {
42
51
  }
43
52
  const origin = `http://127.0.0.1:${port}`;
44
53
  const signal = AbortSignal.timeout(6e4);
45
- const assetPaths = /* @__PURE__ */ new Set();
46
54
  const get = async (path2) => {
47
55
  let url = new URL(path2, origin);
48
56
  for (let redirects = 0; redirects < 5; redirects++) {
@@ -56,25 +64,38 @@ async function verifyErpAssets(port, siteName, fetchPage = fetch) {
56
64
  }
57
65
  throw new Error("ERP asset smoke exceeded its redirect limit");
58
66
  };
59
- for (const page of ["/login", "/app"]) {
60
- const response = await get(page);
61
- if (response.status !== 200) {
62
- throw new Error(`ERP asset smoke: ${page} returned HTTP ${response.status}`);
63
- }
64
- const html = await response.text();
65
- const assets = [...html.matchAll(/\/assets\/[A-Za-z0-9_-]+\/dist\/(?:css|js)\/[^"' >]+/g)].map((match) => match[0]);
66
- if (assets.length === 0 || !assets.some((asset) => asset.includes("/css/"))) {
67
- throw new Error(`ERP asset smoke: ${page} has no hashed CSS bundle`);
67
+ const manifestResponse = await get("/assets/assets.json");
68
+ if (manifestResponse.status !== 200) {
69
+ await manifestResponse.body?.cancel();
70
+ throw new Error(`ERP asset smoke: assets.json manifest returned HTTP ${manifestResponse.status}`);
71
+ }
72
+ let manifest;
73
+ try {
74
+ manifest = JSON.parse(await manifestResponse.text());
75
+ } catch {
76
+ throw new Error("ERP asset smoke: assets.json manifest was not valid JSON");
77
+ }
78
+ if (typeof manifest !== "object" || manifest === null || Array.isArray(manifest)) {
79
+ throw new Error("ERP asset smoke: assets.json manifest was not a JSON object");
80
+ }
81
+ const assetPaths = /* @__PURE__ */ new Map();
82
+ for (const [key, kind] of Object.entries(REQUIRED_DESK_BUNDLES)) {
83
+ const value = manifest[key];
84
+ if (typeof value !== "string" || !ASSET_PATH_PATTERN.test(value)) {
85
+ throw new Error(`ERP asset smoke: assets.json manifest is missing the desk ${kind} bundle ("${key}")`);
68
86
  }
69
- for (const asset of assets) assetPaths.add(asset);
87
+ assetPaths.set(value, kind);
70
88
  }
71
- if (assetPaths.size > 100) throw new Error("ERP asset smoke: page references too many bundles");
72
- for (const asset of assetPaths) {
89
+ for (const [asset, kind] of assetPaths) {
73
90
  const response = await get(asset);
74
91
  await response.body?.cancel();
75
92
  if (response.status !== 200) {
76
93
  throw new Error(`ERP asset smoke: ${asset} returned HTTP ${response.status}`);
77
94
  }
95
+ const contentType = response.headers.get("content-type") ?? "";
96
+ if (!CONTENT_TYPE_PATTERN[kind].test(contentType)) {
97
+ throw new Error(`ERP asset smoke: ${asset} did not return a ${kind} content type (got "${contentType}")`);
98
+ }
78
99
  }
79
100
  }
80
101
 
@@ -1676,6 +1697,26 @@ function parseEnv(raw) {
1676
1697
  }
1677
1698
  return env;
1678
1699
  }
1700
+ function unquoteComposeEnvValue(raw) {
1701
+ const trimmed = raw.trim();
1702
+ if (trimmed.length >= 2) {
1703
+ const first = trimmed[0];
1704
+ const last = trimmed[trimmed.length - 1];
1705
+ if (first === '"' && last === '"') {
1706
+ return trimmed.slice(1, -1).replace(/\\(["\\])/g, "$1");
1707
+ }
1708
+ if (first === "'" && last === "'") {
1709
+ return trimmed.slice(1, -1);
1710
+ }
1711
+ }
1712
+ return trimmed;
1713
+ }
1714
+ function resolveComposeEnvValue(env, key, fallback) {
1715
+ const raw = env.get(key);
1716
+ if (raw === void 0) return fallback;
1717
+ const value = unquoteComposeEnvValue(raw);
1718
+ return value !== "" ? value : fallback;
1719
+ }
1679
1720
  function patchEnv(raw, updates) {
1680
1721
  const seen = /* @__PURE__ */ new Set();
1681
1722
  const lines = raw.replace(/\n$/, "").split(/\r?\n/);
@@ -4798,8 +4839,9 @@ Push the missing image(s) to the registry, or re-run with --break-glass <reason>
4798
4839
  erpNginxRef,
4799
4840
  options.retainedImageIds ?? captureRetainedComposeImageIds
4800
4841
  );
4801
- const portRaw = parseEnv(readFileSync(options.envFile, "utf8")).get("ERP_API_PORT") ?? "8069";
4802
- const siteName = parseEnv(readFileSync(options.envFile, "utf8")).get("ERP_SITE_NAME") ?? "erp.askexe.com";
4842
+ const smokeEnv = parseEnv(readFileSync(options.envFile, "utf8"));
4843
+ const portRaw = resolveComposeEnvValue(smokeEnv, "ERP_API_PORT", "8069");
4844
+ const siteName = resolveComposeEnvValue(smokeEnv, "ERP_SITE_NAME", "erp.askexe.com");
4803
4845
  await (options.verifyErpAssets ?? verifyErpAssets)(Number(portRaw), siteName);
4804
4846
  }
4805
4847
  }
@@ -5940,6 +5982,8 @@ export {
5940
5982
  loadStackManifestWithFallback,
5941
5983
  reportStackManifestSource,
5942
5984
  parseEnv,
5985
+ unquoteComposeEnvValue,
5986
+ resolveComposeEnvValue,
5943
5987
  patchEnv,
5944
5988
  removeEnvKeys,
5945
5989
  expandComposeExpression,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  canonicalizeStackManifest
3
- } from "./chunk-LPQOPT5B.js";
3
+ } from "./chunk-AR2K7SUC.js";
4
4
 
5
5
  // src/lib/stack-manifest-write.ts
6
6
  import { readFileSync, statSync, writeFileSync } from "fs";
@@ -140,7 +140,7 @@ async function assertManifestSignature(manifest, publicKeyPem) {
140
140
  "manifest carries no `signature`. Fleets that enforce EXE_STACK_PUBLIC_KEY reject unsigned manifests, so publishing one would ship a release no host can install. Re-sign with the custodied key: node scripts/sign-stack-manifest.mjs deploy/stack-manifests/v0.9.json"
141
141
  );
142
142
  }
143
- const { verifyStackManifestSignature } = await import("./stack-update-WRS2QRK4.js");
143
+ const { verifyStackManifestSignature } = await import("./stack-update-SPZKBTHQ.js");
144
144
  try {
145
145
  verifyStackManifestSignature(manifest, publicKeyPem);
146
146
  } catch (err) {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 1,
3
- "generatedAt": "2026-09-26T17:08:07.502Z",
3
+ "generatedAt": "2026-09-26T18:51:05.342Z",
4
4
  "hashes": {
5
5
  "bug-report-worker.js": "2336d762dead5c2addcf34771a054ab68946872540defc5259c7c38efea514ab",
6
6
  "codex-stop-task-finalizer.js": "1e44c134731e9192114c8b2999bac666755baa36eb242ef9bdd39c81407355f9",
@@ -11,7 +11,7 @@ import {
11
11
  resolveRegistryProxyBuildIdentity,
12
12
  resolveStackManifestChannel,
13
13
  runRegistryProxy
14
- } from "../chunk-KWULIKOX.js";
14
+ } from "../chunk-FL2QIDNZ.js";
15
15
  import "../chunk-MLKGABMK.js";
16
16
  export {
17
17
  SERVED_VERSION_PATH,
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  writeSignedStackManifest
4
- } from "./chunk-UX2IGPPW.js";
5
- import "./chunk-LPQOPT5B.js";
4
+ } from "./chunk-BPTTQRMJ.js";
5
+ import "./chunk-AR2K7SUC.js";
6
6
  import "./chunk-EC5H53YD.js";
7
7
  import "./chunk-YYRI2AGK.js";
8
8
  import "./chunk-L25OAFOU.js";
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  writeSignedStackManifest
4
- } from "./chunk-UX2IGPPW.js";
5
- import "./chunk-LPQOPT5B.js";
4
+ } from "./chunk-BPTTQRMJ.js";
5
+ import "./chunk-AR2K7SUC.js";
6
6
  import "./chunk-EC5H53YD.js";
7
7
  import "./chunk-YYRI2AGK.js";
8
8
  import "./chunk-L25OAFOU.js";
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  writeSignedStackManifest
4
- } from "./chunk-UX2IGPPW.js";
5
- import "./chunk-LPQOPT5B.js";
4
+ } from "./chunk-BPTTQRMJ.js";
5
+ import "./chunk-AR2K7SUC.js";
6
6
  import "./chunk-EC5H53YD.js";
7
7
  import {
8
8
  assertPreflightGate,
@@ -2028,7 +2028,7 @@ async function warmProxyCache(imageRef) {
2028
2028
  async function resolveImageGitShaLabel(ref, dryRun) {
2029
2029
  if (!ref || dryRun) return void 0;
2030
2030
  try {
2031
- const { readProvenanceLabels } = await import("./stack-generate-manifest-TMLO7F3U.js");
2031
+ const { readProvenanceLabels } = await import("./stack-generate-manifest-53OIWKJJ.js");
2032
2032
  const labels = await readProvenanceLabels(ref);
2033
2033
  return labels["org.exe.git_sha"] ?? labels["org.opencontainers.image.revision"];
2034
2034
  } catch (err) {
@@ -103,6 +103,7 @@ import {
103
103
  removeEnvKeys,
104
104
  reportStackManifestSource,
105
105
  requiredImagePinKeys,
106
+ resolveComposeEnvValue,
106
107
  resolveComposeProjectName,
107
108
  resolveHealthHost,
108
109
  resolveManifestImagePin,
@@ -126,6 +127,7 @@ import {
126
127
  syncImagePinsWithProcessEnv,
127
128
  unmanagedManifestServices,
128
129
  unpinnedImageBreakGlassBanner,
130
+ unquoteComposeEnvValue,
129
131
  verifyComposeServicesRunning,
130
132
  verifyIngressTargetsReachable,
131
133
  verifyManifestImagesAvailable,
@@ -136,7 +138,7 @@ import {
136
138
  waitForHttpOk,
137
139
  warnUnmanagedManifestServices,
138
140
  withStackUpdateOperationLock
139
- } from "./chunk-LPQOPT5B.js";
141
+ } from "./chunk-AR2K7SUC.js";
140
142
  import "./chunk-EC5H53YD.js";
141
143
  import "./chunk-YYRI2AGK.js";
142
144
  import "./chunk-L25OAFOU.js";
@@ -254,6 +256,7 @@ export {
254
256
  removeEnvKeys,
255
257
  reportStackManifestSource,
256
258
  requiredImagePinKeys,
259
+ resolveComposeEnvValue,
257
260
  resolveComposeProjectName,
258
261
  resolveHealthHost,
259
262
  resolveManifestImagePin,
@@ -277,6 +280,7 @@ export {
277
280
  syncImagePinsWithProcessEnv,
278
281
  unmanagedManifestServices,
279
282
  unpinnedImageBreakGlassBanner,
283
+ unquoteComposeEnvValue,
280
284
  verifyComposeServicesRunning,
281
285
  verifyIngressTargetsReachable,
282
286
  verifyManifestImagesAvailable,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@askexenow/exe-os",
3
- "version": "0.9.401",
3
+ "version": "0.9.402",
4
4
  "description": "AI employee operating system \u2014 persistent memory, task management, and multi-agent coordination for Claude Code.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "type": "module",
@@ -1,26 +1,18 @@
1
1
  {
2
- "current": "0.9.401",
2
+ "current": "0.9.402",
3
3
  "notes": {
4
- "0.9.401": {
5
- "version": "0.9.401",
4
+ "0.9.402": {
5
+ "version": "0.9.402",
6
6
  "date": "2026-09-26",
7
- "features": [
8
- "hourly npm release-drift monitor (bug 19aa10d0) (#1558)",
9
- "retain live Compose for ERP image group (#1542)"
10
- ],
7
+ "features": [],
11
8
  "fixes": [
12
- "batch auto_wake liveness lookup to stop event-loop stalls (bug fe166b57) (#1563)",
13
- "artifact quick_check catches freelist corruption; protect in-flight backups from retention (#1562)",
14
- "stub inspectContainerStartedAt in stack-update hermetic seams (bug f032b35c) (#1564)",
15
- "self-heal missing native bindings after npm ci (bug fd9f99d0) (#1560)",
16
- "remove one-off npm publisher workflows, add guard test (bug 19aa10d0) (#1559)",
17
- "stop stack-release-auto's report job silencing its own alarm (#1556)",
18
- "publish gate waits on same-SHA race instead of refusing at t=0 (#1557)",
19
- "add size-based bloat trigger to ci-disk-reclaim git repack (#1555)"
9
+ "resolve quoted ERP smoke-check env values (bug fff7716e) (#1567)",
10
+ "resolve desk bundles via assets.json, not the /app->/login redirect (#1568)",
11
+ "retry only transient GitHub API failures in fail-closed gates (bug ade4dc64) (#1566)"
20
12
  ],
21
13
  "security": [],
22
14
  "other": [
23
- "release: v0.9.401 (#1565)"
15
+ "release: v0.9.402 (#1569)"
24
16
  ],
25
17
  "migration_notes": []
26
18
  },
@@ -4,8 +4,8 @@
4
4
  "repo": "AskExe/exe-os",
5
5
  "service": "exe-os",
6
6
  "packageName": "@askexenow/exe-os",
7
- "version": "0.9.401",
8
- "image": "ghcr.io/askexe/exe-os:v0.9.401",
7
+ "version": "0.9.402",
8
+ "image": "ghcr.io/askexe/exe-os:v0.9.402",
9
9
  "imageEnv": "EXE_OS_IMAGE_TAG",
10
10
  "imageDigestTodo": "The top-level image names the forthcoming exe-os build and receives its digest after publication. Independently released components, including dashboard, retain verified digest pins; stack publication validates every service pin.",
11
11
  "components": {
@@ -110,5 +110,5 @@
110
110
  },
111
111
  "deploymentScope": "customer",
112
112
  "highGhostStack": "0.9.9",
113
- "sourceVersion": "0.9.401"
113
+ "sourceVersion": "0.9.402"
114
114
  }