@cocorograph/hub-agent 0.6.92 → 0.6.93

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cocorograph/hub-agent",
3
- "version": "0.6.92",
3
+ "version": "0.6.93",
4
4
  "description": "Hub Hosted Cockpit のローカル常駐 agent。Hub と outbound WSS で接続し、ローカルの tmux/pty を中継する。",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",
package/src/main.mjs CHANGED
@@ -70,6 +70,7 @@ import {
70
70
  recoverTuiInput,
71
71
  removeWorktree as removeWorktreeDir,
72
72
  resumeWithMessage,
73
+ setSessionMouse,
73
74
  setTmuxGlobalEnv,
74
75
  setTuiEffort,
75
76
  setTuiModel,
@@ -1222,6 +1223,13 @@ async function dispatch(msg, ctx) {
1222
1223
  cols: msg.cols,
1223
1224
  rows: msg.rows,
1224
1225
  })
1226
+ // 接続端末の種別に応じて tmux mouse mode を出し分ける (スマホ=on /
1227
+ // デスクトップ=off)。boolean のときだけ上書きし、未指定 (旧フロント) は
1228
+ // createSession の既定値 (on) を尊重する。fire-and-forget で pty.ready を
1229
+ // 妨げない (失敗は setSessionMouse 内で warn 済み)。
1230
+ if (typeof msg.mouse === "boolean" && msg.session_name) {
1231
+ setSessionMouse(msg.session_name, msg.mouse, { logger: ctx.logger })
1232
+ }
1225
1233
  ctx.client.send({
1226
1234
  type: "pty.ready",
1227
1235
  stream_id,
package/src/tmux.mjs CHANGED
@@ -715,11 +715,16 @@ export async function createSession(name, cwd, opts = {}) {
715
715
  // has-session が非 0 = セッション無し
716
716
  }
717
717
  await execFileP(tmuxBin(opts), ["new-session", "-d", "-s", name, "-c", resolvedCwd])
718
- // Cockpit web UI からの touch swipe (= SGR wheel escape) tmux に拾わせるため、
719
- // 当該 session で mouse mode を ON にする。tmux 2.1+ で `mouse` option は
720
- // session-scoped、`-t <session>` 指定で他 session への副作用なし。
721
- // ユーザーの ~/.tmux.conf を編集せずに済む方式。失敗してもセッション起動自体は
722
- // 妨げないように warn のみで握り潰す。
718
+ // 既定では mouse mode ON にする (スマホの touch swipe SGR wheel escape を
719
+ // tmux copy-mode スクロールとして拾えるようにするため)。tmux 2.1+ で `mouse`
720
+ // option は session-scoped、`-t <session>` 指定で他 session への副作用なし。
721
+ //
722
+ // ⚠️ ただしこれは「初期既定値」にすぎない。実際の値は接続してきた端末に応じて
723
+ // pty.attach 時に setSessionMouse() で上書きされる: デスクトップ attach は off
724
+ // (= マウスのドラッグを xterm のローカル選択にして、コピー奪取・button release
725
+ // 取りこぼしによる操作不能を防ぐ。0.5.11 で全 session を mouse on にしたことが
726
+ // デスクトップのドラッグ選択を壊した回帰の修正)。スマホ attach は on のまま。
727
+ // 旧フロント (mouse フィールド未送信) はこの既定値 on がそのまま使われる。
723
728
  try {
724
729
  await execFileP(tmuxBin(opts), ["set-option", "-t", name, "mouse", "on"])
725
730
  } catch (err) {
@@ -764,6 +769,27 @@ export async function createSession(name, cwd, opts = {}) {
764
769
  }
765
770
  }
766
771
 
772
+ /**
773
+ * 指定 session の tmux mouse mode を on/off する。pty.attach 時に接続端末の
774
+ * 種別に応じて呼ぶ (デスクトップ=off / スマホ=on)。失敗してもセッションの
775
+ * 基本機能は動くので warn のみで握り潰す。
776
+ * @param {string} name session 名
777
+ * @param {boolean} on true=mouse on / false=mouse off
778
+ * @param {{logger?: any, tmuxBin?: string}} [opts]
779
+ */
780
+ export async function setSessionMouse(name, on, opts = {}) {
781
+ if (!name) return
782
+ const value = on ? "on" : "off"
783
+ try {
784
+ await execFileP(tmuxBin(opts), ["set-option", "-t", name, "mouse", value])
785
+ } catch (err) {
786
+ opts.logger?.warn?.(
787
+ { session: name, mouse: value, err: err?.message || String(err) },
788
+ "tmux set-option mouse failed",
789
+ )
790
+ }
791
+ }
792
+
767
793
  /** session_id として安全な形だけ許可する (send-keys へ流すためコマンド注入を防ぐ)。
768
794
  * Claude の session_id は UUID (ASCII 英数 + ハイフン) なので、それ以外は弾く。 */
769
795
  export function isSafeSessionId(sessionId) {