claude-mux 0.30.0 → 0.30.1

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 (140) hide show
  1. package/CLAUDE.md +3 -1
  2. package/dist/commands/new-session.d.ts.map +1 -1
  3. package/dist/commands/new-session.js +2 -2
  4. package/dist/commands/new-session.js.map +1 -1
  5. package/dist/commands/service.d.ts.map +1 -1
  6. package/dist/commands/service.js +5 -4
  7. package/dist/commands/service.js.map +1 -1
  8. package/dist/commands/update.d.ts +7 -0
  9. package/dist/commands/update.d.ts.map +1 -1
  10. package/dist/commands/update.js +68 -25
  11. package/dist/commands/update.js.map +1 -1
  12. package/dist/tmux/server.d.ts +33 -0
  13. package/dist/tmux/server.d.ts.map +1 -0
  14. package/dist/tmux/server.js +75 -0
  15. package/dist/tmux/server.js.map +1 -0
  16. package/dist/utils/version.d.ts +1 -1
  17. package/dist/utils/version.js +1 -1
  18. package/dist/web/client/_app/immutable/chunks/B9ridFLz.js +2 -0
  19. package/dist/web/client/_app/immutable/chunks/{C_0O-5sL.js.map → B9ridFLz.js.map} +1 -1
  20. package/{web/.svelte-kit/output/client/_app/immutable/chunks/CwqQp6PF.js → dist/web/client/_app/immutable/chunks/Bc_sm8-H.js} +2 -2
  21. package/{web/.svelte-kit/output/client/_app/immutable/chunks/CwqQp6PF.js.map → dist/web/client/_app/immutable/chunks/Bc_sm8-H.js.map} +1 -1
  22. package/dist/web/client/_app/immutable/chunks/CXF5WJph.js +3 -0
  23. package/dist/web/client/_app/immutable/chunks/{B2jaxV_u.js.map → CXF5WJph.js.map} +1 -1
  24. package/dist/web/client/_app/immutable/chunks/{VmEtOaGT.js → CbIyiVoe.js} +2 -2
  25. package/dist/web/client/_app/immutable/chunks/{VmEtOaGT.js.map → CbIyiVoe.js.map} +1 -1
  26. package/dist/web/client/_app/immutable/chunks/{BddLlazN.js → D96S8WpI.js} +2 -2
  27. package/{web/.svelte-kit/output/client/_app/immutable/chunks/BddLlazN.js.map → dist/web/client/_app/immutable/chunks/D96S8WpI.js.map} +1 -1
  28. package/{web/.svelte-kit/output/client/_app/immutable/chunks/CLWK-3Sm.js → dist/web/client/_app/immutable/chunks/DCuwRZyE.js} +2 -2
  29. package/dist/web/client/_app/immutable/chunks/{CLWK-3Sm.js.map → DCuwRZyE.js.map} +1 -1
  30. package/{web/.svelte-kit/output/client/_app/immutable/chunks/B0WiEFFI.js → dist/web/client/_app/immutable/chunks/JhQo23PC.js} +2 -2
  31. package/{web/.svelte-kit/output/client/_app/immutable/chunks/B0WiEFFI.js.map → dist/web/client/_app/immutable/chunks/JhQo23PC.js.map} +1 -1
  32. package/dist/web/client/_app/immutable/chunks/{19820tOo.js → q-c8p3im.js} +2 -2
  33. package/{web/.svelte-kit/output/client/_app/immutable/chunks/19820tOo.js.map → dist/web/client/_app/immutable/chunks/q-c8p3im.js.map} +1 -1
  34. package/dist/web/client/_app/immutable/entry/{app.DLdHM347.js → app.BL4RaJmK.js} +3 -3
  35. package/dist/web/client/_app/immutable/entry/{app.DLdHM347.js.map → app.BL4RaJmK.js.map} +1 -1
  36. package/dist/web/client/_app/immutable/entry/start.BlASigRg.js +2 -0
  37. package/dist/web/client/_app/immutable/entry/start.BlASigRg.js.map +1 -0
  38. package/{web/.svelte-kit/output/client/_app/immutable/nodes/0.D339GFgp.js → dist/web/client/_app/immutable/nodes/0.BjKdErxW.js} +2 -2
  39. package/dist/web/client/_app/immutable/nodes/{0.D339GFgp.js.map → 0.BjKdErxW.js.map} +1 -1
  40. package/dist/web/client/_app/immutable/nodes/{1.BRq2Is_d.js → 1.CT8e0bYs.js} +2 -2
  41. package/dist/web/client/_app/immutable/nodes/{1.BRq2Is_d.js.map → 1.CT8e0bYs.js.map} +1 -1
  42. package/dist/web/client/_app/immutable/nodes/{2.qwnQbeHe.js → 2.Bqfw83SN.js} +2 -2
  43. package/dist/web/client/_app/immutable/nodes/{2.qwnQbeHe.js.map → 2.Bqfw83SN.js.map} +1 -1
  44. package/dist/web/client/_app/immutable/nodes/{3.BEc31Ipx.js → 3.BlXk9wvE.js} +2 -2
  45. package/dist/web/client/_app/immutable/nodes/{3.BEc31Ipx.js.map → 3.BlXk9wvE.js.map} +1 -1
  46. package/dist/web/client/_app/immutable/nodes/{4.CoOwQFxg.js → 4.-TYiPquh.js} +2 -2
  47. package/{web/.svelte-kit/output/client/_app/immutable/nodes/4.CoOwQFxg.js.map → dist/web/client/_app/immutable/nodes/4.-TYiPquh.js.map} +1 -1
  48. package/dist/web/client/_app/version.json +1 -1
  49. package/dist/web/server/chunks/{0-DHNN1AAT.js → 0-CbbKKVdr.js} +9 -9
  50. package/dist/web/server/chunks/{0-DHNN1AAT.js.map → 0-CbbKKVdr.js.map} +1 -1
  51. package/dist/web/server/chunks/{1-CbKniSlT.js → 1-Nq7HL0DB.js} +3 -3
  52. package/dist/web/server/chunks/{1-CbKniSlT.js.map → 1-Nq7HL0DB.js.map} +1 -1
  53. package/dist/web/server/chunks/{2-BdIitBN6.js → 2-CKkx7IQu.js} +7 -7
  54. package/dist/web/server/chunks/{2-BdIitBN6.js.map → 2-CKkx7IQu.js.map} +1 -1
  55. package/dist/web/server/chunks/{3-PW6mbTzY.js → 3-DZ__GVXw.js} +9 -9
  56. package/dist/web/server/chunks/{3-PW6mbTzY.js.map → 3-DZ__GVXw.js.map} +1 -1
  57. package/dist/web/server/chunks/{4-Cn_kJEG9.js → 4-CXHo2K6q.js} +7 -7
  58. package/dist/web/server/chunks/{4-Cn_kJEG9.js.map → 4-CXHo2K6q.js.map} +1 -1
  59. package/dist/web/server/chunks/{_server.ts-D5W_RgWh.js → _server.ts-rwgLlQ3t.js} +39 -8
  60. package/dist/web/server/chunks/_server.ts-rwgLlQ3t.js.map +1 -0
  61. package/dist/web/server/index.js +13 -3
  62. package/dist/web/server/index.js.map +1 -1
  63. package/dist/web/server/manifest.js +12 -12
  64. package/dist/web/server/manifest.js.map +1 -1
  65. package/package.json +1 -1
  66. package/src/commands/new-session.ts +2 -2
  67. package/src/commands/service.ts +5 -4
  68. package/src/commands/update.ts +67 -26
  69. package/src/tmux/server.ts +80 -0
  70. package/src/utils/version.ts +1 -1
  71. package/tests/commands/update.test.ts +20 -1
  72. package/web/.svelte-kit/adapter-bun/chunks/internal2.js +1 -1
  73. package/web/.svelte-kit/adapter-bun/chunks/internal2.js.map +1 -1
  74. package/web/.svelte-kit/adapter-bun/chunks/utils.js +15 -1
  75. package/web/.svelte-kit/adapter-bun/chunks/utils.js.map +1 -1
  76. package/web/.svelte-kit/adapter-bun/entries/endpoints/api/projects/new-session/_server.ts.js +21 -7
  77. package/web/.svelte-kit/adapter-bun/entries/endpoints/api/projects/new-session/_server.ts.js.map +1 -1
  78. package/web/.svelte-kit/adapter-bun/manifest-full.js +1 -1
  79. package/web/.svelte-kit/adapter-bun/manifest.js +1 -1
  80. package/web/.svelte-kit/adapter-bun/nodes/0.js +1 -1
  81. package/web/.svelte-kit/adapter-bun/nodes/1.js +1 -1
  82. package/web/.svelte-kit/adapter-bun/nodes/2.js +1 -1
  83. package/web/.svelte-kit/adapter-bun/nodes/3.js +1 -1
  84. package/web/.svelte-kit/adapter-bun/nodes/4.js +1 -1
  85. package/web/.svelte-kit/generated/server/internal.js +1 -1
  86. package/web/.svelte-kit/output/client/.vite/manifest.json +101 -101
  87. package/web/.svelte-kit/output/client/_app/immutable/chunks/B9ridFLz.js +2 -0
  88. package/web/.svelte-kit/output/client/_app/immutable/chunks/{C_0O-5sL.js.map → B9ridFLz.js.map} +1 -1
  89. package/{dist/web/client/_app/immutable/chunks/CwqQp6PF.js → web/.svelte-kit/output/client/_app/immutable/chunks/Bc_sm8-H.js} +2 -2
  90. package/{dist/web/client/_app/immutable/chunks/CwqQp6PF.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/Bc_sm8-H.js.map} +1 -1
  91. package/web/.svelte-kit/output/client/_app/immutable/chunks/CXF5WJph.js +3 -0
  92. package/web/.svelte-kit/output/client/_app/immutable/chunks/{B2jaxV_u.js.map → CXF5WJph.js.map} +1 -1
  93. package/web/.svelte-kit/output/client/_app/immutable/chunks/{VmEtOaGT.js → CbIyiVoe.js} +2 -2
  94. package/web/.svelte-kit/output/client/_app/immutable/chunks/{VmEtOaGT.js.map → CbIyiVoe.js.map} +1 -1
  95. package/web/.svelte-kit/output/client/_app/immutable/chunks/{BddLlazN.js → D96S8WpI.js} +2 -2
  96. package/{dist/web/client/_app/immutable/chunks/BddLlazN.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/D96S8WpI.js.map} +1 -1
  97. package/{dist/web/client/_app/immutable/chunks/CLWK-3Sm.js → web/.svelte-kit/output/client/_app/immutable/chunks/DCuwRZyE.js} +2 -2
  98. package/web/.svelte-kit/output/client/_app/immutable/chunks/{CLWK-3Sm.js.map → DCuwRZyE.js.map} +1 -1
  99. package/{dist/web/client/_app/immutable/chunks/B0WiEFFI.js → web/.svelte-kit/output/client/_app/immutable/chunks/JhQo23PC.js} +2 -2
  100. package/{dist/web/client/_app/immutable/chunks/B0WiEFFI.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/JhQo23PC.js.map} +1 -1
  101. package/web/.svelte-kit/output/client/_app/immutable/chunks/{19820tOo.js → q-c8p3im.js} +2 -2
  102. package/{dist/web/client/_app/immutable/chunks/19820tOo.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/q-c8p3im.js.map} +1 -1
  103. package/web/.svelte-kit/output/client/_app/immutable/entry/{app.DLdHM347.js → app.BL4RaJmK.js} +3 -3
  104. package/web/.svelte-kit/output/client/_app/immutable/entry/{app.DLdHM347.js.map → app.BL4RaJmK.js.map} +1 -1
  105. package/web/.svelte-kit/output/client/_app/immutable/entry/start.BlASigRg.js +2 -0
  106. package/web/.svelte-kit/output/client/_app/immutable/entry/start.BlASigRg.js.map +1 -0
  107. package/{dist/web/client/_app/immutable/nodes/0.D339GFgp.js → web/.svelte-kit/output/client/_app/immutable/nodes/0.BjKdErxW.js} +2 -2
  108. package/web/.svelte-kit/output/client/_app/immutable/nodes/{0.D339GFgp.js.map → 0.BjKdErxW.js.map} +1 -1
  109. package/web/.svelte-kit/output/client/_app/immutable/nodes/{1.BRq2Is_d.js → 1.CT8e0bYs.js} +2 -2
  110. package/web/.svelte-kit/output/client/_app/immutable/nodes/{1.BRq2Is_d.js.map → 1.CT8e0bYs.js.map} +1 -1
  111. package/web/.svelte-kit/output/client/_app/immutable/nodes/{2.qwnQbeHe.js → 2.Bqfw83SN.js} +2 -2
  112. package/web/.svelte-kit/output/client/_app/immutable/nodes/{2.qwnQbeHe.js.map → 2.Bqfw83SN.js.map} +1 -1
  113. package/web/.svelte-kit/output/client/_app/immutable/nodes/{3.BEc31Ipx.js → 3.BlXk9wvE.js} +2 -2
  114. package/web/.svelte-kit/output/client/_app/immutable/nodes/{3.BEc31Ipx.js.map → 3.BlXk9wvE.js.map} +1 -1
  115. package/web/.svelte-kit/output/client/_app/immutable/nodes/{4.CoOwQFxg.js → 4.-TYiPquh.js} +2 -2
  116. package/{dist/web/client/_app/immutable/nodes/4.CoOwQFxg.js.map → web/.svelte-kit/output/client/_app/immutable/nodes/4.-TYiPquh.js.map} +1 -1
  117. package/web/.svelte-kit/output/client/_app/version.json +1 -1
  118. package/web/.svelte-kit/output/server/chunks/internal2.js +1 -1
  119. package/web/.svelte-kit/output/server/chunks/internal2.js.map +1 -1
  120. package/web/.svelte-kit/output/server/chunks/utils.js +15 -1
  121. package/web/.svelte-kit/output/server/chunks/utils.js.map +1 -1
  122. package/web/.svelte-kit/output/server/entries/endpoints/api/projects/new-session/_server.ts.js +21 -7
  123. package/web/.svelte-kit/output/server/entries/endpoints/api/projects/new-session/_server.ts.js.map +1 -1
  124. package/web/.svelte-kit/output/server/manifest-full.js +1 -1
  125. package/web/.svelte-kit/output/server/manifest.js +1 -1
  126. package/web/.svelte-kit/output/server/nodes/0.js +1 -1
  127. package/web/.svelte-kit/output/server/nodes/1.js +1 -1
  128. package/web/.svelte-kit/output/server/nodes/2.js +1 -1
  129. package/web/.svelte-kit/output/server/nodes/3.js +1 -1
  130. package/web/.svelte-kit/output/server/nodes/4.js +1 -1
  131. package/web/src/routes/api/projects/new-session/+server.ts +6 -6
  132. package/dist/web/client/_app/immutable/chunks/B2jaxV_u.js +0 -3
  133. package/dist/web/client/_app/immutable/chunks/C_0O-5sL.js +0 -2
  134. package/dist/web/client/_app/immutable/entry/start.DIhipajB.js +0 -2
  135. package/dist/web/client/_app/immutable/entry/start.DIhipajB.js.map +0 -1
  136. package/dist/web/server/chunks/_server.ts-D5W_RgWh.js.map +0 -1
  137. package/web/.svelte-kit/output/client/_app/immutable/chunks/B2jaxV_u.js +0 -3
  138. package/web/.svelte-kit/output/client/_app/immutable/chunks/C_0O-5sL.js +0 -2
  139. package/web/.svelte-kit/output/client/_app/immutable/entry/start.DIhipajB.js +0 -2
  140. package/web/.svelte-kit/output/client/_app/immutable/entry/start.DIhipajB.js.map +0 -1
