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.
Files changed (330) hide show
  1. package/README.en.md +140 -76
  2. package/README.md +134 -75
  3. package/dist/adapters/backend/pty-backend.d.ts +6 -0
  4. package/dist/adapters/backend/pty-backend.d.ts.map +1 -1
  5. package/dist/adapters/backend/pty-backend.js +10 -0
  6. package/dist/adapters/backend/pty-backend.js.map +1 -1
  7. package/dist/adapters/backend/session-backend-selector.d.ts +11 -0
  8. package/dist/adapters/backend/session-backend-selector.d.ts.map +1 -0
  9. package/dist/adapters/backend/session-backend-selector.js +26 -0
  10. package/dist/adapters/backend/session-backend-selector.js.map +1 -0
  11. package/dist/adapters/backend/tmux-backend.d.ts +80 -3
  12. package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
  13. package/dist/adapters/backend/tmux-backend.js +301 -49
  14. package/dist/adapters/backend/tmux-backend.js.map +1 -1
  15. package/dist/adapters/backend/tmux-pipe-backend.d.ts +100 -0
  16. package/dist/adapters/backend/tmux-pipe-backend.d.ts.map +1 -0
  17. package/dist/adapters/backend/tmux-pipe-backend.js +473 -0
  18. package/dist/adapters/backend/tmux-pipe-backend.js.map +1 -0
  19. package/dist/adapters/cli/aiden.d.ts.map +1 -1
  20. package/dist/adapters/cli/aiden.js +5 -0
  21. package/dist/adapters/cli/aiden.js.map +1 -1
  22. package/dist/adapters/cli/claude-code.d.ts +40 -1
  23. package/dist/adapters/cli/claude-code.d.ts.map +1 -1
  24. package/dist/adapters/cli/claude-code.js +470 -49
  25. package/dist/adapters/cli/claude-code.js.map +1 -1
  26. package/dist/adapters/cli/coco.d.ts.map +1 -1
  27. package/dist/adapters/cli/coco.js +191 -9
  28. package/dist/adapters/cli/coco.js.map +1 -1
  29. package/dist/adapters/cli/codex.d.ts.map +1 -1
  30. package/dist/adapters/cli/codex.js +94 -17
  31. package/dist/adapters/cli/codex.js.map +1 -1
  32. package/dist/adapters/cli/shared-hints.d.ts +2 -2
  33. package/dist/adapters/cli/shared-hints.d.ts.map +1 -1
  34. package/dist/adapters/cli/shared-hints.js +7 -5
  35. package/dist/adapters/cli/shared-hints.js.map +1 -1
  36. package/dist/adapters/cli/types.d.ts +38 -1
  37. package/dist/adapters/cli/types.d.ts.map +1 -1
  38. package/dist/autostart.d.ts +14 -0
  39. package/dist/autostart.d.ts.map +1 -0
  40. package/dist/autostart.js +357 -0
  41. package/dist/autostart.js.map +1 -0
  42. package/dist/bot-registry.d.ts +29 -3
  43. package/dist/bot-registry.d.ts.map +1 -1
  44. package/dist/bot-registry.js +91 -12
  45. package/dist/bot-registry.js.map +1 -1
  46. package/dist/cli/arg-utils.d.ts +11 -0
  47. package/dist/cli/arg-utils.d.ts.map +1 -0
  48. package/dist/cli/arg-utils.js +25 -0
  49. package/dist/cli/arg-utils.js.map +1 -0
  50. package/dist/cli/create-group-resolver.d.ts +32 -0
  51. package/dist/cli/create-group-resolver.d.ts.map +1 -0
  52. package/dist/cli/create-group-resolver.js +70 -0
  53. package/dist/cli/create-group-resolver.js.map +1 -0
  54. package/dist/cli/quoted-render.d.ts +30 -0
  55. package/dist/cli/quoted-render.d.ts.map +1 -0
  56. package/dist/cli/quoted-render.js +29 -0
  57. package/dist/cli/quoted-render.js.map +1 -0
  58. package/dist/cli.js +916 -272
  59. package/dist/cli.js.map +1 -1
  60. package/dist/config.d.ts +6 -0
  61. package/dist/config.d.ts.map +1 -1
  62. package/dist/config.js +18 -8
  63. package/dist/config.js.map +1 -1
  64. package/dist/core/command-handler.d.ts +43 -0
  65. package/dist/core/command-handler.d.ts.map +1 -1
  66. package/dist/core/command-handler.js +167 -64
  67. package/dist/core/command-handler.js.map +1 -1
  68. package/dist/core/dashboard-events.d.ts +57 -0
  69. package/dist/core/dashboard-events.d.ts.map +1 -0
  70. package/dist/core/dashboard-events.js +23 -0
  71. package/dist/core/dashboard-events.js.map +1 -0
  72. package/dist/core/dashboard-ipc-server.d.ts +43 -0
  73. package/dist/core/dashboard-ipc-server.d.ts.map +1 -0
  74. package/dist/core/dashboard-ipc-server.js +481 -0
  75. package/dist/core/dashboard-ipc-server.js.map +1 -0
  76. package/dist/core/dashboard-locate.d.ts +20 -0
  77. package/dist/core/dashboard-locate.d.ts.map +1 -0
  78. package/dist/core/dashboard-locate.js +26 -0
  79. package/dist/core/dashboard-locate.js.map +1 -0
  80. package/dist/core/dashboard-rows.d.ts +31 -0
  81. package/dist/core/dashboard-rows.d.ts.map +1 -0
  82. package/dist/core/dashboard-rows.js +65 -0
  83. package/dist/core/dashboard-rows.js.map +1 -0
  84. package/dist/core/inherit-peer.d.ts +14 -0
  85. package/dist/core/inherit-peer.d.ts.map +1 -0
  86. package/dist/core/inherit-peer.js +32 -0
  87. package/dist/core/inherit-peer.js.map +1 -0
  88. package/dist/core/scheduler.d.ts +24 -0
  89. package/dist/core/scheduler.d.ts.map +1 -1
  90. package/dist/core/scheduler.js +93 -2
  91. package/dist/core/scheduler.js.map +1 -1
  92. package/dist/core/session-activity.d.ts +3 -0
  93. package/dist/core/session-activity.d.ts.map +1 -0
  94. package/dist/core/session-activity.js +20 -0
  95. package/dist/core/session-activity.js.map +1 -0
  96. package/dist/core/session-discovery.d.ts +39 -0
  97. package/dist/core/session-discovery.d.ts.map +1 -1
  98. package/dist/core/session-discovery.js +114 -21
  99. package/dist/core/session-discovery.js.map +1 -1
  100. package/dist/core/session-manager.d.ts +72 -0
  101. package/dist/core/session-manager.d.ts.map +1 -1
  102. package/dist/core/session-manager.js +396 -106
  103. package/dist/core/session-manager.js.map +1 -1
  104. package/dist/core/types.d.ts +27 -2
  105. package/dist/core/types.d.ts.map +1 -1
  106. package/dist/core/types.js +14 -3
  107. package/dist/core/types.js.map +1 -1
  108. package/dist/core/worker-pool.d.ts +72 -3
  109. package/dist/core/worker-pool.d.ts.map +1 -1
  110. package/dist/core/worker-pool.js +459 -38
  111. package/dist/core/worker-pool.js.map +1 -1
  112. package/dist/daemon.d.ts.map +1 -1
  113. package/dist/daemon.js +645 -314
  114. package/dist/daemon.js.map +1 -1
  115. package/dist/dashboard/aggregator.d.ts +41 -0
  116. package/dist/dashboard/aggregator.d.ts.map +1 -0
  117. package/dist/dashboard/aggregator.js +125 -0
  118. package/dist/dashboard/aggregator.js.map +1 -0
  119. package/dist/dashboard/auth.d.ts +23 -0
  120. package/dist/dashboard/auth.d.ts.map +1 -0
  121. package/dist/dashboard/auth.js +66 -0
  122. package/dist/dashboard/auth.js.map +1 -0
  123. package/dist/dashboard/operator-selector.d.ts +20 -0
  124. package/dist/dashboard/operator-selector.d.ts.map +1 -0
  125. package/dist/dashboard/operator-selector.js +39 -0
  126. package/dist/dashboard/operator-selector.js.map +1 -0
  127. package/dist/dashboard/registry.d.ts +35 -0
  128. package/dist/dashboard/registry.d.ts.map +1 -0
  129. package/dist/dashboard/registry.js +74 -0
  130. package/dist/dashboard/registry.js.map +1 -0
  131. package/dist/dashboard/web/app.d.ts +2 -0
  132. package/dist/dashboard/web/app.d.ts.map +1 -0
  133. package/dist/dashboard/web/app.js +45 -0
  134. package/dist/dashboard/web/app.js.map +1 -0
  135. package/dist/dashboard/web/bot-defaults.d.ts +2 -0
  136. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -0
  137. package/dist/dashboard/web/bot-defaults.js +201 -0
  138. package/dist/dashboard/web/bot-defaults.js.map +1 -0
  139. package/dist/dashboard/web/groups.d.ts +16 -0
  140. package/dist/dashboard/web/groups.d.ts.map +1 -0
  141. package/dist/dashboard/web/groups.js +584 -0
  142. package/dist/dashboard/web/groups.js.map +1 -0
  143. package/dist/dashboard/web/schedules.d.ts +2 -0
  144. package/dist/dashboard/web/schedules.d.ts.map +1 -0
  145. package/dist/dashboard/web/schedules.js +105 -0
  146. package/dist/dashboard/web/schedules.js.map +1 -0
  147. package/dist/dashboard/web/sessions.d.ts +2 -0
  148. package/dist/dashboard/web/sessions.d.ts.map +1 -0
  149. package/dist/dashboard/web/sessions.js +374 -0
  150. package/dist/dashboard/web/sessions.js.map +1 -0
  151. package/dist/dashboard/web/store.d.ts +23 -0
  152. package/dist/dashboard/web/store.d.ts.map +1 -0
  153. package/dist/dashboard/web/store.js +82 -0
  154. package/dist/dashboard/web/store.js.map +1 -0
  155. package/dist/dashboard-web/app.js +263 -0
  156. package/dist/dashboard-web/index.html +23 -0
  157. package/dist/dashboard-web/style.css +93 -0
  158. package/dist/dashboard.d.ts +2 -0
  159. package/dist/dashboard.d.ts.map +1 -0
  160. package/dist/dashboard.js +639 -0
  161. package/dist/dashboard.js.map +1 -0
  162. package/dist/im/lark/card-builder.d.ts +18 -1
  163. package/dist/im/lark/card-builder.d.ts.map +1 -1
  164. package/dist/im/lark/card-builder.js +70 -9
  165. package/dist/im/lark/card-builder.js.map +1 -1
  166. package/dist/im/lark/card-handler.d.ts.map +1 -1
  167. package/dist/im/lark/card-handler.js +123 -109
  168. package/dist/im/lark/card-handler.js.map +1 -1
  169. package/dist/im/lark/client.d.ts +35 -0
  170. package/dist/im/lark/client.d.ts.map +1 -1
  171. package/dist/im/lark/client.js +114 -11
  172. package/dist/im/lark/client.js.map +1 -1
  173. package/dist/im/lark/event-dispatcher.d.ts +88 -6
  174. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  175. package/dist/im/lark/event-dispatcher.js +398 -62
  176. package/dist/im/lark/event-dispatcher.js.map +1 -1
  177. package/dist/im/lark/forwarded-renderer.d.ts +23 -0
  178. package/dist/im/lark/forwarded-renderer.d.ts.map +1 -0
  179. package/dist/im/lark/forwarded-renderer.js +105 -0
  180. package/dist/im/lark/forwarded-renderer.js.map +1 -0
  181. package/dist/im/lark/md-card.d.ts +73 -0
  182. package/dist/im/lark/md-card.d.ts.map +1 -0
  183. package/dist/im/lark/md-card.js +332 -0
  184. package/dist/im/lark/md-card.js.map +1 -0
  185. package/dist/im/lark/merge-forward.d.ts +32 -0
  186. package/dist/im/lark/merge-forward.d.ts.map +1 -0
  187. package/dist/im/lark/merge-forward.js +110 -0
  188. package/dist/im/lark/merge-forward.js.map +1 -0
  189. package/dist/im/lark/message-parser.d.ts +9 -3
  190. package/dist/im/lark/message-parser.d.ts.map +1 -1
  191. package/dist/im/lark/message-parser.js +48 -13
  192. package/dist/im/lark/message-parser.js.map +1 -1
  193. package/dist/im/lark/quote-hint.d.ts +18 -0
  194. package/dist/im/lark/quote-hint.d.ts.map +1 -0
  195. package/dist/im/lark/quote-hint.js +23 -0
  196. package/dist/im/lark/quote-hint.js.map +1 -0
  197. package/dist/services/bridge-fallback-gate.d.ts +42 -0
  198. package/dist/services/bridge-fallback-gate.d.ts.map +1 -0
  199. package/dist/services/bridge-fallback-gate.js +12 -0
  200. package/dist/services/bridge-fallback-gate.js.map +1 -0
  201. package/dist/services/bridge-rotation-policy.d.ts +139 -0
  202. package/dist/services/bridge-rotation-policy.d.ts.map +1 -0
  203. package/dist/services/bridge-rotation-policy.js +125 -0
  204. package/dist/services/bridge-rotation-policy.js.map +1 -0
  205. package/dist/services/bridge-turn-queue.d.ts +154 -0
  206. package/dist/services/bridge-turn-queue.d.ts.map +1 -0
  207. package/dist/services/bridge-turn-queue.js +316 -0
  208. package/dist/services/bridge-turn-queue.js.map +1 -0
  209. package/dist/services/chat-first-seen-store.d.ts +27 -0
  210. package/dist/services/chat-first-seen-store.d.ts.map +1 -0
  211. package/dist/services/chat-first-seen-store.js +114 -0
  212. package/dist/services/chat-first-seen-store.js.map +1 -0
  213. package/dist/services/claude-transcript.d.ts +268 -0
  214. package/dist/services/claude-transcript.d.ts.map +1 -0
  215. package/dist/services/claude-transcript.js +798 -0
  216. package/dist/services/claude-transcript.js.map +1 -0
  217. package/dist/services/coco-transcript.d.ts +35 -0
  218. package/dist/services/coco-transcript.d.ts.map +1 -0
  219. package/dist/services/coco-transcript.js +192 -0
  220. package/dist/services/coco-transcript.js.map +1 -0
  221. package/dist/services/codex-bridge-queue.d.ts +56 -0
  222. package/dist/services/codex-bridge-queue.d.ts.map +1 -0
  223. package/dist/services/codex-bridge-queue.js +150 -0
  224. package/dist/services/codex-bridge-queue.js.map +1 -0
  225. package/dist/services/codex-transcript.d.ts +84 -0
  226. package/dist/services/codex-transcript.d.ts.map +1 -0
  227. package/dist/services/codex-transcript.js +298 -0
  228. package/dist/services/codex-transcript.js.map +1 -0
  229. package/dist/services/group-creator.d.ts +23 -0
  230. package/dist/services/group-creator.d.ts.map +1 -0
  231. package/dist/services/group-creator.js +75 -0
  232. package/dist/services/group-creator.js.map +1 -0
  233. package/dist/services/groups-store.d.ts +98 -0
  234. package/dist/services/groups-store.d.ts.map +1 -0
  235. package/dist/services/groups-store.js +213 -0
  236. package/dist/services/groups-store.js.map +1 -0
  237. package/dist/services/oncall-store.d.ts +80 -8
  238. package/dist/services/oncall-store.d.ts.map +1 -1
  239. package/dist/services/oncall-store.js +265 -55
  240. package/dist/services/oncall-store.js.map +1 -1
  241. package/dist/services/project-scanner.d.ts +1 -2
  242. package/dist/services/project-scanner.d.ts.map +1 -1
  243. package/dist/services/project-scanner.js +118 -68
  244. package/dist/services/project-scanner.js.map +1 -1
  245. package/dist/services/schedule-store.d.ts +5 -0
  246. package/dist/services/schedule-store.d.ts.map +1 -1
  247. package/dist/services/schedule-store.js +77 -1
  248. package/dist/services/schedule-store.js.map +1 -1
  249. package/dist/services/session-store.d.ts +22 -0
  250. package/dist/services/session-store.d.ts.map +1 -1
  251. package/dist/services/session-store.js +62 -4
  252. package/dist/services/session-store.js.map +1 -1
  253. package/dist/setup/bots-store.d.ts +3 -0
  254. package/dist/setup/bots-store.d.ts.map +1 -0
  255. package/dist/setup/bots-store.js +24 -0
  256. package/dist/setup/bots-store.js.map +1 -0
  257. package/dist/setup/detect-platform.d.ts +14 -0
  258. package/dist/setup/detect-platform.d.ts.map +1 -0
  259. package/dist/setup/detect-platform.js +139 -0
  260. package/dist/setup/detect-platform.js.map +1 -0
  261. package/dist/setup/ensure-fonts.d.ts +13 -0
  262. package/dist/setup/ensure-fonts.d.ts.map +1 -0
  263. package/dist/setup/ensure-fonts.js +225 -0
  264. package/dist/setup/ensure-fonts.js.map +1 -0
  265. package/dist/setup/ensure-tmux.d.ts +60 -0
  266. package/dist/setup/ensure-tmux.d.ts.map +1 -0
  267. package/dist/setup/ensure-tmux.js +236 -0
  268. package/dist/setup/ensure-tmux.js.map +1 -0
  269. package/dist/setup/index.d.ts +9 -0
  270. package/dist/setup/index.d.ts.map +1 -0
  271. package/dist/setup/index.js +46 -0
  272. package/dist/setup/index.js.map +1 -0
  273. package/dist/setup/lark-scopes.json +301 -0
  274. package/dist/setup/register-app.d.ts +52 -0
  275. package/dist/setup/register-app.d.ts.map +1 -0
  276. package/dist/setup/register-app.js +91 -0
  277. package/dist/setup/register-app.js.map +1 -0
  278. package/dist/setup/verify-permissions.d.ts +115 -0
  279. package/dist/setup/verify-permissions.d.ts.map +1 -0
  280. package/dist/setup/verify-permissions.js +207 -0
  281. package/dist/setup/verify-permissions.js.map +1 -0
  282. package/dist/skills/definitions.d.ts +4 -0
  283. package/dist/skills/definitions.d.ts.map +1 -1
  284. package/dist/skills/definitions.js +133 -19
  285. package/dist/skills/definitions.js.map +1 -1
  286. package/dist/skills/installer.d.ts +3 -1
  287. package/dist/skills/installer.d.ts.map +1 -1
  288. package/dist/skills/installer.js +18 -3
  289. package/dist/skills/installer.js.map +1 -1
  290. package/dist/types.d.ts +44 -0
  291. package/dist/types.d.ts.map +1 -1
  292. package/dist/utils/bot-routing.d.ts +6 -0
  293. package/dist/utils/bot-routing.d.ts.map +1 -0
  294. package/dist/utils/bot-routing.js +50 -0
  295. package/dist/utils/bot-routing.js.map +1 -0
  296. package/dist/utils/file-lock.d.ts +2 -0
  297. package/dist/utils/file-lock.d.ts.map +1 -0
  298. package/dist/utils/file-lock.js +114 -0
  299. package/dist/utils/file-lock.js.map +1 -0
  300. package/dist/utils/font-installer.js +1 -1
  301. package/dist/utils/font-installer.js.map +1 -1
  302. package/dist/utils/idle-detector.d.ts +6 -0
  303. package/dist/utils/idle-detector.d.ts.map +1 -1
  304. package/dist/utils/idle-detector.js +25 -4
  305. package/dist/utils/idle-detector.js.map +1 -1
  306. package/dist/utils/logger.d.ts +10 -0
  307. package/dist/utils/logger.d.ts.map +1 -1
  308. package/dist/utils/logger.js +60 -8
  309. package/dist/utils/logger.js.map +1 -1
  310. package/dist/utils/render-dimensions.d.ts +48 -0
  311. package/dist/utils/render-dimensions.d.ts.map +1 -0
  312. package/dist/utils/render-dimensions.js +55 -0
  313. package/dist/utils/render-dimensions.js.map +1 -0
  314. package/dist/utils/screen-analyzer.d.ts.map +1 -1
  315. package/dist/utils/screen-analyzer.js +24 -0
  316. package/dist/utils/screen-analyzer.js.map +1 -1
  317. package/dist/utils/screenshot-renderer.d.ts.map +1 -1
  318. package/dist/utils/screenshot-renderer.js +67 -23
  319. package/dist/utils/screenshot-renderer.js.map +1 -1
  320. package/dist/utils/terminal-renderer.d.ts +16 -0
  321. package/dist/utils/terminal-renderer.d.ts.map +1 -1
  322. package/dist/utils/terminal-renderer.js +40 -23
  323. package/dist/utils/terminal-renderer.js.map +1 -1
  324. package/dist/utils/transient-snapshot.d.ts +28 -0
  325. package/dist/utils/transient-snapshot.d.ts.map +1 -0
  326. package/dist/utils/transient-snapshot.js +96 -0
  327. package/dist/utils/transient-snapshot.js.map +1 -0
  328. package/dist/worker.js +2248 -83
  329. package/dist/worker.js.map +1 -1
  330. 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
