overmux 0.0.7 → 0.0.9

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 (40) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/auth/.vite/manifest.json +1 -1
  3. package/dist/auth/THIRD_PARTY_NOTICES.md +1 -1
  4. package/dist/auth/assets/index-Gk_oLI4g.js +2571 -0
  5. package/dist/auth/index.html +1 -1
  6. package/dist/bin.js +66 -25
  7. package/dist/bin.js.map +1 -1
  8. package/dist/docs/100-introduction/300-why-i-built-overmux.md +1 -1
  9. package/dist/docs/200-getting-started/100-install-and-run-overmux.md +1 -1
  10. package/dist/docs/200-getting-started/200-install-overmux-desktop.md +13 -0
  11. package/dist/docs/400-reference/500-server/100-resources.md +25 -0
  12. package/dist/docs/400-reference/500-server/500-api.md +4 -2
  13. package/dist/docs/400-reference/600-client/010-commands.md +0 -29
  14. package/dist/docs/400-reference/700-cli/050-init.md +3 -1
  15. package/dist/exports/client.d.ts +1 -1
  16. package/dist/exports/client.d.ts.map +1 -1
  17. package/dist/exports/client.js +89 -25
  18. package/dist/exports/client.js.map +1 -1
  19. package/dist/exports/{index-Cz3xkCa4.d.ts → index-Dk11nKIv.d.ts} +2 -2
  20. package/dist/exports/index-Dk11nKIv.d.ts.map +1 -0
  21. package/dist/exports/index.d.ts +1 -1
  22. package/dist/exports/index.js.map +1 -1
  23. package/dist/internal/server/coordinator/server-child.js +75 -22
  24. package/dist/internal/server/coordinator/server-child.js.map +1 -1
  25. package/docs/100-introduction/300-why-i-built-overmux.md +1 -1
  26. package/docs/200-getting-started/100-install-and-run-overmux.md +1 -1
  27. package/docs/200-getting-started/200-install-overmux-desktop.md +13 -0
  28. package/docs/400-reference/500-server/100-resources.md +25 -0
  29. package/docs/400-reference/500-server/500-api.md +4 -2
  30. package/docs/400-reference/600-client/010-commands.md +0 -29
  31. package/docs/400-reference/700-cli/050-init.md +3 -1
  32. package/package.json +5 -4
  33. package/src/internal/cli/commands/init-template.ts +3 -0
  34. package/src/internal/cli/commands/init.ts +16 -6
  35. package/src/internal/client/overmux-react.ts +121 -27
  36. package/src/internal/server/runtime/runtime-resources.ts +99 -20
  37. package/src/internal/server/websocket-connection.ts +27 -2
  38. package/src/public/config.ts +1 -1
  39. package/dist/auth/assets/index-Bc0hP5IW.js +0 -2580
  40. package/dist/exports/index-Cz3xkCa4.d.ts.map +0 -1
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <meta name="color-scheme" content="dark light" />
7
7
  <title>Overmux authentication</title>
8
- <script type="module" crossorigin src="/_overmux/auth-shell/assets/index-Bc0hP5IW.js"></script>
8
+ <script type="module" crossorigin src="/_overmux/auth-shell/assets/index-Gk_oLI4g.js"></script>
9
9
  <link rel="stylesheet" crossorigin href="/_overmux/auth-shell/assets/index-BM9gETvx.css">
10
10
  </head>
11
11
  <body>
package/dist/bin.js CHANGED
@@ -2732,6 +2732,33 @@ var getInvalidatedResourceIds = (graph, resourceId) => {
2732
2732
  };
2733
2733
  //#endregion
2734
2734
  //#region src/internal/server/runtime/runtime-resources.ts
