@akiojin/gwt 2.13.0 → 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 (295) 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 +27 -88
  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.map +1 -1
  13. package/dist/cli/ui/components/screens/BranchListScreen.js +14 -2
  14. package/dist/cli/ui/components/screens/BranchListScreen.js.map +1 -1
  15. package/dist/cli/ui/components/screens/BranchQuickStartScreen.d.ts.map +1 -1
  16. package/dist/cli/ui/components/screens/BranchQuickStartScreen.js +3 -3
  17. package/dist/cli/ui/components/screens/BranchQuickStartScreen.js.map +1 -1
  18. package/dist/cli/ui/utils/continueSession.d.ts.map +1 -1
  19. package/dist/cli/ui/utils/continueSession.js +1 -1
  20. package/dist/cli/ui/utils/continueSession.js.map +1 -1
  21. package/dist/client/assets/index-DPWWHorC.js +72 -0
  22. package/dist/client/assets/index-DsDNCy5f.css +1 -0
  23. package/dist/client/index.html +2 -2
  24. package/dist/codex.d.ts.map +1 -1
  25. package/dist/codex.js +21 -11
  26. package/dist/codex.js.map +1 -1
  27. package/dist/config/builtin-tools.d.ts.map +1 -1
  28. package/dist/config/builtin-tools.js +3 -2
  29. package/dist/config/builtin-tools.js.map +1 -1
  30. package/dist/config/shared-env.d.ts +41 -0
  31. package/dist/config/shared-env.d.ts.map +1 -0
  32. package/dist/config/shared-env.js +114 -0
  33. package/dist/config/shared-env.js.map +1 -0
  34. package/dist/gemini.d.ts.map +1 -1
  35. package/dist/gemini.js +20 -17
  36. package/dist/gemini.js.map +1 -1
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +49 -7
  39. package/dist/index.js.map +1 -1
  40. package/dist/logging/logger.d.ts.map +1 -1
  41. package/dist/logging/logger.js +4 -1
  42. package/dist/logging/logger.js.map +1 -1
  43. package/dist/qwen.d.ts.map +1 -1
  44. package/dist/qwen.js +15 -11
  45. package/dist/qwen.js.map +1 -1
  46. package/dist/services/aiToolResolver.d.ts +41 -0
  47. package/dist/services/aiToolResolver.d.ts.map +1 -0
  48. package/dist/services/aiToolResolver.js +194 -0
  49. package/dist/services/aiToolResolver.js.map +1 -0
  50. package/dist/services/customToolResolver.d.ts +10 -0
  51. package/dist/services/customToolResolver.d.ts.map +1 -0
  52. package/dist/services/customToolResolver.js +71 -0
  53. package/dist/services/customToolResolver.js.map +1 -0
  54. package/dist/shared/aiToolConstants.d.ts +9 -0
  55. package/dist/shared/aiToolConstants.d.ts.map +1 -0
  56. package/dist/shared/aiToolConstants.js +29 -0
  57. package/dist/shared/aiToolConstants.js.map +1 -0
  58. package/dist/types/tools.d.ts +12 -0
  59. package/dist/types/tools.d.ts.map +1 -1
  60. package/dist/utils/prompt.d.ts.map +1 -1
  61. package/dist/utils/prompt.js.map +1 -1
  62. package/dist/utils/session.d.ts.map +1 -1
  63. package/dist/utils/session.js +15 -6
  64. package/dist/utils/session.js.map +1 -1
  65. package/dist/utils/terminal.d.ts +12 -3
  66. package/dist/utils/terminal.d.ts.map +1 -1
  67. package/dist/utils/terminal.js +5 -34
  68. package/dist/utils/terminal.js.map +1 -1
  69. package/dist/utils/webui.d.ts +8 -0
  70. package/dist/utils/webui.d.ts.map +1 -0
  71. package/dist/utils/webui.js +35 -0
  72. package/dist/utils/webui.js.map +1 -0
  73. package/dist/web/client/src/components/AIToolLaunchModal.d.ts +9 -0
  74. package/dist/web/client/src/components/AIToolLaunchModal.d.ts.map +1 -0
  75. package/dist/web/client/src/components/AIToolLaunchModal.js +363 -0
  76. package/dist/web/client/src/components/AIToolLaunchModal.js.map +1 -0
  77. package/dist/web/client/src/components/BranchGraph.d.ts.map +1 -1
  78. package/dist/web/client/src/components/BranchGraph.js +46 -49
  79. package/dist/web/client/src/components/BranchGraph.js.map +1 -1
  80. package/dist/web/client/src/components/CustomToolForm.d.ts +23 -0
  81. package/dist/web/client/src/components/CustomToolForm.d.ts.map +1 -0
  82. package/dist/web/client/src/components/CustomToolForm.js +209 -0
  83. package/dist/web/client/src/components/CustomToolForm.js.map +1 -0
  84. package/dist/web/client/src/components/CustomToolList.d.ts +10 -0
  85. package/dist/web/client/src/components/CustomToolList.d.ts.map +1 -0
  86. package/dist/web/client/src/components/CustomToolList.js +57 -0
  87. package/dist/web/client/src/components/CustomToolList.js.map +1 -0
  88. package/dist/web/client/src/components/EnvEditor.d.ts.map +1 -1
  89. package/dist/web/client/src/components/EnvEditor.js +33 -26
  90. package/dist/web/client/src/components/EnvEditor.js.map +1 -1
  91. package/dist/web/client/src/components/EnvironmentEditor.d.ts +17 -0
  92. package/dist/web/client/src/components/EnvironmentEditor.d.ts.map +1 -0
  93. package/dist/web/client/src/components/EnvironmentEditor.js +22 -0
  94. package/dist/web/client/src/components/EnvironmentEditor.js.map +1 -0
  95. package/dist/web/client/src/components/Terminal.d.ts.map +1 -1
  96. package/dist/web/client/src/components/Terminal.js +10 -3
  97. package/dist/web/client/src/components/Terminal.js.map +1 -1
  98. package/dist/web/client/src/components/branch-detail/BranchInfoCards.d.ts +10 -0
  99. package/dist/web/client/src/components/branch-detail/BranchInfoCards.d.ts.map +1 -0
  100. package/dist/web/client/src/components/branch-detail/BranchInfoCards.js +104 -0
  101. package/dist/web/client/src/components/branch-detail/BranchInfoCards.js.map +1 -0
  102. package/dist/web/client/src/components/branch-detail/SessionHistoryTable.d.ts +22 -0
  103. package/dist/web/client/src/components/branch-detail/SessionHistoryTable.d.ts.map +1 -0
  104. package/dist/web/client/src/components/branch-detail/SessionHistoryTable.js +79 -0
  105. package/dist/web/client/src/components/branch-detail/SessionHistoryTable.js.map +1 -0
  106. package/dist/web/client/src/components/branch-detail/TerminalPanel.d.ts +11 -0
  107. package/dist/web/client/src/components/branch-detail/TerminalPanel.d.ts.map +1 -0
  108. package/dist/web/client/src/components/branch-detail/TerminalPanel.js +32 -0
  109. package/dist/web/client/src/components/branch-detail/TerminalPanel.js.map +1 -0
  110. package/dist/web/client/src/components/branch-detail/ToolLauncher.d.ts +40 -0
  111. package/dist/web/client/src/components/branch-detail/ToolLauncher.d.ts.map +1 -0
  112. package/dist/web/client/src/components/branch-detail/ToolLauncher.js +147 -0
  113. package/dist/web/client/src/components/branch-detail/ToolLauncher.js.map +1 -0
  114. package/dist/web/client/src/components/branch-detail/index.d.ts +5 -0
  115. package/dist/web/client/src/components/branch-detail/index.d.ts.map +1 -0
  116. package/dist/web/client/src/components/branch-detail/index.js +5 -0
  117. package/dist/web/client/src/components/branch-detail/index.js.map +1 -0
  118. package/dist/web/client/src/components/common/BranchCard.d.ts +17 -0
  119. package/dist/web/client/src/components/common/BranchCard.d.ts.map +1 -0
  120. package/dist/web/client/src/components/common/BranchCard.js +36 -0
  121. package/dist/web/client/src/components/common/BranchCard.js.map +1 -0
  122. package/dist/web/client/src/components/common/MetricCard.d.ts +10 -0
  123. package/dist/web/client/src/components/common/MetricCard.d.ts.map +1 -0
  124. package/dist/web/client/src/components/common/MetricCard.js +10 -0
  125. package/dist/web/client/src/components/common/MetricCard.js.map +1 -0
  126. package/dist/web/client/src/components/common/PageHeader.d.ts +12 -0
  127. package/dist/web/client/src/components/common/PageHeader.d.ts.map +1 -0
  128. package/dist/web/client/src/components/common/PageHeader.js +14 -0
  129. package/dist/web/client/src/components/common/PageHeader.js.map +1 -0
  130. package/dist/web/client/src/components/common/SearchInput.d.ts +14 -0
  131. package/dist/web/client/src/components/common/SearchInput.d.ts.map +1 -0
  132. package/dist/web/client/src/components/common/SearchInput.js +15 -0
  133. package/dist/web/client/src/components/common/SearchInput.js.map +1 -0
  134. package/dist/web/client/src/components/common/StatusBadge.d.ts +10 -0
  135. package/dist/web/client/src/components/common/StatusBadge.d.ts.map +1 -0
  136. package/dist/web/client/src/components/common/StatusBadge.js +15 -0
  137. package/dist/web/client/src/components/common/StatusBadge.js.map +1 -0
  138. package/dist/web/client/src/components/common/index.d.ts +6 -0
  139. package/dist/web/client/src/components/common/index.d.ts.map +1 -0
  140. package/dist/web/client/src/components/common/index.js +6 -0
  141. package/dist/web/client/src/components/common/index.js.map +1 -0
  142. package/dist/web/client/src/components/ui/alert.d.ts +9 -0
  143. package/dist/web/client/src/components/ui/alert.d.ts.map +1 -0
  144. package/dist/web/client/src/components/ui/alert.js +25 -0
  145. package/dist/web/client/src/components/ui/alert.js.map +1 -0
  146. package/dist/web/client/src/components/ui/badge.d.ts +10 -0
  147. package/dist/web/client/src/components/ui/badge.d.ts.map +1 -0
  148. package/dist/web/client/src/components/ui/badge.js +25 -0
  149. package/dist/web/client/src/components/ui/badge.js.map +1 -0
  150. package/dist/web/client/src/components/ui/button.d.ts +12 -0
  151. package/dist/web/client/src/components/ui/button.d.ts.map +1 -0
  152. package/dist/web/client/src/components/ui/button.js +33 -0
  153. package/dist/web/client/src/components/ui/button.js.map +1 -0
  154. package/dist/web/client/src/components/ui/card.d.ts +9 -0
  155. package/dist/web/client/src/components/ui/card.d.ts.map +1 -0
  156. package/dist/web/client/src/components/ui/card.js +16 -0
  157. package/dist/web/client/src/components/ui/card.js.map +1 -0
  158. package/dist/web/client/src/components/ui/index.d.ts +8 -0
  159. package/dist/web/client/src/components/ui/index.d.ts.map +1 -0
  160. package/dist/web/client/src/components/ui/index.js +8 -0
  161. package/dist/web/client/src/components/ui/index.js.map +1 -0
  162. package/dist/web/client/src/components/ui/input.d.ts +4 -0
  163. package/dist/web/client/src/components/ui/input.d.ts.map +1 -0
  164. package/dist/web/client/src/components/ui/input.js +8 -0
  165. package/dist/web/client/src/components/ui/input.js.map +1 -0
  166. package/dist/web/client/src/components/ui/select.d.ts +14 -0
  167. package/dist/web/client/src/components/ui/select.d.ts.map +1 -0
  168. package/dist/web/client/src/components/ui/select.js +39 -0
  169. package/dist/web/client/src/components/ui/select.js.map +1 -0
  170. package/dist/web/client/src/components/ui/table.d.ts +11 -0
  171. package/dist/web/client/src/components/ui/table.d.ts.map +1 -0
  172. package/dist/web/client/src/components/ui/table.js +21 -0
  173. package/dist/web/client/src/components/ui/table.js.map +1 -0
  174. package/dist/web/client/src/hooks/useSessions.d.ts.map +1 -1
  175. package/dist/web/client/src/hooks/useSessions.js +6 -1
  176. package/dist/web/client/src/hooks/useSessions.js.map +1 -1
  177. package/dist/web/client/src/lib/utils.d.ts +7 -0
  178. package/dist/web/client/src/lib/utils.d.ts.map +1 -0
  179. package/dist/web/client/src/lib/utils.js +10 -0
  180. package/dist/web/client/src/lib/utils.js.map +1 -0
  181. package/dist/web/client/src/lib/websocket.d.ts +7 -0
  182. package/dist/web/client/src/lib/websocket.d.ts.map +1 -1
  183. package/dist/web/client/src/lib/websocket.js +44 -0
  184. package/dist/web/client/src/lib/websocket.js.map +1 -1
  185. package/dist/web/client/src/pages/BranchDetailPage.d.ts.map +1 -1
  186. package/dist/web/client/src/pages/BranchDetailPage.js +113 -361
  187. package/dist/web/client/src/pages/BranchDetailPage.js.map +1 -1
  188. package/dist/web/client/src/pages/BranchListPage.d.ts.map +1 -1
  189. package/dist/web/client/src/pages/BranchListPage.js +89 -127
  190. package/dist/web/client/src/pages/BranchListPage.js.map +1 -1
  191. package/dist/web/client/src/pages/ConfigManagementPage.d.ts.map +1 -1
  192. package/dist/web/client/src/pages/ConfigManagementPage.js +46 -41
  193. package/dist/web/client/src/pages/ConfigManagementPage.js.map +1 -1
  194. package/dist/web/client/src/pages/ConfigPage.d.ts +3 -0
  195. package/dist/web/client/src/pages/ConfigPage.d.ts.map +1 -0
  196. package/dist/web/client/src/pages/ConfigPage.js +216 -0
  197. package/dist/web/client/src/pages/ConfigPage.js.map +1 -0
  198. package/dist/web/client/vite.config.d.ts.map +1 -1
  199. package/dist/web/client/vite.config.js +8 -1
  200. package/dist/web/client/vite.config.js.map +1 -1
  201. package/dist/web/server/index.d.ts +24 -2
  202. package/dist/web/server/index.d.ts.map +1 -1
  203. package/dist/web/server/index.js +46 -15
  204. package/dist/web/server/index.js.map +1 -1
  205. package/dist/web/server/pty/manager.d.ts +12 -10
  206. package/dist/web/server/pty/manager.d.ts.map +1 -1
  207. package/dist/web/server/pty/manager.js +76 -43
  208. package/dist/web/server/pty/manager.js.map +1 -1
  209. package/dist/web/server/routes/sessions.d.ts.map +1 -1
  210. package/dist/web/server/routes/sessions.js +35 -2
  211. package/dist/web/server/routes/sessions.js.map +1 -1
  212. package/dist/web/server/routes/worktrees.js +2 -2
  213. package/dist/web/server/routes/worktrees.js.map +1 -1
  214. package/dist/web/server/services/worktrees.d.ts.map +1 -1
  215. package/dist/web/server/services/worktrees.js +7 -1
  216. package/dist/web/server/services/worktrees.js.map +1 -1
  217. package/dist/web/server/tray.d.ts +24 -0
  218. package/dist/web/server/tray.d.ts.map +1 -0
  219. package/dist/web/server/tray.js +79 -0
  220. package/dist/web/server/tray.js.map +1 -0
  221. package/dist/web/server/websocket/handler.d.ts +18 -2
  222. package/dist/web/server/websocket/handler.d.ts.map +1 -1
  223. package/dist/web/server/websocket/handler.js +82 -9
  224. package/dist/web/server/websocket/handler.js.map +1 -1
  225. package/package.json +15 -2
  226. package/src/claude.ts +26 -15
  227. package/src/cli/ui/__tests__/components/common/Select.test.tsx +11 -0
  228. package/src/cli/ui/__tests__/components/screens/BranchListScreen.test.tsx +17 -1
  229. package/src/cli/ui/__tests__/components/screens/BranchQuickStartScreen.test.tsx +4 -4
  230. package/src/cli/ui/components/App.tsx +33 -133
  231. package/src/cli/ui/components/common/Select.tsx +2 -2
  232. package/src/cli/ui/components/screens/BranchListScreen.tsx +43 -23
  233. package/src/cli/ui/components/screens/BranchQuickStartScreen.tsx +41 -46
  234. package/src/cli/ui/utils/continueSession.ts +1 -7
  235. package/src/codex.ts +31 -22
  236. package/src/config/builtin-tools.ts +6 -2
  237. package/src/config/shared-env.ts +139 -0
  238. package/src/gemini.ts +35 -22
  239. package/src/index.ts +54 -7
  240. package/src/logging/logger.ts +5 -2
  241. package/src/qwen.ts +28 -19
  242. package/src/services/aiToolResolver.ts +276 -0
  243. package/src/services/customToolResolver.ts +98 -0
  244. package/src/shared/aiToolConstants.ts +30 -0
  245. package/src/trayicon.d.ts +30 -0
  246. package/src/types/tools.ts +15 -0
  247. package/src/utils/prompt.ts +15 -9
  248. package/src/utils/session.ts +80 -26
  249. package/src/utils/terminal.ts +11 -41
  250. package/src/utils/webui.ts +43 -0
  251. package/src/web/client/components.json +21 -0
  252. package/src/web/client/src/components/AIToolLaunchModal.tsx +575 -0
  253. package/src/web/client/src/components/BranchGraph.tsx +95 -75
  254. package/src/web/client/src/components/CustomToolForm.tsx +386 -0
  255. package/src/web/client/src/components/CustomToolList.tsx +119 -0
  256. package/src/web/client/src/components/EnvEditor.tsx +91 -81
  257. package/src/web/client/src/components/EnvironmentEditor.tsx +97 -0
  258. package/src/web/client/src/components/Terminal.tsx +11 -3
  259. package/src/web/client/src/components/branch-detail/BranchInfoCards.tsx +179 -0
  260. package/src/web/client/src/components/branch-detail/SessionHistoryTable.tsx +181 -0
  261. package/src/web/client/src/components/branch-detail/TerminalPanel.tsx +92 -0
  262. package/src/web/client/src/components/branch-detail/ToolLauncher.tsx +327 -0
  263. package/src/web/client/src/components/branch-detail/index.ts +4 -0
  264. package/src/web/client/src/components/common/BranchCard.tsx +117 -0
  265. package/src/web/client/src/components/common/MetricCard.tsx +22 -0
  266. package/src/web/client/src/components/common/PageHeader.tsx +44 -0
  267. package/src/web/client/src/components/common/SearchInput.tsx +40 -0
  268. package/src/web/client/src/components/common/StatusBadge.tsx +37 -0
  269. package/src/web/client/src/components/common/index.ts +5 -0
  270. package/src/web/client/src/components/ui/alert.tsx +63 -0
  271. package/src/web/client/src/components/ui/badge.tsx +44 -0
  272. package/src/web/client/src/components/ui/button.tsx +57 -0
  273. package/src/web/client/src/components/ui/card.tsx +82 -0
  274. package/src/web/client/src/components/ui/index.ts +32 -0
  275. package/src/web/client/src/components/ui/input.tsx +21 -0
  276. package/src/web/client/src/components/ui/select.tsx +156 -0
  277. package/src/web/client/src/components/ui/table.tsx +119 -0
  278. package/src/web/client/src/hooks/useSessions.ts +10 -1
  279. package/src/web/client/src/index.css +46 -816
  280. package/src/web/client/src/lib/utils.ts +10 -0
  281. package/src/web/client/src/lib/websocket.ts +48 -1
  282. package/src/web/client/src/pages/BranchDetailPage.tsx +222 -694
  283. package/src/web/client/src/pages/BranchListPage.tsx +190 -236
  284. package/src/web/client/src/pages/ConfigManagementPage.tsx +94 -76
  285. package/src/web/client/src/pages/ConfigPage.tsx +362 -0
  286. package/src/web/client/vite.config.ts +8 -1
  287. package/src/web/server/index.ts +72 -15
  288. package/src/web/server/pty/manager.ts +128 -55
  289. package/src/web/server/routes/sessions.ts +59 -7
  290. package/src/web/server/routes/worktrees.ts +3 -3
  291. package/src/web/server/services/worktrees.ts +12 -4
  292. package/src/web/server/tray.ts +93 -0
  293. package/src/web/server/websocket/handler.ts +119 -13
  294. package/dist/client/assets/index-DeNwPosA.css +0 -1
  295. package/dist/client/assets/index-Dl798X5w.js +0 -32