- /** Check if tmux binary is available on PATH. */
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
- try {
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: opts.env,
101
+ env: childEnv,
78
102
  });
79
103
  }
80
104
  else {
81
- // Build -e flags for env vars that the tmux session command needs.
82
- // tmux new-session runs the command in the tmux server's environment,
83
- // which may differ from the spawning process (e.g. per-bot credentials).
84
- const envFlags = [];
85
- for (const key of TMUX_PASSTHROUGH_VARS) {
86
- const val = opts.env?.[key];
87
- if (val !== undefined) {
88
- envFlags.push('-e', `${key}=${val}`);
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
- '--', bin, ...args,
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: opts.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
- execSync(`tmux set-option -t ${t} status off`, { stdio: 'ignore' });
116
- execSync(`tmux set-option -t ${t} mouse on`, { stdio: 'ignore' });
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
- execFileSync('tmux', ['send-keys', '-t', this.sessionName, '-l', '--', text], {
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
- execFileSync('tmux', ['send-keys', '-t', this.sessionName, ...keys], {
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.sessionName], {
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.sessionName, '-X', xCommand], {
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.sessionName, '-d'], {
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
- const output = execSync(`tmux list-panes -t ${shellescape(this.sessionName)} -F '#{pane_pid}'`, { encoding: 'utf-8', timeout: 3000 }).trim();
208
- const pid = parseInt(output.split('\n')[0], 10);
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 { /* pane may not support zoom (single pane) — benign */ }
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
- * Env vars that must be explicitly passed to the tmux session command via -e.
278
- * The tmux server inherits env from the first session's creator; subsequent
279
- * sessions share that env. Per-bot vars (LARK credentials) would be wrong
280
- * for non-first bots without explicit passthrough.
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 TMUX_PASSTHROUGH_VARS = [
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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"}