@sealant/mend 0.34.2 → 0.34.4

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.
Files changed (79) hide show
  1. package/dist/{chunk-JJ66V76Y.js → chunk-AAAXHRWL.js} +72 -0
  2. package/dist/{dashboard-OADX3PHI.js → dashboard-DWXXYFPE.js} +32 -13
  3. package/dist/main.js +320 -89
  4. package/man/mend-accounts.1 +1 -1
  5. package/man/mend-adopt.1 +1 -1
  6. package/man/mend-attach.1 +1 -1
  7. package/man/mend-codex.1 +1 -1
  8. package/man/mend-completions.1 +1 -1
  9. package/man/mend-connect.1 +1 -1
  10. package/man/mend-continue.1 +1 -1
  11. package/man/mend-doctor.1 +1 -1
  12. package/man/mend-dotfiles-repo.1 +1 -1
  13. package/man/mend-dotfiles-sync.1 +1 -1
  14. package/man/mend-dotfiles.1 +1 -1
  15. package/man/mend-env-cluster.1 +1 -1
  16. package/man/mend-env-load.1 +1 -1
  17. package/man/mend-env-show.1 +1 -1
  18. package/man/mend-folder-create.1 +1 -1
  19. package/man/mend-folder-list.1 +1 -1
  20. package/man/mend-folder-push.1 +1 -1
  21. package/man/mend-folder-rm.1 +1 -1
  22. package/man/mend-git-author.1 +1 -1
  23. package/man/mend-help.1 +1 -1
  24. package/man/mend-invite.1 +1 -1
  25. package/man/mend-keys-init.1 +1 -1
  26. package/man/mend-keys-mode.1 +1 -1
  27. package/man/mend-keys-share.1 +1 -1
  28. package/man/mend-keys-show.1 +1 -1
  29. package/man/mend-land.1 +1 -1
  30. package/man/mend-login.1 +1 -1
  31. package/man/mend-logout.1 +1 -1
  32. package/man/mend-man.1 +1 -1
  33. package/man/mend-members.1 +1 -1
  34. package/man/mend-operator-exposure.1 +1 -1
  35. package/man/mend-operator-gate.1 +1 -1
  36. package/man/mend-operator-grant-owner.1 +1 -1
  37. package/man/mend-operator-org-create.1 +1 -1
  38. package/man/mend-operator-org-invite-owner.1 +1 -1
  39. package/man/mend-operator-org-list.1 +1 -1
  40. package/man/mend-operator-org-rename.1 +1 -1
  41. package/man/mend-operator-reset-link.1 +1 -1
  42. package/man/mend-pair.1 +1 -1
  43. package/man/mend-projects.1 +1 -1
  44. package/man/mend-pull.1 +1 -1
  45. package/man/mend-refresh.1 +1 -1
  46. package/man/mend-rejoin.1 +1 -1
  47. package/man/mend-resume.1 +1 -1
  48. package/man/mend-run.1 +1 -1
  49. package/man/mend-server-logs.1 +1 -1
  50. package/man/mend-server-restart.1 +1 -1
  51. package/man/mend-server-setup.1 +1 -1
  52. package/man/mend-server-start.1 +1 -1
  53. package/man/mend-server-status.1 +1 -1
  54. package/man/mend-server-stop.1 +1 -1
  55. package/man/mend-server-upgrade.1 +1 -1
  56. package/man/mend-server.1 +1 -1
  57. package/man/mend-service-add.1 +1 -1
  58. package/man/mend-service-connect.1 +1 -1
  59. package/man/mend-service-init.1 +1 -1
  60. package/man/mend-service-list.1 +1 -1
  61. package/man/mend-service-logs.1 +1 -1
  62. package/man/mend-service-restart.1 +1 -1
  63. package/man/mend-service-run.1 +1 -1
  64. package/man/mend-service-stop.1 +1 -1
  65. package/man/mend-session-share.1 +1 -1
  66. package/man/mend-sessions.1 +1 -1
  67. package/man/mend-shell.1 +1 -1
  68. package/man/mend-skills-push.1 +1 -1
  69. package/man/mend-skills.1 +1 -1
  70. package/man/mend-snake.1 +1 -1
  71. package/man/mend-ssh-setup.1 +1 -1
  72. package/man/mend-ssh.1 +1 -1
  73. package/man/mend-stop.1 +1 -1
  74. package/man/mend-ui.1 +1 -1
  75. package/man/mend-uninstall.1 +1 -1
  76. package/man/mend-version.1 +1 -1
  77. package/man/mend-worktrees.1 +1 -1
  78. package/man/mend.1 +1 -1
  79. package/package.json +2 -2
