conductor-oss 0.7.1 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (381) hide show
  1. package/README.md +173 -134
  2. package/dist/backend.d.ts.map +1 -1
  3. package/dist/backend.js +18 -2
  4. package/dist/backend.js.map +1 -1
  5. package/dist/commands/dashboard.d.ts.map +1 -1
  6. package/dist/commands/dashboard.js +13 -7
  7. package/dist/commands/dashboard.js.map +1 -1
  8. package/node_modules/@conductor-oss/core/dist/config.d.ts.map +1 -1
  9. package/node_modules/@conductor-oss/core/dist/config.js +6 -1
  10. package/node_modules/@conductor-oss/core/dist/config.js.map +1 -1
  11. package/package.json +8 -6
  12. package/web/.next/standalone/packages/web/.next/BUILD_ID +1 -1
  13. package/web/.next/standalone/packages/web/.next/app-path-routes-manifest.json +2 -0
  14. package/web/.next/standalone/packages/web/.next/build-manifest.json +7 -7
  15. package/web/.next/standalone/packages/web/.next/prerender-manifest.json +3 -3
  16. package/web/.next/standalone/packages/web/.next/routes-manifest.json +44 -1
  17. package/web/.next/standalone/packages/web/.next/server/app/_global-error/page/build-manifest.json +5 -5
  18. package/web/.next/standalone/packages/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  19. package/web/.next/standalone/packages/web/.next/server/app/_global-error.html +2 -2
  20. package/web/.next/standalone/packages/web/.next/server/app/_global-error.rsc +7 -7
  21. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
  22. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
  23. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
  24. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
  25. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  26. package/web/.next/standalone/packages/web/.next/server/app/_not-found/page/build-manifest.json +5 -5
  27. package/web/.next/standalone/packages/web/.next/server/app/_not-found/page/server-reference-manifest.json +7 -7
  28. package/web/.next/standalone/packages/web/.next/server/app/_not-found/page.js +2 -2
  29. package/web/.next/standalone/packages/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  30. package/web/.next/standalone/packages/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  31. package/web/.next/standalone/packages/web/.next/server/app/_not-found.html +1 -1
  32. package/web/.next/standalone/packages/web/.next/server/app/_not-found.rsc +11 -11
  33. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_full.segment.rsc +11 -11
  34. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  35. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_index.segment.rsc +6 -6
  36. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  37. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  38. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  39. package/web/.next/standalone/packages/web/.next/server/app/api/access/route.js +2 -2
  40. package/web/.next/standalone/packages/web/.next/server/app/api/access/route.js.nft.json +1 -1
  41. package/web/.next/standalone/packages/web/.next/server/app/api/agents/route.js +2 -2
  42. package/web/.next/standalone/packages/web/.next/server/app/api/agents/route.js.nft.json +1 -1
  43. package/web/.next/standalone/packages/web/.next/server/app/api/app-update/route.js +2 -2
  44. package/web/.next/standalone/packages/web/.next/server/app/api/app-update/route.js.nft.json +1 -1
  45. package/web/.next/standalone/packages/web/.next/server/app/api/attachments/route.js +2 -2
  46. package/web/.next/standalone/packages/web/.next/server/app/api/attachments/route.js.nft.json +1 -1
  47. package/web/.next/standalone/packages/web/.next/server/app/api/auth/session/route.js +2 -2
  48. package/web/.next/standalone/packages/web/.next/server/app/api/auth/session/route.js.nft.json +1 -1
  49. package/web/.next/standalone/packages/web/.next/server/app/api/boards/comments/route.js +2 -2
  50. package/web/.next/standalone/packages/web/.next/server/app/api/boards/comments/route.js.nft.json +1 -1
  51. package/web/.next/standalone/packages/web/.next/server/app/api/boards/route.js +2 -2
  52. package/web/.next/standalone/packages/web/.next/server/app/api/boards/route.js.nft.json +1 -1
  53. package/web/.next/standalone/packages/web/.next/server/app/api/config/route.js +2 -2
  54. package/web/.next/standalone/packages/web/.next/server/app/api/config/route.js.nft.json +1 -1
  55. package/web/.next/standalone/packages/web/.next/server/app/api/context-files/open/route.js +2 -2
  56. package/web/.next/standalone/packages/web/.next/server/app/api/context-files/open/route.js.nft.json +1 -1
  57. package/web/.next/standalone/packages/web/.next/server/app/api/context-files/route.js +2 -2
  58. package/web/.next/standalone/packages/web/.next/server/app/api/context-files/route.js.nft.json +1 -1
  59. package/web/.next/standalone/packages/web/.next/server/app/api/events/route.js +2 -2
  60. package/web/.next/standalone/packages/web/.next/server/app/api/events/route.js.nft.json +1 -1
  61. package/web/.next/standalone/packages/web/.next/server/app/api/executor/health/route.js +2 -2
  62. package/web/.next/standalone/packages/web/.next/server/app/api/executor/health/route.js.nft.json +1 -1
  63. package/web/.next/standalone/packages/web/.next/server/app/api/filesystem/directory/route.js +2 -2
  64. package/web/.next/standalone/packages/web/.next/server/app/api/filesystem/directory/route.js.nft.json +1 -1
  65. package/web/.next/standalone/packages/web/.next/server/app/api/filesystem/pick-directory/route.js +2 -2
  66. package/web/.next/standalone/packages/web/.next/server/app/api/filesystem/pick-directory/route.js.nft.json +1 -1
  67. package/web/.next/standalone/packages/web/.next/server/app/api/github/repos/route.js +2 -2
  68. package/web/.next/standalone/packages/web/.next/server/app/api/github/repos/route.js.nft.json +1 -1
  69. package/web/.next/standalone/packages/web/.next/server/app/api/github/webhook/route.js +2 -2
  70. package/web/.next/standalone/packages/web/.next/server/app/api/github/webhook/route.js.nft.json +1 -1
  71. package/web/.next/standalone/packages/web/.next/server/app/api/health/boards/route.js +2 -2
  72. package/web/.next/standalone/packages/web/.next/server/app/api/health/boards/route.js.nft.json +1 -1
  73. package/web/.next/standalone/packages/web/.next/server/app/api/health/sessions/route.js +2 -2
  74. package/web/.next/standalone/packages/web/.next/server/app/api/health/sessions/route.js.nft.json +1 -1
  75. package/web/.next/standalone/packages/web/.next/server/app/api/notifications/route.js +2 -2
  76. package/web/.next/standalone/packages/web/.next/server/app/api/notifications/route.js.nft.json +1 -1
  77. package/web/.next/standalone/packages/web/.next/server/app/api/preferences/route.js +2 -2
  78. package/web/.next/standalone/packages/web/.next/server/app/api/preferences/route.js.nft.json +1 -1
  79. package/web/.next/standalone/packages/web/.next/server/app/api/remote-access/route.js +2 -2
  80. package/web/.next/standalone/packages/web/.next/server/app/api/remote-access/route.js.nft.json +1 -1
  81. package/web/.next/standalone/packages/web/.next/server/app/api/repositories/[id]/route.js +2 -2
  82. package/web/.next/standalone/packages/web/.next/server/app/api/repositories/[id]/route.js.nft.json +1 -1
  83. package/web/.next/standalone/packages/web/.next/server/app/api/repositories/route.js +2 -2
  84. package/web/.next/standalone/packages/web/.next/server/app/api/repositories/route.js.nft.json +1 -1
  85. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/actions/route.js +2 -2
  86. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/actions/route.js.nft.json +1 -1
  87. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/archive/route.js +2 -2
  88. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/archive/route.js.nft.json +1 -1
  89. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/checks/route.js +2 -2
  90. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/checks/route.js.nft.json +1 -1
  91. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/diff/route.js +2 -2
  92. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/diff/route.js.nft.json +1 -1
  93. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feed/route.js +2 -2
  94. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feed/route.js.nft.json +1 -1
  95. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feed/stream/route.js +2 -2
  96. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feed/stream/route.js.nft.json +1 -1
  97. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feedback/route.js +2 -2
  98. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feedback/route.js.nft.json +1 -1
  99. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/files/route.js +2 -2
  100. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/files/route.js.nft.json +1 -1
  101. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/interrupt/route.js +2 -2
  102. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/interrupt/route.js.nft.json +1 -1
  103. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/keys/route.js +2 -2
  104. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/keys/route.js.nft.json +1 -1
  105. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/kill/route.js +2 -2
  106. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/kill/route.js.nft.json +1 -1
  107. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/route.js +2 -2
  108. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/route.js.nft.json +1 -1
  109. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/stream/route.js +2 -2
  110. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/stream/route.js.nft.json +1 -1
  111. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/preview/dom/route.js +1 -1
  112. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/preview/dom/route.js.nft.json +1 -1
  113. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/preview/route.js +1 -1
  114. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/preview/route.js.nft.json +1 -1
  115. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/preview/screenshot/route.js +1 -1
  116. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/preview/screenshot/route.js.nft.json +1 -1
  117. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/restore/route.js +2 -2
  118. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/restore/route.js.nft.json +1 -1
  119. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/route.js +2 -2
  120. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -1
  121. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/send/route.js +2 -2
  122. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/send/route.js.nft.json +1 -1
  123. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/connection/route/app-paths-manifest.json +3 -0
  124. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/connection/route/build-manifest.json +11 -0
  125. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/connection/route/server-reference-manifest.json +4 -0
  126. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/connection/route.js +10 -0
  127. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/connection/route.js.map +5 -0
  128. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/connection/route.js.nft.json +1 -0
  129. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/connection/route_client-reference-manifest.js +2 -0
  130. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/snapshot/route/app-paths-manifest.json +3 -0
  131. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/snapshot/route/build-manifest.json +11 -0
  132. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/snapshot/route/server-reference-manifest.json +4 -0
  133. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/snapshot/route.js +10 -0
  134. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/snapshot/route.js.map +5 -0
  135. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/snapshot/route.js.nft.json +1 -0
  136. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/snapshot/route_client-reference-manifest.js +2 -0
  137. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/route.js +2 -2
  138. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/route.js.nft.json +1 -1
  139. package/web/.next/standalone/packages/web/.next/server/app/api/spawn/route.js +2 -2
  140. package/web/.next/standalone/packages/web/.next/server/app/api/spawn/route.js.nft.json +1 -1
  141. package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/branches/route.js +2 -2
  142. package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/branches/route.js.nft.json +1 -1
  143. package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/route.js +2 -2
  144. package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/route.js.nft.json +1 -1
  145. package/web/.next/standalone/packages/web/.next/server/app/page/build-manifest.json +5 -5
  146. package/web/.next/standalone/packages/web/.next/server/app/page/react-loadable-manifest.json +4 -4
  147. package/web/.next/standalone/packages/web/.next/server/app/page/server-reference-manifest.json +7 -7
  148. package/web/.next/standalone/packages/web/.next/server/app/page.js +2 -2
  149. package/web/.next/standalone/packages/web/.next/server/app/page.js.nft.json +1 -1
  150. package/web/.next/standalone/packages/web/.next/server/app/page_client-reference-manifest.js +1 -1
  151. package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page/build-manifest.json +5 -5
  152. package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page/server-reference-manifest.json +7 -7
  153. package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page.js +2 -2
  154. package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page.js.nft.json +1 -1
  155. package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page_client-reference-manifest.js +1 -1
  156. package/web/.next/standalone/packages/web/.next/server/app/sign-in/[[...sign-in]]/page/build-manifest.json +5 -5
  157. package/web/.next/standalone/packages/web/.next/server/app/sign-in/[[...sign-in]]/page/server-reference-manifest.json +7 -7
  158. package/web/.next/standalone/packages/web/.next/server/app/sign-in/[[...sign-in]]/page.js.nft.json +1 -1
  159. package/web/.next/standalone/packages/web/.next/server/app/sign-in/[[...sign-in]]/page_client-reference-manifest.js +1 -1
  160. package/web/.next/standalone/packages/web/.next/server/app/unlock/page/build-manifest.json +5 -5
  161. package/web/.next/standalone/packages/web/.next/server/app/unlock/page/server-reference-manifest.json +14 -14
  162. package/web/.next/standalone/packages/web/.next/server/app/unlock/page.js.nft.json +1 -1
  163. package/web/.next/standalone/packages/web/.next/server/app/unlock/page_client-reference-manifest.js +1 -1
  164. package/web/.next/standalone/packages/web/.next/server/app-paths-manifest.json +2 -0
  165. package/web/.next/standalone/packages/web/.next/server/chunks/26076_server_app_api_sessions_[id]_terminal_connection_route_actions_46c114ee.js +3 -0
  166. package/web/.next/standalone/packages/web/.next/server/chunks/26076_server_app_api_sessions_[id]_terminal_snapshot_route_actions_cfb4de43.js +3 -0
  167. package/web/.next/standalone/packages/web/.next/server/chunks/730ea_web__next-internal_server_app_api_sessions_[id]_restore_route_actions_41a4c356.js +1 -1
  168. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__b716459f._.js → [root-of-the-server]__08556fc3._.js} +2 -2
  169. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__624bcdc9._.js → [root-of-the-server]__0e496df1._.js} +2 -2
  170. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__9bf61231._.js → [root-of-the-server]__115b433b._.js} +2 -2
  171. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__70929198._.js → [root-of-the-server]__120a0868._.js} +2 -2
  172. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__17d710ef._.js → [root-of-the-server]__1a623333._.js} +2 -2
  173. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__262e987e._.js +1 -1
  174. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__31053ac2._.js → [root-of-the-server]__2713bac9._.js} +2 -2
  175. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__8c576b6a._.js → [root-of-the-server]__2798ac7c._.js} +2 -2
  176. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__747e6415._.js → [root-of-the-server]__27b2bd14._.js} +2 -2
  177. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__a4b1a94c._.js → [root-of-the-server]__29d94573._.js} +2 -2
  178. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__732fc06e._.js → [root-of-the-server]__2b59cba9._.js} +2 -2
  179. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__2ce39d51._.js +1 -1
  180. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__3e507276._.js → [root-of-the-server]__2fea4a4c._.js} +2 -2
  181. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__59635ca5._.js → [root-of-the-server]__36559d88._.js} +2 -2
  182. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__f0ec1021._.js → [root-of-the-server]__4117784b._.js} +2 -2
  183. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__543bc377._.js → [root-of-the-server]__43b35d39._.js} +2 -2
  184. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__ba70a88e._.js → [root-of-the-server]__444bf146._.js} +2 -2
  185. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__fd0a681b._.js → [root-of-the-server]__45483f4b._.js} +2 -2
  186. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__98f4a7bd._.js → [root-of-the-server]__4644a89e._.js} +2 -2
  187. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__4c78886c._.js +3 -0
  188. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__e7aaee2d._.js → [root-of-the-server]__4cea5dca._.js} +2 -2
  189. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__33494588._.js → [root-of-the-server]__575c7392._.js} +2 -2
  190. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__eae97345._.js → [root-of-the-server]__57605af7._.js} +2 -2
  191. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__be233a9f._.js → [root-of-the-server]__57c8ca1a._.js} +2 -2
  192. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__5e2b35cd._.js +3 -0
  193. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__8ace49d1._.js → [root-of-the-server]__5f5433df._.js} +2 -2
  194. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6313c91e._.js +3 -3
  195. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__3dc4c761._.js → [root-of-the-server]__6a8b5dc7._.js} +2 -2
  196. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__3318d8a1._.js → [root-of-the-server]__717081d9._.js} +2 -2
  197. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__ae73aa49._.js → [root-of-the-server]__75668566._.js} +2 -2
  198. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__b4039db5._.js → [root-of-the-server]__7a6210dc._.js} +2 -2
  199. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__34e636e5._.js → [root-of-the-server]__7ca5b93b._.js} +2 -2
  200. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__b53b70e7._.js → [root-of-the-server]__8462ddf1._.js} +2 -2
  201. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__3937a996._.js → [root-of-the-server]__9e363e9c._.js} +2 -2
  202. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__4c5f7cab._.js → [root-of-the-server]__a0467c5b._.js} +2 -2
  203. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__9576223c._.js → [root-of-the-server]__a8d68307._.js} +2 -2
  204. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__82e86bb6._.js → [root-of-the-server]__ac79a67b._.js} +2 -2
  205. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__bcd0c846._.js → [root-of-the-server]__af5be1d9._.js} +2 -2
  206. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__b3cd93ca._.js +3 -0
  207. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__540ebc7f._.js → [root-of-the-server]__b7314f2a._.js} +2 -2
  208. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__bb2675cd._.js → [root-of-the-server]__bcbc6330._.js} +2 -2
  209. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__fe4c1384._.js → [root-of-the-server]__bfbdd808._.js} +2 -2
  210. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__b00db558._.js → [root-of-the-server]__c205eff4._.js} +2 -2
  211. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__c455995a._.js → [root-of-the-server]__c39ceb71._.js} +2 -2
  212. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__c9cb9ac6._.js +3 -0
  213. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__cff9ddef._.js +1 -1
  214. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__7c87a52f._.js → [root-of-the-server]__d65b8403._.js} +2 -2
  215. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__eb6e6bb9._.js → [root-of-the-server]__d7b9cb55._.js} +2 -2
  216. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__53daf5c6._.js → [root-of-the-server]__df103a4a._.js} +2 -2
  217. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ea845f9f._.js +1 -1
  218. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__8ee7749b._.js → [root-of-the-server]__f5a16619._.js} +2 -2
  219. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__9940de77._.js → [root-of-the-server]__f62d8a1f._.js} +2 -2
  220. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__5df70a62._.js → [root-of-the-server]__f7c7ed71._.js} +2 -2
  221. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__520aa408._.js → [root-of-the-server]__fa5bbdc8._.js} +2 -2
  222. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__e385846c._.js → [root-of-the-server]__fed9223f._.js} +2 -2
  223. package/web/.next/standalone/packages/web/.next/server/chunks/_2c837d66._.js +5 -5
  224. package/web/.next/standalone/packages/web/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_eaad1f33.js +1 -1
  225. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__000b8c99._.js +1 -1
  226. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{[root-of-the-server]__4f387f9d._.js → [root-of-the-server]__10a850c6._.js} +2 -2
  227. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{[root-of-the-server]__7829c78d._.js → [root-of-the-server]__17f5cb6a._.js} +2 -2
  228. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__29d8d063._.js +1 -1
  229. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__3ea76517._.js +3 -0
  230. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{[root-of-the-server]__99387ae7._.js → [root-of-the-server]__6647f7ec._.js} +2 -2
  231. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{[root-of-the-server]__a509d17d._.js → [root-of-the-server]__9f45b36b._.js} +2 -2
  232. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{[root-of-the-server]__bc8d015f._.js → [root-of-the-server]__f8f50c0b._.js} +2 -2
  233. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_0e1412de._.js +1 -1
  234. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_230c0c14._.js +4 -4
  235. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_2b5578a1._.js +3 -0
  236. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{_b6d31783._.js → _532f707d._.js} +3 -3
  237. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_5571204d._.js +3 -0
  238. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_69e05fca._.js +1 -1
  239. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_6cfd06c2._.js +1 -1
  240. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_80efe193._.js +1 -1
  241. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{_a4a4deb7._.js → _9e7585e3._.js} +2 -2
  242. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_b214b154._.js +1 -1
  243. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_b8358e63._.js +3 -0
  244. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_c0f0e227._.js +1 -1
  245. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{_8982bbf3._.js → _de3b7194._.js} +2 -2
  246. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_f36ddaa9._.js +1 -1
  247. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{node_modules_@clerk_nextjs_dist_esm_app-router_743f164d._.js → node_modules_@clerk_nextjs_dist_esm_app-router_a9e633d8._.js} +2 -2
  248. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@clerk_nextjs_dist_esm_app-router_f33d83e6._.js +3 -0
  249. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@radix-ui_d03fdd57._.js +3 -0
  250. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@xterm_addon-fit_lib_addon-fit_mjs_9b7cb17b._.js +3 -0
  251. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@xterm_addon-search_lib_addon-search_mjs_8d69d9d7._.js +11 -0
  252. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@xterm_xterm_lib_xterm_mjs_a1a7b9e9._.js +20 -0
  253. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_afb6e107._.js +3 -0
  254. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_refresh-cw_50f1c1e7.js +3 -0
  255. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_next_dist_2df23979._.js +1 -1
  256. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_cd51dad4.js +2 -2
  257. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/packages_web_src_components_board_WorkspaceKanban_tsx_735b7999._.js +1 -1
  258. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/packages_web_src_components_sessions_SessionDetail_tsx_5fcad270._.js +6 -0
  259. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/packages_web_src_features_dashboard_DashboardClient_tsx_81ae42b0._.js +1 -1
  260. package/web/.next/standalone/packages/web/.next/server/functions-config-manifest.json +3 -1
  261. package/web/.next/standalone/packages/web/.next/server/middleware-build-manifest.js +5 -5
  262. package/web/.next/standalone/packages/web/.next/server/pages/404.html +1 -1
  263. package/web/.next/standalone/packages/web/.next/server/pages/500.html +2 -2
  264. package/web/.next/standalone/packages/web/.next/server/server-reference-manifest.js +1 -1
  265. package/web/.next/standalone/packages/web/.next/server/server-reference-manifest.json +15 -15
  266. package/web/.next/standalone/packages/web/.next/static/chunks/07be250784a6a689.js +1 -0
  267. package/web/.next/standalone/packages/web/.next/static/chunks/0866f5c380851a16.js +1 -0
  268. package/web/.next/standalone/packages/web/.next/static/chunks/0cdc18649f440c71.js +1 -0
  269. package/web/.next/standalone/packages/web/.next/static/chunks/0f7eb6d5a59ee3ae.js +1 -0
  270. package/web/.next/standalone/packages/web/.next/static/chunks/144b356fe7daff8d.js +1 -0
  271. package/web/.next/standalone/packages/web/.next/static/chunks/{c4c79d5d0b280aeb.js → 2f236954d6a65e12.js} +1 -1
  272. package/web/.next/standalone/packages/web/.next/static/chunks/3cdf839644f79d43.js +18 -0
  273. package/web/.next/standalone/packages/web/.next/static/chunks/5a4c4d4d5f30829b.css +3 -0
  274. package/web/.next/standalone/packages/web/.next/static/chunks/6850a6cda159c98d.js +1 -0
  275. package/web/.next/{static/chunks/06bdd070b8d25946.js → standalone/packages/web/.next/static/chunks/69be39811437728d.js} +1 -1
  276. package/web/.next/standalone/packages/web/.next/static/chunks/6cec31da5f555e99.js +1 -0
  277. package/web/.next/standalone/packages/web/.next/static/chunks/70d1e7a526f0f4e2.js +9 -0
  278. package/web/.next/standalone/packages/web/.next/static/chunks/{ba2aa8b54e912820.js → 723acbe92d3f9e7e.js} +1 -1
  279. package/web/.next/standalone/packages/web/.next/static/chunks/739c6f71243d76d8.js +1 -0
  280. package/web/.next/standalone/packages/web/.next/static/chunks/a6ec1ab37eb7b410.js +1 -0
  281. package/web/.next/standalone/packages/web/.next/static/chunks/af8bfb72187b7cbf.js +1 -0
  282. package/web/.next/standalone/packages/web/.next/static/chunks/b86b8884ddf84717.js +1 -0
  283. package/web/.next/standalone/packages/web/.next/static/chunks/c1b8a2d2c623a0dc.js +6 -0
  284. package/web/.next/standalone/packages/web/.next/static/chunks/c993a1a4204fce88.js +4 -0
  285. package/web/.next/standalone/packages/web/.next/static/chunks/ca3e38b4495a3d39.js +1 -0
  286. package/web/.next/standalone/packages/web/.next/static/chunks/{45bd2451c2b0790c.js → caf02f8136b16992.js} +2 -2
  287. package/web/.next/standalone/packages/web/.next/static/chunks/d4269c59429734ad.js +1 -0
  288. package/web/.next/{static/chunks/28eac764d6544827.js → standalone/packages/web/.next/static/chunks/e5bcec03f80af56a.js} +1 -1
  289. package/web/.next/standalone/packages/web/.next/static/chunks/{turbopack-49f4119854e8206e.js → turbopack-26870d017b23fcf0.js} +1 -1
  290. package/web/.next/standalone/packages/web/next.config.ts +16 -0
  291. package/web/.next/standalone/packages/web/package.json +3 -1
  292. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/terminal/connection/route.ts +64 -0
  293. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/terminal/snapshot/route.ts +14 -0
  294. package/web/.next/standalone/packages/web/src/app/globals.css +12 -4
  295. package/web/.next/standalone/packages/web/src/components/Dashboard.tsx +1 -5
  296. package/web/.next/standalone/packages/web/src/components/TerminalView.tsx +528 -100
  297. package/web/.next/standalone/packages/web/src/components/board/WorkspaceKanban.tsx +3 -3
  298. package/web/.next/standalone/packages/web/src/components/layout/AppShell.tsx +3 -3
  299. package/web/.next/standalone/packages/web/src/components/layout/Sidebar.tsx +29 -18
  300. package/web/.next/standalone/packages/web/src/components/layout/TopBar.tsx +3 -3
  301. package/web/.next/standalone/packages/web/src/components/sessions/ChatPanel.tsx +61 -5
  302. package/web/.next/standalone/packages/web/src/components/sessions/SessionDetail.tsx +99 -46
  303. package/web/.next/standalone/packages/web/src/components/sessions/SessionPreview.tsx +231 -233
  304. package/web/.next/standalone/packages/web/src/components/sessions/SessionTerminal.tsx +1212 -0
  305. package/web/.next/standalone/packages/web/src/components/sessions/terminalInsert.ts +6 -0
  306. package/web/.next/standalone/packages/web/src/components/terminal/xtermTheme.ts +70 -0
  307. package/web/.next/standalone/packages/web/src/components/ui/Tabs.tsx +2 -2
  308. package/web/.next/standalone/packages/web/src/features/dashboard/DashboardClient.tsx +104 -31
  309. package/web/.next/standalone/packages/web/src/features/sessions/SessionPageClient.tsx +2 -2
  310. package/web/.next/standalone/packages/web/src/lib/devPreviewBrowser.ts +15 -3
  311. package/web/.next/static/chunks/07be250784a6a689.js +1 -0
  312. package/web/.next/static/chunks/0866f5c380851a16.js +1 -0
  313. package/web/.next/static/chunks/0cdc18649f440c71.js +1 -0
  314. package/web/.next/static/chunks/0f7eb6d5a59ee3ae.js +1 -0
  315. package/web/.next/static/chunks/144b356fe7daff8d.js +1 -0
  316. package/web/.next/static/chunks/{c4c79d5d0b280aeb.js → 2f236954d6a65e12.js} +1 -1
  317. package/web/.next/static/chunks/3cdf839644f79d43.js +18 -0
  318. package/web/.next/static/chunks/5a4c4d4d5f30829b.css +3 -0
  319. package/web/.next/static/chunks/6850a6cda159c98d.js +1 -0
  320. package/web/.next/{standalone/packages/web/.next/static/chunks/06bdd070b8d25946.js → static/chunks/69be39811437728d.js} +1 -1
  321. package/web/.next/static/chunks/6cec31da5f555e99.js +1 -0
  322. package/web/.next/static/chunks/70d1e7a526f0f4e2.js +9 -0
  323. package/web/.next/static/chunks/{ba2aa8b54e912820.js → 723acbe92d3f9e7e.js} +1 -1
  324. package/web/.next/static/chunks/739c6f71243d76d8.js +1 -0
  325. package/web/.next/static/chunks/a6ec1ab37eb7b410.js +1 -0
  326. package/web/.next/static/chunks/af8bfb72187b7cbf.js +1 -0
  327. package/web/.next/static/chunks/b86b8884ddf84717.js +1 -0
  328. package/web/.next/static/chunks/c1b8a2d2c623a0dc.js +6 -0
  329. package/web/.next/static/chunks/c993a1a4204fce88.js +4 -0
  330. package/web/.next/static/chunks/ca3e38b4495a3d39.js +1 -0
  331. package/web/.next/static/chunks/{45bd2451c2b0790c.js → caf02f8136b16992.js} +2 -2
  332. package/web/.next/static/chunks/d4269c59429734ad.js +1 -0
  333. package/web/.next/{standalone/packages/web/.next/static/chunks/28eac764d6544827.js → static/chunks/e5bcec03f80af56a.js} +1 -1
  334. package/web/.next/static/chunks/{turbopack-49f4119854e8206e.js → turbopack-26870d017b23fcf0.js} +1 -1
  335. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__29091976._.js +0 -3
  336. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__784e6aef._.js +0 -3
  337. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__b388693f._.js +0 -3
  338. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__d1efcbf0._.js +0 -3
  339. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_e1c18705._.js +0 -3
  340. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@clerk_nextjs_dist_esm_app-router_2a090a71._.js +0 -3
  341. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@radix-ui_02f0d3f0._.js +0 -3
  342. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_message-square_2e76b8d9.js +0 -3
  343. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/packages_web_src_components_ui_Tooltip_tsx_6becc8ca._.js +0 -3
  344. package/web/.next/standalone/packages/web/.next/static/chunks/07f3b9a104ce0ff4.js +0 -1
  345. package/web/.next/standalone/packages/web/.next/static/chunks/1004422d31074d62.js +0 -1
  346. package/web/.next/standalone/packages/web/.next/static/chunks/25afa19789883705.js +0 -6
  347. package/web/.next/standalone/packages/web/.next/static/chunks/2bc11b604b131190.js +0 -1
  348. package/web/.next/standalone/packages/web/.next/static/chunks/30ababddac1b82dc.js +0 -1
  349. package/web/.next/standalone/packages/web/.next/static/chunks/64f0033534ca1ad3.css +0 -3
  350. package/web/.next/standalone/packages/web/.next/static/chunks/902a6ba5837e1e57.js +0 -1
  351. package/web/.next/standalone/packages/web/.next/static/chunks/a28bcda8dd6b68ee.js +0 -1
  352. package/web/.next/standalone/packages/web/.next/static/chunks/aabc80195233b4da.js +0 -1
  353. package/web/.next/standalone/packages/web/.next/static/chunks/b6069d0eb07a978f.js +0 -1
  354. package/web/.next/standalone/packages/web/.next/static/chunks/c2caa064748bb0b5.js +0 -1
  355. package/web/.next/standalone/packages/web/.next/static/chunks/c5f8e486166298c2.js +0 -1
  356. package/web/.next/standalone/packages/web/.next/static/chunks/d6a81d2f8b98b4be.js +0 -1
  357. package/web/.next/standalone/packages/web/.next/static/chunks/dfa8ef24e636ca14.js +0 -1
  358. package/web/.next/standalone/packages/web/.next/static/chunks/e9d0e95bbaa0f4fb.js +0 -1
  359. package/web/.next/standalone/packages/web/.next/static/chunks/ebaa0c535c4135f1.js +0 -1
  360. package/web/.next/static/chunks/07f3b9a104ce0ff4.js +0 -1
  361. package/web/.next/static/chunks/1004422d31074d62.js +0 -1
  362. package/web/.next/static/chunks/25afa19789883705.js +0 -6
  363. package/web/.next/static/chunks/2bc11b604b131190.js +0 -1
  364. package/web/.next/static/chunks/30ababddac1b82dc.js +0 -1
  365. package/web/.next/static/chunks/64f0033534ca1ad3.css +0 -3
  366. package/web/.next/static/chunks/902a6ba5837e1e57.js +0 -1
  367. package/web/.next/static/chunks/a28bcda8dd6b68ee.js +0 -1
  368. package/web/.next/static/chunks/aabc80195233b4da.js +0 -1
  369. package/web/.next/static/chunks/b6069d0eb07a978f.js +0 -1
  370. package/web/.next/static/chunks/c2caa064748bb0b5.js +0 -1
  371. package/web/.next/static/chunks/c5f8e486166298c2.js +0 -1
  372. package/web/.next/static/chunks/d6a81d2f8b98b4be.js +0 -1
  373. package/web/.next/static/chunks/dfa8ef24e636ca14.js +0 -1
  374. package/web/.next/static/chunks/e9d0e95bbaa0f4fb.js +0 -1
  375. package/web/.next/static/chunks/ebaa0c535c4135f1.js +0 -1
  376. /package/web/.next/standalone/packages/web/.next/static/{EKHFeqSnbpFbCnV8AGVjm → dzgjDKuem6HLwWyK0KMG4}/_buildManifest.js +0 -0
  377. /package/web/.next/standalone/packages/web/.next/static/{EKHFeqSnbpFbCnV8AGVjm → dzgjDKuem6HLwWyK0KMG4}/_clientMiddlewareManifest.json +0 -0
  378. /package/web/.next/standalone/packages/web/.next/static/{EKHFeqSnbpFbCnV8AGVjm → dzgjDKuem6HLwWyK0KMG4}/_ssgManifest.js +0 -0
  379. /package/web/.next/static/{EKHFeqSnbpFbCnV8AGVjm → dzgjDKuem6HLwWyK0KMG4}/_buildManifest.js +0 -0
  380. /package/web/.next/static/{EKHFeqSnbpFbCnV8AGVjm → dzgjDKuem6HLwWyK0KMG4}/_clientMiddlewareManifest.json +0 -0
  381. /package/web/.next/static/{EKHFeqSnbpFbCnV8AGVjm → dzgjDKuem6HLwWyK0KMG4}/_ssgManifest.js +0 -0
