handmux 0.33.3 → 0.34.0

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 (85) hide show
  1. package/dist/build-meta.json +3 -3
  2. package/dist/package.json +13 -13
  3. package/dist/public/assets/{abnfDiagram-O67JEVCF-DzcfOMEY.js → abnfDiagram-O67JEVCF-CfEOyxDH.js} +1 -1
  4. package/dist/public/assets/{arc-DilDrUip.js → arc-CWOmUQMu.js} +1 -1
  5. package/dist/public/assets/{architectureDiagram-NJMV4G6O-BKqsYDXc.js → architectureDiagram-NJMV4G6O-BkLlCd5w.js} +1 -1
  6. package/dist/public/assets/{blockDiagram-BEXU5L5S-SOU8LU5R.js → blockDiagram-BEXU5L5S-Ciuoprd6.js} +1 -1
  7. package/dist/public/assets/{c4Diagram-YGBWAQC7-jlEYAcK7.js → c4Diagram-YGBWAQC7-DM9-eJxf.js} +1 -1
  8. package/dist/public/assets/channel-Cci2XuJS.js +1 -0
  9. package/dist/public/assets/{chunk-2Q5K7J3B-EmZek5gL.js → chunk-2Q5K7J3B-D1c3AmPs.js} +1 -1
  10. package/dist/public/assets/{chunk-3FUC2YCW-vWSdv5T0.js → chunk-3FUC2YCW-Bl68bUES.js} +2 -2
  11. package/dist/public/assets/{chunk-5VM5RSS4-CTq93v-W.js → chunk-5VM5RSS4-X_LQ24Gn.js} +1 -1
  12. package/dist/public/assets/{chunk-GTNCS2PH-CAJcJM89.js → chunk-GTNCS2PH-CNEFfAzS.js} +1 -1
  13. package/dist/public/assets/{chunk-GWA4HPMP-DNGjRh2z.js → chunk-GWA4HPMP-C7DkZlNq.js} +1 -1
  14. package/dist/public/assets/{chunk-JWPE2WC7-V3f12iv4.js → chunk-JWPE2WC7-CMFCw_nU.js} +1 -1
  15. package/dist/public/assets/{chunk-NETBCI7D-DkFvLTBh.js → chunk-NETBCI7D-C5uY9Nj5.js} +1 -1
  16. package/dist/public/assets/{chunk-WEXAMYUT-C90Om8QA.js → chunk-WEXAMYUT-CyJYuumg.js} +1 -1
  17. package/dist/public/assets/{chunk-XXDRQBXY-DgJEqXMx.js → chunk-XXDRQBXY-Hhi1Qat7.js} +1 -1
  18. package/dist/public/assets/{classDiagram-v2-NBCMYWYE-CcVuk60h.js → classDiagram-v2-NBCMYWYE-CUVpgYkQ.js} +1 -1
  19. package/dist/public/assets/{cose-bilkent-JH36ORCC-QzlibSkL.js → cose-bilkent-JH36ORCC-CvKLCNyf.js} +1 -1
  20. package/dist/public/assets/{cynefin-OW5HDTMX-BdPWjKNn.js → cynefin-OW5HDTMX-BWav6_j0.js} +1 -1
  21. package/dist/public/assets/{cynefinDiagram-VND7K2PF-BYvDWk7H.js → cynefinDiagram-VND7K2PF-N-o2dJ6N.js} +1 -1
  22. package/dist/public/assets/{dagre-6A5THRUB-O0Rfcov2.js → dagre-6A5THRUB-MD8RkRhV.js} +1 -1
  23. package/dist/public/assets/{diagram-22UHCM2B-BSeOxvT0.js → diagram-22UHCM2B-GMOFN-eG.js} +1 -1
  24. package/dist/public/assets/{diagram-3UASUU5V-BXZ9aFB5.js → diagram-3UASUU5V-Dpldk42J.js} +1 -1
  25. package/dist/public/assets/{diagram-ATOU4E4O-gwdDj9oQ.js → diagram-ATOU4E4O-C8iQ5gco.js} +1 -1
  26. package/dist/public/assets/{diagram-CDSNMT55-DuiOYtlt.js → diagram-CDSNMT55-B9uLzKhV.js} +1 -1
  27. package/dist/public/assets/{diagram-MLGK6HIB-CknFpvvj.js → diagram-MLGK6HIB-DErxpCbQ.js} +1 -1
  28. package/dist/public/assets/{diagram-MPIPVDR6-DosvPFYV.js → diagram-MPIPVDR6-D2DFt4wW.js} +1 -1
  29. package/dist/public/assets/{ebnfDiagram-ZINNZB2B-BD02fFDy.js → ebnfDiagram-ZINNZB2B-CXdiw8VF.js} +1 -1
  30. package/dist/public/assets/{elk-276RUBZZ-Cz_rwa70.js → elk-276RUBZZ-B8THaPhk.js} +1 -1
  31. package/dist/public/assets/{erDiagram-OPXOYQCR-BW-0ErnE.js → erDiagram-OPXOYQCR-CB66OCnA.js} +1 -1
  32. package/dist/public/assets/{flowDiagram-KWPJA3E3-r23LuSoD.js → flowDiagram-KWPJA3E3-C9ZJri7o.js} +1 -1
  33. package/dist/public/assets/{ganttDiagram-FUAMR5RP-CpT6foaA.js → ganttDiagram-FUAMR5RP-CbCpJoQp.js} +1 -1
  34. package/dist/public/assets/{gitGraphDiagram-X574FWY7-1P5ZJ5NA.js → gitGraphDiagram-X574FWY7-B54Zfqy2.js} +1 -1
  35. package/dist/public/assets/index-Dp0a9bVz.css +32 -0
  36. package/dist/public/assets/index-bFpfaPZi.js +363 -0
  37. package/dist/public/assets/{infoDiagram-VRGFBTTK-D6_j45sr.js → infoDiagram-VRGFBTTK-Cm8cRNo1.js} +1 -1
  38. package/dist/public/assets/{ishikawaDiagram-OU5B5YK6-mWpWGOJC.js → ishikawaDiagram-OU5B5YK6-DDlIGelT.js} +1 -1
  39. package/dist/public/assets/{journeyDiagram-ZHPQQLJL-Ck9t_Cws.js → journeyDiagram-ZHPQQLJL-Bi3Itxu4.js} +1 -1
  40. package/dist/public/assets/{kanban-definition-PNTS6WVX-BrTVkHVx.js → kanban-definition-PNTS6WVX-DAMbX7MM.js} +1 -1
  41. package/dist/public/assets/{linear-FAIA063v.js → linear-MAhVrjlB.js} +1 -1
  42. package/dist/public/assets/{mermaid.core-yMH0alVZ.js → mermaid.core-DuEETMGj.js} +4 -4
  43. package/dist/public/assets/{mindmap-definition-NLK3R4M7-Bo2z5P7P.js → mindmap-definition-NLK3R4M7-BYstGJ4o.js} +1 -1
  44. package/dist/public/assets/{pegDiagram-GJSIUBJH-CCOnaekJ.js → pegDiagram-GJSIUBJH-DaHHVjAd.js} +1 -1
  45. package/dist/public/assets/{pieDiagram-5QR66LMP-sVXghfWy.js → pieDiagram-5QR66LMP-B1VuPvcW.js} +1 -1
  46. package/dist/public/assets/{quadrantDiagram-O4NWA36T-CQwZHV8P.js → quadrantDiagram-O4NWA36T-Cv0WKpnS.js} +1 -1
  47. package/dist/public/assets/{railroadDiagram-XR7U4H2S-OLkjMZrH.js → railroadDiagram-XR7U4H2S-B1bku2zK.js} +1 -1
  48. package/dist/public/assets/{requirementDiagram-PLB6GJNP-CQ0jcPXA.js → requirementDiagram-PLB6GJNP-C73LGTz4.js} +1 -1
  49. package/dist/public/assets/{sankeyDiagram-IPEJSGJF-ChBjgDzc.js → sankeyDiagram-IPEJSGJF-DsGIjgz6.js} +1 -1
  50. package/dist/public/assets/{sequenceDiagram-PO4LG4MO-D5qNos3-.js → sequenceDiagram-PO4LG4MO-CUYiZBzY.js} +1 -1
  51. package/dist/public/assets/{sizeCapture-INFHLROL-CSFFOw07.js → sizeCapture-INFHLROL-BZ66sANG.js} +1 -1
  52. package/dist/public/assets/{stateDiagram-v2-GCMORJYK-Cydkl0es.js → stateDiagram-v2-GCMORJYK-1ETj6tOy.js} +1 -1
  53. package/dist/public/assets/{swimlanes-2SLR337P-BB0rJ1sZ.js → swimlanes-2SLR337P-Ct6oNBoE.js} +1 -1
  54. package/dist/public/assets/swimlanesDiagram-TC7HE7FX-7GrZvyr4.js +8 -0
  55. package/dist/public/assets/{timeline-definition-EJHVYXUP-CId4BnZK.js → timeline-definition-EJHVYXUP-D0vSfYcC.js} +1 -1
  56. package/dist/public/assets/{usecaseDiagram-POWQR4AR-qbT3h8lp.js → usecaseDiagram-POWQR4AR-Dy0YO-j7.js} +1 -1
  57. package/dist/public/assets/{vennDiagram-UO4OBE2U-DOY2R4Gb.js → vennDiagram-UO4OBE2U-DkrJdx67.js} +1 -1
  58. package/dist/public/assets/{wardleyDiagram-VNRHLVJA-VCA2v6fy.js → wardleyDiagram-VNRHLVJA-CPuHAJIV.js} +1 -1
  59. package/dist/public/assets/{xychartDiagram-PMCCYNJV-oquZadS8.js → xychartDiagram-PMCCYNJV-BwwGXvBZ.js} +1 -1
  60. package/dist/public/index.html +2 -2
  61. package/dist/src/agent-runtime/adapter.js +1 -1
  62. package/dist/src/agent-runtime/builtinRuntime.js +50 -8
  63. package/dist/src/agent-runtime/conversation.js +99 -6
  64. package/dist/src/agent-runtime/conversationRestart.js +201 -0
  65. package/dist/src/agent-runtime/inbox.js +37 -6
  66. package/dist/src/agent-runtime/runtime.js +35 -2
  67. package/dist/src/agent-runtime/tmuxRuntime.js +86 -4
  68. package/dist/src/agents/codex.js +1 -0
  69. package/dist/src/agents/codexConversationRestart.js +655 -0
  70. package/dist/src/agents/codexRestartReceipt.js +243 -0
  71. package/dist/src/agents/nativeInbox.js +29 -10
  72. package/dist/src/agents/nativeInboxSources.js +9 -3
  73. package/dist/src/apiAccountProviders.js +2 -2
  74. package/dist/src/cli/tunlite.js +14 -4
  75. package/dist/src/codexAppServer.js +1 -0
  76. package/dist/src/routes/agents.js +71 -0
  77. package/dist/src/routes/terminal.js +10 -3
  78. package/dist/src/server.js +12 -0
  79. package/dist/src/terminalStream.js +19 -3
  80. package/dist/src/tmux/commands.js +27 -10
  81. package/package.json +4 -4
  82. package/dist/public/assets/channel-CwtCksJU.js +0 -1
  83. package/dist/public/assets/index-CCO6YrGs.css +0 -32
  84. package/dist/public/assets/index-paby27To.js +0 -199
  85. package/dist/public/assets/swimlanesDiagram-TC7HE7FX-BBvp48yM.js +0 -8