package/CLAUDE.md CHANGED
@@ -61,7 +61,9 @@ sudo loginctl enable-linger $USER # one-time: survive logout, start on bo
61
61
  journalctl --user -u claude-mux -f # logs
62
62
  ```
63
63
 
64
- `update` auto-detects how the server is running and restarts it accordingly: `systemctl --user stop/start claude-mux.service` for systemd-managed hosts, or `nohup claude-mux serve` for hosts started manually. Use `--skip-restart` to leave the server alone.
64
+ `update` auto-detects how the server is running and restarts it accordingly, installing with whichever of npm or bun owns the running binary. On systemd-managed hosts it never runs `systemctl stop` or `restart`: it installs while the server runs, then ends the main process and lets `Restart=always` start it again (patching an older unit to that first). For hosts started manually it stops the `nohup claude-mux serve` before installing and starts it after. Use `--skip-restart` to leave the server alone.
65
+
66
+ Why not `stop`: tmux 3.4+ built with systemd puts each pane in a scope that is `PartOf=` the unit the tmux server runs in. A server started by the dashboard's first New Session ran inside `claude-mux.service`, so stopping the service closed every pane on the host. `tmuxNewSession()` (`src/tmux/server.ts`) now starts a fresh tmux server under `systemd-run --user --scope` of its own; a server already running inside the service keeps that tie until it next exits, which is why `update` still avoids stop jobs.
65
67
 
66
68
  ## Architecture
67
69
 
@@ -1 +1 @@
1
- {"version":3,"file":"new-session.d.ts","sourceRoot":"","sources":["../../src/commands/new-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8BpC,wBAAgB,uBAAuB,IAAI,OAAO,CA0FjD"}
1
+ {"version":3,"file":"new-session.d.ts","sourceRoot":"","sources":["../../src/commands/new-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+BpC,wBAAgB,uBAAuB,IAAI,OAAO,CAyFjD"}
@@ -7,6 +7,7 @@ import { upsertSession, writeLink } from "../db/sessions-json.js";
7
7
  import { resolveSession } from "./resolve-session.js";
8
8
  import { projectSlug } from "../utils/slug.js";
9
9
  import { sizeArgsForNewSession } from "../tmux/geometry.js";
10
+ import { tmuxNewSession } from "../tmux/server.js";
10
11
  /** Pre-trust a workspace directory in ~/.claude.json so Claude skips the trust dialog */
11
12
  function ensureWorkspaceTrusted(cwd) {
12
13
  const claudeJsonPath = join(homedir(), ".claude.json");
@@ -61,8 +62,7 @@ export function createNewSessionCommand() {
61
62
  // (tmux server's global env may have CLAUDECODE=1 from a parent session)
62
63
  // Started detached, the window would be 80x24; the dashboard reads
63
64
  // dialogs off the screen and wants them unwrapped (see tmux/geometry).
64
- const tmuxArgs = ["new-session", "-d", "-s", sessionName, "-c", cwd, ...sizeArgsForNewSession(), "--", "env", "-u", "CLAUDECODE", ...claudeArgs];
65
- execFileSync("tmux", tmuxArgs, { stdio: "ignore" });
65
+ tmuxNewSession(["-d", "-s", sessionName, "-c", cwd, ...sizeArgsForNewSession(), "--", "env", "-u", "CLAUDECODE", ...claudeArgs]);
66
66
  // Detect actual base-index from tmux config
67
67
  const baseIndex = execFileSync("tmux", ["show-option", "-gv", "base-index"], {
68
68
  encoding: "utf-8",
@@ -1 +1 @@
1
- {"version":3,"file":"new-session.js","sourceRoot":"","sources":["../../src/commands/new-session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"new-session.js","sourceRoot":"","sources":["../../src/commands/new-session.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/commands/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6KpC,wBAAgB,oBAAoB,IAAI,OAAO,CAgC9C"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/commands/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8KpC,wBAAgB,oBAAoB,IAAI,OAAO,CAgC9C"}
@@ -64,11 +64,12 @@ Environment=PATH=${pathValue}
64
64
  # Optional env file (e.g. GROQ_API_KEY=...). Leading dash = ok if missing.
65
65
  EnvironmentFile=-%h/.config/claude-mux/env
66
66
  ExecStart=${claudeMuxBin} serve --port ${port} --host ${host}
67
- Restart=on-failure
67
+ # \`claude-mux update\` restarts the server by ending it and letting systemd
68
+ # start it again, never with \`systemctl stop\` (see src/tmux/server.ts).
69
+ Restart=always
68
70
  RestartSec=3
69
- # tmux sessions started from the dashboard (New Session) spawn the tmux server
70
- # as a child of this service. Only kill the server process on stop/restart, so
71
- # \`claude-mux update\` / \`systemctl restart\` never take the Claude sessions down.
71
+ # A tmux server started by an older claude-mux may still run in this cgroup.
72
+ # Only kill the server process itself when it ends.
72
73
  KillMode=process
73
74
  StandardOutput=journal
74
75
  StandardError=journal
@@ -1 +1 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/commands/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACtE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,MAAM,YAAY,GAAG,oBAAoB,CAAC;AAC1C,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AACpE,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;AAEpD,SAAS,KAAK,CAAC,GAAW;IACxB,yEAAyE;IACzE,4EAA4E;IAC5E,yEAAyE;IACzE,gDAAgD;IAChD,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,cAAc,GAAG,EAAE,CAAC,EAAE,EAAE;gBACnF,QAAQ,EAAE,OAAO;gBACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;aAChC,CAAC,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,GAAG;gBAAE,OAAO,GAAG,CAAC;QACtB,CAAC;QAAC,MAAM,CAAC;YACP,oBAAoB;QACtB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,UAAU;IACjB,OAAO,KAAK,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;AACrC,CAAC;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,IAAY;IAC3C,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC;IACzC,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IACD,yEAAyE;IACzE,6EAA6E;IAC7E,4EAA4E;IAC5E,qDAAqD;IACrD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;IAChC,KAAK,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC;QACjE,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACrB,IAAI,CAAC;YAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC;IACD,wEAAwE;IACxE,4EAA4E;IAC5E,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI;QAAE,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,aAAa,CAAC,CAAC;IACjE,KAAK,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,UAAU,EAAE,MAAM,CAAC;QAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACpE,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE7C,OAAO;;;;;;;mBAOU,SAAS;;;YAGhB,YAAY,iBAAiB,IAAI,WAAW,IAAI;;;;;;;;;;;;CAY3D,CAAC;AACF,CAAC;AAED,SAAS,aAAa,CAAC,GAAG,IAAc;IACtC,MAAM,CAAC,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAC5E,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;AACvB,CAAC;AAED,SAAS,aAAa;IACpB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,QAAQ,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAClF,MAAM,GAAG,GAAG,QAAQ,CAAC,sBAAsB,IAAI,wCAAwC,EAAE;YACvF,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,GAAG,KAAK,KAAK,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAQD,KAAK,UAAU,UAAU,CAAC,IAAoB;IAC5C,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;QAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,mBAAmB,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,WAAW,CAAC;IAEtC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,SAAS,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9E,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACnC,aAAa,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,SAAS,SAAS,EAAE,CAAC,CAAC;IAElC,IAAI,aAAa,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;QACzC,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5D,IAAI,aAAa,CAAC,GAAG,GAAG,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9C,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,qCAAqC,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;IAElE,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,+EAA+E,CAAC,CAAC;QAC7F,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,oCAAoC,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAMD,KAAK,UAAU,YAAY,CAAC,IAAsB;IAChD,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,aAAa,CAAC,SAAS,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;QAChD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,UAAU,CAAC,SAAS,CAAC,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,WAAW,SAAS,EAAE,CAAC,CAAC;YACpC,aAAa,CAAC,eAAe,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,YAAY,YAAY,uBAAuB,SAAS,2BAA2B,CAAC,CAAC;QACnG,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,mBAAmB,SAAS,yBAAyB,CAAC,CAAC;IACrE,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS;IACtB,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,aAAa,CAAC,QAAQ,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,6CAA6C,CAAC,CAAC;IAE9F,GAAG;SACA,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,iEAAiE,CAAC;SAC9E,MAAM,CAAC,iBAAiB,EAAE,aAAa,EAAE,MAAM,CAAC,mBAAmB,CAAC,CAAC;SACrE,MAAM,CAAC,kBAAkB,EAAE,aAAa,EAAE,WAAW,CAAC;SACtD,MAAM,CAAC,YAAY,EAAE,sCAAsC,CAAC;SAC5D,MAAM,CAAC,KAAK,EAAE,IAAoB,EAAE,EAAE;QACrC,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,SAAS,EAAE,2BAA2B,CAAC;SAC9C,MAAM,CAAC,KAAK,EAAE,IAAsB,EAAE,EAAE;QACvC,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,6BAA6B,CAAC;SAC1C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,SAAS,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/commands/service.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,13 @@ export interface PrefetchOptions {
11
11
  * server keeps running, and the install that follows reads from the cache.
12
12
  */
13
13
  export declare function prefetchRelease(version: string, opts?: PrefetchOptions): Promise<boolean>;
14
+ /**
15
+ * Bring an older unit up to what `restartUnit` relies on: `KillMode=process`,
16
+ * so ending the server leaves anything else in its cgroup alone, and
17
+ * `Restart=always`, so systemd starts the server again after a clean exit.
18
+ * Patched in place, then daemon-reload.
19
+ */
20
+ export declare function patchUnitForRestart(unit: string): string;
14
21
  export interface UpdateOptions {
15
22
  force?: boolean;
16
23
  skipRestart?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkCpC,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,CAiBnG;AAsFD,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA+DlE;AAED,wBAAgB,mBAAmB,IAAI,OAAO,CAS7C"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmCpC,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,CAiBnG;AAcD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKxD;AAmGD,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAiElE;AAED,wBAAgB,mBAAmB,IAAI,OAAO,CAS7C"}
@@ -1,12 +1,13 @@
1
1
  import { Command } from "commander";
2
2
  import { execSync, spawnSync } from "child_process";
3
- import { existsSync, readFileSync, writeFileSync } from "fs";
3
+ import { existsSync, readFileSync, realpathSync, writeFileSync } from "fs";
4
4
  import { join } from "path";
5
5
  import { homedir } from "os";
6
6
  import { VERSION } from "../utils/version.js";
7
7
  import { runSetup } from "../setup/index.js";
8
8
  import { terminate } from "../utils/pid.js";
9
9
  import { DEFAULT_SERVER_PORT } from "../utils/paths.js";
10
+ import { tmuxServerInsideUnit } from "../tmux/server.js";
10
11
  const UNIT_PATH = join(homedir(), ".config", "systemd", "user", "claude-mux.service");
11
12
  // SSH non-login shells often lack XDG_RUNTIME_DIR, which `systemctl --user`
12
13
  // needs to reach the user manager. Set it ourselves when missing.
@@ -70,28 +71,69 @@ function isSystemdManaged() {
70
71
  return r.status === 0;
71
72
  }
72
73
  /**
73
- * Older unit files lack KillMode=process, so stopping the service also killed
74
- * the tmux server (and every Claude session) spawned from the dashboard.
75
- * Patch the unit in place and daemon-reload BEFORE we stop it.
74
+ * Bring an older unit up to what `restartUnit` relies on: `KillMode=process`,
75
+ * so ending the server leaves anything else in its cgroup alone, and
76
+ * `Restart=always`, so systemd starts the server again after a clean exit.
77
+ * Patched in place, then daemon-reload.
76
78
  */
77
- function ensureUnitKillMode() {
79
+ export function patchUnitForRestart(unit) {
80
+ let patched = unit.replace(/^Restart=(?!always$).*$/m, "Restart=always");
81
+ if (!/^Restart=/m.test(patched))
82
+ patched = patched.replace(/^(ExecStart=.*)$/m, "$1\nRestart=always");
83
+ if (!/^KillMode=/m.test(patched))
84
+ patched = patched.replace(/^(Restart=.*)$/m, "$1\nKillMode=process");
85
+ return patched;
86
+ }
87
+ function ensureUnitRestartable() {
78
88
  if (!existsSync(UNIT_PATH))
79
89
  return;
80
90
  try {
81
91
  const unit = readFileSync(UNIT_PATH, "utf-8");
82
- if (/^KillMode=/m.test(unit))
83
- return;
84
- const patched = unit.replace(/^(RestartSec=.*)$/m, "$1\n# Only kill the server on stop/restart; tmux sessions started from the dashboard live on.\nKillMode=process");
92
+ const patched = patchUnitForRestart(unit);
85
93
  if (patched === unit)
86
94
  return;
87
95
  writeFileSync(UNIT_PATH, patched, "utf-8");
88
- console.log("Patched systemd unit: KillMode=process (keeps tmux sessions alive across restarts)");
96
+ console.log("Patched systemd unit: Restart=always, KillMode=process");
89
97
  systemctlUser("daemon-reload");
90
98
  }
91
99
  catch (err) {
92
100
  console.warn(`Could not patch unit file: ${String(err)}`);
93
101
  }
94
102
  }
103
+ /**
104
+ * Restart the server without `systemctl stop` or `restart`. Those are jobs on
105
+ * the unit, and a stop job carries over to every unit that is `PartOf=` it,
106
+ * which a tmux pane scope is when the tmux server was started from inside the
107
+ * service (see src/tmux/server.ts): every Claude session would close, and this
108
+ * update with them when it was typed in one. Ending the main process and
109
+ * letting `Restart=always` start it again is no job on the unit, so the panes
110
+ * stay. Falls back to a plain restart when the server is not running.
111
+ */
112
+ function restartUnit() {
113
+ const active = spawnSync("systemctl", ["--user", "is-active", "--quiet", SYSTEMD_UNIT]).status === 0;
114
+ if (!active) {
115
+ systemctlUser("start", SYSTEMD_UNIT);
116
+ return;
117
+ }
118
+ systemctlUser("kill", "--kill-whom=main", "--signal=SIGTERM", SYSTEMD_UNIT);
119
+ }
120
+ /**
121
+ * The package manager that installed the binary this update runs from, so the
122
+ * new version lands where the old one is (a bun global install is invisible to
123
+ * `npm i -g`, and the reverse).
124
+ */
125
+ function installCommand(version) {
126
+ let self = process.argv[1] ?? "";
127
+ try {
128
+ self = realpathSync(self);
129
+ }
130
+ catch {
131
+ // keep the unresolved path
132
+ }
133
+ if (self.includes("/.bun/install/global/"))
134
+ return ["bun", ["add", "-g", `claude-mux@${version}`]];
135
+ return ["npm", ["i", "-g", `claude-mux@${version}`]];
136
+ }
95
137
  function systemctlUser(...args) {
96
138
  ensureXdgRuntime();
97
139
  const r = spawnSync("systemctl", ["--user", ...args], { stdio: "inherit" });
@@ -151,33 +193,34 @@ export async function runUpdate(opts) {
151
193
  console.error(`Could not download claude-mux@${latest} from npm; the running server was left alone.`);
152
194
  process.exit(1);
153
195
  }
154
- // Stop the running prod server BEFORE `npm i -g` so the install doesn't
155
- // overwrite module files the live process is still loading lazily.
156
196
  const skipRestart = !!opts.skipRestart;
157
197
  const systemdActive = !skipRestart && isSystemdManaged();
158
198
  const nohupPid = !skipRestart && !systemdActive ? findProdPid() : null;
159
199
  if (systemdActive) {
160
- ensureUnitKillMode();
161
- console.log(`Stopping ${SYSTEMD_UNIT} (systemd)...`);
162
- systemctlUser("stop", SYSTEMD_UNIT);
200
+ ensureXdgRuntime();
201
+ ensureUnitRestartable();
202
+ if (tmuxServerInsideUnit(SYSTEMD_UNIT)) {
203
+ console.log("The tmux server runs inside claude-mux.service; restarting without stopping the unit so its panes stay.");
204
+ }
163
205
  }
164
206
  else if (nohupPid) {
207
+ // Stopped BEFORE the install so it doesn't overwrite module files the
208
+ // live process is still loading lazily. The systemd path installs first
209
+ // and restarts right after instead, because stopping that unit is what
210
+ // closes the panes.
165
211
  await stopProd(nohupPid);
166
212
  }
167
- console.log(`\nInstalling claude-mux@${latest} globally via npm...`);
168
- const install = spawnSync("npm", ["i", "-g", `claude-mux@${latest}`], {
169
- stdio: "inherit",
170
- });
213
+ const [installer, installArgs] = installCommand(latest);
214
+ console.log(`\nInstalling claude-mux@${latest} globally via ${installer}...`);
215
+ const install = spawnSync(installer, installArgs, { stdio: "inherit" });
171
216
  if (install.status !== 0) {
172
- console.error("npm install failed; starting the old server again.");
173
- if (systemdActive)
174
- systemctlUser("start", SYSTEMD_UNIT);
175
- else if (nohupPid)
217
+ console.error(`${installer} install failed; the server keeps the old version.`);
218
+ if (nohupPid)
176
219
  startProd();
177
220
  process.exit(install.status ?? 1);
178
221
  }
179
222
  console.log("\nRe-running setup to sync hooks...");
180
- // Through the binary npm just installed, not this process: the running code
223
+ // Through the binary just installed, not this process: the running code
181
224
  // is the old version, and a change to what setup writes (the hook command,
182
225
  // say) would otherwise only land on the update after the one that shipped it.
183
226
  const setup = spawnSync("claude-mux", ["setup", "--yes"], { stdio: "inherit" });
@@ -185,8 +228,8 @@ export async function runUpdate(opts) {
185
228
  await runSetup({ yes: true });
186
229
  if (systemdActive) {
187
230
  console.log("");
188
- console.log(`Starting ${SYSTEMD_UNIT} (systemd)...`);
189
- systemctlUser("start", SYSTEMD_UNIT);
231
+ console.log(`Restarting ${SYSTEMD_UNIT} (systemd)...`);
232
+ restartUnit();
190
233
  }
191
234
  else if (nohupPid) {
192
235
  console.log("");
@@ -1 +1 @@
1
- {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Where the tmux server lives decides what a restart of claude-mux takes down.
3
+ *
4
+ * tmux 3.4+ built with systemd support moves every pane into a transient scope
5
+ * of its own, and marks that scope `PartOf=` whichever unit the tmux server
6
+ * itself runs in. When claude-mux runs as `claude-mux.service` and is the one
7
+ * that starts the server (the first `new-session` after boot), the server runs
8
+ * in the service's cgroup, so every pane is `PartOf=claude-mux.service`:
9
+ * stopping the service for an update stops every pane on the machine, every
10
+ * Claude session with them, and the update too when it was typed in one.
11
+ *
12
+ * So when no server is running yet, the first session is started under a scope
13
+ * of its own (`systemd-run --user --scope`), and the panes are then part of
14
+ * that scope instead. Where systemd is absent or refuses, tmux runs as before.
15
+ */
16
+ /** Whether a tmux server is already answering. */
17
+ export declare function tmuxServerRunning(env?: NodeJS.ProcessEnv): boolean;
18
+ /** The cgroup a process runs in, or null off Linux / when it is gone. */
19
+ export declare function cgroupOf(pid: number | "self"): string | null;
20
+ /** The tmux server's pid, or null when none is running. */
21
+ export declare function tmuxServerPid(): number | null;
22
+ /**
23
+ * Whether stopping `unit` would take the tmux panes with it: the server runs
24
+ * inside that unit's cgroup.
25
+ */
26
+ export declare function tmuxServerInsideUnit(unit: string): boolean;
27
+ /**
28
+ * Run `tmux new-session …`. When this call is the one that starts the server,
29
+ * start it in a systemd scope of its own so the panes do not belong to
30
+ * whatever service called it.
31
+ */
32
+ export declare function tmuxNewSession(args: string[], env?: NodeJS.ProcessEnv): void;
33
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/tmux/server.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;GAcG;AAEH,kDAAkD;AAClD,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAE/E;AAED,yEAAyE;AACzE,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAO5D;AAED,2DAA2D;AAC3D,wBAAgB,aAAa,IAAI,MAAM,GAAG,IAAI,CAW7C;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAK1D;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,IAAI,CAezF"}
@@ -0,0 +1,75 @@
1
+ import { execFileSync, spawnSync } from "child_process";
2
+ import { readFileSync } from "fs";
3
+ /**
4
+ * Where the tmux server lives decides what a restart of claude-mux takes down.
5
+ *
6
+ * tmux 3.4+ built with systemd support moves every pane into a transient scope
7
+ * of its own, and marks that scope `PartOf=` whichever unit the tmux server
8
+ * itself runs in. When claude-mux runs as `claude-mux.service` and is the one
9
+ * that starts the server (the first `new-session` after boot), the server runs
10
+ * in the service's cgroup, so every pane is `PartOf=claude-mux.service`:
11
+ * stopping the service for an update stops every pane on the machine, every
12
+ * Claude session with them, and the update too when it was typed in one.
13
+ *
14
+ * So when no server is running yet, the first session is started under a scope
15
+ * of its own (`systemd-run --user --scope`), and the panes are then part of
16
+ * that scope instead. Where systemd is absent or refuses, tmux runs as before.
17
+ */
18
+ /** Whether a tmux server is already answering. */
19
+ export function tmuxServerRunning(env = process.env) {
20
+ return spawnSync("tmux", ["list-sessions"], { stdio: "ignore", env }).status === 0;
21
+ }
22
+ /** The cgroup a process runs in, or null off Linux / when it is gone. */
23
+ export function cgroupOf(pid) {
24
+ try {
25
+ const line = readFileSync(`/proc/${pid}/cgroup`, "utf-8").split("\n").find((l) => l.startsWith("0::"));
26
+ return line ? line.slice(3) : null;
27
+ }
28
+ catch {
29
+ return null;
30
+ }
31
+ }
32
+ /** The tmux server's pid, or null when none is running. */
33
+ export function tmuxServerPid() {
34
+ try {
35
+ const out = execFileSync("tmux", ["display-message", "-p", "#{pid}"], {
36
+ encoding: "utf-8",
37
+ stdio: ["ignore", "pipe", "ignore"],
38
+ }).trim();
39
+ const pid = Number(out);
40
+ return pid > 0 ? pid : null;
41
+ }
42
+ catch {
43
+ return null;
44
+ }
45
+ }
46
+ /**
47
+ * Whether stopping `unit` would take the tmux panes with it: the server runs
48
+ * inside that unit's cgroup.
49
+ */
50
+ export function tmuxServerInsideUnit(unit) {
51
+ const pid = tmuxServerPid();
52
+ if (!pid)
53
+ return false;
54
+ const cgroup = cgroupOf(pid);
55
+ return !!cgroup && cgroup.split("/").includes(unit);
56
+ }
57
+ /**
58
+ * Run `tmux new-session …`. When this call is the one that starts the server,
59
+ * start it in a systemd scope of its own so the panes do not belong to
60
+ * whatever service called it.
61
+ */
62
+ export function tmuxNewSession(args, env = process.env) {
63
+ if (!tmuxServerRunning(env) && process.platform === "linux") {
64
+ const scoped = spawnSync("systemd-run", ["--user", "--scope", "--quiet", "--collect", `--unit=claude-mux-tmux-${Date.now()}`, "--", "tmux", "new-session", ...args], { stdio: "ignore", env });
65
+ if (scoped.status === 0)
66
+ return;
67
+ // A tmux that failed under the scope may have started the server anyway.
68
+ if (tmuxServerRunning(env)) {
69
+ execFileSync("tmux", ["new-session", ...args], { stdio: "ignore", env });
70
+ return;
71
+ }
72
+ }
73
+ execFileSync("tmux", ["new-session", ...args], { stdio: "ignore", env });
74
+ }
75
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/tmux/server.ts"],"names":[],"mappings":"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"}
@@ -2,5 +2,5 @@
2
2
  * Central version constant for claude-watch.
3
3
  * Keep in sync with package.json version.
4
4
  */
5
- export declare const VERSION = "0.30.0";
5
+ export declare const VERSION = "0.30.1";
6
6
  //# sourceMappingURL=version.d.ts.map
@@ -2,5 +2,5 @@
2
2
  * Central version constant for claude-watch.
3
3
  * Keep in sync with package.json version.
4
4
  */
5
- export const VERSION = "0.30.0";
5
+ export const VERSION = "0.30.1";
6
6
  //# sourceMappingURL=version.js.map
@@ -0,0 +1,2 @@
1
+ import{b7 as R,S as w,e as c,g as u,s as f}from"./BNg62Zr9.js";new URL("sveltekit-internal://");function Y(t,e){return t==="/"||e==="ignore"?t:e==="never"?t.endsWith("/")?t.slice(0,-1):t:e==="always"&&!t.endsWith("/")?t+"/":t}function q(t){return t.split("%25").map(decodeURI).join("%25")}function H(t){for(const e in t)t[e]=decodeURIComponent(t[e]);return t}function K({href:t}){return t.split("#")[0]}function B(t,e,n,r=!1){const s=new URL(t);Object.defineProperty(s,"searchParams",{value:new Proxy(s.searchParams,{get(o,a){if(a==="get"||a==="getAll"||a==="has")return(g,...U)=>(n(g),o[a](g,...U));e();const l=Reflect.get(o,a);return typeof l=="function"?l.bind(o):l}}),enumerable:!0,configurable:!0});const i=["href","pathname","search","toString","toJSON"];r&&i.push("hash");for(const o of i)Object.defineProperty(s,o,{get(){return e(),t[o]},enumerable:!0,configurable:!0});return s}function O(){}function N(...t){let e=5381;for(const n of t)if(typeof n=="string"){let r=n.length;for(;r;)e=e*33^n.charCodeAt(--r)}else if(ArrayBuffer.isView(n)){const r=new Uint8Array(n.buffer,n.byteOffset,n.byteLength);let s=r.length;for(;s;)e=e*33^r[--s]}else throw new TypeError("value must be a string or TypedArray");return(e>>>0).toString(36)}new TextEncoder;function I(t){const e=atob(t),n=new Uint8Array(e.length);for(let r=0;r<e.length;r++)n[r]=e.charCodeAt(r);return n}const L=window.fetch;window.fetch=(t,e)=>((t instanceof Request?t.method:e?.method||"GET")!=="GET"&&h.delete(_(t)),L(t,e));const h=new Map;function D(t,e){const n=_(t,e),r=document.querySelector(n);if(r?.textContent){r.remove();let{body:s,...i}=JSON.parse(r.textContent);r.getAttribute("data-b64")!==null&&(s=I(s));const a=r.getAttribute("data-ttl");return a&&h.set(n,{body:s,init:i,ttl:1e3*Number(a)}),Promise.resolve(new Response(s,i))}return window.fetch(t,e)}function J(t,e,n){if(h.size>0){const r=_(t,n),s=h.get(r);if(s){if(performance.now()<s.ttl&&["default","force-cache","only-if-cached",void 0].includes(n?.cache))return new Response(s.body,s.init);h.delete(r)}}return window.fetch(e,n)}function _(t,e){let r=`script[data-sveltekit-fetched][data-url=${JSON.stringify(t instanceof Request?t.url:t)}]`;if(e?.headers||e?.body){const s=[];e.headers&&s.push([...new Headers(e.headers)].join(",")),e.body&&(typeof e.body=="string"||ArrayBuffer.isView(e.body))&&s.push(e.body),r+=`[data-hash="${N(...s)}"]`}return r}const x=globalThis.__sveltekit_1hl18yl?.base??"",P=globalThis.__sveltekit_1hl18yl?.assets??x??"",$="1791474305337",W="sveltekit:snapshot",X="sveltekit:scroll",z="sveltekit:states",M="sveltekit:pageurl",F="sveltekit:history",Q="sveltekit:navigation",m={tap:1,hover:2,viewport:3,eager:4,off:-1,false:-1},A=location.origin;function Z(t){if(t instanceof URL)return t;let e=document.baseURI;if(!e){const n=document.getElementsByTagName("base");e=n.length?n[0].href:document.URL}return new URL(t,e)}function ee(){return{x:pageXOffset,y:pageYOffset}}function d(t,e){return t.getAttribute(`data-sveltekit-${e}`)}const v={...m,"":m.hover};function k(t){let e=t.assignedSlot??t.parentNode;return e?.nodeType===11&&(e=e.host),e}function te(t,e){for(;t&&t!==e;){if(t.nodeName.toUpperCase()==="A"&&t.hasAttribute("href"))return t;t=k(t)}}function ne(t,e,n){let r;try{if(r=new URL(t instanceof SVGAElement?t.href.baseVal:t.href,document.baseURI),n&&r.hash.match(/^#[^/]/)){const a=location.hash.split("#")[1]||"/";r.hash=`#${a}${r.hash}`}}catch{}const s=t instanceof SVGAElement?t.target.baseVal:t.target,i=!r||!!s||C(r,e,n)||(t.getAttribute("rel")||"").split(/\s+/).includes("external"),o=r?.origin===A&&t.hasAttribute("download");return{url:r,external:i,target:s,download:o}}function re(t){let e=null,n=null,r=null,s=null,i=null,o=null,a=t;for(;a&&a!==document.documentElement;)r===null&&(r=d(a,"preload-code")),s===null&&(s=d(a,"preload-data")),e===null&&(e=d(a,"keepfocus")),n===null&&(n=d(a,"noscroll")),i===null&&(i=d(a,"reload")),o===null&&(o=d(a,"replacestate")),a=k(a);function l(g){switch(g){case"":case"true":return!0;case"off":case"false":return!1;default:return}}return{preload_code:v[r??"off"],preload_data:v[s??"off"],keepfocus:l(e),noscroll:l(n),reload:l(i),replace_state:l(o)}}function se(t){const e=R(t);let n=!0;function r(){n=!0,e.update(o=>o)}function s(o){n=!1,e.set(o)}function i(o){let a;return e.subscribe(l=>{(a===void 0||n&&l!==a)&&o(a=l)})}return{notify:r,set:s,subscribe:i}}const E={v:O};function ae(){const{set:t,subscribe:e}=R(!1);let n;async function r(){clearTimeout(n);try{const s=await fetch(`${P}/_app/version.json`,{headers:{pragma:"no-cache","cache-control":"no-cache"}});if(!s.ok)return!1;const o=(await s.json()).version!==$;return o&&(t(!0),E.v(),clearTimeout(n)),o}catch{return!1}}return{subscribe:e,check:r}}function C(t,e,n){return t.origin!==A||!t.pathname.startsWith(e)?!0:n?t.pathname!==location.pathname:!1}function oe(t){}const T=new Set(["load","prerender","csr","ssr","trailingSlash","config"]);[...T];const V=new Set([...T]);[...V];let b,y,p;const j=w.toString().includes("$$")||/function \w+\(\) \{\}/.test(w.toString()),S="a:";j?(b={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL(S)},y={current:null},p={current:!1}):(b=new class{#e=c({});get data(){return u(this.#e)}set data(e){f(this.#e,e)}#t=c(null);get form(){return u(this.#t)}set form(e){f(this.#t,e)}#n=c(null);get error(){return u(this.#n)}set error(e){f(this.#n,e)}#r=c({});get params(){return u(this.#r)}set params(e){f(this.#r,e)}#s=c({id:null});get route(){return u(this.#s)}set route(e){f(this.#s,e)}#a=c({});get state(){return u(this.#a)}set state(e){f(this.#a,e)}#o=c(-1);get status(){return u(this.#o)}set status(e){f(this.#o,e)}#i=c(new URL(S));get url(){return u(this.#i)}set url(e){f(this.#i,e)}},y=new class{#e=c(null);get current(){return u(this.#e)}set current(e){f(this.#e,e)}},p=new class{#e=c(!1);get current(){return u(this.#e)}set current(e){f(this.#e,e)}},E.v=()=>p.current=!0);function ue(t){Object.assign(b,t)}export{F as H,Q as N,M as P,z as S,y as a,x as b,ae as c,H as d,q as e,Y as f,J as g,D as h,C as i,te as j,ne as k,re as l,B as m,O as n,A as o,b as p,K as q,Z as r,ee as s,m as t,ue as u,X as v,W as w,se as x,oe as y};
2
+ //# sourceMappingURL=B9ridFLz.js.map