@@ -5,28 +5,11 @@ import { useCreateWorktree } from "../hooks/useWorktrees";
5
5
  import { useStartSession, useSessions, useDeleteSession, } from "../hooks/useSessions";
6
6
  import { useConfig } from "../hooks/useConfig";
7
7
  import { ApiError } from "../lib/api";
8
- import { Terminal } from "../components/Terminal";
9
- const BUILTIN_TOOL_SUMMARIES = {
10
- "claude-code": {
11
- command: "claude",
12
- defaultArgs: [],
13
- modeArgs: {
14
- normal: [],
15
- continue: ["-c"],
16
- resume: ["-r"],
17
- },
18
- permissionSkipArgs: ["--dangerously-skip-permissions"],
19
- },
20
- "codex-cli": {
21
- command: "codex",
22
- defaultArgs: ["--auto-approve", "--verbose"],
23
- modeArgs: {
24
- normal: [],
25
- continue: ["resume", "--last"],
26
- resume: ["resume"],
27
- },
28
- },
29
- };
8
+ import { PageHeader } from "@/components/common/PageHeader";
9
+ import { Button } from "@/components/ui/button";
10
+ import { Badge } from "@/components/ui/badge";
11
+ import { Alert, AlertDescription } from "@/components/ui/alert";
12
+ import { SessionHistoryTable, ToolLauncher, BranchInfoCards, TerminalPanel, } from "@/components/branch-detail";
30
13
  const BRANCH_TYPE_LABEL = {
31
14
  local: "ローカル",
32
15
  remote: "リモート",
@@ -36,11 +19,6 @@ const MERGE_STATUS_LABEL = {
36
19
  unmerged: "未マージ",
37
20
  unknown: "状態不明",
38
21
  };
39
- const MERGE_STATUS_TONE = {
40
- merged: "success",
41
- unmerged: "warning",
42
- unknown: "muted",
43
- };
44
22
  export function BranchDetailPage() {
45
23
  const { branchName } = useParams();
46
24
  const decodedBranchName = branchName ? decodeURIComponent(branchName) : "";
@@ -61,36 +39,47 @@ export function BranchDetailPage() {
61
39
  const [extraArgsText, setExtraArgsText] = useState("");
62
40
  const [terminatingSessionId, setTerminatingSessionId] = useState(null);
63
41
  const formattedCommitDate = useMemo(() => formatDate(branch?.commitDate), [branch?.commitDate]);
42
+ // Handle fullscreen body overflow
64
43
  useEffect(() => {
65
- if (!isTerminalFullscreen) {
44
+ if (!isTerminalFullscreen)
66
45
  return undefined;
67
- }
68
46
  const previousOverflow = document.body.style.overflow;
69
47
  document.body.style.overflow = "hidden";
70
48
  return () => {
71
49
  document.body.style.overflow = previousOverflow;
72
50
  };
73
51
  }, [isTerminalFullscreen]);
52
+ // Loading state
74
53
  if (isLoading) {
75
- return (React.createElement("div", { className: "app-shell" },
76
- React.createElement("div", { className: "page-state page-state--centered" },
77
- React.createElement("h1", null, "\u8AAD\u307F\u8FBC\u307F\u4E2D"),
78
- React.createElement("p", null, "\u30D6\u30E9\u30F3\u30C1\u60C5\u5831\u3092\u53D6\u5F97\u3057\u3066\u3044\u307E\u3059..."))));
54
+ return (React.createElement("div", { className: "min-h-screen bg-background" },
55
+ React.createElement(PageHeader, { eyebrow: "BRANCH DETAIL", title: "\u8AAD\u307F\u8FBC\u307F\u4E2D...", subtitle: "\u30D6\u30E9\u30F3\u30C1\u60C5\u5831\u3092\u53D6\u5F97\u3057\u3066\u3044\u307E\u3059" }),
56
+ React.createElement("main", { className: "mx-auto max-w-7xl px-6 py-8" },
57
+ React.createElement("div", { className: "flex items-center justify-center py-20" },
58
+ React.createElement("div", { className: "text-center" },
59
+ React.createElement("div", { className: "mb-4 text-4xl" }, "\u23F3"),
60
+ React.createElement("p", { className: "text-muted-foreground" }, "Loading branch..."))))));
79
61
  }
62
+ // Error state
80
63
  if (error) {
81
- return (React.createElement("div", { className: "app-shell" },
82
- React.createElement("div", { className: "page-state page-state--centered" },
83
- React.createElement("h1", null, "\u30D6\u30E9\u30F3\u30C1\u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u307E\u3057\u305F"),
84
- React.createElement("p", null, error instanceof Error ? error.message : "未知のエラーです"),
85
- React.createElement(Link, { to: "/", className: "button button--ghost" }, "\u30D6\u30E9\u30F3\u30C1\u4E00\u89A7\u306B\u623B\u308B"))));
64
+ return (React.createElement("div", { className: "min-h-screen bg-background" },
65
+ React.createElement(PageHeader, { eyebrow: "BRANCH DETAIL", title: "\u30A8\u30E9\u30FC" }),
66
+ React.createElement("main", { className: "mx-auto max-w-7xl px-6 py-8" },
67
+ React.createElement(Alert, { variant: "destructive" },
68
+ React.createElement(AlertDescription, null, error instanceof Error ? error.message : "未知のエラーです")),
69
+ React.createElement("div", { className: "mt-4" },
70
+ React.createElement(Button, { variant: "ghost", asChild: true },
71
+ React.createElement(Link, { to: "/" }, "\u2190 \u30D6\u30E9\u30F3\u30C1\u4E00\u89A7\u306B\u623B\u308B"))))));
86
72
  }
73
+ // Not found state
87
74
  if (!branch) {
88
- return (React.createElement("div", { className: "app-shell" },
89
- React.createElement("div", { className: "page-state page-state--centered" },
90
- React.createElement("h1", null, "Branch not found"),
91
- React.createElement("p", null, "\u6307\u5B9A\u3055\u308C\u305F\u30D6\u30E9\u30F3\u30C1\u306F\u5B58\u5728\u3057\u307E\u305B\u3093\u3002"),
92
- React.createElement(Link, { to: "/", className: "button button--ghost" }, "\u30D6\u30E9\u30F3\u30C1\u4E00\u89A7\u306B\u623B\u308B"))));
75
+ return (React.createElement("div", { className: "min-h-screen bg-background" },
76
+ React.createElement(PageHeader, { eyebrow: "BRANCH DETAIL", title: "Branch not found" }),
77
+ React.createElement("main", { className: "mx-auto max-w-7xl px-6 py-8" },
78
+ React.createElement("p", { className: "mb-4 text-muted-foreground" }, "\u6307\u5B9A\u3055\u308C\u305F\u30D6\u30E9\u30F3\u30C1\u306F\u5B58\u5728\u3057\u307E\u305B\u3093\u3002"),
79
+ React.createElement(Button, { variant: "ghost", asChild: true },
80
+ React.createElement(Link, { to: "/" }, "\u2190 \u30D6\u30E9\u30F3\u30C1\u4E00\u89A7\u306B\u623B\u308B")))));
93
81
  }
82
+ // Computed values
94
83
  const canStartSession = Boolean(branch.worktreePath);
95
84
  const divergenceInfo = branch.divergence ?? null;
96
85
  const hasBlockingDivergence = Boolean(divergenceInfo && divergenceInfo.ahead > 0 && divergenceInfo.behind > 0);
@@ -100,6 +89,7 @@ export function BranchDetailPage() {
100
89
  divergenceInfo.ahead === 0 &&
101
90
  !hasBlockingDivergence);
102
91
  const isSyncingBranch = syncBranch.isPending;
92
+ // Available tools
103
93
  const customTools = config?.tools ?? [];
104
94
  const availableTools = useMemo(() => [
105
95
  { id: "claude-code", label: "Claude Code", target: "claude" },
@@ -111,6 +101,7 @@ export function BranchDetailPage() {
111
101
  definition: tool,
112
102
  })),
113
103
  ], [customTools]);
104
+ // Ensure selected tool is valid
114
105
  useEffect(() => {
115
106
  if (!availableTools.length) {
116
107
  setSelectedToolId("claude-code");
@@ -118,47 +109,44 @@ export function BranchDetailPage() {
118
109
  }
119
110
  if (!availableTools.find((tool) => tool.id === selectedToolId)) {
120
111
  const first = availableTools[0];
121
- if (first) {
112
+ if (first)
122
113
  setSelectedToolId(first.id);
123
- }
124
114
  }
125
115
  }, [availableTools, selectedToolId]);
126
116
  const selectedTool = availableTools.find((tool) => tool.id === selectedToolId);
127
- const selectedToolSummary = useMemo(() => {
128
- if (!selectedTool) {
129
- return null;
130
- }
131
- if (selectedTool.target === "custom") {
132
- return {
133
- command: selectedTool.definition.command,
134
- defaultArgs: selectedTool.definition.defaultArgs ?? null,
135
- modeArgs: selectedTool.definition.modeArgs,
136
- permissionSkipArgs: selectedTool.definition.permissionSkipArgs ?? null,
137
- };
138
- }
139
- return BUILTIN_TOOL_SUMMARIES[selectedTool.id] ?? null;
140
- }, [selectedTool]);
141
- const argsPreview = useMemo(() => {
142
- if (!selectedToolSummary) {
117
+ // Branch sessions
118
+ const branchSessions = useMemo(() => {
119
+ return (sessionsData ?? [])
120
+ .filter((session) => session.worktreePath === branch?.worktreePath)
121
+ .sort((a, b) => (b.startedAt ?? "").localeCompare(a.startedAt ?? ""));
122
+ }, [sessionsData, branch?.worktreePath]);
123
+ // Latest tool usage
124
+ const latestToolUsage = useMemo(() => {
125
+ if (branch?.lastToolUsage)
126
+ return branch.lastToolUsage;
127
+ const first = branchSessions[0];
128
+ if (!first)
143
129
  return null;
144
- }
145
- const args = [];
146
- if (selectedToolSummary.defaultArgs?.length) {
147
- args.push(...selectedToolSummary.defaultArgs);
148
- }
149
- const mode = selectedToolSummary.modeArgs?.[selectedMode];
150
- if (mode?.length) {
151
- args.push(...mode);
152
- }
153
- if (skipPermissions && selectedToolSummary.permissionSkipArgs?.length) {
154
- args.push(...selectedToolSummary.permissionSkipArgs);
155
- }
156
- const extraArgs = parseExtraArgs(extraArgsText);
157
- if (extraArgs.length) {
158
- args.push(...extraArgs);
159
- }
160
- return { command: selectedToolSummary.command, args };
161
- }, [selectedToolSummary, selectedMode, skipPermissions, extraArgsText]);
130
+ return {
131
+ branch: branch.name,
132
+ worktreePath: branch.worktreePath ?? null,
133
+ toolId: first.toolType === "custom"
134
+ ? (first.toolName ?? "custom")
135
+ : first.toolType,
136
+ toolLabel: first.toolType === "custom"
137
+ ? (first.toolName ?? "Custom")
138
+ : toolLabel(first.toolType),
139
+ mode: first.mode ?? "normal",
140
+ model: null,
141
+ timestamp: first.startedAt ? Date.parse(first.startedAt) : Date.now(),
142
+ };
143
+ }, [
144
+ branch?.lastToolUsage,
145
+ branch?.name,
146
+ branch?.worktreePath,
147
+ branchSessions,
148
+ ]);
149
+ // Handlers
162
150
  const handleCreateWorktree = async () => {
163
151
  try {
164
152
  await createWorktree.mutateAsync({
@@ -195,19 +183,19 @@ export function BranchDetailPage() {
195
183
  if (needsRemoteSync) {
196
184
  setBanner({
197
185
  type: "error",
198
- message: "リモートの更新を取り込むまでAIツールは起動できません。『最新の変更を同期』を実行してください。",
186
+ message: "リモートの更新を取り込むまでAIツールは起動できません。",
199
187
  });
200
188
  return;
201
189
  }
202
190
  if (hasBlockingDivergence) {
203
191
  setBanner({
204
192
  type: "error",
205
- message: "リモートとローカルの双方で進捗が発生しているため、CLIと同様にAIツールの起動をブロックしました。先に rebase/merge 等で差分を解消してください。",
193
+ message: "差分を解消してから起動してください。",
206
194
  });
207
195
  return;
208
196
  }
209
197
  if (skipPermissions &&
210
- !window.confirm("権限チェックをスキップして起動します。自己責任で実行してください。続行しますか?")) {
198
+ !window.confirm("権限チェックをスキップして起動します。続行しますか?")) {
211
199
  return;
212
200
  }
213
201
  setIsStartingSession(true);
@@ -217,7 +205,10 @@ export function BranchDetailPage() {
217
205
  : selectedTool.target === "custom"
218
206
  ? "custom"
219
207
  : "claude-code";
220
- const extraArgs = parseExtraArgs(extraArgsText);
208
+ const extraArgs = extraArgsText
209
+ .split(/\s+/)
210
+ .map((c) => c.trim())
211
+ .filter(Boolean);
221
212
  const sessionRequest = {
222
213
  toolType,
223
214
  toolName: selectedTool.target === "custom" ? selectedTool.id : null,
@@ -255,9 +246,8 @@ export function BranchDetailPage() {
255
246
  try {
256
247
  await deleteSession.mutateAsync(sessionId);
257
248
  setBanner({ type: "success", message: "セッションを終了しました" });
258
- if (activeSessionId === sessionId) {
249
+ if (activeSessionId === sessionId)
259
250
  setActiveSessionId(null);
260
- }
261
251
  }
262
252
  catch (err) {
263
253
  setBanner({
@@ -303,37 +293,6 @@ export function BranchDetailPage() {
303
293
  });
304
294
  }
305
295
  };
306
- const branchSessions = useMemo(() => {
307
- return (sessionsData ?? [])
308
- .filter((session) => session.worktreePath === branch?.worktreePath)
309
- .sort((a, b) => (b.startedAt ?? "").localeCompare(a.startedAt ?? ""));
310
- }, [sessionsData, branch?.worktreePath]);
311
- const latestToolUsage = useMemo(() => {
312
- if (branch?.lastToolUsage) {
313
- return branch.lastToolUsage;
314
- }
315
- const first = branchSessions[0];
316
- if (!first)
317
- return null;
318
- return {
319
- branch: branch.name,
320
- worktreePath: branch.worktreePath ?? null,
321
- toolId: first.toolType === "custom"
322
- ? (first.toolName ?? "custom")
323
- : first.toolType,
324
- toolLabel: first.toolType === "custom"
325
- ? (first.toolName ?? "Custom")
326
- : toolLabel(first.toolType),
327
- mode: first.mode ?? "normal",
328
- model: null,
329
- timestamp: first.startedAt ? Date.parse(first.startedAt) : Date.now(),
330
- };
331
- }, [
332
- branch?.lastToolUsage,
333
- branch?.name,
334
- branch?.worktreePath,
335
- branchSessions,
336
- ]);
337
296
  const handleSessionExit = (code) => {
338
297
  setActiveSessionId(null);
339
298
  setIsTerminalFullscreen(false);
@@ -342,211 +301,52 @@ export function BranchDetailPage() {
342
301
  message: `セッションがコード ${code} で終了しました。`,
343
302
  });
344
303
  };
345
- return (React.createElement("div", { className: "app-shell" },
346
- React.createElement("header", { className: "page-hero page-hero--compact" },
347
- React.createElement(Link, { to: "/", className: "link-back" }, "\u2190 \u30D6\u30E9\u30F3\u30C1\u4E00\u89A7\u306B\u623B\u308B"),
348
- React.createElement("p", { className: "page-hero__eyebrow" }, "BRANCH DETAIL"),
349
- React.createElement("h1", null, branch.name),
350
- React.createElement("p", { className: "page-hero__subtitle" },
351
- "\u6700\u65B0\u30B3\u30DF\u30C3\u30C8 ",
352
- branch.commitHash.slice(0, 7),
353
- " \u30FB ",
354
- formattedCommitDate),
355
- React.createElement("div", { className: "badge-group" },
356
- React.createElement("span", { className: `status-badge status-badge--${branch.type}` }, BRANCH_TYPE_LABEL[branch.type]),
357
- React.createElement("span", { className: `status-badge status-badge--${MERGE_STATUS_TONE[branch.mergeStatus]}` }, MERGE_STATUS_LABEL[branch.mergeStatus]),
358
- React.createElement("span", { className: `status-badge ${branch.worktreePath
359
- ? "status-badge--success"
360
- : "status-badge--muted"}` }, branch.worktreePath ? "Worktreeあり" : "Worktree未作成")),
361
- React.createElement("div", { className: "badge-group", style: { marginTop: "0.5rem" } }, latestToolUsage ? (React.createElement(React.Fragment, null,
362
- React.createElement("span", { className: "status-badge status-badge--muted" }, renderToolUsage(latestToolUsage)),
363
- React.createElement("span", { className: "status-badge status-badge--muted" },
364
- formatUsageTimestamp(latestToolUsage.timestamp),
365
- " \u30FB worktree:",
366
- " ",
367
- latestToolUsage.worktreePath ?? branch.worktreePath ?? "N/A"))) : (React.createElement("span", { className: "status-badge status-badge--muted" }, "Unknown"))),
368
- React.createElement("div", { className: "page-hero__actions" }, !canStartSession ? (React.createElement("button", { type: "button", className: "button button--primary", onClick: handleCreateWorktree, disabled: createWorktree.isPending }, createWorktree.isPending ? "作成中..." : "Worktreeを作成")) : (React.createElement(Link, { to: "/config", className: "button button--secondary" }, "\u30AB\u30B9\u30BF\u30E0\u30C4\u30FC\u30EB\u8A2D\u5B9A\u3092\u958B\u304F"))),
369
- banner && (React.createElement("div", { className: `inline-banner inline-banner--${banner.type}` }, banner.message))),
370
- isTerminalFullscreen && (React.createElement("div", { className: "terminal-overlay-backdrop", "aria-hidden": "true", onClick: () => setIsTerminalFullscreen(false) })),
371
- React.createElement("main", { className: "page-content page-content--wide" },
372
- React.createElement("div", { className: "page-layout page-layout--split" },
373
- React.createElement("div", { className: "info-stack" },
374
- React.createElement("section", { className: "section-card" },
375
- React.createElement("header", { className: "terminal-section__header" },
376
- React.createElement("div", null,
377
- React.createElement("h2", null, "AI\u30C4\u30FC\u30EB\u8D77\u52D5"),
378
- React.createElement("p", { className: "section-card__body" }, "Web UI \u304B\u3089\u76F4\u63A5AI\u30C4\u30FC\u30EB\u3092\u8D77\u52D5\u3067\u304D\u307E\u3059\u3002\u8A2D\u5B9A\u3057\u305F\u30AB\u30B9\u30BF\u30E0\u30C4\u30FC\u30EB\u3082\u4E00\u89A7\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002")),
379
- configError && (React.createElement("span", { className: "pill pill--warning" }, "\u8A2D\u5B9A\u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u307E\u3057\u305F"))),
380
- !canStartSession ? (React.createElement("p", { className: "section-card__body" }, "Worktree\u304C\u672A\u4F5C\u6210\u306E\u305F\u3081\u3001\u5148\u306BWorktree\u3092\u4F5C\u6210\u3057\u3066\u304F\u3060\u3055\u3044\u3002")) : (React.createElement("div", { className: "tool-form" },
381
- React.createElement("div", { className: "form-grid" },
382
- React.createElement("label", { className: "form-field" },
383
- React.createElement("span", null, "AI\u30C4\u30FC\u30EB"),
384
- React.createElement("select", { value: selectedToolId, onChange: (event) => setSelectedToolId(event.target.value), disabled: isConfigLoading }, availableTools.map((tool) => (React.createElement("option", { key: tool.id, value: tool.id }, tool.label))))),
385
- React.createElement("label", { className: "form-field" },
386
- React.createElement("span", null, "\u8D77\u52D5\u30E2\u30FC\u30C9"),
387
- React.createElement("select", { value: selectedMode, onChange: (event) => setSelectedMode(event.target.value) },
388
- React.createElement("option", { value: "normal" }, "normal"),
389
- React.createElement("option", { value: "continue" }, "continue"),
390
- React.createElement("option", { value: "resume" }, "resume"))),
391
- React.createElement("label", { className: "form-field" },
392
- React.createElement("span", null, "\u8FFD\u52A0\u5F15\u6570 (\u30B9\u30DA\u30FC\u30B9\u533A\u5207\u308A)"),
393
- React.createElement("input", { type: "text", value: extraArgsText, onChange: (event) => setExtraArgsText(event.target.value), placeholder: "--flag value" }))),
394
- React.createElement("label", { className: "form-field" },
395
- React.createElement("span", null,
396
- React.createElement("input", { type: "checkbox", checked: skipPermissions, onChange: (event) => setSkipPermissions(event.target.checked) }),
397
- React.createElement("span", { style: { marginLeft: "0.5rem" } }, "\u6A29\u9650\u30C1\u30A7\u30C3\u30AF\u3092\u30B9\u30AD\u30C3\u30D7 (\u81EA\u5DF1\u8CAC\u4EFB)"))),
398
- skipPermissions && (React.createElement("div", { className: "inline-banner inline-banner--warning" },
399
- React.createElement("p", null, "\u6A29\u9650\u30C1\u30A7\u30C3\u30AF\u3092\u30B9\u30AD\u30C3\u30D7\u3059\u308B\u3053\u3068\u3067\u3001CLI \u3067\u306E `--dangerously-skip-permissions` \u6307\u5B9A\u3068\u540C\u69D8\u306E\u30EA\u30B9\u30AF\u3092\u8CA0\u3044\u307E\u3059\u3002"))),
400
- needsRemoteSync && (React.createElement("div", { className: "inline-banner inline-banner--info", "data-testid": "sync-required" },
401
- React.createElement("p", null,
402
- "\u30EA\u30E2\u30FC\u30C8\u306B\u672A\u53D6\u5F97\u306E\u66F4\u65B0 (",
403
- branch.divergence?.behind ?? 0,
404
- " ",
405
- "commits) \u304C\u3042\u308B\u305F\u3081\u3001AI\u30C4\u30FC\u30EB\u3092\u8D77\u52D5\u3059\u308B\u524D\u306B\u540C\u671F\u3057\u3066\u304F\u3060\u3055\u3044\u3002"),
406
- React.createElement("p", { className: "section-card__body" }, "CLI \u306E `git fetch --all` \u3068 `git pull --ff-only` \u3068\u540C\u3058\u51E6\u7406\u3092 Web UI \u304B\u3089\u5B9F\u884C\u3067\u304D\u307E\u3059\u3002"))),
407
- hasBlockingDivergence && (React.createElement("div", { className: "inline-banner inline-banner--warning", "data-testid": "divergence-warning" },
408
- React.createElement("p", null, "\u30EA\u30E2\u30FC\u30C8\u3068\u30ED\u30FC\u30AB\u30EB\u306E\u4E21\u65B9\u306B\u672A\u89E3\u6C7A\u306E\u5DEE\u5206\u304C\u3042\u308B\u305F\u3081\u3001Web UI \u3067\u3082 CLI \u3068\u540C\u69D8\u306B\u8D77\u52D5\u3092\u30D6\u30ED\u30C3\u30AF\u3057\u3066\u3044\u307E\u3059\u3002"),
409
- React.createElement("ul", { className: "list-muted" },
410
- React.createElement("li", null,
411
- "git fetch && git pull --ff-only origin ",
412
- branch.name),
413
- React.createElement("li", null,
414
- "\u5FC5\u8981\u306B\u5FDC\u3058\u3066 git push origin ",
415
- branch.name,
416
- " ",
417
- "\u3067\u30ED\u30FC\u30AB\u30EB\u9032\u6357\u3092\u5171\u6709")),
418
- React.createElement("p", { className: "section-card__body" }, "rebase / merge \u306A\u3069\u3067\u5DEE\u5206\u3092\u89E3\u6D88\u3057\u305F\u5F8C\u306B\u30DA\u30FC\u30B8\u3092\u66F4\u65B0\u3057\u3066\u304F\u3060\u3055\u3044\u3002"))),
419
- React.createElement("div", { className: "tool-card__actions" },
420
- React.createElement("button", { type: "button", className: "button button--primary", onClick: handleStartSession, disabled: isStartingSession ||
421
- !selectedTool ||
422
- hasBlockingDivergence ||
423
- needsRemoteSync ||
424
- isSyncingBranch }, isStartingSession ? "起動中..." : "セッションを起動"),
425
- React.createElement("button", { type: "button", className: "button button--secondary", onClick: handleSyncBranch, disabled: !branch.worktreePath || isSyncingBranch }, isSyncingBranch ? "同期中..." : "最新の変更を同期"),
426
- React.createElement(Link, { to: "/config", className: "button button--ghost" }, "\u8A2D\u5B9A\u3092\u7DE8\u96C6")),
427
- selectedToolSummary && (React.createElement("dl", { className: "metadata-grid metadata-grid--compact" },
428
- React.createElement("div", null,
429
- React.createElement("dt", null, "\u30B3\u30DE\u30F3\u30C9"),
430
- React.createElement("dd", { className: "tool-card__command" }, selectedToolSummary.command)),
431
- React.createElement("div", null,
432
- React.createElement("dt", null, "defaultArgs"),
433
- React.createElement("dd", null, renderArgs(selectedToolSummary.defaultArgs))),
434
- React.createElement("div", null,
435
- React.createElement("dt", null, "permissionSkipArgs"),
436
- React.createElement("dd", null, renderArgs(selectedToolSummary.permissionSkipArgs))),
437
- argsPreview && (React.createElement("div", { className: "metadata-grid__full" },
438
- React.createElement("dt", null, "\u6700\u7D42\u7684\u306B\u5B9F\u884C\u3055\u308C\u308B\u30B3\u30DE\u30F3\u30C9"),
439
- React.createElement("dd", { className: "tool-card__command" },
440
- argsPreview.command,
441
- " ",
442
- argsPreview.args.join(" "))))))))),
443
- React.createElement("section", { className: "section-card" },
444
- React.createElement("header", { className: "terminal-section__header" },
445
- React.createElement("div", null,
446
- React.createElement("h2", null, "\u30BB\u30C3\u30B7\u30E7\u30F3\u5C65\u6B74"),
447
- React.createElement("p", { className: "section-card__body" }, "\u3053\u306E Worktree \u306B\u7D10\u3065\u3044\u305F\u6700\u65B0\u306E AI \u30BB\u30C3\u30B7\u30E7\u30F3\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002CLI \u304B\u3089\u306E\u8D77\u52D5\u5206\u3082\u5171\u6709\u3055\u308C\u307E\u3059\u3002")),
448
- isSessionsLoading && (React.createElement("span", { className: "pill" }, "\u8AAD\u307F\u8FBC\u307F\u4E2D..."))),
449
- branchSessions.length === 0 ? (React.createElement("p", { className: "section-card__body" }, "\u30BB\u30C3\u30B7\u30E7\u30F3\u5C65\u6B74\u306F\u307E\u3060\u3042\u308A\u307E\u305B\u3093\u3002")) : (React.createElement("div", { className: "session-table-wrapper" },
450
- React.createElement("table", { className: "session-table" },
451
- React.createElement("thead", null,
452
- React.createElement("tr", null,
453
- React.createElement("th", null, "\u72B6\u614B"),
454
- React.createElement("th", null, "\u30C4\u30FC\u30EB"),
455
- React.createElement("th", null, "\u30E2\u30FC\u30C9"),
456
- React.createElement("th", null, "\u958B\u59CB\u6642\u523B"),
457
- React.createElement("th", null, "\u7D42\u4E86\u6642\u523B"),
458
- React.createElement("th", null, "\u64CD\u4F5C"))),
459
- React.createElement("tbody", null, branchSessions.slice(0, 5).map((session) => (React.createElement("tr", { key: session.sessionId },
460
- React.createElement("td", null,
461
- React.createElement("span", { className: `status-pill status-pill--${session.status}` }, SESSION_STATUS_LABEL[session.status])),
462
- React.createElement("td", null, session.toolType === "custom"
463
- ? (session.toolName ?? "custom")
464
- : toolLabel(session.toolType)),
465
- React.createElement("td", null, session.mode),
466
- React.createElement("td", null, formatDate(session.startedAt)),
467
- React.createElement("td", null, session.endedAt
468
- ? formatDate(session.endedAt)
469
- : "--"),
470
- React.createElement("td", null, session.status === "running" ? (React.createElement("button", { type: "button", className: "button button--ghost", onClick: () => handleTerminateSession(session.sessionId), disabled: terminatingSessionId === session.sessionId ||
471
- deleteSession.isPending }, terminatingSessionId === session.sessionId
472
- ? "終了中..."
473
- : "終了")) : (React.createElement("span", { className: "session-table__muted" }, "--"))))))))))),
474
- React.createElement("section", { className: "section-card" },
475
- React.createElement("header", null,
476
- React.createElement("h2", null, "\u30D6\u30E9\u30F3\u30C1\u30A4\u30F3\u30B5\u30A4\u30C8")),
477
- React.createElement("dl", { className: "metadata-grid" },
478
- React.createElement("div", null,
479
- React.createElement("dt", null, "\u30B3\u30DF\u30C3\u30C8"),
480
- React.createElement("dd", null, branch.commitHash)),
481
- React.createElement("div", null,
482
- React.createElement("dt", null, "Author"),
483
- React.createElement("dd", null, branch.author ?? "N/A")),
484
- React.createElement("div", null,
485
- React.createElement("dt", null, "\u66F4\u65B0\u65E5"),
486
- React.createElement("dd", null, formattedCommitDate)),
487
- React.createElement("div", null,
488
- React.createElement("dt", null, "Worktree"),
489
- React.createElement("dd", null, branch.worktreePath ?? "未作成")))),
490
- React.createElement("section", { className: "section-card" },
491
- React.createElement("header", null,
492
- React.createElement("h2", null, "\u30B3\u30DF\u30C3\u30C8\u60C5\u5831")),
493
- React.createElement("p", { className: "section-card__body" }, branch.commitMessage ?? "コミットメッセージがありません。")),
494
- branch.divergence && (React.createElement("section", { className: "section-card" },
495
- React.createElement("header", null,
496
- React.createElement("h2", null, "\u5DEE\u5206\u72B6\u6CC1")),
497
- React.createElement("div", { className: "pill-group" },
498
- React.createElement("span", { className: "pill" },
499
- "Ahead ",
500
- branch.divergence.ahead),
501
- React.createElement("span", { className: "pill" },
502
- "Behind ",
503
- branch.divergence.behind),
504
- React.createElement("span", { className: `pill ${branch.divergence.upToDate
505
- ? "pill--success"
506
- : "pill--warning"}` }, branch.divergence.upToDate ? "最新" : "更新あり")))),
507
- React.createElement("section", { className: "section-card" },
508
- React.createElement("header", null,
509
- React.createElement("h2", null, "Worktree\u60C5\u5831")),
510
- React.createElement("ul", { className: "list-muted" },
511
- React.createElement("li", null,
512
- "\u30D1\u30B9: ",
513
- React.createElement("strong", null, branch.worktreePath ?? "未作成")),
514
- React.createElement("li", null, "AI\u30C4\u30FC\u30EB\u306E\u8D77\u52D5\u306B\u306F\u30AF\u30EA\u30FC\u30F3\u306A\u30EF\u30FC\u30AF\u30C4\u30EA\u30FC\u3067\u3042\u308B\u3053\u3068\u3092\u63A8\u5968\u3057\u307E\u3059\u3002"),
515
- React.createElement("li", null, "Worktree\u3092\u518D\u4F5C\u6210\u3059\u308B\u3068\u65E2\u5B58\u306E\u30ED\u30FC\u30AB\u30EB\u5909\u66F4\u304C\u5931\u308F\u308C\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002")))),
516
- React.createElement("div", { className: "terminal-column" }, activeSessionId ? (React.createElement("section", { className: `section-card terminal-section ${isTerminalFullscreen ? "terminal-section--fullscreen" : ""}`, "data-testid": "active-terminal" },
517
- React.createElement("div", { className: "terminal-section__header" },
518
- React.createElement("div", null,
519
- React.createElement("h2", null, "\u30BF\u30FC\u30DF\u30CA\u30EB\u30BB\u30C3\u30B7\u30E7\u30F3"),
520
- React.createElement("p", { className: "section-card__body" }, "\u51FA\u529B\u306F\u30EA\u30A2\u30EB\u30BF\u30A4\u30E0\u306B\u30B9\u30C8\u30EA\u30FC\u30E0\u3055\u308C\u307E\u3059\u3002\u7D42\u4E86\u3059\u308B\u3068\u3053\u306E\u30D1\u30CD\u30EB\u306F\u81EA\u52D5\u3067\u9589\u3058\u307E\u3059\u3002")),
521
- React.createElement("div", { className: "terminal-section__controls" },
522
- React.createElement("button", { type: "button", className: "button button--ghost", onClick: () => setIsTerminalFullscreen((prev) => !prev) }, isTerminalFullscreen
523
- ? "通常表示に戻す"
524
- : "ターミナルを最大化"))),
525
- React.createElement("div", { className: "terminal-surface" },
526
- React.createElement(Terminal, { sessionId: activeSessionId, onExit: handleSessionExit, onError: (message) => setBanner({
527
- type: "error",
528
- message: message ?? "不明なエラー",
529
- }) })),
530
- isTerminalFullscreen && (React.createElement("button", { type: "button", className: "terminal-section__close", "aria-label": "\u30BF\u30FC\u30DF\u30CA\u30EB\u3092\u9589\u3058\u308B", onClick: () => setIsTerminalFullscreen(false) }, "\u00D7")))) : (React.createElement("section", { className: "section-card session-hint" },
531
- React.createElement("header", null,
532
- React.createElement("h2", null, "\u30BB\u30C3\u30B7\u30E7\u30F3\u306F\u672A\u8D77\u52D5")),
533
- React.createElement("p", { className: "section-card__body" }, "\u4E0A\u90E8\u306E\u30A2\u30AF\u30B7\u30E7\u30F3\u304B\u3089AI\u30C4\u30FC\u30EB\u3092\u8D77\u52D5\u3059\u308B\u3068\u3001\u3053\u306E\u30A8\u30EA\u30A2\u306B\u30BF\u30FC\u30DF\u30CA\u30EB\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002"))))))));
304
+ return (React.createElement("div", { className: "min-h-screen bg-background" },
305
+ isTerminalFullscreen && (React.createElement("div", { className: "fixed inset-0 z-40 bg-black/80", "aria-hidden": "true", onClick: () => setIsTerminalFullscreen(false) })),
306
+ React.createElement(PageHeader, { eyebrow: "BRANCH DETAIL", title: branch.name, subtitle: `最新コミット ${branch.commitHash.slice(0, 7)} · ${formattedCommitDate}` },
307
+ React.createElement("div", { className: "mt-4 flex flex-wrap gap-2" },
308
+ React.createElement(Badge, { variant: branch.type === "local" ? "local" : "remote" }, BRANCH_TYPE_LABEL[branch.type]),
309
+ React.createElement(Badge, { variant: branch.mergeStatus === "merged"
310
+ ? "success"
311
+ : branch.mergeStatus === "unmerged"
312
+ ? "warning"
313
+ : "outline" }, MERGE_STATUS_LABEL[branch.mergeStatus]),
314
+ React.createElement(Badge, { variant: branch.worktreePath ? "success" : "outline" }, branch.worktreePath ? "Worktreeあり" : "Worktree未作成")),
315
+ React.createElement("div", { className: "mt-4 flex flex-wrap gap-2" },
316
+ React.createElement(Button, { variant: "ghost", size: "sm", asChild: true },
317
+ React.createElement(Link, { to: "/" }, "\u2190 \u30D6\u30E9\u30F3\u30C1\u4E00\u89A7")),
318
+ !canStartSession ? (React.createElement(Button, { onClick: handleCreateWorktree, disabled: createWorktree.isPending }, createWorktree.isPending ? "作成中..." : "Worktreeを作成")) : (React.createElement(Button, { variant: "secondary", asChild: true },
319
+ React.createElement(Link, { to: "/config" }, "\u30AB\u30B9\u30BF\u30E0\u30C4\u30FC\u30EB\u8A2D\u5B9A"))))),
320
+ banner && (React.createElement("div", { className: "mx-auto max-w-7xl px-6 pt-4" },
321
+ React.createElement(Alert, { variant: banner.type === "error"
322
+ ? "destructive"
323
+ : banner.type === "success"
324
+ ? "success"
325
+ : "info" },
326
+ React.createElement(AlertDescription, null, banner.message)))),
327
+ React.createElement("main", { className: "mx-auto max-w-7xl space-y-6 px-6 py-8" },
328
+ React.createElement("div", { className: "grid gap-6 lg:grid-cols-[1fr_400px]" },
329
+ React.createElement("div", { className: "space-y-6" },
330
+ React.createElement(ToolLauncher, { branch: branch, availableTools: availableTools, selectedToolId: selectedToolId, selectedMode: selectedMode, skipPermissions: skipPermissions, extraArgsText: extraArgsText, isConfigLoading: isConfigLoading, configError: configError ?? null, isStartingSession: isStartingSession, isSyncingBranch: isSyncingBranch, needsRemoteSync: needsRemoteSync, hasBlockingDivergence: hasBlockingDivergence, onToolChange: setSelectedToolId, onModeChange: setSelectedMode, onSkipPermissionsChange: setSkipPermissions, onExtraArgsChange: setExtraArgsText, onStartSession: handleStartSession, onSyncBranch: handleSyncBranch }),
331
+ React.createElement(SessionHistoryTable, { sessions: branchSessions, isLoading: isSessionsLoading, terminatingSessionId: terminatingSessionId, isDeleting: deleteSession.isPending, onTerminate: handleTerminateSession, onSelectSession: setActiveSessionId }),
332
+ React.createElement(BranchInfoCards, { branch: branch, formattedCommitDate: formattedCommitDate, latestToolUsage: latestToolUsage })),
333
+ React.createElement("div", { className: "lg:sticky lg:top-6 lg:self-start" },
334
+ React.createElement(TerminalPanel, { sessionId: activeSessionId, isFullscreen: isTerminalFullscreen, onToggleFullscreen: () => setIsTerminalFullscreen((prev) => !prev), onExit: handleSessionExit, onError: (message) => setBanner({ type: "error", message: message ?? "不明なエラー" }) }))))));
534
335
  }
336
+ // Helper functions
535
337
  function formatDate(value) {
536
- if (!value) {
338
+ if (!value)
537
339
  return "日時不明";
538
- }
539
340
  try {
540
- const date = new Date(value);
541
341
  return new Intl.DateTimeFormat("ja-JP", {
542
342
  year: "numeric",
543
343
  month: "short",
544
344
  day: "numeric",
545
345
  hour: "2-digit",
546
346
  minute: "2-digit",
547
- }).format(date);
347
+ }).format(new Date(value));
548
348
  }
549
- catch (_err) {
349
+ catch {
550
350
  return value;
551
351
  }
552
352
  }
@@ -554,63 +354,15 @@ function formatError(error, fallback) {
554
354
  if (error instanceof ApiError) {
555
355
  return `${error.message}${error.details ? `\n${error.details}` : ""}`;
556
356
  }
557
- if (error instanceof Error) {
357
+ if (error instanceof Error)
558
358
  return error.message;
559
- }
560
359
  return fallback;
561
360
  }
562
361
  function toolLabel(tool, selectedTool) {
563
- if (tool === "custom" && selectedTool?.target === "custom") {
362
+ if (tool === "custom" && selectedTool?.target === "custom")
564
363
  return selectedTool.label;
565
- }
566
- if (tool === "codex-cli") {
364
+ if (tool === "codex-cli")
567
365
  return "Codex CLI";
568
- }
569
366
  return "Claude Code";
570
367
  }
571
- function renderArgs(args) {
572
- if (!args || args.length === 0) {
573
- return React.createElement("span", { className: "tool-card__muted" }, "\u672A\u8A2D\u5B9A");
574
- }
575
- return args.join(" ");
576
- }
577
- const SESSION_STATUS_LABEL = {
578
- pending: "pending",
579
- running: "running",
580
- completed: "completed",
581
- failed: "failed",
582
- };
583
- function renderToolUsage(usage) {
584
- const modeLabel = usage.mode === "normal"
585
- ? "New"
586
- : usage.mode === "continue"
587
- ? "Continue"
588
- : usage.mode === "resume"
589
- ? "Resume"
590
- : null;
591
- const toolText = mapToolLabel(usage.toolId, usage.toolLabel);
592
- return [toolText, modeLabel, usage.model].filter(Boolean).join(" | ");
593
- }
594
- function formatUsageTimestamp(value) {
595
- return formatDate(new Date(value).toISOString());
596
- }
597
- function mapToolLabel(toolId, toolLabel) {
598
- if (toolId === "claude-code")
599
- return "Claude";
600
- if (toolId === "codex-cli")
601
- return "Codex";
602
- if (toolId === "gemini-cli")
603
- return "Gemini";
604
- if (toolId === "qwen-cli")
605
- return "Qwen";
606
- if (toolLabel)
607
- return toolLabel;
608
- return "Custom";
609
- }
610
- function parseExtraArgs(value) {
611
- return value
612
- .split(/\s+/)
613
- .map((chunk) => chunk.trim())
614
- .filter(Boolean);
615
- }
616
368
  //# sourceMappingURL=BranchDetailPage.js.map