2735
+ var createSubscriptionLifetime = ({ entry, invalidationListeners, lifecycle, signal }) => {
2736
+ const controller = new AbortController();
2737
+ const subscriptionSignal = AbortSignal.any([lifecycle.requestSignal(signal), controller.signal]);
2738
+ subscriptionSignal.throwIfAborted();
2739
+ const registeredEntry = {
2740
+ ...entry,
2741
+ listener: () => {
2742
+ if (!subscriptionSignal.aborted) entry.listener();
2743
+ }
2744
+ };
2745
+ const disposers = [];
2746
+ const release = lifecycle.track(async () => {
2747
+ invalidationListeners.delete(registeredEntry);
2748
+ await lifecycle.disposeAll(disposers);
2749
+ }, subscriptionSignal);
2750
+ const dispose = () => {
2751
+ controller.abort(/* @__PURE__ */ new Error("Resource subscription closed"));
2752
+ return release();
2753
+ };
2754
+ invalidationListeners.add(registeredEntry);
2755
+ return {
2756
+ dispose,
2757
+ disposers,
2758
+ refresh: registeredEntry.listener,
2759
+ signal: subscriptionSignal
2760
+ };
2761
+ };
2735
2762
  var createRuntimeResources = ({ definitions, instance, lifecycle }) => {
2736
2763
  const graph = createResourceDependencyGraph(definitions);
2737
2764
  const invalidationListeners = /* @__PURE__ */ new Set();
@@ -2763,44 +2790,55 @@ var createRuntimeResources = ({ definitions, instance, lifecycle }) => {
2763
2790
  operationSignal.throwIfAborted();
2764
2791
  return definition.contract.output.parse(rawOutput);
2765
2792
  };
2766
- const activateWatchers = (id, rawInput, signal, activated, disposers) => {
2793
+ const activateSubscriptions = async (id, rawInput, signal, activated, disposers) => {
2794
+ signal.throwIfAborted();
2767
2795
  if (activated.has(id)) return;
2768
2796
  activated.add(id);
2769
2797
  const definition = definitions[id];
2770
2798
  const input = definition.contract.input.parse(rawInput);
2771
2799
  if (definition.kind === "subscription") {
2772
- const dispose = definition.subscribe(input, () => invalidateResource(id, input), context(signal));
2800
+ const dispose = await definition.subscribe(input, () => {
2801
+ if (!signal.aborted) invalidateResource(id, input);
2802
+ }, context(signal));
2773
2803
  if (typeof dispose !== "function") throw new Error(`Resource ${id} subscribe must return a disposer`);
2804
+ if (signal.aborted) {
2805
+ await dispose();
2806
+ signal.throwIfAborted();
2807
+ }
2774
2808
  disposers.push(dispose);
2775
2809
  return;
2776
2810
  }
2777
- if (definition.kind === "derived") graph.dependencies.get(id)?.forEach((dependencyId) => {
2778
- activateWatchers(dependencyId, rawInput, signal, activated, disposers);
2779
- });
2811
+ if (definition.kind === "derived") for (const dependencyId of graph.dependencies.get(id) ?? []) await activateSubscriptions(dependencyId, rawInput, signal, activated, disposers);
2780
2812
  };
2781
2813
  Object.keys(definitions).forEach((name) => {
2782
2814
  resources.set(name, {
2783
2815
  read: (input, signal) => read(name, input, signal),
2784
- subscribe: (rawInput, listener, signal) => {
2816
+ subscribe: async (rawInput, listener, signal) => {
2785
2817
  lifecycle.requestSignal(signal).throwIfAborted();
2786
- const entry = {
2787
- input: definitions[name].contract.input.parse(rawInput),
2788
- listener,
2789
- resourceId: name
2790
- };
2791
- const watcherDisposers = [];
2792
- invalidationListeners.add(entry);
2818
+ const subscription = createSubscriptionLifetime({
2819
+ entry: {
2820
+ input: definitions[name].contract.input.parse(rawInput),
2821
+ listener,
2822
+ resourceId: name
2823
+ },
2824
+ invalidationListeners,
2825
+ lifecycle,
2826
+ signal
2827
+ });
2793
2828
  try {
2794
- activateWatchers(name, rawInput, signal, /* @__PURE__ */ new Set(), watcherDisposers);
2829
+ await activateSubscriptions(name, rawInput, subscription.signal, /* @__PURE__ */ new Set(), subscription.disposers);
2830
+ subscription.signal.throwIfAborted();
2831
+ subscription.refresh();
2832
+ subscription.signal.throwIfAborted();
2833
+ return subscription.dispose;
2795
2834
  } catch (cause) {
2796
- invalidationListeners.delete(entry);
2797
- lifecycle.disposeAll(watcherDisposers).catch(() => void 0);
2835
+ try {
2836
+ await subscription.dispose();
2837
+ } catch (cleanupError) {
2838
+ throw new AggregateError([cause, cleanupError], "Resource subscription setup and cleanup failed");
2839
+ }
2798
2840
  throw cause;
2799
2841
  }
2800
- return lifecycle.track(async () => {
2801
- invalidationListeners.delete(entry);
2802
- await lifecycle.disposeAll(watcherDisposers);
2803
- }, signal);
2804
2842
  }
2805
2843
  });
2806
2844
  });
@@ -3882,6 +3920,7 @@ var initScaffoldPaths = [
3882
3920
  "mise.toml",
3883
3921
  "package.json",
3884
3922
  "pnpm-lock.yaml",
3923
+ "pnpm-workspace.yaml",
3885
3924
  "overmux.config.ts",
3886
3925
  "src/server/index.ts",
3887
3926
  "src/ui/app.tsx",
@@ -3902,7 +3941,8 @@ var packageJson = (overmuxVersion) => `${JSON.stringify({
3902
3941
  dependencies: {
3903
3942
  overmux: overmuxVersion,
3904
3943
  react: "^19.0.0",
3905
- "react-dom": "^19.0.0"
3944
+ "react-dom": "^19.0.0",
3945
+ zod: "^4.6.5"
3906
3946
  },
3907
3947
  devDependencies: {
3908
3948
  "@types/react": "^19.0.0",
@@ -3922,6 +3962,7 @@ pnpm = "10"
3922
3962
  "npm:overmux" = "${overmuxVersion}"
3923
3963
  ` } : {},
3924
3964
  "package.json": packageJson(overmuxVersion),
3965
+ "pnpm-workspace.yaml": "onlyBuiltDependencies:\n - node-pty\n",
3925
3966
  "overmux.config.ts": `import { defineOvermuxConfig } from "overmux";
3926
3967
 
3927
3968
  import server from "./src/server/index";
@@ -4044,9 +4085,9 @@ var detectToolchain = (dependencies) => {
4044
4085
  return "mise";
4045
4086
  }
4046
4087
  const pnpm = dependencies.runCommand("pnpm", ["--version"]);
4047
- const major = Number.parseInt(pnpm.stdout.trim().split(".")[0] ?? "", 10);
4048
- if (!commandExists(pnpm) || pnpm.status !== 0 || !Number.isFinite(major)) throw new Error("pnpm 10 or newer is required when mise is not installed");
4049
- if (major < 10) throw new Error(`pnpm 10 or newer is required when mise is not installed (found ${pnpm.stdout.trim()})`);
4088
+ const [major = NaN, minor = NaN] = pnpm.stdout.trim().split(".").map(Number);
4089
+ if (!commandExists(pnpm) || pnpm.status !== 0 || !Number.isFinite(major) || !Number.isFinite(minor)) throw new Error("pnpm 10.5.0 or newer is required when mise is not installed");
4090
+ if (major < 10 || major === 10 && minor < 5) throw new Error(`pnpm 10.5.0 or newer is required when mise is not installed (found ${pnpm.stdout.trim()})`);
4050
4091
  return "pnpm";
4051
4092
  };
4052
4093
  var findCollisions = (directory) => {
@@ -4066,7 +4107,7 @@ var runProjectCommand = ({ args, command, cwd, dependencies }) => {
4066
4107
  dependencies.stderr.write(result.stderr);
4067
4108
  if (result.error || result.status !== 0) throw new Error(`Command failed: ${command} ${args.join(" ")}`);
4068
4109
  };
4069
- var pnpmCommands = [["install", "--ignore-workspace"], [
4110
+ var pnpmCommands = [["install"], [
4070
4111
  "exec",
4071
4112
  "overmux",
4072
4113
  "check",