openship 0.7.1 → 0.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5647,14 +5647,17 @@ function memoryGuidance(context) {
5647
5647
  }
5648
5648
  return "This build path was not under an OpenShip-enforced memory cap; check available RAM/swap and the host or Docker daemon OOM logs.";
5649
5649
  }
5650
- function exitCodeFromLine(line) {
5651
- const match = line.match(
5652
- /(?:returned a non-zero code|exited? with(?: exit)? code|exit code)\s*:?\s*(\d+)\b/i
5653
- );
5654
- return match ? Number(match[1]) : null;
5650
+ function findNonZeroExitCode(output) {
5651
+ for (const match of output.matchAll(
5652
+ /(?:returned a non-zero code|exit(?:ed)? with(?: exit)? code|exit code)\s*:?\s*(\d+)\b/gi
5653
+ )) {
5654
+ const code = Number(match[1]);
5655
+ if (code !== 0) return code;
5656
+ }
5657
+ return null;
5655
5658
  }
5656
5659
  function extractDockerBuildFailureHint(line, context = {}) {
5657
- const code = exitCodeFromLine(line);
5660
+ const code = findNonZeroExitCode(line);
5658
5661
  if (code === 137) {
5659
5662
  return `${line} \u2014 The build process was killed by SIGKILL (exit code 137). Memory exhaustion is the most common cause, but exit 137 alone does not prove OOM. ${memoryGuidance(context)}`;
5660
5663
  }
@@ -6467,10 +6470,13 @@ var DockerRuntime = class _DockerRuntime {
6467
6470
  logger.step(step, status, message);
6468
6471
  }
6469
6472
  handleBuildEvent(event, logger, trace, diagnosticContext = {}) {
6470
- const errorMessage = event.errorDetail?.message ?? event.error;
6473
+ const errorMessage = event.errorDetail?.message || event.error;
6471
6474
  if (errorMessage) {
6472
6475
  logger.log(errorMessage, "error");
6473
- return this.extractBuildFailureHint(errorMessage, diagnosticContext) ?? errorMessage;
6476
+ return {
6477
+ errorMessage,
6478
+ failureHint: this.extractBuildFailureHint(errorMessage, diagnosticContext) ?? errorMessage
6479
+ };
6474
6480
  }
6475
6481
  if (event.id === "moby.buildkit.trace" && typeof event.aux === "string") {
6476
6482
  let hint = null;
@@ -6478,10 +6484,10 @@ var DockerRuntime = class _DockerRuntime {
6478
6484
  logger.log(line.message, line.level === "error" ? "error" : parseLogLevel(line.message));
6479
6485
  hint = chooseDockerBuildFailureHint(
6480
6486
  hint,
6481
- this.extractBuildFailureHint(line.message, diagnosticContext)
6487
+ this.extractBuildFailureHint(line.message, diagnosticContext) ?? (line.level === "error" ? line.message : null)
6482
6488
  );
6483
6489
  }
6484
- return hint;
6490
+ return { failureHint: hint };
6485
6491
  }
6486
6492
  if (event.stream) {
6487
6493
  const line = event.stream.trim();
@@ -6506,7 +6512,7 @@ var DockerRuntime = class _DockerRuntime {
6506
6512
  return null;
6507
6513
  }
6508
6514
  logger.log(line, parseLogLevel(line));
6509
- return this.extractBuildFailureHint(line, diagnosticContext);
6515
+ return { failureHint: this.extractBuildFailureHint(line, diagnosticContext) };
6510
6516
  }
6511
6517
  if (event.status) {
6512
6518
  const parts = [event.id, event.status, event.progress].filter((p) => Boolean(p?.trim())).map((p) => p.trim());
@@ -7079,6 +7085,7 @@ var DockerRuntime = class _DockerRuntime {
7079
7085
  */
7080
7086
  async streamDockerodeBuild(stream, log, options = {}) {
7081
7087
  let fatalBuildError = null;
7088
+ let streamedFailureHint = null;
7082
7089
  const timeoutMs = getDockerBuildIdleTimeoutMs();
7083
7090
  const diagnosticContext = options.diagnosticContext ?? {};
7084
7091
  const buildContainerTracker = options.legacyBuilder ? this.legacyBuildContainerTracker(
@@ -7159,9 +7166,11 @@ var DockerRuntime = class _DockerRuntime {
7159
7166
  (event) => {
7160
7167
  idleMonitor?.progress();
7161
7168
  buildContainerTracker?.observe(event.stream);
7162
- fatalBuildError = chooseDockerBuildFailureHint(
7163
- fatalBuildError,
7164
- this.handleBuildEvent(event, log, options.trace, diagnosticContext)
7169
+ const diagnostics = this.handleBuildEvent(event, log, options.trace, diagnosticContext);
7170
+ fatalBuildError ??= diagnostics?.errorMessage ?? null;
7171
+ streamedFailureHint = chooseDockerBuildFailureHint(
7172
+ streamedFailureHint,
7173
+ diagnostics?.failureHint ?? null
7165
7174
  );
7166
7175
  }
7167
7176
  );
@@ -7179,7 +7188,11 @@ var DockerRuntime = class _DockerRuntime {
7179
7188
  throw new BuildCancelledError();
7180
7189
  }
7181
7190
  if (fatalBuildError) {
7182
- throw new Error(fatalBuildError);
7191
+ const hint = chooseDockerBuildFailureHint(fatalBuildError, streamedFailureHint);
7192
+ throw new Error(
7193
+ hint && !hint.includes(fatalBuildError) ? `${fatalBuildError}
7194
+ ${hint}` : hint ?? fatalBuildError
7195
+ );
7183
7196
  }
7184
7197
  }
7185
7198
  /**
@@ -146,7 +146,7 @@ import {
146
146
  resolveExecExitCode,
147
147
  startAttachStream,
148
148
  startExecStream
149
- } from "./chunk-7MCPDYKP.js";
149
+ } from "./chunk-EXXKRORU.js";
150
150
  import {
151
151
  BareRuntime
152
152
  } from "./chunk-3YSSXSC2.js";
@@ -7,7 +7,7 @@ import {
7
7
  composeInstallExists,
8
8
  readComposeEnvFile,
9
9
  startUnitHint
10
- } from "./chunk-IXBOV7BE.js";
10
+ } from "./chunk-JJD4YD2O.js";
11
11
  import {
12
12
  INTERNAL_TOKEN_FILE,
13
13
  OS_DIR
@@ -28,7 +28,7 @@ import {
28
28
  resolvePorts,
29
29
  sourceBuildDir,
30
30
  verifyHostChannel
31
- } from "./chunk-H36ASAYI.js";
31
+ } from "./chunk-XKLY2GH5.js";
32
32
  import {
33
33
  bootstrapAdmin,
34
34
  importMigratedSites,
@@ -36,18 +36,18 @@ import {
36
36
  internalPost,
37
37
  mintBareInternalToken,
38
38
  waitHealthy
39
- } from "./chunk-OEYXXSAM.js";
39
+ } from "./chunk-KQPFPKL4.js";
40
40
  import {
41
41
  startUnitHint,
42
42
  thisHost
43
- } from "./chunk-IXBOV7BE.js";
43
+ } from "./chunk-JJD4YD2O.js";
44
44
  import {
45
45
  completeHostEdge,
46
46
  markStoppedProxyImported,
47
47
  planAndApplyHostEdge,
48
48
  previewHostEdge,
49
49
  rollbackHostEdge
50
- } from "./chunk-WG5PDWZ3.js";
50
+ } from "./chunk-XWZVDLGF.js";
51
51
  import {
52
52
  AUTH_SECRET_FILE,
53
53
  DATA_DIR,
@@ -1564,7 +1564,7 @@ async function runForeground(opts, source) {
1564
1564
  const uiSpinner = ora("Preparing the dashboard\u2026").start();
1565
1565
  try {
1566
1566
  const bundle = await ensureDashboard({
1567
- tag: source ? "local" : opts.uiVersion || `v${"0.7.1"}`,
1567
+ tag: source ? "local" : opts.uiVersion || `v${"0.7.2"}`,
1568
1568
  onProgress: (received, total) => {
1569
1569
  if (total) {
1570
1570
  uiSpinner.text = `Downloading dashboard\u2026 ${Math.round(received / total * 100)}%`;
@@ -10,7 +10,7 @@ import {
10
10
  readComposeEnvFile,
11
11
  resolveLocalEnvironmentSync,
12
12
  thisHost
13
- } from "./chunk-IXBOV7BE.js";
13
+ } from "./chunk-JJD4YD2O.js";
14
14
  import {
15
15
  OS_DIR
16
16
  } from "./chunk-ELGRMZOW.js";
@@ -24,7 +24,7 @@ import {
24
24
  import {
25
25
  DEFAULT_DOCKER_SOCKET_PATH,
26
26
  resolveLocalDockerSocketPath
27
- } from "./chunk-7MCPDYKP.js";
27
+ } from "./chunk-EXXKRORU.js";
28
28
  import {
29
29
  LocalExecutor
30
30
  } from "./chunk-KCMEWNP7.js";
@@ -1627,7 +1627,7 @@ function operatorEnvPassthrough(managed, prev) {
1627
1627
  }
1628
1628
  var PRESERVED_ENV_HEADER = "# Preserved from your existing .env \u2014 set by you, not by `openship up` (#485).";
1629
1629
  function resolveImageVersion(opts) {
1630
- return opts.version?.trim() || process.env.OPENSHIP_VERSION?.trim() || (true ? "0.7.1" : "latest");
1630
+ return opts.version?.trim() || process.env.OPENSHIP_VERSION?.trim() || (true ? "0.7.2" : "latest");
1631
1631
  }
1632
1632
  function managedEnvLines(opts, host, cfg, prev) {
1633
1633
  const lines = [
@@ -243,7 +243,7 @@ async function repairEdgeConflict(mode, apiPort, onLog) {
243
243
  }
244
244
  spawnSync("docker", ["restart", "openship-edge"], { stdio: "ignore" });
245
245
  if (mode === "migrate" && scan.sites.length > 0) {
246
- const { importMigratedSites } = await import("./edge-import-LUDX77C2.js");
246
+ const { importMigratedSites } = await import("./edge-import-YU5YKFXT.js");
247
247
  const outcome = await importMigratedSites(apiPort, scan.sites, certPems);
248
248
  if (outcome.registered.length === 0) {
249
249
  return {
@@ -15,7 +15,7 @@ import {
15
15
  splitDockerFrames,
16
16
  toDockerHealthcheck,
17
17
  toStopConfig
18
- } from "./chunk-7MCPDYKP.js";
18
+ } from "./chunk-EXXKRORU.js";
19
19
  import "./chunk-S5GU345P.js";
20
20
  import "./chunk-AMADTKC6.js";
21
21
  import "./chunk-IVMPA6RC.js";
@@ -6,8 +6,8 @@ import {
6
6
  importMigratedSites,
7
7
  waitForApiHealth,
8
8
  waitForEdgeRunning
9
- } from "./chunk-OEYXXSAM.js";
10
- import "./chunk-IXBOV7BE.js";
9
+ } from "./chunk-KQPFPKL4.js";
10
+ import "./chunk-JJD4YD2O.js";
11
11
  import "./chunk-QWHBRY2K.js";
12
12
  import "./chunk-ELGRMZOW.js";
13
13
  import "./chunk-3K65MMYV.js";
@@ -28,7 +28,7 @@ import "./chunk-I3DPMTSF.js";
28
28
  import "./chunk-WNWQBB7F.js";
29
29
  import "./chunk-NRU2EBYZ.js";
30
30
  import "./chunk-RHLNVZMS.js";
31
- import "./chunk-7MCPDYKP.js";
31
+ import "./chunk-EXXKRORU.js";
32
32
  import "./chunk-S5GU345P.js";
33
33
  import "./chunk-3YSSXSC2.js";
34
34
  import "./chunk-CQ2JOXEQ.js";
@@ -13,7 +13,7 @@ import {
13
13
  renderEdgeConflict,
14
14
  repairEdgeConflict,
15
15
  rollbackHostEdge
16
- } from "./chunk-WG5PDWZ3.js";
16
+ } from "./chunk-XWZVDLGF.js";
17
17
  import "./chunk-ELGRMZOW.js";
18
18
  import "./chunk-XJSLJLNY.js";
19
19
  import "./chunk-ETK6IBCH.js";
@@ -5,8 +5,8 @@ const require = __ospCreateRequire(import.meta.url);
5
5
  import {
6
6
  checkHostChannel,
7
7
  verifyHostChannel
8
- } from "./chunk-H36ASAYI.js";
9
- import "./chunk-IXBOV7BE.js";
8
+ } from "./chunk-XKLY2GH5.js";
9
+ import "./chunk-JJD4YD2O.js";
10
10
  import "./chunk-QWHBRY2K.js";
11
11
  import "./chunk-ELGRMZOW.js";
12
12
  import "./chunk-3K65MMYV.js";
@@ -27,7 +27,7 @@ import "./chunk-I3DPMTSF.js";
27
27
  import "./chunk-WNWQBB7F.js";
28
28
  import "./chunk-NRU2EBYZ.js";
29
29
  import "./chunk-RHLNVZMS.js";
30
- import "./chunk-7MCPDYKP.js";
30
+ import "./chunk-EXXKRORU.js";
31
31
  import "./chunk-S5GU345P.js";
32
32
  import "./chunk-3YSSXSC2.js";
33
33
  import "./chunk-CQ2JOXEQ.js";
package/dist/index.js CHANGED
@@ -26,7 +26,7 @@ import {
26
26
  stop,
27
27
  upCommand,
28
28
  writeCliInstall
29
- } from "./chunk-NIOLZENU.js";
29
+ } from "./chunk-V7JLX2QD.js";
30
30
  import {
31
31
  composeDown,
32
32
  composeInternalToken,
@@ -60,7 +60,7 @@ import {
60
60
  sourceBuildDir,
61
61
  storedApiPort,
62
62
  storedDashboardPort
63
- } from "./chunk-H36ASAYI.js";
63
+ } from "./chunk-XKLY2GH5.js";
64
64
  import {
65
65
  bootstrapAdmin,
66
66
  detectPublicIp,
@@ -71,10 +71,10 @@ import {
71
71
  internalTokenRejectedProblem,
72
72
  waitDashboard,
73
73
  waitHealthy
74
- } from "./chunk-OEYXXSAM.js";
74
+ } from "./chunk-KQPFPKL4.js";
75
75
  import {
76
76
  startUnitHint
77
- } from "./chunk-IXBOV7BE.js";
77
+ } from "./chunk-JJD4YD2O.js";
78
78
  import "./chunk-QWHBRY2K.js";
79
79
  import {
80
80
  completeHostEdge,
@@ -85,7 +85,7 @@ import {
85
85
  renderEdgeConflict,
86
86
  repairEdgeConflict,
87
87
  rollbackHostEdge
88
- } from "./chunk-WG5PDWZ3.js";
88
+ } from "./chunk-XWZVDLGF.js";
89
89
  import {
90
90
  DATA_DIR,
91
91
  LOG_DIR,
@@ -112,7 +112,7 @@ import "./chunk-I3DPMTSF.js";
112
112
  import "./chunk-WNWQBB7F.js";
113
113
  import "./chunk-NRU2EBYZ.js";
114
114
  import "./chunk-RHLNVZMS.js";
115
- import "./chunk-7MCPDYKP.js";
115
+ import "./chunk-EXXKRORU.js";
116
116
  import "./chunk-S5GU345P.js";
117
117
  import "./chunk-3YSSXSC2.js";
118
118
  import "./chunk-CQ2JOXEQ.js";
@@ -313,7 +313,7 @@ function getDashboardUrl(name) {
313
313
  }
314
314
 
315
315
  // src/lib/api-client.ts
316
- var USER_AGENT = `openship-cli/${true ? "0.7.1" : "dev"}`;
316
+ var USER_AGENT = `openship-cli/${true ? "0.7.2" : "dev"}`;
317
317
  function getApiUrl2() {
318
318
  return `${getApiUrl()}/api`;
319
319
  }
@@ -1109,7 +1109,7 @@ function dockerNameRunning(nameFilter) {
1109
1109
  return r.stdout.trim().length > 0;
1110
1110
  }
1111
1111
  async function hostControlCheck(api) {
1112
- const { checkHostChannel } = await import("./host-channel-preflight-U4IZCRXR.js");
1112
+ const { checkHostChannel } = await import("./host-channel-preflight-U4NF425M.js");
1113
1113
  return hostControlRow(await checkHostChannel().catch(() => null), api);
1114
1114
  }
1115
1115
  var NEVER_PROVISIONED_DETAIL = `never provisioned \u2014 run \`${HOST_CHANNEL_PROVISION_COMMAND}\``;
@@ -1514,7 +1514,7 @@ async function interactiveDoctor() {
1514
1514
  continue;
1515
1515
  }
1516
1516
  if (action2 === "host-control") {
1517
- const { verifyHostChannel } = await import("./host-channel-preflight-U4IZCRXR.js");
1517
+ const { verifyHostChannel } = await import("./host-channel-preflight-U4NF425M.js");
1518
1518
  const report3 = await verifyHostChannel().catch(() => null);
1519
1519
  if (report3?.status === "fixed") log2.success("Host control is reachable now.");
1520
1520
  else if (report3?.status === "ok") log2.success("Host control was already reachable.");
@@ -3607,7 +3607,7 @@ async function runRepair2(mode) {
3607
3607
  requireLinux();
3608
3608
  const sp = spin2(mode === "migrate" ? "Migrating the existing proxy's sites into the edge\u2026" : "Taking over :80/:443\u2026");
3609
3609
  try {
3610
- const { repairEdgeConflict: repairEdgeConflict2 } = await import("./edge-preflight-JAEFWBRI.js");
3610
+ const { repairEdgeConflict: repairEdgeConflict2 } = await import("./edge-preflight-RCXSCKM3.js");
3611
3611
  sp?.stop();
3612
3612
  const res = await repairEdgeConflict2(mode, apiPort(), onLog);
3613
3613
  reportRepair(res);
@@ -3756,7 +3756,7 @@ async function panelStatus() {
3756
3756
  async function panelRepair(mode) {
3757
3757
  const sp = spin2(mode === "migrate" ? "Migrating the existing proxy's sites\u2026" : "Taking over :80/:443\u2026");
3758
3758
  try {
3759
- const { repairEdgeConflict: repairEdgeConflict2 } = await import("./edge-preflight-JAEFWBRI.js");
3759
+ const { repairEdgeConflict: repairEdgeConflict2 } = await import("./edge-preflight-RCXSCKM3.js");
3760
3760
  sp?.stop();
3761
3761
  const res = await repairEdgeConflict2(mode, apiPort(), onLog);
3762
3762
  renderRepair(res);
@@ -4598,7 +4598,7 @@ function printMonitoringNextSteps() {
4598
4598
  info(" openship edge analytics -p <project> per-domain analytics");
4599
4599
  }
4600
4600
  async function runMonitoringInstall(opts) {
4601
- const up = await import("./up-U73RUN5R.js");
4601
+ const up = await import("./up-Z2CMXZED.js");
4602
4602
  let adminName = opts.adminName;
4603
4603
  let adminEmail = opts.adminEmail;
4604
4604
  let adminPassword = opts.adminPassword;
@@ -6755,7 +6755,7 @@ function applyOnlyArgv(selfArgs, json) {
6755
6755
  // src/commands/update.ts
6756
6756
  async function verifyHostChannelAfterUpdate() {
6757
6757
  if (isJsonMode()) return;
6758
- const { verifyHostChannel } = await import("./host-channel-preflight-U4IZCRXR.js");
6758
+ const { verifyHostChannel } = await import("./host-channel-preflight-U4NF425M.js");
6759
6759
  await verifyHostChannel().catch(() => {
6760
6760
  });
6761
6761
  }
@@ -6832,7 +6832,7 @@ async function runSourceUpdate(source, opts) {
6832
6832
  }
6833
6833
  var REINSTALL_HINT = "curl -fsSL https://get.openship.io | sh";
6834
6834
  async function runTarballUpdate(install, opts) {
6835
- const current = "0.7.1";
6835
+ const current = "0.7.2";
6836
6836
  let latest;
6837
6837
  try {
6838
6838
  latest = (await resolveLatestTag()).replace(/^v/, "");
@@ -6916,7 +6916,7 @@ var updateCommand = new Command26("update").description("Update the Openship CLI
6916
6916
  if (source) return runSourceUpdate(source, opts);
6917
6917
  const cliInstall = readCliInstall();
6918
6918
  if (cliInstall?.method === "tarball") return runTarballUpdate(cliInstall, opts);
6919
- const current = "0.7.1";
6919
+ const current = "0.7.2";
6920
6920
  let latest;
6921
6921
  try {
6922
6922
  latest = (await resolveLatestTag()).replace(/^v/, "");
@@ -7524,7 +7524,7 @@ async function runWizard() {
7524
7524
  }
7525
7525
  }
7526
7526
  }
7527
- const uiTag = `v${"0.7.1"}`;
7527
+ const uiTag = `v${"0.7.2"}`;
7528
7528
  if (method === "bare") {
7529
7529
  const dl = spinner4();
7530
7530
  dl.start("Pulling the Openship dist from GitHub");
@@ -7584,7 +7584,7 @@ async function runWizard() {
7584
7584
  const dashboardPort = String(ports.dashboard);
7585
7585
  const moved = portMoveNotice(ports, composeTrustedOriginUrls());
7586
7586
  if (moved.length) log5.info(moved.join("\n"));
7587
- if (!pinnedImagesReady({ version: "0.7.1" })) {
7587
+ if (!pinnedImagesReady({ version: "0.7.2" })) {
7588
7588
  cancel4("The pinned Openship image tag isn't in the registry yet \u2014 nothing on this box was changed.");
7589
7589
  process.exit(1);
7590
7590
  }
@@ -7608,7 +7608,7 @@ async function runWizard() {
7608
7608
  dashboardPort,
7609
7609
  publicUrl,
7610
7610
  trustProxy: behindProxy,
7611
- version: "0.7.1",
7611
+ version: "0.7.2",
7612
7612
  noHostControl: !allowHostControl
7613
7613
  });
7614
7614
  if (!fetched.ok) {
@@ -7637,7 +7637,7 @@ async function runWizard() {
7637
7637
  dashboardPort,
7638
7638
  publicUrl,
7639
7639
  trustProxy: behindProxy,
7640
- version: "0.7.1",
7640
+ version: "0.7.2",
7641
7641
  noHostControl: !allowHostControl
7642
7642
  });
7643
7643
  if (!up.ok) {
@@ -7738,7 +7738,7 @@ async function runWizard() {
7738
7738
  if (result.liveUrl) liveUrl2 = result.liveUrl;
7739
7739
  else if (!result.domainRegistered) liveUrl2 = `http://localhost:${started.dashPort}`;
7740
7740
  for (const w of result.warnings) log5.warn(w);
7741
- const { verifyHostChannel } = await import("./host-channel-preflight-U4IZCRXR.js");
7741
+ const { verifyHostChannel } = await import("./host-channel-preflight-U4NF425M.js");
7742
7742
  await verifyHostChannel().catch(() => {
7743
7743
  });
7744
7744
  finishSetup({
@@ -8017,7 +8017,7 @@ function attachCompletion(program2) {
8017
8017
 
8018
8018
  // src/index.ts
8019
8019
  var program = new Command28();
8020
- program.name("openship").description("Openship CLI \u2014 install, run, and manage Openship from your terminal").version("0.7.1").option("--json", "Machine-readable JSON output (stdout data only)").hook("preAction", (thisCommand) => {
8020
+ program.name("openship").description("Openship CLI \u2014 install, run, and manage Openship from your terminal").version("0.7.2").option("--json", "Machine-readable JSON output (stdout data only)").hook("preAction", (thisCommand) => {
8021
8021
  if (thisCommand.opts().json) setJsonMode(true);
8022
8022
  }).action(async () => {
8023
8023
  const installed = serviceStatus().installed || readInstallMethod() === "compose";
@@ -37667,12 +37667,16 @@ function memoryGuidance(context) {
37667
37667
  }
37668
37668
  return "This build path was not under an OpenShip-enforced memory cap; check available RAM/swap and the host or Docker daemon OOM logs.";
37669
37669
  }
37670
- function exitCodeFromLine(line) {
37671
- const match = line.match(/(?:returned a non-zero code|exited? with(?: exit)? code|exit code)\s*:?\s*(\d+)\b/i);
37672
- return match ? Number(match[1]) : null;
37670
+ function findNonZeroExitCode(output) {
37671
+ for (const match of output.matchAll(/(?:returned a non-zero code|exit(?:ed)? with(?: exit)? code|exit code)\s*:?\s*(\d+)\b/gi)) {
37672
+ const code = Number(match[1]);
37673
+ if (code !== 0)
37674
+ return code;
37675
+ }
37676
+ return null;
37673
37677
  }
37674
37678
  function extractDockerBuildFailureHint(line, context = {}) {
37675
- const code = exitCodeFromLine(line);
37679
+ const code = findNonZeroExitCode(line);
37676
37680
  if (code === 137) {
37677
37681
  return `${line} — The build process was killed by SIGKILL (exit code 137). Memory exhaustion is the most common cause, but exit 137 alone does not prove OOM. ${memoryGuidance(context)}`;
37678
37682
  }
@@ -38518,18 +38522,21 @@ var init_docker2 = __esm(() => {
38518
38522
  logger.step(step, status, message);
38519
38523
  }
38520
38524
  handleBuildEvent(event, logger, trace, diagnosticContext = {}) {
38521
- const errorMessage = event.errorDetail?.message ?? event.error;
38525
+ const errorMessage = event.errorDetail?.message || event.error;
38522
38526
  if (errorMessage) {
38523
38527
  logger.log(errorMessage, "error");
38524
- return this.extractBuildFailureHint(errorMessage, diagnosticContext) ?? errorMessage;
38528
+ return {
38529
+ errorMessage,
38530
+ failureHint: this.extractBuildFailureHint(errorMessage, diagnosticContext) ?? errorMessage
38531
+ };
38525
38532
  }
38526
38533
  if (event.id === "moby.buildkit.trace" && typeof event.aux === "string") {
38527
38534
  let hint = null;
38528
38535
  for (const line of trace?.push(event.aux) ?? []) {
38529
38536
  logger.log(line.message, line.level === "error" ? "error" : parseLogLevel(line.message));
38530
- hint = chooseDockerBuildFailureHint(hint, this.extractBuildFailureHint(line.message, diagnosticContext));
38537
+ hint = chooseDockerBuildFailureHint(hint, this.extractBuildFailureHint(line.message, diagnosticContext) ?? (line.level === "error" ? line.message : null));
38531
38538
  }
38532
- return hint;
38539
+ return { failureHint: hint };
38533
38540
  }
38534
38541
  if (event.stream) {
38535
38542
  const line = event.stream.trim();
@@ -38548,7 +38555,7 @@ var init_docker2 = __esm(() => {
38548
38555
  return null;
38549
38556
  }
38550
38557
  logger.log(line, parseLogLevel(line));
38551
- return this.extractBuildFailureHint(line, diagnosticContext);
38558
+ return { failureHint: this.extractBuildFailureHint(line, diagnosticContext) };
38552
38559
  }
38553
38560
  if (event.status) {
38554
38561
  const parts2 = [event.id, event.status, event.progress].filter((p) => Boolean(p?.trim())).map((p) => p.trim());
@@ -38913,6 +38920,7 @@ var init_docker2 = __esm(() => {
38913
38920
  }
38914
38921
  async streamDockerodeBuild(stream, log, options = {}) {
38915
38922
  let fatalBuildError = null;
38923
+ let streamedFailureHint = null;
38916
38924
  const timeoutMs = getDockerBuildIdleTimeoutMs();
38917
38925
  const diagnosticContext = options.diagnosticContext ?? {};
38918
38926
  const buildContainerTracker = options.legacyBuilder ? this.legacyBuildContainerTracker(options.legacyBuilder.expectedMemoryBytes, options.legacyBuilder.ownershipHost) : null;
@@ -38992,7 +39000,9 @@ var init_docker2 = __esm(() => {
38992
39000
  }, (event) => {
38993
39001
  idleMonitor?.progress();
38994
39002
  buildContainerTracker?.observe(event.stream);
38995
- fatalBuildError = chooseDockerBuildFailureHint(fatalBuildError, this.handleBuildEvent(event, log, options.trace, diagnosticContext));
39003
+ const diagnostics = this.handleBuildEvent(event, log, options.trace, diagnosticContext);
39004
+ fatalBuildError ??= diagnostics?.errorMessage ?? null;
39005
+ streamedFailureHint = chooseDockerBuildFailureHint(streamedFailureHint, diagnostics?.failureHint ?? null);
38996
39006
  });
38997
39007
  });
38998
39008
  } catch (error51) {
@@ -39004,7 +39014,9 @@ var init_docker2 = __esm(() => {
39004
39014
  throw new BuildCancelledError;
39005
39015
  }
39006
39016
  if (fatalBuildError) {
39007
- throw new Error(fatalBuildError);
39017
+ const hint = chooseDockerBuildFailureHint(fatalBuildError, streamedFailureHint);
39018
+ throw new Error(hint && !hint.includes(fatalBuildError) ? `${fatalBuildError}
39019
+ ${hint}` : hint ?? fatalBuildError);
39008
39020
  }
39009
39021
  }
39010
39022
  async verifyImageBuilt(tag) {
@@ -216847,7 +216859,7 @@ var package_default;
216847
216859
  var init_package = __esm(() => {
216848
216860
  package_default = {
216849
216861
  name: "@repo/api",
216850
- version: "0.7.1",
216862
+ version: "0.7.2",
216851
216863
  license: "Apache-2.0",
216852
216864
  private: true,
216853
216865
  type: "module",
@@ -7,12 +7,12 @@ import {
7
7
  runHeadlessProvision,
8
8
  startService,
9
9
  upCommand
10
- } from "./chunk-NIOLZENU.js";
11
- import "./chunk-H36ASAYI.js";
12
- import "./chunk-OEYXXSAM.js";
13
- import "./chunk-IXBOV7BE.js";
10
+ } from "./chunk-V7JLX2QD.js";
11
+ import "./chunk-XKLY2GH5.js";
12
+ import "./chunk-KQPFPKL4.js";
13
+ import "./chunk-JJD4YD2O.js";
14
14
  import "./chunk-QWHBRY2K.js";
15
- import "./chunk-WG5PDWZ3.js";
15
+ import "./chunk-XWZVDLGF.js";
16
16
  import "./chunk-ELGRMZOW.js";
17
17
  import "./chunk-3K65MMYV.js";
18
18
  import "./chunk-ONKEYSMY.js";
@@ -32,7 +32,7 @@ import "./chunk-I3DPMTSF.js";
32
32
  import "./chunk-WNWQBB7F.js";
33
33
  import "./chunk-NRU2EBYZ.js";
34
34
  import "./chunk-RHLNVZMS.js";
35
- import "./chunk-7MCPDYKP.js";
35
+ import "./chunk-EXXKRORU.js";
36
36
  import "./chunk-S5GU345P.js";
37
37
  import "./chunk-3YSSXSC2.js";
38
38
  import "./chunk-CQ2JOXEQ.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openship",
3
- "version": "0.7.1",
3
+ "version": "0.7.2",
4
4
  "description": "Openship CLI - deploy, manage, and open your Openship platform from the terminal",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {