@akiojin/gwt 2.12.1 → 2.14.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 (344) hide show
  1. package/README.ja.md +33 -0
  2. package/README.md +31 -0
  3. package/dist/claude.d.ts.map +1 -1
  4. package/dist/claude.js +17 -11
  5. package/dist/claude.js.map +1 -1
  6. package/dist/cli/ui/components/App.d.ts +0 -6
  7. package/dist/cli/ui/components/App.d.ts.map +1 -1
  8. package/dist/cli/ui/components/App.js +93 -85
  9. package/dist/cli/ui/components/App.js.map +1 -1
  10. package/dist/cli/ui/components/common/Select.js +2 -2
  11. package/dist/cli/ui/components/common/Select.js.map +1 -1
  12. package/dist/cli/ui/components/screens/BranchListScreen.d.ts +3 -1
  13. package/dist/cli/ui/components/screens/BranchListScreen.d.ts.map +1 -1
  14. package/dist/cli/ui/components/screens/BranchListScreen.js +168 -34
  15. package/dist/cli/ui/components/screens/BranchListScreen.js.map +1 -1
  16. package/dist/cli/ui/components/screens/BranchQuickStartScreen.d.ts.map +1 -1
  17. package/dist/cli/ui/components/screens/BranchQuickStartScreen.js +3 -3
  18. package/dist/cli/ui/components/screens/BranchQuickStartScreen.js.map +1 -1
  19. package/dist/cli/ui/hooks/useGitData.d.ts.map +1 -1
  20. package/dist/cli/ui/hooks/useGitData.js +17 -0
  21. package/dist/cli/ui/hooks/useGitData.js.map +1 -1
  22. package/dist/cli/ui/types.d.ts +2 -0
  23. package/dist/cli/ui/types.d.ts.map +1 -1
  24. package/dist/cli/ui/utils/branchFormatter.d.ts.map +1 -1
  25. package/dist/cli/ui/utils/branchFormatter.js +7 -2
  26. package/dist/cli/ui/utils/branchFormatter.js.map +1 -1
  27. package/dist/cli/ui/utils/continueSession.d.ts.map +1 -1
  28. package/dist/cli/ui/utils/continueSession.js +1 -1
  29. package/dist/cli/ui/utils/continueSession.js.map +1 -1
  30. package/dist/cli/ui/utils/modelOptions.d.ts.map +1 -1
  31. package/dist/cli/ui/utils/modelOptions.js +7 -0
  32. package/dist/cli/ui/utils/modelOptions.js.map +1 -1
  33. package/dist/client/assets/index-DPWWHorC.js +72 -0
  34. package/dist/client/assets/index-DsDNCy5f.css +1 -0
  35. package/dist/client/index.html +2 -2
  36. package/dist/codex.d.ts.map +1 -1
  37. package/dist/codex.js +21 -11
  38. package/dist/codex.js.map +1 -1
  39. package/dist/config/builtin-tools.d.ts.map +1 -1
  40. package/dist/config/builtin-tools.js +3 -2
  41. package/dist/config/builtin-tools.js.map +1 -1
  42. package/dist/config/shared-env.d.ts +41 -0
  43. package/dist/config/shared-env.d.ts.map +1 -0
  44. package/dist/config/shared-env.js +114 -0
  45. package/dist/config/shared-env.js.map +1 -0
  46. package/dist/gemini.d.ts.map +1 -1
  47. package/dist/gemini.js +20 -17
  48. package/dist/gemini.js.map +1 -1
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +55 -7
  51. package/dist/index.js.map +1 -1
  52. package/dist/logging/logger.d.ts +24 -0
  53. package/dist/logging/logger.d.ts.map +1 -0
  54. package/dist/logging/logger.js +60 -0
  55. package/dist/logging/logger.js.map +1 -0
  56. package/dist/logging/rotation.d.ts +6 -0
  57. package/dist/logging/rotation.d.ts.map +1 -0
  58. package/dist/logging/rotation.js +26 -0
  59. package/dist/logging/rotation.js.map +1 -0
  60. package/dist/qwen.d.ts.map +1 -1
  61. package/dist/qwen.js +15 -11
  62. package/dist/qwen.js.map +1 -1
  63. package/dist/services/aiToolResolver.d.ts +41 -0
  64. package/dist/services/aiToolResolver.d.ts.map +1 -0
  65. package/dist/services/aiToolResolver.js +194 -0
  66. package/dist/services/aiToolResolver.js.map +1 -0
  67. package/dist/services/customToolResolver.d.ts +10 -0
  68. package/dist/services/customToolResolver.d.ts.map +1 -0
  69. package/dist/services/customToolResolver.js +71 -0
  70. package/dist/services/customToolResolver.js.map +1 -0
  71. package/dist/shared/aiToolConstants.d.ts +9 -0
  72. package/dist/shared/aiToolConstants.d.ts.map +1 -0
  73. package/dist/shared/aiToolConstants.js +29 -0
  74. package/dist/shared/aiToolConstants.js.map +1 -0
  75. package/dist/types/tools.d.ts +12 -0
  76. package/dist/types/tools.d.ts.map +1 -1
  77. package/dist/utils/prompt.d.ts.map +1 -1
  78. package/dist/utils/prompt.js.map +1 -1
  79. package/dist/utils/session.d.ts.map +1 -1
  80. package/dist/utils/session.js +15 -6
  81. package/dist/utils/session.js.map +1 -1
  82. package/dist/utils/terminal.d.ts +12 -3
  83. package/dist/utils/terminal.d.ts.map +1 -1
  84. package/dist/utils/terminal.js +5 -34
  85. package/dist/utils/terminal.js.map +1 -1
  86. package/dist/utils/webui.d.ts +8 -0
  87. package/dist/utils/webui.d.ts.map +1 -0
  88. package/dist/utils/webui.js +35 -0
  89. package/dist/utils/webui.js.map +1 -0
  90. package/dist/web/client/src/components/AIToolLaunchModal.d.ts +9 -0
  91. package/dist/web/client/src/components/AIToolLaunchModal.d.ts.map +1 -0
  92. package/dist/web/client/src/components/AIToolLaunchModal.js +363 -0
  93. package/dist/web/client/src/components/AIToolLaunchModal.js.map +1 -0
  94. package/dist/web/client/src/components/BranchGraph.d.ts.map +1 -1
  95. package/dist/web/client/src/components/BranchGraph.js +46 -49
  96. package/dist/web/client/src/components/BranchGraph.js.map +1 -1
  97. package/dist/web/client/src/components/CustomToolForm.d.ts +23 -0
  98. package/dist/web/client/src/components/CustomToolForm.d.ts.map +1 -0
  99. package/dist/web/client/src/components/CustomToolForm.js +209 -0
  100. package/dist/web/client/src/components/CustomToolForm.js.map +1 -0
  101. package/dist/web/client/src/components/CustomToolList.d.ts +10 -0
  102. package/dist/web/client/src/components/CustomToolList.d.ts.map +1 -0
  103. package/dist/web/client/src/components/CustomToolList.js +57 -0
  104. package/dist/web/client/src/components/CustomToolList.js.map +1 -0
  105. package/dist/web/client/src/components/EnvEditor.d.ts.map +1 -1
  106. package/dist/web/client/src/components/EnvEditor.js +33 -26
  107. package/dist/web/client/src/components/EnvEditor.js.map +1 -1
  108. package/dist/web/client/src/components/EnvironmentEditor.d.ts +17 -0
  109. package/dist/web/client/src/components/EnvironmentEditor.d.ts.map +1 -0
  110. package/dist/web/client/src/components/EnvironmentEditor.js +22 -0
  111. package/dist/web/client/src/components/EnvironmentEditor.js.map +1 -0
  112. package/dist/web/client/src/components/Terminal.d.ts.map +1 -1
  113. package/dist/web/client/src/components/Terminal.js +10 -3
  114. package/dist/web/client/src/components/Terminal.js.map +1 -1
  115. package/dist/web/client/src/components/branch-detail/BranchInfoCards.d.ts +10 -0
  116. package/dist/web/client/src/components/branch-detail/BranchInfoCards.d.ts.map +1 -0
  117. package/dist/web/client/src/components/branch-detail/BranchInfoCards.js +104 -0
  118. package/dist/web/client/src/components/branch-detail/BranchInfoCards.js.map +1 -0
  119. package/dist/web/client/src/components/branch-detail/SessionHistoryTable.d.ts +22 -0
  120. package/dist/web/client/src/components/branch-detail/SessionHistoryTable.d.ts.map +1 -0
  121. package/dist/web/client/src/components/branch-detail/SessionHistoryTable.js +79 -0
  122. package/dist/web/client/src/components/branch-detail/SessionHistoryTable.js.map +1 -0
  123. package/dist/web/client/src/components/branch-detail/TerminalPanel.d.ts +11 -0
  124. package/dist/web/client/src/components/branch-detail/TerminalPanel.d.ts.map +1 -0
  125. package/dist/web/client/src/components/branch-detail/TerminalPanel.js +32 -0
  126. package/dist/web/client/src/components/branch-detail/TerminalPanel.js.map +1 -0
  127. package/dist/web/client/src/components/branch-detail/ToolLauncher.d.ts +40 -0
  128. package/dist/web/client/src/components/branch-detail/ToolLauncher.d.ts.map +1 -0
  129. package/dist/web/client/src/components/branch-detail/ToolLauncher.js +147 -0
  130. package/dist/web/client/src/components/branch-detail/ToolLauncher.js.map +1 -0
  131. package/dist/web/client/src/components/branch-detail/index.d.ts +5 -0
  132. package/dist/web/client/src/components/branch-detail/index.d.ts.map +1 -0
  133. package/dist/web/client/src/components/branch-detail/index.js +5 -0
  134. package/dist/web/client/src/components/branch-detail/index.js.map +1 -0
  135. package/dist/web/client/src/components/common/BranchCard.d.ts +17 -0
  136. package/dist/web/client/src/components/common/BranchCard.d.ts.map +1 -0
  137. package/dist/web/client/src/components/common/BranchCard.js +36 -0
  138. package/dist/web/client/src/components/common/BranchCard.js.map +1 -0
  139. package/dist/web/client/src/components/common/MetricCard.d.ts +10 -0
  140. package/dist/web/client/src/components/common/MetricCard.d.ts.map +1 -0
  141. package/dist/web/client/src/components/common/MetricCard.js +10 -0
  142. package/dist/web/client/src/components/common/MetricCard.js.map +1 -0
  143. package/dist/web/client/src/components/common/PageHeader.d.ts +12 -0
  144. package/dist/web/client/src/components/common/PageHeader.d.ts.map +1 -0
  145. package/dist/web/client/src/components/common/PageHeader.js +14 -0
  146. package/dist/web/client/src/components/common/PageHeader.js.map +1 -0
  147. package/dist/web/client/src/components/common/SearchInput.d.ts +14 -0
  148. package/dist/web/client/src/components/common/SearchInput.d.ts.map +1 -0
  149. package/dist/web/client/src/components/common/SearchInput.js +15 -0
  150. package/dist/web/client/src/components/common/SearchInput.js.map +1 -0
  151. package/dist/web/client/src/components/common/StatusBadge.d.ts +10 -0
  152. package/dist/web/client/src/components/common/StatusBadge.d.ts.map +1 -0
  153. package/dist/web/client/src/components/common/StatusBadge.js +15 -0
  154. package/dist/web/client/src/components/common/StatusBadge.js.map +1 -0
  155. package/dist/web/client/src/components/common/index.d.ts +6 -0
  156. package/dist/web/client/src/components/common/index.d.ts.map +1 -0
  157. package/dist/web/client/src/components/common/index.js +6 -0
  158. package/dist/web/client/src/components/common/index.js.map +1 -0
  159. package/dist/web/client/src/components/ui/alert.d.ts +9 -0
  160. package/dist/web/client/src/components/ui/alert.d.ts.map +1 -0
  161. package/dist/web/client/src/components/ui/alert.js +25 -0
  162. package/dist/web/client/src/components/ui/alert.js.map +1 -0
  163. package/dist/web/client/src/components/ui/badge.d.ts +10 -0
  164. package/dist/web/client/src/components/ui/badge.d.ts.map +1 -0
  165. package/dist/web/client/src/components/ui/badge.js +25 -0
  166. package/dist/web/client/src/components/ui/badge.js.map +1 -0
  167. package/dist/web/client/src/components/ui/button.d.ts +12 -0
  168. package/dist/web/client/src/components/ui/button.d.ts.map +1 -0
  169. package/dist/web/client/src/components/ui/button.js +33 -0
  170. package/dist/web/client/src/components/ui/button.js.map +1 -0
  171. package/dist/web/client/src/components/ui/card.d.ts +9 -0
  172. package/dist/web/client/src/components/ui/card.d.ts.map +1 -0
  173. package/dist/web/client/src/components/ui/card.js +16 -0
  174. package/dist/web/client/src/components/ui/card.js.map +1 -0
  175. package/dist/web/client/src/components/ui/index.d.ts +8 -0
  176. package/dist/web/client/src/components/ui/index.d.ts.map +1 -0
  177. package/dist/web/client/src/components/ui/index.js +8 -0
  178. package/dist/web/client/src/components/ui/index.js.map +1 -0
  179. package/dist/web/client/src/components/ui/input.d.ts +4 -0
  180. package/dist/web/client/src/components/ui/input.d.ts.map +1 -0
  181. package/dist/web/client/src/components/ui/input.js +8 -0
  182. package/dist/web/client/src/components/ui/input.js.map +1 -0
  183. package/dist/web/client/src/components/ui/select.d.ts +14 -0
  184. package/dist/web/client/src/components/ui/select.d.ts.map +1 -0
  185. package/dist/web/client/src/components/ui/select.js +39 -0
  186. package/dist/web/client/src/components/ui/select.js.map +1 -0
  187. package/dist/web/client/src/components/ui/table.d.ts +11 -0
  188. package/dist/web/client/src/components/ui/table.d.ts.map +1 -0
  189. package/dist/web/client/src/components/ui/table.js +21 -0
  190. package/dist/web/client/src/components/ui/table.js.map +1 -0
  191. package/dist/web/client/src/hooks/useSessions.d.ts.map +1 -1
  192. package/dist/web/client/src/hooks/useSessions.js +6 -1
  193. package/dist/web/client/src/hooks/useSessions.js.map +1 -1
  194. package/dist/web/client/src/lib/utils.d.ts +7 -0
  195. package/dist/web/client/src/lib/utils.d.ts.map +1 -0
  196. package/dist/web/client/src/lib/utils.js +10 -0
  197. package/dist/web/client/src/lib/utils.js.map +1 -0
  198. package/dist/web/client/src/lib/websocket.d.ts +7 -0
  199. package/dist/web/client/src/lib/websocket.d.ts.map +1 -1
  200. package/dist/web/client/src/lib/websocket.js +44 -0
  201. package/dist/web/client/src/lib/websocket.js.map +1 -1
  202. package/dist/web/client/src/pages/BranchDetailPage.d.ts.map +1 -1
  203. package/dist/web/client/src/pages/BranchDetailPage.js +113 -361
  204. package/dist/web/client/src/pages/BranchDetailPage.js.map +1 -1
  205. package/dist/web/client/src/pages/BranchListPage.d.ts.map +1 -1
  206. package/dist/web/client/src/pages/BranchListPage.js +89 -127
  207. package/dist/web/client/src/pages/BranchListPage.js.map +1 -1
  208. package/dist/web/client/src/pages/ConfigManagementPage.d.ts.map +1 -1
  209. package/dist/web/client/src/pages/ConfigManagementPage.js +46 -41
  210. package/dist/web/client/src/pages/ConfigManagementPage.js.map +1 -1
  211. package/dist/web/client/src/pages/ConfigPage.d.ts +3 -0
  212. package/dist/web/client/src/pages/ConfigPage.d.ts.map +1 -0
  213. package/dist/web/client/src/pages/ConfigPage.js +216 -0
  214. package/dist/web/client/src/pages/ConfigPage.js.map +1 -0
  215. package/dist/web/client/vite.config.d.ts.map +1 -1
  216. package/dist/web/client/vite.config.js +8 -1
  217. package/dist/web/client/vite.config.js.map +1 -1
  218. package/dist/web/server/index.d.ts +24 -2
  219. package/dist/web/server/index.d.ts.map +1 -1
  220. package/dist/web/server/index.js +49 -18
  221. package/dist/web/server/index.js.map +1 -1
  222. package/dist/web/server/pty/manager.d.ts +12 -10
  223. package/dist/web/server/pty/manager.d.ts.map +1 -1
  224. package/dist/web/server/pty/manager.js +76 -43
  225. package/dist/web/server/pty/manager.js.map +1 -1
  226. package/dist/web/server/routes/branches.d.ts +2 -2
  227. package/dist/web/server/routes/branches.d.ts.map +1 -1
  228. package/dist/web/server/routes/branches.js.map +1 -1
  229. package/dist/web/server/routes/config.d.ts +2 -2
  230. package/dist/web/server/routes/config.d.ts.map +1 -1
  231. package/dist/web/server/routes/config.js.map +1 -1
  232. package/dist/web/server/routes/index.d.ts +2 -2
  233. package/dist/web/server/routes/index.d.ts.map +1 -1
  234. package/dist/web/server/routes/index.js.map +1 -1
  235. package/dist/web/server/routes/sessions.d.ts +2 -2
  236. package/dist/web/server/routes/sessions.d.ts.map +1 -1
  237. package/dist/web/server/routes/sessions.js +35 -2
  238. package/dist/web/server/routes/sessions.js.map +1 -1
  239. package/dist/web/server/routes/worktrees.d.ts +2 -2
  240. package/dist/web/server/routes/worktrees.d.ts.map +1 -1
  241. package/dist/web/server/routes/worktrees.js +2 -2
  242. package/dist/web/server/routes/worktrees.js.map +1 -1
  243. package/dist/web/server/services/worktrees.d.ts.map +1 -1
  244. package/dist/web/server/services/worktrees.js +7 -1
  245. package/dist/web/server/services/worktrees.js.map +1 -1
  246. package/dist/web/server/tray.d.ts +24 -0
  247. package/dist/web/server/tray.d.ts.map +1 -0
  248. package/dist/web/server/tray.js +79 -0
  249. package/dist/web/server/tray.js.map +1 -0
  250. package/dist/web/server/types.d.ts +4 -0
  251. package/dist/web/server/types.d.ts.map +1 -0
  252. package/dist/web/server/types.js +2 -0
  253. package/dist/web/server/types.js.map +1 -0
  254. package/dist/web/server/websocket/handler.d.ts +18 -2
  255. package/dist/web/server/websocket/handler.d.ts.map +1 -1
  256. package/dist/web/server/websocket/handler.js +82 -9
  257. package/dist/web/server/websocket/handler.js.map +1 -1
  258. package/dist/worktree.d.ts +1 -0
  259. package/dist/worktree.d.ts.map +1 -1
  260. package/dist/worktree.js.map +1 -1
  261. package/package.json +17 -3
  262. package/src/claude.ts +26 -15
  263. package/src/cli/ui/__tests__/components/ModelSelectorScreen.initial.test.tsx +13 -13
  264. package/src/cli/ui/__tests__/components/common/Select.test.tsx +11 -0
  265. package/src/cli/ui/__tests__/components/screens/BranchListScreen.test.tsx +97 -33
  266. package/src/cli/ui/__tests__/components/screens/BranchQuickStartScreen.test.tsx +4 -4
  267. package/src/cli/ui/__tests__/performance/branchList.performance.test.tsx +7 -3
  268. package/src/cli/ui/components/App.tsx +111 -125
  269. package/src/cli/ui/components/common/Select.tsx +2 -2
  270. package/src/cli/ui/components/screens/BranchListScreen.tsx +220 -34
  271. package/src/cli/ui/components/screens/BranchQuickStartScreen.tsx +41 -46
  272. package/src/cli/ui/hooks/useGitData.ts +20 -0
  273. package/src/cli/ui/types.ts +3 -0
  274. package/src/cli/ui/utils/branchFormatter.ts +7 -2
  275. package/src/cli/ui/utils/continueSession.ts +1 -7
  276. package/src/cli/ui/utils/modelOptions.test.ts +14 -0
  277. package/src/cli/ui/utils/modelOptions.ts +7 -0
  278. package/src/codex.ts +31 -22
  279. package/src/config/builtin-tools.ts +6 -2
  280. package/src/config/shared-env.ts +139 -0
  281. package/src/gemini.ts +35 -22
  282. package/src/index.ts +61 -7
  283. package/src/logging/logger.ts +82 -0
  284. package/src/logging/rotation.ts +25 -0
  285. package/src/qwen.ts +28 -19
  286. package/src/services/aiToolResolver.ts +276 -0
  287. package/src/services/customToolResolver.ts +98 -0
  288. package/src/shared/aiToolConstants.ts +30 -0
  289. package/src/trayicon.d.ts +30 -0
  290. package/src/types/tools.ts +15 -0
  291. package/src/utils/prompt.ts +15 -9
  292. package/src/utils/session.ts +80 -26
  293. package/src/utils/terminal.ts +11 -41
  294. package/src/utils/webui.ts +43 -0
  295. package/src/web/client/components.json +21 -0
  296. package/src/web/client/src/components/AIToolLaunchModal.tsx +575 -0
  297. package/src/web/client/src/components/BranchGraph.tsx +95 -75
  298. package/src/web/client/src/components/CustomToolForm.tsx +386 -0
  299. package/src/web/client/src/components/CustomToolList.tsx +119 -0
  300. package/src/web/client/src/components/EnvEditor.tsx +91 -81
  301. package/src/web/client/src/components/EnvironmentEditor.tsx +97 -0
  302. package/src/web/client/src/components/Terminal.tsx +11 -3
  303. package/src/web/client/src/components/branch-detail/BranchInfoCards.tsx +179 -0
  304. package/src/web/client/src/components/branch-detail/SessionHistoryTable.tsx +181 -0
  305. package/src/web/client/src/components/branch-detail/TerminalPanel.tsx +92 -0
  306. package/src/web/client/src/components/branch-detail/ToolLauncher.tsx +327 -0
  307. package/src/web/client/src/components/branch-detail/index.ts +4 -0
  308. package/src/web/client/src/components/common/BranchCard.tsx +117 -0
  309. package/src/web/client/src/components/common/MetricCard.tsx +22 -0
  310. package/src/web/client/src/components/common/PageHeader.tsx +44 -0
  311. package/src/web/client/src/components/common/SearchInput.tsx +40 -0
  312. package/src/web/client/src/components/common/StatusBadge.tsx +37 -0
  313. package/src/web/client/src/components/common/index.ts +5 -0
  314. package/src/web/client/src/components/ui/alert.tsx +63 -0
  315. package/src/web/client/src/components/ui/badge.tsx +44 -0
  316. package/src/web/client/src/components/ui/button.tsx +57 -0
  317. package/src/web/client/src/components/ui/card.tsx +82 -0
  318. package/src/web/client/src/components/ui/index.ts +32 -0
  319. package/src/web/client/src/components/ui/input.tsx +21 -0
  320. package/src/web/client/src/components/ui/select.tsx +156 -0
  321. package/src/web/client/src/components/ui/table.tsx +119 -0
  322. package/src/web/client/src/hooks/useSessions.ts +10 -1
  323. package/src/web/client/src/index.css +46 -816
  324. package/src/web/client/src/lib/utils.ts +10 -0
  325. package/src/web/client/src/lib/websocket.ts +48 -1
  326. package/src/web/client/src/pages/BranchDetailPage.tsx +222 -694
  327. package/src/web/client/src/pages/BranchListPage.tsx +190 -236
  328. package/src/web/client/src/pages/ConfigManagementPage.tsx +94 -76
  329. package/src/web/client/src/pages/ConfigPage.tsx +362 -0
  330. package/src/web/client/vite.config.ts +8 -1
  331. package/src/web/server/index.ts +78 -19
  332. package/src/web/server/pty/manager.ts +128 -55
  333. package/src/web/server/routes/branches.ts +2 -2
  334. package/src/web/server/routes/config.ts +2 -2
  335. package/src/web/server/routes/index.ts +2 -2
  336. package/src/web/server/routes/sessions.ts +61 -9
  337. package/src/web/server/routes/worktrees.ts +5 -5
  338. package/src/web/server/services/worktrees.ts +12 -4
  339. package/src/web/server/tray.ts +93 -0
  340. package/src/web/server/types.ts +14 -0
  341. package/src/web/server/websocket/handler.ts +119 -13
  342. package/src/worktree.ts +1 -0
  343. package/dist/client/assets/index-DeNwPosA.css +0 -1
  344. package/dist/client/assets/index-Dl798X5w.js +0 -32
