claude-mux 0.30.0 → 0.30.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.
- package/CLAUDE.md +9 -1
- package/dist/commands/new-session.d.ts.map +1 -1
- package/dist/commands/new-session.js +2 -2
- package/dist/commands/new-session.js.map +1 -1
- package/dist/commands/service.d.ts.map +1 -1
- package/dist/commands/service.js +5 -4
- package/dist/commands/service.js.map +1 -1
- package/dist/commands/update.d.ts +7 -0
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +68 -25
- package/dist/commands/update.js.map +1 -1
- package/dist/tmux/server.d.ts +33 -0
- package/dist/tmux/server.d.ts.map +1 -0
- package/dist/tmux/server.js +75 -0
- package/dist/tmux/server.js.map +1 -0
- package/dist/utils/version.d.ts +1 -1
- package/dist/utils/version.js +1 -1
- package/dist/web/client/_app/immutable/chunks/{VmEtOaGT.js → BR0j6UP_.js} +2 -2
- package/{web/.svelte-kit/output/client/_app/immutable/chunks/VmEtOaGT.js.map → dist/web/client/_app/immutable/chunks/BR0j6UP_.js.map} +1 -1
- package/{web/.svelte-kit/output/client/_app/immutable/chunks/CwqQp6PF.js → dist/web/client/_app/immutable/chunks/BRwgrbZi.js} +2 -2
- package/{web/.svelte-kit/output/client/_app/immutable/chunks/CwqQp6PF.js.map → dist/web/client/_app/immutable/chunks/BRwgrbZi.js.map} +1 -1
- package/dist/web/client/_app/immutable/chunks/{BddLlazN.js → CJ5X49p2.js} +2 -2
- package/{web/.svelte-kit/output/client/_app/immutable/chunks/BddLlazN.js.map → dist/web/client/_app/immutable/chunks/CJ5X49p2.js.map} +1 -1
- package/dist/web/client/_app/immutable/chunks/Cb0yiQIh.js +3 -0
- package/dist/web/client/_app/immutable/chunks/{B2jaxV_u.js.map → Cb0yiQIh.js.map} +1 -1
- package/{web/.svelte-kit/output/client/_app/immutable/chunks/CLWK-3Sm.js → dist/web/client/_app/immutable/chunks/CmDdyjOR.js} +2 -2
- package/dist/web/client/_app/immutable/chunks/{CLWK-3Sm.js.map → CmDdyjOR.js.map} +1 -1
- package/dist/web/client/_app/immutable/chunks/{19820tOo.js → DiCsJZkB.js} +2 -2
- package/{web/.svelte-kit/output/client/_app/immutable/chunks/19820tOo.js.map → dist/web/client/_app/immutable/chunks/DiCsJZkB.js.map} +1 -1
- package/dist/web/client/_app/immutable/chunks/Dmt0dCmj.js +2 -0
- package/{web/.svelte-kit/output/client/_app/immutable/chunks/C_0O-5sL.js.map → dist/web/client/_app/immutable/chunks/Dmt0dCmj.js.map} +1 -1
- package/{web/.svelte-kit/output/client/_app/immutable/chunks/B0WiEFFI.js → dist/web/client/_app/immutable/chunks/juU6kBhv.js} +2 -2
- package/{web/.svelte-kit/output/client/_app/immutable/chunks/B0WiEFFI.js.map → dist/web/client/_app/immutable/chunks/juU6kBhv.js.map} +1 -1
- package/dist/web/client/_app/immutable/entry/{app.DLdHM347.js → app.BNsXYIeZ.js} +3 -3
- package/dist/web/client/_app/immutable/entry/{app.DLdHM347.js.map → app.BNsXYIeZ.js.map} +1 -1
- package/dist/web/client/_app/immutable/entry/start.BAAC0OQy.js +2 -0
- package/dist/web/client/_app/immutable/entry/start.BAAC0OQy.js.map +1 -0
- package/{web/.svelte-kit/output/client/_app/immutable/nodes/0.D339GFgp.js → dist/web/client/_app/immutable/nodes/0.Cga09Vlt.js} +2 -2
- package/dist/web/client/_app/immutable/nodes/{0.D339GFgp.js.map → 0.Cga09Vlt.js.map} +1 -1
- package/dist/web/client/_app/immutable/nodes/{1.BRq2Is_d.js → 1.C5UTjGXy.js} +2 -2
- package/dist/web/client/_app/immutable/nodes/{1.BRq2Is_d.js.map → 1.C5UTjGXy.js.map} +1 -1
- package/dist/web/client/_app/immutable/nodes/{2.qwnQbeHe.js → 2.C76yPG3X.js} +2 -2
- package/dist/web/client/_app/immutable/nodes/{2.qwnQbeHe.js.map → 2.C76yPG3X.js.map} +1 -1
- package/dist/web/client/_app/immutable/nodes/{3.BEc31Ipx.js → 3.Tbj29aAW.js} +2 -2
- package/{web/.svelte-kit/output/client/_app/immutable/nodes/3.BEc31Ipx.js.map → dist/web/client/_app/immutable/nodes/3.Tbj29aAW.js.map} +1 -1
- package/dist/web/client/_app/immutable/nodes/{4.CoOwQFxg.js → 4.D0z9Wo_G.js} +2 -2
- package/{web/.svelte-kit/output/client/_app/immutable/nodes/4.CoOwQFxg.js.map → dist/web/client/_app/immutable/nodes/4.D0z9Wo_G.js.map} +1 -1
- package/dist/web/client/_app/version.json +1 -1
- package/dist/web/server/chunks/{0-DHNN1AAT.js → 0-BZ0-GFAV.js} +10 -10
- package/dist/web/server/chunks/{0-DHNN1AAT.js.map → 0-BZ0-GFAV.js.map} +1 -1
- package/dist/web/server/chunks/{1-CbKniSlT.js → 1-DoI2jsEL.js} +3 -3
- package/dist/web/server/chunks/{1-CbKniSlT.js.map → 1-DoI2jsEL.js.map} +1 -1
- package/dist/web/server/chunks/{2-BdIitBN6.js → 2-6BGBaYuT.js} +8 -8
- package/dist/web/server/chunks/{2-BdIitBN6.js.map → 2-6BGBaYuT.js.map} +1 -1
- package/dist/web/server/chunks/{3-PW6mbTzY.js → 3-B9fgRoyO.js} +9 -9
- package/dist/web/server/chunks/{3-PW6mbTzY.js.map → 3-B9fgRoyO.js.map} +1 -1
- package/dist/web/server/chunks/{4-Cn_kJEG9.js → 4-CIa0l25T.js} +7 -7
- package/dist/web/server/chunks/{4-Cn_kJEG9.js.map → 4-CIa0l25T.js.map} +1 -1
- package/dist/web/server/chunks/{_layout.svelte-DuWAsRde.js → _layout.svelte-C2cdd9CG.js} +2 -2
- package/dist/web/server/chunks/{_layout.svelte-DuWAsRde.js.map → _layout.svelte-C2cdd9CG.js.map} +1 -1
- package/dist/web/server/chunks/{_page.svelte-BHyydDh6.js → _page.svelte-DZS6k2j-.js} +2 -2
- package/dist/web/server/chunks/{_page.svelte-BHyydDh6.js.map → _page.svelte-DZS6k2j-.js.map} +1 -1
- package/dist/web/server/chunks/{_server.ts-D5W_RgWh.js → _server.ts-rwgLlQ3t.js} +39 -8
- package/dist/web/server/chunks/_server.ts-rwgLlQ3t.js.map +1 -0
- package/dist/web/server/chunks/{panes-D3Xnw0Yz.js → panes-BQe6edic.js} +1713 -3
- package/dist/web/server/chunks/panes-BQe6edic.js.map +1 -0
- package/dist/web/server/index.js +13 -3
- package/dist/web/server/index.js.map +1 -1
- package/dist/web/server/manifest.js +12 -12
- package/dist/web/server/manifest.js.map +1 -1
- package/package.json +2 -2
- package/scripts/check-server-externals.ts +56 -0
- package/src/commands/new-session.ts +2 -2
- package/src/commands/service.ts +5 -4
- package/src/commands/update.ts +67 -26
- package/src/tmux/server.ts +80 -0
- package/src/utils/version.ts +1 -1
- package/tests/commands/update.test.ts +20 -1
- package/web/.svelte-kit/adapter-bun/chunks/internal2.js +1 -1
- package/web/.svelte-kit/adapter-bun/chunks/internal2.js.map +1 -1
- package/web/.svelte-kit/adapter-bun/chunks/utils.js +15 -1
- package/web/.svelte-kit/adapter-bun/chunks/utils.js.map +1 -1
- package/web/.svelte-kit/adapter-bun/entries/endpoints/api/projects/new-session/_server.ts.js +21 -7
- package/web/.svelte-kit/adapter-bun/entries/endpoints/api/projects/new-session/_server.ts.js.map +1 -1
- package/web/.svelte-kit/adapter-bun/manifest-full.js +1 -1
- package/web/.svelte-kit/adapter-bun/manifest.js +1 -1
- package/web/.svelte-kit/adapter-bun/nodes/0.js +1 -1
- package/web/.svelte-kit/adapter-bun/nodes/1.js +1 -1
- package/web/.svelte-kit/adapter-bun/nodes/2.js +1 -1
- package/web/.svelte-kit/adapter-bun/nodes/3.js +1 -1
- package/web/.svelte-kit/adapter-bun/nodes/4.js +1 -1
- package/web/.svelte-kit/generated/server/internal.js +1 -1
- package/web/.svelte-kit/output/client/.vite/manifest.json +103 -103
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{VmEtOaGT.js → BR0j6UP_.js} +2 -2
- package/{dist/web/client/_app/immutable/chunks/VmEtOaGT.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/BR0j6UP_.js.map} +1 -1
- package/{dist/web/client/_app/immutable/chunks/CwqQp6PF.js → web/.svelte-kit/output/client/_app/immutable/chunks/BRwgrbZi.js} +2 -2
- package/{dist/web/client/_app/immutable/chunks/CwqQp6PF.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/BRwgrbZi.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{BddLlazN.js → CJ5X49p2.js} +2 -2
- package/{dist/web/client/_app/immutable/chunks/BddLlazN.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/CJ5X49p2.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/Cb0yiQIh.js +3 -0
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{B2jaxV_u.js.map → Cb0yiQIh.js.map} +1 -1
- package/{dist/web/client/_app/immutable/chunks/CLWK-3Sm.js → web/.svelte-kit/output/client/_app/immutable/chunks/CmDdyjOR.js} +2 -2
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{CLWK-3Sm.js.map → CmDdyjOR.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{19820tOo.js → DiCsJZkB.js} +2 -2
- package/{dist/web/client/_app/immutable/chunks/19820tOo.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/DiCsJZkB.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/Dmt0dCmj.js +2 -0
- package/{dist/web/client/_app/immutable/chunks/C_0O-5sL.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/Dmt0dCmj.js.map} +1 -1
- package/{dist/web/client/_app/immutable/chunks/B0WiEFFI.js → web/.svelte-kit/output/client/_app/immutable/chunks/juU6kBhv.js} +2 -2
- package/{dist/web/client/_app/immutable/chunks/B0WiEFFI.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/juU6kBhv.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/entry/{app.DLdHM347.js → app.BNsXYIeZ.js} +3 -3
- package/web/.svelte-kit/output/client/_app/immutable/entry/{app.DLdHM347.js.map → app.BNsXYIeZ.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/entry/start.BAAC0OQy.js +2 -0
- package/web/.svelte-kit/output/client/_app/immutable/entry/start.BAAC0OQy.js.map +1 -0
- package/{dist/web/client/_app/immutable/nodes/0.D339GFgp.js → web/.svelte-kit/output/client/_app/immutable/nodes/0.Cga09Vlt.js} +2 -2
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{0.D339GFgp.js.map → 0.Cga09Vlt.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{1.BRq2Is_d.js → 1.C5UTjGXy.js} +2 -2
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{1.BRq2Is_d.js.map → 1.C5UTjGXy.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{2.qwnQbeHe.js → 2.C76yPG3X.js} +2 -2
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{2.qwnQbeHe.js.map → 2.C76yPG3X.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{3.BEc31Ipx.js → 3.Tbj29aAW.js} +2 -2
- package/{dist/web/client/_app/immutable/nodes/3.BEc31Ipx.js.map → web/.svelte-kit/output/client/_app/immutable/nodes/3.Tbj29aAW.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{4.CoOwQFxg.js → 4.D0z9Wo_G.js} +2 -2
- package/{dist/web/client/_app/immutable/nodes/4.CoOwQFxg.js.map → web/.svelte-kit/output/client/_app/immutable/nodes/4.D0z9Wo_G.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/version.json +1 -1
- package/web/.svelte-kit/output/server/chunks/internal2.js +1 -1
- package/web/.svelte-kit/output/server/chunks/internal2.js.map +1 -1
- package/web/.svelte-kit/output/server/chunks/utils.js +15 -1
- package/web/.svelte-kit/output/server/chunks/utils.js.map +1 -1
- package/web/.svelte-kit/output/server/entries/endpoints/api/projects/new-session/_server.ts.js +21 -7
- package/web/.svelte-kit/output/server/entries/endpoints/api/projects/new-session/_server.ts.js.map +1 -1
- package/web/.svelte-kit/output/server/manifest-full.js +1 -1
- package/web/.svelte-kit/output/server/manifest.js +1 -1
- package/web/.svelte-kit/output/server/nodes/0.js +1 -1
- package/web/.svelte-kit/output/server/nodes/1.js +1 -1
- package/web/.svelte-kit/output/server/nodes/2.js +1 -1
- package/web/.svelte-kit/output/server/nodes/3.js +1 -1
- package/web/.svelte-kit/output/server/nodes/4.js +1 -1
- package/web/package.json +4 -6
- package/web/src/routes/api/projects/new-session/+server.ts +6 -6
- package/dist/web/client/_app/immutable/chunks/B2jaxV_u.js +0 -3
- package/dist/web/client/_app/immutable/chunks/C_0O-5sL.js +0 -2
- package/dist/web/client/_app/immutable/entry/start.DIhipajB.js +0 -2
- package/dist/web/client/_app/immutable/entry/start.DIhipajB.js.map +0 -1
- package/dist/web/server/chunks/_server.ts-D5W_RgWh.js.map +0 -1
- package/dist/web/server/chunks/panes-D3Xnw0Yz.js.map +0 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/B2jaxV_u.js +0 -3
- package/web/.svelte-kit/output/client/_app/immutable/chunks/C_0O-5sL.js +0 -2
- package/web/.svelte-kit/output/client/_app/immutable/entry/start.DIhipajB.js +0 -2
- package/web/.svelte-kit/output/client/_app/immutable/entry/start.DIhipajB.js.map +0 -1
package/CLAUDE.md
CHANGED
|
@@ -51,6 +51,12 @@ The workflow builds CLI + web, publishes to npm via **OIDC trusted publishing**
|
|
|
51
51
|
|
|
52
52
|
After release, other machines update with: `claude-mux update`.
|
|
53
53
|
|
|
54
|
+
The published package installs only the root `dependencies`, so web packages
|
|
55
|
+
belong in web `devDependencies`, where Vite bundles them into the server; a web
|
|
56
|
+
`dependencies` entry stays a bare import and fails on every host but this one
|
|
57
|
+
(0.30.0 served `/` as a 500 that way, over `marked`). `prepublishOnly` runs
|
|
58
|
+
`scripts/check-server-externals.ts` after the build to catch it.
|
|
59
|
+
|
|
54
60
|
## Service management on remote hosts
|
|
55
61
|
|
|
56
62
|
For machines that should run claude-mux as a long-lived service (e.g. `engage`):
|
|
@@ -61,7 +67,9 @@ sudo loginctl enable-linger $USER # one-time: survive logout, start on bo
|
|
|
61
67
|
journalctl --user -u claude-mux -f # logs
|
|
62
68
|
```
|
|
63
69
|
|
|
64
|
-
`update` auto-detects how the server is running and restarts it accordingly
|
|
70
|
+
`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.
|
|
71
|
+
|
|
72
|
+
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
73
|
|
|
66
74
|
## Architecture
|
|
67
75
|
|
|
@@ -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;
|
|
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
|
-
|
|
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":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;
|
|
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;
|
|
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"}
|
package/dist/commands/service.js
CHANGED
|
@@ -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
|
-
|
|
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
|
|
70
|
-
#
|
|
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":"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
|
|
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;
|
|
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"}
|
package/dist/commands/update.js
CHANGED
|
@@ -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
|
-
*
|
|
74
|
-
* the
|
|
75
|
-
*
|
|
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
|
|
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
|
-
|
|
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
|
|
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-who=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
|
-
|
|
161
|
-
|
|
162
|
-
|
|
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
|
-
|
|
168
|
-
|
|
169
|
-
|
|
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(
|
|
173
|
-
if (
|
|
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
|
|
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(`
|
|
189
|
-
|
|
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":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;
|
|
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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"}
|
package/dist/utils/version.d.ts
CHANGED
package/dist/utils/version.js
CHANGED