@@ -28799,6 +28799,73 @@ var trackBracketedPaste = (output, current) => {
28799
28799
  };
28800
28800
  var pasteBytes = (text, bracketed) => Buffer.from(bracketed ? `\x1B[200~${text}\x1B[201~` : text, "utf8");
28801
28801
 
28802
+ // src/server-request.ts
28803
+ var MendRequestError = class extends Error {
28804
+ kind;
28805
+ status;
28806
+ constructor(kind, message, status = null) {
28807
+ super(message);
28808
+ this.name = "MendRequestError";
28809
+ this.kind = kind;
28810
+ this.status = status;
28811
+ }
28812
+ };
28813
+ var TIMEOUT_CODES = /* @__PURE__ */ new Set([
28814
+ "UND_ERR_HEADERS_TIMEOUT",
28815
+ "UND_ERR_BODY_TIMEOUT"
28816
+ ]);
28817
+ var DROPPED_CODES = /* @__PURE__ */ new Set([
28818
+ "UND_ERR_SOCKET",
28819
+ "UND_ERR_CLOSED",
28820
+ "ECONNRESET",
28821
+ "EPIPE"
28822
+ ]);
28823
+ var codeOf = (value3) => {
28824
+ if (typeof value3 !== "object" || value3 === null || !("code" in value3)) return null;
28825
+ return typeof value3.code === "string" ? value3.code : null;
28826
+ };
28827
+ var nameOf = (value3) => {
28828
+ if (typeof value3 !== "object" || value3 === null || !("name" in value3)) return null;
28829
+ return typeof value3.name === "string" ? value3.name : null;
28830
+ };
28831
+ var noAnswerOf = (error) => {
28832
+ const name = nameOf(error);
28833
+ if (name === "TimeoutError" || name === "AbortError") return "timeout";
28834
+ const cause = typeof error === "object" && error !== null && "cause" in error ? error.cause : null;
28835
+ const code = codeOf(cause) ?? codeOf(error);
28836
+ if (code !== null && TIMEOUT_CODES.has(code)) return "timeout";
28837
+ if (code !== null && DROPPED_CODES.has(code)) return "dropped";
28838
+ return "unreachable";
28839
+ };
28840
+ var spoken = (ms) => {
28841
+ const seconds2 = Math.round(ms / 1e3);
28842
+ if (seconds2 < 90) return `${seconds2}s`;
28843
+ return `${Math.round(seconds2 / 60)} min`;
28844
+ };
28845
+ var noAnswerMessage = (kind, serverUrl, call, waitedMs) => {
28846
+ if (kind === "unreachable")
28847
+ return `cannot reach the Mend server at ${serverUrl} \u2014 is it running?`;
28848
+ if (kind === "timeout") {
28849
+ return `${call} has had no answer from ${serverUrl} after ${spoken(waitedMs)} \u2014 the server accepted it and may still be working on it`;
28850
+ }
28851
+ return `the connection to ${serverUrl} closed before ${call} answered \u2014 the server may still be working on it`;
28852
+ };
28853
+ var noAnswerError = (error, serverUrl, call, waitedMs) => {
28854
+ const kind = noAnswerOf(error);
28855
+ return new MendRequestError(kind, noAnswerMessage(kind, serverUrl, call, waitedMs));
28856
+ };
28857
+ var GATEWAY_STATUSES = /* @__PURE__ */ new Set([
28858
+ 502,
28859
+ 503,
28860
+ 504,
28861
+ 520,
28862
+ 521,
28863
+ 522,
28864
+ 523,
28865
+ 524
28866
+ ]);
28867
+ var mayStillBeWorking = (error) => error instanceof MendRequestError && (error.kind === "timeout" || error.kind === "dropped" || error.kind === "http" && error.status !== null && GATEWAY_STATUSES.has(error.status));
28868
+
28802
28869
  // src/workbench-events.ts
