@akiojin/gwt 4.9.1 → 4.11.6

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 (605) hide show
  1. package/README.ja.md +4 -4
  2. package/README.md +4 -4
  3. package/dist/claude.d.ts +1 -0
  4. package/dist/claude.d.ts.map +1 -1
  5. package/dist/claude.js +52 -49
  6. package/dist/claude.js.map +1 -1
  7. package/dist/cli/ui/App.solid.d.ts +29 -0
  8. package/dist/cli/ui/App.solid.d.ts.map +1 -0
  9. package/dist/cli/ui/App.solid.js +1197 -0
  10. package/dist/cli/ui/App.solid.js.map +1 -0
  11. package/dist/cli/ui/components/solid/Footer.d.ts +10 -0
  12. package/dist/cli/ui/components/solid/Footer.d.ts.map +1 -0
  13. package/dist/cli/ui/components/solid/Footer.js +10 -0
  14. package/dist/cli/ui/components/solid/Footer.js.map +1 -0
  15. package/dist/cli/ui/components/{parts → solid}/Header.d.ts +1 -6
  16. package/dist/cli/ui/components/solid/Header.d.ts.map +1 -0
  17. package/dist/cli/ui/components/solid/Header.js +13 -0
  18. package/dist/cli/ui/components/solid/Header.js.map +1 -0
  19. package/dist/cli/ui/components/solid/HelpOverlay.d.ts +8 -0
  20. package/dist/cli/ui/components/solid/HelpOverlay.d.ts.map +1 -0
  21. package/dist/cli/ui/components/solid/HelpOverlay.js +118 -0
  22. package/dist/cli/ui/components/solid/HelpOverlay.js.map +1 -0
  23. package/dist/cli/ui/components/solid/QuickStartStep.d.ts +17 -0
  24. package/dist/cli/ui/components/solid/QuickStartStep.d.ts.map +1 -0
  25. package/dist/cli/ui/components/solid/QuickStartStep.js +139 -0
  26. package/dist/cli/ui/components/solid/QuickStartStep.js.map +1 -0
  27. package/dist/cli/ui/components/solid/SelectInput.d.ts +22 -0
  28. package/dist/cli/ui/components/solid/SelectInput.d.ts.map +1 -0
  29. package/dist/cli/ui/components/solid/SelectInput.js +44 -0
  30. package/dist/cli/ui/components/solid/SelectInput.js.map +1 -0
  31. package/dist/cli/ui/components/solid/TextInput.d.ts +12 -0
  32. package/dist/cli/ui/components/solid/TextInput.d.ts.map +1 -0
  33. package/dist/cli/ui/components/solid/TextInput.js +9 -0
  34. package/dist/cli/ui/components/solid/TextInput.js.map +1 -0
  35. package/dist/cli/ui/components/solid/WizardController.d.ts +34 -0
  36. package/dist/cli/ui/components/solid/WizardController.d.ts.map +1 -0
  37. package/dist/cli/ui/components/solid/WizardController.js +215 -0
  38. package/dist/cli/ui/components/solid/WizardController.js.map +1 -0
  39. package/dist/cli/ui/components/solid/WizardPopup.d.ts +26 -0
  40. package/dist/cli/ui/components/solid/WizardPopup.d.ts.map +1 -0
  41. package/dist/cli/ui/components/solid/WizardPopup.js +68 -0
  42. package/dist/cli/ui/components/solid/WizardPopup.js.map +1 -0
  43. package/dist/cli/ui/components/solid/WizardSteps.d.ts +52 -0
  44. package/dist/cli/ui/components/solid/WizardSteps.d.ts.map +1 -0
  45. package/dist/cli/ui/components/solid/WizardSteps.js +462 -0
  46. package/dist/cli/ui/components/solid/WizardSteps.js.map +1 -0
  47. package/dist/cli/ui/core/index.d.ts +12 -0
  48. package/dist/cli/ui/core/index.d.ts.map +1 -0
  49. package/dist/cli/ui/core/index.js +15 -0
  50. package/dist/cli/ui/core/index.js.map +1 -0
  51. package/dist/cli/ui/core/keybindings.d.ts +106 -0
  52. package/dist/cli/ui/core/keybindings.d.ts.map +1 -0
  53. package/dist/cli/ui/core/keybindings.js +270 -0
  54. package/dist/cli/ui/core/keybindings.js.map +1 -0
  55. package/dist/cli/ui/core/theme.d.ts +114 -0
  56. package/dist/cli/ui/core/theme.d.ts.map +1 -0
  57. package/dist/cli/ui/core/theme.js +170 -0
  58. package/dist/cli/ui/core/theme.js.map +1 -0
  59. package/dist/cli/ui/core/types.d.ts +156 -0
  60. package/dist/cli/ui/core/types.d.ts.map +1 -0
  61. package/dist/cli/ui/core/types.js +10 -0
  62. package/dist/cli/ui/core/types.js.map +1 -0
  63. package/dist/cli/ui/hooks/solid/useScrollableList.d.ts +26 -0
  64. package/dist/cli/ui/hooks/solid/useScrollableList.d.ts.map +1 -0
  65. package/dist/cli/ui/hooks/solid/useScrollableList.js +89 -0
  66. package/dist/cli/ui/hooks/solid/useScrollableList.js.map +1 -0
  67. package/dist/cli/ui/hooks/solid/useTerminalSize.d.ts +10 -0
  68. package/dist/cli/ui/hooks/solid/useTerminalSize.d.ts.map +1 -0
  69. package/dist/cli/ui/hooks/solid/useTerminalSize.js +16 -0
  70. package/dist/cli/ui/hooks/solid/useTerminalSize.js.map +1 -0
  71. package/dist/cli/ui/index.solid.d.ts +5 -0
  72. package/dist/cli/ui/index.solid.d.ts.map +1 -0
  73. package/dist/cli/ui/index.solid.js +21 -0
  74. package/dist/cli/ui/index.solid.js.map +1 -0
  75. package/dist/cli/ui/{components/screens → screens/solid}/BranchListScreen.d.ts +8 -22
  76. package/dist/cli/ui/screens/solid/BranchListScreen.d.ts.map +1 -0
  77. package/dist/cli/ui/screens/solid/BranchListScreen.js +756 -0
  78. package/dist/cli/ui/screens/solid/BranchListScreen.js.map +1 -0
  79. package/dist/cli/ui/screens/solid/ConfirmScreen.d.ts +10 -0
  80. package/dist/cli/ui/screens/solid/ConfirmScreen.d.ts.map +1 -0
  81. package/dist/cli/ui/screens/solid/ConfirmScreen.js +37 -0
  82. package/dist/cli/ui/screens/solid/ConfirmScreen.js.map +1 -0
  83. package/dist/cli/ui/screens/solid/EnvironmentScreen.d.ts +14 -0
  84. package/dist/cli/ui/screens/solid/EnvironmentScreen.d.ts.map +1 -0
  85. package/dist/cli/ui/screens/solid/EnvironmentScreen.js +91 -0
  86. package/dist/cli/ui/screens/solid/EnvironmentScreen.js.map +1 -0
  87. package/dist/cli/ui/screens/solid/ErrorScreen.d.ts +8 -0
  88. package/dist/cli/ui/screens/solid/ErrorScreen.d.ts.map +1 -0
  89. package/dist/cli/ui/screens/solid/ErrorScreen.js +18 -0
  90. package/dist/cli/ui/screens/solid/ErrorScreen.js.map +1 -0
  91. package/dist/cli/ui/screens/solid/InputScreen.d.ts +13 -0
  92. package/dist/cli/ui/screens/solid/InputScreen.d.ts.map +1 -0
  93. package/dist/cli/ui/screens/solid/InputScreen.js +17 -0
  94. package/dist/cli/ui/screens/solid/InputScreen.js.map +1 -0
  95. package/dist/cli/ui/screens/solid/LoadingIndicator.d.ts +9 -0
  96. package/dist/cli/ui/screens/solid/LoadingIndicator.d.ts.map +1 -0
  97. package/dist/cli/ui/screens/solid/LoadingIndicator.js +43 -0
  98. package/dist/cli/ui/screens/solid/LoadingIndicator.js.map +1 -0
  99. package/dist/cli/ui/{components/screens → screens/solid}/LogDetailScreen.d.ts +2 -2
  100. package/dist/cli/ui/screens/solid/LogDetailScreen.d.ts.map +1 -0
  101. package/dist/cli/ui/screens/solid/LogDetailScreen.js +34 -0
  102. package/dist/cli/ui/screens/solid/LogDetailScreen.js.map +1 -0
  103. package/dist/cli/ui/{components/screens/LogListScreen.d.ts → screens/solid/LogScreen.d.ts} +4 -4
  104. package/dist/cli/ui/screens/solid/LogScreen.d.ts.map +1 -0
  105. package/dist/cli/ui/screens/solid/LogScreen.js +95 -0
  106. package/dist/cli/ui/screens/solid/LogScreen.js.map +1 -0
  107. package/dist/cli/ui/screens/solid/ProfileEnvScreen.d.ts +17 -0
  108. package/dist/cli/ui/screens/solid/ProfileEnvScreen.d.ts.map +1 -0
  109. package/dist/cli/ui/screens/solid/ProfileEnvScreen.js +112 -0
  110. package/dist/cli/ui/screens/solid/ProfileEnvScreen.js.map +1 -0
  111. package/dist/cli/ui/screens/solid/ProfileScreen.d.ts +17 -0
  112. package/dist/cli/ui/screens/solid/ProfileScreen.d.ts.map +1 -0
  113. package/dist/cli/ui/screens/solid/ProfileScreen.js +50 -0
  114. package/dist/cli/ui/screens/solid/ProfileScreen.js.map +1 -0
  115. package/dist/cli/ui/screens/solid/SelectorScreen.d.ts +20 -0
  116. package/dist/cli/ui/screens/solid/SelectorScreen.d.ts.map +1 -0
  117. package/dist/cli/ui/screens/solid/SelectorScreen.js +90 -0
  118. package/dist/cli/ui/screens/solid/SelectorScreen.js.map +1 -0
  119. package/dist/cli/ui/screens/solid/WorktreeCreateScreen.d.ts +13 -0
  120. package/dist/cli/ui/screens/solid/WorktreeCreateScreen.d.ts.map +1 -0
  121. package/dist/cli/ui/screens/solid/WorktreeCreateScreen.js +59 -0
  122. package/dist/cli/ui/screens/solid/WorktreeCreateScreen.js.map +1 -0
  123. package/dist/cli/ui/stores/appStore.d.ts +143 -0
  124. package/dist/cli/ui/stores/appStore.d.ts.map +1 -0
  125. package/dist/cli/ui/stores/appStore.js +158 -0
  126. package/dist/cli/ui/stores/appStore.js.map +1 -0
  127. package/dist/cli/ui/stores/branchStore.d.ts +159 -0
  128. package/dist/cli/ui/stores/branchStore.d.ts.map +1 -0
  129. package/dist/cli/ui/stores/branchStore.js +275 -0
  130. package/dist/cli/ui/stores/branchStore.js.map +1 -0
  131. package/dist/cli/ui/stores/index.d.ts +11 -0
  132. package/dist/cli/ui/stores/index.d.ts.map +1 -0
  133. package/dist/cli/ui/stores/index.js +14 -0
  134. package/dist/cli/ui/stores/index.js.map +1 -0
  135. package/dist/cli/ui/stores/uiStore.d.ts +146 -0
  136. package/dist/cli/ui/stores/uiStore.d.ts.map +1 -0
  137. package/dist/cli/ui/stores/uiStore.js +166 -0
  138. package/dist/cli/ui/stores/uiStore.js.map +1 -0
  139. package/dist/cli/ui/types.d.ts +16 -1
  140. package/dist/cli/ui/types.d.ts.map +1 -1
  141. package/dist/cli/ui/utils/branchFormatter.d.ts.map +1 -1
  142. package/dist/cli/ui/utils/branchFormatter.js +7 -210
  143. package/dist/cli/ui/utils/branchFormatter.js.map +1 -1
  144. package/dist/cli/ui/utils/continueSession.d.ts +4 -0
  145. package/dist/cli/ui/utils/continueSession.d.ts.map +1 -1
  146. package/dist/cli/ui/utils/continueSession.js +30 -0
  147. package/dist/cli/ui/utils/continueSession.js.map +1 -1
  148. package/dist/client/assets/{index-ChHC-Puh.css → index-BbfV7Wuj.css} +1 -1
  149. package/dist/client/assets/index-CoAyq5x1.js +78 -0
  150. package/dist/client/index.html +2 -2
  151. package/dist/codex.d.ts +1 -0
  152. package/dist/codex.d.ts.map +1 -1
  153. package/dist/codex.js +86 -45
  154. package/dist/codex.js.map +1 -1
  155. package/dist/config/builtin-coding-agents.d.ts +4 -0
  156. package/dist/config/builtin-coding-agents.d.ts.map +1 -1
  157. package/dist/config/builtin-coding-agents.js +18 -3
  158. package/dist/config/builtin-coding-agents.js.map +1 -1
  159. package/dist/config/index.d.ts +2 -0
  160. package/dist/config/index.d.ts.map +1 -1
  161. package/dist/config/index.js +2 -0
  162. package/dist/config/index.js.map +1 -1
  163. package/dist/config/tools.d.ts.map +1 -1
  164. package/dist/config/tools.js +11 -0
  165. package/dist/config/tools.js.map +1 -1
  166. package/dist/gemini.d.ts +1 -0
  167. package/dist/gemini.d.ts.map +1 -1
  168. package/dist/gemini.js +42 -37
  169. package/dist/gemini.js.map +1 -1
  170. package/dist/index.d.ts +1 -1
  171. package/dist/index.d.ts.map +1 -1
  172. package/dist/index.js +122 -102
  173. package/dist/index.js.map +1 -1
  174. package/dist/launcher.d.ts.map +1 -1
  175. package/dist/launcher.js +18 -3
  176. package/dist/launcher.js.map +1 -1
  177. package/dist/logging/logger.d.ts.map +1 -1
  178. package/dist/logging/logger.js +26 -9
  179. package/dist/logging/logger.js.map +1 -1
  180. package/dist/opentui/highlights-eq9cgrbb.scm +604 -0
  181. package/dist/opentui/highlights-ghv9g403.scm +205 -0
  182. package/dist/opentui/highlights-hk7bwhj4.scm +284 -0
  183. package/dist/opentui/highlights-r812a2qc.scm +150 -0
  184. package/dist/opentui/highlights-x6tmsnaa.scm +115 -0
  185. package/dist/opentui/index.solid.d.ts +2 -0
  186. package/dist/opentui/index.solid.d.ts.map +1 -0
  187. package/dist/opentui/index.solid.js +52034 -0
  188. package/dist/opentui/index.solid.js.map +1 -0
  189. package/dist/opentui/injections-73j83es3.scm +27 -0
  190. package/dist/opentui/tree-sitter-javascript-nd0q4pe9.wasm +0 -0
  191. package/dist/opentui/tree-sitter-markdown-411r6y9b.wasm +0 -0
  192. package/dist/opentui/tree-sitter-markdown_inline-j5349f42.wasm +0 -0
  193. package/dist/opentui/tree-sitter-typescript-zxjzwt75.wasm +0 -0
  194. package/dist/opentui/tree-sitter-zig-e78zbjpm.wasm +0 -0
  195. package/dist/repositories/worktree.repository.d.ts +1 -0
  196. package/dist/repositories/worktree.repository.d.ts.map +1 -1
  197. package/dist/repositories/worktree.repository.js +7 -0
  198. package/dist/repositories/worktree.repository.js.map +1 -1
  199. package/dist/services/codingAgentResolver.d.ts +2 -0
  200. package/dist/services/codingAgentResolver.d.ts.map +1 -1
  201. package/dist/services/codingAgentResolver.js +30 -4
  202. package/dist/services/codingAgentResolver.js.map +1 -1
  203. package/dist/services/dependency-installer.d.ts.map +1 -1
  204. package/dist/services/dependency-installer.js +0 -5
  205. package/dist/services/dependency-installer.js.map +1 -1
  206. package/dist/types/api.d.ts +3 -0
  207. package/dist/types/api.d.ts.map +1 -1
  208. package/dist/types/coding-agent.d.ts +62 -0
  209. package/dist/types/coding-agent.d.ts.map +1 -0
  210. package/dist/types/coding-agent.js +29 -0
  211. package/dist/types/coding-agent.js.map +1 -0
  212. package/dist/types/tools.d.ts +17 -0
  213. package/dist/types/tools.d.ts.map +1 -1
  214. package/dist/utils/coding-agent-colors.d.ts +88 -0
  215. package/dist/utils/coding-agent-colors.d.ts.map +1 -0
  216. package/dist/utils/coding-agent-colors.js +137 -0
  217. package/dist/utils/coding-agent-colors.js.map +1 -0
  218. package/dist/utils/command.d.ts +1 -1
  219. package/dist/utils/command.d.ts.map +1 -1
  220. package/dist/utils/command.js +10 -1
  221. package/dist/utils/command.js.map +1 -1
  222. package/dist/utils/error-utils.d.ts +27 -0
  223. package/dist/utils/error-utils.d.ts.map +1 -0
  224. package/dist/utils/error-utils.js +98 -0
  225. package/dist/utils/error-utils.js.map +1 -0
  226. package/dist/utils/npmRegistry.d.ts +61 -0
  227. package/dist/utils/npmRegistry.d.ts.map +1 -0
  228. package/dist/utils/npmRegistry.js +180 -0
  229. package/dist/utils/npmRegistry.js.map +1 -0
  230. package/dist/utils/prompt.d.ts +1 -1
  231. package/dist/utils/prompt.js +1 -1
  232. package/dist/utils/session/index.d.ts +5 -3
  233. package/dist/utils/session/index.d.ts.map +1 -1
  234. package/dist/utils/session/index.js +5 -2
  235. package/dist/utils/session/index.js.map +1 -1
  236. package/dist/utils/session/parsers/codex.d.ts.map +1 -1
  237. package/dist/utils/session/parsers/codex.js +8 -1
  238. package/dist/utils/session/parsers/codex.js.map +1 -1
  239. package/dist/utils/session/parsers/index.d.ts +1 -0
  240. package/dist/utils/session/parsers/index.d.ts.map +1 -1
  241. package/dist/utils/session/parsers/index.js +2 -0
  242. package/dist/utils/session/parsers/index.js.map +1 -1
  243. package/dist/utils/session/parsers/opencode.d.ts +23 -0
  244. package/dist/utils/session/parsers/opencode.d.ts.map +1 -0
  245. package/dist/utils/session/parsers/opencode.js +89 -0
  246. package/dist/utils/session/parsers/opencode.js.map +1 -0
  247. package/dist/utils/session/types.d.ts +4 -0
  248. package/dist/utils/session/types.d.ts.map +1 -1
  249. package/dist/utils/terminal.d.ts +1 -0
  250. package/dist/utils/terminal.d.ts.map +1 -1
  251. package/dist/utils/terminal.js +20 -0
  252. package/dist/utils/terminal.js.map +1 -1
  253. package/dist/utils.d.ts +9 -0
  254. package/dist/utils.d.ts.map +1 -1
  255. package/dist/utils.js +33 -2
  256. package/dist/utils.js.map +1 -1
  257. package/dist/web/client/src/components/CodingAgentLaunchModal.d.ts.map +1 -1
  258. package/dist/web/client/src/components/CodingAgentLaunchModal.js +7 -16
  259. package/dist/web/client/src/components/CodingAgentLaunchModal.js.map +1 -1
  260. package/dist/web/client/src/components/branch-detail/BranchInfoCards.d.ts.map +1 -1
  261. package/dist/web/client/src/components/branch-detail/BranchInfoCards.js +7 -2
  262. package/dist/web/client/src/components/branch-detail/BranchInfoCards.js.map +1 -1
  263. package/dist/web/client/src/components/branch-detail/SessionHistoryTable.d.ts.map +1 -1
  264. package/dist/web/client/src/components/branch-detail/SessionHistoryTable.js +2 -1
  265. package/dist/web/client/src/components/branch-detail/SessionHistoryTable.js.map +1 -1
  266. package/dist/web/client/src/components/branch-detail/ToolLauncher.d.ts +2 -2
  267. package/dist/web/client/src/components/branch-detail/ToolLauncher.d.ts.map +1 -1
  268. package/dist/web/client/src/components/branch-detail/ToolLauncher.js +5 -5
  269. package/dist/web/client/src/components/branch-detail/ToolLauncher.js.map +1 -1
  270. package/dist/web/client/src/lib/coding-agent-colors.d.ts +86 -0
  271. package/dist/web/client/src/lib/coding-agent-colors.d.ts.map +1 -0
  272. package/dist/web/client/src/lib/coding-agent-colors.js +135 -0
  273. package/dist/web/client/src/lib/coding-agent-colors.js.map +1 -0
  274. package/dist/web/client/src/pages/BranchDetailPage.js +10 -10
  275. package/dist/web/client/src/pages/BranchDetailPage.js.map +1 -1
  276. package/dist/web/server/pty/manager.d.ts +2 -0
  277. package/dist/web/server/pty/manager.d.ts.map +1 -1
  278. package/dist/web/server/pty/manager.js +104 -0
  279. package/dist/web/server/pty/manager.js.map +1 -1
  280. package/dist/web/server/routes/sessions.d.ts.map +1 -1
  281. package/dist/web/server/routes/sessions.js +5 -1
  282. package/dist/web/server/routes/sessions.js.map +1 -1
  283. package/dist/web/server/services/branches.d.ts.map +1 -1
  284. package/dist/web/server/services/branches.js +10 -8
  285. package/dist/web/server/services/branches.js.map +1 -1
  286. package/dist/web/server/services/worktrees.js +2 -2
  287. package/dist/web/server/services/worktrees.js.map +1 -1
  288. package/dist/worktree.d.ts +47 -1
  289. package/dist/worktree.d.ts.map +1 -1
  290. package/dist/worktree.js +280 -94
  291. package/dist/worktree.js.map +1 -1
  292. package/package.json +12 -14
  293. package/src/claude.ts +68 -70
  294. package/src/cli/ui/App.solid.tsx +1823 -0
  295. package/src/cli/ui/__tests__/solid/AppSolid.cleanup.test.tsx +255 -0
  296. package/src/cli/ui/__tests__/solid/BranchListScreen.test.tsx +243 -0
  297. package/src/cli/ui/__tests__/solid/components/QuickStartStep.test.tsx +237 -0
  298. package/src/cli/ui/__tests__/solid/components/WizardPopup.test.tsx +231 -0
  299. package/src/cli/ui/__tests__/solid/components/WizardSteps.test.tsx +238 -0
  300. package/src/cli/ui/__tests__/utils/branchFormatter.test.ts +7 -289
  301. package/src/cli/ui/__tests__/utils/clipboard.test.ts +3 -3
  302. package/src/cli/ui/__tests__/utils/statisticsCalculator.test.ts +1 -1
  303. package/src/cli/ui/components/solid/Footer.tsx +36 -0
  304. package/src/cli/ui/components/{parts → solid}/Header.tsx +17 -28
  305. package/src/cli/ui/components/solid/HelpOverlay.tsx +194 -0
  306. package/src/cli/ui/components/solid/QuickStartStep.tsx +197 -0
  307. package/src/cli/ui/components/{parts → solid}/ScrollableList.tsx +7 -8
  308. package/src/cli/ui/components/solid/SearchInput.tsx +42 -0
  309. package/src/cli/ui/components/solid/SelectInput.tsx +84 -0
  310. package/src/cli/ui/components/solid/Stats.tsx +92 -0
  311. package/src/cli/ui/components/solid/TextInput.tsx +49 -0
  312. package/src/cli/ui/components/solid/WizardController.tsx +384 -0
  313. package/src/cli/ui/components/solid/WizardPopup.tsx +135 -0
  314. package/src/cli/ui/components/solid/WizardSteps.tsx +793 -0
  315. package/src/cli/ui/core/index.ts +17 -0
  316. package/src/cli/ui/core/keybindings.ts +367 -0
  317. package/src/cli/ui/core/theme.ts +234 -0
  318. package/src/cli/ui/core/types.ts +235 -0
  319. package/src/cli/ui/hooks/solid/useAsyncOperation.ts +76 -0
  320. package/src/cli/ui/hooks/solid/useFilter.ts +86 -0
  321. package/src/cli/ui/hooks/solid/useGitOperations.ts +80 -0
  322. package/src/cli/ui/hooks/solid/useKeyHandler.ts +103 -0
  323. package/src/cli/ui/hooks/solid/useScrollableList.ts +149 -0
  324. package/src/cli/ui/hooks/solid/useSelection.ts +77 -0
  325. package/src/cli/ui/hooks/solid/useTerminalSize.ts +22 -0
  326. package/src/cli/ui/index.solid.ts +28 -0
  327. package/src/cli/ui/screens/solid/BranchListScreen.tsx +1050 -0
  328. package/src/cli/ui/screens/solid/ConfirmScreen.tsx +74 -0
  329. package/src/cli/ui/screens/solid/EnvironmentScreen.tsx +159 -0
  330. package/src/cli/ui/screens/solid/ErrorScreen.tsx +42 -0
  331. package/src/cli/ui/screens/solid/InputScreen.tsx +55 -0
  332. package/src/cli/ui/screens/solid/LoadingIndicator.tsx +77 -0
  333. package/src/cli/ui/screens/solid/LogDetailScreen.tsx +75 -0
  334. package/src/cli/ui/screens/solid/LogScreen.tsx +175 -0
  335. package/src/cli/ui/screens/solid/ProfileEnvScreen.tsx +192 -0
  336. package/src/cli/ui/screens/solid/ProfileScreen.tsx +98 -0
  337. package/src/cli/ui/screens/solid/SelectorScreen.tsx +170 -0
  338. package/src/cli/ui/screens/solid/SettingsScreen.tsx +50 -0
  339. package/src/cli/ui/screens/solid/WorktreeCreateScreen.tsx +136 -0
  340. package/src/cli/ui/screens/solid/WorktreeDeleteScreen.tsx +40 -0
  341. package/src/cli/ui/stores/appStore.ts +208 -0
  342. package/src/cli/ui/stores/branchStore.ts +357 -0
  343. package/src/cli/ui/stores/index.ts +31 -0
  344. package/src/cli/ui/stores/uiStore.ts +226 -0
  345. package/src/cli/ui/types.ts +20 -3
  346. package/src/cli/ui/utils/__tests__/branchFormatter.test.ts +180 -0
  347. package/src/cli/ui/utils/branchFormatter.ts +8 -215
  348. package/src/cli/ui/utils/continueSession.ts +44 -0
  349. package/src/cli/ui/utils/modelOptions.test.ts +1 -1
  350. package/src/codex.ts +100 -43
  351. package/src/config/__tests__/saveSession.test.ts +143 -0
  352. package/src/config/builtin-coding-agents.ts +19 -3
  353. package/src/config/index.ts +4 -0
  354. package/src/config/tools.ts +16 -0
  355. package/src/gemini.ts +58 -43
  356. package/src/index.test.ts +12 -12
  357. package/src/index.ts +164 -142
  358. package/src/launcher.ts +22 -3
  359. package/src/logging/logger.ts +32 -10
  360. package/src/opentui/index.solid.ts +1 -0
  361. package/src/repositories/worktree.repository.ts +8 -0
  362. package/src/services/__tests__/BatchMergeService.test.ts +62 -66
  363. package/src/services/__tests__/WorktreeOrchestrator.test.ts +8 -7
  364. package/src/services/codingAgentResolver.ts +30 -4
  365. package/src/services/dependency-installer.ts +0 -7
  366. package/src/types/api.ts +3 -0
  367. package/src/types/coding-agent.ts +85 -0
  368. package/src/types/tools.ts +19 -0
  369. package/src/utils/__tests__/npmRegistry.test.ts +250 -0
  370. package/src/utils/__tests__/prompt.test.ts +4 -5
  371. package/src/utils/coding-agent-colors.ts +165 -0
  372. package/src/utils/command.ts +10 -1
  373. package/src/utils/error-utils.ts +133 -0
  374. package/src/utils/npmRegistry.ts +249 -0
  375. package/src/utils/prompt.ts +1 -1
  376. package/src/utils/session/index.ts +10 -2
  377. package/src/utils/session/parsers/codex.ts +9 -1
  378. package/src/utils/session/parsers/index.ts +6 -0
  379. package/src/utils/session/parsers/opencode.ts +110 -0
  380. package/src/utils/session/types.ts +5 -0
  381. package/src/utils/terminal.ts +24 -0
  382. package/src/utils.test.ts +1 -1
  383. package/src/utils.ts +37 -4
  384. package/src/web/client/src/components/CodingAgentLaunchModal.tsx +12 -21
  385. package/src/web/client/src/components/branch-detail/BranchInfoCards.tsx +16 -1
  386. package/src/web/client/src/components/branch-detail/SessionHistoryTable.tsx +7 -1
  387. package/src/web/client/src/components/branch-detail/ToolLauncher.tsx +11 -6
  388. package/src/web/client/src/lib/coding-agent-colors.ts +149 -0
  389. package/src/web/client/src/pages/BranchDetailPage.tsx +11 -11
  390. package/src/web/server/pty/manager.ts +139 -0
  391. package/src/web/server/routes/sessions.ts +6 -0
  392. package/src/web/server/services/branches.ts +11 -8
  393. package/src/web/server/services/worktrees.ts +2 -2
  394. package/src/worktree.ts +366 -107
  395. package/dist/cli/ui/components/App.d.ts +0 -25
  396. package/dist/cli/ui/components/App.d.ts.map +0 -1
  397. package/dist/cli/ui/components/App.js +0 -988
  398. package/dist/cli/ui/components/App.js.map +0 -1
  399. package/dist/cli/ui/components/common/Confirm.d.ts +0 -13
  400. package/dist/cli/ui/components/common/Confirm.d.ts.map +0 -1
  401. package/dist/cli/ui/components/common/Confirm.js +0 -20
  402. package/dist/cli/ui/components/common/Confirm.js.map +0 -1
  403. package/dist/cli/ui/components/common/ErrorBoundary.d.ts +0 -23
  404. package/dist/cli/ui/components/common/ErrorBoundary.d.ts.map +0 -1
  405. package/dist/cli/ui/components/common/ErrorBoundary.js +0 -37
  406. package/dist/cli/ui/components/common/ErrorBoundary.js.map +0 -1
  407. package/dist/cli/ui/components/common/Input.d.ts +0 -19
  408. package/dist/cli/ui/components/common/Input.d.ts.map +0 -1
  409. package/dist/cli/ui/components/common/Input.js +0 -22
  410. package/dist/cli/ui/components/common/Input.js.map +0 -1
  411. package/dist/cli/ui/components/common/LoadingIndicator.d.ts +0 -19
  412. package/dist/cli/ui/components/common/LoadingIndicator.d.ts.map +0 -1
  413. package/dist/cli/ui/components/common/LoadingIndicator.js +0 -61
  414. package/dist/cli/ui/components/common/LoadingIndicator.js.map +0 -1
  415. package/dist/cli/ui/components/common/Select.d.ts +0 -38
  416. package/dist/cli/ui/components/common/Select.d.ts.map +0 -1
  417. package/dist/cli/ui/components/common/Select.js +0 -151
  418. package/dist/cli/ui/components/common/Select.js.map +0 -1
  419. package/dist/cli/ui/components/common/SpinnerIcon.d.ts +0 -20
  420. package/dist/cli/ui/components/common/SpinnerIcon.d.ts.map +0 -1
  421. package/dist/cli/ui/components/common/SpinnerIcon.js +0 -61
  422. package/dist/cli/ui/components/common/SpinnerIcon.js.map +0 -1
  423. package/dist/cli/ui/components/parts/Footer.d.ts +0 -15
  424. package/dist/cli/ui/components/parts/Footer.d.ts.map +0 -1
  425. package/dist/cli/ui/components/parts/Footer.js +0 -20
  426. package/dist/cli/ui/components/parts/Footer.js.map +0 -1
  427. package/dist/cli/ui/components/parts/Header.d.ts.map +0 -1
  428. package/dist/cli/ui/components/parts/Header.js +0 -24
  429. package/dist/cli/ui/components/parts/Header.js.map +0 -1
  430. package/dist/cli/ui/components/parts/MergeStatusList.d.ts +0 -13
  431. package/dist/cli/ui/components/parts/MergeStatusList.d.ts.map +0 -1
  432. package/dist/cli/ui/components/parts/MergeStatusList.js +0 -52
  433. package/dist/cli/ui/components/parts/MergeStatusList.js.map +0 -1
  434. package/dist/cli/ui/components/parts/ProgressBar.d.ts +0 -13
  435. package/dist/cli/ui/components/parts/ProgressBar.d.ts.map +0 -1
  436. package/dist/cli/ui/components/parts/ProgressBar.js +0 -53
  437. package/dist/cli/ui/components/parts/ProgressBar.js.map +0 -1
  438. package/dist/cli/ui/components/parts/ScrollableList.d.ts +0 -12
  439. package/dist/cli/ui/components/parts/ScrollableList.d.ts.map +0 -1
  440. package/dist/cli/ui/components/parts/ScrollableList.js +0 -11
  441. package/dist/cli/ui/components/parts/ScrollableList.js.map +0 -1
  442. package/dist/cli/ui/components/parts/Stats.d.ts +0 -10
  443. package/dist/cli/ui/components/parts/Stats.d.ts.map +0 -1
  444. package/dist/cli/ui/components/parts/Stats.js +0 -55
  445. package/dist/cli/ui/components/parts/Stats.js.map +0 -1
  446. package/dist/cli/ui/components/screens/BatchMergeProgressScreen.d.ts +0 -17
  447. package/dist/cli/ui/components/screens/BatchMergeProgressScreen.d.ts.map +0 -1
  448. package/dist/cli/ui/components/screens/BatchMergeProgressScreen.js +0 -42
  449. package/dist/cli/ui/components/screens/BatchMergeProgressScreen.js.map +0 -1
  450. package/dist/cli/ui/components/screens/BatchMergeResultScreen.d.ts +0 -17
  451. package/dist/cli/ui/components/screens/BatchMergeResultScreen.d.ts.map +0 -1
  452. package/dist/cli/ui/components/screens/BatchMergeResultScreen.js +0 -72
  453. package/dist/cli/ui/components/screens/BatchMergeResultScreen.js.map +0 -1
  454. package/dist/cli/ui/components/screens/BranchCreatorScreen.d.ts +0 -18
  455. package/dist/cli/ui/components/screens/BranchCreatorScreen.d.ts.map +0 -1
  456. package/dist/cli/ui/components/screens/BranchCreatorScreen.js +0 -151
  457. package/dist/cli/ui/components/screens/BranchCreatorScreen.js.map +0 -1
  458. package/dist/cli/ui/components/screens/BranchListScreen.d.ts.map +0 -1
  459. package/dist/cli/ui/components/screens/BranchListScreen.js +0 -476
  460. package/dist/cli/ui/components/screens/BranchListScreen.js.map +0 -1
  461. package/dist/cli/ui/components/screens/BranchQuickStartScreen.d.ts +0 -30
  462. package/dist/cli/ui/components/screens/BranchQuickStartScreen.d.ts.map +0 -1
  463. package/dist/cli/ui/components/screens/BranchQuickStartScreen.js +0 -145
  464. package/dist/cli/ui/components/screens/BranchQuickStartScreen.js.map +0 -1
  465. package/dist/cli/ui/components/screens/CodingAgentSelectorScreen.d.ts +0 -27
  466. package/dist/cli/ui/components/screens/CodingAgentSelectorScreen.d.ts.map +0 -1
  467. package/dist/cli/ui/components/screens/CodingAgentSelectorScreen.js +0 -93
  468. package/dist/cli/ui/components/screens/CodingAgentSelectorScreen.js.map +0 -1
  469. package/dist/cli/ui/components/screens/EnvironmentProfileScreen.d.ts +0 -19
  470. package/dist/cli/ui/components/screens/EnvironmentProfileScreen.d.ts.map +0 -1
  471. package/dist/cli/ui/components/screens/EnvironmentProfileScreen.js +0 -577
  472. package/dist/cli/ui/components/screens/EnvironmentProfileScreen.js.map +0 -1
  473. package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.d.ts +0 -45
  474. package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.d.ts.map +0 -1
  475. package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.js +0 -95
  476. package/dist/cli/ui/components/screens/ExecutionModeSelectorScreen.js.map +0 -1
  477. package/dist/cli/ui/components/screens/LogDatePickerScreen.d.ts +0 -10
  478. package/dist/cli/ui/components/screens/LogDatePickerScreen.d.ts.map +0 -1
  479. package/dist/cli/ui/components/screens/LogDatePickerScreen.js +0 -44
  480. package/dist/cli/ui/components/screens/LogDatePickerScreen.js.map +0 -1
  481. package/dist/cli/ui/components/screens/LogDetailScreen.d.ts.map +0 -1
  482. package/dist/cli/ui/components/screens/LogDetailScreen.js +0 -34
  483. package/dist/cli/ui/components/screens/LogDetailScreen.js.map +0 -1
  484. package/dist/cli/ui/components/screens/LogListScreen.d.ts.map +0 -1
  485. package/dist/cli/ui/components/screens/LogListScreen.js +0 -107
  486. package/dist/cli/ui/components/screens/LogListScreen.js.map +0 -1
  487. package/dist/cli/ui/components/screens/ModelSelectorScreen.d.ts +0 -24
  488. package/dist/cli/ui/components/screens/ModelSelectorScreen.d.ts.map +0 -1
  489. package/dist/cli/ui/components/screens/ModelSelectorScreen.js +0 -197
  490. package/dist/cli/ui/components/screens/ModelSelectorScreen.js.map +0 -1
  491. package/dist/cli/ui/components/screens/PRCleanupScreen.d.ts +0 -29
  492. package/dist/cli/ui/components/screens/PRCleanupScreen.d.ts.map +0 -1
  493. package/dist/cli/ui/components/screens/PRCleanupScreen.js +0 -92
  494. package/dist/cli/ui/components/screens/PRCleanupScreen.js.map +0 -1
  495. package/dist/cli/ui/components/screens/SessionSelectorScreen.d.ts +0 -31
  496. package/dist/cli/ui/components/screens/SessionSelectorScreen.d.ts.map +0 -1
  497. package/dist/cli/ui/components/screens/SessionSelectorScreen.js +0 -67
  498. package/dist/cli/ui/components/screens/SessionSelectorScreen.js.map +0 -1
  499. package/dist/cli/ui/hooks/useAppInput.d.ts +0 -21
  500. package/dist/cli/ui/hooks/useAppInput.d.ts.map +0 -1
  501. package/dist/cli/ui/hooks/useAppInput.js +0 -138
  502. package/dist/cli/ui/hooks/useAppInput.js.map +0 -1
  503. package/dist/cli/ui/hooks/useBatchMerge.d.ts +0 -17
  504. package/dist/cli/ui/hooks/useBatchMerge.d.ts.map +0 -1
  505. package/dist/cli/ui/hooks/useBatchMerge.js +0 -77
  506. package/dist/cli/ui/hooks/useBatchMerge.js.map +0 -1
  507. package/dist/cli/ui/hooks/useGitData.d.ts +0 -21
  508. package/dist/cli/ui/hooks/useGitData.d.ts.map +0 -1
  509. package/dist/cli/ui/hooks/useGitData.js +0 -229
  510. package/dist/cli/ui/hooks/useGitData.js.map +0 -1
  511. package/dist/cli/ui/hooks/useProfiles.d.ts +0 -41
  512. package/dist/cli/ui/hooks/useProfiles.d.ts.map +0 -1
  513. package/dist/cli/ui/hooks/useProfiles.js +0 -136
  514. package/dist/cli/ui/hooks/useProfiles.js.map +0 -1
  515. package/dist/cli/ui/hooks/useScreenState.d.ts +0 -12
  516. package/dist/cli/ui/hooks/useScreenState.d.ts.map +0 -1
  517. package/dist/cli/ui/hooks/useScreenState.js +0 -30
  518. package/dist/cli/ui/hooks/useScreenState.js.map +0 -1
  519. package/dist/cli/ui/hooks/useTerminalSize.d.ts +0 -9
  520. package/dist/cli/ui/hooks/useTerminalSize.d.ts.map +0 -1
  521. package/dist/cli/ui/hooks/useTerminalSize.js +0 -24
  522. package/dist/cli/ui/hooks/useTerminalSize.js.map +0 -1
  523. package/dist/cli/ui/hooks/useToolStatus.d.ts +0 -30
  524. package/dist/cli/ui/hooks/useToolStatus.d.ts.map +0 -1
  525. package/dist/cli/ui/hooks/useToolStatus.js +0 -49
  526. package/dist/cli/ui/hooks/useToolStatus.js.map +0 -1
  527. package/dist/cli/ui/screens/BranchActionSelectorScreen.d.ts +0 -24
  528. package/dist/cli/ui/screens/BranchActionSelectorScreen.d.ts.map +0 -1
  529. package/dist/cli/ui/screens/BranchActionSelectorScreen.js +0 -65
  530. package/dist/cli/ui/screens/BranchActionSelectorScreen.js.map +0 -1
  531. package/dist/client/assets/index-LNPtOrn3.js +0 -78
  532. package/src/cli/ui/__tests__/SKIPPED_TESTS.md +0 -119
  533. package/src/cli/ui/__tests__/acceptance/branchList.acceptance.test.tsx.skip +0 -239
  534. package/src/cli/ui/__tests__/acceptance/navigation.acceptance.test.tsx +0 -225
  535. package/src/cli/ui/__tests__/acceptance/realtimeUpdate.acceptance.test.tsx.skip +0 -219
  536. package/src/cli/ui/__tests__/components/App.protected-branch.test.tsx +0 -212
  537. package/src/cli/ui/__tests__/components/App.shortcuts.test.tsx +0 -440
  538. package/src/cli/ui/__tests__/components/App.test.tsx +0 -365
  539. package/src/cli/ui/__tests__/components/ModelSelectorScreen.initial.test.tsx +0 -91
  540. package/src/cli/ui/__tests__/components/common/Confirm.test.tsx +0 -80
  541. package/src/cli/ui/__tests__/components/common/ErrorBoundary.test.tsx +0 -104
  542. package/src/cli/ui/__tests__/components/common/Input.test.tsx +0 -100
  543. package/src/cli/ui/__tests__/components/common/LoadingIndicator.test.tsx +0 -148
  544. package/src/cli/ui/__tests__/components/common/Select.memo.test.tsx +0 -255
  545. package/src/cli/ui/__tests__/components/common/Select.test.tsx +0 -335
  546. package/src/cli/ui/__tests__/components/parts/Footer.test.tsx +0 -65
  547. package/src/cli/ui/__tests__/components/parts/Header.test.tsx +0 -55
  548. package/src/cli/ui/__tests__/components/parts/ScrollableList.test.tsx +0 -69
  549. package/src/cli/ui/__tests__/components/parts/Stats.test.tsx +0 -148
  550. package/src/cli/ui/__tests__/components/screens/BranchCreatorScreen.test.tsx +0 -253
  551. package/src/cli/ui/__tests__/components/screens/BranchListScreen.test.tsx +0 -1070
  552. package/src/cli/ui/__tests__/components/screens/BranchQuickStartScreen.test.tsx +0 -142
  553. package/src/cli/ui/__tests__/components/screens/CodingAgentSelectorScreen.test.tsx +0 -174
  554. package/src/cli/ui/__tests__/components/screens/ExecutionModeSelectorScreen.test.tsx +0 -182
  555. package/src/cli/ui/__tests__/components/screens/LogDetailScreen.test.tsx +0 -57
  556. package/src/cli/ui/__tests__/components/screens/LogListScreen.test.tsx +0 -102
  557. package/src/cli/ui/__tests__/components/screens/PRCleanupScreen.test.tsx +0 -216
  558. package/src/cli/ui/__tests__/components/screens/SessionSelectorScreen.test.tsx +0 -147
  559. package/src/cli/ui/__tests__/hooks/useGitData.nonblocking.test.tsx +0 -206
  560. package/src/cli/ui/__tests__/hooks/useGitData.test.ts +0 -197
  561. package/src/cli/ui/__tests__/hooks/useGitData.test.ts.skip +0 -228
  562. package/src/cli/ui/__tests__/hooks/useScreenState.test.ts +0 -147
  563. package/src/cli/ui/__tests__/hooks/useTerminalSize.test.ts +0 -99
  564. package/src/cli/ui/__tests__/integration/branchList.test.tsx.skip +0 -253
  565. package/src/cli/ui/__tests__/integration/edgeCases.test.tsx +0 -436
  566. package/src/cli/ui/__tests__/integration/navigation.test.tsx +0 -514
  567. package/src/cli/ui/__tests__/integration/realtimeUpdate.test.tsx +0 -509
  568. package/src/cli/ui/__tests__/integration/realtimeUpdate.test.tsx.skip +0 -216
  569. package/src/cli/ui/__tests__/performance/branchList.performance.test.tsx +0 -193
  570. package/src/cli/ui/__tests__/performance/useMemoOptimization.test.tsx +0 -234
  571. package/src/cli/ui/components/App.tsx +0 -1456
  572. package/src/cli/ui/components/common/Confirm.tsx +0 -44
  573. package/src/cli/ui/components/common/ErrorBoundary.tsx +0 -60
  574. package/src/cli/ui/components/common/Input.tsx +0 -58
  575. package/src/cli/ui/components/common/LoadingIndicator.tsx +0 -98
  576. package/src/cli/ui/components/common/Select.tsx +0 -247
  577. package/src/cli/ui/components/common/SpinnerIcon.tsx +0 -86
  578. package/src/cli/ui/components/parts/Footer.tsx +0 -41
  579. package/src/cli/ui/components/parts/Header.test.tsx +0 -75
  580. package/src/cli/ui/components/parts/MergeStatusList.tsx +0 -75
  581. package/src/cli/ui/components/parts/ProgressBar.tsx +0 -73
  582. package/src/cli/ui/components/parts/Stats.tsx +0 -88
  583. package/src/cli/ui/components/screens/BatchMergeProgressScreen.tsx +0 -74
  584. package/src/cli/ui/components/screens/BatchMergeResultScreen.tsx +0 -108
  585. package/src/cli/ui/components/screens/BranchCreatorScreen.tsx +0 -242
  586. package/src/cli/ui/components/screens/BranchListScreen.tsx +0 -744
  587. package/src/cli/ui/components/screens/BranchQuickStartScreen.tsx +0 -241
  588. package/src/cli/ui/components/screens/CodingAgentSelectorScreen.tsx +0 -159
  589. package/src/cli/ui/components/screens/EnvironmentProfileScreen.tsx +0 -928
  590. package/src/cli/ui/components/screens/ExecutionModeSelectorScreen.tsx +0 -176
  591. package/src/cli/ui/components/screens/LogDatePickerScreen.tsx +0 -83
  592. package/src/cli/ui/components/screens/LogDetailScreen.tsx +0 -67
  593. package/src/cli/ui/components/screens/LogListScreen.tsx +0 -192
  594. package/src/cli/ui/components/screens/ModelSelectorScreen.tsx +0 -320
  595. package/src/cli/ui/components/screens/PRCleanupScreen.tsx +0 -171
  596. package/src/cli/ui/components/screens/SessionSelectorScreen.tsx +0 -135
  597. package/src/cli/ui/hooks/useAppInput.ts +0 -172
  598. package/src/cli/ui/hooks/useBatchMerge.ts +0 -96
  599. package/src/cli/ui/hooks/useGitData.ts +0 -347
  600. package/src/cli/ui/hooks/useProfiles.ts +0 -211
  601. package/src/cli/ui/hooks/useScreenState.ts +0 -44
  602. package/src/cli/ui/hooks/useTerminalSize.ts +0 -33
  603. package/src/cli/ui/hooks/useToolStatus.ts +0 -68
  604. package/src/cli/ui/screens/BranchActionSelectorScreen.tsx +0 -111
  605. package/src/cli/ui/screens/__tests__/BranchActionSelectorScreen.test.tsx +0 -264
