claude-mux 0.7.1 → 0.9.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 (746) hide show
  1. package/.github/workflows/release.yml +59 -0
  2. package/CLAUDE.md +38 -13
  3. package/CONTEXT.md +23 -0
  4. package/README.md +100 -257
  5. package/dist/agents.d.ts +12 -0
  6. package/dist/agents.d.ts.map +1 -0
  7. package/dist/agents.js +28 -0
  8. package/dist/agents.js.map +1 -0
  9. package/dist/cli.js +10 -2
  10. package/dist/cli.js.map +1 -1
  11. package/dist/commands/capture.d.ts +3 -0
  12. package/dist/commands/capture.d.ts.map +1 -0
  13. package/dist/commands/capture.js +33 -0
  14. package/dist/commands/capture.js.map +1 -0
  15. package/dist/commands/index.d.ts +8 -0
  16. package/dist/commands/index.d.ts.map +1 -1
  17. package/dist/commands/index.js +8 -0
  18. package/dist/commands/index.js.map +1 -1
  19. package/dist/commands/new-session.d.ts +3 -0
  20. package/dist/commands/new-session.d.ts.map +1 -0
  21. package/dist/commands/new-session.js +98 -0
  22. package/dist/commands/new-session.js.map +1 -0
  23. package/dist/commands/resolve-session.d.ts +15 -0
  24. package/dist/commands/resolve-session.d.ts.map +1 -0
  25. package/dist/commands/resolve-session.js +37 -0
  26. package/dist/commands/resolve-session.js.map +1 -0
  27. package/dist/commands/send.d.ts +3 -0
  28. package/dist/commands/send.d.ts.map +1 -0
  29. package/dist/commands/send.js +67 -0
  30. package/dist/commands/send.js.map +1 -0
  31. package/dist/commands/serve.d.ts.map +1 -1
  32. package/dist/commands/serve.js +4 -3
  33. package/dist/commands/serve.js.map +1 -1
  34. package/dist/commands/service.d.ts +3 -0
  35. package/dist/commands/service.d.ts.map +1 -0
  36. package/dist/commands/service.js +154 -0
  37. package/dist/commands/service.js.map +1 -0
  38. package/dist/commands/setup.d.ts +0 -1
  39. package/dist/commands/setup.d.ts.map +1 -1
  40. package/dist/commands/setup.js +5 -5
  41. package/dist/commands/setup.js.map +1 -1
  42. package/dist/commands/status.d.ts +3 -0
  43. package/dist/commands/status.d.ts.map +1 -0
  44. package/dist/commands/status.js +21 -0
  45. package/dist/commands/status.js.map +1 -0
  46. package/dist/commands/tui.d.ts.map +1 -1
  47. package/dist/commands/tui.js +36 -22
  48. package/dist/commands/tui.js.map +1 -1
  49. package/dist/commands/update.d.ts +8 -0
  50. package/dist/commands/update.d.ts.map +1 -0
  51. package/dist/commands/update.js +122 -0
  52. package/dist/commands/update.js.map +1 -0
  53. package/dist/commands/wait-idle.d.ts +3 -0
  54. package/dist/commands/wait-idle.d.ts.map +1 -0
  55. package/dist/commands/wait-idle.js +66 -0
  56. package/dist/commands/wait-idle.js.map +1 -0
  57. package/dist/db/index.d.ts +1 -1
  58. package/dist/db/index.d.ts.map +1 -1
  59. package/dist/db/index.js +1 -1
  60. package/dist/db/index.js.map +1 -1
  61. package/dist/db/sessions-json.d.ts +21 -3
  62. package/dist/db/sessions-json.d.ts.map +1 -1
  63. package/dist/db/sessions-json.js +73 -19
  64. package/dist/db/sessions-json.js.map +1 -1
  65. package/dist/hooks/claude-mux-hook.js +148 -25
  66. package/dist/hooks/claude-mux-hook.js.map +1 -1
  67. package/dist/server/attachments.d.ts +26 -0
  68. package/dist/server/attachments.d.ts.map +1 -0
  69. package/dist/server/attachments.js +60 -0
  70. package/dist/server/attachments.js.map +1 -0
  71. package/dist/server/message-queue.d.ts +39 -0
  72. package/dist/server/message-queue.d.ts.map +1 -0
  73. package/dist/server/message-queue.js +143 -0
  74. package/dist/server/message-queue.js.map +1 -0
  75. package/dist/server/ws-handlers.d.ts +33 -81
  76. package/dist/server/ws-handlers.d.ts.map +1 -1
  77. package/dist/server/ws-handlers.js +320 -321
  78. package/dist/server/ws-handlers.js.map +1 -1
  79. package/dist/setup/hooks.d.ts +8 -2
  80. package/dist/setup/hooks.d.ts.map +1 -1
  81. package/dist/setup/hooks.js +48 -20
  82. package/dist/setup/hooks.js.map +1 -1
  83. package/dist/setup/wizard.d.ts +3 -1
  84. package/dist/setup/wizard.d.ts.map +1 -1
  85. package/dist/setup/wizard.js +9 -9
  86. package/dist/setup/wizard.js.map +1 -1
  87. package/dist/tmux/pane.d.ts +17 -12
  88. package/dist/tmux/pane.d.ts.map +1 -1
  89. package/dist/tmux/pane.js +60 -36
  90. package/dist/tmux/pane.js.map +1 -1
  91. package/dist/types/ws-messages.d.ts +216 -0
  92. package/dist/types/ws-messages.d.ts.map +1 -0
  93. package/dist/types/ws-messages.js +71 -0
  94. package/dist/types/ws-messages.js.map +1 -0
  95. package/dist/utils/paths.d.ts +3 -1
  96. package/dist/utils/paths.d.ts.map +1 -1
  97. package/dist/utils/paths.js +24 -3
  98. package/dist/utils/paths.js.map +1 -1
  99. package/dist/utils/slug.d.ts +3 -0
  100. package/dist/utils/slug.d.ts.map +1 -0
  101. package/dist/utils/slug.js +6 -0
  102. package/dist/utils/slug.js.map +1 -0
  103. package/dist/utils/version.d.ts +1 -1
  104. package/dist/utils/version.js +1 -1
  105. package/dist/web/client/_app/immutable/assets/0._7q2-APf.css +1 -0
  106. package/dist/web/client/_app/immutable/assets/3.luY-vLwW.css +1 -0
  107. package/dist/web/client/_app/immutable/assets/AllSessionsPanel.Chdj8GD8.css +1 -0
  108. package/dist/web/client/_app/immutable/chunks/BIuG5Qqu.js +1 -0
  109. package/dist/web/client/_app/immutable/chunks/Bj8d0LuM.js +1 -0
  110. package/dist/web/client/_app/immutable/chunks/CGb10hB5.js +1 -0
  111. package/dist/web/client/_app/immutable/chunks/ClwveEwa.js +3 -0
  112. package/dist/web/client/_app/immutable/chunks/Cq1Dbx4Z.js +1 -0
  113. package/dist/web/client/_app/immutable/chunks/D7LHlC1M.js +2 -0
  114. package/dist/web/client/_app/immutable/chunks/DJ24Tldm.js +69 -0
  115. package/dist/web/client/_app/immutable/entry/app.--CjzkSO.js +2 -0
  116. package/dist/web/client/_app/immutable/entry/start.D4AuhR4O.js +1 -0
  117. package/dist/web/client/_app/immutable/nodes/0.BA0ffjuI.js +1 -0
  118. package/dist/web/client/_app/immutable/nodes/1.0vn7u2tx.js +1 -0
  119. package/dist/web/client/_app/immutable/nodes/2.BdBKTxl6.js +1 -0
  120. package/dist/web/client/_app/immutable/nodes/3.DqYZlAWl.js +98 -0
  121. package/dist/web/client/_app/version.json +1 -1
  122. package/dist/web/client/favicon.svg +22 -0
  123. package/dist/web/server/chunks/0-DjVZUt8p.js +40 -0
  124. package/dist/web/server/chunks/0-DjVZUt8p.js.map +1 -0
  125. package/dist/web/server/chunks/{1-CPgO8U7d.js → 1-DAqMo8Wb.js} +7 -8
  126. package/dist/web/server/chunks/1-DAqMo8Wb.js.map +1 -0
  127. package/dist/web/server/chunks/2-CR4pAIvi.js +19 -0
  128. package/dist/web/server/chunks/2-CR4pAIvi.js.map +1 -0
  129. package/dist/web/server/chunks/3-Bkv2-jfN.js +24 -0
  130. package/dist/web/server/chunks/3-Bkv2-jfN.js.map +1 -0
  131. package/dist/web/server/chunks/_layout.svelte-yoaT7ri1.js +3358 -0
  132. package/dist/web/server/chunks/_layout.svelte-yoaT7ri1.js.map +1 -0
  133. package/dist/web/server/chunks/_page.svelte-CREhk3v0.js +19 -0
  134. package/dist/web/server/chunks/_page.svelte-CREhk3v0.js.map +1 -0
  135. package/dist/web/server/chunks/_page.svelte-DtdzlL3m.js +1392 -0
  136. package/dist/web/server/chunks/_page.svelte-DtdzlL3m.js.map +1 -0
  137. package/dist/web/server/chunks/_server.ts-B-6emYlG.js +63 -0
  138. package/dist/web/server/chunks/_server.ts-B-6emYlG.js.map +1 -0
  139. package/dist/web/server/chunks/{_server.ts-Df2isGQc.js → _server.ts-B2vhCPsh.js} +6 -5
  140. package/dist/web/server/chunks/_server.ts-B2vhCPsh.js.map +1 -0
  141. package/dist/web/server/chunks/_server.ts-B4o51l3m.js +19 -0
  142. package/dist/web/server/chunks/_server.ts-B4o51l3m.js.map +1 -0
  143. package/dist/web/server/chunks/{_server.ts-BVHUS8fm.js → _server.ts-BEQA_put.js} +4 -5
  144. package/dist/web/server/chunks/{_server.ts-BVHUS8fm.js.map → _server.ts-BEQA_put.js.map} +1 -1
  145. package/dist/web/server/chunks/{_server.ts-CR0uWvpz.js → _server.ts-BUOOqQRk.js} +4 -5
  146. package/dist/web/server/chunks/{_server.ts-CR0uWvpz.js.map → _server.ts-BUOOqQRk.js.map} +1 -1
  147. package/dist/web/server/chunks/_server.ts-Bkk6XA1G.js +48 -0
  148. package/dist/web/server/chunks/_server.ts-Bkk6XA1G.js.map +1 -0
  149. package/dist/web/server/chunks/{_server.ts-BUKgRb6U.js → _server.ts-Bp8qgUhz.js} +5 -4
  150. package/dist/web/server/chunks/_server.ts-Bp8qgUhz.js.map +1 -0
  151. package/dist/web/server/chunks/_server.ts-CTIiLzg9.js +35 -0
  152. package/dist/web/server/chunks/_server.ts-CTIiLzg9.js.map +1 -0
  153. package/dist/web/server/chunks/{_server.ts-3WAmKvn2.js → _server.ts-ChuAmmhw.js} +8 -6
  154. package/dist/web/server/chunks/_server.ts-ChuAmmhw.js.map +1 -0
  155. package/dist/web/server/chunks/{_server.ts-WldRpSRi.js → _server.ts-CkC3JTyo.js} +4 -4
  156. package/dist/web/server/chunks/_server.ts-CkC3JTyo.js.map +1 -0
  157. package/dist/web/server/chunks/_server.ts-Cy0wvEJk.js +78 -0
  158. package/dist/web/server/chunks/_server.ts-Cy0wvEJk.js.map +1 -0
  159. package/dist/web/server/chunks/{_server.ts-CDAUUmG_.js → _server.ts-D0ylgRRV.js} +4 -5
  160. package/dist/web/server/chunks/{_server.ts-CDAUUmG_.js.map → _server.ts-D0ylgRRV.js.map} +1 -1
  161. package/dist/web/server/chunks/{_server.ts-DdbOAkOj.js → _server.ts-DIhiJl4f.js} +7 -7
  162. package/dist/web/server/chunks/_server.ts-DIhiJl4f.js.map +1 -0
  163. package/dist/web/server/chunks/_server.ts-DK7C_rXn.js +93 -0
  164. package/dist/web/server/chunks/_server.ts-DK7C_rXn.js.map +1 -0
  165. package/dist/web/server/chunks/{_server.ts-BAWJCSFb.js → _server.ts-DLI_Pwvd.js} +3 -4
  166. package/dist/web/server/chunks/{_server.ts-BAWJCSFb.js.map → _server.ts-DLI_Pwvd.js.map} +1 -1
  167. package/dist/web/server/chunks/_server.ts-Dj_iwP-Z.js +59 -0
  168. package/dist/web/server/chunks/_server.ts-Dj_iwP-Z.js.map +1 -0
  169. package/dist/web/server/chunks/{_server.ts-C4oPmOJR.js → _server.ts-DyeW0P3w.js} +3 -4
  170. package/dist/web/server/chunks/_server.ts-DyeW0P3w.js.map +1 -0
  171. package/dist/web/server/chunks/_server.ts-ZObkLZOS.js +25 -0
  172. package/dist/web/server/chunks/_server.ts-ZObkLZOS.js.map +1 -0
  173. package/dist/web/server/chunks/_server.ts-eFJEOOS1.js +45 -0
  174. package/dist/web/server/chunks/_server.ts-eFJEOOS1.js.map +1 -0
  175. package/dist/web/server/chunks/agents-rTKwF5qh.js +42 -0
  176. package/dist/web/server/chunks/agents-rTKwF5qh.js.map +1 -0
  177. package/dist/web/server/chunks/attachments-B8VMrOm4.js +42 -0
  178. package/dist/web/server/chunks/attachments-B8VMrOm4.js.map +1 -0
  179. package/dist/web/server/chunks/button-BKSlzQeg.js +8309 -0
  180. package/dist/web/server/chunks/button-BKSlzQeg.js.map +1 -0
  181. package/dist/web/server/chunks/{chunks-DmdqVYC7.js → chunks-DLJ18IUO.js} +3 -4
  182. package/dist/web/server/chunks/chunks-DLJ18IUO.js.map +1 -0
  183. package/dist/web/server/chunks/{client-CUrSQijh.js → client-Dnt8rmsr.js} +5 -4
  184. package/dist/web/server/chunks/client-Dnt8rmsr.js.map +1 -0
  185. package/dist/web/server/chunks/constants-CZFdiL46.js +10 -0
  186. package/dist/web/server/chunks/constants-CZFdiL46.js.map +1 -0
  187. package/dist/web/server/chunks/{error.svelte-D-c-9pTE.js → error.svelte-VCYDSS3H.js} +5 -7
  188. package/dist/web/server/chunks/error.svelte-VCYDSS3H.js.map +1 -0
  189. package/dist/web/server/chunks/{exports-CCurQ-Tl.js → exports-DLCVjVJM.js} +13 -34
  190. package/dist/web/server/chunks/exports-DLCVjVJM.js.map +1 -0
  191. package/dist/web/server/chunks/{hooks.server-BK1bopsh.js → hooks.server-CzdMWOsb.js} +11 -28
  192. package/dist/web/server/chunks/hooks.server-CzdMWOsb.js.map +1 -0
  193. package/dist/web/server/chunks/{internal-DLENj6YI.js → internal-CwN2I5C2.js} +8 -3
  194. package/dist/web/server/chunks/internal-CwN2I5C2.js.map +1 -0
  195. package/dist/web/server/chunks/message-queue-BhryIx7W.js +119 -0
  196. package/dist/web/server/chunks/message-queue-BhryIx7W.js.map +1 -0
  197. package/dist/web/server/chunks/popover-trigger-BQJRZ2Xv.js +5659 -0
  198. package/dist/web/server/chunks/popover-trigger-BQJRZ2Xv.js.map +1 -0
  199. package/dist/web/server/chunks/root-L_UzGTpb.js +4238 -0
  200. package/dist/web/server/chunks/root-L_UzGTpb.js.map +1 -0
  201. package/dist/web/server/chunks/{sessions-json-DgfkCLO7.js → sessions-json-w9KPwiDl.js} +79 -23
  202. package/dist/web/server/chunks/sessions-json-w9KPwiDl.js.map +1 -0
  203. package/dist/web/server/chunks/shared-server-CB2NTyFt.js +13 -0
  204. package/dist/web/server/chunks/shared-server-CB2NTyFt.js.map +1 -0
  205. package/dist/web/server/chunks/state.svelte-DM05ho1v.js +8 -0
  206. package/dist/web/server/chunks/state.svelte-DM05ho1v.js.map +1 -0
  207. package/dist/web/server/chunks/{ws-handlers-B4r5eSP2.js → ws-handlers-B_p_71BD.js} +346 -268
  208. package/dist/web/server/chunks/ws-handlers-B_p_71BD.js.map +1 -0
  209. package/dist/web/server/chunks/ws-managers-B0N9UU0g.js +12 -0
  210. package/dist/web/server/chunks/ws-managers-B0N9UU0g.js.map +1 -0
  211. package/dist/web/server/index.js +1226 -1718
  212. package/dist/web/server/index.js.map +1 -1
  213. package/dist/web/server/manifest.js +98 -62
  214. package/dist/web/server/manifest.js.map +1 -1
  215. package/docs/adr/0001-attachments-stored-in-home-dir.md +45 -0
  216. package/docs/adr/0002-attachment-files-deleted-only-on-session-kill.md +47 -0
  217. package/docs/images/desktop-dashboard.png +0 -0
  218. package/docs/images/desktop-session.png +0 -0
  219. package/docs/images/mobile-dashboard.png +0 -0
  220. package/docs/images/mobile-session.png +0 -0
  221. package/package.json +6 -4
  222. package/scripts/install.sh +85 -0
  223. package/src/agents.ts +39 -0
  224. package/src/cli.ts +17 -1
  225. package/src/commands/capture.ts +38 -0
  226. package/src/commands/index.ts +8 -0
  227. package/src/commands/new-session.ts +114 -0
  228. package/src/commands/resolve-session.ts +42 -0
  229. package/src/commands/send.ts +81 -0
  230. package/src/commands/serve.ts +5 -3
  231. package/src/commands/service.ts +180 -0
  232. package/src/commands/setup.ts +5 -6
  233. package/src/commands/status.ts +24 -0
  234. package/src/commands/tui.ts +39 -22
  235. package/src/commands/update.ts +134 -0
  236. package/src/commands/wait-idle.ts +84 -0
  237. package/src/db/index.ts +5 -0
  238. package/src/db/sessions-json.ts +87 -21
  239. package/src/hooks/claude-mux-hook.ts +158 -30
  240. package/src/server/attachments.ts +64 -0
  241. package/src/server/message-queue.ts +176 -0
  242. package/src/server/ws-handlers.ts +352 -405
  243. package/src/setup/hooks.ts +58 -22
  244. package/src/setup/wizard.ts +9 -9
  245. package/src/tmux/pane.ts +71 -37
  246. package/src/types/ws-messages.ts +87 -0
  247. package/src/utils/paths.ts +24 -4
  248. package/src/utils/slug.ts +6 -0
  249. package/src/utils/version.ts +1 -1
  250. package/steamdeck/build/icon-1024.png +0 -0
  251. package/steamdeck/build/icon.png +0 -0
  252. package/steamdeck/main.js +35 -0
  253. package/steamdeck/package.json +46 -0
  254. package/steamdeck/scripts/release.ts +36 -0
  255. package/web/.env.example +4 -0
  256. package/web/.svelte-kit/adapter-bun/.vite/manifest.json +180 -161
  257. package/web/.svelte-kit/adapter-bun/_app/immutable/assets/AllSessionsPanel.hZMOJZyZ.css +1 -0
  258. package/web/.svelte-kit/adapter-bun/_app/immutable/assets/_layout.OA9bot5w.css +1 -0
  259. package/web/.svelte-kit/adapter-bun/_app/immutable/assets/_page.luY-vLwW.css +1 -0
  260. package/web/.svelte-kit/adapter-bun/_app/immutable/assets/_page.s6Kx4oz1.css +1 -0
  261. package/web/.svelte-kit/adapter-bun/chunks/agents.js +32 -0
  262. package/web/.svelte-kit/adapter-bun/chunks/attachments.js +38 -0
  263. package/web/.svelte-kit/adapter-bun/chunks/button.js +422 -4
  264. package/web/.svelte-kit/adapter-bun/chunks/client.js +1 -0
  265. package/web/.svelte-kit/adapter-bun/chunks/constants.js +9 -0
  266. package/web/.svelte-kit/adapter-bun/chunks/environment.js +3 -3
  267. package/web/.svelte-kit/adapter-bun/chunks/exports.js +9 -9
  268. package/web/.svelte-kit/adapter-bun/chunks/index.js +1 -2
  269. package/web/.svelte-kit/adapter-bun/chunks/internal.js +7 -800
  270. package/web/.svelte-kit/adapter-bun/chunks/message-queue.js +114 -0
  271. package/web/.svelte-kit/adapter-bun/chunks/popover-trigger.js +6801 -0
  272. package/web/.svelte-kit/adapter-bun/chunks/render-context.js +602 -0
  273. package/web/.svelte-kit/{output/server/chunks/index2.js → adapter-bun/chunks/root.js} +2231 -727
  274. package/web/.svelte-kit/adapter-bun/chunks/sessions-json.js +87 -22
  275. package/web/.svelte-kit/adapter-bun/chunks/shared-server.js +14 -0
  276. package/web/.svelte-kit/adapter-bun/chunks/shared.js +993 -53
  277. package/web/.svelte-kit/adapter-bun/chunks/state.svelte.js +4 -2
  278. package/web/.svelte-kit/adapter-bun/chunks/utils.js +3 -5
  279. package/web/.svelte-kit/adapter-bun/chunks/ws-handlers.js +380 -299
  280. package/web/.svelte-kit/adapter-bun/chunks/ws-managers.js +12 -0
  281. package/web/.svelte-kit/adapter-bun/entries/endpoints/api/health/_server.ts.js +2 -1
  282. package/web/.svelte-kit/adapter-bun/entries/endpoints/api/projects/new-session/_server.ts.js +65 -25
  283. package/web/.svelte-kit/adapter-bun/entries/endpoints/api/servers/discover/_server.ts.js +50 -0
  284. package/web/.svelte-kit/adapter-bun/entries/endpoints/api/sessions/_id_/_server.ts.js +1 -1
  285. package/web/.svelte-kit/adapter-bun/entries/endpoints/api/sessions/_id_/attach/_server.ts.js +74 -0
  286. package/web/.svelte-kit/adapter-bun/entries/endpoints/api/sessions/_id_/kill/_server.ts.js +4 -1
  287. package/web/.svelte-kit/adapter-bun/entries/endpoints/api/sessions/_id_/queue/_server.ts.js +65 -0
  288. package/web/.svelte-kit/adapter-bun/entries/endpoints/api/sessions/_id_/rename/_server.ts.js +32 -0
  289. package/web/.svelte-kit/adapter-bun/entries/endpoints/api/sessions/_id_/restart/_server.ts.js +2 -0
  290. package/web/.svelte-kit/adapter-bun/entries/endpoints/api/sessions/_id_/screenshots/_server.ts.js +1 -1
  291. package/web/.svelte-kit/adapter-bun/entries/endpoints/api/sessions/_id_/send/_server.ts.js +31 -13
  292. package/web/.svelte-kit/adapter-bun/entries/endpoints/api/sessions/_id_/voice/_server.ts.js +86 -0
  293. package/web/.svelte-kit/adapter-bun/entries/endpoints/api/sessions/_server.ts.js +4 -36
  294. package/web/.svelte-kit/adapter-bun/entries/endpoints/api/sessions/_target_/output/_server.ts.js +1 -1
  295. package/web/.svelte-kit/adapter-bun/entries/endpoints/api/tmux/panes/_server.ts.js +3 -3
  296. package/web/.svelte-kit/adapter-bun/entries/endpoints/downloads/_file_/_server.ts.js +20 -0
  297. package/web/.svelte-kit/adapter-bun/entries/fallbacks/error.svelte.js +1 -1
  298. package/web/.svelte-kit/adapter-bun/entries/hooks.server.js +9 -29
  299. package/web/.svelte-kit/adapter-bun/entries/pages/_layout.server.ts.js +9 -0
  300. package/web/.svelte-kit/adapter-bun/entries/pages/_layout.svelte.js +3588 -369
  301. package/web/.svelte-kit/adapter-bun/entries/pages/_page.svelte.js +13 -3045
  302. package/web/.svelte-kit/adapter-bun/entries/pages/session/_target_/_page.svelte.js +1186 -455
  303. package/web/.svelte-kit/adapter-bun/entries/pages/session/_target_/_page.ts.js +4 -0
  304. package/web/.svelte-kit/adapter-bun/index.js +892 -472
  305. package/web/.svelte-kit/adapter-bun/internal.js +9 -7
  306. package/web/.svelte-kit/adapter-bun/manifest-full.js +45 -32
  307. package/web/.svelte-kit/adapter-bun/manifest.js +45 -32
  308. package/web/.svelte-kit/adapter-bun/nodes/0.js +5 -3
  309. package/web/.svelte-kit/adapter-bun/nodes/1.js +1 -1
  310. package/web/.svelte-kit/adapter-bun/nodes/2.js +2 -2
  311. package/web/.svelte-kit/adapter-bun/nodes/3.js +9 -6
  312. package/web/.svelte-kit/adapter-bun/remote-entry.js +530 -131
  313. package/web/.svelte-kit/ambient.d.ts +347 -88
  314. package/web/.svelte-kit/generated/client/app.js +3 -5
  315. package/web/.svelte-kit/generated/client/nodes/1.js +1 -1
  316. package/web/.svelte-kit/generated/client/nodes/3.js +3 -1
  317. package/web/.svelte-kit/generated/client-optimized/app.js +3 -5
  318. package/web/.svelte-kit/generated/client-optimized/nodes/1.js +1 -1
  319. package/web/.svelte-kit/generated/client-optimized/nodes/3.js +3 -1
  320. package/web/.svelte-kit/generated/server/internal.js +4 -3
  321. package/web/.svelte-kit/non-ambient.d.ts +19 -9
  322. package/web/.svelte-kit/output/client/.vite/manifest.json +72 -120
  323. package/web/.svelte-kit/output/client/_app/immutable/assets/0._7q2-APf.css +1 -0
  324. package/web/.svelte-kit/output/client/_app/immutable/assets/3.luY-vLwW.css +1 -0
  325. package/web/.svelte-kit/output/client/_app/immutable/assets/AllSessionsPanel.Chdj8GD8.css +1 -0
  326. package/web/.svelte-kit/output/client/_app/immutable/chunks/BIuG5Qqu.js +1 -0
  327. package/web/.svelte-kit/output/client/_app/immutable/chunks/Bj8d0LuM.js +1 -0
  328. package/web/.svelte-kit/output/client/_app/immutable/chunks/CGb10hB5.js +1 -0
  329. package/web/.svelte-kit/output/client/_app/immutable/chunks/ClwveEwa.js +3 -0
  330. package/web/.svelte-kit/output/client/_app/immutable/chunks/Cq1Dbx4Z.js +1 -0
  331. package/web/.svelte-kit/output/client/_app/immutable/chunks/D7LHlC1M.js +2 -0
  332. package/web/.svelte-kit/output/client/_app/immutable/chunks/DJ24Tldm.js +69 -0
  333. package/web/.svelte-kit/output/client/_app/immutable/entry/app.--CjzkSO.js +2 -0
  334. package/web/.svelte-kit/output/client/_app/immutable/entry/start.D4AuhR4O.js +1 -0
  335. package/web/.svelte-kit/output/client/_app/immutable/nodes/0.BA0ffjuI.js +1 -0
  336. package/web/.svelte-kit/output/client/_app/immutable/nodes/1.0vn7u2tx.js +1 -0
  337. package/web/.svelte-kit/output/client/_app/immutable/nodes/2.BdBKTxl6.js +1 -0
  338. package/web/.svelte-kit/output/client/_app/immutable/nodes/3.DqYZlAWl.js +98 -0
  339. package/web/.svelte-kit/output/client/_app/version.json +1 -1
  340. package/web/.svelte-kit/output/client/favicon.svg +22 -0
  341. package/web/.svelte-kit/output/server/.vite/manifest.json +180 -161
  342. package/web/.svelte-kit/output/server/_app/immutable/assets/AllSessionsPanel.hZMOJZyZ.css +1 -0
  343. package/web/.svelte-kit/output/server/_app/immutable/assets/_layout.OA9bot5w.css +1 -0
  344. package/web/.svelte-kit/output/server/_app/immutable/assets/_page.luY-vLwW.css +1 -0
  345. package/web/.svelte-kit/output/server/_app/immutable/assets/_page.s6Kx4oz1.css +1 -0
  346. package/web/.svelte-kit/output/server/chunks/agents.js +32 -0
  347. package/web/.svelte-kit/output/server/chunks/attachments.js +38 -0
  348. package/web/.svelte-kit/output/server/chunks/button.js +422 -4
  349. package/web/.svelte-kit/output/server/chunks/client.js +1 -0
  350. package/web/.svelte-kit/output/server/chunks/constants.js +9 -0
  351. package/web/.svelte-kit/output/server/chunks/environment.js +3 -3
  352. package/web/.svelte-kit/output/server/chunks/exports.js +9 -9
  353. package/web/.svelte-kit/output/server/chunks/index.js +1 -2
  354. package/web/.svelte-kit/output/server/chunks/internal.js +7 -800
  355. package/web/.svelte-kit/output/server/chunks/message-queue.js +114 -0
  356. package/web/.svelte-kit/output/server/chunks/popover-trigger.js +6801 -0
  357. package/web/.svelte-kit/output/server/chunks/render-context.js +602 -0
  358. package/web/.svelte-kit/{adapter-bun/chunks/index2.js → output/server/chunks/root.js} +2231 -727
  359. package/web/.svelte-kit/output/server/chunks/sessions-json.js +87 -22
  360. package/web/.svelte-kit/output/server/chunks/shared-server.js +14 -0
  361. package/web/.svelte-kit/output/server/chunks/shared.js +993 -53
  362. package/web/.svelte-kit/output/server/chunks/state.svelte.js +4 -2
  363. package/web/.svelte-kit/output/server/chunks/utils.js +3 -5
  364. package/web/.svelte-kit/output/server/chunks/ws-handlers.js +380 -299
  365. package/web/.svelte-kit/output/server/chunks/ws-managers.js +12 -0
  366. package/web/.svelte-kit/output/server/entries/endpoints/api/health/_server.ts.js +2 -1
  367. package/web/.svelte-kit/output/server/entries/endpoints/api/projects/new-session/_server.ts.js +65 -25
  368. package/web/.svelte-kit/output/server/entries/endpoints/api/servers/discover/_server.ts.js +50 -0
  369. package/web/.svelte-kit/output/server/entries/endpoints/api/sessions/_id_/_server.ts.js +1 -1
  370. package/web/.svelte-kit/output/server/entries/endpoints/api/sessions/_id_/attach/_server.ts.js +74 -0
  371. package/web/.svelte-kit/output/server/entries/endpoints/api/sessions/_id_/kill/_server.ts.js +4 -1
  372. package/web/.svelte-kit/output/server/entries/endpoints/api/sessions/_id_/queue/_server.ts.js +65 -0
  373. package/web/.svelte-kit/output/server/entries/endpoints/api/sessions/_id_/rename/_server.ts.js +32 -0
  374. package/web/.svelte-kit/output/server/entries/endpoints/api/sessions/_id_/restart/_server.ts.js +2 -0
  375. package/web/.svelte-kit/output/server/entries/endpoints/api/sessions/_id_/screenshots/_server.ts.js +1 -1
  376. package/web/.svelte-kit/output/server/entries/endpoints/api/sessions/_id_/send/_server.ts.js +31 -13
  377. package/web/.svelte-kit/output/server/entries/endpoints/api/sessions/_id_/voice/_server.ts.js +86 -0
  378. package/web/.svelte-kit/output/server/entries/endpoints/api/sessions/_server.ts.js +4 -36
  379. package/web/.svelte-kit/output/server/entries/endpoints/api/sessions/_target_/output/_server.ts.js +1 -1
  380. package/web/.svelte-kit/output/server/entries/endpoints/api/tmux/panes/_server.ts.js +3 -3
  381. package/web/.svelte-kit/output/server/entries/endpoints/downloads/_file_/_server.ts.js +20 -0
  382. package/web/.svelte-kit/output/server/entries/fallbacks/error.svelte.js +1 -1
  383. package/web/.svelte-kit/output/server/entries/hooks.server.js +9 -29
  384. package/web/.svelte-kit/output/server/entries/pages/_layout.server.ts.js +9 -0
  385. package/web/.svelte-kit/output/server/entries/pages/_layout.svelte.js +3588 -369
  386. package/web/.svelte-kit/output/server/entries/pages/_page.svelte.js +13 -3045
  387. package/web/.svelte-kit/output/server/entries/pages/session/_target_/_page.svelte.js +1186 -455
  388. package/web/.svelte-kit/output/server/entries/pages/session/_target_/_page.ts.js +4 -0
  389. package/web/.svelte-kit/output/server/index.js +892 -472
  390. package/web/.svelte-kit/output/server/internal.js +9 -7
  391. package/web/.svelte-kit/output/server/manifest-full.js +45 -32
  392. package/web/.svelte-kit/output/server/manifest.js +45 -32
  393. package/web/.svelte-kit/output/server/nodes/0.js +5 -3
  394. package/web/.svelte-kit/output/server/nodes/1.js +1 -1
  395. package/web/.svelte-kit/output/server/nodes/2.js +2 -2
  396. package/web/.svelte-kit/output/server/nodes/3.js +9 -6
  397. package/web/.svelte-kit/output/server/remote-entry.js +530 -131
  398. package/web/.svelte-kit/tsconfig.json +7 -1
  399. package/web/.svelte-kit/types/route_meta_data.json +24 -12
  400. package/web/.svelte-kit/types/src/routes/$types.d.ts +9 -6
  401. package/web/.svelte-kit/types/src/routes/api/browse/$types.d.ts +1 -2
  402. package/web/.svelte-kit/types/src/routes/api/chrome/$types.d.ts +1 -2
  403. package/web/.svelte-kit/types/src/routes/api/files/image/$types.d.ts +1 -2
  404. package/web/.svelte-kit/types/src/routes/api/health/$types.d.ts +1 -2
  405. package/web/.svelte-kit/types/src/routes/api/projects/new-session/$types.d.ts +1 -2
  406. package/web/.svelte-kit/types/src/routes/api/{beads → servers/discover}/$types.d.ts +2 -3
  407. package/web/.svelte-kit/types/src/routes/api/sessions/$types.d.ts +1 -2
  408. package/web/.svelte-kit/types/src/routes/api/sessions/[id]/$types.d.ts +1 -2
  409. package/web/.svelte-kit/types/src/routes/api/sessions/[id]/attach/$types.d.ts +10 -0
  410. package/web/.svelte-kit/types/src/routes/api/sessions/[id]/kill/$types.d.ts +1 -2
  411. package/web/.svelte-kit/types/src/routes/api/sessions/[id]/queue/$types.d.ts +10 -0
  412. package/web/.svelte-kit/types/src/routes/api/sessions/[id]/rename/$types.d.ts +10 -0
  413. package/web/.svelte-kit/types/src/routes/api/sessions/[id]/restart/$types.d.ts +1 -2
  414. package/web/.svelte-kit/types/src/routes/api/sessions/[id]/screenshots/$types.d.ts +1 -2
  415. package/web/.svelte-kit/types/src/routes/api/sessions/[id]/send/$types.d.ts +1 -2
  416. package/web/.svelte-kit/types/src/routes/api/sessions/[id]/voice/$types.d.ts +10 -0
  417. package/web/.svelte-kit/types/src/routes/api/sessions/[target]/output/$types.d.ts +1 -2
  418. package/web/.svelte-kit/types/src/routes/api/tmux/panes/$types.d.ts +1 -2
  419. package/web/.svelte-kit/types/src/routes/downloads/[file]/$types.d.ts +10 -0
  420. package/web/.svelte-kit/types/src/routes/proxy+layout.server.ts +10 -0
  421. package/web/.svelte-kit/types/src/routes/session/[target]/$types.d.ts +4 -3
  422. package/web/package.json +3 -1
  423. package/web/src/app.html +1 -0
  424. package/web/src/hooks.server.ts +12 -46
  425. package/web/src/lib/actions/clickOutside.ts +61 -0
  426. package/web/src/lib/actions/longPress.ts +90 -0
  427. package/web/src/lib/components/AllSessionsPanel.svelte +666 -343
  428. package/web/src/lib/components/MessageQueuePanel.svelte +225 -0
  429. package/web/src/lib/components/ScreenshotsPanel.svelte +38 -95
  430. package/web/src/lib/components/ServerPicker.svelte +209 -0
  431. package/web/src/lib/components/SidebarAccordion.svelte +123 -0
  432. package/web/src/lib/components/SystemStatsWidget.svelte +121 -0
  433. package/web/src/lib/components/TerminalRenderer.svelte +69 -157
  434. package/web/src/lib/components/VoiceButton.svelte +525 -0
  435. package/web/src/lib/components/ui/alert-dialog/alert-dialog-content.svelte +1 -1
  436. package/web/src/lib/components/ui/alert-dialog/alert-dialog-overlay.svelte +1 -1
  437. package/web/src/lib/components/ui/dialog/dialog-content.svelte +1 -1
  438. package/web/src/lib/components/ui/dialog/dialog-overlay.svelte +1 -1
  439. package/web/src/lib/components/ui/popover/index.ts +19 -0
  440. package/web/src/lib/components/ui/popover/popover-close.svelte +7 -0
  441. package/web/src/lib/components/ui/popover/popover-content.svelte +31 -0
  442. package/web/src/lib/components/ui/popover/popover-portal.svelte +7 -0
  443. package/web/src/lib/components/ui/popover/popover-trigger.svelte +17 -0
  444. package/web/src/lib/components/ui/popover/popover.svelte +7 -0
  445. package/web/src/lib/constants.ts +6 -0
  446. package/web/src/lib/gamepad.svelte.ts +182 -0
  447. package/web/src/lib/server/voice/index.ts +1 -0
  448. package/web/src/lib/server/voice/whisper.ts +70 -0
  449. package/web/src/lib/server/ws-managers.ts +21 -0
  450. package/web/src/lib/stores/drafts.svelte.ts +47 -0
  451. package/web/src/lib/stores/persisted.ts +43 -0
  452. package/web/src/lib/stores/preferences.svelte.ts +20 -31
  453. package/web/src/lib/stores/servers.svelte.ts +49 -0
  454. package/web/src/lib/stores/sessions.svelte.ts +194 -14
  455. package/web/src/lib/stores/sidebarActions.svelte.ts +42 -0
  456. package/web/src/lib/stores/terminal.svelte.ts +62 -33
  457. package/web/src/lib/stores/tmuxPanes.svelte.ts +78 -0
  458. package/web/src/lib/stores/voice.svelte.ts +287 -0
  459. package/web/src/lib/types/servers.ts +10 -0
  460. package/web/src/lib/types/tmux.ts +6 -0
  461. package/web/src/lib/voice/recorder.ts +223 -0
  462. package/web/src/lib/wakeLock.svelte.ts +41 -0
  463. package/web/src/routes/+layout.server.ts +8 -0
  464. package/web/src/routes/+layout.svelte +91 -195
  465. package/web/src/routes/+page.svelte +47 -3
  466. package/web/src/routes/api/health/+server.ts +2 -1
  467. package/web/src/routes/api/projects/new-session/+server.ts +69 -27
  468. package/web/src/routes/api/servers/discover/+server.ts +72 -0
  469. package/web/src/routes/api/sessions/+server.ts +4 -50
  470. package/web/src/routes/api/sessions/[id]/attach/+server.ts +88 -0
  471. package/web/src/routes/api/sessions/[id]/kill/+server.ts +5 -2
  472. package/web/src/routes/api/sessions/[id]/queue/+server.ts +69 -0
  473. package/web/src/routes/api/sessions/[id]/rename/+server.ts +33 -0
  474. package/web/src/routes/api/sessions/[id]/restart/+server.ts +2 -0
  475. package/web/src/routes/api/sessions/[id]/send/+server.ts +45 -15
  476. package/web/src/routes/api/sessions/[id]/voice/+server.ts +46 -0
  477. package/web/src/routes/api/sessions/[target]/output/+server.ts +1 -1
  478. package/web/src/routes/api/tmux/panes/+server.ts +5 -8
  479. package/web/src/routes/downloads/[file]/+server.ts +25 -0
  480. package/web/src/routes/session/[target]/+page.svelte +1375 -124
  481. package/web/src/routes/session/[target]/+page.ts +1 -0
  482. package/web/static/favicon.svg +22 -0
  483. package/web/vite.config.ts +13 -29
  484. package/.beads/README.md +0 -81
  485. package/.beads/config.yaml +0 -62
  486. package/.beads/interactions.jsonl +0 -0
  487. package/.beads/issues.jsonl +0 -5
  488. package/.beads/metadata.json +0 -4
  489. package/PLAN-beads-integration.md +0 -250
  490. package/dist/db/schema.d.ts +0 -4
  491. package/dist/db/schema.d.ts.map +0 -1
  492. package/dist/db/schema.js +0 -23
  493. package/dist/db/schema.js.map +0 -1
  494. package/dist/db/sessions.d.ts +0 -38
  495. package/dist/db/sessions.d.ts.map +0 -1
  496. package/dist/db/sessions.js +0 -87
  497. package/dist/db/sessions.js.map +0 -1
  498. package/dist/hooks/claude-watch-hook.d.ts +0 -15
  499. package/dist/hooks/claude-watch-hook.d.ts.map +0 -1
  500. package/dist/hooks/claude-watch-hook.js +0 -396
  501. package/dist/hooks/claude-watch-hook.js.map +0 -1
  502. package/dist/server/custom-server.d.ts +0 -13
  503. package/dist/server/custom-server.d.ts.map +0 -1
  504. package/dist/server/custom-server.js +0 -63
  505. package/dist/server/custom-server.js.map +0 -1
  506. package/dist/server/index.d.ts +0 -9
  507. package/dist/server/index.d.ts.map +0 -1
  508. package/dist/server/index.js +0 -1143
  509. package/dist/server/index.js.map +0 -1
  510. package/dist/server/middleware/cors.d.ts +0 -2
  511. package/dist/server/middleware/cors.d.ts.map +0 -1
  512. package/dist/server/middleware/cors.js +0 -11
  513. package/dist/server/middleware/cors.js.map +0 -1
  514. package/dist/server/routes/sessions.d.ts +0 -3
  515. package/dist/server/routes/sessions.d.ts.map +0 -1
  516. package/dist/server/routes/sessions.js +0 -78
  517. package/dist/server/routes/sessions.js.map +0 -1
  518. package/dist/server/routes/stream.d.ts +0 -3
  519. package/dist/server/routes/stream.d.ts.map +0 -1
  520. package/dist/server/routes/stream.js +0 -45
  521. package/dist/server/routes/stream.js.map +0 -1
  522. package/dist/server/types.d.ts +0 -28
  523. package/dist/server/types.d.ts.map +0 -1
  524. package/dist/server/types.js +0 -2
  525. package/dist/server/types.js.map +0 -1
  526. package/dist/server/websocket.d.ts +0 -51
  527. package/dist/server/websocket.d.ts.map +0 -1
  528. package/dist/server/websocket.js +0 -156
  529. package/dist/server/websocket.js.map +0 -1
  530. package/dist/web/client/_app/immutable/assets/0.WptSHSUl.css +0 -1
  531. package/dist/web/client/_app/immutable/assets/4.DoNWy7tW.css +0 -1
  532. package/dist/web/client/_app/immutable/assets/AllSessionsPanel.CGHY3HLy.css +0 -1
  533. package/dist/web/client/_app/immutable/chunks/-3mUPuLP.js +0 -1
  534. package/dist/web/client/_app/immutable/chunks/B5U4_V3d.js +0 -1
  535. package/dist/web/client/_app/immutable/chunks/BGcEgn7w.js +0 -3
  536. package/dist/web/client/_app/immutable/chunks/BHwiZXRv.js +0 -1
  537. package/dist/web/client/_app/immutable/chunks/By6CYjmE.js +0 -1
  538. package/dist/web/client/_app/immutable/chunks/C9P-coqM.js +0 -1
  539. package/dist/web/client/_app/immutable/chunks/CR5jMWGV.js +0 -5
  540. package/dist/web/client/_app/immutable/chunks/Cegv0r8x.js +0 -1
  541. package/dist/web/client/_app/immutable/chunks/U4ip-C0d.js +0 -2
  542. package/dist/web/client/_app/immutable/chunks/cgUjKIhX.js +0 -2
  543. package/dist/web/client/_app/immutable/entry/app.DmtnygN7.js +0 -2
  544. package/dist/web/client/_app/immutable/entry/start.fYmelGlC.js +0 -1
  545. package/dist/web/client/_app/immutable/nodes/0.DGDAdwT5.js +0 -1
  546. package/dist/web/client/_app/immutable/nodes/1.Cg8dWgUN.js +0 -1
  547. package/dist/web/client/_app/immutable/nodes/2.DItUEo3e.js +0 -1
  548. package/dist/web/client/_app/immutable/nodes/3.dHui0twF.js +0 -1
  549. package/dist/web/client/_app/immutable/nodes/4.CiEHP0cr.js +0 -6
  550. package/dist/web/server/chunks/0-BmRg-l2z.js +0 -23
  551. package/dist/web/server/chunks/0-BmRg-l2z.js.map +0 -1
  552. package/dist/web/server/chunks/1-CPgO8U7d.js.map +0 -1
  553. package/dist/web/server/chunks/2--ZO5fZp_.js +0 -22
  554. package/dist/web/server/chunks/2--ZO5fZp_.js.map +0 -1
  555. package/dist/web/server/chunks/3-7HqSep9c.js +0 -32
  556. package/dist/web/server/chunks/3-7HqSep9c.js.map +0 -1
  557. package/dist/web/server/chunks/4-C1PCdmY0.js +0 -21
  558. package/dist/web/server/chunks/4-C1PCdmY0.js.map +0 -1
  559. package/dist/web/server/chunks/AllSessionsPanel.svelte_svelte_type_style_lang-Bt4B0-oi.js +0 -35
  560. package/dist/web/server/chunks/AllSessionsPanel.svelte_svelte_type_style_lang-Bt4B0-oi.js.map +0 -1
  561. package/dist/web/server/chunks/_layout.svelte-BIF9eZCY.js +0 -453
  562. package/dist/web/server/chunks/_layout.svelte-BIF9eZCY.js.map +0 -1
  563. package/dist/web/server/chunks/_page.svelte-Be6iabRn.js +0 -34
  564. package/dist/web/server/chunks/_page.svelte-Be6iabRn.js.map +0 -1
  565. package/dist/web/server/chunks/_page.svelte-C_fGJVSE.js +0 -576
  566. package/dist/web/server/chunks/_page.svelte-C_fGJVSE.js.map +0 -1
  567. package/dist/web/server/chunks/_page.svelte-CnfJk6cu.js +0 -2722
  568. package/dist/web/server/chunks/_page.svelte-CnfJk6cu.js.map +0 -1
  569. package/dist/web/server/chunks/_server.ts-3WAmKvn2.js.map +0 -1
  570. package/dist/web/server/chunks/_server.ts-BPpMOZCm.js +0 -24
  571. package/dist/web/server/chunks/_server.ts-BPpMOZCm.js.map +0 -1
  572. package/dist/web/server/chunks/_server.ts-BUKgRb6U.js.map +0 -1
  573. package/dist/web/server/chunks/_server.ts-BrF3od0O.js +0 -45
  574. package/dist/web/server/chunks/_server.ts-BrF3od0O.js.map +0 -1
  575. package/dist/web/server/chunks/_server.ts-C4oPmOJR.js.map +0 -1
  576. package/dist/web/server/chunks/_server.ts-CSqdCNGi.js +0 -21
  577. package/dist/web/server/chunks/_server.ts-CSqdCNGi.js.map +0 -1
  578. package/dist/web/server/chunks/_server.ts-DI9fzUo9.js +0 -52
  579. package/dist/web/server/chunks/_server.ts-DI9fzUo9.js.map +0 -1
  580. package/dist/web/server/chunks/_server.ts-DNjJTClI.js +0 -46
  581. package/dist/web/server/chunks/_server.ts-DNjJTClI.js.map +0 -1
  582. package/dist/web/server/chunks/_server.ts-DdbOAkOj.js.map +0 -1
  583. package/dist/web/server/chunks/_server.ts-Df2isGQc.js.map +0 -1
  584. package/dist/web/server/chunks/_server.ts-Vpw25_-3.js +0 -12
  585. package/dist/web/server/chunks/_server.ts-Vpw25_-3.js.map +0 -1
  586. package/dist/web/server/chunks/_server.ts-WldRpSRi.js.map +0 -1
  587. package/dist/web/server/chunks/alert-dialog-description-DDA6u-nS.js +0 -2890
  588. package/dist/web/server/chunks/alert-dialog-description-DDA6u-nS.js.map +0 -1
  589. package/dist/web/server/chunks/auth-DrUf-v4J.js +0 -51
  590. package/dist/web/server/chunks/auth-DrUf-v4J.js.map +0 -1
  591. package/dist/web/server/chunks/button-D6xS9rHt.js +0 -2335
  592. package/dist/web/server/chunks/button-D6xS9rHt.js.map +0 -1
  593. package/dist/web/server/chunks/chunk-EKzHsMy_.js +0 -42
  594. package/dist/web/server/chunks/chunks-DmdqVYC7.js.map +0 -1
  595. package/dist/web/server/chunks/client-CUrSQijh.js.map +0 -1
  596. package/dist/web/server/chunks/clsx-FzI4_gi0.js +0 -332
  597. package/dist/web/server/chunks/clsx-FzI4_gi0.js.map +0 -1
  598. package/dist/web/server/chunks/error.svelte-D-c-9pTE.js.map +0 -1
  599. package/dist/web/server/chunks/events-BDBlYddw.js +0 -89
  600. package/dist/web/server/chunks/events-BDBlYddw.js.map +0 -1
  601. package/dist/web/server/chunks/exports-CCurQ-Tl.js.map +0 -1
  602. package/dist/web/server/chunks/hooks.server-BK1bopsh.js.map +0 -1
  603. package/dist/web/server/chunks/index2-BQnysSj-.js +0 -2588
  604. package/dist/web/server/chunks/index2-BQnysSj-.js.map +0 -1
  605. package/dist/web/server/chunks/internal-DLENj6YI.js.map +0 -1
  606. package/dist/web/server/chunks/pane-Dg3pKvsm.js +0 -94
  607. package/dist/web/server/chunks/pane-Dg3pKvsm.js.map +0 -1
  608. package/dist/web/server/chunks/sessions-json-DgfkCLO7.js.map +0 -1
  609. package/dist/web/server/chunks/sessions.svelte-Ds82MvkB.js +0 -178
  610. package/dist/web/server/chunks/sessions.svelte-Ds82MvkB.js.map +0 -1
  611. package/dist/web/server/chunks/state.svelte-xeAZvWZ6.js +0 -7
  612. package/dist/web/server/chunks/state.svelte-xeAZvWZ6.js.map +0 -1
  613. package/dist/web/server/chunks/ws-handlers-B4r5eSP2.js.map +0 -1
  614. package/web/.svelte-kit/adapter-bun/_app/immutable/assets/AllSessionsPanel.BKhqOrbV.css +0 -1
  615. package/web/.svelte-kit/adapter-bun/_app/immutable/assets/_layout.WptSHSUl.css +0 -1
  616. package/web/.svelte-kit/adapter-bun/_app/immutable/assets/_page.DldLgTc-.css +0 -1
  617. package/web/.svelte-kit/adapter-bun/_app/immutable/assets/_page.DoNWy7tW.css +0 -1
  618. package/web/.svelte-kit/adapter-bun/chunks/AllSessionsPanel.svelte_svelte_type_style_lang.js +0 -49
  619. package/web/.svelte-kit/adapter-bun/chunks/alert-dialog-description.js +0 -2670
  620. package/web/.svelte-kit/adapter-bun/chunks/auth.js +0 -59
  621. package/web/.svelte-kit/adapter-bun/chunks/context.js +0 -133
  622. package/web/.svelte-kit/adapter-bun/chunks/events.js +0 -121
  623. package/web/.svelte-kit/adapter-bun/chunks/false.js +0 -4
  624. package/web/.svelte-kit/adapter-bun/chunks/pane.js +0 -82
  625. package/web/.svelte-kit/adapter-bun/chunks/sessions.svelte.js +0 -229
  626. package/web/.svelte-kit/adapter-bun/entries/endpoints/api/auth/login/_server.ts.js +0 -22
  627. package/web/.svelte-kit/adapter-bun/entries/endpoints/api/auth/logout/_server.ts.js +0 -9
  628. package/web/.svelte-kit/adapter-bun/entries/endpoints/api/beads/_server.ts.js +0 -22
  629. package/web/.svelte-kit/adapter-bun/entries/pages/login/_page.server.ts.js +0 -15
  630. package/web/.svelte-kit/adapter-bun/entries/pages/login/_page.svelte.js +0 -37
  631. package/web/.svelte-kit/adapter-bun/nodes/4.js +0 -8
  632. package/web/.svelte-kit/adapter-node/.vite/manifest.json +0 -408
  633. package/web/.svelte-kit/adapter-node/_app/immutable/assets/AllSessionsPanel.BKhqOrbV.css +0 -1
  634. package/web/.svelte-kit/adapter-node/_app/immutable/assets/_layout.WptSHSUl.css +0 -1
  635. package/web/.svelte-kit/adapter-node/_app/immutable/assets/_page.DldLgTc-.css +0 -1
  636. package/web/.svelte-kit/adapter-node/_app/immutable/assets/_page.DoNWy7tW.css +0 -1
  637. package/web/.svelte-kit/adapter-node/chunks/AllSessionsPanel.svelte_svelte_type_style_lang.js +0 -49
  638. package/web/.svelte-kit/adapter-node/chunks/alert-dialog-description.js +0 -2670
  639. package/web/.svelte-kit/adapter-node/chunks/auth.js +0 -59
  640. package/web/.svelte-kit/adapter-node/chunks/button.js +0 -82
  641. package/web/.svelte-kit/adapter-node/chunks/client.js +0 -29
  642. package/web/.svelte-kit/adapter-node/chunks/context.js +0 -133
  643. package/web/.svelte-kit/adapter-node/chunks/environment.js +0 -34
  644. package/web/.svelte-kit/adapter-node/chunks/events.js +0 -121
  645. package/web/.svelte-kit/adapter-node/chunks/exports.js +0 -174
  646. package/web/.svelte-kit/adapter-node/chunks/false.js +0 -4
  647. package/web/.svelte-kit/adapter-node/chunks/index.js +0 -59
  648. package/web/.svelte-kit/adapter-node/chunks/index2.js +0 -2828
  649. package/web/.svelte-kit/adapter-node/chunks/internal.js +0 -920
  650. package/web/.svelte-kit/adapter-node/chunks/pane.js +0 -82
  651. package/web/.svelte-kit/adapter-node/chunks/sessions-json.js +0 -124
  652. package/web/.svelte-kit/adapter-node/chunks/sessions.svelte.js +0 -229
  653. package/web/.svelte-kit/adapter-node/chunks/shared.js +0 -542
  654. package/web/.svelte-kit/adapter-node/chunks/state.svelte.js +0 -16
  655. package/web/.svelte-kit/adapter-node/chunks/utils.js +0 -43
  656. package/web/.svelte-kit/adapter-node/chunks/ws-handlers.js +0 -782
  657. package/web/.svelte-kit/adapter-node/entries/endpoints/api/auth/login/_server.ts.js +0 -22
  658. package/web/.svelte-kit/adapter-node/entries/endpoints/api/auth/logout/_server.ts.js +0 -9
  659. package/web/.svelte-kit/adapter-node/entries/endpoints/api/beads/_server.ts.js +0 -22
  660. package/web/.svelte-kit/adapter-node/entries/endpoints/api/browse/_server.ts.js +0 -50
  661. package/web/.svelte-kit/adapter-node/entries/endpoints/api/chrome/_server.ts.js +0 -30
  662. package/web/.svelte-kit/adapter-node/entries/endpoints/api/files/image/_server.ts.js +0 -53
  663. package/web/.svelte-kit/adapter-node/entries/endpoints/api/health/_server.ts.js +0 -7
  664. package/web/.svelte-kit/adapter-node/entries/endpoints/api/projects/new-session/_server.ts.js +0 -44
  665. package/web/.svelte-kit/adapter-node/entries/endpoints/api/sessions/_id_/_server.ts.js +0 -20
  666. package/web/.svelte-kit/adapter-node/entries/endpoints/api/sessions/_id_/kill/_server.ts.js +0 -36
  667. package/web/.svelte-kit/adapter-node/entries/endpoints/api/sessions/_id_/restart/_server.ts.js +0 -40
  668. package/web/.svelte-kit/adapter-node/entries/endpoints/api/sessions/_id_/screenshots/_server.ts.js +0 -28
  669. package/web/.svelte-kit/adapter-node/entries/endpoints/api/sessions/_id_/send/_server.ts.js +0 -29
  670. package/web/.svelte-kit/adapter-node/entries/endpoints/api/sessions/_server.ts.js +0 -49
  671. package/web/.svelte-kit/adapter-node/entries/endpoints/api/sessions/_target_/output/_server.ts.js +0 -14
  672. package/web/.svelte-kit/adapter-node/entries/endpoints/api/tmux/panes/_server.ts.js +0 -21
  673. package/web/.svelte-kit/adapter-node/entries/fallbacks/error.svelte.js +0 -27
  674. package/web/.svelte-kit/adapter-node/entries/hooks.server.js +0 -105
  675. package/web/.svelte-kit/adapter-node/entries/pages/_layout.svelte.js +0 -499
  676. package/web/.svelte-kit/adapter-node/entries/pages/_page.svelte.js +0 -3057
  677. package/web/.svelte-kit/adapter-node/entries/pages/login/_page.server.ts.js +0 -15
  678. package/web/.svelte-kit/adapter-node/entries/pages/login/_page.svelte.js +0 -37
  679. package/web/.svelte-kit/adapter-node/entries/pages/session/_target_/_page.svelte.js +0 -653
  680. package/web/.svelte-kit/adapter-node/index.js +0 -3864
  681. package/web/.svelte-kit/adapter-node/internal.js +0 -13
  682. package/web/.svelte-kit/adapter-node/manifest-full.js +0 -167
  683. package/web/.svelte-kit/adapter-node/manifest.js +0 -171
  684. package/web/.svelte-kit/adapter-node/nodes/0.js +0 -8
  685. package/web/.svelte-kit/adapter-node/nodes/1.js +0 -8
  686. package/web/.svelte-kit/adapter-node/nodes/2.js +0 -8
  687. package/web/.svelte-kit/adapter-node/nodes/3.js +0 -10
  688. package/web/.svelte-kit/adapter-node/nodes/4.js +0 -8
  689. package/web/.svelte-kit/adapter-node/remote-entry.js +0 -541
  690. package/web/.svelte-kit/generated/client/nodes/4.js +0 -1
  691. package/web/.svelte-kit/generated/client-optimized/nodes/4.js +0 -1
  692. package/web/.svelte-kit/output/client/_app/immutable/assets/0.WptSHSUl.css +0 -1
  693. package/web/.svelte-kit/output/client/_app/immutable/assets/4.DoNWy7tW.css +0 -1
  694. package/web/.svelte-kit/output/client/_app/immutable/assets/AllSessionsPanel.CGHY3HLy.css +0 -1
  695. package/web/.svelte-kit/output/client/_app/immutable/chunks/-3mUPuLP.js +0 -1
  696. package/web/.svelte-kit/output/client/_app/immutable/chunks/B5U4_V3d.js +0 -1
  697. package/web/.svelte-kit/output/client/_app/immutable/chunks/BGcEgn7w.js +0 -3
  698. package/web/.svelte-kit/output/client/_app/immutable/chunks/BHwiZXRv.js +0 -1
  699. package/web/.svelte-kit/output/client/_app/immutable/chunks/By6CYjmE.js +0 -1
  700. package/web/.svelte-kit/output/client/_app/immutable/chunks/C9P-coqM.js +0 -1
  701. package/web/.svelte-kit/output/client/_app/immutable/chunks/CR5jMWGV.js +0 -5
  702. package/web/.svelte-kit/output/client/_app/immutable/chunks/Cegv0r8x.js +0 -1
  703. package/web/.svelte-kit/output/client/_app/immutable/chunks/U4ip-C0d.js +0 -2
  704. package/web/.svelte-kit/output/client/_app/immutable/chunks/cgUjKIhX.js +0 -2
  705. package/web/.svelte-kit/output/client/_app/immutable/entry/app.DmtnygN7.js +0 -2
  706. package/web/.svelte-kit/output/client/_app/immutable/entry/start.fYmelGlC.js +0 -1
  707. package/web/.svelte-kit/output/client/_app/immutable/nodes/0.DGDAdwT5.js +0 -1
  708. package/web/.svelte-kit/output/client/_app/immutable/nodes/1.Cg8dWgUN.js +0 -1
  709. package/web/.svelte-kit/output/client/_app/immutable/nodes/2.DItUEo3e.js +0 -1
  710. package/web/.svelte-kit/output/client/_app/immutable/nodes/3.dHui0twF.js +0 -1
  711. package/web/.svelte-kit/output/client/_app/immutable/nodes/4.CiEHP0cr.js +0 -6
  712. package/web/.svelte-kit/output/server/_app/immutable/assets/AllSessionsPanel.BKhqOrbV.css +0 -1
  713. package/web/.svelte-kit/output/server/_app/immutable/assets/_layout.WptSHSUl.css +0 -1
  714. package/web/.svelte-kit/output/server/_app/immutable/assets/_page.DldLgTc-.css +0 -1
  715. package/web/.svelte-kit/output/server/_app/immutable/assets/_page.DoNWy7tW.css +0 -1
  716. package/web/.svelte-kit/output/server/chunks/AllSessionsPanel.svelte_svelte_type_style_lang.js +0 -49
  717. package/web/.svelte-kit/output/server/chunks/alert-dialog-description.js +0 -2670
  718. package/web/.svelte-kit/output/server/chunks/auth.js +0 -59
  719. package/web/.svelte-kit/output/server/chunks/context.js +0 -133
  720. package/web/.svelte-kit/output/server/chunks/events.js +0 -121
  721. package/web/.svelte-kit/output/server/chunks/false.js +0 -4
  722. package/web/.svelte-kit/output/server/chunks/pane.js +0 -82
  723. package/web/.svelte-kit/output/server/chunks/sessions.svelte.js +0 -229
  724. package/web/.svelte-kit/output/server/entries/endpoints/api/auth/login/_server.ts.js +0 -22
  725. package/web/.svelte-kit/output/server/entries/endpoints/api/auth/logout/_server.ts.js +0 -9
  726. package/web/.svelte-kit/output/server/entries/endpoints/api/beads/_server.ts.js +0 -22
  727. package/web/.svelte-kit/output/server/entries/pages/login/_page.server.ts.js +0 -15
  728. package/web/.svelte-kit/output/server/entries/pages/login/_page.svelte.js +0 -37
  729. package/web/.svelte-kit/output/server/nodes/4.js +0 -8
  730. package/web/.svelte-kit/types/src/routes/api/auth/login/$types.d.ts +0 -10
  731. package/web/.svelte-kit/types/src/routes/api/auth/logout/$types.d.ts +0 -10
  732. package/web/.svelte-kit/types/src/routes/login/$types.d.ts +0 -25
  733. package/web/.svelte-kit/types/src/routes/login/proxy+page.server.ts +0 -19
  734. package/web/src/lib/components/BeadsPanel.svelte +0 -146
  735. package/web/src/lib/components/IssueItem.svelte +0 -287
  736. package/web/src/lib/components/SessionsSidebar.svelte +0 -312
  737. package/web/src/lib/server/auth.ts +0 -90
  738. package/web/src/lib/stores/beads.svelte.ts +0 -163
  739. package/web/src/lib/stores/input-injection.svelte.ts +0 -39
  740. package/web/src/lib/types/terminal.ts +0 -31
  741. package/web/src/lib/utils/terminal-parser.ts +0 -239
  742. package/web/src/routes/api/auth/login/+server.ts +0 -34
  743. package/web/src/routes/api/auth/logout/+server.ts +0 -10
  744. package/web/src/routes/api/beads/+server.ts +0 -28
  745. package/web/src/routes/login/+page.server.ts +0 -18
  746. package/web/src/routes/login/+page.svelte +0 -69