28803
28870
  var createSseParser = () => {
28804
28871
  let buffer = "";
@@ -28879,6 +28946,11 @@ export {
28879
28946
  isPasteChunk,
28880
28947
  trackBracketedPaste,
28881
28948
  pasteBytes,
28949
+ MendRequestError,
28950
+ spoken,
28951
+ noAnswerError,
28952
+ GATEWAY_STATUSES,
28953
+ mayStillBeWorking,
28882
28954
  createSseParser,
28883
28955
  eventFamilies
28884
28956
  };
@@ -10,11 +10,12 @@ import {
10
10
  eventFamilies,
11
11
  isPendingId,
12
12
  matchProjectByCwd,
13
+ mayStillBeWorking,
13
14
  normalizeProjectName,
14
15
  pendingId,
15
16
  repositoryCloneUrlIssue,
16
17
  servicesHoldLine
17
- } from "./chunk-JJ66V76Y.js";
18
+ } from "./chunk-AAAXHRWL.js";
18
19
 
19
20
  // src/dashboard.tsx
20
21
  import { CliRenderEvents, createCliRenderer } from "@opentui/core";
@@ -2412,6 +2413,15 @@ var StatusLine = ({
2412
2413
  return /* @__PURE__ */ jsx3("text", { height: 1, fg: INK_2, bg: "transparent", children: text });
2413
2414
  };
2414
2415
  var errorText = (error) => error instanceof Error ? error.message : String(error);
2416
+ var startedOrStarting = async (start, starting) => {
2417
+ try {
2418
+ return await start;
2419
+ } catch (error) {
2420
+ if (mayStillBeWorking(error)) return { ...starting, status: "starting" };
2421
+ throw error;
2422
+ }
2423
+ };
2424
+ var startedLine = (session) => session.status === "starting" ? `still starting \xB7 ${sessionDisplayName(session)} \u2014 a attaches once the row reads running` : `started \xB7 ${sessionDisplayName(session)} \u2014 a attaches`;
2415
2425
  var keepSpanVisible = (scroll, top, height, viewRows) => {
2416
2426
  if (scroll === null || viewRows <= 0) return;
2417
2427
  const viewH = Math.max(1, viewRows);
@@ -2597,7 +2607,7 @@ var App = ({ ctx, onQuit }) => {
2597
2607
  `).join("");
2598
2608
  process.stdout.write(
2599
2609
  `
2600
- attached \xB7 ${session.harness} \xB7 ${short} \xB7 detach: Ctrl+]
2610
+ attaching \xB7 ${session.harness} \xB7 ${short} \xB7 detach: Ctrl+]
2601
2611
  ${tunneled}
2602
2612
  `
2603
2613
  );
@@ -2641,7 +2651,7 @@ ${tunneled}
2641
2651
  lockRef.current = false;
2642
2652
  }
2643
2653
  say(
2644
- outcome === "unavailable" ? "attach unavailable \u2014 could not connect" : outcome === "detached" || outcome === "interrupted" ? `detached \u2014 ${short} keeps running` : outcome === "dropped" ? `disconnected \xB7 ${short} \u2014 refreshing session status` : `terminal ended \xB7 ${short} \u2014 refreshing session status`
2654
+ outcome === "unavailable" ? "attach unavailable \u2014 could not connect" : outcome === "no-answer" ? `no answer \u2014 the server did not open ${short}'s terminal; it keeps running \xB7 a tries again` : outcome === "detached" || outcome === "interrupted" ? `detached \u2014 ${short} keeps running` : outcome === "dropped" ? `disconnected \xB7 ${short} \u2014 refreshing session status` : `terminal ended \xB7 ${short} \u2014 refreshing session status`
2645
2655
  );