@@ -0,0 +1,10 @@
1
+ import { type ClassValue, clsx } from "clsx";
2
+ import { twMerge } from "tailwind-merge";
3
+
4
+ /**
5
+ * Combines class names with Tailwind CSS merge support.
6
+ * Handles conditional classes and resolves Tailwind conflicts.
7
+ */
8
+ export function cn(...inputs: ClassValue[]) {
9
+ return twMerge(clsx(inputs));
10
+ }
@@ -31,6 +31,11 @@ export class PTYWebSocket {
31
31
  private ws: WebSocket | null = null;
32
32
  private handlers: WebSocketEventHandler;
33
33
  private sessionId: string;
34
+ private reconnectTimer: number | null = null;
35
+ private retryCount = 0;
36
+ private exitReceived = false;
37
+ private manualClose = false;
38
+ private reconnectScheduled = false;
34
39
 
35
40
  constructor(sessionId: string, handlers: WebSocketEventHandler) {
36
41
  this.sessionId = sessionId;
@@ -41,13 +46,17 @@ export class PTYWebSocket {
41
46
  * WebSocket接続を確立
42
47
  */
43
48
  public connect(): void {
49
+ this.clearReconnectTimer();
44
50
  const protocol = window.location.protocol === "https:" ? "wss:" : "ws:";
45
51
  const host = window.location.host;
46
52
  const url = `${protocol}//${host}/api/sessions/${this.sessionId}/terminal?sessionId=${this.sessionId}`;
47
-
48
53
  this.ws = new WebSocket(url);
54
+ this.manualClose = false;
55
+ this.exitReceived = false;
56
+ this.reconnectScheduled = false;
49
57
 
50
58
  this.ws.onopen = () => {
59
+ this.retryCount = 0;
51
60
  this.handlers.onOpen?.();
52
61
  };
53
62
 
@@ -63,10 +72,12 @@ export class PTYWebSocket {
63
72
  this.ws.onerror = (event) => {
64
73
  console.error("WebSocket error:", event);
65
74
  this.handlers.onError?.("WebSocket connection error");
75
+ this.scheduleReconnect();
66
76
  };
67
77
 
68
78
  this.ws.onclose = () => {
69
79
  this.handlers.onClose?.();
80
+ this.scheduleReconnect();
70
81
  };
71
82
  }
72
83
 
@@ -82,6 +93,7 @@ export class PTYWebSocket {
82
93
  }
83
94
  case "exit": {
84
95
  const exitMsg = message as ExitMessage;
96
+ this.exitReceived = true;
85
97
  this.handlers.onExit?.(exitMsg.data.code, exitMsg.data.signal);
86
98
  break;
87
99
  }
@@ -159,6 +171,9 @@ export class PTYWebSocket {
159
171
  * WebSocket接続を切断
160
172
  */
161
173
  public disconnect(): void {
174
+ this.manualClose = true;
175
+ this.exitReceived = true;
176
+ this.clearReconnectTimer();
162
177
  if (this.ws) {
163
178
  this.ws.close();
164
179
  this.ws = null;
@@ -171,4 +186,36 @@ export class PTYWebSocket {
171
186
  public isConnected(): boolean {
172
187
  return this.ws !== null && this.ws.readyState === WebSocket.OPEN;
173
188
  }
189
+
190
+ private scheduleReconnect(): void {
191
+ if (this.reconnectScheduled) {
192
+ return;
193
+ }
194
+ if (this.manualClose || this.exitReceived) {
195
+ return;
196
+ }
197
+ if (this.retryCount >= MAX_WEBSOCKET_RETRIES) {
198
+ this.handlers.onError?.("Unable to reconnect to session.");
199
+ return;
200
+ }
201
+
202
+ this.retryCount += 1;
203
+ const delay = Math.min(2000, this.retryCount * 500);
204
+ this.clearReconnectTimer();
205
+ this.reconnectScheduled = true;
206
+ this.reconnectTimer = window.setTimeout(() => {
207
+ this.reconnectScheduled = false;
208
+ this.connect();
209
+ }, delay);
210
+ }
211
+
212
+ private clearReconnectTimer(): void {
213
+ if (this.reconnectTimer !== null) {
214
+ window.clearTimeout(this.reconnectTimer);
215
+ this.reconnectTimer = null;
216
+ this.reconnectScheduled = false;
217
+ }
218
+ }
174
219
  }
220
+
221
+ const MAX_WEBSOCKET_RETRIES = 5;