@@ -10,6 +10,10 @@ import {
10
10
  TableHead,
11
11
  TableCell,
12
12
  } from "@/components/ui/table";
13
+ import {
14
+ getAgentTailwindClass,
15
+ normalizeAgentToToolId,
16
+ } from "@/lib/coding-agent-colors";
13
17
 
14
18
  interface SessionInfo {
15
19
  sessionId: string;
@@ -131,7 +135,9 @@ export function SessionHistoryTable({
131
135
  {SESSION_STATUS_LABEL[session.status]}
132
136
  </Badge>
133
137
  </TableCell>
134
- <TableCell className="font-medium">
138
+ <TableCell
139
+ className={`font-medium ${getAgentTailwindClass(normalizeAgentToToolId(session.agentType))}`}
140
+ >
135
141
  {agentLabel(session.agentType, session.agentName)}
136
142
  </TableCell>
137
143
  <TableCell>
@@ -13,6 +13,7 @@ import {
13
13
  SelectValue,
14
14
  } from "@/components/ui/select";
15
15
  import { cn } from "@/lib/utils";
16
+ import { getAgentTailwindClass } from "@/lib/coding-agent-colors";
16
17
  import type { ApiCodingAgent, Branch } from "../../../../../types/api.js";
17
18
 
18
19
  type ToolMode = "normal" | "continue" | "resume";
@@ -45,7 +46,7 @@ interface ToolLauncherProps {
45
46
  isStartingSession: boolean;
46
47
  isSyncingBranch: boolean;
47
48
  needsRemoteSync: boolean;
48
- hasBlockingDivergence: boolean;
49
+ hasConflictingDivergence: boolean;
49
50
  onToolChange: (toolId: string) => void;
50
51
  onModeChange: (mode: ToolMode) => void;
51
52
  onSkipPermissionsChange: (skip: boolean) => void;
@@ -88,7 +89,7 @@ export function ToolLauncher({
88
89
  isStartingSession,
89
90
  isSyncingBranch,
90
91
  needsRemoteSync,
91
- hasBlockingDivergence,
92
+ hasConflictingDivergence,
92
93
  onToolChange,
93
94
  onModeChange,
94
95
  onSkipPermissionsChange,
@@ -170,7 +171,11 @@ export function ToolLauncher({
170
171
  </SelectTrigger>
171
172
  <SelectContent>
172
173
  {availableTools.map((tool) => (
173
- <SelectItem key={tool.id} value={tool.id}>
174
+ <SelectItem
175
+ key={tool.id}
176
+ value={tool.id}
177
+ className={getAgentTailwindClass(tool.id)}
178
+ >
174
179
  {tool.label}
175
180
  </SelectItem>
176
181
  ))}
@@ -243,11 +248,12 @@ export function ToolLauncher({
243
248
  </Alert>
244
249
  )}
245
250
 
246
- {hasBlockingDivergence && (
251
+ {hasConflictingDivergence && (
247
252
  <Alert variant="warning" data-testid="divergence-warning">
248
253
  <AlertDescription>
249
254
  <p>
250
- リモートとローカルの両方に未解決の差分があるため、起動をブロックしています。
255
+ リモートとローカルの両方に未解決の差分があります。起動は可能ですが、
256
+ 衝突を避けるために差分の解消を推奨します。
251
257
  </p>
252
258
  <ul className="mt-2 list-inside list-disc text-xs text-muted-foreground">
253
259
  <li>
@@ -266,7 +272,6 @@ export function ToolLauncher({
266
272
  disabled={
267
273
  isStartingSession ||
268
274
  !selectedTool ||
269
- hasBlockingDivergence ||
270
275
  needsRemoteSync ||
271
276
  isSyncingBranch
272
277
  }
@@ -0,0 +1,149 @@
1
+ /**
2
+ * Coding Agent Color Definitions for Web UI
3
+ *
4
+ * This module provides consistent color definitions for coding agents
5
+ * in the Web UI (React/Tailwind) (SPEC-3b0ed29b FR-024~FR-027).
6
+ *
7
+ * Note: This mirrors the CLI color utility at src/utils/coding-agent-colors.ts
8
+ * Both files should be kept in sync.
9
+ */
10
+
11
+ /**
12
+ * Tool ID constants for coding agents
13
+ */
14
+ export const CODING_AGENT_TOOL_IDS = {
15
+ CLAUDE_CODE: "claude-code",
16
+ CODEX_CLI: "codex-cli",
17
+ GEMINI_CLI: "gemini-cli",
18
+ OPENCODE: "opencode",
19
+ } as const;
20
+
21
+ /**
22
+ * Color definitions for coding agents
23
+ */
24
+ export const CODING_AGENT_COLORS = {
25
+ [CODING_AGENT_TOOL_IDS.CLAUDE_CODE]: {
26
+ hex: "#f6e05e",
27
+ tailwind: "text-yellow-400",
28
+ bgTailwind: "bg-yellow-400/20",
29
+ borderTailwind: "border-yellow-400",
30
+ },
31
+ [CODING_AGENT_TOOL_IDS.CODEX_CLI]: {
32
+ hex: "#4fd1c5",
33
+ tailwind: "text-cyan-400",
34
+ bgTailwind: "bg-cyan-400/20",
35
+ borderTailwind: "border-cyan-400",
36
+ },
37
+ [CODING_AGENT_TOOL_IDS.GEMINI_CLI]: {
38
+ hex: "#d53f8c",
39
+ tailwind: "text-pink-500",
40
+ bgTailwind: "bg-pink-500/20",
41
+ borderTailwind: "border-pink-500",
42
+ },
43
+ [CODING_AGENT_TOOL_IDS.OPENCODE]: {
44
+ hex: "#48bb78",
45
+ tailwind: "text-green-400",
46
+ bgTailwind: "bg-green-400/20",
47
+ borderTailwind: "border-green-400",
48
+ },
49
+ } as const;
50
+
51
+ /**
52
+ * Default color for unknown/custom agents
53
+ */
54
+ export const DEFAULT_AGENT_COLOR = {
55
+ hex: "#a0aec0",
56
+ tailwind: "text-gray-400",
57
+ bgTailwind: "bg-gray-400/20",
58
+ borderTailwind: "border-gray-400",
59
+ };
60
+
61
+ /**
62
+ * Get Tailwind CSS text color class for a coding agent
63
+ *
64
+ * @param toolId - The tool ID (e.g., "claude-code", "codex-cli")
65
+ * @returns Tailwind CSS class name
66
+ */
67
+ export function getAgentTailwindClass(toolId?: string | null): string {
68
+ if (!toolId) {
69
+ return DEFAULT_AGENT_COLOR.tailwind;
70
+ }
71
+
72
+ const color = CODING_AGENT_COLORS[toolId as keyof typeof CODING_AGENT_COLORS];
73
+ return color?.tailwind ?? DEFAULT_AGENT_COLOR.tailwind;
74
+ }
75
+
76
+ /**
77
+ * Get Tailwind CSS background color class for a coding agent
78
+ *
79
+ * @param toolId - The tool ID (e.g., "claude-code", "codex-cli")
80
+ * @returns Tailwind CSS class name for background
81
+ */
82
+ export function getAgentBgTailwindClass(toolId?: string | null): string {
83
+ if (!toolId) {
84
+ return DEFAULT_AGENT_COLOR.bgTailwind;
85
+ }
86
+
87
+ const color = CODING_AGENT_COLORS[toolId as keyof typeof CODING_AGENT_COLORS];
88
+ return color?.bgTailwind ?? DEFAULT_AGENT_COLOR.bgTailwind;
89
+ }
90
+
91
+ /**
92
+ * Get hex color for a coding agent
93
+ *
94
+ * @param toolId - The tool ID (e.g., "claude-code", "codex-cli")
95
+ * @returns Hex color string
96
+ */
97
+ export function getAgentHexColor(toolId?: string | null): string {
98
+ if (!toolId) {
99
+ return DEFAULT_AGENT_COLOR.hex;
100
+ }
101
+
102
+ const color = CODING_AGENT_COLORS[toolId as keyof typeof CODING_AGENT_COLORS];
103
+ return color?.hex ?? DEFAULT_AGENT_COLOR.hex;
104
+ }
105
+
106
+ /**
107
+ * Normalize agent type string to tool ID
108
+ * Handles various naming conventions used across the codebase
109
+ *
110
+ * @param agentType - Agent type string (e.g., "claude", "codex-cli", "Claude Code")
111
+ * @returns Normalized tool ID
112
+ */
113
+ export function normalizeAgentToToolId(
114
+ agentType?: string | null,
115
+ ): string | null {
116
+ if (!agentType) return null;
117
+
118
+ const normalized = agentType.toLowerCase().trim();
119
+
120
+ // Direct matches
121
+ if (normalized === "claude-code" || normalized === "claude") {
122
+ return CODING_AGENT_TOOL_IDS.CLAUDE_CODE;
123
+ }
124
+ if (normalized === "codex-cli" || normalized === "codex") {
125
+ return CODING_AGENT_TOOL_IDS.CODEX_CLI;
126
+ }
127
+ if (normalized === "gemini-cli" || normalized === "gemini") {
128
+ return CODING_AGENT_TOOL_IDS.GEMINI_CLI;
129
+ }
130
+ if (normalized === "opencode" || normalized === "open-code") {
131
+ return CODING_AGENT_TOOL_IDS.OPENCODE;
132
+ }
133
+
134
+ // Label-based matches
135
+ if (normalized.includes("claude")) {
136
+ return CODING_AGENT_TOOL_IDS.CLAUDE_CODE;
137
+ }
138
+ if (normalized.includes("codex")) {
139
+ return CODING_AGENT_TOOL_IDS.CODEX_CLI;
140
+ }
141
+ if (normalized.includes("gemini")) {
142
+ return CODING_AGENT_TOOL_IDS.GEMINI_CLI;
143
+ }
144
+ if (normalized.includes("opencode")) {
145
+ return CODING_AGENT_TOOL_IDS.OPENCODE;
146
+ }
147
+
148
+ return agentType; // Return as-is for custom agents
149
+ }
@@ -210,7 +210,7 @@ export function BranchDetailPage() {
210
210
  // Computed values
211
211
  const canStartSession = Boolean(branch.worktreePath);
212
212
  const divergenceInfo = branch.divergence ?? null;
213
- const hasBlockingDivergence = Boolean(
213
+ const hasConflictingDivergence = Boolean(
214
214
  divergenceInfo && divergenceInfo.ahead > 0 && divergenceInfo.behind > 0,
215
215
  );
216
216
  const needsRemoteSync = Boolean(
@@ -218,7 +218,7 @@ export function BranchDetailPage() {
218
218
  divergenceInfo &&
219
219
  divergenceInfo.behind > 0 &&
220
220
  divergenceInfo.ahead === 0 &&
221
- !hasBlockingDivergence,
221
+ !hasConflictingDivergence,
222
222
  );
223
223
  const isSyncingBranch = syncBranch.isPending;
224
224
 
@@ -270,14 +270,6 @@ export function BranchDetailPage() {
270
270
  return;
271
271
  }
272
272
 
273
- if (hasBlockingDivergence) {
274
- setBanner({
275
- type: "error",
276
- message: "差分を解消してから起動してください。",
277
- });
278
- return;
279
- }
280
-
281
273
  if (
282
274
  skipPermissions &&
283
275
  !window.confirm("権限チェックをスキップして起動します。続行しますか?")
@@ -293,6 +285,13 @@ export function BranchDetailPage() {
293
285
  : selectedTool.target === "custom"
294
286
  ? "custom"
295
287
  : "claude-code";
288
+ const resumeSessionId =
289
+ selectedMode === "normal"
290
+ ? null
291
+ : latestToolUsage?.sessionId &&
292
+ latestToolUsage.toolId === selectedToolId
293
+ ? latestToolUsage.sessionId
294
+ : null;
296
295
  const extraArgs = extraArgsText
297
296
  .split(/\s+/)
298
297
  .map((c) => c.trim())
@@ -309,6 +308,7 @@ export function BranchDetailPage() {
309
308
  ...(selectedTool.target === "codex"
310
309
  ? { bypassApprovals: skipPermissions }
311
310
  : {}),
311
+ ...(resumeSessionId ? { resumeSessionId } : {}),
312
312
  ...(extraArgs.length ? { extraArgs } : {}),
313
313
  } as const;
314
314
 
@@ -478,7 +478,7 @@ export function BranchDetailPage() {
478
478
  isStartingSession={isStartingSession}
479
479
  isSyncingBranch={isSyncingBranch}
480
480
  needsRemoteSync={needsRemoteSync}
481
- hasBlockingDivergence={hasBlockingDivergence}
481
+ hasConflictingDivergence={hasConflictingDivergence}
482
482
  onToolChange={setSelectedToolId}
483
483
  onModeChange={setSelectedMode}
484
484
  onSkipPermissionsChange={setSkipPermissions}
@@ -8,6 +8,7 @@
8
8
  import * as pty from "node-pty";
9
9
  import type { IPty } from "node-pty";
10
10
  import { randomUUID } from "node:crypto";
11
+ import { execa } from "execa";
11
12
  import type { CodingAgentSession } from "../../../types/api.js";
12
13
  import {
13
14
  resolveClaudeCommand,
@@ -17,6 +18,11 @@ import {
17
18
  type ResolvedCommand,
18
19
  } from "../../../services/codingAgentResolver.js";
19
20
  import { loadCodingAgentsConfig } from "../../../config/tools.js";
21
+ import { saveSession } from "../../../config/index.js";
22
+ import {
23
+ findLatestClaudeSession,
24
+ findLatestCodexSession,
25
+ } from "../../../utils/session.js";
20
26
  import { createLogger } from "../../../logging/logger.js";
21
27
 
22
28
  const logger = createLogger({ category: "pty" });
@@ -47,12 +53,18 @@ export class PTYManager {
47
53
  bypassApprovals?: boolean;
48
54
  extraArgs?: string[];
49
55
  customToolId?: string | null;
56
+ resumeSessionId?: string | null;
50
57
  } = {},
51
58
  ): Promise<{ sessionId: string; session: CodingAgentSession }> {
52
59
  const cols = options.cols ?? 80;
53
60
  const rows = options.rows ?? 24;
54
61
  const toolName = options.toolName ?? null;
55
62
  const sessionId = randomUUID();
63
+ const startedAt = Date.now();
64
+ const resumeSessionId =
65
+ options.resumeSessionId && options.resumeSessionId.trim().length > 0
66
+ ? options.resumeSessionId.trim()
67
+ : null;
56
68
 
57
69
  logger.debug(
58
70
  { sessionId, toolType, mode, worktreePath, cols, rows },
@@ -65,6 +77,7 @@ export class PTYManager {
65
77
  bypassApprovals?: boolean;
66
78
  extraArgs?: string[];
67
79
  customToolId?: string | null;
80
+ sessionId?: string | null;
68
81
  } = {};
69
82
 
70
83
  if (toolName !== null) {
@@ -82,6 +95,9 @@ export class PTYManager {
82
95
  if (options.customToolId !== undefined) {
83
96
  resolverOptions.customToolId = options.customToolId;
84
97
  }
98
+ if (options.resumeSessionId !== undefined) {
99
+ resolverOptions.sessionId = options.resumeSessionId;
100
+ }
85
101
 
86
102
  const resolved = await this.resolveCommand(toolType, mode, resolverOptions);
87
103
 
@@ -153,6 +169,14 @@ export class PTYManager {
153
169
 
154
170
  this.instances.set(sessionId, { ptyProcess, session });
155
171
 
172
+ ptyProcess.onExit(() => {
173
+ void this.persistSessionIdOnExit({
174
+ session,
175
+ startedAt,
176
+ resumeSessionId,
177
+ });
178
+ });
179
+
156
180
  return { sessionId, session };
157
181
  }
158
182
 
@@ -230,6 +254,7 @@ export class PTYManager {
230
254
  bypassApprovals?: boolean;
231
255
  extraArgs?: string[];
232
256
  customToolId?: string | null;
257
+ sessionId?: string | null;
233
258
  },
234
259
  ): Promise<ResolvedCommand> {
235
260
  if (toolType === "custom") {
@@ -256,6 +281,7 @@ export class PTYManager {
256
281
  mode: "normal" | "continue" | "resume";
257
282
  bypassApprovals?: boolean;
258
283
  extraArgs?: string[];
284
+ sessionId?: string | null;
259
285
  } = { mode };
260
286
 
261
287
  if (options.bypassApprovals !== undefined) {
@@ -264,6 +290,9 @@ export class PTYManager {
264
290
  if (options.extraArgs && options.extraArgs.length > 0) {
265
291
  codexOptions.extraArgs = options.extraArgs;
266
292
  }
293
+ if (options.sessionId) {
294
+ codexOptions.sessionId = options.sessionId;
295
+ }
267
296
 
268
297
  return resolveCodexCommand(codexOptions);
269
298
  }
@@ -272,6 +301,7 @@ export class PTYManager {
272
301
  mode: "normal" | "continue" | "resume";
273
302
  skipPermissions?: boolean;
274
303
  extraArgs?: string[];
304
+ sessionId?: string | null;
275
305
  } = { mode };
276
306
 
277
307
  if (options.skipPermissions !== undefined) {
@@ -280,6 +310,9 @@ export class PTYManager {
280
310
  if (options.extraArgs && options.extraArgs.length > 0) {
281
311
  claudeOptions.extraArgs = options.extraArgs;
282
312
  }
313
+ if (options.sessionId) {
314
+ claudeOptions.sessionId = options.sessionId;
315
+ }
283
316
 
284
317
  return resolveClaudeCommand(claudeOptions);
285
318
  }
@@ -293,6 +326,77 @@ export class PTYManager {
293
326
  );
294
327
  return sharedEnv;
295
328
  }
329
+
330
+ private async persistSessionIdOnExit(params: {
331
+ session: CodingAgentSession;
332
+ startedAt: number;
333
+ resumeSessionId: string | null;
334
+ }): Promise<void> {
335
+ const { session, startedAt, resumeSessionId } = params;
336
+ if (
337
+ session.agentType !== "claude-code" &&
338
+ session.agentType !== "codex-cli"
339
+ ) {
340
+ return;
341
+ }
342
+
343
+ const finishedAt = Date.now();
344
+ let detectedSessionId: string | null = null;
345
+
346
+ try {
347
+ if (session.agentType === "codex-cli") {
348
+ const latest = await findLatestCodexSession({
349
+ since: startedAt - 60_000,
350
+ until: finishedAt + 60_000,
351
+ preferClosestTo: finishedAt,
352
+ windowMs: 60 * 60 * 1000,
353
+ cwd: session.worktreePath,
354
+ });
355
+ detectedSessionId = latest?.id ?? null;
356
+ } else if (session.agentType === "claude-code") {
357
+ const latest = await findLatestClaudeSession(session.worktreePath, {
358
+ since: startedAt - 60_000,
359
+ until: finishedAt + 60_000,
360
+ preferClosestTo: finishedAt,
361
+ windowMs: 60 * 60 * 1000,
362
+ });
363
+ detectedSessionId = latest?.id ?? null;
364
+ }
365
+ } catch (error: unknown) {
366
+ logger.debug(
367
+ { err: error, sessionId: session.sessionId },
368
+ "Failed to detect session ID",
369
+ );
370
+ }
371
+
372
+ const finalSessionId = detectedSessionId ?? resumeSessionId;
373
+ if (!finalSessionId) {
374
+ return;
375
+ }
376
+
377
+ try {
378
+ const context = await resolveGitContext(session.worktreePath);
379
+ if (!context.repoRoot) {
380
+ return;
381
+ }
382
+
383
+ await saveSession({
384
+ lastWorktreePath: session.worktreePath,
385
+ lastBranch: context.branchName,
386
+ lastUsedTool: session.agentType,
387
+ toolLabel: agentLabelFromType(session.agentType),
388
+ mode: session.mode,
389
+ timestamp: Date.now(),
390
+ repositoryRoot: context.repoRoot,
391
+ lastSessionId: finalSessionId,
392
+ });
393
+ } catch (error: unknown) {
394
+ logger.debug(
395
+ { err: error, sessionId: session.sessionId },
396
+ "Failed to persist session ID",
397
+ );
398
+ }
399
+ }
296
400
  }
297
401
 
298
402
  function isRootUser(): boolean {
@@ -302,3 +406,38 @@ function isRootUser(): boolean {
302
406
  return false;
303
407
  }
304
408
  }
409
+
410
+ async function resolveGitContext(worktreePath: string): Promise<{
411
+ repoRoot: string | null;
412
+ branchName: string | null;
413
+ }> {
414
+ try {
415
+ const { stdout: repoRoot } = await execa(
416
+ "git",
417
+ ["rev-parse", "--show-toplevel"],
418
+ { cwd: worktreePath },
419
+ );
420
+ const normalizedRoot = repoRoot.trim();
421
+ let branchName: string | null = null;
422
+ try {
423
+ const { stdout: branchStdout } = await execa(
424
+ "git",
425
+ ["rev-parse", "--abbrev-ref", "HEAD"],
426
+ { cwd: worktreePath },
427
+ );
428
+ branchName = branchStdout.trim() || null;
429
+ } catch {
430
+ branchName = null;
431
+ }
432
+
433
+ return { repoRoot: normalizedRoot || null, branchName };
434
+ } catch {
435
+ return { repoRoot: null, branchName: null };
436
+ }
437
+ }
438
+
439
+ function agentLabelFromType(agentType: "claude-code" | "codex-cli" | "custom") {
440
+ if (agentType === "claude-code") return "Claude";
441
+ if (agentType === "codex-cli") return "Codex";
442
+ return "Custom";
443
+ }
@@ -60,6 +60,7 @@ export async function registerSessionRoutes(
60
60
  bypassApprovals,
61
61
  extraArgs,
62
62
  customAgentId,
63
+ resumeSessionId,
63
64
  } = request.body;
64
65
 
65
66
  logger.debug(
@@ -73,6 +74,7 @@ export async function registerSessionRoutes(
73
74
  bypassApprovals?: boolean;
74
75
  extraArgs?: string[];
75
76
  customToolId?: string | null;
77
+ resumeSessionId?: string | null;
76
78
  } = {};
77
79
 
78
80
  if (typeof agentName !== "undefined") {
@@ -90,6 +92,9 @@ export async function registerSessionRoutes(
90
92
  if (typeof customAgentId !== "undefined") {
91
93
  spawnOptions.customToolId = customAgentId;
92
94
  }
95
+ if (typeof resumeSessionId !== "undefined") {
96
+ spawnOptions.resumeSessionId = resumeSessionId;
97
+ }
93
98
 
94
99
  if (agentType === "custom" && !agentName && !customAgentId) {
95
100
  reply.code(400);
@@ -138,6 +143,7 @@ export async function registerSessionRoutes(
138
143
  ? (agentName ?? "Custom")
139
144
  : agentLabelFromType(agentType),
140
145
  mode,
146
+ lastSessionId: resumeSessionId ?? null,
141
147
  timestamp: Date.now(),
142
148
  repositoryRoot: repoRoot.trim(),
143
149
  });
@@ -58,7 +58,9 @@ export async function listBranches(): Promise<Branch[]> {
58
58
  const divergenceMap = await buildDivergenceMap(branches, repoRoot);
59
59
  const upstreamMap = await collectUpstreamMap(repoRoot);
60
60
  const baseCandidates = buildBaseBranchCandidates(branches);
61
- const mainBranch = "main"; // TODO: 動的に取得
61
+ const branchNames = branches.map((b: BranchInfo) => b.name);
62
+ const mainBranch =
63
+ DEFAULT_BASE_BRANCHES.find((name) => branchNames.includes(name)) ?? "main";
62
64
  const refCache = new Map<string, boolean>();
63
65
  const ancestorCache = new Map<string, boolean>();
64
66
 
@@ -158,10 +160,9 @@ export async function syncBranchState(
158
160
  divergenceInput.branches = [sanitizedBranch];
159
161
  }
160
162
  const divergenceStatuses = await getBranchDivergenceStatuses(divergenceInput);
163
+ const firstDivergence = divergenceStatuses[0];
161
164
  const divergence =
162
- divergenceStatuses.length > 0
163
- ? mapDivergence(divergenceStatuses[0]!)
164
- : null;
165
+ firstDivergence !== undefined ? mapDivergence(firstDivergence) : null;
165
166
 
166
167
  const branch = await getBranchByName(branchName);
167
168
  if (!branch) {
@@ -346,8 +347,9 @@ async function refExists(
346
347
  repoRoot: string,
347
348
  cache: Map<string, boolean>,
348
349
  ): Promise<boolean> {
349
- if (cache.has(refName)) {
350
- return cache.get(refName)!;
350
+ const cached = cache.get(refName);
351
+ if (cached !== undefined) {
352
+ return cached;
351
353
  }
352
354
 
353
355
  try {
@@ -367,8 +369,9 @@ async function isAncestorRef(
367
369
  cache: Map<string, boolean>,
368
370
  ): Promise<boolean> {
369
371
  const cacheKey = `${ancestor}->${branch}`;
370
- if (cache.has(cacheKey)) {
371
- return cache.get(cacheKey)!;
372
+ const cached = cache.get(cacheKey);
373
+ if (cached !== undefined) {
374
+ return cached;
372
375
  }
373
376
 
374
377
  try {
@@ -25,8 +25,8 @@ export async function listWorktrees(): Promise<Worktree[]> {
25
25
  path: wt.path,
26
26
  branchName: wt.branch,
27
27
  head: wt.head,
28
- isLocked: false, // TODO: locked情報を取得
29
- isPrunable: false, // TODO: prunable情報を取得
28
+ isLocked: wt.isLocked ?? false,
29
+ isPrunable: wt.isPrunable ?? false,
30
30
  isProtected: isProtectedBranchName(wt.branch),
31
31
  createdAt: null, // git worktreeからは取得不可
32
32
  lastAccessedAt: null, // git worktreeからは取得不可