@@ -0,0 +1,59 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+ workflow_dispatch:
8
+ inputs:
9
+ version:
10
+ description: "Version to publish (without leading v); defaults to package.json"
11
+ required: false
12
+
13
+ permissions:
14
+ contents: write
15
+ id-token: write # required for npm trusted publishing (OIDC)
16
+
17
+ jobs:
18
+ publish:
19
+ runs-on: ubuntu-latest
20
+ steps:
21
+ - uses: actions/checkout@v4
22
+ with:
23
+ fetch-depth: 0
24
+
25
+ - uses: oven-sh/setup-bun@v2
26
+ with:
27
+ bun-version: "1.3.0"
28
+
29
+ - uses: actions/setup-node@v4
30
+ with:
31
+ node-version: "22"
32
+ registry-url: "https://registry.npmjs.org"
33
+
34
+ - name: Sanity-check tag matches package.json
35
+ if: startsWith(github.ref, 'refs/tags/v')
36
+ run: |
37
+ TAG_VERSION="${GITHUB_REF_NAME#v}"
38
+ PKG_VERSION=$(node -p "require('./package.json').version")
39
+ if [ "$TAG_VERSION" != "$PKG_VERSION" ]; then
40
+ echo "Tag $TAG_VERSION does not match package.json $PKG_VERSION"
41
+ exit 1
42
+ fi
43
+
44
+ - name: Install dependencies
45
+ run: bun install --frozen-lockfile
46
+
47
+ - name: Build CLI + web
48
+ run: bun run build
49
+
50
+ - name: Publish to npm (trusted publishing, no token)
51
+ # npm 11.5.1+ required for OIDC trusted publishing without an auth token.
52
+ # `npx npm@latest` avoids overwriting the runner's bundled npm mid-process.
53
+ run: npx -y npm@latest publish --access public --provenance
54
+
55
+ - name: Create GitHub release
56
+ if: startsWith(github.ref, 'refs/tags/v')
57
+ uses: softprops/action-gh-release@v2
58
+ with:
59
+ generate_release_notes: true
package/CLAUDE.md CHANGED
@@ -4,10 +4,10 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
4
4
 
