botmux 2.9.1 → 2.9.3
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/README.en.md +140 -76
- package/README.md +134 -75
- package/dist/adapters/backend/pty-backend.d.ts +6 -0
- package/dist/adapters/backend/pty-backend.d.ts.map +1 -1
- package/dist/adapters/backend/pty-backend.js +10 -0
- package/dist/adapters/backend/pty-backend.js.map +1 -1
- package/dist/adapters/backend/session-backend-selector.d.ts +11 -0
- package/dist/adapters/backend/session-backend-selector.d.ts.map +1 -0
- package/dist/adapters/backend/session-backend-selector.js +26 -0
- package/dist/adapters/backend/session-backend-selector.js.map +1 -0
- package/dist/adapters/backend/tmux-backend.d.ts +80 -3
- package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
- package/dist/adapters/backend/tmux-backend.js +301 -49
- package/dist/adapters/backend/tmux-backend.js.map +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.d.ts +100 -0
- package/dist/adapters/backend/tmux-pipe-backend.d.ts.map +1 -0
- package/dist/adapters/backend/tmux-pipe-backend.js +473 -0
- package/dist/adapters/backend/tmux-pipe-backend.js.map +1 -0
- package/dist/adapters/cli/aiden.d.ts.map +1 -1
- package/dist/adapters/cli/aiden.js +5 -0
- package/dist/adapters/cli/aiden.js.map +1 -1
- package/dist/adapters/cli/claude-code.d.ts +40 -1
- package/dist/adapters/cli/claude-code.d.ts.map +1 -1
- package/dist/adapters/cli/claude-code.js +470 -49
- package/dist/adapters/cli/claude-code.js.map +1 -1
- package/dist/adapters/cli/coco.d.ts.map +1 -1
- package/dist/adapters/cli/coco.js +191 -9
- package/dist/adapters/cli/coco.js.map +1 -1
- package/dist/adapters/cli/codex.d.ts.map +1 -1
- package/dist/adapters/cli/codex.js +94 -17
- package/dist/adapters/cli/codex.js.map +1 -1
- package/dist/adapters/cli/shared-hints.d.ts +2 -2
- package/dist/adapters/cli/shared-hints.d.ts.map +1 -1
- package/dist/adapters/cli/shared-hints.js +7 -5
- package/dist/adapters/cli/shared-hints.js.map +1 -1
- package/dist/adapters/cli/types.d.ts +38 -1
- package/dist/adapters/cli/types.d.ts.map +1 -1
- package/dist/autostart.d.ts +14 -0
- package/dist/autostart.d.ts.map +1 -0
- package/dist/autostart.js +357 -0
- package/dist/autostart.js.map +1 -0
- package/dist/bot-registry.d.ts +29 -3
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +91 -12
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli/arg-utils.d.ts +11 -0
- package/dist/cli/arg-utils.d.ts.map +1 -0
- package/dist/cli/arg-utils.js +25 -0
- package/dist/cli/arg-utils.js.map +1 -0
- package/dist/cli/create-group-resolver.d.ts +32 -0
- package/dist/cli/create-group-resolver.d.ts.map +1 -0
- package/dist/cli/create-group-resolver.js +70 -0
- package/dist/cli/create-group-resolver.js.map +1 -0
- package/dist/cli/quoted-render.d.ts +30 -0
- package/dist/cli/quoted-render.d.ts.map +1 -0
- package/dist/cli/quoted-render.js +29 -0
- package/dist/cli/quoted-render.js.map +1 -0
- package/dist/cli.js +916 -272
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +6 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +18 -8
- package/dist/config.js.map +1 -1
- package/dist/core/command-handler.d.ts +43 -0
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +167 -64
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/dashboard-events.d.ts +57 -0
- package/dist/core/dashboard-events.d.ts.map +1 -0
- package/dist/core/dashboard-events.js +23 -0
- package/dist/core/dashboard-events.js.map +1 -0
- package/dist/core/dashboard-ipc-server.d.ts +43 -0
- package/dist/core/dashboard-ipc-server.d.ts.map +1 -0
- package/dist/core/dashboard-ipc-server.js +481 -0
- package/dist/core/dashboard-ipc-server.js.map +1 -0
- package/dist/core/dashboard-locate.d.ts +20 -0
- package/dist/core/dashboard-locate.d.ts.map +1 -0
- package/dist/core/dashboard-locate.js +26 -0
- package/dist/core/dashboard-locate.js.map +1 -0
- package/dist/core/dashboard-rows.d.ts +31 -0
- package/dist/core/dashboard-rows.d.ts.map +1 -0
- package/dist/core/dashboard-rows.js +65 -0
- package/dist/core/dashboard-rows.js.map +1 -0
- package/dist/core/inherit-peer.d.ts +14 -0
- package/dist/core/inherit-peer.d.ts.map +1 -0
- package/dist/core/inherit-peer.js +32 -0
- package/dist/core/inherit-peer.js.map +1 -0
- package/dist/core/scheduler.d.ts +24 -0
- package/dist/core/scheduler.d.ts.map +1 -1
- package/dist/core/scheduler.js +93 -2
- package/dist/core/scheduler.js.map +1 -1
- package/dist/core/session-activity.d.ts +3 -0
- package/dist/core/session-activity.d.ts.map +1 -0
- package/dist/core/session-activity.js +20 -0
- package/dist/core/session-activity.js.map +1 -0
- package/dist/core/session-discovery.d.ts +39 -0
- package/dist/core/session-discovery.d.ts.map +1 -1
- package/dist/core/session-discovery.js +114 -21
- package/dist/core/session-discovery.js.map +1 -1
- package/dist/core/session-manager.d.ts +72 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +396 -106
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/types.d.ts +27 -2
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +14 -3
- package/dist/core/types.js.map +1 -1
- package/dist/core/worker-pool.d.ts +72 -3
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +459 -38
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +645 -314
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/aggregator.d.ts +41 -0
- package/dist/dashboard/aggregator.d.ts.map +1 -0
- package/dist/dashboard/aggregator.js +125 -0
- package/dist/dashboard/aggregator.js.map +1 -0
- package/dist/dashboard/auth.d.ts +23 -0
- package/dist/dashboard/auth.d.ts.map +1 -0
- package/dist/dashboard/auth.js +66 -0
- package/dist/dashboard/auth.js.map +1 -0
- package/dist/dashboard/operator-selector.d.ts +20 -0
- package/dist/dashboard/operator-selector.d.ts.map +1 -0
- package/dist/dashboard/operator-selector.js +39 -0
- package/dist/dashboard/operator-selector.js.map +1 -0
- package/dist/dashboard/registry.d.ts +35 -0
- package/dist/dashboard/registry.d.ts.map +1 -0
- package/dist/dashboard/registry.js +74 -0
- package/dist/dashboard/registry.js.map +1 -0
- package/dist/dashboard/web/app.d.ts +2 -0
- package/dist/dashboard/web/app.d.ts.map +1 -0
- package/dist/dashboard/web/app.js +45 -0
- package/dist/dashboard/web/app.js.map +1 -0
- package/dist/dashboard/web/bot-defaults.d.ts +2 -0
- package/dist/dashboard/web/bot-defaults.d.ts.map +1 -0
- package/dist/dashboard/web/bot-defaults.js +201 -0
- package/dist/dashboard/web/bot-defaults.js.map +1 -0
- package/dist/dashboard/web/groups.d.ts +16 -0
- package/dist/dashboard/web/groups.d.ts.map +1 -0
- package/dist/dashboard/web/groups.js +584 -0
- package/dist/dashboard/web/groups.js.map +1 -0
- package/dist/dashboard/web/schedules.d.ts +2 -0
- package/dist/dashboard/web/schedules.d.ts.map +1 -0
- package/dist/dashboard/web/schedules.js +105 -0
- package/dist/dashboard/web/schedules.js.map +1 -0
- package/dist/dashboard/web/sessions.d.ts +2 -0
- package/dist/dashboard/web/sessions.d.ts.map +1 -0
- package/dist/dashboard/web/sessions.js +374 -0
- package/dist/dashboard/web/sessions.js.map +1 -0
- package/dist/dashboard/web/store.d.ts +23 -0
- package/dist/dashboard/web/store.d.ts.map +1 -0
- package/dist/dashboard/web/store.js +82 -0
- package/dist/dashboard/web/store.js.map +1 -0
- package/dist/dashboard-web/app.js +263 -0
- package/dist/dashboard-web/index.html +23 -0
- package/dist/dashboard-web/style.css +93 -0
- package/dist/dashboard.d.ts +2 -0
- package/dist/dashboard.d.ts.map +1 -0
- package/dist/dashboard.js +639 -0
- package/dist/dashboard.js.map +1 -0
- package/dist/im/lark/card-builder.d.ts +18 -1
- package/dist/im/lark/card-builder.d.ts.map +1 -1
- package/dist/im/lark/card-builder.js +70 -9
- package/dist/im/lark/card-builder.js.map +1 -1
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +123 -109
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/client.d.ts +35 -0
- package/dist/im/lark/client.d.ts.map +1 -1
- package/dist/im/lark/client.js +114 -11
- package/dist/im/lark/client.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts +88 -6
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +398 -62
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/im/lark/forwarded-renderer.d.ts +23 -0
- package/dist/im/lark/forwarded-renderer.d.ts.map +1 -0
- package/dist/im/lark/forwarded-renderer.js +105 -0
- package/dist/im/lark/forwarded-renderer.js.map +1 -0
- package/dist/im/lark/md-card.d.ts +73 -0
- package/dist/im/lark/md-card.d.ts.map +1 -0
- package/dist/im/lark/md-card.js +332 -0
- package/dist/im/lark/md-card.js.map +1 -0
- package/dist/im/lark/merge-forward.d.ts +32 -0
- package/dist/im/lark/merge-forward.d.ts.map +1 -0
- package/dist/im/lark/merge-forward.js +110 -0
- package/dist/im/lark/merge-forward.js.map +1 -0
- package/dist/im/lark/message-parser.d.ts +9 -3
- package/dist/im/lark/message-parser.d.ts.map +1 -1
- package/dist/im/lark/message-parser.js +48 -13
- package/dist/im/lark/message-parser.js.map +1 -1
- package/dist/im/lark/quote-hint.d.ts +18 -0
- package/dist/im/lark/quote-hint.d.ts.map +1 -0
- package/dist/im/lark/quote-hint.js +23 -0
- package/dist/im/lark/quote-hint.js.map +1 -0
- package/dist/services/bridge-fallback-gate.d.ts +42 -0
- package/dist/services/bridge-fallback-gate.d.ts.map +1 -0
- package/dist/services/bridge-fallback-gate.js +12 -0
- package/dist/services/bridge-fallback-gate.js.map +1 -0
- package/dist/services/bridge-rotation-policy.d.ts +139 -0
- package/dist/services/bridge-rotation-policy.d.ts.map +1 -0
- package/dist/services/bridge-rotation-policy.js +125 -0
- package/dist/services/bridge-rotation-policy.js.map +1 -0
- package/dist/services/bridge-turn-queue.d.ts +154 -0
- package/dist/services/bridge-turn-queue.d.ts.map +1 -0
- package/dist/services/bridge-turn-queue.js +316 -0
- package/dist/services/bridge-turn-queue.js.map +1 -0
- package/dist/services/chat-first-seen-store.d.ts +27 -0
- package/dist/services/chat-first-seen-store.d.ts.map +1 -0
- package/dist/services/chat-first-seen-store.js +114 -0
- package/dist/services/chat-first-seen-store.js.map +1 -0
- package/dist/services/claude-transcript.d.ts +268 -0
- package/dist/services/claude-transcript.d.ts.map +1 -0
- package/dist/services/claude-transcript.js +798 -0
- package/dist/services/claude-transcript.js.map +1 -0
- package/dist/services/coco-transcript.d.ts +35 -0
- package/dist/services/coco-transcript.d.ts.map +1 -0
- package/dist/services/coco-transcript.js +192 -0
- package/dist/services/coco-transcript.js.map +1 -0
- package/dist/services/codex-bridge-queue.d.ts +56 -0
- package/dist/services/codex-bridge-queue.d.ts.map +1 -0
- package/dist/services/codex-bridge-queue.js +150 -0
- package/dist/services/codex-bridge-queue.js.map +1 -0
- package/dist/services/codex-transcript.d.ts +84 -0
- package/dist/services/codex-transcript.d.ts.map +1 -0
- package/dist/services/codex-transcript.js +298 -0
- package/dist/services/codex-transcript.js.map +1 -0
- package/dist/services/group-creator.d.ts +23 -0
- package/dist/services/group-creator.d.ts.map +1 -0
- package/dist/services/group-creator.js +75 -0
- package/dist/services/group-creator.js.map +1 -0
- package/dist/services/groups-store.d.ts +98 -0
- package/dist/services/groups-store.d.ts.map +1 -0
- package/dist/services/groups-store.js +213 -0
- package/dist/services/groups-store.js.map +1 -0
- package/dist/services/oncall-store.d.ts +80 -8
- package/dist/services/oncall-store.d.ts.map +1 -1
- package/dist/services/oncall-store.js +265 -55
- package/dist/services/oncall-store.js.map +1 -1
- package/dist/services/project-scanner.d.ts +1 -2
- package/dist/services/project-scanner.d.ts.map +1 -1
- package/dist/services/project-scanner.js +118 -68
- package/dist/services/project-scanner.js.map +1 -1
- package/dist/services/schedule-store.d.ts +5 -0
- package/dist/services/schedule-store.d.ts.map +1 -1
- package/dist/services/schedule-store.js +77 -1
- package/dist/services/schedule-store.js.map +1 -1
- package/dist/services/session-store.d.ts +22 -0
- package/dist/services/session-store.d.ts.map +1 -1
- package/dist/services/session-store.js +62 -4
- package/dist/services/session-store.js.map +1 -1
- package/dist/setup/bots-store.d.ts +3 -0
- package/dist/setup/bots-store.d.ts.map +1 -0
- package/dist/setup/bots-store.js +24 -0
- package/dist/setup/bots-store.js.map +1 -0
- package/dist/setup/detect-platform.d.ts +14 -0
- package/dist/setup/detect-platform.d.ts.map +1 -0
- package/dist/setup/detect-platform.js +139 -0
- package/dist/setup/detect-platform.js.map +1 -0
- package/dist/setup/ensure-fonts.d.ts +13 -0
- package/dist/setup/ensure-fonts.d.ts.map +1 -0
- package/dist/setup/ensure-fonts.js +225 -0
- package/dist/setup/ensure-fonts.js.map +1 -0
- package/dist/setup/ensure-tmux.d.ts +60 -0
- package/dist/setup/ensure-tmux.d.ts.map +1 -0
- package/dist/setup/ensure-tmux.js +236 -0
- package/dist/setup/ensure-tmux.js.map +1 -0
- package/dist/setup/index.d.ts +9 -0
- package/dist/setup/index.d.ts.map +1 -0
- package/dist/setup/index.js +46 -0
- package/dist/setup/index.js.map +1 -0
- package/dist/setup/lark-scopes.json +301 -0
- package/dist/setup/register-app.d.ts +52 -0
- package/dist/setup/register-app.d.ts.map +1 -0
- package/dist/setup/register-app.js +91 -0
- package/dist/setup/register-app.js.map +1 -0
- package/dist/setup/verify-permissions.d.ts +115 -0
- package/dist/setup/verify-permissions.d.ts.map +1 -0
- package/dist/setup/verify-permissions.js +207 -0
- package/dist/setup/verify-permissions.js.map +1 -0
- package/dist/skills/definitions.d.ts +4 -0
- package/dist/skills/definitions.d.ts.map +1 -1
- package/dist/skills/definitions.js +133 -19
- package/dist/skills/definitions.js.map +1 -1
- package/dist/skills/installer.d.ts +3 -1
- package/dist/skills/installer.d.ts.map +1 -1
- package/dist/skills/installer.js +18 -3
- package/dist/skills/installer.js.map +1 -1
- package/dist/types.d.ts +44 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/bot-routing.d.ts +6 -0
- package/dist/utils/bot-routing.d.ts.map +1 -0
- package/dist/utils/bot-routing.js +50 -0
- package/dist/utils/bot-routing.js.map +1 -0
- package/dist/utils/file-lock.d.ts +2 -0
- package/dist/utils/file-lock.d.ts.map +1 -0
- package/dist/utils/file-lock.js +114 -0
- package/dist/utils/file-lock.js.map +1 -0
- package/dist/utils/font-installer.js +1 -1
- package/dist/utils/font-installer.js.map +1 -1
- package/dist/utils/idle-detector.d.ts +6 -0
- package/dist/utils/idle-detector.d.ts.map +1 -1
- package/dist/utils/idle-detector.js +25 -4
- package/dist/utils/idle-detector.js.map +1 -1
- package/dist/utils/logger.d.ts +10 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +60 -8
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/render-dimensions.d.ts +48 -0
- package/dist/utils/render-dimensions.d.ts.map +1 -0
- package/dist/utils/render-dimensions.js +55 -0
- package/dist/utils/render-dimensions.js.map +1 -0
- package/dist/utils/screen-analyzer.d.ts.map +1 -1
- package/dist/utils/screen-analyzer.js +24 -0
- package/dist/utils/screen-analyzer.js.map +1 -1
- package/dist/utils/screenshot-renderer.d.ts.map +1 -1
- package/dist/utils/screenshot-renderer.js +67 -23
- package/dist/utils/screenshot-renderer.js.map +1 -1
- package/dist/utils/terminal-renderer.d.ts +16 -0
- package/dist/utils/terminal-renderer.d.ts.map +1 -1
- package/dist/utils/terminal-renderer.js +40 -23
- package/dist/utils/terminal-renderer.js.map +1 -1
- package/dist/utils/transient-snapshot.d.ts +28 -0
- package/dist/utils/transient-snapshot.d.ts.map +1 -0
- package/dist/utils/transient-snapshot.js +96 -0
- package/dist/utils/transient-snapshot.js.map +1 -0
- package/dist/worker.js +2248 -83
- package/dist/worker.js.map +1 -1
- package/package.json +12 -5
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import * as pty from 'node-pty';
|
|
2
2
|
import { execSync, execFileSync } from 'node:child_process';
|
|
3
|
+
import { accessSync, constants as fsConstants } from 'node:fs';
|
|
4
|
+
import { basename } from 'node:path';
|
|
5
|
+
import { probeTmuxFunctional, tmuxEnv } from '../../setup/ensure-tmux.js';
|
|
6
|
+
import { logger } from '../../utils/logger.js';
|
|
3
7
|
/**
|
|
4
8
|
* TmuxBackend — session backend using tmux for process persistence.
|
|
5
9
|
*
|
|
@@ -16,20 +20,30 @@ export class TmuxBackend {
|
|
|
16
20
|
sessionName;
|
|
17
21
|
ownsSession;
|
|
18
22
|
reattaching = false;
|
|
23
|
+
/** Tmux pane target when in adopt mode (e.g. "0:2.0") — set by attachToExisting.
|
|
24
|
+
* When non-null, ALL pane-scoped tmux commands (send-keys / paste-buffer /
|
|
25
|
+
* copy-mode / list-panes) must address this pane explicitly; using
|
|
26
|
+
* `this.sessionName` would either resolve nothing (the name is synthetic
|
|
27
|
+
* in adopt mode) or fall through to whichever pane tmux happens to have
|
|
28
|
+
* active, which is exactly the bug we're avoiding. */
|
|
29
|
+
adoptedPaneTarget = null;
|
|
19
30
|
constructor(sessionName, opts) {
|
|
20
31
|
this.sessionName = sessionName;
|
|
21
32
|
this.ownsSession = opts?.ownsSession ?? true;
|
|
22
33
|
}
|
|
34
|
+
/** Target string to use for pane-scoped tmux commands. In adopt mode this
|
|
35
|
+
* is the real pane address ("0:2.0"); otherwise the bmx-* session name. */
|
|
36
|
+
get cmdTarget() {
|
|
37
|
+
return this.adoptedPaneTarget ?? this.sessionName;
|
|
38
|
+
}
|
|
23
39
|
// ─── Static helpers ───────────────────────────────────────────────────────
|
|
24
|
-
/**
|
|
40
|
+
/**
|
|
41
|
+
* Check if tmux is usable — runs a functional probe (start + kill a
|
|
42
|
+
* disposable server), not just `tmux -V`. Same probe as config.ts so
|
|
43
|
+
* backend selection and runtime guard agree.
|
|
44
|
+
*/
|
|
25
45
|
static isAvailable() {
|
|
26
|
-
|
|
27
|
-
execSync('tmux -V', { stdio: 'ignore' });
|
|
28
|
-
return true;
|
|
29
|
-
}
|
|
30
|
-
catch {
|
|
31
|
-
return false;
|
|
32
|
-
}
|
|
46
|
+
return probeTmuxFunctional().ok;
|
|
33
47
|
}
|
|
34
48
|
/** Derive tmux session name from a session UUID. */
|
|
35
49
|
static sessionName(sessionId) {
|
|
@@ -38,7 +52,7 @@ export class TmuxBackend {
|
|
|
38
52
|
/** Check if a named tmux session exists. */
|
|
39
53
|
static hasSession(name) {
|
|
40
54
|
try {
|
|
41
|
-
execSync(`tmux has-session -t ${shellescape(name)}`, { stdio: 'ignore' });
|
|
55
|
+
execSync(`tmux has-session -t ${shellescape(name)}`, { stdio: 'ignore', env: tmuxEnv() });
|
|
42
56
|
return true;
|
|
43
57
|
}
|
|
44
58
|
catch {
|
|
@@ -48,7 +62,7 @@ export class TmuxBackend {
|
|
|
48
62
|
/** Kill a named tmux session (no-op if it doesn't exist). */
|
|
49
63
|
static killSession(name) {
|
|
50
64
|
try {
|
|
51
|
-
execSync(`tmux kill-session -t ${shellescape(name)}`, { stdio: 'ignore' });
|
|
65
|
+
execSync(`tmux kill-session -t ${shellescape(name)}`, { stdio: 'ignore', env: tmuxEnv() });
|
|
52
66
|
}
|
|
53
67
|
catch { /* session doesn't exist */ }
|
|
54
68
|
}
|
|
@@ -57,6 +71,7 @@ export class TmuxBackend {
|
|
|
57
71
|
try {
|
|
58
72
|
const out = execSync("tmux list-sessions -F '#{session_name}' 2>/dev/null", {
|
|
59
73
|
encoding: 'utf-8',
|
|
74
|
+
env: tmuxEnv(),
|
|
60
75
|
});
|
|
61
76
|
return out.split('\n').filter(s => s.startsWith('bmx-'));
|
|
62
77
|
}
|
|
@@ -67,6 +82,15 @@ export class TmuxBackend {
|
|
|
67
82
|
// ─── SessionBackend implementation ────────────────────────────────────────
|
|
68
83
|
spawn(bin, args, opts) {
|
|
69
84
|
this.reattaching = TmuxBackend.hasSession(this.sessionName);
|
|
85
|
+
logger.debug(`[tmux:${this.sessionName}] spawn ${this.reattaching ? 'reattach' : 'new'} ` +
|
|
86
|
+
`bin=${bin} args=${JSON.stringify(args)} cwd=${opts.cwd} ${opts.cols}x${opts.rows}`);
|
|
87
|
+
// Strip TMUX/TMUX_PANE from caller env before handing to pty.spawn — if
|
|
88
|
+
// the daemon was started inside a tmux session, leaving TMUX set would
|
|
89
|
+
// make this `tmux attach-session`/`new-session` target that parent
|
|
90
|
+
// session's socket. After the user's terminal tmux dies, every call
|
|
91
|
+
// here would print `error connecting to <stale-socket>` to the PTY and
|
|
92
|
+
// flood the daemon log via the leaked-stderr path.
|
|
93
|
+
const childEnv = tmuxEnv(opts.env);
|
|
70
94
|
if (this.reattaching) {
|
|
71
95
|
// Re-attach to surviving tmux session (CLI is still running)
|
|
72
96
|
this.process = pty.spawn('tmux', ['attach-session', '-t', this.sessionName], {
|
|
@@ -74,35 +98,70 @@ export class TmuxBackend {
|
|
|
74
98
|
cols: opts.cols,
|
|
75
99
|
rows: opts.rows,
|
|
76
100
|
cwd: opts.cwd,
|
|
77
|
-
env:
|
|
101
|
+
env: childEnv,
|
|
78
102
|
});
|
|
79
103
|
}
|
|
80
104
|
else {
|
|
81
|
-
//
|
|
82
|
-
//
|
|
83
|
-
//
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
105
|
+
// Run the CLI inside a fresh user shell so PATH / NVM_BIN / PNPM_HOME /
|
|
106
|
+
// mise / fnm / asdf shims set up in the user's rcfiles are loaded the
|
|
107
|
+
// way `coco` (or any other CLI) would see them if the user opened a
|
|
108
|
+
// terminal and ran it themselves.
|
|
109
|
+
//
|
|
110
|
+
// Shape:
|
|
111
|
+
// tmux new-session -- <shell> <shellFlags> -c <SCRIPT> _ <cwd> KEY=VAL... bin args...
|
|
112
|
+
//
|
|
113
|
+
// - <shell> + <shellFlags> come from resolveUserShell() and are
|
|
114
|
+
// bash/zsh/sh-specific (bash needs `-i` for .bashrc; zsh needs
|
|
115
|
+
// `-l -i` for .zprofile + .zshrc). fish/csh/nu are remapped to a
|
|
116
|
+
// POSIX fallback because our SCRIPT is POSIX-syntax.
|
|
117
|
+
// - SCRIPT = `cd -- "$1" && shift && exec /usr/bin/env "$@"`:
|
|
118
|
+
// * `cd -- "$1"` returns to the session's intended cwd even if
|
|
119
|
+
// the rcfile changed directory mid-load (.zshrc/.bashrc with
|
|
120
|
+
// a `cd ~/work` left in by mistake stays in opts.cwd).
|
|
121
|
+
// * `exec /usr/bin/env "$@"`: env(1) parses the leading KEY=VAL
|
|
122
|
+
// pairs in argv as overrides for the child process. This lands
|
|
123
|
+
// AFTER rcfile load, so botmux's per-bot LARK_APP_ID wins over
|
|
124
|
+
// a stale `export LARK_APP_ID=...` someone left in their .zshrc.
|
|
125
|
+
// - `_` is the $0 placeholder; the remaining argv items are seen as
|
|
126
|
+
// "$@" by the shell, so spaces / quotes / `$` / newlines in cwd,
|
|
127
|
+
// env values, or args never need shell-escaping.
|
|
128
|
+
// - tmux's own `-e KEY=VAL` is deliberately NOT used: it sets the
|
|
129
|
+
// session env (visible to the shell), which means the user's rcfile
|
|
130
|
+
// could `unset` or `export` over it before the CLI sees it. env(1)
|
|
131
|
+
// injection happens after rcfile load and is authoritative.
|
|
132
|
+
const shellSpec = resolveUserShell();
|
|
133
|
+
const envAssignments = buildBotmuxEnvAssignments(opts.env);
|
|
134
|
+
// Debug knob — when on, the wrapper does NOT `exec` the CLI; it runs the
|
|
135
|
+
// CLI as a child and then drops into an interactive `$shell -i` so the
|
|
136
|
+
// user can poke at PATH / NVM / pnpm in the web terminal after exiting
|
|
137
|
+
// the CLI with Ctrl-C. Worker will still think the CLI is alive (it
|
|
138
|
+
// can't see the child-vs-exec distinction), so don't send messages
|
|
139
|
+
// through the bot while in this mode — type into the web terminal directly.
|
|
140
|
+
const debugKeepShell = process.env.BOTMUX_DEBUG_KEEP_SHELL === '1';
|
|
141
|
+
const script = debugKeepShell
|
|
142
|
+
? buildDebugKeepShellScript(shellSpec.shell)
|
|
143
|
+
: SHELL_WRAPPER_SCRIPT;
|
|
144
|
+
if (debugKeepShell) {
|
|
145
|
+
logger.info(`[tmux:${this.sessionName}] BOTMUX_DEBUG_KEEP_SHELL=1 — CLI exit will drop ` +
|
|
146
|
+
`to interactive ${shellSpec.shell} in the web terminal`);
|
|
90
147
|
}
|
|
91
|
-
// Create new tmux session running the CLI command
|
|
92
148
|
const tmuxArgs = [
|
|
93
149
|
'new-session',
|
|
94
150
|
'-s', this.sessionName,
|
|
95
|
-
...envFlags,
|
|
96
151
|
'-x', String(opts.cols),
|
|
97
152
|
'-y', String(opts.rows),
|
|
98
|
-
'--',
|
|
153
|
+
'--',
|
|
154
|
+
shellSpec.shell, ...shellSpec.flags, '-c', script, '_',
|
|
155
|
+
opts.cwd,
|
|
156
|
+
...envAssignments,
|
|
157
|
+
bin, ...args,
|
|
99
158
|
];
|
|
100
159
|
this.process = pty.spawn('tmux', tmuxArgs, {
|
|
101
160
|
name: 'xterm-256color',
|
|
102
161
|
cols: opts.cols,
|
|
103
162
|
rows: opts.rows,
|
|
104
163
|
cwd: opts.cwd,
|
|
105
|
-
env:
|
|
164
|
+
env: childEnv,
|
|
106
165
|
});
|
|
107
166
|
}
|
|
108
167
|
// Configure tmux session options.
|
|
@@ -112,17 +171,18 @@ export class TmuxBackend {
|
|
|
112
171
|
setTimeout(() => {
|
|
113
172
|
try {
|
|
114
173
|
const t = shellescape(this.sessionName);
|
|
115
|
-
|
|
116
|
-
execSync(`tmux set-option -t ${t}
|
|
174
|
+
const env = tmuxEnv();
|
|
175
|
+
execSync(`tmux set-option -t ${t} status off`, { stdio: 'ignore', env });
|
|
176
|
+
execSync(`tmux set-option -t ${t} mouse on`, { stdio: 'ignore', env });
|
|
117
177
|
// set-clipboard is a server option — enable OSC 52 passthrough for web copy
|
|
118
|
-
execSync(`tmux set-option -s set-clipboard on`, { stdio: 'ignore' });
|
|
119
|
-
execSync(`tmux set-option -t ${t} history-limit 50000`, { stdio: 'ignore' });
|
|
178
|
+
execSync(`tmux set-option -s set-clipboard on`, { stdio: 'ignore', env });
|
|
179
|
+
execSync(`tmux set-option -t ${t} history-limit 50000`, { stdio: 'ignore', env });
|
|
120
180
|
// Prevent web terminal clients (smaller viewport) from shrinking the
|
|
121
181
|
// tmux window. If a web client at 80×24 causes tmux to resize the
|
|
122
182
|
// window down, reflowed content shifts buffer positions and the
|
|
123
183
|
// terminal renderer's baseline tracking breaks — historical output
|
|
124
184
|
// leaks into the streaming card.
|
|
125
|
-
execSync(`tmux set-option -t ${t} window-size largest`, { stdio: 'ignore' });
|
|
185
|
+
execSync(`tmux set-option -t ${t} window-size largest`, { stdio: 'ignore', env });
|
|
126
186
|
}
|
|
127
187
|
catch { /* session may not be ready yet — benign */ }
|
|
128
188
|
}, 500);
|
|
@@ -134,6 +194,12 @@ export class TmuxBackend {
|
|
|
134
194
|
/** Claude Code session JSONL path — set by worker for claude-code sessions so
|
|
135
195
|
* the claude-code adapter can verify paste+Enter submissions via file growth. */
|
|
136
196
|
claudeJsonlPath;
|
|
197
|
+
/** PID of the spawned Claude Code child — used by the claude-code adapter to
|
|
198
|
+
* follow Claude's authoritative session id via ~/.claude/sessions/<pid>.json. */
|
|
199
|
+
cliPid;
|
|
200
|
+
/** Working directory the CLI was spawned in — cross-checked against the pid
|
|
201
|
+
* file's cwd field so a recycled PID can't mislead the resolver. */
|
|
202
|
+
cliCwd;
|
|
137
203
|
write(data) {
|
|
138
204
|
this.process?.write(data);
|
|
139
205
|
}
|
|
@@ -143,16 +209,20 @@ export class TmuxBackend {
|
|
|
143
209
|
* For multiline text, use pasteText() instead (send-keys -l sends \n as Enter).
|
|
144
210
|
*/
|
|
145
211
|
sendText(text) {
|
|
146
|
-
|
|
212
|
+
this.exitCopyModeIfNeeded();
|
|
213
|
+
execFileSync('tmux', ['send-keys', '-t', this.cmdTarget, '-l', '--', text], {
|
|
147
214
|
stdio: 'ignore',
|
|
148
215
|
timeout: 5000,
|
|
216
|
+
env: tmuxEnv(),
|
|
149
217
|
});
|
|
150
218
|
}
|
|
151
219
|
/** Send special keys (Enter, Escape, C-c, etc.) to the tmux pane. */
|
|
152
220
|
sendSpecialKeys(...keys) {
|
|
153
|
-
|
|
221
|
+
this.exitCopyModeIfNeeded();
|
|
222
|
+
execFileSync('tmux', ['send-keys', '-t', this.cmdTarget, ...keys], {
|
|
154
223
|
stdio: 'ignore',
|
|
155
224
|
timeout: 5000,
|
|
225
|
+
env: tmuxEnv(),
|
|
156
226
|
});
|
|
157
227
|
}
|
|
158
228
|
/**
|
|
@@ -161,16 +231,18 @@ export class TmuxBackend {
|
|
|
161
231
|
* is in the alternate screen buffer (Claude Code, vim, etc.).
|
|
162
232
|
*/
|
|
163
233
|
enterCopyMode() {
|
|
164
|
-
execFileSync('tmux', ['copy-mode', '-e', '-t', this.
|
|
234
|
+
execFileSync('tmux', ['copy-mode', '-e', '-t', this.cmdTarget], {
|
|
165
235
|
stdio: 'ignore',
|
|
166
236
|
timeout: 5000,
|
|
237
|
+
env: tmuxEnv(),
|
|
167
238
|
});
|
|
168
239
|
}
|
|
169
240
|
/** Send a copy-mode X-command (e.g. 'halfpage-up', 'halfpage-down', 'cancel'). */
|
|
170
241
|
sendCopyModeCommand(xCommand) {
|
|
171
|
-
execFileSync('tmux', ['send-keys', '-t', this.
|
|
242
|
+
execFileSync('tmux', ['send-keys', '-t', this.cmdTarget, '-X', xCommand], {
|
|
172
243
|
stdio: 'ignore',
|
|
173
244
|
timeout: 5000,
|
|
245
|
+
env: tmuxEnv(),
|
|
174
246
|
});
|
|
175
247
|
}
|
|
176
248
|
/**
|
|
@@ -179,16 +251,39 @@ export class TmuxBackend {
|
|
|
179
251
|
* Safe for multiline content (unlike sendText where \n becomes Enter).
|
|
180
252
|
*/
|
|
181
253
|
pasteText(text) {
|
|
254
|
+
this.exitCopyModeIfNeeded();
|
|
182
255
|
execFileSync('tmux', ['load-buffer', '-'], {
|
|
183
256
|
input: text,
|
|
184
257
|
stdio: ['pipe', 'ignore', 'ignore'],
|
|
185
258
|
timeout: 5000,
|
|
259
|
+
env: tmuxEnv(),
|
|
186
260
|
});
|
|
187
|
-
execFileSync('tmux', ['paste-buffer', '-t', this.
|
|
261
|
+
execFileSync('tmux', ['paste-buffer', '-t', this.cmdTarget, '-d'], {
|
|
188
262
|
stdio: 'ignore',
|
|
189
263
|
timeout: 5000,
|
|
264
|
+
env: tmuxEnv(),
|
|
190
265
|
});
|
|
191
266
|
}
|
|
267
|
+
exitCopyModeIfNeeded() {
|
|
268
|
+
try {
|
|
269
|
+
const inMode = execFileSync('tmux', ['display-message', '-p', '-t', this.cmdTarget, '#{pane_in_mode}'], {
|
|
270
|
+
encoding: 'utf-8',
|
|
271
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
272
|
+
timeout: 1000,
|
|
273
|
+
env: tmuxEnv(),
|
|
274
|
+
}).trim();
|
|
275
|
+
if (inMode === '1') {
|
|
276
|
+
execFileSync('tmux', ['send-keys', '-t', this.cmdTarget, '-X', 'cancel'], {
|
|
277
|
+
stdio: 'ignore',
|
|
278
|
+
timeout: 1000,
|
|
279
|
+
env: tmuxEnv(),
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
catch {
|
|
284
|
+
// Pane may be gone or tmux may be restarting; keep the original write path best-effort.
|
|
285
|
+
}
|
|
286
|
+
}
|
|
192
287
|
resize(cols, rows) {
|
|
193
288
|
this.process?.resize(cols, rows);
|
|
194
289
|
}
|
|
@@ -204,8 +299,19 @@ export class TmuxBackend {
|
|
|
204
299
|
}
|
|
205
300
|
getChildPid() {
|
|
206
301
|
try {
|
|
207
|
-
|
|
208
|
-
|
|
302
|
+
// display-message resolves the *exact* target pane (single line out),
|
|
303
|
+
// unlike list-panes which returns every pane in the target's window
|
|
304
|
+
// when cmdTarget is a pane address — taking the first line of that
|
|
305
|
+
// would silently bind to whichever pane tmux happens to list first.
|
|
306
|
+
const output = execSync(`tmux display-message -p -t ${shellescape(this.cmdTarget)} '#{pane_pid}'`,
|
|
307
|
+
// Explicit stdio: execSync's default leaks the child's stderr to the
|
|
308
|
+
// parent's stderr fd. When tmux server is unavailable (transient
|
|
309
|
+
// restart, killed by user, /tmp wiped), this command writes "error
|
|
310
|
+
// connecting to /tmp/tmux-UID/default" to stderr, which the daemon's
|
|
311
|
+
// worker.stderr handler then logs as a worker error every poll cycle.
|
|
312
|
+
// tmuxEnv() also strips $TMUX so we don't target a dead parent server.
|
|
313
|
+
{ encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'], timeout: 3000, env: tmuxEnv() }).trim();
|
|
314
|
+
const pid = parseInt(output, 10);
|
|
209
315
|
return pid > 0 ? pid : null;
|
|
210
316
|
}
|
|
211
317
|
catch {
|
|
@@ -218,9 +324,9 @@ export class TmuxBackend {
|
|
|
218
324
|
if (this.adoptedPaneTarget) {
|
|
219
325
|
try {
|
|
220
326
|
// Only unzoom if the pane is currently zoomed
|
|
221
|
-
const zoomed = execSync(`tmux display -t ${shellescape(this.adoptedPaneTarget)} -p '#{window_zoomed_flag}'`, { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
|
|
327
|
+
const zoomed = execSync(`tmux display -t ${shellescape(this.adoptedPaneTarget)} -p '#{window_zoomed_flag}'`, { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'], env: tmuxEnv() }).trim();
|
|
222
328
|
if (zoomed === '1') {
|
|
223
|
-
execSync(`tmux resize-pane -Z -t ${shellescape(this.adoptedPaneTarget)}`, { stdio: 'ignore' });
|
|
329
|
+
execSync(`tmux resize-pane -Z -t ${shellescape(this.adoptedPaneTarget)}`, { stdio: 'ignore', env: tmuxEnv() });
|
|
224
330
|
}
|
|
225
331
|
}
|
|
226
332
|
catch { /* pane may be gone — benign */ }
|
|
@@ -254,38 +360,184 @@ export class TmuxBackend {
|
|
|
254
360
|
// Zoom the target pane BEFORE attaching — this makes the pane fill the entire
|
|
255
361
|
// window, so the PTY output (and web terminal) only shows this one pane.
|
|
256
362
|
// If the pane is already the only one in the window, zoom is a no-op.
|
|
363
|
+
//
|
|
364
|
+
// We intentionally attach to the source session directly rather than
|
|
365
|
+
// creating a grouped viewer session: in tmux -CC + iTerm2 control mode
|
|
366
|
+
// the extra session disrupts the integration's window/pane bookkeeping
|
|
367
|
+
// and tearing it down on disconnect breaks the user's original layout
|
|
368
|
+
// (iTerm splits one source window's panes into separate native windows).
|
|
369
|
+
// The downside is the web terminal will follow whichever window the
|
|
370
|
+
// user's primary -CC client is currently focused on; that stickiness
|
|
371
|
+
// can be revisited later via `tmux pipe-pane` (out-of-band capture)
|
|
372
|
+
// without polluting the -CC client.
|
|
257
373
|
try {
|
|
258
|
-
execSync(`tmux resize-pane -Z -t ${shellescape(tmuxTarget)}`, { stdio: 'ignore' });
|
|
374
|
+
execSync(`tmux resize-pane -Z -t ${shellescape(tmuxTarget)}`, { stdio: 'ignore', env: tmuxEnv() });
|
|
259
375
|
}
|
|
260
|
-
catch { /*
|
|
376
|
+
catch { /* benign */ }
|
|
261
377
|
this.process = pty.spawn('tmux', ['attach-session', '-t', tmuxTarget], {
|
|
262
378
|
name: 'xterm-256color',
|
|
263
379
|
cols: opts.cols,
|
|
264
380
|
rows: opts.rows,
|
|
265
381
|
cwd: opts.cwd,
|
|
266
|
-
env: opts.env,
|
|
382
|
+
env: tmuxEnv(opts.env),
|
|
267
383
|
});
|
|
268
384
|
}
|
|
269
|
-
/** Tmux pane target when in adopt mode (e.g. "0:2.0") — used for zoom cleanup. */
|
|
270
|
-
adoptedPaneTarget = null;
|
|
271
385
|
getAttachInfo() {
|
|
272
386
|
return { type: 'tmux', sessionName: this.sessionName };
|
|
273
387
|
}
|
|
274
388
|
}
|
|
275
389
|
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
276
390
|
/**
|
|
277
|
-
*
|
|
278
|
-
*
|
|
279
|
-
*
|
|
280
|
-
*
|
|
391
|
+
* The minimal set of env vars that botmux must inject into the CLI process
|
|
392
|
+
* itself — values that user rcfiles cannot derive on their own (per-bot
|
|
393
|
+
* credentials, the daemon-assigned data directory, the BOTMUX marker, the
|
|
394
|
+
* Claude root-mode escape hatch, the session owner's open_id).
|
|
395
|
+
*
|
|
396
|
+
* Anything outside this list (PATH, HOME, NVM_BIN, PNPM_HOME, LANG, …) is
|
|
397
|
+
* deliberately NOT forwarded from the daemon — the wrapping `$SHELL -l -i`
|
|
398
|
+
* pass loads the user's rcfiles, and whatever they set is what the CLI sees.
|
|
399
|
+
* This matches the user's mental model: "the tmux session should be like a
|
|
400
|
+
* fresh terminal where the user runs the CLI manually."
|
|
401
|
+
*
|
|
402
|
+
* These values are injected via `/usr/bin/env KEY=VAL ... cli args` (not tmux
|
|
403
|
+
* `-e`) so they land *after* rcfile load and override any leftover same-named
|
|
404
|
+
* exports in the user's rcfile (e.g. an old `LARK_APP_ID` from a previous bot).
|
|
281
405
|
*/
|
|
282
|
-
const
|
|
283
|
-
'BOTMUX',
|
|
406
|
+
const BOTMUX_INJECTED_ENV_KEYS = [
|
|
284
407
|
'LARK_APP_ID',
|
|
285
408
|
'LARK_APP_SECRET',
|
|
286
409
|
'__OWNER_OPEN_ID',
|
|
410
|
+
'BOTMUX',
|
|
287
411
|
'SESSION_DATA_DIR',
|
|
412
|
+
'IS_SANDBOX',
|
|
288
413
|
];
|
|
414
|
+
/**
|
|
415
|
+
* Build the `KEY=VAL` argv slice passed to `/usr/bin/env`. Only forwards the
|
|
416
|
+
* keys in `BOTMUX_INJECTED_ENV_KEYS` and only when the value is defined —
|
|
417
|
+
* `IS_SANDBOX` for instance is only set when the daemon is running as root.
|
|
418
|
+
* Pure function for unit-testing without spawning tmux.
|
|
419
|
+
*/
|
|
420
|
+
export function buildBotmuxEnvAssignments(env) {
|
|
421
|
+
if (!env)
|
|
422
|
+
return [];
|
|
423
|
+
const out = [];
|
|
424
|
+
for (const key of BOTMUX_INJECTED_ENV_KEYS) {
|
|
425
|
+
const val = env[key];
|
|
426
|
+
if (val === undefined)
|
|
427
|
+
continue;
|
|
428
|
+
out.push(`${key}=${val}`);
|
|
429
|
+
}
|
|
430
|
+
return out;
|
|
431
|
+
}
|
|
432
|
+
/**
|
|
433
|
+
* Default wrapper script for `<shell> -c`. Sees argv as:
|
|
434
|
+
* $0 = '_' (placeholder), $1 = cwd, $2..N = KEY=VAL... bin args...
|
|
435
|
+
*
|
|
436
|
+
* The `cd` step makes the CLI's cwd survive a wayward `cd` in the user's
|
|
437
|
+
* rcfile. The `exec /usr/bin/env` step injects botmux's per-bot/per-session
|
|
438
|
+
* overrides AFTER rcfile load so they can't be shadowed by leftover exports.
|
|
439
|
+
*
|
|
440
|
+
* POSIX-syntax (works in bash/zsh/sh); fish/csh/nu users get remapped to
|
|
441
|
+
* bash/zsh/sh by resolveUserShell() so they hit the same SCRIPT path.
|
|
442
|
+
*/
|
|
443
|
+
export const SHELL_WRAPPER_SCRIPT = 'cd -- "$1" && shift && exec /usr/bin/env "$@"';
|
|
444
|
+
/**
|
|
445
|
+
* Debug variant of the wrapper script — same prelude, but the CLI runs as
|
|
446
|
+
* a *child* (no `exec`) and the wrapper hands off to an interactive shell
|
|
447
|
+
* once the CLI exits. Useful for diagnosing missing PATH / NVM / pnpm /
|
|
448
|
+
* mise shims in the user's rcfile: hit Ctrl-C in the web terminal, land
|
|
449
|
+
* in `<shell> -i`, run `echo $PATH` / `which node` / etc.
|
|
450
|
+
*
|
|
451
|
+
* Enabled with `BOTMUX_DEBUG_KEEP_SHELL=1` at daemon-start time.
|
|
452
|
+
*
|
|
453
|
+
* `shellPath` is single-quoted into the script with `'` escaped, so it's
|
|
454
|
+
* safe for paths containing spaces or quotes. Caller has already verified
|
|
455
|
+
* it via accessSync().
|
|
456
|
+
*/
|
|
457
|
+
export function buildDebugKeepShellScript(shellPath) {
|
|
458
|
+
const safeShell = shellPath.replace(/'/g, `'\\''`);
|
|
459
|
+
return [
|
|
460
|
+
'cd -- "$1" && shift',
|
|
461
|
+
'/usr/bin/env "$@"',
|
|
462
|
+
`printf '\\n[botmux debug] CLI exited (status %d) — interactive shell active. Type exit to close the session.\\n' "$?" >&2`,
|
|
463
|
+
`exec '${safeShell}' -i`,
|
|
464
|
+
].join('; ');
|
|
465
|
+
}
|
|
466
|
+
/** Map a shell kind to the right rcfile-loading flags. The choice of flags
|
|
467
|
+
* is the part that actually differs between bash and zsh:
|
|
468
|
+
* - bash login shell does NOT auto-source .bashrc; many users only have
|
|
469
|
+
* nvm/fnm/pnpm hooks in .bashrc; using `-l` here would miss them.
|
|
470
|
+
* Plain `-i` loads .bashrc, which is what we want.
|
|
471
|
+
* - zsh interactive shell loads .zshrc; login loads .zprofile + .zlogin.
|
|
472
|
+
* Combine `-l -i` so installs in either location surface.
|
|
473
|
+
* - sh has no rcfile we can rely on portably; skip rcfile flags. */
|
|
474
|
+
function specForKind(shell, kind) {
|
|
475
|
+
const flags = [];
|
|
476
|
+
if (kind === 'bash')
|
|
477
|
+
flags.push('-i');
|
|
478
|
+
else if (kind === 'zsh')
|
|
479
|
+
flags.push('-l', '-i');
|
|
480
|
+
// 'sh' adds nothing — POSIX sh has no portable interactive rcfile.
|
|
481
|
+
return { shell, flags };
|
|
482
|
+
}
|
|
483
|
+
/** Classify a shell binary path by basename. Returns null for shells whose
|
|
484
|
+
* syntax we don't support (fish, nu, csh, tcsh, ...). */
|
|
485
|
+
function classifyShell(path) {
|
|
486
|
+
const base = basename(path);
|
|
487
|
+
if (base === 'bash')
|
|
488
|
+
return 'bash';
|
|
489
|
+
if (base === 'zsh')
|
|
490
|
+
return 'zsh';
|
|
491
|
+
if (base === 'sh' || base === 'dash' || base === 'ash')
|
|
492
|
+
return 'sh';
|
|
493
|
+
return null;
|
|
494
|
+
}
|
|
495
|
+
function isExecutable(path) {
|
|
496
|
+
try {
|
|
497
|
+
accessSync(path, fsConstants.X_OK);
|
|
498
|
+
return true;
|
|
499
|
+
}
|
|
500
|
+
catch {
|
|
501
|
+
return false;
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
/**
|
|
505
|
+
* Pick a shell to wrap the CLI launch in, returning the binary path plus the
|
|
506
|
+
* exact argv flags needed for its rcfiles to load. Tries `$SHELL` first, then
|
|
507
|
+
* `/bin/zsh` → `/bin/bash` → `/bin/sh`.
|
|
508
|
+
*
|
|
509
|
+
* If `$SHELL` is fish/nu/csh/etc., emits a warning and falls back to a POSIX
|
|
510
|
+
* shell — our wrapper SCRIPT is POSIX-syntax and would break under fish. The
|
|
511
|
+
* user can still configure their CLI's PATH/etc. inside the fallback shell's
|
|
512
|
+
* rcfile if needed; the alternative (run their fish rcfile under a POSIX
|
|
513
|
+
* harness) does not work.
|
|
514
|
+
*
|
|
515
|
+
* Always returns a usable ShellSpec — the last-resort `/bin/sh` fallback is
|
|
516
|
+
* close enough to universal that surfacing an error here would do more harm
|
|
517
|
+
* than good. If `/bin/sh` is also missing, tmux's own spawn will fail with
|
|
518
|
+
* a clear message.
|
|
519
|
+
*/
|
|
520
|
+
export function resolveUserShell(env = process.env) {
|
|
521
|
+
const userShell = env.SHELL;
|
|
522
|
+
if (userShell && isExecutable(userShell)) {
|
|
523
|
+
const kind = classifyShell(userShell);
|
|
524
|
+
if (kind)
|
|
525
|
+
return specForKind(userShell, kind);
|
|
526
|
+
logger.warn(`[tmux-backend] $SHELL=${userShell} is not bash/zsh/sh; ` +
|
|
527
|
+
`falling back to a POSIX shell for the wrapper. ` +
|
|
528
|
+
`Configure CLI PATH/env in the fallback shell's rcfile if needed.`);
|
|
529
|
+
}
|
|
530
|
+
for (const candidate of ['/bin/zsh', '/bin/bash', '/bin/sh']) {
|
|
531
|
+
if (!isExecutable(candidate))
|
|
532
|
+
continue;
|
|
533
|
+
const kind = classifyShell(candidate);
|
|
534
|
+
if (!kind)
|
|
535
|
+
continue;
|
|
536
|
+
return specForKind(candidate, kind);
|
|
537
|
+
}
|
|
538
|
+
// /bin/sh missing too — return it anyway and let tmux surface the error.
|
|
539
|
+
return specForKind('/bin/sh', 'sh');
|
|
540
|
+
}
|
|
289
541
|
/** Minimal shell-escape for tmux session names (alphanumeric + dash). */
|
|
290
542
|
function shellescape(s) {
|
|
291
543
|
return `'${s.replace(/'/g, "'\\''")}'`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tmux-backend.js","sourceRoot":"","sources":["../../../src/adapters/backend/tmux-backend.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tmux-backend.js","sourceRoot":"","sources":["../../../src/adapters/backend/tmux-backend.ts"],"names":[],"mappings":"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"}
|