2646
2656
  refetch();
2647
2657
  };
@@ -2663,8 +2673,10 @@ ${tunneled}
2663
2673
  name: vars.name,
2664
2674
  base: vars.base
2665
2675
  });
2666
- await ctx.api("POST", `/sessions/${session.id}/launch`, { argv });
2667
- return session;
2676
+ return startedOrStarting(
2677
+ ctx.api("POST", `/sessions/${session.id}/launch`, { argv }),
2678
+ session
2679
+ );
2668
2680
  },
2669
2681
  onMutate: async (vars) => {
2670
2682
  await queryClient.cancelQueries({ queryKey: WORKBENCH_KEY });
@@ -2700,7 +2712,7 @@ ${tunneled}
2700
2712
  );
2701
2713
  setSessionKey((current) => current === vars.pendingKey ? session.id : current);
2702
2714
  setBusy(null);
2703
- say(`started \xB7 ${sessionDisplayName(session)} \u2014 a attaches`);
2715
+ say(startedLine(session));
2704
2716
  },
2705
2717
  onSettled: (_data, _error, vars) => {
2706
2718
  gate.release(vars.gateKey);
@@ -2708,9 +2720,12 @@ ${tunneled}
2708
2720
  }
2709
2721
  });
2710
2722
  const resumeMutation = useMutation2({
2711
- mutationFn: (vars) => ctx.api("POST", `/sessions/${vars.session.id}/resume`, {
2712
- harness: vars.harness
2713
- }),
2723
+ mutationFn: (vars) => startedOrStarting(
2724
+ ctx.api("POST", `/sessions/${vars.session.id}/resume`, {
2725
+ harness: vars.harness
2726
+ }),
2727
+ vars.session
2728
+ ),
2714
2729
  onMutate: async (vars) => {
2715
2730
  await queryClient.cancelQueries({ queryKey: WORKBENCH_KEY });
2716
2731
  patchWorkbench(
@@ -2735,7 +2750,9 @@ ${tunneled}
2735
2750
  (current) => replaceSession(current, vars.projectId, vars.session.id, resumed)
2736
2751
  );
2737
2752
  setBusy(null);
2738
- say(`resumed \xB7 ${sessionDisplayName(resumed)} \u2014 a attaches`);
2753
+ say(
2754
+ resumed.status === "starting" ? `still resuming \xB7 ${sessionDisplayName(resumed)} \u2014 a attaches once the row reads running` : `resumed \xB7 ${sessionDisplayName(resumed)} \u2014 a attaches`
2755
+ );
2739
2756
  },
2740
2757
  onSettled: (_data, _error, vars) => {
2741
2758
  gate.release(vars.gateKey);
@@ -2846,8 +2863,10 @@ ${tunneled}
2846
2863
  harness: vars.harness,
2847
2864
  label: null
2848
2865
  });
2849
- await ctx.api("POST", `/sessions/${session.id}/launch`, { argv });
2850
- return session;
2866
+ return startedOrStarting(
2867
+ ctx.api("POST", `/sessions/${session.id}/launch`, { argv }),
2868
+ session
2869
+ );
2851
2870
  },
2852
2871
  onMutate: async (vars) => {
2853
2872
  await queryClient.cancelQueries({ queryKey: WORKBENCH_KEY });
@@ -2880,7 +2899,7 @@ ${tunneled}
2880
2899
  );
2881
2900
  setSessionKey((current) => current === vars.pendingKey ? session.id : current);
2882
2901
  setBusy(null);
2883
- say(`started \xB7 ${sessionDisplayName(session)} \u2014 a attaches`);
2902
+ say(startedLine(session));
2884
2903
  },
2885
2904
  onSettled: (_data, _error, vars) => {
2886
2905
  gate.release(vars.gateKey);