5
5
  ## Development Server
6
6
 
7
- Dev server runs via Vite with HMR at **http://localhost:5173** (or `--port` to change).
7
+ Dev server runs via Vite with HMR at **http://localhost:3434** (or `--port` to change). Prod server uses :3456.
8
8
 
9
9
  ```bash
10
- bun run dev:serve # Start dev server
10
+ bun run dev:serve # Start dev server on :3434
11
11
  bun run dev:serve --port 3456 # Custom port
12
12
  bun run dev:serve --host 0.0.0.0 # LAN access
13
13
  ```
@@ -19,25 +19,50 @@ After each change, check tmux pane `0:1.1` to verify HMR worked. If the server d
19
19
  ## Build & Development Commands
20
20
 
21
21
  ```bash
22
- bun run build # Build CLI + SvelteKit web app
23
- bun run build:cli # Build CLI only (TypeScript)
24
- bun run build:web # Build SvelteKit web app only
25
- bun run dev:serve # Vite dev server with HMR
26
- bun test # Run vitest tests
27
- bun run lint # ESLint check
28
- bun run format # Prettier formatting
22
+ bun src/cli.ts <command> # Run CLI directly from source (no build needed)
23
+ bun run build # Build CLI + SvelteKit web app
24
+ bun run build:cli # Build CLI only (TypeScript)
25
+ bun run build:web # Build SvelteKit web app only
26
+ bun run dev:serve # Vite dev server with HMR
27
+ bun run prod:restart # Kill, rebuild, and relaunch prod server on :3456 (detached)
28
+ bun test # Run vitest tests
29
+ bun run lint # ESLint check
30
+ bun run format # Prettier formatting
29
31
  ```