@@ -1865,7 +1865,7 @@ export function WorkspaceKanban({
1865
1865
  router.push(
1866
1866
  `/sessions/${encodeURIComponent(
1867
1867
  primaryLinkedSession.id
1868
- )}?tab=chat`
1868
+ )}`
1869
1869
  )
1870
1870
  }
1871
1871
  className="flex w-full items-center justify-between gap-2 rounded-[3px] border border-[rgba(255,255,255,0.05)] bg-[rgba(255,255,255,0.03)] px-2 py-1.5 text-left hover:bg-[var(--vk-bg-hover)]"
@@ -1921,7 +1921,7 @@ export function WorkspaceKanban({
1921
1921
  router.push(
1922
1922
  `/sessions/${encodeURIComponent(
1923
1923
  session.id
1924
- )}?tab=chat`
1924
+ )}`
1925
1925
  )
1926
1926
  }
1927
1927
  className="flex w-full items-center justify-between gap-2 rounded-[3px] px-2 py-1.5 text-left hover:bg-[var(--vk-bg-hover)]"
@@ -1962,7 +1962,7 @@ export function WorkspaceKanban({
1962
1962
  router.push(
1963
1963
  `/sessions/${encodeURIComponent(
1964
1964
  unresolvedPrimaryLink
1965
- )}?tab=chat`
1965
+ )}`
1966
1966
  )
1967
1967
  }
1968
1968
  className="flex w-full items-center justify-between gap-2 rounded-[3px] px-2 py-1.5 text-left hover:bg-[var(--vk-bg-hover)]"
@@ -75,7 +75,7 @@ export function AppShell({
75
75
  return (
76
76
  <div
77
77
  style={shellStyle}
78
- className="relative flex h-dvh min-h-[100dvh] w-full max-w-full overflow-hidden bg-[var(--vk-bg-main)] text-[var(--vk-text-normal)]"
78
+ className="relative flex h-dvh min-h-[100dvh] w-full max-w-full overflow-hidden bg-[var(--vk-bg-main)] text-[var(--vk-text-normal)] [padding-top:env(safe-area-inset-top)] [padding-bottom:env(safe-area-inset-bottom)]"
79
79
  >
80
80
  {mobileSidebarOpen && (
81
81
  <button
@@ -88,7 +88,7 @@ export function AppShell({
88
88
 
89
89
  <aside
90
90
  className={cn(
91
- "absolute inset-y-0 left-0 z-30 flex h-full w-[min(90vw,var(--workspace-sidebar-width))] flex-col border-r border-[var(--vk-border)] bg-[var(--vk-bg-panel)] transition-[transform,width] duration-200",
91
+ "absolute inset-y-0 left-0 z-30 flex h-full w-full max-w-none flex-col border-r border-[var(--vk-border)] bg-[var(--vk-bg-panel)] transition-[transform,width] duration-200 sm:w-[min(90vw,var(--workspace-sidebar-width))] sm:max-w-[28rem]",
92
92
  mobileSidebarOpen ? "translate-x-0" : "-translate-x-full",
93
93
  desktopSidebarOpen
94
94
  ? "lg:w-[var(--workspace-sidebar-width)]"
@@ -125,7 +125,7 @@ export function AppShell({
125
125
  <button
126
126
  type="button"
127
127
  onClick={onToggleSidebar}
128
- className="absolute left-2 top-2 z-40 inline-flex h-7 w-7 items-center justify-center rounded-[4px] border border-[var(--vk-border)] bg-[var(--vk-bg-panel)] text-[var(--vk-text-muted)] hover:bg-[var(--vk-bg-hover)] lg:hidden"
128
+ className="absolute left-2 top-2 z-40 inline-flex h-8 w-8 items-center justify-center rounded-[6px] border border-[var(--vk-border)] bg-[var(--vk-bg-panel)] text-[var(--vk-text-muted)] shadow-[0_10px_24px_rgba(0,0,0,0.28)] hover:bg-[var(--vk-bg-hover)] lg:hidden"
129
129
  aria-label="Open workspace panel"
130
130
  >
131
131
  <PanelLeftOpen className="h-5 w-5" />
@@ -218,11 +218,11 @@ function SessionDiffBadge({
218
218
  return (
219
219
  <span
220
220
  className={cn(
221
- "shrink-0 rounded-[10px] px-3 py-1.5 font-mono text-[12px] leading-none tabular-nums",
221
+ "inline-flex shrink-0 items-center rounded-[10px] px-3 py-1.5 font-mono text-[12px] leading-none tabular-nums",
222
222
  isSelected ? "bg-[rgba(255,255,255,0.1)]" : "bg-[rgba(255,255,255,0.06)]",
223
223
  )}
224
224
  >
225
- <span className="flex items-center gap-3">
225
+ <span className="inline-flex items-center gap-3">
226
226
  <span className="text-[#18c58f]">+{additions}</span>
227
227
  <span className="text-[#f26d6d]">−{deletions}</span>
228
228
  </span>
@@ -296,36 +296,35 @@ export function Sidebar({
296
296
  }, [filtered]);
297
297
 
298
298
  useEffect(() => {
299
- const controller = new AbortController();
299
+ let cancelled = false;
300
300
  const sessionsToFetch = orderedSessions.filter((session) => {
301
301
  const cacheKey = getSessionDiffCacheKey(session);
302
302
  return diffStatsBySessionId[session.id]?.key !== cacheKey;
303
303
  });
304
304
 
305
305
  if (sessionsToFetch.length === 0) {
306
- return () => controller.abort();
306
+ return () => {
307
+ cancelled = true;
308
+ };
307
309
  }
308
310
 
309
311
  void Promise.all(
310
312
  sessionsToFetch.map(async (session) => {
311
313
  const cacheKey = getSessionDiffCacheKey(session);
312
314
  try {
313
- const response = await fetch(`/api/sessions/${encodeURIComponent(session.id)}/diff`, {
314
- signal: controller.signal,
315
- });
315
+ const response = await fetch(`/api/sessions/${encodeURIComponent(session.id)}/diff`);
316
316
  if (!response.ok) {
317
317
  return [session.id, { key: cacheKey, stats: null }] as const;
318
318
  }
319
319
  const payload = await response.json();
320
320
  return [session.id, { key: cacheKey, stats: parseSessionDiffPayload(payload) }] as const;
321
321
  } catch (error) {
322
- if ((error as Error).name === "AbortError") {
323
- return null;
324
- }
322
+ console.error("Failed to load session diff stats", error);
325
323
  return [session.id, { key: cacheKey, stats: null }] as const;
326
324
  }
327
325
  }),
328
326
  ).then((entries) => {
327
+ if (cancelled) return;
329
328
  const resolvedEntries = entries.filter((entry): entry is readonly [string, SessionDiffStatsCacheEntry] => entry !== null);
330
329
  if (resolvedEntries.length === 0) return;
331
330
  setDiffStatsBySessionId((current) => {
@@ -337,7 +336,9 @@ export function Sidebar({
337
336
  });
338
337
  });
339
338
 
340
- return () => controller.abort();
339
+ return () => {
340
+ cancelled = true;
341
+ };
341
342
  }, [diffStatsBySessionId, orderedSessions]);
342
343
 
343
344
  return (
@@ -381,7 +382,10 @@ export function Sidebar({
381
382
  const statusBadge = getStatusBadge(session, level);
382
383
  const sessionAgent = getSessionAgent(session);
383
384
  const isSelected = session.id === selectedId;
384
- const isRunning = level === "working";
385
+ const isRunning = session.activity === "active"
386
+ || session.status === "spawning"
387
+ || session.status === "running"
388
+ || session.status === "working";
385
389
  const isArchiving = archivingId === session.id;
386
390
  const hasArchiveError = archiveError === session.id;
387
391
 
@@ -402,7 +406,7 @@ export function Sidebar({
402
406
  <SessionRuntimeIcon running={isRunning} />
403
407
 
404
408
  <span className="min-w-0 flex-1">
405
- <span className="flex items-start gap-2">
409
+ <span className="flex min-w-0 items-start gap-2">
406
410
  <span className="min-w-0 flex flex-1 items-center gap-2">
407
411
  {sessionAgent ? (
408
412
  <span
@@ -418,11 +422,18 @@ export function Sidebar({
418
422
  </span>
419
423
  </span>
420
424
  {diffStats ? (
421
- <SessionDiffBadge
422
- additions={diffStats.additions}
423
- deletions={diffStats.deletions}
424
- isSelected={isSelected}
425
- />
425
+ <>
426
+ <span className="hidden shrink-0 sm:block">
427
+ <SessionDiffBadge
428
+ additions={diffStats.additions}
429
+ deletions={diffStats.deletions}
430
+ isSelected={isSelected}
431
+ />
432
+ </span>
433
+ <span className="shrink-0 rounded-[8px] bg-[rgba(255,255,255,0.06)] px-2.5 py-1 text-[11px] font-medium sm:hidden">
434
+ <span className={statusBadge.className}>{statusBadge.label}</span>
435
+ </span>
436
+ </>
426
437
  ) : (
427
438
  <span className="shrink-0 rounded-[8px] bg-[rgba(255,255,255,0.06)] px-2.5 py-1 text-[11px] font-medium">
428
439
  <span className={statusBadge.className}>{statusBadge.label}</span>
@@ -10,8 +10,8 @@ interface TopBarProps {
10
10
 
11
11
  export const TopBar = memo(function TopBar({ title, onOpenPreferences }: TopBarProps) {
12
12
  return (
13
- <header className="flex h-12 items-center border-b border-[var(--vk-border)] bg-[var(--vk-bg-panel)] px-4 text-[13px] text-[var(--vk-text-muted)] sm:h-14 sm:px-5 sm:text-[14px]">
14
- <div className="min-w-0 flex-1 text-center">
13
+ <header className="flex h-11 items-center border-b border-[var(--vk-border)] bg-[var(--vk-bg-panel)] pl-12 pr-3 text-[13px] text-[var(--vk-text-muted)] sm:h-14 sm:px-5 sm:text-[14px]">
14
+ <div className="min-w-0 flex-1 text-left sm:text-center">
15
15
  <span className="block truncate font-medium tracking-[0.01em] text-[var(--vk-text-normal)]">
16
16
  {title ?? "All Projects"}
17
17
  </span>
@@ -21,7 +21,7 @@ export const TopBar = memo(function TopBar({ title, onOpenPreferences }: TopBarP
21
21
  <button
22
22
  type="button"
23
23
  onClick={onOpenPreferences}
24
- className="inline-flex h-8 w-8 items-center justify-center rounded-[6px] text-[var(--vk-text-muted)] hover:bg-[var(--vk-bg-hover)] hover:text-[var(--vk-text-normal)]"
24
+ className="inline-flex h-9 w-9 items-center justify-center rounded-[6px] text-[var(--vk-text-muted)] hover:bg-[var(--vk-bg-hover)] hover:text-[var(--vk-text-normal)]"
25
25
  aria-label="Open preferences"
26
26
  title="Preferences"
27
27
  >
@@ -4,6 +4,7 @@ import { useRouter } from "next/navigation";
4
4
  import {
5
5
  useCallback,
6
6
  useEffect,
7
+ useLayoutEffect,
7
8
  useMemo,
8
9
  useRef,
9
10
  useState,
@@ -1347,10 +1348,12 @@ export function ChatPanel({
1347
1348
 
1348
1349
  const endRef = useRef<HTMLDivElement | null>(null);
1349
1350
  const scrollContainerRef = useRef<HTMLDivElement | null>(null);
1351
+ const composerRef = useRef<HTMLTextAreaElement | null>(null);
1350
1352
  const fileInputRef = useRef<HTMLInputElement | null>(null);
1351
1353
  const modelMenuRef = useRef<HTMLDivElement | null>(null);
1352
1354
  const reasoningMenuRef = useRef<HTMLDivElement | null>(null);
1353
1355
  const shouldStickToBottomRef = useRef(true);
1356
+ const previousScrollTopRef = useRef(0);
1354
1357
  const normalizedAgentName = agentName?.trim() || "";
1355
1358
  const normalizedSessionStatus = sessionStatus?.trim().toLowerCase() ?? "";
1356
1359
  const runtimeCatalog = useMemo(
@@ -1466,6 +1469,10 @@ export function ChatPanel({
1466
1469
  [displayEntries],
1467
1470
  );
1468
1471
 
1472
+ const normalizeWhitespaceOnlyDraft = useCallback(() => {
1473
+ setMessage((current) => (current.trim().length === 0 ? "" : current));
1474
+ }, []);
1475
+
1469
1476
  const updateBottomStickiness = useCallback(() => {
1470
1477
  const container = scrollContainerRef.current;
1471
1478
  if (!container) {
@@ -1473,26 +1480,66 @@ export function ChatPanel({
1473
1480
  return;
1474
1481
  }
1475
1482
 
1483
+ previousScrollTopRef.current = container.scrollTop;
1476
1484
  const distanceFromBottom = container.scrollHeight - container.scrollTop - container.clientHeight;
1477
- shouldStickToBottomRef.current = distanceFromBottom <= 80;
1485
+ shouldStickToBottomRef.current = distanceFromBottom <= 16;
1478
1486
  }, []);
1479
1487
 
1480
1488
  const scrollToBottom = useCallback((behavior: ScrollBehavior) => {
1481
1489
  shouldStickToBottomRef.current = true;
1482
- if (typeof window === "undefined") {
1490
+ const container = scrollContainerRef.current;
1491
+ if (!container) {
1483
1492
  endRef.current?.scrollIntoView({ behavior, block: "end" });
1484
1493
  return;
1485
1494
  }
1486
1495
 
1487
1496
  window.requestAnimationFrame(() => {
1488
- endRef.current?.scrollIntoView({ behavior, block: "end" });
1497
+ container.scrollTo({
1498
+ top: container.scrollHeight,
1499
+ behavior,
1500
+ });
1489
1501
  });
1490
1502
  }, []);
1491
1503
 
1492
1504
  useEffect(() => {
1493
1505
  shouldStickToBottomRef.current = true;
1506
+ previousScrollTopRef.current = 0;
1494
1507
  }, [sessionId]);
1495
1508
 
1509
+ useLayoutEffect(() => {
1510
+ const container = scrollContainerRef.current;
1511
+ if (!container) {
1512
+ return;
1513
+ }
1514
+
1515
+ if (shouldStickToBottomRef.current) {
1516
+ previousScrollTopRef.current = container.scrollTop;
1517
+ return;
1518
+ }
1519
+
1520
+ container.scrollTop = previousScrollTopRef.current;
1521
+ }, [feedItems, hasStreamingEntry, parserState, runtimeStatus, sending]);
1522
+
1523
+ useEffect(() => {
1524
+ const handleVisibilityChange = () => {
1525
+ if (document.hidden) {
1526
+ return;
1527
+ }
1528
+ normalizeWhitespaceOnlyDraft();
1529
+ };
1530
+
1531
+ const handleWindowFocus = () => {
1532
+ normalizeWhitespaceOnlyDraft();
1533
+ };
1534
+
1535
+ document.addEventListener("visibilitychange", handleVisibilityChange);
1536
+ window.addEventListener("focus", handleWindowFocus);
1537
+ return () => {
1538
+ document.removeEventListener("visibilitychange", handleVisibilityChange);
1539
+ window.removeEventListener("focus", handleWindowFocus);
1540
+ };
1541
+ }, [normalizeWhitespaceOnlyDraft]);
1542
+
1496
1543
  const prevEntryCountRef = useRef(0);
1497
1544
  useEffect(() => {
1498
1545
  const count = displayEntries.length;
@@ -1606,7 +1653,7 @@ export function ChatPanel({
1606
1653
  setMessage("");
1607
1654
  setAttachments([]);
1608
1655
  if (data?.sessionId && data.sessionId !== sessionId) {
1609
- router.push(`/sessions/${encodeURIComponent(data.sessionId)}?tab=chat`);
1656
+ router.push(`/sessions/${encodeURIComponent(data.sessionId)}`);
1610
1657
  return;
1611
1658
  }
1612
1659
  await refresh();
@@ -1733,7 +1780,12 @@ export function ChatPanel({
1733
1780
  <div
1734
1781
  ref={scrollContainerRef}
1735
1782
  onScroll={updateBottomStickiness}
1736
- className="flex-1 overflow-y-auto px-3 pt-3 sm:px-4"
1783
+ onWheelCapture={(event) => {
1784
+ if (event.deltaY < 0) {
1785
+ shouldStickToBottomRef.current = false;
1786
+ }
1787
+ }}
1788
+ className="flex-1 overflow-y-auto px-3 pt-3 sm:px-4 [overflow-anchor:none]"
1737
1789
  >
1738
1790
  <div className="mx-auto flex w-full max-w-[768px] flex-col gap-5 pb-6">
1739
1791
  {loading && displayEntries.length === 0 ? (
@@ -1955,8 +2007,12 @@ export function ChatPanel({
1955
2007
 
1956
2008
  <div className="px-2 py-2">
1957
2009
  <textarea
2010
+ ref={composerRef}
1958
2011
  value={message}
1959
2012
  onChange={(event) => setMessage(event.target.value)}
2013
+ onFocus={() => {
2014
+ normalizeWhitespaceOnlyDraft();
2015
+ }}
1960
2016
  onKeyDown={handleComposerKeyDown}
1961
2017
  placeholder="Continue working on this task..."
1962
2018
  rows={1}
@@ -1,37 +1,51 @@
1
1
  "use client";
2
2
 
3
- import { useCallback, useMemo } from "react";
3
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
4
4
  import { usePathname, useRouter, useSearchParams } from "next/navigation";
5
5
  import {
6
6
  FileCode,
7
7
  Globe,
8
8
  LayoutDashboard,
9
- MessageSquare,
9
+ SquareTerminal,
10
10
  } from "lucide-react";
11
11
  import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/Tabs";
12
12
  import { Card, CardContent } from "@/components/ui/Card";
13
13
  import { Badge } from "@/components/ui/Badge";
14
14
  import { useSession } from "@/hooks/useSession";
15
- import { AgentTileIcon } from "@/components/AgentTileIcon";
16
15
  import { SessionOverview } from "./SessionOverview";
17
16
  import { SessionDiff } from "./SessionDiff";
18
- import { ChatPanel } from "./ChatPanel";
19
17
  import { SessionPreview } from "./SessionPreview";
18
+ import { SessionTerminal } from "./SessionTerminal";
19
+ import type { TerminalInsertRequest } from "./terminalInsert";
20
20
 
21
21
  interface SessionDetailProps {
22
22
  sessionId: string;
23
23
  }
24
24
 
25
- type SessionTab = "overview" | "chat" | "diff" | "preview";
25
+ type SessionTab = "overview" | "terminal" | "diff" | "preview";
26
26
 
27
27
  function resolveSessionTab(value: string | null): SessionTab {
28
- if (value === "overview" || value === "chat" || value === "diff" || value === "preview") {
28
+ if (value === "overview" || value === "terminal" || value === "diff" || value === "preview") {
29
29
  return value;
30
30
  }
31
- if (value === "terminal") {
32
- return "chat";
31
+ return "terminal";
32
+ }
33
+
34
+ function getCompactSessionStatusLabel(status: string): string {
35
+ switch (status) {
36
+ case "needs_input":
37
+ return "input";
38
+ case "working":
39
+ return "working";
40
+ case "running":
41
+ return "running";
42
+ case "spawning":
43
+ return "spawn";
44
+ case "queued":
45
+ return "queued";
46
+ default:
47
+ return status.replace(/[_-]+/g, " ");
33
48
  }
34
- return "chat";
35
49
  }
36
50
 
37
51
  export function SessionDetail({ sessionId }: SessionDetailProps) {
@@ -39,6 +53,9 @@ export function SessionDetail({ sessionId }: SessionDetailProps) {
39
53
  const router = useRouter();
40
54
  const searchParams = useSearchParams();
41
55
  const { session, loading, error } = useSession(sessionId);
56
+ const terminalInsertNonceRef = useRef(0);
57
+ const autoPreviewOpenedRef = useRef(false);
58
+ const [pendingTerminalInsert, setPendingTerminalInsert] = useState<TerminalInsertRequest | null>(null);
42
59
  const activeTab = useMemo(
43
60
  () => resolveSessionTab(searchParams.get("tab")),
44
61
  [searchParams],
@@ -46,7 +63,7 @@ export function SessionDetail({ sessionId }: SessionDetailProps) {
46
63
  const handleTabChange = useCallback((value: string) => {
47
64
  const nextTab = resolveSessionTab(value);
48
65
  const params = new URLSearchParams(searchParams.toString());
49
- if (nextTab === "chat") {
66
+ if (nextTab === "terminal") {
50
67
  params.delete("tab");
51
68
  } else {
52
69
  params.set("tab", nextTab);
@@ -55,6 +72,25 @@ export function SessionDetail({ sessionId }: SessionDetailProps) {
55
72
  const nextUrl = nextQuery.length > 0 ? `${pathname}?${nextQuery}` : pathname;
56
73
  router.replace(nextUrl, { scroll: false });
57
74
  }, [pathname, router, searchParams]);
75
+ const queueTerminalInsert = useCallback((request: Omit<TerminalInsertRequest, "nonce">) => {
76
+ terminalInsertNonceRef.current += 1;
77
+ setPendingTerminalInsert({
78
+ nonce: terminalInsertNonceRef.current,
79
+ ...request,
80
+ });
81
+ }, []);
82
+ useEffect(() => {
83
+ autoPreviewOpenedRef.current = false;
84
+ terminalInsertNonceRef.current = 0;
85
+ setPendingTerminalInsert(null);
86
+ }, [sessionId]);
87
+ const handlePreviewConnectionChange = useCallback((connected: boolean) => {
88
+ if (!connected || activeTab !== "terminal" || autoPreviewOpenedRef.current) {
89
+ return;
90
+ }
91
+ autoPreviewOpenedRef.current = true;
92
+ handleTabChange("preview");
93
+ }, [activeTab, handleTabChange]);
58
94
 
59
95
  if (loading) {
60
96
  return (
@@ -96,63 +132,80 @@ export function SessionDetail({ sessionId }: SessionDetailProps) {
96
132
  const agentName = session.metadata["agent"]?.trim() ?? "";
97
133
  const sessionModel = session.metadata["model"]?.trim() ?? "";
98
134
  const sessionReasoningEffort = session.metadata["reasoningEffort"]?.trim() ?? "";
135
+ const compactStatusLabel = getCompactSessionStatusLabel(status);
99
136
 
100
137
  return (
101
138
  <div className="flex h-full min-h-0 flex-col">
102
- <Tabs value={activeTab} onValueChange={handleTabChange} className="flex min-h-0 flex-1 flex-col gap-2 p-2 sm:p-3">
103
- <div className="flex min-w-0 flex-col gap-2 sm:flex-row sm:items-center">
104
- <TabsList className="w-full sm:w-fit">
105
- <TabsTrigger value="overview">
139
+ <Tabs key={sessionId} value={activeTab} onValueChange={handleTabChange} className="flex min-h-0 flex-1 flex-col gap-1.5 p-1.5 sm:gap-2 sm:p-3">
140
+ <div className="flex min-w-0 flex-col gap-1.5 sm:gap-2">
141
+ <TabsList className="grid w-full grid-cols-4 sm:w-fit sm:inline-flex">
142
+ <TabsTrigger value="overview" className="justify-center px-2 text-[11px] sm:px-2.5 sm:text-[12px]">
106
143
  <LayoutDashboard className="h-3.5 w-3.5" />
107
144
  Overview
108
145
  </TabsTrigger>
109
- <TabsTrigger value="chat">
110
- {agentName
111
- ? <AgentTileIcon seed={{ label: agentName }} className="h-6 w-6" />
112
- : <MessageSquare className="h-3.5 w-3.5" />}
113
- Chat
146
+ <TabsTrigger value="terminal" className="justify-center px-2 text-[11px] sm:px-2.5 sm:text-[12px]">
147
+ <SquareTerminal className="h-3.5 w-3.5" />
148
+ Terminal
114
149
  </TabsTrigger>
115
- <TabsTrigger value="preview">
150
+ <TabsTrigger value="preview" className="justify-center px-2 text-[11px] sm:px-2.5 sm:text-[12px]">
116
151
  <Globe className="h-3.5 w-3.5" />
117
152
  Preview
118
153
  </TabsTrigger>
119
- <TabsTrigger value="diff">
154
+ <TabsTrigger value="diff" className="justify-center px-2 text-[11px] sm:px-2.5 sm:text-[12px]">
120
155
  <FileCode className="h-3.5 w-3.5" />
121
156
  Diff
122
157
  </TabsTrigger>
123
158
  </TabsList>
124
- <div className="flex min-w-0 items-center gap-2">
125
- <Badge variant="outline" className="h-[23px]">
126
- {status}
159
+ <div className="flex min-w-0 items-center justify-between gap-2">
160
+ <Badge variant="outline" className="h-[23px] max-w-full">
161
+ <span className="sm:hidden">{compactStatusLabel}</span>
162
+ <span className="hidden sm:inline">{status}</span>
127
163
  </Badge>
128
- <span className="min-w-0 truncate font-mono text-[10px] text-[var(--vk-text-muted)]">{sessionId}</span>
164
+ <span className="font-mono text-[10px] text-[var(--vk-text-muted)] sm:hidden">{sessionId.slice(0, 6)}</span>
165
+ <span className="hidden min-w-0 truncate font-mono text-[10px] text-[var(--vk-text-muted)] sm:block">{sessionId}</span>
129
166
  </div>
130
167
  </div>
131
168
 
132
- <TabsContent value="overview" className="min-h-0 flex-1 overflow-auto">
133
- <SessionOverview session={session} />
134
- </TabsContent>
169
+ <div className="relative min-h-0 flex-1">
170
+ <TabsContent value="overview" className="min-h-0 h-full overflow-auto">
171
+ <SessionOverview key={sessionId} session={session} />
172
+ </TabsContent>
135
173
 
136
- <TabsContent value="chat" className="min-h-0 flex-1 overflow-hidden rounded-[3px] border border-[var(--vk-border)] bg-[#212121]">
137
- <ChatPanel
138
- sessionId={sessionId}
139
- agentName={agentName}
140
- projectId={session.projectId}
141
- sessionModel={sessionModel}
142
- sessionReasoningEffort={sessionReasoningEffort}
143
- />
144
- </TabsContent>
174
+ <TabsContent
175
+ value="terminal"
176
+ forceMount
177
+ className="min-h-0 h-full overflow-hidden rounded-[3px] border border-[var(--vk-border)] bg-[#212121] focus-visible:outline-none [&[hidden]]:block data-[state=inactive]:pointer-events-none data-[state=inactive]:absolute data-[state=inactive]:inset-0 data-[state=inactive]:invisible data-[state=inactive]:opacity-0"
178
+ >
179
+ <SessionTerminal
180
+ key={sessionId}
181
+ sessionId={sessionId}
182
+ agentName={agentName}
183
+ projectId={session.projectId}
184
+ sessionModel={sessionModel}
185
+ sessionReasoningEffort={sessionReasoningEffort}
186
+ sessionState={status}
187
+ active={activeTab === "terminal"}
188
+ pendingInsert={pendingTerminalInsert}
189
+ />
190
+ </TabsContent>
145
191
 
146
- <TabsContent value="preview" className="min-h-0 flex-1 overflow-auto">
147
- <SessionPreview
148
- sessionId={sessionId}
149
- projectId={session.projectId}
150
- />
151
- </TabsContent>
192
+ <TabsContent
193
+ value="preview"
194
+ forceMount
195
+ className="min-h-0 h-full overflow-auto focus-visible:outline-none [&[hidden]]:block data-[state=inactive]:pointer-events-none data-[state=inactive]:absolute data-[state=inactive]:inset-0 data-[state=inactive]:invisible data-[state=inactive]:opacity-0"
196
+ >
197
+ <SessionPreview
198
+ key={sessionId}
199
+ sessionId={sessionId}
200
+ onQueueTerminalInsert={queueTerminalInsert}
201
+ onConnectionChange={handlePreviewConnectionChange}
202
+ />
203
+ </TabsContent>
152
204
 
153
- <TabsContent value="diff" className="min-h-0 flex-1 overflow-auto">
154
- <SessionDiff sessionId={sessionId} />
155
- </TabsContent>
205
+ <TabsContent value="diff" className="min-h-0 h-full overflow-auto">
206
+ <SessionDiff key={sessionId} sessionId={sessionId} />
207
+ </TabsContent>
208
+ </div>
156
209
  </Tabs>
157
210
  </div>
158
211
  );