@@ -248,15 +248,22 @@ export async function sendText(paneId, text) {
248
248
  throw error;
249
249
  }
250
250
  }
251
+ const MAX_RAW_KEY_BYTES = 1024;
251
252
  export async function sendHexInput(paneId, hex) {
252
253
  if (!hex)
253
254
  return;
255
+ // tmux paste-buffer marks its payload as literal paste. Interactive programs then insert escape
256
+ // sequences and Backspace as visible characters instead of handling them as keys. xterm keyboard
257
+ // events are small; send those bytes as keys, while retaining the buffer path for bulk input.
258
+ const bytes = hex.match(/../g) || [];
259
+ if (bytes.length <= MAX_RAW_KEY_BYTES) {
260
+ await runTmux(['send-keys', '-t', paneId, '-H', ...bytes]);
261
+ return;
262
+ }
254
263
  const buffer = nextInputBufferName();
255
264
  try {
256
- // Raw terminal input can contain control sequences as well as UTF-8. Put the bytes in a tmux
257
- // buffer and paste them without `-p`, so tmux does not add bracketed-paste markers or force the
258
- // payload through the command argument parser. This is the same transport as sendText, while
259
- // preserving the direct terminal's raw-byte semantics.
265
+ // Bulk input can exceed tmux's command argument limit. The input queue caps each batch, so
266
+ // large text is sent through a tmux buffer without expanding every byte into an argument.
260
267
  await runTmuxWithInput(['load-buffer', '-b', buffer, '-'], Buffer.from(hex, 'hex'));
261
268
  await runTmux(['paste-buffer', '-d', '-b', buffer, '-t', paneId]);
262
269
  }
@@ -279,9 +286,13 @@ export async function sendKey(paneId, key) {
279
286
  // window — including the PC) until restoreWindowSize is called. Pass rows = null to change
280
287
  // only the column count and leave the height untouched.
281
288
  export async function resizeWindow(windowId, cols, rows) {
282
- const args = ['resize-window', '-t', windowId, '-x', String(cols)];
289
+ const args = ['resize-window', '-t', windowId];
290
+ if (cols != null)
291
+ args.push('-x', String(cols));
283
292
  if (rows != null)
284
293
  args.push('-y', String(rows));
294
+ if (cols == null && rows == null)
295
+ throw new Error('resize-window requires a width or height');
285
296
  await runTmux(args);
286
297
  }
287
298
  // Hand sizing back to the attached clients (tmux default), so the PC's terminal dictates
@@ -289,11 +300,17 @@ export async function resizeWindow(windowId, cols, rows) {
289
300
  export async function restoreWindowSize(windowId) {
290
301
  await runTmux(['set-window-option', '-t', windowId, 'window-size', 'latest']);
291
302
  }
292
- // Resize just one pane's width inside its window (siblings absorb the difference; the window
293
- // total is unchanged). Use this for a pane in a split — resizing the whole window would
294
- // shrink every pane. A lone pane can't be resized this way (it fills the window).
295
- export async function resizePane(paneId, cols) {
296
- await runTmux(['resize-pane', '-t', paneId, '-x', String(cols)]);
303
+ // Resize one pane along either or both axes inside its window (siblings absorb the difference).
304
+ // A lone pane can't be resized this way (it fills the window).
305
+ export async function resizePane(paneId, cols, rows) {
306
+ const args = ['resize-pane', '-t', paneId];
307
+ if (cols != null)
308
+ args.push('-x', String(cols));
309
+ if (rows != null)
310
+ args.push('-y', String(rows));
311
+ if (cols == null && rows == null)
312
+ throw new Error('resize-pane requires a width or height');
313
+ await runTmux(args);
297
314
  }
298
315
  // The window's exact pane arrangement, captured so "restore" can put a split back the way it
299
316
  // was after resizePane changed the ratio. resizePane doesn't touch window size, so window-size
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "handmux",
3
- "version": "0.33.3",
3
+ "version": "0.34.0",
4
4
  "description": "A mobile vibe-coding cockpit — built on tmux: drive your live session, Claude Code / Codex — anything a terminal can run — from your phone.",
5
5
  "type": "module",
6
6
  "license": "AGPL-3.0-only",
@@ -75,13 +75,13 @@
75
75
  "vitest": "^2.0.0"
76
76
  },
77
77
  "whatsNew": [
78
+ {"version":"0.34.0","date":"2026-10-12","zh":"Codex 会话重启 · 分屏尺寸与代码复制","en":"Codex session restart, pane sizing, and code copying"},
79
+ {"version":"0.33.4","date":"2026-10-10","zh":"修复终端实时连接、电脑键盘与 Codex 排队","en":"Fixes live terminal, desktop keys, and Codex queues"},
78
80
  {"version":"0.33.3","date":"2026-10-06","zh":"Claude 余额不足提示更明确","en":"Clearer Claude insufficient-balance errors"},
79
81
  {"version":"0.33.2","date":"2026-10-03","zh":"修复 v0.33.1 发布包的构建兼容问题","en":"Fixes build compatibility in the v0.33.1 package"},
80
82
  {"version":"0.33.1","date":"2026-10-02","zh":"对话复制和工作区操作更顺手","en":"Smoother conversation copying and workspace actions"},
81
83
  {"version":"0.33.0","date":"2026-09-30","zh":"终端路径高亮不再闪烁 · 服务更新提示更可靠","en":"Steady terminal paths · reliable service update prompts"},
82
84
  {"version":"0.32.1","date":"2026-09-28","zh":"抽屉与工作区切换更顺滑","en":"Smoother drawer and workspace switching"},
83
- {"version":"0.32.0","date":"2026-09-24","zh":"项目与会话导航全面升级 · 抽屉切换更顺滑","en":"Project and session navigation, rebuilt"},
84
- {"version":"0.31.1","date":"2026-09-22","zh":"忙时默认排队 · 被拒可重发","en":"Queue by default · refusals can be sent again"},
85
- {"version":"0.31.0","date":"2026-09-22","zh":"CodeBuddy 对话接入 · Agent 状态更可靠","en":"CodeBuddy chat support · more reliable Agent state"}
85
+ {"version":"0.32.0","date":"2026-09-24","zh":"项目与会话导航全面升级 · 抽屉切换更顺滑","en":"Project and session navigation, rebuilt"}
86
86
  ]
87
87
  }
@@ -1 +0,0 @@
1
- import{U as o,a as n}from"./mermaid.core-yMH0alVZ.js";const t=(r,a)=>o.lang.round(n.parse(r)[a]);export{t as c};