30
32
 
31
- Production server (after build):
32
- ```bash
33
- bun dist/cli.js serve --port 3456 --host 0.0.0.0
34
- ```
33
+ **Use `bun src/cli.ts` for development** — bun runs TypeScript directly, no build step needed. Only build for production (`bun dist/cli.js`).
35
34
 
36
35
  Run a single test file:
37
36
  ```bash
38
37
  bun vitest run tests/db/sessions.test.ts
39
38
  ```
40
39
 
40
+ ## Releasing
41
+
42
+ Releases are fully automated. **Do not `npm publish` manually.**
43
+
44
+ ```bash
45
+ npm version minor # bumps package.json + src/utils/version.ts, commits, tags vX.Y.Z
46
+ git push origin main
47
+ git push origin vX.Y.Z # tag push triggers .github/workflows/release.yml
48
+ ```
49
+
50
+ The workflow builds CLI + web, publishes to npm via **OIDC trusted publishing** (no token, no MFA — the trust anchor is `christinoleo/claude-mux` + `release.yml` registered on npmjs.com), and creates a GitHub release. Publish runs as `npx -y npm@latest publish --access public --provenance` because the runner's bundled npm is too old for OIDC.
51
+
52
+ After release, other machines update with: `claude-mux update`.
53
+
54
+ ## Service management on remote hosts
55
+
56
+ For machines that should run claude-mux as a long-lived service (e.g. `engage`):
57
+
58
+ ```bash
59
+ claude-mux service install # ~/.config/systemd/user/claude-mux.service, enabled + started
60
+ sudo loginctl enable-linger $USER # one-time: survive logout, start on boot
61
+ journalctl --user -u claude-mux -f # logs
62
+ ```
63
+
64
+ `update` restarts a `nohup`-launched server it finds on :3456, but it does **not** restart a systemd-managed instance. On systemd hosts, after `claude-mux update` run `systemctl --user restart claude-mux.service` (or use `--skip-restart` on update and restart explicitly).
65
+
41
66
  ## Architecture
