@akiojin/gwt 2.0.0 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (336) hide show
  1. package/dist/claude-history.d.ts +60 -0
  2. package/dist/claude-history.d.ts.map +1 -0
  3. package/dist/claude-history.js +606 -0
  4. package/dist/claude-history.js.map +1 -0
  5. package/dist/claude.d.ts +12 -0
  6. package/dist/claude.d.ts.map +1 -0
  7. package/dist/claude.js +222 -0
  8. package/dist/claude.js.map +1 -0
  9. package/dist/cli/ui/components/App.d.ts +22 -0
  10. package/dist/cli/ui/components/App.d.ts.map +1 -0
  11. package/dist/cli/ui/components/App.js +557 -0
  12. package/dist/cli/ui/components/App.js.map +1 -0
  13. package/dist/cli/ui/components/common/Confirm.d.ts +13 -0
  14. package/dist/cli/ui/components/common/Confirm.d.ts.map +1 -0
  15. package/dist/cli/ui/components/common/Confirm.js +20 -0
  16. package/dist/cli/ui/components/common/Confirm.js.map +1 -0
  17. package/dist/cli/ui/components/common/ErrorBoundary.d.ts +23 -0
  18. package/dist/cli/ui/components/common/ErrorBoundary.d.ts.map +1 -0
  19. package/dist/cli/ui/components/common/ErrorBoundary.js +37 -0
  20. package/dist/cli/ui/components/common/ErrorBoundary.js.map +1 -0
  21. package/dist/cli/ui/components/common/Input.d.ts +14 -0
  22. package/dist/cli/ui/components/common/Input.d.ts.map +1 -0
  23. package/dist/cli/ui/components/common/Input.js +14 -0
  24. package/dist/cli/ui/components/common/Input.js.map +1 -0
  25. package/dist/cli/ui/components/common/LoadingIndicator.d.ts +19 -0
  26. package/dist/cli/ui/components/common/LoadingIndicator.d.ts.map +1 -0
  27. package/dist/cli/ui/components/common/LoadingIndicator.js +61 -0
  28. package/dist/cli/ui/components/common/LoadingIndicator.js.map +1 -0
  29. package/dist/cli/ui/components/common/Select.d.ts +30 -0
  30. package/dist/cli/ui/components/common/Select.d.ts.map +1 -0
  31. package/dist/cli/ui/components/common/Select.js +140 -0
  32. package/dist/cli/ui/components/common/Select.js.map +1 -0
  33. package/dist/cli/ui/components/parts/Footer.d.ts +15 -0
  34. package/dist/cli/ui/components/parts/Footer.d.ts.map +1 -0
  35. package/dist/cli/ui/components/parts/Footer.js +20 -0
  36. package/dist/cli/ui/components/parts/Footer.js.map +1 -0
  37. package/dist/cli/ui/components/parts/Header.d.ts +29 -0
  38. package/dist/cli/ui/components/parts/Header.d.ts.map +1 -0
  39. package/dist/cli/ui/components/parts/Header.js +19 -0
  40. package/dist/cli/ui/components/parts/Header.js.map +1 -0
  41. package/dist/cli/ui/components/parts/MergeStatusList.d.ts +13 -0
  42. package/dist/cli/ui/components/parts/MergeStatusList.d.ts.map +1 -0
  43. package/dist/cli/ui/components/parts/MergeStatusList.js +52 -0
  44. package/dist/cli/ui/components/parts/MergeStatusList.js.map +1 -0
  45. package/dist/cli/ui/components/parts/ProgressBar.d.ts +13 -0
  46. package/dist/cli/ui/components/parts/ProgressBar.d.ts.map +1 -0
  47. package/dist/cli/ui/components/parts/ProgressBar.js +53 -0
  48. package/dist/cli/ui/components/parts/ProgressBar.js.map +1 -0
  49. package/dist/cli/ui/components/parts/ScrollableList.d.ts +12 -0
  50. package/dist/cli/ui/components/parts/ScrollableList.d.ts.map +1 -0
  51. package/dist/cli/ui/components/parts/ScrollableList.js +11 -0
  52. package/dist/cli/ui/components/parts/ScrollableList.js.map +1 -0
  53. package/dist/cli/ui/components/parts/Stats.d.ts +13 -0
  54. package/dist/cli/ui/components/parts/Stats.d.ts.map +1 -0
  55. package/dist/cli/ui/components/parts/Stats.js +42 -0
  56. package/dist/cli/ui/components/parts/Stats.js.map +1 -0
  57. package/dist/cli/ui/components/screens/AIToolSelectorScreen.d.ts +20 -0
  58. package/dist/cli/ui/components/screens/AIToolSelectorScreen.d.ts.map +1 -0
  59. package/dist/cli/ui/components/screens/AIToolSelectorScreen.js +77 -0
  60. package/dist/cli/ui/components/screens/AIToolSelectorScreen.js.map +1 -0
  61. package/dist/cli/ui/components/screens/BatchMergeProgressScreen.d.ts +14 -0
  62. package/dist/cli/ui/components/screens/BatchMergeProgressScreen.d.ts.map +1 -0
  63. package/dist/cli/ui/components/screens/BatchMergeProgressScreen.js +41 -0
  64. package/dist/cli/ui/components/screens/BatchMergeProgressScreen.js.map +1 -0
  65. package/dist/cli/ui/components/screens/BatchMergeResultScreen.d.ts +14 -0
  66. package/dist/cli/ui/components/screens/BatchMergeResultScreen.d.ts.map +1 -0
  67. package/dist/cli/ui/components/screens/BatchMergeResultScreen.js +71 -0
  68. package/dist/cli/ui/components/screens/BatchMergeResultScreen.js.map +1 -0
  69. package/dist/cli/ui/components/screens/BranchCreatorScreen.d.ts +15 -0
  70. package/dist/cli/ui/components/screens/BranchCreatorScreen.d.ts.map +1 -0
  71. package/dist/cli/ui/components/screens/BranchCreatorScreen.js +142 -0
  72. package/dist/cli/ui/components/screens/BranchCreatorScreen.js.map +1 -0
  73. package/dist/cli/ui/components/screens/BranchListScreen.d.ts +39 -0
  74. package/dist/cli/ui/components/screens/BranchListScreen.d.ts.map +1 -0
  75. package/dist/cli/ui/components/screens/BranchListScreen.js +172 -0
  76. package/dist/cli/ui/components/screens/BranchListScreen.js.map +1 -0
  77. package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.d.ts +29 -0
  78. package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.d.ts.map +1 -0
  79. package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.js +92 -0
  80. package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.js.map +1 -0
  81. package/dist/cli/ui/components/screens/PRCleanupScreen.d.ts +23 -0
  82. package/dist/cli/ui/components/screens/PRCleanupScreen.d.ts.map +1 -0
  83. package/dist/cli/ui/components/screens/PRCleanupScreen.js +94 -0
  84. package/dist/cli/ui/components/screens/PRCleanupScreen.js.map +1 -0
  85. package/dist/cli/ui/components/screens/SessionSelectorScreen.d.ts +17 -0
  86. package/dist/cli/ui/components/screens/SessionSelectorScreen.d.ts.map +1 -0
  87. package/dist/cli/ui/components/screens/SessionSelectorScreen.js +55 -0
  88. package/dist/cli/ui/components/screens/SessionSelectorScreen.js.map +1 -0
  89. package/dist/cli/ui/components/screens/WorktreeManagerScreen.d.ts +20 -0
  90. package/dist/cli/ui/components/screens/WorktreeManagerScreen.d.ts.map +1 -0
  91. package/dist/cli/ui/components/screens/WorktreeManagerScreen.js +65 -0
  92. package/dist/cli/ui/components/screens/WorktreeManagerScreen.js.map +1 -0
  93. package/dist/cli/ui/hooks/useBatchMerge.d.ts +17 -0
  94. package/dist/cli/ui/hooks/useBatchMerge.d.ts.map +1 -0
  95. package/dist/cli/ui/hooks/useBatchMerge.js +77 -0
  96. package/dist/cli/ui/hooks/useBatchMerge.js.map +1 -0
  97. package/dist/cli/ui/hooks/useGitData.d.ts +20 -0
  98. package/dist/cli/ui/hooks/useGitData.d.ts.map +1 -0
  99. package/dist/cli/ui/hooks/useGitData.js +116 -0
  100. package/dist/cli/ui/hooks/useGitData.js.map +1 -0
  101. package/dist/cli/ui/hooks/useScreenState.d.ts +12 -0
  102. package/dist/cli/ui/hooks/useScreenState.d.ts.map +1 -0
  103. package/dist/cli/ui/hooks/useScreenState.js +30 -0
  104. package/dist/cli/ui/hooks/useScreenState.js.map +1 -0
  105. package/dist/cli/ui/hooks/useTerminalSize.d.ts +9 -0
  106. package/dist/cli/ui/hooks/useTerminalSize.d.ts.map +1 -0
  107. package/dist/cli/ui/hooks/useTerminalSize.js +24 -0
  108. package/dist/cli/ui/hooks/useTerminalSize.js.map +1 -0
  109. package/dist/cli/ui/screens/BranchActionSelectorScreen.d.ts +21 -0
  110. package/dist/cli/ui/screens/BranchActionSelectorScreen.d.ts.map +1 -0
  111. package/dist/cli/ui/screens/BranchActionSelectorScreen.js +61 -0
  112. package/dist/cli/ui/screens/BranchActionSelectorScreen.js.map +1 -0
  113. package/dist/cli/ui/types.d.ts +245 -0
  114. package/dist/cli/ui/types.d.ts.map +1 -0
  115. package/dist/cli/ui/types.js +2 -0
  116. package/dist/cli/ui/types.js.map +1 -0
  117. package/dist/cli/ui/utils/baseBranch.d.ts +4 -0
  118. package/dist/cli/ui/utils/baseBranch.d.ts.map +1 -0
  119. package/dist/cli/ui/utils/baseBranch.js +17 -0
  120. package/dist/cli/ui/utils/baseBranch.js.map +1 -0
  121. package/dist/cli/ui/utils/branchFormatter.d.ts +13 -0
  122. package/dist/cli/ui/utils/branchFormatter.d.ts.map +1 -0
  123. package/dist/cli/ui/utils/branchFormatter.js +202 -0
  124. package/dist/cli/ui/utils/branchFormatter.js.map +1 -0
  125. package/dist/cli/ui/utils/statisticsCalculator.d.ts +9 -0
  126. package/dist/cli/ui/utils/statisticsCalculator.d.ts.map +1 -0
  127. package/dist/cli/ui/utils/statisticsCalculator.js +37 -0
  128. package/dist/cli/ui/utils/statisticsCalculator.js.map +1 -0
  129. package/dist/client/assets/index-CqaYsI0z.js +81 -0
  130. package/dist/client/assets/index-Dy3OxWpP.css +32 -0
  131. package/dist/client/index.html +13 -0
  132. package/dist/codex.d.ts +12 -0
  133. package/dist/codex.d.ts.map +1 -0
  134. package/dist/codex.js +106 -0
  135. package/dist/codex.js.map +1 -0
  136. package/dist/config/builtin-tools.d.ts +19 -0
  137. package/dist/config/builtin-tools.d.ts.map +1 -0
  138. package/dist/config/builtin-tools.js +40 -0
  139. package/dist/config/builtin-tools.js.map +1 -0
  140. package/dist/config/constants.d.ts +74 -0
  141. package/dist/config/constants.d.ts.map +1 -0
  142. package/dist/config/constants.js +90 -0
  143. package/dist/config/constants.js.map +1 -0
  144. package/dist/config/env-history.d.ts +4 -0
  145. package/dist/config/env-history.d.ts.map +1 -0
  146. package/dist/config/env-history.js +34 -0
  147. package/dist/config/env-history.js.map +1 -0
  148. package/dist/config/index.d.ts +24 -0
  149. package/dist/config/index.d.ts.map +1 -0
  150. package/dist/config/index.js +144 -0
  151. package/dist/config/index.js.map +1 -0
  152. package/dist/config/tools.d.ts +40 -0
  153. package/dist/config/tools.d.ts.map +1 -0
  154. package/dist/config/tools.js +238 -0
  155. package/dist/config/tools.js.map +1 -0
  156. package/dist/git.d.ts +145 -0
  157. package/dist/git.d.ts.map +1 -0
  158. package/dist/git.js +871 -0
  159. package/dist/git.js.map +1 -0
  160. package/dist/github.d.ts +14 -0
  161. package/dist/github.d.ts.map +1 -0
  162. package/dist/github.js +123 -0
  163. package/dist/github.js.map +1 -0
  164. package/dist/index.d.ts +15 -0
  165. package/dist/index.d.ts.map +1 -0
  166. package/dist/index.js +510 -0
  167. package/dist/index.js.map +1 -0
  168. package/dist/launcher.d.ts +30 -0
  169. package/dist/launcher.d.ts.map +1 -0
  170. package/dist/launcher.js +116 -0
  171. package/dist/launcher.js.map +1 -0
  172. package/dist/repositories/git.repository.d.ts +38 -0
  173. package/dist/repositories/git.repository.d.ts.map +1 -0
  174. package/dist/repositories/git.repository.js +117 -0
  175. package/dist/repositories/git.repository.js.map +1 -0
  176. package/dist/repositories/github.repository.d.ts +16 -0
  177. package/dist/repositories/github.repository.d.ts.map +1 -0
  178. package/dist/repositories/github.repository.js +61 -0
  179. package/dist/repositories/github.repository.js.map +1 -0
  180. package/dist/repositories/worktree.repository.d.ts +18 -0
  181. package/dist/repositories/worktree.repository.d.ts.map +1 -0
  182. package/dist/repositories/worktree.repository.js +57 -0
  183. package/dist/repositories/worktree.repository.js.map +1 -0
  184. package/dist/services/BatchMergeService.d.ts +45 -0
  185. package/dist/services/BatchMergeService.d.ts.map +1 -0
  186. package/dist/services/BatchMergeService.js +197 -0
  187. package/dist/services/BatchMergeService.js.map +1 -0
  188. package/dist/services/WorktreeOrchestrator.d.ts +37 -0
  189. package/dist/services/WorktreeOrchestrator.d.ts.map +1 -0
  190. package/dist/services/WorktreeOrchestrator.js +74 -0
  191. package/dist/services/WorktreeOrchestrator.js.map +1 -0
  192. package/dist/services/dependency-installer.d.ts +26 -0
  193. package/dist/services/dependency-installer.d.ts.map +1 -0
  194. package/dist/services/dependency-installer.js +139 -0
  195. package/dist/services/dependency-installer.js.map +1 -0
  196. package/dist/services/git.service.d.ts +27 -0
  197. package/dist/services/git.service.d.ts.map +1 -0
  198. package/dist/services/git.service.js +95 -0
  199. package/dist/services/git.service.js.map +1 -0
  200. package/dist/services/github.service.d.ts +14 -0
  201. package/dist/services/github.service.d.ts.map +1 -0
  202. package/dist/services/github.service.js +52 -0
  203. package/dist/services/github.service.js.map +1 -0
  204. package/dist/services/worktree.service.d.ts +20 -0
  205. package/dist/services/worktree.service.d.ts.map +1 -0
  206. package/dist/services/worktree.service.js +52 -0
  207. package/dist/services/worktree.service.js.map +1 -0
  208. package/dist/types/api.d.ts +211 -0
  209. package/dist/types/api.d.ts.map +1 -0
  210. package/dist/types/api.js +8 -0
  211. package/dist/types/api.js.map +1 -0
  212. package/dist/types/tools.d.ts +201 -0
  213. package/dist/types/tools.d.ts.map +1 -0
  214. package/dist/types/tools.js +8 -0
  215. package/dist/types/tools.js.map +1 -0
  216. package/dist/utils/spinner.d.ts +6 -0
  217. package/dist/utils/spinner.d.ts.map +1 -0
  218. package/dist/utils/spinner.js +47 -0
  219. package/dist/utils/spinner.js.map +1 -0
  220. package/dist/utils/terminal.d.ts +20 -0
  221. package/dist/utils/terminal.d.ts.map +1 -0
  222. package/dist/utils/terminal.js +232 -0
  223. package/dist/utils/terminal.js.map +1 -0
  224. package/dist/utils.d.ts +9 -0
  225. package/dist/utils.d.ts.map +1 -0
  226. package/dist/utils.js +48 -0
  227. package/dist/utils.js.map +1 -0
  228. package/dist/web/client/src/components/BranchGraph.d.ts +8 -0
  229. package/dist/web/client/src/components/BranchGraph.d.ts.map +1 -0
  230. package/dist/web/client/src/components/BranchGraph.js +125 -0
  231. package/dist/web/client/src/components/BranchGraph.js.map +1 -0
  232. package/dist/web/client/src/components/EnvEditor.d.ts +20 -0
  233. package/dist/web/client/src/components/EnvEditor.d.ts.map +1 -0
  234. package/dist/web/client/src/components/EnvEditor.js +65 -0
  235. package/dist/web/client/src/components/EnvEditor.js.map +1 -0
  236. package/dist/web/client/src/components/Terminal.d.ts +15 -0
  237. package/dist/web/client/src/components/Terminal.d.ts.map +1 -0
  238. package/dist/web/client/src/components/Terminal.js +112 -0
  239. package/dist/web/client/src/components/Terminal.js.map +1 -0
  240. package/dist/web/client/src/hooks/useBranches.d.ts +16 -0
  241. package/dist/web/client/src/hooks/useBranches.d.ts.map +1 -0
  242. package/dist/web/client/src/hooks/useBranches.js +35 -0
  243. package/dist/web/client/src/hooks/useBranches.js.map +1 -0
  244. package/dist/web/client/src/hooks/useConfig.d.ts +13 -0
  245. package/dist/web/client/src/hooks/useConfig.d.ts.map +1 -0
  246. package/dist/web/client/src/hooks/useConfig.js +27 -0
  247. package/dist/web/client/src/hooks/useConfig.js.map +1 -0
  248. package/dist/web/client/src/hooks/useSessions.d.ts +21 -0
  249. package/dist/web/client/src/hooks/useSessions.d.ts.map +1 -0
  250. package/dist/web/client/src/hooks/useSessions.js +49 -0
  251. package/dist/web/client/src/hooks/useSessions.js.map +1 -0
  252. package/dist/web/client/src/hooks/useWorktrees.d.ts +17 -0
  253. package/dist/web/client/src/hooks/useWorktrees.d.ts.map +1 -0
  254. package/dist/web/client/src/hooks/useWorktrees.js +41 -0
  255. package/dist/web/client/src/hooks/useWorktrees.js.map +1 -0
  256. package/dist/web/client/src/lib/api.d.ts +82 -0
  257. package/dist/web/client/src/lib/api.d.ts.map +1 -0
  258. package/dist/web/client/src/lib/api.js +147 -0
  259. package/dist/web/client/src/lib/api.js.map +1 -0
  260. package/dist/web/client/src/lib/websocket.d.ts +52 -0
  261. package/dist/web/client/src/lib/websocket.d.ts.map +1 -0
  262. package/dist/web/client/src/lib/websocket.js +137 -0
  263. package/dist/web/client/src/lib/websocket.js.map +1 -0
  264. package/dist/web/client/src/main.d.ts +2 -0
  265. package/dist/web/client/src/main.d.ts.map +1 -0
  266. package/dist/web/client/src/main.js +23 -0
  267. package/dist/web/client/src/main.js.map +1 -0
  268. package/dist/web/client/src/pages/BranchDetailPage.d.ts +3 -0
  269. package/dist/web/client/src/pages/BranchDetailPage.d.ts.map +1 -0
  270. package/dist/web/client/src/pages/BranchDetailPage.js +519 -0
  271. package/dist/web/client/src/pages/BranchDetailPage.js.map +1 -0
  272. package/dist/web/client/src/pages/BranchListPage.d.ts +3 -0
  273. package/dist/web/client/src/pages/BranchListPage.d.ts.map +1 -0
  274. package/dist/web/client/src/pages/BranchListPage.js +150 -0
  275. package/dist/web/client/src/pages/BranchListPage.js.map +1 -0
  276. package/dist/web/client/src/pages/ConfigManagementPage.d.ts +3 -0
  277. package/dist/web/client/src/pages/ConfigManagementPage.d.ts.map +1 -0
  278. package/dist/web/client/src/pages/ConfigManagementPage.js +125 -0
  279. package/dist/web/client/src/pages/ConfigManagementPage.js.map +1 -0
  280. package/dist/web/client/src/router.d.ts +9 -0
  281. package/dist/web/client/src/router.d.ts.map +1 -0
  282. package/dist/web/client/src/router.js +27 -0
  283. package/dist/web/client/src/router.js.map +1 -0
  284. package/dist/web/client/vite.config.d.ts +3 -0
  285. package/dist/web/client/vite.config.d.ts.map +1 -0
  286. package/dist/web/client/vite.config.js +21 -0
  287. package/dist/web/client/vite.config.js.map +1 -0
  288. package/dist/web/server/env/importer.d.ts +3 -0
  289. package/dist/web/server/env/importer.d.ts.map +1 -0
  290. package/dist/web/server/env/importer.js +47 -0
  291. package/dist/web/server/env/importer.js.map +1 -0
  292. package/dist/web/server/index.d.ts +11 -0
  293. package/dist/web/server/index.d.ts.map +1 -0
  294. package/dist/web/server/index.js +62 -0
  295. package/dist/web/server/index.js.map +1 -0
  296. package/dist/web/server/pty/manager.d.ts +50 -0
  297. package/dist/web/server/pty/manager.d.ts.map +1 -0
  298. package/dist/web/server/pty/manager.js +143 -0
  299. package/dist/web/server/pty/manager.js.map +1 -0
  300. package/dist/web/server/routes/branches.d.ts +11 -0
  301. package/dist/web/server/routes/branches.d.ts.map +1 -0
  302. package/dist/web/server/routes/branches.js +97 -0
  303. package/dist/web/server/routes/branches.js.map +1 -0
  304. package/dist/web/server/routes/config.d.ts +6 -0
  305. package/dist/web/server/routes/config.d.ts.map +1 -0
  306. package/dist/web/server/routes/config.js +162 -0
  307. package/dist/web/server/routes/config.js.map +1 -0
  308. package/dist/web/server/routes/index.d.ts +13 -0
  309. package/dist/web/server/routes/index.d.ts.map +1 -0
  310. package/dist/web/server/routes/index.js +29 -0
  311. package/dist/web/server/routes/index.js.map +1 -0
  312. package/dist/web/server/routes/sessions.d.ts +12 -0
  313. package/dist/web/server/routes/sessions.d.ts.map +1 -0
  314. package/dist/web/server/routes/sessions.js +95 -0
  315. package/dist/web/server/routes/sessions.js.map +1 -0
  316. package/dist/web/server/routes/worktrees.d.ts +11 -0
  317. package/dist/web/server/routes/worktrees.d.ts.map +1 -0
  318. package/dist/web/server/routes/worktrees.js +80 -0
  319. package/dist/web/server/routes/worktrees.js.map +1 -0
  320. package/dist/web/server/services/branches.d.ts +17 -0
  321. package/dist/web/server/services/branches.d.ts.map +1 -0
  322. package/dist/web/server/services/branches.js +262 -0
  323. package/dist/web/server/services/branches.js.map +1 -0
  324. package/dist/web/server/services/worktrees.d.ts +24 -0
  325. package/dist/web/server/services/worktrees.d.ts.map +1 -0
  326. package/dist/web/server/services/worktrees.js +60 -0
  327. package/dist/web/server/services/worktrees.js.map +1 -0
  328. package/dist/web/server/websocket/handler.d.ts +41 -0
  329. package/dist/web/server/websocket/handler.d.ts.map +1 -0
  330. package/dist/web/server/websocket/handler.js +143 -0
  331. package/dist/web/server/websocket/handler.js.map +1 -0
  332. package/dist/worktree.d.ts +53 -0
  333. package/dist/worktree.d.ts.map +1 -0
  334. package/dist/worktree.js +489 -0
  335. package/dist/worktree.js.map +1 -0
  336. package/package.json +1 -1
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Worktree Routes
3
+ *
4
+ * Worktree関連のREST APIエンドポイント。
5
+ */
6
+ import { listWorktrees, getWorktreeByPath, createNewWorktree, removeWorktree, } from "../services/worktrees.js";
7
+ /**
8
+ * Worktree関連のルートを登録
9
+ */
10
+ export async function registerWorktreeRoutes(fastify) {
11
+ // GET /api/worktrees - すべてのWorktree一覧を取得
12
+ fastify.get("/api/worktrees", async (request, reply) => {
13
+ try {
14
+ const worktrees = await listWorktrees();
15
+ return { success: true, data: worktrees };
16
+ }
17
+ catch (error) {
18
+ const errorMsg = error instanceof Error ? error.message : String(error);
19
+ reply.code(500);
20
+ return {
21
+ success: false,
22
+ error: "Failed to fetch worktrees",
23
+ details: errorMsg,
24
+ };
25
+ }
26
+ });
27
+ // POST /api/worktrees - 新しいWorktreeを作成
28
+ fastify.post("/api/worktrees", async (request, reply) => {
29
+ try {
30
+ const { branchName, createBranch = false } = request.body;
31
+ const worktree = await createNewWorktree(branchName, createBranch);
32
+ reply.code(201);
33
+ return { success: true, data: worktree };
34
+ }
35
+ catch (error) {
36
+ const errorMsg = error instanceof Error ? error.message : String(error);
37
+ reply.code(500);
38
+ return {
39
+ success: false,
40
+ error: "Failed to create worktree",
41
+ details: errorMsg,
42
+ };
43
+ }
44
+ });
45
+ // DELETE /api/worktrees - Worktreeを削除
46
+ fastify.delete("/api/worktrees", async (request, reply) => {
47
+ try {
48
+ const { path } = request.query;
49
+ if (!path) {
50
+ reply.code(400);
51
+ return {
52
+ success: false,
53
+ error: "Missing required parameter: path",
54
+ details: null,
55
+ };
56
+ }
57
+ const worktree = await getWorktreeByPath(path);
58
+ if (!worktree) {
59
+ reply.code(404);
60
+ return {
61
+ success: false,
62
+ error: "Worktree not found",
63
+ details: `Worktree at ${path} does not exist`,
64
+ };
65
+ }
66
+ await removeWorktree(path);
67
+ return { success: true };
68
+ }
69
+ catch (error) {
70
+ const errorMsg = error instanceof Error ? error.message : String(error);
71
+ reply.code(500);
72
+ return {
73
+ success: false,
74
+ error: "Failed to delete worktree",
75
+ details: errorMsg,
76
+ };
77
+ }
78
+ });
79
+ }
80
+ //# sourceMappingURL=worktrees.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktrees.js","sourceRoot":"","sources":["../../../../src/web/server/routes/worktrees.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Branch Service
3
+ *
4
+ * ブランチ一覧取得とマージステータス判定のビジネスロジック。
5
+ * 既存のgit.tsとgithub.tsの機能を活用します。
6
+ */
7
+ import type { Branch, BranchSyncResult } from "../../../types/api.js";
8
+ /**
9
+ * すべてのブランチ一覧を取得(マージステータスとWorktree情報付き)
10
+ */
11
+ export declare function listBranches(): Promise<Branch[]>;
12
+ export declare function syncBranchState(branchName: string, worktreePath: string): Promise<BranchSyncResult>;
13
+ /**
14
+ * 特定のブランチ情報を取得
15
+ */
16
+ export declare function getBranchByName(branchName: string): Promise<Branch | null>;
17
+ //# sourceMappingURL=branches.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branches.d.ts","sourceRoot":"","sources":["../../../../src/web/server/services/branches.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,OAAO,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAkBtE;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CA0EtD;AAED,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,gBAAgB,CAAC,CAiD3B;AAsCD;;GAEG;AACH,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAGxB"}
@@ -0,0 +1,262 @@
1
+ /**
2
+ * Branch Service
3
+ *
4
+ * ブランチ一覧取得とマージステータス判定のビジネスロジック。
5
+ * 既存のgit.tsとgithub.tsの機能を活用します。
6
+ */
7
+ import { execa } from "execa";
8
+ import { getAllBranches, getRepositoryRoot, getBranchDivergenceStatuses, fetchAllRemotes, pullFastForward, } from "../../../git.js";
9
+ import { getPullRequestByBranch } from "../../../github.js";
10
+ import { listAdditionalWorktrees } from "../../../worktree.js";
11
+ const DEFAULT_BASE_BRANCHES = ["main", "master", "develop", "dev"];
12
+ function mapPullRequestState(state) {
13
+ if (state === "OPEN") {
14
+ return "open";
15
+ }
16
+ if (state === "MERGED") {
17
+ return "merged";
18
+ }
19
+ return "closed";
20
+ }
21
+ /**
22
+ * すべてのブランチ一覧を取得(マージステータスとWorktree情報付き)
23
+ */
24
+ export async function listBranches() {
25
+ const [branches, worktrees, repoRoot] = await Promise.all([
26
+ getAllBranches(),
27
+ listAdditionalWorktrees(),
28
+ getRepositoryRoot(),
29
+ ]);
30
+ const divergenceMap = await buildDivergenceMap(branches, repoRoot);
31
+ const upstreamMap = await collectUpstreamMap(repoRoot);
32
+ const baseCandidates = buildBaseBranchCandidates(branches);
33
+ const mainBranch = "main"; // TODO: 動的に取得
34
+ const refCache = new Map();
35
+ const ancestorCache = new Map();
36
+ const branchList = await Promise.all(branches.map(async (branchInfo) => {
37
+ // Worktree情報
38
+ const worktree = worktrees.find((wt) => wt.branch === branchInfo.name);
39
+ // マージステータス判定(GitHub PRベース)
40
+ let mergeStatus = "unknown";
41
+ const pr = await getPullRequestByBranch(branchInfo.name);
42
+ if (pr) {
43
+ mergeStatus = pr.state === "MERGED" ? "merged" : "unmerged";
44
+ }
45
+ else if (branchInfo.name === mainBranch) {
46
+ // メインブランチは常にmerged扱い
47
+ mergeStatus = "merged";
48
+ }
49
+ const baseBranch = await resolveBaseBranch(branchInfo, pr, upstreamMap, baseCandidates, repoRoot, refCache, ancestorCache);
50
+ const prInfo = pr
51
+ ? {
52
+ number: pr.number,
53
+ title: pr.title,
54
+ state: mapPullRequestState(pr.state),
55
+ mergedAt: pr.mergedAt,
56
+ }
57
+ : null;
58
+ const divergenceStatus = branchInfo.type === "local"
59
+ ? divergenceMap.get(branchInfo.name)
60
+ : undefined;
61
+ const divergence = divergenceStatus
62
+ ? mapDivergence(divergenceStatus)
63
+ : null;
64
+ return {
65
+ name: branchInfo.name,
66
+ type: branchInfo.type,
67
+ commitHash: "unknown", // BranchInfoには含まれていない
68
+ commitMessage: null,
69
+ author: null,
70
+ commitDate: null,
71
+ mergeStatus,
72
+ hasUnpushedCommits: Boolean(branchInfo.hasUnpushedCommits),
73
+ worktreePath: worktree?.path || null,
74
+ baseBranch: baseBranch ?? null,
75
+ divergence,
76
+ prInfo,
77
+ };
78
+ }));
79
+ return branchList;
80
+ }
81
+ export async function syncBranchState(branchName, worktreePath) {
82
+ if (!worktreePath) {
83
+ throw new Error("Worktree path is required to sync branch");
84
+ }
85
+ const repoRoot = await getRepositoryRoot();
86
+ const warnings = [];
87
+ await fetchAllRemotes({ cwd: repoRoot });
88
+ let pullStatus = "success";
89
+ try {
90
+ await pullFastForward(worktreePath);
91
+ }
92
+ catch (error) {
93
+ pullStatus = "failed";
94
+ const reason = error instanceof Error ? error.message : String(error);
95
+ warnings.push(reason);
96
+ }
97
+ const sanitizedBranch = sanitizeBranchName(branchName);
98
+ const divergenceInput = {
99
+ cwd: repoRoot,
100
+ };
101
+ if (sanitizedBranch) {
102
+ divergenceInput.branches = [sanitizedBranch];
103
+ }
104
+ const divergenceStatuses = await getBranchDivergenceStatuses(divergenceInput);
105
+ const divergence = divergenceStatuses.length > 0
106
+ ? mapDivergence(divergenceStatuses[0])
107
+ : null;
108
+ const branch = await getBranchByName(branchName);
109
+ if (!branch) {
110
+ throw new Error(`Branch not found: ${branchName}`);
111
+ }
112
+ const result = {
113
+ branch,
114
+ divergence: divergence ?? branch.divergence ?? null,
115
+ fetchStatus: "success",
116
+ pullStatus,
117
+ };
118
+ if (warnings.length) {
119
+ result.warnings = warnings;
120
+ }
121
+ return result;
122
+ }
123
+ async function buildDivergenceMap(branches, repoRoot) {
124
+ const localBranchNames = branches
125
+ .filter((branch) => branch.type === "local")
126
+ .map((branch) => branch.name);
127
+ if (localBranchNames.length === 0) {
128
+ return new Map();
129
+ }
130
+ try {
131
+ const statuses = await getBranchDivergenceStatuses({
132
+ cwd: repoRoot,
133
+ branches: localBranchNames,
134
+ });
135
+ return new Map(statuses.map((status) => [status.branch, status]));
136
+ }
137
+ catch (error) {
138
+ console.warn("Failed to compute branch divergence for Web UI", error);
139
+ return new Map();
140
+ }
141
+ }
142
+ function mapDivergence(status) {
143
+ return {
144
+ ahead: status.localAhead,
145
+ behind: status.remoteAhead,
146
+ upToDate: status.localAhead === 0 && status.remoteAhead === 0,
147
+ };
148
+ }
149
+ function sanitizeBranchName(value) {
150
+ return value.replace(/^origin\//, "");
151
+ }
152
+ /**
153
+ * 特定のブランチ情報を取得
154
+ */
155
+ export async function getBranchByName(branchName) {
156
+ const branches = await listBranches();
157
+ return branches.find((b) => b.name === branchName) || null;
158
+ }
159
+ async function collectUpstreamMap(repoRoot) {
160
+ try {
161
+ const { stdout } = await execa("git", [
162
+ "for-each-ref",
163
+ "--format=%(refname:short)|%(upstream:short)",
164
+ "refs/heads",
165
+ ], { cwd: repoRoot });
166
+ return stdout
167
+ .split("\n")
168
+ .filter((line) => line.includes("|"))
169
+ .reduce((map, line) => {
170
+ const [branch, upstream] = line.split("|");
171
+ if (branch && upstream) {
172
+ map.set(branch.trim(), upstream.trim());
173
+ }
174
+ return map;
175
+ }, new Map());
176
+ }
177
+ catch {
178
+ return new Map();
179
+ }
180
+ }
181
+ function buildBaseBranchCandidates(branches) {
182
+ const candidates = new Set();
183
+ for (const base of DEFAULT_BASE_BRANCHES) {
184
+ candidates.add(base);
185
+ candidates.add(`origin/${base}`);
186
+ }
187
+ for (const branch of branches) {
188
+ if (branch.branchType === "main" || branch.branchType === "develop") {
189
+ candidates.add(branch.name);
190
+ if (branch.name.startsWith("origin/")) {
191
+ const localName = branch.name.replace(/^origin\//, "");
192
+ if (localName) {
193
+ candidates.add(localName);
194
+ }
195
+ }
196
+ else {
197
+ candidates.add(`origin/${branch.name}`);
198
+ }
199
+ }
200
+ }
201
+ return Array.from(candidates);
202
+ }
203
+ async function resolveBaseBranch(branchInfo, pr, upstreamMap, baseCandidates, repoRoot, refCache, ancestorCache) {
204
+ if (pr?.baseRefName) {
205
+ return pr.baseRefName;
206
+ }
207
+ if (branchInfo.type === "local") {
208
+ const upstream = upstreamMap.get(branchInfo.name);
209
+ if (upstream) {
210
+ return upstream;
211
+ }
212
+ }
213
+ return inferBaseBranchFromCandidates(branchInfo.name, baseCandidates, repoRoot, refCache, ancestorCache);
214
+ }
215
+ async function inferBaseBranchFromCandidates(branchName, baseCandidates, repoRoot, refCache, ancestorCache) {
216
+ for (const candidate of baseCandidates) {
217
+ if (!candidate || candidate === branchName) {
218
+ continue;
219
+ }
220
+ const exists = await refExists(candidate, repoRoot, refCache);
221
+ if (!exists) {
222
+ continue;
223
+ }
224
+ const isAncestor = await isAncestorRef(candidate, branchName, repoRoot, ancestorCache);
225
+ if (isAncestor) {
226
+ return candidate;
227
+ }
228
+ }
229
+ return null;
230
+ }
231
+ async function refExists(refName, repoRoot, cache) {
232
+ if (cache.has(refName)) {
233
+ return cache.get(refName);
234
+ }
235
+ try {
236
+ await execa("git", ["rev-parse", "--verify", refName], { cwd: repoRoot });
237
+ cache.set(refName, true);
238
+ return true;
239
+ }
240
+ catch {
241
+ cache.set(refName, false);
242
+ return false;
243
+ }
244
+ }
245
+ async function isAncestorRef(ancestor, branch, repoRoot, cache) {
246
+ const cacheKey = `${ancestor}->${branch}`;
247
+ if (cache.has(cacheKey)) {
248
+ return cache.get(cacheKey);
249
+ }
250
+ try {
251
+ await execa("git", ["merge-base", "--is-ancestor", ancestor, branch], {
252
+ cwd: repoRoot,
253
+ });
254
+ cache.set(cacheKey, true);
255
+ return true;
256
+ }
257
+ catch {
258
+ cache.set(cacheKey, false);
259
+ return false;
260
+ }
261
+ }
262
+ //# sourceMappingURL=branches.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branches.js","sourceRoot":"","sources":["../../../../src/web/server/services/branches.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,2BAA2B,EAC3B,eAAe,EACf,eAAe,GAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAO/D,MAAM,qBAAqB,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;AAEnE,SAAS,mBAAmB,CAAC,KAAa;IACxC,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACrB,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvB,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACxD,cAAc,EAAE;QAChB,uBAAuB,EAAE;QACzB,iBAAiB,EAAE;KACpB,CAAC,CAAC;IACH,MAAM,aAAa,GAAG,MAAM,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACnE,MAAM,WAAW,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACvD,MAAM,cAAc,GAAG,yBAAyB,CAAC,QAAQ,CAAC,CAAC;IAC3D,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,cAAc;IACzC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;IAC5C,MAAM,aAAa,GAAG,IAAI,GAAG,EAAmB,CAAC;IAEjD,MAAM,UAAU,GAAa,MAAM,OAAO,CAAC,GAAG,CAC5C,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,UAAsB,EAAE,EAAE;QAC5C,aAAa;QACb,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,KAAK,UAAU,CAAC,IAAI,CAAC,CAAC;QAEvE,2BAA2B;QAC3B,IAAI,WAAW,GAAsC,SAAS,CAAC;QAC/D,MAAM,EAAE,GAAG,MAAM,sBAAsB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACzD,IAAI,EAAE,EAAE,CAAC;YACP,WAAW,GAAG,EAAE,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC;QAC9D,CAAC;aAAM,IAAI,UAAU,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC1C,qBAAqB;YACrB,WAAW,GAAG,QAAQ,CAAC;QACzB,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,iBAAiB,CACxC,UAAU,EACV,EAAE,EACF,WAAW,EACX,cAAc,EACd,QAAQ,EACR,QAAQ,EACR,aAAa,CACd,CAAC;QAEF,MAAM,MAAM,GAAG,EAAE;YACf,CAAC,CAAC;gBACE,MAAM,EAAE,EAAE,CAAC,MAAM;gBACjB,KAAK,EAAE,EAAE,CAAC,KAAK;gBACf,KAAK,EAAE,mBAAmB,CAAC,EAAE,CAAC,KAAK,CAAC;gBACpC,QAAQ,EAAE,EAAE,CAAC,QAAQ;aACtB;YACH,CAAC,CAAC,IAAI,CAAC;QAET,MAAM,gBAAgB,GACpB,UAAU,CAAC,IAAI,KAAK,OAAO;YACzB,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;YACpC,CAAC,CAAC,SAAS,CAAC;QAEhB,MAAM,UAAU,GAAG,gBAAgB;YACjC,CAAC,CAAC,aAAa,CAAC,gBAAgB,CAAC;YACjC,CAAC,CAAC,IAAI,CAAC;QAET,OAAO;YACL,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,UAAU,EAAE,SAAS,EAAE,sBAAsB;YAC7C,aAAa,EAAE,IAAI;YACnB,MAAM,EAAE,IAAI;YACZ,UAAU,EAAE,IAAI;YAChB,WAAW;YACX,kBAAkB,EAAE,OAAO,CAAC,UAAU,CAAC,kBAAkB,CAAC;YAC1D,YAAY,EAAE,QAAQ,EAAE,IAAI,IAAI,IAAI;YACpC,UAAU,EAAE,UAAU,IAAI,IAAI;YAC9B,UAAU;YACV,MAAM;SACP,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;IAEF,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,UAAkB,EAClB,YAAoB;IAEpB,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,MAAM,eAAe,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;IAEzC,IAAI,UAAU,GAAyB,SAAS,CAAC;IACjD,IAAI,CAAC;QACH,MAAM,eAAe,CAAC,YAAY,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,UAAU,GAAG,QAAQ,CAAC;QACtB,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;IAED,MAAM,eAAe,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;IACvD,MAAM,eAAe,GAAyC;QAC5D,GAAG,EAAE,QAAQ;KACd,CAAC;IACF,IAAI,eAAe,EAAE,CAAC;QACpB,eAAe,CAAC,QAAQ,GAAG,CAAC,eAAe,CAAC,CAAC;IAC/C,CAAC;IACD,MAAM,kBAAkB,GAAG,MAAM,2BAA2B,CAAC,eAAe,CAAC,CAAC;IAC9E,MAAM,UAAU,GACd,kBAAkB,CAAC,MAAM,GAAG,CAAC;QAC3B,CAAC,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC,CAAE,CAAC;QACvC,CAAC,CAAC,IAAI,CAAC;IAEX,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;IACjD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,qBAAqB,UAAU,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,MAAM,GAAqB;QAC/B,MAAM;QACN,UAAU,EAAE,UAAU,IAAI,MAAM,CAAC,UAAU,IAAI,IAAI;QACnD,WAAW,EAAE,SAAS;QACtB,UAAU;KACX,CAAC;IAEF,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,QAAsB,EACtB,QAAgB;IAEhB,MAAM,gBAAgB,GAAG,QAAQ;SAC9B,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC;SAC3C,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAEhC,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,OAAO,IAAI,GAAG,EAAE,CAAC;IACnB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,2BAA2B,CAAC;YACjD,GAAG,EAAE,QAAQ;YACb,QAAQ,EAAE,gBAAgB;SAC3B,CAAC,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IACpE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,gDAAgD,EAAE,KAAK,CAAC,CAAC;QACtE,OAAO,IAAI,GAAG,EAAE,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,MAAwB;IAC7C,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,UAAU;QACxB,MAAM,EAAE,MAAM,CAAC,WAAW;QAC1B,QAAQ,EAAE,MAAM,CAAC,UAAU,KAAK,CAAC,IAAI,MAAM,CAAC,WAAW,KAAK,CAAC;KAC9D,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAa;IACvC,OAAO,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,UAAkB;IAElB,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAC;IACtC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,IAAI,CAAC;AAC7D,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,QAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAC5B,KAAK,EACL;YACE,cAAc;YACd,6CAA6C;YAC7C,YAAY;SACb,EACD,EAAE,GAAG,EAAE,QAAQ,EAAE,CAClB,CAAC;QAEF,OAAO,MAAM;aACV,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;aACpC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YACpB,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC3C,IAAI,MAAM,IAAI,QAAQ,EAAE,CAAC;gBACvB,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;YAC1C,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC,EAAE,IAAI,GAAG,EAAkB,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,GAAG,EAAE,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,yBAAyB,CAAC,QAAsB;IACvD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,qBAAqB,EAAE,CAAC;QACzC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrB,UAAU,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,IAAI,MAAM,CAAC,UAAU,KAAK,MAAM,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACpE,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBACtC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;gBACvD,IAAI,SAAS,EAAE,CAAC;oBACd,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AAChC,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,UAAsB,EACtB,EAAsB,EACtB,WAAgC,EAChC,cAAwB,EACxB,QAAgB,EAChB,QAA8B,EAC9B,aAAmC;IAEnC,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC;QACpB,OAAO,EAAE,CAAC,WAAW,CAAC;IACxB,CAAC;IAED,IAAI,UAAU,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,6BAA6B,CAClC,UAAU,CAAC,IAAI,EACf,cAAc,EACd,QAAQ,EACR,QAAQ,EACR,aAAa,CACd,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,6BAA6B,CAC1C,UAAkB,EAClB,cAAwB,EACxB,QAAgB,EAChB,QAA8B,EAC9B,aAAmC;IAEnC,KAAK,MAAM,SAAS,IAAI,cAAc,EAAE,CAAC;QACvC,IAAI,CAAC,SAAS,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;YAC3C,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC9D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,SAAS;QACX,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,aAAa,CACpC,SAAS,EACT,UAAU,EACV,QAAQ,EACR,aAAa,CACd,CAAC;QACF,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,OAAe,EACf,QAAgB,EAChB,KAA2B;IAE3B,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC;IAC7B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC1E,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC1B,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,QAAgB,EAChB,MAAc,EACd,QAAgB,EAChB,KAA2B;IAE3B,MAAM,QAAQ,GAAG,GAAG,QAAQ,KAAK,MAAM,EAAE,CAAC;IAC1C,IAAI,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;IAC9B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE;YACpE,GAAG,EAAE,QAAQ;SACd,CAAC,CAAC;QACH,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Worktree Service
3
+ *
4
+ * Worktree管理のビジネスロジック。
5
+ * 既存のworktree.tsの機能を活用します。
6
+ */
7
+ import type { Worktree } from "../../../types/api.js";
8
+ /**
9
+ * すべてのWorktree一覧を取得
10
+ */
11
+ export declare function listWorktrees(): Promise<Worktree[]>;
12
+ /**
13
+ * 特定のWorktree情報を取得
14
+ */
15
+ export declare function getWorktreeByPath(path: string): Promise<Worktree | null>;
16
+ /**
17
+ * 新しいWorktreeを作成
18
+ */
19
+ export declare function createNewWorktree(branchName: string, createBranch: boolean): Promise<Worktree>;
20
+ /**
21
+ * Worktreeを削除
22
+ */
23
+ export declare function removeWorktree(path: string): Promise<void>;
24
+ //# sourceMappingURL=worktrees.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktrees.d.ts","sourceRoot":"","sources":["../../../../src/web/server/services/worktrees.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,CAazD;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAG1B;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,OAAO,GACpB,OAAO,CAAC,QAAQ,CAAC,CA0BnB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhE"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Worktree Service
3
+ *
4
+ * Worktree管理のビジネスロジック。
5
+ * 既存のworktree.tsの機能を活用します。
6
+ */
7
+ import { listAdditionalWorktrees, createWorktree as createWorktreeCore, removeWorktree as removeWorktreeCore, generateWorktreePath, isProtectedBranchName, } from "../../../worktree.js";
8
+ /**
9
+ * すべてのWorktree一覧を取得
10
+ */
11
+ export async function listWorktrees() {
12
+ const worktrees = await listAdditionalWorktrees();
13
+ return worktrees.map((wt) => ({
14
+ path: wt.path,
15
+ branchName: wt.branch,
16
+ head: wt.head,
17
+ isLocked: false, // TODO: locked情報を取得
18
+ isPrunable: false, // TODO: prunable情報を取得
19
+ isProtected: isProtectedBranchName(wt.branch),
20
+ createdAt: null, // git worktreeからは取得不可
21
+ lastAccessedAt: null, // git worktreeからは取得不可
22
+ }));
23
+ }
24
+ /**
25
+ * 特定のWorktree情報を取得
26
+ */
27
+ export async function getWorktreeByPath(path) {
28
+ const worktrees = await listWorktrees();
29
+ return worktrees.find((wt) => wt.path === path) || null;
30
+ }
31
+ /**
32
+ * 新しいWorktreeを作成
33
+ */
34
+ export async function createNewWorktree(branchName, createBranch) {
35
+ const { getRepositoryRoot, getCurrentBranch } = await import("../../../git.js");
36
+ const [repoRoot, currentBranch] = await Promise.all([
37
+ getRepositoryRoot(),
38
+ getCurrentBranch(),
39
+ ]);
40
+ const worktreePath = await generateWorktreePath(branchName, repoRoot);
41
+ await createWorktreeCore({
42
+ branchName,
43
+ worktreePath,
44
+ repoRoot,
45
+ isNewBranch: createBranch,
46
+ baseBranch: currentBranch || "main",
47
+ });
48
+ const worktree = await getWorktreeByPath(worktreePath);
49
+ if (!worktree) {
50
+ throw new Error(`Failed to create worktree for branch ${branchName}`);
51
+ }
52
+ return worktree;
53
+ }
54
+ /**
55
+ * Worktreeを削除
56
+ */
57
+ export async function removeWorktree(path) {
58
+ await removeWorktreeCore(path);
59
+ }
60
+ //# sourceMappingURL=worktrees.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktrees.js","sourceRoot":"","sources":["../../../../src/web/server/services/worktrees.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,uBAAuB,EACvB,cAAc,IAAI,kBAAkB,EACpC,cAAc,IAAI,kBAAkB,EACpC,oBAAoB,EACpB,qBAAqB,GAEtB,MAAM,sBAAsB,CAAC;AAG9B;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,SAAS,GAAG,MAAM,uBAAuB,EAAE,CAAC;IAElD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,EAAgB,EAAE,EAAE,CAAC,CAAC;QAC1C,IAAI,EAAE,EAAE,CAAC,IAAI;QACb,UAAU,EAAE,EAAE,CAAC,MAAM;QACrB,IAAI,EAAE,EAAE,CAAC,IAAI;QACb,QAAQ,EAAE,KAAK,EAAE,oBAAoB;QACrC,UAAU,EAAE,KAAK,EAAE,sBAAsB;QACzC,WAAW,EAAE,qBAAqB,CAAC,EAAE,CAAC,MAAM,CAAC;QAC7C,SAAS,EAAE,IAAI,EAAE,sBAAsB;QACvC,cAAc,EAAE,IAAI,EAAE,sBAAsB;KAC7C,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAY;IAEZ,MAAM,SAAS,GAAG,MAAM,aAAa,EAAE,CAAC;IACxC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC;AAC1D,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,UAAkB,EAClB,YAAqB;IAErB,MAAM,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAC1D,iBAAiB,CAClB,CAAC;IAEF,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAClD,iBAAiB,EAAE;QACnB,gBAAgB,EAAE;KACnB,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,MAAM,oBAAoB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAEtE,MAAM,kBAAkB,CAAC;QACvB,UAAU;QACV,YAAY;QACZ,QAAQ;QACR,WAAW,EAAE,YAAY;QACzB,UAAU,EAAE,aAAa,IAAI,MAAM;KACpC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,YAAY,CAAC,CAAC;IACvD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,wCAAwC,UAAU,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * WebSocket Handler
3
+ *
4
+ * PTYプロセスとブラウザ間のWebSocket通信を仲介します。
5
+ * 仕様: specs/SPEC-d5e56259/contracts/websocket.md
6
+ */
7
+ import type { FastifyRequest } from "fastify";
8
+ import type { WebSocket } from "@fastify/websocket";
9
+ import type { PTYManager } from "../pty/manager.js";
10
+ /**
11
+ * WebSocketハンドラー
12
+ */
13
+ export declare class WebSocketHandler {
14
+ private ptyManager;
15
+ constructor(ptyManager: PTYManager);
16
+ /**
17
+ * WebSocket接続を処理
18
+ */
19
+ handle(connection: WebSocket, request: FastifyRequest): void;
20
+ /**
21
+ * クライアントメッセージを処理
22
+ */
23
+ private handleClientMessage;
24
+ /**
25
+ * 出力メッセージを送信
26
+ */
27
+ private sendOutput;
28
+ /**
29
+ * 終了メッセージを送信
30
+ */
31
+ private sendExit;
32
+ /**
33
+ * エラーメッセージを送信
34
+ */
35
+ private sendError;
36
+ /**
37
+ * Pongメッセージを送信
38
+ */
39
+ private sendPong;
40
+ }
41
+ //# sourceMappingURL=handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../../src/web/server/websocket/handler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAWpD;;GAEG;AACH,qBAAa,gBAAgB;IACf,OAAO,CAAC,UAAU;gBAAV,UAAU,EAAE,UAAU;IAE1C;;OAEG;IACI,MAAM,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAkEnE;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA4B3B;;OAEG;IACH,OAAO,CAAC,UAAU;IASlB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAchB;;OAEG;IACH,OAAO,CAAC,SAAS;IAWjB;;OAEG;IACH,OAAO,CAAC,QAAQ;CAOjB"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * WebSocket Handler
3
+ *
4
+ * PTYプロセスとブラウザ間のWebSocket通信を仲介します。
5
+ * 仕様: specs/SPEC-d5e56259/contracts/websocket.md
6
+ */
7
+ /**
8
+ * WebSocketハンドラー
9
+ */
10
+ export class WebSocketHandler {
11
+ ptyManager;
12
+ constructor(ptyManager) {
13
+ this.ptyManager = ptyManager;
14
+ }
15
+ /**
16
+ * WebSocket接続を処理
17
+ */
18
+ handle(connection, request) {
19
+ const url = new URL(request.url, `http://${request.hostname || "localhost"}`);
20
+ const sessionId = url.searchParams.get("sessionId");
21
+ if (!sessionId) {
22
+ this.sendError(connection, "Missing sessionId parameter");
23
+ connection.close();
24
+ return;
25
+ }
26
+ const instance = this.ptyManager.get(sessionId);
27
+ if (!instance) {
28
+ this.sendError(connection, `Session not found: ${sessionId}`);
29
+ connection.close();
30
+ return;
31
+ }
32
+ const { ptyProcess } = instance;
33
+ // セッションステータスを更新
34
+ this.ptyManager.updateStatus(sessionId, "running");
35
+ // PTYプロセスからの出力をWebSocketに転送
36
+ ptyProcess.onData((data) => {
37
+ this.sendOutput(connection, data);
38
+ });
39
+ // PTYプロセス終了時の処理
40
+ ptyProcess.onExit(({ exitCode, signal }) => {
41
+ this.ptyManager.updateStatus(sessionId, "completed", exitCode);
42
+ this.sendExit(connection, exitCode, signal);
43
+ connection.close();
44
+ });
45
+ // クライアントからのメッセージを処理
46
+ connection.on("message", (rawMessage) => {
47
+ try {
48
+ const message = JSON.parse(rawMessage.toString());
49
+ this.handleClientMessage(message, ptyProcess, connection);
50
+ }
51
+ catch (error) {
52
+ const errorMsg = error instanceof Error ? error.message : String(error);
53
+ this.sendError(connection, `Invalid message format: ${errorMsg}`);
54
+ }
55
+ });
56
+ // 接続エラー時の処理
57
+ connection.on("error", (error) => {
58
+ console.error(`WebSocket error for session ${sessionId}:`, error);
59
+ this.ptyManager.updateStatus(sessionId, "failed", undefined, error.message);
60
+ });
61
+ // 接続クローズ時の処理
62
+ connection.on("close", () => {
63
+ console.log(`WebSocket closed for session ${sessionId}`);
64
+ // PTYプロセスは残す(バックグラウンドで実行継続)
65
+ });
66
+ }
67
+ /**
68
+ * クライアントメッセージを処理
69
+ */
70
+ handleClientMessage(message, ptyProcess, connection) {
71
+ switch (message.type) {
72
+ case "input": {
73
+ const inputMsg = message;
74
+ ptyProcess.write(inputMsg.data);
75
+ break;
76
+ }
77
+ case "resize": {
78
+ const resizeMsg = message;
79
+ ptyProcess.resize(resizeMsg.data.cols, resizeMsg.data.rows);
80
+ break;
81
+ }
82
+ case "ping": {
83
+ this.sendPong(connection);
84
+ break;
85
+ }
86
+ default: {
87
+ const unknownMsg = message;
88
+ this.sendError(connection, `Unknown message type: ${unknownMsg.type}`);
89
+ break;
90
+ }
91
+ }
92
+ }
93
+ /**
94
+ * 出力メッセージを送信
95
+ */
96
+ sendOutput(connection, data) {
97
+ const message = {
98
+ type: "output",
99
+ data,
100
+ timestamp: new Date().toISOString(),
101
+ };
102
+ connection.send(JSON.stringify(message));
103
+ }
104
+ /**
105
+ * 終了メッセージを送信
106
+ */
107
+ sendExit(connection, code, signal) {
108
+ const exitData = { code };
109
+ if (signal !== undefined) {
110
+ exitData.signal = String(signal);
111
+ }
112
+ const message = {
113
+ type: "exit",
114
+ data: exitData,
115
+ timestamp: new Date().toISOString(),
116
+ };
117
+ connection.send(JSON.stringify(message));
118
+ }
119
+ /**
120
+ * エラーメッセージを送信
121
+ */
122
+ sendError(connection, errorMsg) {
123
+ const message = {
124
+ type: "error",
125
+ data: {
126
+ message: errorMsg,
127
+ },
128
+ timestamp: new Date().toISOString(),
129
+ };
130
+ connection.send(JSON.stringify(message));
131
+ }
132
+ /**
133
+ * Pongメッセージを送信
134
+ */
135
+ sendPong(connection) {
136
+ const message = {
137
+ type: "pong",
138
+ timestamp: new Date().toISOString(),
139
+ };
140
+ connection.send(JSON.stringify(message));
141
+ }
142
+ }
143
+ //# sourceMappingURL=handler.js.map