42
67
 
43
68
  claude-mux has three main components:
package/CONTEXT.md ADDED
@@ -0,0 +1,23 @@
1
+ # Glossary
2
+
3
+ ## Attachment
4
+
5
+ A file or image the user is staging to send into Claude Code on the **next** prompt.
6
+
7
+ An attachment has two layers:
8
+
9
+ - **Staging (prompt-scoped)** — the chip in the input row. Cleared from the UI
10
+ when the prompt fires. Each prompt starts with an empty staging area.
11
+ - **Backing file (session-scoped)** — bytes persisted on disk under the session's
12
+ attachment directory. Kept for the lifetime of the session and removed only
13
+ when the session is killed. This avoids racing Claude Code's read of `@/path`.
14
+
15
+ Once a prompt is sent, the attached bytes also live inside Claude Code's own
16
+ conversation context (as multimodal message content). Re-referencing the same
17
+ image in later prompts ("look at the image again") works because Claude Code
18
+ already has the bytes in context; it does not need to re-open the backing file.
19
+
20
+ Not to be confused with **Screenshot**: screenshots are session artifacts emitted
21
+ by Claude Code hooks and displayed in the sidebar. Screenshots are read-only
22
+ context surfaced to the user; attachments are user-supplied payloads sent into
23
+ Claude Code.
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  <p align="center">
2
2
  <h1 align="center">claude-mux</h1>
3
3
  <p align="center">
4
- <strong>A real-time web dashboard for monitoring and controlling multiple Claude Code sessions</strong>
4
+ <strong>Real-time web dashboard for monitoring and controlling multiple Claude Code sessions</strong>
5
5
  </p>
6
6
  </p>
7
7
 
@@ -14,339 +14,191 @@
14
14
  </p>
15
15
 
16
16
  <p align="center">
17
- <a href="#features">Features</a>
18
- <a href="#installation">Installation</a>
19
- <a href="#quick-start">Quick Start</a>
20
- <a href="#web-interface">Web Interface</a>
21
- <a href="#how-it-works">How It Works</a>
17
+ <a href="#features">Features</a> &bull;
18
+ <a href="#installation">Installation</a> &bull;
19
+ <a href="#quick-start">Quick Start</a> &bull;
20
+ <a href="#cli-commands">CLI</a> &bull;
21
+ <a href="#how-it-works">Architecture</a>
22
22
  </p>
23
23
 
24
24
  ---
25
25
 
26
- ## Screenshots
27
-
28
26
  <p align="center">
29
- <img src="docs/images/desktop-dashboard.png" alt="Desktop Dashboard" width="100%">
30
- <br>
31
- <em>Dashboard view — Monitor all your Claude Code sessions at a glance</em>
27
+ <img src="docs/images/desktop-dashboard.png" alt="Dashboard" width="100%">
28
+ <br><em>Dashboard &mdash; sessions grouped by project with live state indicators</em>
32
29
  </p>
33
30
 
34
31
  <p align="center">
35
- <img src="docs/images/desktop-session.png" alt="Session View with Syntax Highlighting" width="100%">
36
- <br>
37
- <em>Session view — Real-time terminal output with syntax highlighting</em>
32
+ <img src="docs/images/desktop-session.png" alt="Session View" width="100%">
33
+ <br><em>Session view &mdash; real-time ANSI terminal output with action toolbar</em>
38
34
  </p>
39
35
 
40
36
  <details>
41
- <summary><strong>Mobile Screenshots</strong></summary>
37
+ <summary><strong>Mobile</strong></summary>
42
38
  <br>
43
39
  <p align="center">
44
40
  <img src="docs/images/mobile-dashboard.png" alt="Mobile Dashboard" width="300">
45
41
  &nbsp;&nbsp;&nbsp;
46
42
  <img src="docs/images/mobile-session.png" alt="Mobile Session" width="300">
47
43
  </p>
48
- <p align="center"><em>Fully responsive Control your Claude sessions from your phone</em></p>
44
+ <p align="center"><em>Fully responsive &mdash; control sessions from your phone</em></p>
49
45
  </details>
50
46
 
51
47
  ---
52
48
 
53
49
  ## Features
54
50
 
55
- ### Web Dashboard
56
- - **Real-time monitoring** of all Claude Code sessions via WebSocket
57
- - **Project-based organization** Sessions grouped by working directory
58
- - **Live status indicators** See which sessions are busy, idle, or waiting for input
59
- - **One-click navigation** Jump to any session instantly
60
-
61
- ### Syntax Highlighting
62
- - **Color-coded terminal output** User prompts, Claude responses, tool calls, and results
63
- - **Tool-specific colors** Different colors for Read, Write, Edit, Bash, Task, and more
64
- - **Diff highlighting** Green for additions, red for removals in file edits
65
- - **Toggleable theming** Switch between styled and raw output
66
-
67
- ### Mobile-First Design
68
- - **Fully responsive** — Works on desktop, tablet, and phone
69
- - **Touch-friendly controls** — Large buttons for common actions
70
- - **Quick action toolbar** — Send keys (Up, Down, Tab, Esc, Ctrl-C) with one tap
71
-
72
- ### Session Control
73
- - **Send text input** — Type messages directly to Claude
74
- - **Keyboard shortcuts** — Send special keys and key combinations
75
- - **Terminal resize** — Fit tmux pane to browser viewport
76
- - **Kill sessions** — Terminate Claude processes when needed
77
-
78
- ### Optional Features
79
- - **Authentication** — Password-protect your dashboard
80
- - **LAN access** — Monitor sessions from any device on your network
51
+ - **Live session monitoring** &mdash; WebSocket-powered, no polling. See state (busy/idle/waiting/permission) at a glance
52
+ - **Project grouping** &mdash; sessions organized by working directory with color-coded borders
53
+ - **ANSI terminal rendering** &mdash; real tmux colors via [ansi_up](https://github.com/drudru/ansi_up), toggleable
54
+ - **Session control** &mdash; send text, keys (Up/Down/Tab/Esc/Ctrl-C), Yes/No/Always quick buttons
55
+ - **Voice input** &mdash; local Whisper transcription (CPU or CUDA, auto-detected). Trigger with `F2`, `Pause`, or `Ctrl+\`` while the input is focused; press `Enter` to stop and submit, `Esc` or the `×` overlay to discard. Long-press the mic button for language, microphone, and auto-submit settings
56
+ - **Orchestrator pairing** &mdash; main + orchestrator sessions grouped together with role labels
57
+ - **Remote Control** &mdash; auto-detects Claude's `/rc` and opens it in a new window
58
+ - **Mobile-first** &mdash; touch toolbar, hamburger sidebar, swipe gestures
59
+ - **Screenshots panel** &mdash; view and dismiss captured screenshots
60
+ - **Dead pane detection** &mdash; visual indication when a tmux pane closes
61
+ - **Other tmux panes** &mdash; browse and view non-Claude panes too
62
+ - **Auth support** &mdash; optional password protection for LAN access
63
+ - **CLI scripting** &mdash; `send`, `wait`, `status`, `capture` commands for automation
81
64
 
82
65
  ---
83
66
 
84
67
  ## Installation
85
68
 
86
- ### From npm/bun (recommended)
87
-
88
- ```bash
89
- bun install -g claude-mux
90
- # or: npm install -g claude-mux
91
- ```
92
-
93
- ### From source
94
-
95
- ```bash
96
- git clone https://github.com/christinoleo/claude-mux.git
97
- cd claude-mux
98
- bun install
99
- bun run build
100
- bun link # Makes 'claude-mux' available globally
101
- ```
102
-
103
- ---
104
-
105
- ## Quick Start
106
-
107
- ### 1. Run setup
69
+ **One-liner (recommended)** &mdash; installs bun, claude-mux, hooks, and starts the server on `127.0.0.1:3456`:
108
70
 
109
71
  ```bash
110
- claude-mux setup
72
+ curl -fsSL https://raw.githubusercontent.com/christinoleo/claude-mux/main/scripts/install.sh | bash
111
73
  ```
112
74
 
113
- This will:
114
- - Create the data directory at `~/.claude-watch/`
115
- - Install Claude Code hooks in `~/.claude/settings.json`
75
+ Override defaults with env vars: `CLAUDE_MUX_VERSION`, `CLAUDE_MUX_PORT`, `CLAUDE_MUX_NO_SETUP=1`, `CLAUDE_MUX_NO_SERVE=1`.
116
76
 
117
- ### 2. Start the web server
77
+ **Manual** &mdash; if you already have a Node/Bun toolchain:
118
78
 
119
79
  ```bash
120
- claude-mux serve --port 3456 --host 0.0.0.0
80
+ npm install -g claude-mux # or: bun install -g claude-mux
81
+ claude-mux setup # install Claude Code hooks
121
82
  ```
122
83
 
123
- ### 3. Open the dashboard
124
-
125
- Navigate to `http://localhost:3456` (or your machine's IP for LAN access).
126
-
127
- ### 4. Start using Claude Code
128
-
129
- Any Claude Code session started after setup will appear in the dashboard automatically.
130
-
131
- ---
132
-
133
- ## Web Interface
134
-
135
- ### Dashboard
136
-
137
- The main dashboard shows all active Claude Code sessions organized by project:
138
-
139
- | Element | Description |
140
- |---------|-------------|
141
- | **Project cards** | Sessions grouped by working directory |
142
- | **Status indicators** | Busy, Idle, Waiting for input |
143
- | **Current action** | Shows what Claude is currently doing |
144
- | **Quick actions** | New session, kill session, refresh |
145
-
146
- ### Session View
147
-
148
- Click any session to open the real-time terminal view:
149
-
150
- | Feature | Description |
151
- |---------|-------------|
152
- | **Live output** | Streams terminal content via WebSocket |
153
- | **Syntax highlighting** | Color-coded messages and tool calls |
154
- | **Text input** | Send messages to Claude |
155
- | **Action buttons** | Up, Down, Space, Tab, Esc, Ctrl-C, etc. |
156
- | **Tmux command** | Copy `tmux attach` command for direct access |
157
-
158
- ### Keyboard Shortcuts (in session view)
159
-
160
- | Key | Action |
161
- |-----|--------|
162
- | `Enter` | Send message |
163
- | `Shift+Enter` | New line in message |
164
-
165
- ---
166
-
167
- ## CLI Commands
168
-
169
- | Command | Description |
170
- |---------|-------------|
171
- | `claude-mux serve` | Start the web server |
172
- | `claude-mux setup` | Run interactive setup wizard |
173
- | `claude-mux uninstall` | Remove hooks and configuration |
174
- | `claude-mux` | Start TUI dashboard (legacy, requires tmux) |
175
-
176
- ### Server Options
84
+ If `npm install -g` fails with `EACCES`, your npm prefix is a system path. Switch to a user prefix (one-time):
177
85
 
178
86
  ```bash
179
- claude-mux serve [options]
180
-
181
- Options:
182
- -p, --port <number> Port to listen on (default: 45677)
183
- -h, --host <string> Host to bind to (default: "localhost")
184
- -a, --auth <password> Enable authentication with password
87
+ mkdir -p ~/.npm-global
88
+ npm config set prefix ~/.npm-global
89
+ echo 'export PATH="$HOME/.npm-global/bin:$PATH"' >> ~/.bashrc
90
+ exec $SHELL -l
185
91
  ```
186
92
 
187
- ### Examples
93
+ <details>
94
+ <summary><strong>From source</strong></summary>
188
95
 
189
96
  ```bash
190
- # Start on custom port
191
- claude-mux serve --port 8080
192
-
193
- # Allow LAN access
194
- claude-mux serve --host 0.0.0.0
195
-
196
- # With authentication
197
- claude-mux serve --host 0.0.0.0 --auth mysecretpassword
97
+ git clone https://github.com/christinoleo/claude-mux.git
98
+ cd claude-mux
99
+ bun install && bun run build
100
+ bun link # makes 'claude-mux' available globally
198
101
  ```
102
+ </details>
199
103
 
200
104
  ---
201
105
 
202
- ## How It Works
106
+ ## Updating
203
107
 
204
- ### Architecture
205
-
206
- ```
207
- ┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
208
- │ Claude Code │────▶│ Hook Scripts │────▶│ JSON Files │
209
- │ (running) │ │ (on events) │ │ (~/.claude-watch/sessions/)
210
- └─────────────────┘ └──────────────────┘ └────────┬────────┘
211
-
212
- ┌─────────────────┐ ┌──────────────────┐ │
213
- │ tmux panes │────▶│ Pane Capture │──────────────┤
214
- │ (terminal) │ │ (WebSocket) │ │
215
- └─────────────────┘ └──────────────────┘ │
216
-
217
- ┌──────────────────┐ ┌─────────────────┐
218
- │ Web Browser │◀───▶│ SvelteKit │
219
- │ (dashboard) │ │ (WebSocket) │
220
- └──────────────────┘ └─────────────────┘
108
+ ```bash
109
+ claude-mux update # npm i -g latest, re-syncs hooks, restarts prod server if running
110
+ claude-mux update --force # reinstall even when already on latest
221
111
  ```
222
112
 
223
- ### Claude Code Hooks
224
-
225
- claude-mux uses [Claude Code hooks](https://docs.anthropic.com/en/docs/claude-code/hooks) to track session state:
226
-
227
- | Hook | Purpose |
228
- |------|---------|
229
- | `SessionStart` | Register new session with PID and working directory |
230
- | `UserPromptSubmit` | Mark session as busy |
231
- | `PreToolUse` | Update status with current tool name |
232
- | `Stop` | Mark session as idle when turn ends |
233
- | `Notification` | Handle permission requests and questions |
234
-
235
- ### Real-time Updates
236
-
237
- - **WebSocket connections** for instant updates (no polling)
238
- - **File watcher** monitors session state changes
239
- - **Pane capture** streams terminal output every 200ms
113
+ `update` stops the prod server before reinstalling so live module files aren't clobbered, then re-runs `setup --yes` so hook paths stay current.
240
114
 
241
115
  ---
242
116
 
243
- ## Terminal UI (Legacy)
117
+ ## Running as a service (boot autostart)
244
118
 
245
- claude-mux also includes a terminal-based dashboard for use inside tmux:
119
+ `claude-mux service install` writes a **systemd user unit** (no root needed for install):
246
120
 
247
121
  ```bash
248
- claude-mux # Requires tmux
249
- ```
122
+ claude-mux service install # writes ~/.config/systemd/user/claude-mux.service, enables + starts
123
+ claude-mux service status # systemctl --user status …
124
+ claude-mux service uninstall --purge # disable + remove unit
250
125
 
251
- | Key | Action |
252
- |-----|--------|
253
- | `j` / `↓` | Move selection down |
254
- | `k` / `↑` | Move selection up |
255
- | `Enter` | Jump to selected session |
256
- | `q` | Quit dashboard |
126
+ sudo loginctl enable-linger $USER # ONE-TIME sudo: keeps service running after logout / starts on boot
127
+ ```
257
128
 
258
- Press `prefix + W` from any tmux session to jump to the dashboard.
129
+ Logs: `journalctl --user -u claude-mux.service -f`
259
130
 
260
131
  ---
261
132
 
262
- ## Development
263
-
264
- ### Prerequisites
265
-
266
- - Node.js >= 18 (or Bun)
267
- - tmux (for full functionality)
268
-
269
- ### Setup
133
+ ## Quick Start
270
134
 
271
135
  ```bash
272
- git clone https://github.com/christinoleo/claude-mux.git
273
- cd claude-mux
274
- bun install
275
- ```
136
+ # 1. Install hooks into Claude Code
137
+ claude-mux setup
276
138
 
277
- ### Development Server
139
+ # 2. Start the web server
140
+ claude-mux serve --port 3456 --host 0.0.0.0
278
141
 
279
- ```bash
280
- bun run dev:serve # Starts Vite dev server with HMR
142
+ # 3. Open http://localhost:3456 (or your LAN IP)
143
+ # 4. Start any Claude Code session it appears automatically
281
144
  ```
282
145
 
283
- ### Build
146
+ ---
284
147
 
285
- ```bash
286
- bun run build # Build CLI + web app
287
- bun run build:cli # Build CLI only
288
- bun run build:web # Build web app only
289
- ```
148
+ ## CLI Commands
290
149
 
291
- ### Testing
150
+ | Command | Description |
151
+ |---------|-------------|
152
+ | `claude-mux serve` | Start web server (`--port`, `--host`, `--auth <password>`) |
153
+ | `claude-mux setup` | Install Claude Code hooks |
154
+ | `claude-mux update` | `npm i -g` latest, re-sync hooks, restart prod server |
155
+ | `claude-mux service install` | Install systemd user unit (boot autostart, no root) |
156
+ | `claude-mux service uninstall` | Disable systemd user unit (`--purge` removes the file) |
157
+ | `claude-mux service status` | Show systemd service status |
158
+ | `claude-mux uninstall` | Remove hooks and configuration |
159
+ | `claude-mux send <target> [text]` | Send text or `--keys` to a session |
160
+ | `claude-mux status <target>` | Get session state as JSON |
161
+ | `claude-mux wait <target>` | Block until session reaches `--state` (default: idle,waiting,permission) |
162
+ | `claude-mux new-session --cwd <path>` | Spawn a new detached Claude Code session |
163
+ | `claude-mux capture <target>` | Capture tmux pane output (`--lines N`) |
164
+ | `claude-mux` | TUI dashboard (legacy, requires tmux) |
292
165
 
293
- ```bash
294
- bun test # Run tests
295
- bun run lint # Lint code
296
- bun run format # Format code
297
- ```
166
+ ---
298
167
 
299
- ### Project Structure
168
+ ## How It Works
300
169
 
301
170
  ```
302
- claude-mux/
303
- ├── src/ # CLI and hooks
304
- │ ├── cli.ts # Entry point
305
- │ ├── commands/ # CLI commands (serve, setup, tui)
306
- │ ├── hooks/ # Claude Code hook handler
307
- │ └── server/ # File watcher, WebSocket handlers
308
- ├── web/ # SvelteKit web app
309
- │ ├── src/
310
- │ │ ├── lib/
311
- │ │ │ ├── components/ # UI components
312
- │ │ │ ├── stores/ # Svelte stores (sessions, terminal, preferences)
313
- │ │ │ └── utils/ # Terminal parser, helpers
314
- │ │ └── routes/ # Pages and API routes
315
- │ └── svelte.config.js
316
- └── docs/
317
- └── images/ # Screenshots
171
+ Claude Code events ──> Hook script ──> JSON files (~/.claude-mux/sessions/)
172
+ |
173
+ File watcher (500ms)
174
+ |
175
+ WebSocket broadcast
176
+ |
177
+ Browser <──> SvelteKit server
318
178
  ```
319
179
 
180
+ **Hooks** run inside Claude Code's process and write session state to JSON on every event (start, prompt, tool use, stop, notification). The **SvelteKit server** watches those files and pushes updates to connected browsers via WebSocket. Terminal output is captured directly from tmux panes.
181
+
320
182
  ---
321
183
 
322
184
  ## Troubleshooting
323
185
 
324
- ### Sessions not appearing
325
-
326
- 1. Ensure you ran `claude-mux setup` to install hooks
327
- 2. Restart any running Claude Code sessions (hooks are loaded at startup)
328
- 3. Check that `~/.claude/settings.json` contains claude-mux hooks
186
+ **Sessions not appearing** &mdash; Run `claude-mux setup`, then restart Claude Code sessions (hooks load at startup).
329
187
 
330
- ### Cannot connect from another device
188
+ **Can't connect from another device** &mdash; Use `--host 0.0.0.0` and check your firewall.
331
189
 
332
- 1. Use `--host 0.0.0.0` to allow external connections
333
- 2. Check your firewall allows the port
334
- 3. Use your machine's LAN IP, not `localhost`
190
+ **Status not updating** &mdash; Verify hooks: `grep claude-mux ~/.claude/settings.json`
335
191
 
336
- ### Status not updating
337
-
338
- 1. Check hooks are installed: `grep claude-mux ~/.claude/settings.json`
339
- 2. Restart Claude Code sessions to pick up new hooks
192
+ **Voice transcription slow on first use** &mdash; The first invocation builds whisper.cpp and downloads a Whisper model into `~/.claude-mux/voice/`. Subsequent runs reuse the cache. CUDA is used automatically if `nvidia-smi` and `nvcc` are present.
340
193
 
341
194
  ---
342
195
 
343
196
  ## Requirements
344
197
 
345
- - **Bun** >= 1.0 (required for the web server)
346
- - **tmux** (required for terminal capture)
347
- - **Claude Code** with hooks support
348
-
349
- > **Note:** The `claude-mux serve` command requires [Bun](https://bun.sh) runtime.
198
+ - [Bun](https://bun.sh) >= 1.0
199
+ - tmux
200
+ - Claude Code with hooks support
201
+ - Optional, for voice input: a working C/C++ toolchain (whisper.cpp builds on first use); NVIDIA CUDA toolkit for GPU transcription
350
202
 
351
203
  ---
352
204
 
@@ -354,15 +206,6 @@ claude-mux/
354
206
 
355
207
  MIT
356
208
 
357
- ---
358
-
359
209
  ## Contributing
360
210
 
361
- Contributions are welcome! Please feel free to submit a Pull Request.
362
-
363
- 1. Fork the repository
364
- 2. Create your feature branch (`git checkout -b feature/amazing-feature`)
365
- 3. Run tests (`bun test`)
366
- 4. Commit your changes
367
- 5. Push to the branch
368
- 6. Open a Pull Request
211
+ PRs welcome. Fork, branch, test (`bun test`), and open a PR.
@@ -0,0 +1,12 @@
1
+ import type { SessionAgent } from "./db/index.js";
2
+ export declare const AGENT_IDS: readonly ["claude", "gemini", "copilot"];
3
+ export interface AgentMeta {
4
+ icon: string;
5
+ color: string;
6
+ label: string;
7
+ command: string;
8
+ argv: string[];
9
+ }
10
+ export declare const AGENTS: Record<SessionAgent, AgentMeta>;
11
+ export declare function parseAgent(value: unknown): SessionAgent;
12
+ //# sourceMappingURL=agents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,eAAO,MAAM,SAAS,0CAA2C,CAAC;AAElE,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,SAAS,CAsBlD,CAAC;AAEF,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CAEvD"}