conductor-oss 0.2.15 → 0.2.16

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 (643) hide show
  1. package/node_modules/@conductor-oss/plugin-agent-amp/package.json +1 -1
  2. package/node_modules/@conductor-oss/plugin-agent-ccr/package.json +1 -1
  3. package/node_modules/@conductor-oss/plugin-agent-claude-code/package.json +1 -1
  4. package/node_modules/@conductor-oss/plugin-agent-codex/package.json +1 -1
  5. package/node_modules/@conductor-oss/plugin-agent-cursor-cli/package.json +1 -1
  6. package/node_modules/@conductor-oss/plugin-agent-droid/package.json +1 -1
  7. package/node_modules/@conductor-oss/plugin-agent-gemini/package.json +1 -1
  8. package/node_modules/@conductor-oss/plugin-agent-github-copilot/package.json +1 -1
  9. package/node_modules/@conductor-oss/plugin-agent-opencode/package.json +1 -1
  10. package/node_modules/@conductor-oss/plugin-agent-qwen-code/package.json +1 -1
  11. package/node_modules/@conductor-oss/plugin-mcp-server/package.json +1 -1
  12. package/node_modules/@conductor-oss/plugin-notifier-desktop/package.json +1 -1
  13. package/node_modules/@conductor-oss/plugin-notifier-discord/package.json +1 -1
  14. package/node_modules/@conductor-oss/plugin-runtime-tmux/package.json +1 -1
  15. package/node_modules/@conductor-oss/plugin-scm-github/package.json +1 -1
  16. package/node_modules/@conductor-oss/plugin-terminal-web/package.json +1 -1
  17. package/node_modules/@conductor-oss/plugin-tracker-github/package.json +1 -1
  18. package/node_modules/@conductor-oss/plugin-webhook/package.json +1 -1
  19. package/node_modules/@conductor-oss/plugin-workspace-worktree/package.json +1 -1
  20. package/package.json +21 -21
  21. package/web/.next/standalone/packages/web/.env.example +16 -0
  22. package/web/.next/standalone/packages/web/.next/BUILD_ID +1 -1
  23. package/web/.next/standalone/packages/web/.next/app-path-routes-manifest.json +30 -0
  24. package/web/.next/standalone/packages/web/.next/build-manifest.json +2 -2
  25. package/web/.next/standalone/packages/web/.next/prerender-manifest.json +3 -3
  26. package/web/.next/standalone/packages/web/.next/routes-manifest.json +204 -0
  27. package/web/.next/standalone/packages/web/.next/server/app/_global-error/page.js +2 -2
  28. package/web/.next/standalone/packages/web/.next/server/app/_global-error/page.js.nft.json +1 -1
  29. package/web/.next/standalone/packages/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  30. package/web/.next/standalone/packages/web/.next/server/app/_global-error.html +2 -2
  31. package/web/.next/standalone/packages/web/.next/server/app/_global-error.rsc +1 -1
  32. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  33. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  34. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  35. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  36. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  37. package/web/.next/standalone/packages/web/.next/server/app/_not-found/page/server-reference-manifest.json +7 -7
  38. package/web/.next/standalone/packages/web/.next/server/app/_not-found/page.js +2 -2
  39. package/web/.next/standalone/packages/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  40. package/web/.next/standalone/packages/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  41. package/web/.next/standalone/packages/web/.next/server/app/_not-found.html +1 -1
  42. package/web/.next/standalone/packages/web/.next/server/app/_not-found.rsc +3 -3
  43. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  44. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  45. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  46. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  47. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  48. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  49. package/web/.next/standalone/packages/web/.next/server/app/api/access/route/app-paths-manifest.json +3 -0
  50. package/web/.next/standalone/packages/web/.next/server/app/api/access/route/build-manifest.json +11 -0
  51. package/web/.next/standalone/packages/web/.next/server/app/api/access/route/server-reference-manifest.json +4 -0
  52. package/web/.next/standalone/packages/web/.next/server/app/api/access/route.js +11 -0
  53. package/web/.next/standalone/packages/web/.next/server/app/api/access/route.js.map +5 -0
  54. package/web/.next/standalone/packages/web/.next/server/app/api/access/route.js.nft.json +1 -0
  55. package/web/.next/standalone/packages/web/.next/server/app/api/access/route_client-reference-manifest.js +2 -0
  56. package/web/.next/standalone/packages/web/.next/server/app/api/agents/route.js +4 -3
  57. package/web/.next/standalone/packages/web/.next/server/app/api/agents/route.js.nft.json +1 -1
  58. package/web/.next/standalone/packages/web/.next/server/app/api/attachments/route/app-paths-manifest.json +3 -0
  59. package/web/.next/standalone/packages/web/.next/server/app/api/attachments/route/build-manifest.json +11 -0
  60. package/web/.next/standalone/packages/web/.next/server/app/api/attachments/route/server-reference-manifest.json +4 -0
  61. package/web/.next/standalone/packages/web/.next/server/app/api/attachments/route.js +10 -0
  62. package/web/.next/standalone/packages/web/.next/server/app/api/attachments/route.js.map +5 -0
  63. package/web/.next/standalone/packages/web/.next/server/app/api/attachments/route.js.nft.json +1 -0
  64. package/web/.next/standalone/packages/web/.next/server/app/api/attachments/route_client-reference-manifest.js +2 -0
  65. package/web/.next/standalone/packages/web/.next/server/app/api/auth/session/route/app-paths-manifest.json +3 -0
  66. package/web/.next/standalone/packages/web/.next/server/app/api/auth/session/route/build-manifest.json +11 -0
  67. package/web/.next/standalone/packages/web/.next/server/app/api/auth/session/route/server-reference-manifest.json +4 -0
  68. package/web/.next/standalone/packages/web/.next/server/app/api/auth/session/route.js +8 -0
  69. package/web/.next/standalone/packages/web/.next/server/app/api/auth/session/route.js.map +5 -0
  70. package/web/.next/standalone/packages/web/.next/server/app/api/auth/session/route.js.nft.json +1 -0
  71. package/web/.next/standalone/packages/web/.next/server/app/api/auth/session/route_client-reference-manifest.js +2 -0
  72. package/web/.next/standalone/packages/web/.next/server/app/api/boards/route/app-paths-manifest.json +3 -0
  73. package/web/.next/standalone/packages/web/.next/server/app/api/boards/route/build-manifest.json +11 -0
  74. package/web/.next/standalone/packages/web/.next/server/app/api/boards/route/server-reference-manifest.json +4 -0
  75. package/web/.next/standalone/packages/web/.next/server/app/api/boards/route.js +12 -0
  76. package/web/.next/standalone/packages/web/.next/server/app/api/boards/route.js.map +5 -0
  77. package/web/.next/standalone/packages/web/.next/server/app/api/boards/route.js.nft.json +1 -0
  78. package/web/.next/standalone/packages/web/.next/server/app/api/boards/route_client-reference-manifest.js +2 -0
  79. package/web/.next/standalone/packages/web/.next/server/app/api/config/route/app-paths-manifest.json +3 -0
  80. package/web/.next/standalone/packages/web/.next/server/app/api/config/route/build-manifest.json +11 -0
  81. package/web/.next/standalone/packages/web/.next/server/app/api/config/route/server-reference-manifest.json +4 -0
  82. package/web/.next/standalone/packages/web/.next/server/app/api/config/route.js +10 -0
  83. package/web/.next/standalone/packages/web/.next/server/app/api/config/route.js.map +5 -0
  84. package/web/.next/standalone/packages/web/.next/server/app/api/config/route.js.nft.json +1 -0
  85. package/web/.next/standalone/packages/web/.next/server/app/api/config/route_client-reference-manifest.js +2 -0
  86. package/web/.next/standalone/packages/web/.next/server/app/api/context-files/route/app-paths-manifest.json +3 -0
  87. package/web/.next/standalone/packages/web/.next/server/app/api/context-files/route/build-manifest.json +11 -0
  88. package/web/.next/standalone/packages/web/.next/server/app/api/context-files/route/server-reference-manifest.json +4 -0
  89. package/web/.next/standalone/packages/web/.next/server/app/api/context-files/route.js +10 -0
  90. package/web/.next/standalone/packages/web/.next/server/app/api/context-files/route.js.map +5 -0
  91. package/web/.next/standalone/packages/web/.next/server/app/api/context-files/route.js.nft.json +1 -0
  92. package/web/.next/standalone/packages/web/.next/server/app/api/context-files/route_client-reference-manifest.js +2 -0
  93. package/web/.next/standalone/packages/web/.next/server/app/api/events/route/app-paths-manifest.json +3 -0
  94. package/web/.next/standalone/packages/web/.next/server/app/api/events/route/build-manifest.json +11 -0
  95. package/web/.next/standalone/packages/web/.next/server/app/api/events/route/server-reference-manifest.json +4 -0
  96. package/web/.next/standalone/packages/web/.next/server/app/api/events/route.js +10 -0
  97. package/web/.next/standalone/packages/web/.next/server/app/api/events/route.js.map +5 -0
  98. package/web/.next/standalone/packages/web/.next/server/app/api/events/route.js.nft.json +1 -0
  99. package/web/.next/standalone/packages/web/.next/server/app/api/events/route_client-reference-manifest.js +2 -0
  100. package/web/.next/standalone/packages/web/.next/server/app/api/filesystem/directory/route/app-paths-manifest.json +3 -0
  101. package/web/.next/standalone/packages/web/.next/server/app/api/filesystem/directory/route/build-manifest.json +11 -0
  102. package/web/.next/standalone/packages/web/.next/server/app/api/filesystem/directory/route/server-reference-manifest.json +4 -0
  103. package/web/.next/standalone/packages/web/.next/server/app/api/filesystem/directory/route.js +10 -0
  104. package/web/.next/standalone/packages/web/.next/server/app/api/filesystem/directory/route.js.map +5 -0
  105. package/web/.next/standalone/packages/web/.next/server/app/api/filesystem/directory/route.js.nft.json +1 -0
  106. package/web/.next/standalone/packages/web/.next/server/app/api/filesystem/directory/route_client-reference-manifest.js +2 -0
  107. package/web/.next/standalone/packages/web/.next/server/app/api/github/repos/route/app-paths-manifest.json +3 -0
  108. package/web/.next/standalone/packages/web/.next/server/app/api/github/repos/route/build-manifest.json +11 -0
  109. package/web/.next/standalone/packages/web/.next/server/app/api/github/repos/route/server-reference-manifest.json +4 -0
  110. package/web/.next/standalone/packages/web/.next/server/app/api/github/repos/route.js +10 -0
  111. package/web/.next/standalone/packages/web/.next/server/app/api/github/repos/route.js.map +5 -0
  112. package/web/.next/standalone/packages/web/.next/server/app/api/github/repos/route.js.nft.json +1 -0
  113. package/web/.next/standalone/packages/web/.next/server/app/api/github/repos/route_client-reference-manifest.js +2 -0
  114. package/web/.next/standalone/packages/web/.next/server/app/api/health/boards/route/app-paths-manifest.json +3 -0
  115. package/web/.next/standalone/packages/web/.next/server/app/api/health/boards/route/build-manifest.json +11 -0
  116. package/web/.next/standalone/packages/web/.next/server/app/api/health/boards/route/server-reference-manifest.json +4 -0
  117. package/web/.next/standalone/packages/web/.next/server/app/api/health/boards/route.js +10 -0
  118. package/web/.next/standalone/packages/web/.next/server/app/api/health/boards/route.js.map +5 -0
  119. package/web/.next/standalone/packages/web/.next/server/app/api/health/boards/route.js.nft.json +1 -0
  120. package/web/.next/standalone/packages/web/.next/server/app/api/health/boards/route_client-reference-manifest.js +2 -0
  121. package/web/.next/standalone/packages/web/.next/server/app/api/health/sessions/route/app-paths-manifest.json +3 -0
  122. package/web/.next/standalone/packages/web/.next/server/app/api/health/sessions/route/build-manifest.json +11 -0
  123. package/web/.next/standalone/packages/web/.next/server/app/api/health/sessions/route/server-reference-manifest.json +4 -0
  124. package/web/.next/standalone/packages/web/.next/server/app/api/health/sessions/route.js +10 -0
  125. package/web/.next/standalone/packages/web/.next/server/app/api/health/sessions/route.js.map +5 -0
  126. package/web/.next/standalone/packages/web/.next/server/app/api/health/sessions/route.js.nft.json +1 -0
  127. package/web/.next/standalone/packages/web/.next/server/app/api/health/sessions/route_client-reference-manifest.js +2 -0
  128. package/web/.next/standalone/packages/web/.next/server/app/api/notifications/route/app-paths-manifest.json +3 -0
  129. package/web/.next/standalone/packages/web/.next/server/app/api/notifications/route/build-manifest.json +11 -0
  130. package/web/.next/standalone/packages/web/.next/server/app/api/notifications/route/server-reference-manifest.json +4 -0
  131. package/web/.next/standalone/packages/web/.next/server/app/api/notifications/route.js +10 -0
  132. package/web/.next/standalone/packages/web/.next/server/app/api/notifications/route.js.map +5 -0
  133. package/web/.next/standalone/packages/web/.next/server/app/api/notifications/route.js.nft.json +1 -0
  134. package/web/.next/standalone/packages/web/.next/server/app/api/notifications/route_client-reference-manifest.js +2 -0
  135. package/web/.next/standalone/packages/web/.next/server/app/api/preferences/route/app-paths-manifest.json +3 -0
  136. package/web/.next/standalone/packages/web/.next/server/app/api/preferences/route/build-manifest.json +11 -0
  137. package/web/.next/standalone/packages/web/.next/server/app/api/preferences/route/server-reference-manifest.json +4 -0
  138. package/web/.next/standalone/packages/web/.next/server/app/api/preferences/route.js +11 -0
  139. package/web/.next/standalone/packages/web/.next/server/app/api/preferences/route.js.map +5 -0
  140. package/web/.next/standalone/packages/web/.next/server/app/api/preferences/route.js.nft.json +1 -0
  141. package/web/.next/standalone/packages/web/.next/server/app/api/preferences/route_client-reference-manifest.js +2 -0
  142. package/web/.next/standalone/packages/web/.next/server/app/api/repositories/route/app-paths-manifest.json +3 -0
  143. package/web/.next/standalone/packages/web/.next/server/app/api/repositories/route/build-manifest.json +11 -0
  144. package/web/.next/standalone/packages/web/.next/server/app/api/repositories/route/server-reference-manifest.json +4 -0
  145. package/web/.next/standalone/packages/web/.next/server/app/api/repositories/route.js +12 -0
  146. package/web/.next/standalone/packages/web/.next/server/app/api/repositories/route.js.map +5 -0
  147. package/web/.next/standalone/packages/web/.next/server/app/api/repositories/route.js.nft.json +1 -0
  148. package/web/.next/standalone/packages/web/.next/server/app/api/repositories/route_client-reference-manifest.js +2 -0
  149. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/actions/route/app-paths-manifest.json +3 -0
  150. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/actions/route/build-manifest.json +11 -0
  151. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/actions/route/server-reference-manifest.json +4 -0
  152. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/actions/route.js +10 -0
  153. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/actions/route.js.map +5 -0
  154. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/actions/route.js.nft.json +1 -0
  155. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/actions/route_client-reference-manifest.js +2 -0
  156. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/checks/route/app-paths-manifest.json +3 -0
  157. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/checks/route/build-manifest.json +11 -0
  158. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/checks/route/server-reference-manifest.json +4 -0
  159. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/checks/route.js +10 -0
  160. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/checks/route.js.map +5 -0
  161. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/checks/route.js.nft.json +1 -0
  162. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/checks/route_client-reference-manifest.js +2 -0
  163. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/diff/route/app-paths-manifest.json +3 -0
  164. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/diff/route/build-manifest.json +11 -0
  165. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/diff/route/server-reference-manifest.json +4 -0
  166. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/diff/route.js +11 -0
  167. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/diff/route.js.map +5 -0
  168. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/diff/route.js.nft.json +1 -0
  169. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/diff/route_client-reference-manifest.js +2 -0
  170. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feedback/route/app-paths-manifest.json +3 -0
  171. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feedback/route/build-manifest.json +11 -0
  172. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feedback/route/server-reference-manifest.json +4 -0
  173. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feedback/route.js +10 -0
  174. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feedback/route.js.map +5 -0
  175. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feedback/route.js.nft.json +1 -0
  176. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feedback/route_client-reference-manifest.js +2 -0
  177. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/files/route/app-paths-manifest.json +3 -0
  178. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/files/route/build-manifest.json +11 -0
  179. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/files/route/server-reference-manifest.json +4 -0
  180. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/files/route.js +10 -0
  181. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/files/route.js.map +5 -0
  182. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/files/route.js.nft.json +1 -0
  183. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/files/route_client-reference-manifest.js +2 -0
  184. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/keys/route/app-paths-manifest.json +3 -0
  185. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/keys/route/build-manifest.json +11 -0
  186. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/keys/route/server-reference-manifest.json +4 -0
  187. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/keys/route.js +10 -0
  188. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/keys/route.js.map +5 -0
  189. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/keys/route.js.nft.json +1 -0
  190. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/keys/route_client-reference-manifest.js +2 -0
  191. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/kill/route/app-paths-manifest.json +3 -0
  192. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/kill/route/build-manifest.json +11 -0
  193. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/kill/route/server-reference-manifest.json +4 -0
  194. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/kill/route.js +10 -0
  195. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/kill/route.js.map +5 -0
  196. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/kill/route.js.nft.json +1 -0
  197. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/kill/route_client-reference-manifest.js +2 -0
  198. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/route/app-paths-manifest.json +3 -0
  199. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/route/build-manifest.json +11 -0
  200. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/route/server-reference-manifest.json +4 -0
  201. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/route.js +10 -0
  202. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/route.js.map +5 -0
  203. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/route.js.nft.json +1 -0
  204. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/route_client-reference-manifest.js +2 -0
  205. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/stream/route/app-paths-manifest.json +3 -0
  206. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/stream/route/build-manifest.json +11 -0
  207. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/stream/route/server-reference-manifest.json +4 -0
  208. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/stream/route.js +10 -0
  209. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/stream/route.js.map +5 -0
  210. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/stream/route.js.nft.json +1 -0
  211. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/stream/route_client-reference-manifest.js +2 -0
  212. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/restore/route/app-paths-manifest.json +3 -0
  213. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/restore/route/build-manifest.json +11 -0
  214. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/restore/route/server-reference-manifest.json +4 -0
  215. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/restore/route.js +10 -0
  216. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/restore/route.js.map +5 -0
  217. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/restore/route.js.nft.json +1 -0
  218. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/restore/route_client-reference-manifest.js +2 -0
  219. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/route/app-paths-manifest.json +3 -0
  220. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/route/build-manifest.json +11 -0
  221. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/route/server-reference-manifest.json +4 -0
  222. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/route.js +10 -0
  223. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/route.js.map +5 -0
  224. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -0
  225. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/route_client-reference-manifest.js +2 -0
  226. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/send/route/app-paths-manifest.json +3 -0
  227. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/send/route/build-manifest.json +11 -0
  228. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/send/route/server-reference-manifest.json +4 -0
  229. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/send/route.js +10 -0
  230. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/send/route.js.map +5 -0
  231. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/send/route.js.nft.json +1 -0
  232. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/send/route_client-reference-manifest.js +2 -0
  233. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/route/app-paths-manifest.json +3 -0
  234. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/route/build-manifest.json +11 -0
  235. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/route/server-reference-manifest.json +4 -0
  236. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/route.js +10 -0
  237. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/route.js.map +5 -0
  238. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/route.js.nft.json +1 -0
  239. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/route_client-reference-manifest.js +2 -0
  240. package/web/.next/standalone/packages/web/.next/server/app/api/spawn/route/app-paths-manifest.json +3 -0
  241. package/web/.next/standalone/packages/web/.next/server/app/api/spawn/route/build-manifest.json +11 -0
  242. package/web/.next/standalone/packages/web/.next/server/app/api/spawn/route/server-reference-manifest.json +4 -0
  243. package/web/.next/standalone/packages/web/.next/server/app/api/spawn/route.js +11 -0
  244. package/web/.next/standalone/packages/web/.next/server/app/api/spawn/route.js.map +5 -0
  245. package/web/.next/standalone/packages/web/.next/server/app/api/spawn/route.js.nft.json +1 -0
  246. package/web/.next/standalone/packages/web/.next/server/app/api/spawn/route_client-reference-manifest.js +2 -0
  247. package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/branches/route/app-paths-manifest.json +3 -0
  248. package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/branches/route/build-manifest.json +11 -0
  249. package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/branches/route/server-reference-manifest.json +4 -0
  250. package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/branches/route.js +10 -0
  251. package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/branches/route.js.map +5 -0
  252. package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/branches/route.js.nft.json +1 -0
  253. package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/branches/route_client-reference-manifest.js +2 -0
  254. package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/route/app-paths-manifest.json +3 -0
  255. package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/route/build-manifest.json +11 -0
  256. package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/route/server-reference-manifest.json +4 -0
  257. package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/route.js +12 -0
  258. package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/route.js.map +5 -0
  259. package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/route.js.nft.json +1 -0
  260. package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/route_client-reference-manifest.js +2 -0
  261. package/web/.next/standalone/packages/web/.next/server/app/auth/grant/route.js +4 -2
  262. package/web/.next/standalone/packages/web/.next/server/app/auth/grant/route.js.nft.json +1 -1
  263. package/web/.next/standalone/packages/web/.next/server/app/icon.svg/route.js +3 -1
  264. package/web/.next/standalone/packages/web/.next/server/app/icon.svg/route.js.nft.json +1 -1
  265. package/web/.next/standalone/packages/web/.next/server/app/index.html +1 -1
  266. package/web/.next/standalone/packages/web/.next/server/app/index.rsc +4 -4
  267. package/web/.next/standalone/packages/web/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  268. package/web/.next/standalone/packages/web/.next/server/app/index.segments/_full.segment.rsc +4 -4
  269. package/web/.next/standalone/packages/web/.next/server/app/index.segments/_head.segment.rsc +1 -1
  270. package/web/.next/standalone/packages/web/.next/server/app/index.segments/_index.segment.rsc +3 -3
  271. package/web/.next/standalone/packages/web/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  272. package/web/.next/standalone/packages/web/.next/server/app/page/react-loadable-manifest.json +1 -1
  273. package/web/.next/standalone/packages/web/.next/server/app/page/server-reference-manifest.json +7 -7
  274. package/web/.next/standalone/packages/web/.next/server/app/page.js +2 -2
  275. package/web/.next/standalone/packages/web/.next/server/app/page.js.nft.json +1 -1
  276. package/web/.next/standalone/packages/web/.next/server/app/page_client-reference-manifest.js +1 -1
  277. package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page/server-reference-manifest.json +7 -7
  278. package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page.js +2 -2
  279. package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page.js.nft.json +1 -1
  280. package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page_client-reference-manifest.js +1 -1
  281. package/web/.next/standalone/packages/web/.next/server/app/sign-in/[[...sign-in]]/page/server-reference-manifest.json +7 -7
  282. package/web/.next/standalone/packages/web/.next/server/app/sign-in/[[...sign-in]]/page.js +2 -2
  283. package/web/.next/standalone/packages/web/.next/server/app/sign-in/[[...sign-in]]/page.js.nft.json +1 -1
  284. package/web/.next/standalone/packages/web/.next/server/app/sign-in/[[...sign-in]]/page_client-reference-manifest.js +1 -1
  285. package/web/.next/standalone/packages/web/.next/server/app/unlock/page/server-reference-manifest.json +7 -7
  286. package/web/.next/standalone/packages/web/.next/server/app/unlock/page.js +2 -2
  287. package/web/.next/standalone/packages/web/.next/server/app/unlock/page.js.nft.json +1 -1
  288. package/web/.next/standalone/packages/web/.next/server/app/unlock/page_client-reference-manifest.js +1 -1
  289. package/web/.next/standalone/packages/web/.next/server/app-paths-manifest.json +30 -0
  290. package/web/.next/standalone/packages/web/.next/server/chunks/43d70_next-internal_server_app_api_sessions_[id]_output_stream_route_actions_9bfa500e.js +3 -0
  291. package/web/.next/standalone/packages/web/.next/server/chunks/730ea_web__next-internal_server_app_api_filesystem_directory_route_actions_b1ce53b0.js +3 -0
  292. package/web/.next/standalone/packages/web/.next/server/chunks/730ea_web__next-internal_server_app_api_health_sessions_route_actions_0e6610db.js +3 -0
  293. package/web/.next/standalone/packages/web/.next/server/chunks/730ea_web__next-internal_server_app_api_sessions_[id]_actions_route_actions_e73b30eb.js +3 -0
  294. package/web/.next/standalone/packages/web/.next/server/chunks/730ea_web__next-internal_server_app_api_sessions_[id]_checks_route_actions_a3dedc1e.js +3 -0
  295. package/web/.next/standalone/packages/web/.next/server/chunks/730ea_web__next-internal_server_app_api_sessions_[id]_diff_route_actions_b95fa63b.js +3 -0
  296. package/web/.next/standalone/packages/web/.next/server/chunks/730ea_web__next-internal_server_app_api_sessions_[id]_feedback_route_actions_cb4b8489.js +3 -0
  297. package/web/.next/standalone/packages/web/.next/server/chunks/730ea_web__next-internal_server_app_api_sessions_[id]_files_route_actions_22820f6c.js +3 -0
  298. package/web/.next/standalone/packages/web/.next/server/chunks/730ea_web__next-internal_server_app_api_sessions_[id]_keys_route_actions_2c93e9dc.js +3 -0
  299. package/web/.next/standalone/packages/web/.next/server/chunks/730ea_web__next-internal_server_app_api_sessions_[id]_kill_route_actions_2b9b61d1.js +3 -0
  300. package/web/.next/standalone/packages/web/.next/server/chunks/730ea_web__next-internal_server_app_api_sessions_[id]_output_route_actions_e0641c75.js +3 -0
  301. package/web/.next/standalone/packages/web/.next/server/chunks/730ea_web__next-internal_server_app_api_sessions_[id]_restore_route_actions_41a4c356.js +3 -0
  302. package/web/.next/standalone/packages/web/.next/server/chunks/730ea_web__next-internal_server_app_api_sessions_[id]_send_route_actions_5c1d0b47.js +3 -0
  303. package/web/.next/standalone/packages/web/.next/server/chunks/730ea_web__next-internal_server_app_api_workspaces_branches_route_actions_324a72cd.js +3 -0
  304. package/web/.next/standalone/packages/web/.next/server/chunks/[externals]__f25f12d4._.js +3 -0
  305. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__005aa909._.js +3 -0
  306. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__008d962e._.js +3 -0
  307. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__00cf28e7._.js +3 -0
  308. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__03ff76ee._.js +3 -0
  309. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__06365513._.js +3 -0
  310. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__075f8697._.js +3 -0
  311. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__097be5a7._.js +3 -0
  312. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__09c3bdaf._.js +7 -0
  313. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__0a0f0f01._.js +3 -0
  314. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__1003246b._.js +3 -0
  315. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__11918223._.js +3 -0
  316. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__13ad088c._.js +3 -0
  317. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__1458f8ec._.js +3 -0
  318. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__14b1d4a3._.js +3 -0
  319. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__1741fb8a._.js +3 -0
  320. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__1875f00e._.js +3 -0
  321. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__9fa7727e._.js → [root-of-the-server]__1aa339ea._.js} +2 -2
  322. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__1beced71._.js +3 -0
  323. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__1ed2e6c1._.js +226 -0
  324. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__1f626a16._.js +129 -0
  325. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__2062aaab._.js +3 -0
  326. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__206c3d8a._.js +3 -0
  327. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__22f8f0d6._.js +129 -0
  328. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__23bebaf9._.js +3 -0
  329. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__2556a816._.js +3 -0
  330. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__25788ed3._.js +54 -0
  331. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__29be362d._.js +3 -0
  332. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__2a83553a._.js +3 -0
  333. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__2c3f6397._.js +3 -0
  334. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__2c909fe3._.js +3 -0
  335. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__2ce39d51._.js +3 -0
  336. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__30921756._.js +3 -0
  337. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__31eea08c._.js +3 -0
  338. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__3d7ad620._.js +3 -0
  339. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__3edd3509._.js +3 -0
  340. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__3f8b49ba._.js +3 -0
  341. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__3f8e82c2._.js +3 -0
  342. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__44d59fd0._.js +3 -0
  343. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__48875cbb._.js +7 -0
  344. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__49c6a20e._.js +3 -0
  345. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__4ac9d639._.js +3 -0
  346. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__4c3fb752._.js +3 -0
  347. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__4ca8b259._.js +3 -0
  348. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__4dab6a6a._.js +3 -0
  349. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__544326ac._.js +3 -0
  350. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__54a218f0._.js +54 -0
  351. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__55e337f7._.js +3 -0
  352. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__5661ca72._.js +3 -0
  353. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__5cd49624._.js +3 -0
  354. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__5e0533de._.js +3 -0
  355. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__5e161db4._.js +3 -0
  356. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__5ebcb223._.js +3 -0
  357. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__5fd609c9._.js +3 -0
  358. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6023a748._.js +3 -0
  359. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__60cf7bf4._.js +3 -0
  360. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__60ee4897._.js +3 -0
  361. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6559c1a4._.js +3 -0
  362. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__659938b1._.js +3 -0
  363. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6712f45a._.js +3 -0
  364. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__69227de6._.js +3 -0
  365. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6ab08a39._.js +129 -0
  366. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6cd54de1._.js +3 -0
  367. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6ce2b5d7._.js +3 -0
  368. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6cfd00d2._.js +3 -0
  369. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6d62709d._.js +129 -0
  370. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6e08e4e4._.js +3 -0
  371. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__749331b0._.js +54 -0
  372. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__74a53184._.js +3 -0
  373. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__7633d324._.js +4 -0
  374. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__76c16426._.js +3 -0
  375. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__778e46a1._.js +129 -0
  376. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__7a26e452._.js +3 -0
  377. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__7ba96fa5._.js +3 -0
  378. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__7e684560._.js +3 -0
  379. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__848eb266._.js +3 -0
  380. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__8596d782._.js +7 -0
  381. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__85d8966b._.js +3 -0
  382. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__86aff2b8._.js +3 -0
  383. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__879cf4d2._.js +3 -0
  384. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__881858fa._.js +3 -0
  385. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__885e3a00._.js +54 -0
  386. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__887ea436._.js +3 -0
  387. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__893f6b3b._.js +3 -0
  388. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__89dfcd05._.js +3 -0
  389. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__8cc5826f._.js +3 -0
  390. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__913af875._.js +3 -0
  391. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__91b42119._.js +3 -0
  392. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__93ce1b75._.js +3 -0
  393. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__96633022._.js +3 -0
  394. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__96951362._.js +3 -0
  395. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__971fcc75._.js +9 -0
  396. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__98c6a6f3._.js +3 -0
  397. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__99da6324._.js +3 -0
  398. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__9c1d09aa._.js +3 -0
  399. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__9f07930d._.js +3 -0
  400. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__9f36b7ec._.js +129 -0
  401. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__9fd08bbc._.js +3 -0
  402. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__a05953cc._.js +3 -0
  403. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__a3766ac1._.js +3 -0
  404. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__a3bfaabf._.js +3 -0
  405. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__a420e374._.js +3 -0
  406. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__a4a33247._.js +54 -0
  407. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ac544bb5._.js +3 -0
  408. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ad84d2e0._.js +54 -0
  409. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__b3095e9d._.js +3 -0
  410. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__b59abfbd._.js +3 -0
  411. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__b9692a3c._.js +3 -0
  412. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__bcc08c70._.js +3 -0
  413. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__be051d52._.js +3 -0
  414. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__bea07e07._.js +3 -0
  415. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__bf8faac8._.js +4 -0
  416. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__c1759514._.js +3 -0
  417. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__c2ef2bfc._.js +3 -0
  418. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__c3c6a7bf._.js +3 -0
  419. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__c8618cb1._.js +3 -0
  420. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ca8a18f8._.js +3 -0
  421. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__cafd7bb3._.js +3 -0
  422. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__cb112606._.js +3 -0
  423. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__cc74ea40._.js +3 -0
  424. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__cd3692a0._.js +3 -0
  425. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__cf3cdecd._.js +3 -0
  426. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__d09e7a99._.js +3 -0
  427. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__d40b50e7._.js +3 -0
  428. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__d4721d30._.js +3 -0
  429. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__d538c110._.js +3 -0
  430. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__d73ea818._.js +3 -0
  431. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__db3d0133._.js +3 -0
  432. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__dd0cf085._.js +3 -0
  433. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__de0f2533._.js +7 -0
  434. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__e113f6df._.js +3 -0
  435. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__e1a418bc._.js +3 -0
  436. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__e6c1d827._.js +3 -0
  437. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ea69c4ce._.js +3 -0
  438. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__eac16890._.js +3 -0
  439. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__eb1dfcc6._.js +3 -0
  440. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ee75d43a._.js +3 -0
  441. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ef773ea6._.js +3 -0
  442. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__f0d15920._.js +3 -0
  443. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__f15cbcfc._.js +3 -0
  444. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__f48eb2d4._.js +3 -0
  445. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__fb6ab669._.js +3 -0
  446. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__fe8419b5._.js +129 -0
  447. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__667a63ee._.js → node_modules_07d85415._.js} +2 -2
  448. package/web/.next/standalone/packages/web/.next/server/chunks/node_modules_f0726c19._.js +52 -0
  449. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__d94cee69._.js → node_modules_next_9a15df2c._.js} +2 -2
  450. package/web/.next/standalone/packages/web/.next/server/chunks/node_modules_next_dist_79f1aee4._.js +6 -0
  451. package/web/.next/standalone/packages/web/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0e4dc4f7.js +3 -0
  452. package/web/.next/standalone/packages/web/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_dd27f857.js +3 -0
  453. package/web/.next/standalone/packages/web/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_e445b36c.js +3 -0
  454. package/web/.next/standalone/packages/web/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_f375f3c4.js +28 -0
  455. package/web/.next/standalone/packages/web/.next/server/chunks/node_modules_next_f2da0d3e._.js +14 -0
  456. package/web/.next/standalone/packages/web/.next/server/chunks/node_modules_next_f5199d09._.js +3 -0
  457. package/web/.next/standalone/packages/web/.next/server/chunks/packages_core_dist_index_cdd30418.js +3 -0
  458. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_agent-amp_dist_index_bf3d8239.js +3 -0
  459. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_agent-ccr_dist_index_69cbf726.js +3 -0
  460. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_agent-claude-code_dist_index_31314e43.js +125 -0
  461. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_agent-cursor-cli_dist_index_8d5cc426.js +3 -0
  462. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_agent-droid_dist_index_f731227a.js +3 -0
  463. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_agent-gemini_dist_index_b2d219e8.js +54 -0
  464. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_agent-github-copilot_dist_index_9f80cb45.js +3 -0
  465. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_agent-opencode_dist_index_7c7015da.js +3 -0
  466. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_agent-qwen-code_dist_index_46dd8653.js +3 -0
  467. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_notifier-desktop_dist_index_ef3473f0.js +3 -0
  468. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_notifier-discord_dist_index_34257226.js +3 -0
  469. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_scm-github_dist_index_3b5a621e.js +3 -0
  470. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_terminal-web_dist_index_1e0706d3.js +3 -0
  471. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_tracker-github_dist_index_2d7af62f.js +3 -0
  472. package/web/.next/standalone/packages/web/.next/server/chunks/packages_web__next-internal_server_app_api_access_route_actions_06740e99.js +3 -0
  473. package/web/.next/standalone/packages/web/.next/server/chunks/packages_web__next-internal_server_app_api_attachments_route_actions_4dcb6bab.js +3 -0
  474. package/web/.next/standalone/packages/web/.next/server/chunks/packages_web__next-internal_server_app_api_auth_session_route_actions_078c0ee4.js +3 -0
  475. package/web/.next/standalone/packages/web/.next/server/chunks/packages_web__next-internal_server_app_api_boards_route_actions_160005aa.js +3 -0
  476. package/web/.next/standalone/packages/web/.next/server/chunks/packages_web__next-internal_server_app_api_config_route_actions_ee96617d.js +3 -0
  477. package/web/.next/standalone/packages/web/.next/server/chunks/packages_web__next-internal_server_app_api_context-files_route_actions_e0f9c4a1.js +3 -0
  478. package/web/.next/standalone/packages/web/.next/server/chunks/packages_web__next-internal_server_app_api_events_route_actions_bde0da23.js +3 -0
  479. package/web/.next/standalone/packages/web/.next/server/chunks/packages_web__next-internal_server_app_api_github_repos_route_actions_7eab8e08.js +3 -0
  480. package/web/.next/standalone/packages/web/.next/server/chunks/packages_web__next-internal_server_app_api_health_boards_route_actions_7a65c06e.js +3 -0
  481. package/web/.next/standalone/packages/web/.next/server/chunks/packages_web__next-internal_server_app_api_notifications_route_actions_c5e4154e.js +3 -0
  482. package/web/.next/standalone/packages/web/.next/server/chunks/packages_web__next-internal_server_app_api_preferences_route_actions_858fa484.js +3 -0
  483. package/web/.next/standalone/packages/web/.next/server/chunks/packages_web__next-internal_server_app_api_repositories_route_actions_0232075d.js +3 -0
  484. package/web/.next/standalone/packages/web/.next/server/chunks/packages_web__next-internal_server_app_api_sessions_[id]_route_actions_6fdcb5a6.js +3 -0
  485. package/web/.next/standalone/packages/web/.next/server/chunks/packages_web__next-internal_server_app_api_sessions_route_actions_c6df1747.js +3 -0
  486. package/web/.next/standalone/packages/web/.next/server/chunks/packages_web__next-internal_server_app_api_spawn_route_actions_befa67f2.js +3 -0
  487. package/web/.next/standalone/packages/web/.next/server/chunks/packages_web__next-internal_server_app_api_workspaces_route_actions_795ab8d9.js +3 -0
  488. package/web/.next/standalone/packages/web/.next/server/chunks/packages_web_src_lib_13fee5eb._.js +3 -0
  489. package/web/.next/standalone/packages/web/.next/server/chunks/packages_web_src_lib_d64596cc._.js +3 -0
  490. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__09178ceb._.js +3 -0
  491. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{[root-of-the-server]__2b5e3ef2._.js → [root-of-the-server]__504277b5._.js} +2 -2
  492. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{[root-of-the-server]__b07a94f8._.js → [root-of-the-server]__525ee5d4._.js} +2 -2
  493. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__6622b514._.js +4 -0
  494. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__869d9ac0._.js +4 -0
  495. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{[root-of-the-server]__acdcadf9._.js → [root-of-the-server]__9726f664._.js} +2 -2
  496. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__b3463b25._.js +3 -0
  497. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__ca05f4a0._.js +4 -0
  498. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__dd8d1ff5._.js +3 -0
  499. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_0e1412de._.js +1 -1
  500. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_69e05fca._.js +1 -1
  501. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_80efe193._.js +1 -1
  502. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_b6d31783._.js +1 -1
  503. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_c0f0e227._.js +1 -1
  504. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_f36ddaa9._.js +1 -1
  505. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@clerk_nextjs_dist_esm_app-router_8a444735._.js +3 -0
  506. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{node_modules_@clerk_nextjs_dist_esm_app-router_622c0d1e._.js → node_modules_@clerk_nextjs_dist_esm_app-router_bf11b471._.js} +2 -2
  507. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_f2ebd7a9._.js +1 -1
  508. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{packages_web_src_components_9f3d5f00._.js → packages_web_src_components_dd296b40._.js} +1 -1
  509. package/web/.next/standalone/packages/web/.next/server/middleware.js +2 -2
  510. package/web/.next/standalone/packages/web/.next/server/pages/404.html +1 -1
  511. package/web/.next/standalone/packages/web/.next/server/pages/500.html +2 -2
  512. package/web/.next/standalone/packages/web/.next/server/server-reference-manifest.js +1 -1
  513. package/web/.next/standalone/packages/web/.next/server/server-reference-manifest.json +8 -8
  514. package/web/.next/standalone/packages/web/.next/static/chunks/19d7d4e2cfe3261a.js +1 -0
  515. package/web/.next/standalone/packages/web/.next/static/chunks/{04f4c17a714eeae7.js → 86bce89c37cf6212.js} +1 -1
  516. package/web/.next/standalone/packages/web/.next/static/chunks/{9b34f9af98cb77d6.js → ab8ef6c7dfc78082.js} +1 -1
  517. package/web/.next/standalone/packages/web/.next/static/chunks/{8d30faf57f99d301.js → e8283780c26eaa91.js} +1 -1
  518. package/web/.next/{static/chunks/61ead0a3899b1761.js → standalone/packages/web/.next/static/chunks/e88fa6d41d743b9e.js} +2 -2
  519. package/web/.next/{static/chunks/c0b1f9af564807f3.css → standalone/packages/web/.next/static/chunks/fe557eb4039d8a8d.css} +1 -1
  520. package/web/.next/standalone/packages/web/next.config.ts +33 -0
  521. package/web/.next/standalone/packages/web/postcss.config.mjs +5 -0
  522. package/web/.next/standalone/packages/web/src/app/api/access/route.ts +214 -0
  523. package/web/.next/standalone/packages/web/src/app/api/agents/route.ts +223 -0
  524. package/web/.next/standalone/packages/web/src/app/api/attachments/route.ts +169 -0
  525. package/web/.next/standalone/packages/web/src/app/api/auth/session/route.ts +54 -0
  526. package/web/.next/standalone/packages/web/src/app/api/boards/route.ts +520 -0
  527. package/web/.next/standalone/packages/web/src/app/api/config/route.ts +81 -0
  528. package/web/.next/standalone/packages/web/src/app/api/context-files/route.ts +201 -0
  529. package/web/.next/standalone/packages/web/src/app/api/events/route.ts +125 -0
  530. package/web/.next/standalone/packages/web/src/app/api/filesystem/directory/route.ts +145 -0
  531. package/web/.next/standalone/packages/web/src/app/api/github/repos/route.ts +106 -0
  532. package/web/.next/standalone/packages/web/src/app/api/health/boards/route.ts +72 -0
  533. package/web/.next/standalone/packages/web/src/app/api/health/sessions/route.ts +77 -0
  534. package/web/.next/standalone/packages/web/src/app/api/notifications/route.ts +91 -0
  535. package/web/.next/standalone/packages/web/src/app/api/preferences/route.ts +194 -0
  536. package/web/.next/standalone/packages/web/src/app/api/repositories/route.ts +419 -0
  537. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/actions/route.ts +80 -0
  538. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/checks/route.ts +175 -0
  539. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/diff/route.ts +426 -0
  540. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/feedback/route.ts +47 -0
  541. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/files/route.ts +197 -0
  542. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/keys/route.ts +140 -0
  543. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/kill/route.ts +45 -0
  544. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/output/route.ts +262 -0
  545. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/output/stream/route.ts +111 -0
  546. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/restore/route.ts +49 -0
  547. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/route.ts +206 -0
  548. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/send/route.ts +58 -0
  549. package/web/.next/standalone/packages/web/src/app/api/sessions/route.ts +105 -0
  550. package/web/.next/standalone/packages/web/src/app/api/spawn/route.ts +216 -0
  551. package/web/.next/standalone/packages/web/src/app/api/workspaces/branches/route.ts +233 -0
  552. package/web/.next/standalone/packages/web/src/app/api/workspaces/route.ts +592 -0
  553. package/web/.next/standalone/packages/web/src/app/auth/grant/route.ts +37 -0
  554. package/web/.next/standalone/packages/web/src/app/globals.css +206 -0
  555. package/web/.next/standalone/packages/web/src/app/icon.svg +11 -0
  556. package/web/.next/standalone/packages/web/src/app/layout.tsx +65 -0
  557. package/web/.next/standalone/packages/web/src/app/page.tsx +4559 -0
  558. package/web/.next/standalone/packages/web/src/app/sessions/[id]/page.tsx +120 -0
  559. package/web/.next/standalone/packages/web/src/app/sign-in/[[...sign-in]]/page.tsx +11 -0
  560. package/web/.next/standalone/packages/web/src/app/unlock/UnlockForm.tsx +77 -0
  561. package/web/.next/standalone/packages/web/src/app/unlock/page.tsx +41 -0
  562. package/web/.next/standalone/packages/web/src/components/ActivityDot.tsx +93 -0
  563. package/web/.next/standalone/packages/web/src/components/AgentTileIcon.tsx +193 -0
  564. package/web/.next/standalone/packages/web/src/components/Dashboard.tsx +3444 -0
  565. package/web/.next/standalone/packages/web/src/components/EmptyState.tsx +58 -0
  566. package/web/.next/standalone/packages/web/src/components/SessionCard.tsx +377 -0
  567. package/web/.next/standalone/packages/web/src/components/TerminalView.tsx +184 -0
  568. package/web/.next/standalone/packages/web/src/components/ThemeProvider.tsx +55 -0
  569. package/web/.next/standalone/packages/web/src/components/agents/AgentGrid.tsx +95 -0
  570. package/web/.next/standalone/packages/web/src/components/board/WorkspaceKanban.tsx +1316 -0
  571. package/web/.next/standalone/packages/web/src/components/layout/AppShell.tsx +74 -0
  572. package/web/.next/standalone/packages/web/src/components/layout/EmptyState.tsx +53 -0
  573. package/web/.next/standalone/packages/web/src/components/layout/Sidebar.tsx +318 -0
  574. package/web/.next/standalone/packages/web/src/components/layout/TopBar.tsx +34 -0
  575. package/web/.next/standalone/packages/web/src/components/layout/WorkspaceSidebarPanel.tsx +93 -0
  576. package/web/.next/standalone/packages/web/src/components/sessions/ChatPanel.tsx +1559 -0
  577. package/web/.next/standalone/packages/web/src/components/sessions/SessionDetail.tsx +132 -0
  578. package/web/.next/standalone/packages/web/src/components/sessions/SessionDiff.tsx +1197 -0
  579. package/web/.next/standalone/packages/web/src/components/sessions/SessionOverview.tsx +314 -0
  580. package/web/.next/standalone/packages/web/src/components/ui/Badge.tsx +33 -0
  581. package/web/.next/standalone/packages/web/src/components/ui/Button.tsx +53 -0
  582. package/web/.next/standalone/packages/web/src/components/ui/Card.tsx +35 -0
  583. package/web/.next/standalone/packages/web/src/components/ui/RunningDots.tsx +22 -0
  584. package/web/.next/standalone/packages/web/src/components/ui/ScrollArea.tsx +43 -0
  585. package/web/.next/standalone/packages/web/src/components/ui/Separator.tsx +23 -0
  586. package/web/.next/standalone/packages/web/src/components/ui/StatusDot.tsx +30 -0
  587. package/web/.next/standalone/packages/web/src/components/ui/Tabs.tsx +48 -0
  588. package/web/.next/standalone/packages/web/src/components/ui/Tooltip.tsx +44 -0
  589. package/web/.next/standalone/packages/web/src/hooks/useAgents.ts +155 -0
  590. package/web/.next/standalone/packages/web/src/hooks/useConfig.ts +116 -0
  591. package/web/.next/standalone/packages/web/src/hooks/usePreferences.ts +95 -0
  592. package/web/.next/standalone/packages/web/src/hooks/useSession.ts +191 -0
  593. package/web/.next/standalone/packages/web/src/hooks/useSessionFeed.ts +265 -0
  594. package/web/.next/standalone/packages/web/src/hooks/useSessionOutputStream.ts +155 -0
  595. package/web/.next/standalone/packages/web/src/hooks/useSessions.ts +123 -0
  596. package/web/.next/standalone/packages/web/src/lib/accessControl.test.ts +46 -0
  597. package/web/.next/standalone/packages/web/src/lib/accessControl.ts +115 -0
  598. package/web/.next/standalone/packages/web/src/lib/agentUtils.ts +4 -0
  599. package/web/.next/standalone/packages/web/src/lib/auth.ts +457 -0
  600. package/web/.next/standalone/packages/web/src/lib/chatFeed.ts +196 -0
  601. package/web/.next/standalone/packages/web/src/lib/cn.ts +6 -0
  602. package/web/.next/standalone/packages/web/src/lib/edgeAuth.test.ts +91 -0
  603. package/web/.next/standalone/packages/web/src/lib/edgeAuth.ts +205 -0
  604. package/web/.next/standalone/packages/web/src/lib/editorLinks.ts +51 -0
  605. package/web/.next/standalone/packages/web/src/lib/event-bus-singleton.ts +50 -0
  606. package/web/.next/standalone/packages/web/src/lib/liveEvents.ts +49 -0
  607. package/web/.next/standalone/packages/web/src/lib/modelAccess.ts +40 -0
  608. package/web/.next/standalone/packages/web/src/lib/projectConfigSync.ts +144 -0
  609. package/web/.next/standalone/packages/web/src/lib/remoteAuth.ts +104 -0
  610. package/web/.next/standalone/packages/web/src/lib/runtimeAgentModels.test.ts +78 -0
  611. package/web/.next/standalone/packages/web/src/lib/runtimeAgentModels.ts +788 -0
  612. package/web/.next/standalone/packages/web/src/lib/runtimeAgentModelsShared.ts +65 -0
  613. package/web/.next/standalone/packages/web/src/lib/serialize.ts +128 -0
  614. package/web/.next/standalone/packages/web/src/lib/services.ts +319 -0
  615. package/web/.next/standalone/packages/web/src/lib/types.ts +182 -0
  616. package/web/.next/standalone/packages/web/src/proxy.ts +141 -0
  617. package/web/.next/standalone/packages/web/tsconfig.json +42 -0
  618. package/web/.next/static/chunks/19d7d4e2cfe3261a.js +1 -0
  619. package/web/.next/static/chunks/{04f4c17a714eeae7.js → 86bce89c37cf6212.js} +1 -1
  620. package/web/.next/static/chunks/{9b34f9af98cb77d6.js → ab8ef6c7dfc78082.js} +1 -1
  621. package/web/.next/static/chunks/{8d30faf57f99d301.js → e8283780c26eaa91.js} +1 -1
  622. package/web/.next/{standalone/packages/web/.next/static/chunks/61ead0a3899b1761.js → static/chunks/e88fa6d41d743b9e.js} +2 -2
  623. package/web/.next/{standalone/packages/web/.next/static/chunks/c0b1f9af564807f3.css → static/chunks/fe557eb4039d8a8d.css} +1 -1
  624. package/web/.next/standalone/packages/web/.next/server/chunks/[externals]__0d8e2e8d._.js +0 -3
  625. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__273dc5fd._.js +0 -3
  626. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__30b98e6f._.js +0 -4
  627. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__bbaa7179._.js +0 -3
  628. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__f408c708._.js +0 -21
  629. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__434b20a4._.js +0 -3
  630. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__90837659._.js +0 -3
  631. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__977a17ba._.js +0 -3
  632. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__bce4b756._.js +0 -4
  633. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__cb11b5eb._.js +0 -4
  634. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__d1edf1ae._.js +0 -4
  635. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@clerk_nextjs_dist_esm_app-router_d6c6c559._.js +0 -3
  636. package/web/.next/standalone/packages/web/.next/static/chunks/2ddcd95a6de1ac4a.js +0 -1
  637. package/web/.next/static/chunks/2ddcd95a6de1ac4a.js +0 -1
  638. /package/web/.next/standalone/packages/web/.next/static/{fLVGQVTN7GT-GjBotJjTr → 7KQ5wRS3BC3qvrkz8yxuS}/_buildManifest.js +0 -0
  639. /package/web/.next/standalone/packages/web/.next/static/{fLVGQVTN7GT-GjBotJjTr → 7KQ5wRS3BC3qvrkz8yxuS}/_clientMiddlewareManifest.json +0 -0
  640. /package/web/.next/standalone/packages/web/.next/static/{fLVGQVTN7GT-GjBotJjTr → 7KQ5wRS3BC3qvrkz8yxuS}/_ssgManifest.js +0 -0
  641. /package/web/.next/static/{fLVGQVTN7GT-GjBotJjTr → 7KQ5wRS3BC3qvrkz8yxuS}/_buildManifest.js +0 -0
  642. /package/web/.next/static/{fLVGQVTN7GT-GjBotJjTr → 7KQ5wRS3BC3qvrkz8yxuS}/_clientMiddlewareManifest.json +0 -0
  643. /package/web/.next/static/{fLVGQVTN7GT-GjBotJjTr → 7KQ5wRS3BC3qvrkz8yxuS}/_ssgManifest.js +0 -0
@@ -0,0 +1,1197 @@
1
+ "use client";
2
+
3
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
4
+ import type { ReactNode } from "react";
5
+ import {
6
+ ChevronDown,
7
+ ChevronRight,
8
+ CircleAlert,
9
+ FileCode2,
10
+ FilePlus2,
11
+ Folder,
12
+ FolderOpen,
13
+ GitCompare,
14
+ Minus,
15
+ Plus,
16
+ RefreshCw,
17
+ Search,
18
+ WrapText,
19
+ X,
20
+ } from "lucide-react";
21
+ import { Badge } from "@/components/ui/Badge";
22
+ import { subscribeToSnapshotEvents } from "@/lib/liveEvents";
23
+ import { TERMINAL_STATUSES, type SSESnapshotEvent } from "@/lib/types";
24
+
25
+ type ReviewDiffKind = "meta" | "hunk" | "context" | "add" | "remove" | "info";
26
+ type ReviewDiffSource = "working-tree" | "remote-pr" | "not-found";
27
+ type ReviewDiffStatus = "modified" | "added" | "deleted" | "renamed" | "copy" | "binary" | "unknown";
28
+
29
+ interface ReviewDiffLine {
30
+ kind: ReviewDiffKind;
31
+ oldLine: number | null;
32
+ newLine: number | null;
33
+ text: string;
34
+ }
35
+
36
+ interface ReviewDiffFile {
37
+ path: string;
38
+ status: ReviewDiffStatus;
39
+ additions: number;
40
+ deletions: number;
41
+ lines: ReviewDiffLine[];
42
+ untracked?: boolean;
43
+ }
44
+
45
+ interface ReviewDiffPayload {
46
+ hasDiff: boolean;
47
+ generatedAt: string;
48
+ source: ReviewDiffSource;
49
+ truncated: boolean;
50
+ files: ReviewDiffFile[];
51
+ untracked: string[];
52
+ }
53
+
54
+ interface WorkspaceFilesPayload {
55
+ workspacePath: string;
56
+ files: string[];
57
+ truncated: boolean;
58
+ }
59
+
60
+ interface WorkspaceFileContentPayload {
61
+ workspacePath: string;
62
+ path: string;
63
+ content: string | null;
64
+ size: number;
65
+ binary: boolean;
66
+ truncated: boolean;
67
+ }
68
+
69
+ interface FileTreeFileNode {
70
+ kind: "file";
71
+ name: string;
72
+ path: string;
73
+ additions: number;
74
+ deletions: number;
75
+ status: ReviewDiffStatus;
76
+ untracked: boolean;
77
+ }
78
+
79
+ interface FileTreeDirNode {
80
+ kind: "dir";
81
+ name: string;
82
+ path: string;
83
+ additions: number;
84
+ deletions: number;
85
+ fileCount: number;
86
+ children: FileTreeNode[];
87
+ }
88
+
89
+ type FileTreeNode = FileTreeFileNode | FileTreeDirNode;
90
+
91
+ interface MutableDirNode {
92
+ name: string;
93
+ path: string;
94
+ dirs: Map<string, MutableDirNode>;
95
+ files: FileTreeFileNode[];
96
+ }
97
+
98
+ interface SessionDiffProps {
99
+ sessionId: string;
100
+ }
101
+
102
+ const EMPTY_PAYLOAD: ReviewDiffPayload = {
103
+ hasDiff: false,
104
+ generatedAt: "",
105
+ source: "not-found",
106
+ truncated: false,
107
+ files: [],
108
+ untracked: [],
109
+ };
110
+ const ACTIVE_DIFF_REFRESH_MS = 15_000;
111
+ const HIDDEN_DIFF_REFRESH_MS = 30_000;
112
+
113
+ function coerceStatus(value: unknown): ReviewDiffStatus {
114
+ if (
115
+ value === "modified" ||
116
+ value === "added" ||
117
+ value === "deleted" ||
118
+ value === "renamed" ||
119
+ value === "copy" ||
120
+ value === "binary"
121
+ ) {
122
+ return value;
123
+ }
124
+ return "unknown";
125
+ }
126
+
127
+ function coerceKind(value: unknown): ReviewDiffKind {
128
+ if (
129
+ value === "meta" ||
130
+ value === "hunk" ||
131
+ value === "context" ||
132
+ value === "add" ||
133
+ value === "remove" ||
134
+ value === "info"
135
+ ) {
136
+ return value;
137
+ }
138
+ return "context";
139
+ }
140
+
141
+ function normalizePath(path: unknown): string {
142
+ if (typeof path !== "string") return "";
143
+ const compact = path.trim().replace(/^\/+/, "").replace(/\/+/g, "/");
144
+ return compact || "unknown-file";
145
+ }
146
+
147
+ function normalizeDiffFiles(payload: ReviewDiffPayload): ReviewDiffFile[] {
148
+ const fileMap = new Map<string, ReviewDiffFile>();
149
+
150
+ for (const raw of payload.files ?? []) {
151
+ const path = normalizePath(raw.path);
152
+ const normalized: ReviewDiffFile = {
153
+ path,
154
+ status: coerceStatus(raw.status),
155
+ additions: Number.isFinite(raw.additions) ? Math.max(0, raw.additions) : 0,
156
+ deletions: Number.isFinite(raw.deletions) ? Math.max(0, raw.deletions) : 0,
157
+ lines: Array.isArray(raw.lines)
158
+ ? raw.lines.map((line) => ({
159
+ kind: coerceKind(line.kind),
160
+ oldLine: typeof line.oldLine === "number" && Number.isFinite(line.oldLine) ? line.oldLine : null,
161
+ newLine: typeof line.newLine === "number" && Number.isFinite(line.newLine) ? line.newLine : null,
162
+ text: typeof line.text === "string" ? line.text : "",
163
+ }))
164
+ : [],
165
+ untracked: Boolean(raw.untracked),
166
+ };
167
+ fileMap.set(path, normalized);
168
+ }
169
+
170
+ for (const path of payload.untracked ?? []) {
171
+ const normalizedPath = normalizePath(path);
172
+ if (fileMap.has(normalizedPath)) continue;
173
+ fileMap.set(normalizedPath, {
174
+ path: normalizedPath,
175
+ status: "added",
176
+ additions: 0,
177
+ deletions: 0,
178
+ lines: [],
179
+ untracked: true,
180
+ });
181
+ }
182
+
183
+ return [...fileMap.values()].sort((a, b) => a.path.localeCompare(b.path, undefined, { sensitivity: "base" }));
184
+ }
185
+
186
+ function createMutableDir(name: string, path: string): MutableDirNode {
187
+ return {
188
+ name,
189
+ path,
190
+ dirs: new Map<string, MutableDirNode>(),
191
+ files: [],
192
+ };
193
+ }
194
+
195
+ function toTreeNode(node: MutableDirNode): FileTreeDirNode {
196
+ const dirChildren = [...node.dirs.values()]
197
+ .sort((a, b) => a.name.localeCompare(b.name, undefined, { sensitivity: "base" }))
198
+ .map(toTreeNode);
199
+
200
+ const fileChildren = [...node.files].sort((a, b) =>
201
+ a.name.localeCompare(b.name, undefined, { sensitivity: "base" }),
202
+ );
203
+
204
+ const children: FileTreeNode[] = [...dirChildren, ...fileChildren];
205
+ let additions = 0;
206
+ let deletions = 0;
207
+ let fileCount = 0;
208
+
209
+ for (const child of children) {
210
+ if (child.kind === "dir") {
211
+ additions += child.additions;
212
+ deletions += child.deletions;
213
+ fileCount += child.fileCount;
214
+ continue;
215
+ }
216
+ additions += child.additions;
217
+ deletions += child.deletions;
218
+ fileCount += 1;
219
+ }
220
+
221
+ return {
222
+ kind: "dir",
223
+ name: node.name,
224
+ path: node.path,
225
+ additions,
226
+ deletions,
227
+ fileCount,
228
+ children,
229
+ };
230
+ }
231
+
232
+ function buildFileTree(files: ReviewDiffFile[]): FileTreeDirNode {
233
+ const root = createMutableDir("", "");
234
+
235
+ for (const file of files) {
236
+ const segments = file.path.split("/").filter((segment) => segment.length > 0);
237
+ const fileName = segments.pop() ?? file.path;
238
+ let cursor = root;
239
+ let currentPath = "";
240
+
241
+ for (const segment of segments) {
242
+ currentPath = currentPath ? `${currentPath}/${segment}` : segment;
243
+ const existing = cursor.dirs.get(segment);
244
+ if (existing) {
245
+ cursor = existing;
246
+ continue;
247
+ }
248
+ const next = createMutableDir(segment, currentPath);
249
+ cursor.dirs.set(segment, next);
250
+ cursor = next;
251
+ }
252
+
253
+ cursor.files.push({
254
+ kind: "file",
255
+ name: fileName,
256
+ path: file.path,
257
+ additions: file.additions,
258
+ deletions: file.deletions,
259
+ status: file.status,
260
+ untracked: Boolean(file.untracked),
261
+ });
262
+ }
263
+
264
+ return toTreeNode(root);
265
+ }
266
+
267
+ function statusLabel(file: ReviewDiffFile): string {
268
+ if (file.untracked) return "Untracked";
269
+ if (file.status === "added") return "Added";
270
+ if (file.status === "deleted") return "Deleted";
271
+ if (file.status === "renamed") return "Renamed";
272
+ if (file.status === "copy") return "Copied";
273
+ if (file.status === "binary") return "Binary";
274
+ if (file.status === "modified") return "Modified";
275
+ return "Changed";
276
+ }
277
+
278
+ function sourceLabel(source: ReviewDiffSource): string {
279
+ if (source === "working-tree") return "Working Tree";
280
+ if (source === "remote-pr") return "Remote PR";
281
+ return "Not Found";
282
+ }
283
+
284
+ function markerForLine(kind: ReviewDiffKind): string {
285
+ if (kind === "add") return "+";
286
+ if (kind === "remove") return "-";
287
+ if (kind === "hunk") return "@";
288
+ if (kind === "info") return "i";
289
+ return "";
290
+ }
291
+
292
+ function lineTone(kind: ReviewDiffKind): string {
293
+ if (kind === "add") return "bg-[rgba(84,176,79,0.18)]";
294
+ if (kind === "remove") return "bg-[rgba(210,81,81,0.18)]";
295
+ if (kind === "hunk") return "bg-[rgba(108,168,255,0.12)]";
296
+ return "";
297
+ }
298
+
299
+ function lineTextTone(kind: ReviewDiffKind): string {
300
+ if (kind === "add") return "text-[var(--vk-green)]";
301
+ if (kind === "remove") return "text-[var(--vk-red)]";
302
+ if (kind === "hunk") return "text-[var(--status-working)]";
303
+ if (kind === "meta" || kind === "info") return "text-[var(--vk-text-muted)]";
304
+ return "text-[var(--vk-text-normal)]";
305
+ }
306
+
307
+ function statusPillClass(file: ReviewDiffFile): string {
308
+ if (file.untracked || file.status === "added") {
309
+ return "border-[rgba(84,176,79,0.35)] text-[var(--vk-green)]";
310
+ }
311
+ if (file.status === "deleted") {
312
+ return "border-[rgba(210,81,81,0.35)] text-[var(--vk-red)]";
313
+ }
314
+ if (file.status === "renamed" || file.status === "copy") {
315
+ return "border-[rgba(108,168,255,0.35)] text-[var(--status-working)]";
316
+ }
317
+ if (file.status === "binary") {
318
+ return "border-[rgba(210,160,59,0.35)] text-[var(--status-attention)]";
319
+ }
320
+ return "border-[var(--vk-border)] text-[var(--vk-text-muted)]";
321
+ }
322
+
323
+ function formatGeneratedAt(value: string): string {
324
+ if (!value) return "Not generated";
325
+ const parsed = new Date(value);
326
+ if (Number.isNaN(parsed.getTime())) return "Not generated";
327
+ return parsed.toLocaleString(undefined, {
328
+ month: "short",
329
+ day: "numeric",
330
+ hour: "numeric",
331
+ minute: "2-digit",
332
+ });
333
+ }
334
+
335
+ function stringArrayEqual(left: string[], right: string[]): boolean {
336
+ if (left === right) return true;
337
+ if (left.length !== right.length) return false;
338
+ for (let index = 0; index < left.length; index += 1) {
339
+ if (left[index] !== right[index]) return false;
340
+ }
341
+ return true;
342
+ }
343
+
344
+ function diffPayloadEqual(left: ReviewDiffPayload, right: ReviewDiffPayload): boolean {
345
+ if (
346
+ left.hasDiff !== right.hasDiff ||
347
+ left.generatedAt !== right.generatedAt ||
348
+ left.source !== right.source ||
349
+ left.truncated !== right.truncated ||
350
+ !stringArrayEqual(left.untracked, right.untracked) ||
351
+ left.files.length !== right.files.length
352
+ ) {
353
+ return false;
354
+ }
355
+
356
+ for (let fileIndex = 0; fileIndex < left.files.length; fileIndex += 1) {
357
+ const leftFile = left.files[fileIndex];
358
+ const rightFile = right.files[fileIndex];
359
+ if (
360
+ leftFile.path !== rightFile.path ||
361
+ leftFile.status !== rightFile.status ||
362
+ leftFile.additions !== rightFile.additions ||
363
+ leftFile.deletions !== rightFile.deletions ||
364
+ Boolean(leftFile.untracked) !== Boolean(rightFile.untracked) ||
365
+ leftFile.lines.length !== rightFile.lines.length
366
+ ) {
367
+ return false;
368
+ }
369
+
370
+ for (let lineIndex = 0; lineIndex < leftFile.lines.length; lineIndex += 1) {
371
+ const leftLine = leftFile.lines[lineIndex];
372
+ const rightLine = rightFile.lines[lineIndex];
373
+ if (
374
+ leftLine.kind !== rightLine.kind ||
375
+ leftLine.oldLine !== rightLine.oldLine ||
376
+ leftLine.newLine !== rightLine.newLine ||
377
+ leftLine.text !== rightLine.text
378
+ ) {
379
+ return false;
380
+ }
381
+ }
382
+ }
383
+
384
+ return true;
385
+ }
386
+
387
+ export function SessionDiff({ sessionId }: SessionDiffProps) {
388
+ const encodedSessionId = encodeURIComponent(sessionId);
389
+ const [payload, setPayload] = useState<ReviewDiffPayload>(EMPTY_PAYLOAD);
390
+ const [loading, setLoading] = useState(true);
391
+ const [error, setError] = useState<string | null>(null);
392
+ const [sidebarView, setSidebarView] = useState<"changes" | "files">("changes");
393
+
394
+ const [fileSearch, setFileSearch] = useState("");
395
+ const [workspaceSearch, setWorkspaceSearch] = useState("");
396
+ const [wrapLines, setWrapLines] = useState(false);
397
+ const [selectedPath, setSelectedPath] = useState<string | null>(null);
398
+ const [selectedWorkspacePath, setSelectedWorkspacePath] = useState<string | null>(null);
399
+
400
+ const [expandedFiles, setExpandedFiles] = useState<Record<string, boolean>>({});
401
+ const [collapsedDirs, setCollapsedDirs] = useState<Record<string, boolean>>({});
402
+
403
+ const [workspaceFiles, setWorkspaceFiles] = useState<string[]>([]);
404
+ const [workspaceFilesLoaded, setWorkspaceFilesLoaded] = useState(false);
405
+ const [workspaceFilesLoading, setWorkspaceFilesLoading] = useState(false);
406
+ const [workspaceFilesError, setWorkspaceFilesError] = useState<string | null>(null);
407
+ const [workspaceFilesTruncated, setWorkspaceFilesTruncated] = useState(false);
408
+
409
+ const [workspaceFileContent, setWorkspaceFileContent] = useState<string>("");
410
+ const [workspaceFileBinary, setWorkspaceFileBinary] = useState(false);
411
+ const [workspaceFileTruncated, setWorkspaceFileTruncated] = useState(false);
412
+ const [workspaceFileSize, setWorkspaceFileSize] = useState(0);
413
+ const [workspaceFileLoading, setWorkspaceFileLoading] = useState(false);
414
+ const [workspaceFileError, setWorkspaceFileError] = useState<string | null>(null);
415
+
416
+ const mountedRef = useRef(true);
417
+ const fileRefs = useRef<Record<string, HTMLDivElement | null>>({});
418
+ const snapshotSignatureRef = useRef<string | null>(null);
419
+ const terminalRef = useRef(false);
420
+
421
+ const parsedFiles = useCallback((data: ReviewDiffPayload) => normalizeDiffFiles(data), []);
422
+
423
+ const fetchDiff = useCallback(async () => {
424
+ try {
425
+ const res = await fetch(`/api/sessions/${encodedSessionId}/diff`, { cache: "no-store" });
426
+ if (!res.ok) {
427
+ if (res.status === 404) {
428
+ if (!mountedRef.current) return;
429
+ setPayload(EMPTY_PAYLOAD);
430
+ setError(null);
431
+ return;
432
+ }
433
+
434
+ let message = `Failed to fetch diff (${res.status})`;
435
+ try {
436
+ const data = (await res.json()) as { error?: string };
437
+ if (typeof data.error === "string" && data.error.length > 0) {
438
+ message = data.error;
439
+ }
440
+ } catch {
441
+ // keep fallback message
442
+ }
443
+ throw new Error(message);
444
+ }
445
+
446
+ const data = (await res.json()) as Partial<ReviewDiffPayload> & { error?: string };
447
+
448
+ if (!mountedRef.current) return;
449
+
450
+ if (data.error) throw new Error(data.error);
451
+
452
+ const nextPayload: ReviewDiffPayload = {
453
+ hasDiff: Boolean(data.hasDiff),
454
+ generatedAt: typeof data.generatedAt === "string" ? data.generatedAt : "",
455
+ source: data.source === "working-tree" || data.source === "remote-pr" ? data.source : "not-found",
456
+ truncated: Boolean(data.truncated),
457
+ files: Array.isArray(data.files)
458
+ ? data.files.map((file) => ({
459
+ path: normalizePath(file.path),
460
+ status: coerceStatus(file.status),
461
+ additions: Number.isFinite(file.additions) ? Math.max(0, Number(file.additions)) : 0,
462
+ deletions: Number.isFinite(file.deletions) ? Math.max(0, Number(file.deletions)) : 0,
463
+ lines: Array.isArray(file.lines)
464
+ ? file.lines.map((line) => ({
465
+ kind: coerceKind(line.kind),
466
+ oldLine: typeof line.oldLine === "number" && Number.isFinite(line.oldLine) ? line.oldLine : null,
467
+ newLine: typeof line.newLine === "number" && Number.isFinite(line.newLine) ? line.newLine : null,
468
+ text: typeof line.text === "string" ? line.text : "",
469
+ }))
470
+ : [],
471
+ }))
472
+ : [],
473
+ untracked: Array.isArray(data.untracked)
474
+ ? data.untracked.filter((path): path is string => typeof path === "string")
475
+ : [],
476
+ };
477
+
478
+ const nextFiles = parsedFiles(nextPayload);
479
+ setPayload((current) => (diffPayloadEqual(current, nextPayload) ? current : nextPayload));
480
+ setSelectedPath((current) =>
481
+ current && nextFiles.some((file) => file.path === current)
482
+ ? current
483
+ : (nextFiles[0]?.path ?? null),
484
+ );
485
+ setExpandedFiles((current) => {
486
+ const next = { ...current };
487
+ for (const file of nextFiles.slice(0, 10)) {
488
+ if (next[file.path] == null) {
489
+ next[file.path] = true;
490
+ }
491
+ }
492
+ return next;
493
+ });
494
+ setError(null);
495
+ } catch (err) {
496
+ if (mountedRef.current) {
497
+ setPayload(EMPTY_PAYLOAD);
498
+ setError(err instanceof Error ? err.message : "Failed to load diff");
499
+ }
500
+ } finally {
501
+ if (mountedRef.current) setLoading(false);
502
+ }
503
+ }, [encodedSessionId, parsedFiles]);
504
+
505
+ const fetchWorkspaceFiles = useCallback(async () => {
506
+ setWorkspaceFilesLoading(true);
507
+ try {
508
+ const res = await fetch(`/api/sessions/${encodedSessionId}/files`, { cache: "no-store" });
509
+ if (!res.ok) {
510
+ if (res.status === 404) {
511
+ if (!mountedRef.current) return;
512
+ setWorkspaceFiles([]);
513
+ setWorkspaceFilesLoaded(true);
514
+ setWorkspaceFilesTruncated(false);
515
+ setWorkspaceFilesError(null);
516
+ return;
517
+ }
518
+
519
+ let message = `Failed to load workspace files (${res.status})`;
520
+ try {
521
+ const data = (await res.json()) as { error?: string };
522
+ if (typeof data.error === "string" && data.error.length > 0) {
523
+ message = data.error;
524
+ }
525
+ } catch {
526
+ // keep fallback
527
+ }
528
+ throw new Error(message);
529
+ }
530
+
531
+ const data = (await res.json()) as Partial<WorkspaceFilesPayload>;
532
+ if (!mountedRef.current) return;
533
+
534
+ const files = Array.isArray(data.files)
535
+ ? data.files.filter((file): file is string => typeof file === "string" && file.trim().length > 0)
536
+ : [];
537
+ setWorkspaceFiles(files);
538
+ setWorkspaceFilesLoaded(true);
539
+ setWorkspaceFilesTruncated(Boolean(data.truncated));
540
+ setWorkspaceFilesError(null);
541
+ setSelectedWorkspacePath((current) => (current && files.includes(current) ? current : (files[0] ?? null)));
542
+ } catch (err) {
543
+ if (!mountedRef.current) return;
544
+ setWorkspaceFiles([]);
545
+ setWorkspaceFilesLoaded(false);
546
+ setWorkspaceFilesError(err instanceof Error ? err.message : "Failed to load workspace files");
547
+ } finally {
548
+ if (mountedRef.current) setWorkspaceFilesLoading(false);
549
+ }
550
+ }, [encodedSessionId]);
551
+
552
+ const fetchWorkspaceFileContent = useCallback(async (path: string) => {
553
+ setWorkspaceFileLoading(true);
554
+ try {
555
+ const query = encodeURIComponent(path);
556
+ const res = await fetch(`/api/sessions/${encodedSessionId}/files?path=${query}`, { cache: "no-store" });
557
+ if (!res.ok) {
558
+ if (res.status === 404) {
559
+ if (!mountedRef.current) return;
560
+ setWorkspaceFileContent("");
561
+ setWorkspaceFileBinary(false);
562
+ setWorkspaceFileTruncated(false);
563
+ setWorkspaceFileSize(0);
564
+ setWorkspaceFileError("File no longer exists in this workspace.");
565
+ return;
566
+ }
567
+
568
+ let message = `Failed to load file content (${res.status})`;
569
+ try {
570
+ const data = (await res.json()) as { error?: string };
571
+ if (typeof data.error === "string" && data.error.length > 0) {
572
+ message = data.error;
573
+ }
574
+ } catch {
575
+ // keep fallback
576
+ }
577
+ throw new Error(message);
578
+ }
579
+
580
+ const data = (await res.json()) as Partial<WorkspaceFileContentPayload>;
581
+ if (!mountedRef.current) return;
582
+
583
+ setWorkspaceFileContent(typeof data.content === "string" ? data.content : "");
584
+ setWorkspaceFileBinary(Boolean(data.binary));
585
+ setWorkspaceFileTruncated(Boolean(data.truncated));
586
+ setWorkspaceFileSize(typeof data.size === "number" && Number.isFinite(data.size) ? Math.max(0, data.size) : 0);
587
+ setWorkspaceFileError(null);
588
+ } catch (err) {
589
+ if (!mountedRef.current) return;
590
+ setWorkspaceFileContent("");
591
+ setWorkspaceFileBinary(false);
592
+ setWorkspaceFileTruncated(false);
593
+ setWorkspaceFileSize(0);
594
+ setWorkspaceFileError(err instanceof Error ? err.message : "Failed to load file content");
595
+ } finally {
596
+ if (mountedRef.current) setWorkspaceFileLoading(false);
597
+ }
598
+ }, [encodedSessionId]);
599
+
600
+ useEffect(() => {
601
+ mountedRef.current = true;
602
+ snapshotSignatureRef.current = null;
603
+ terminalRef.current = false;
604
+ void fetchDiff();
605
+ const unsubscribe = subscribeToSnapshotEvents((event: SSESnapshotEvent) => {
606
+ if (!mountedRef.current) return;
607
+ const matchingSession = event.sessions.find((value) => value.id === sessionId);
608
+ if (!matchingSession) return;
609
+ terminalRef.current = TERMINAL_STATUSES.has(matchingSession.status);
610
+ const signature = `${matchingSession.status}:${matchingSession.lastActivityAt}`;
611
+ if (snapshotSignatureRef.current === signature) {
612
+ return;
613
+ }
614
+ snapshotSignatureRef.current = signature;
615
+ void fetchDiff();
616
+ });
617
+
618
+ let timeoutId: number | null = null;
619
+ const scheduleRefresh = () => {
620
+ const delay = document.visibilityState === "visible" && !terminalRef.current
621
+ ? ACTIVE_DIFF_REFRESH_MS
622
+ : HIDDEN_DIFF_REFRESH_MS;
623
+ timeoutId = window.setTimeout(async () => {
624
+ if (!mountedRef.current) return;
625
+ await fetchDiff();
626
+ if (mountedRef.current) {
627
+ scheduleRefresh();
628
+ }
629
+ }, delay);
630
+ };
631
+ scheduleRefresh();
632
+
633
+ const refresh = () => {
634
+ snapshotSignatureRef.current = null;
635
+ void fetchDiff();
636
+ };
637
+
638
+ const handleVisibilityChange = () => {
639
+ if (document.visibilityState === "visible") {
640
+ refresh();
641
+ }
642
+ };
643
+
644
+ window.addEventListener("focus", refresh);
645
+ document.addEventListener("visibilitychange", handleVisibilityChange);
646
+ return () => {
647
+ mountedRef.current = false;
648
+ unsubscribe();
649
+ if (timeoutId != null) {
650
+ window.clearTimeout(timeoutId);
651
+ }
652
+ window.removeEventListener("focus", refresh);
653
+ document.removeEventListener("visibilitychange", handleVisibilityChange);
654
+ };
655
+ }, [fetchDiff, sessionId]);
656
+
657
+ useEffect(() => {
658
+ snapshotSignatureRef.current = null;
659
+ terminalRef.current = false;
660
+ setLoading(true);
661
+ setSidebarView("changes");
662
+ setWorkspaceSearch("");
663
+ setSelectedWorkspacePath(null);
664
+ setWorkspaceFiles([]);
665
+ setWorkspaceFilesLoaded(false);
666
+ setWorkspaceFilesLoading(false);
667
+ setWorkspaceFilesError(null);
668
+ setWorkspaceFilesTruncated(false);
669
+ setWorkspaceFileContent("");
670
+ setWorkspaceFileBinary(false);
671
+ setWorkspaceFileTruncated(false);
672
+ setWorkspaceFileSize(0);
673
+ setWorkspaceFileLoading(false);
674
+ setWorkspaceFileError(null);
675
+ }, [sessionId]);
676
+
677
+ useEffect(() => {
678
+ if (sidebarView !== "files") return;
679
+ if (workspaceFilesLoaded || workspaceFilesLoading) return;
680
+ void fetchWorkspaceFiles();
681
+ }, [fetchWorkspaceFiles, sidebarView, workspaceFilesLoaded, workspaceFilesLoading]);
682
+
683
+ useEffect(() => {
684
+ if (sidebarView !== "files") return;
685
+ if (!selectedWorkspacePath) return;
686
+ void fetchWorkspaceFileContent(selectedWorkspacePath);
687
+ }, [fetchWorkspaceFileContent, selectedWorkspacePath, sidebarView]);
688
+
689
+ const allFiles = useMemo(() => normalizeDiffFiles(payload), [payload]);
690
+ const fileSearchValue = fileSearch.trim().toLowerCase();
691
+ const filteredFiles = useMemo(
692
+ () => (fileSearchValue.length === 0
693
+ ? allFiles
694
+ : allFiles.filter((file) => file.path.toLowerCase().includes(fileSearchValue))),
695
+ [allFiles, fileSearchValue],
696
+ );
697
+ const tree = useMemo(() => buildFileTree(filteredFiles), [filteredFiles]);
698
+ const totalAdds = useMemo(
699
+ () => allFiles.reduce((sum, file) => sum + Math.max(0, file.additions), 0),
700
+ [allFiles],
701
+ );
702
+ const totalDeletes = useMemo(
703
+ () => allFiles.reduce((sum, file) => sum + Math.max(0, file.deletions), 0),
704
+ [allFiles],
705
+ );
706
+ const selectedFile = useMemo(
707
+ () => (selectedPath
708
+ ? allFiles.find((file) => file.path === selectedPath) ?? null
709
+ : (allFiles[0] ?? null)),
710
+ [allFiles, selectedPath],
711
+ );
712
+ const workspaceSearchValue = workspaceSearch.trim().toLowerCase();
713
+ const filteredWorkspaceFiles = useMemo(
714
+ () => (workspaceSearchValue.length === 0
715
+ ? workspaceFiles
716
+ : workspaceFiles.filter((path) => path.toLowerCase().includes(workspaceSearchValue))),
717
+ [workspaceFiles, workspaceSearchValue],
718
+ );
719
+
720
+ function handleSelectFile(path: string) {
721
+ setSelectedPath(path);
722
+ setExpandedFiles((current) => ({ ...current, [path]: true }));
723
+ window.requestAnimationFrame(() => {
724
+ fileRefs.current[path]?.scrollIntoView({ behavior: "smooth", block: "start" });
725
+ });
726
+ }
727
+
728
+ function toggleFile(path: string) {
729
+ setExpandedFiles((current) => {
730
+ const currentlyExpanded = current[path] ?? true;
731
+ return { ...current, [path]: !currentlyExpanded };
732
+ });
733
+ }
734
+
735
+ function toggleDir(path: string) {
736
+ setCollapsedDirs((current) => ({ ...current, [path]: !current[path] }));
737
+ }
738
+
739
+ function renderTree(nodes: FileTreeNode[], depth = 0): ReactNode[] {
740
+ const rows: ReactNode[] = [];
741
+
742
+ for (const node of nodes) {
743
+ if (node.kind === "dir") {
744
+ const collapsed = Boolean(collapsedDirs[node.path]);
745
+ rows.push(
746
+ <button
747
+ key={`dir-${node.path}`}
748
+ type="button"
749
+ onClick={() => toggleDir(node.path)}
750
+ className="flex h-[26px] w-full items-center gap-1.5 pr-2 text-left text-[12px] text-[var(--vk-text-normal)] hover:bg-[var(--vk-bg-hover)]"
751
+ style={{ paddingLeft: `${8 + depth * 14}px` }}
752
+ >
753
+ {collapsed ? (
754
+ <ChevronRight className="h-3.5 w-3.5 shrink-0 text-[var(--vk-text-muted)]" />
755
+ ) : (
756
+ <ChevronDown className="h-3.5 w-3.5 shrink-0 text-[var(--vk-text-muted)]" />
757
+ )}
758
+ {collapsed ? (
759
+ <Folder className="h-3.5 w-3.5 shrink-0 text-[var(--vk-text-muted)]" />
760
+ ) : (
761
+ <FolderOpen className="h-3.5 w-3.5 shrink-0 text-[var(--vk-text-muted)]" />
762
+ )}
763
+ <span className="min-w-0 flex-1 truncate">{node.name}</span>
764
+ <span className="shrink-0 font-mono text-[11px] text-[var(--vk-text-muted)]">
765
+ {node.fileCount}
766
+ </span>
767
+ </button>,
768
+ );
769
+
770
+ if (!collapsed) {
771
+ rows.push(...renderTree(node.children, depth + 1));
772
+ }
773
+ continue;
774
+ }
775
+
776
+ const active = node.path === selectedPath;
777
+ rows.push(
778
+ <button
779
+ key={`file-${node.path}`}
780
+ type="button"
781
+ onClick={() => handleSelectFile(node.path)}
782
+ className={`flex h-[26px] w-full items-center gap-1.5 pr-2 text-left text-[12px] transition-colors ${
783
+ active
784
+ ? "bg-[var(--vk-bg-active)] text-[var(--vk-text-strong)]"
785
+ : "text-[var(--vk-text-normal)] hover:bg-[var(--vk-bg-hover)]"
786
+ }`}
787
+ style={{ paddingLeft: `${8 + depth * 14}px` }}
788
+ >
789
+ <span className="inline-flex w-4 shrink-0 justify-center">
790
+ {node.untracked ? (
791
+ <FilePlus2 className="h-3.5 w-3.5 text-[var(--vk-green)]" />
792
+ ) : (
793
+ <FileCode2 className="h-3.5 w-3.5 text-[var(--vk-text-muted)]" />
794
+ )}
795
+ </span>
796
+ <span className="min-w-0 flex-1 truncate">{node.name}</span>
797
+ {node.additions > 0 && (
798
+ <span className="shrink-0 font-mono text-[11px] text-[var(--vk-green)]">+{node.additions}</span>
799
+ )}
800
+ {node.deletions > 0 && (
801
+ <span className="shrink-0 font-mono text-[11px] text-[var(--vk-red)]">-{node.deletions}</span>
802
+ )}
803
+ </button>,
804
+ );
805
+ }
806
+
807
+ return rows;
808
+ }
809
+
810
+ return (
811
+ <div className="flex h-full min-h-0 flex-col overflow-hidden rounded-[3px] border border-[var(--vk-border)] bg-[var(--vk-bg-panel)]">
812
+ <div className="flex h-[32px] shrink-0 items-center border-b border-[var(--vk-border)] px-2">
813
+ <div className="flex min-w-0 items-center gap-2">
814
+ <GitCompare className="h-[15px] w-[15px] text-[var(--vk-text-muted)]" />
815
+ <span className="truncate text-[13px] font-medium text-[var(--vk-text-strong)]">Review Diff</span>
816
+ <Badge variant="outline" className="h-[20px] px-1.5 text-[10px]">
817
+ {sourceLabel(payload.source)}
818
+ </Badge>
819
+ </div>
820
+ <div className="ml-auto flex items-center gap-2">
821
+ <span className="hidden text-[11px] text-[var(--vk-text-muted)] md:inline">
822
+ {formatGeneratedAt(payload.generatedAt)}
823
+ </span>
824
+ <button
825
+ type="button"
826
+ onClick={() => void fetchDiff()}
827
+ disabled={loading}
828
+ className="inline-flex h-[22px] w-[22px] items-center justify-center rounded-[3px] text-[var(--vk-text-muted)] hover:bg-[var(--vk-bg-hover)] disabled:opacity-60"
829
+ aria-label="Refresh diff"
830
+ >
831
+ <RefreshCw className={`h-[14px] w-[14px] ${loading ? "animate-spin" : ""}`} />
832
+ </button>
833
+ <button
834
+ type="button"
835
+ onClick={() => setWrapLines((value) => !value)}
836
+ className={`inline-flex h-[22px] items-center gap-1 rounded-[3px] px-1.5 text-[11px] ${
837
+ wrapLines
838
+ ? "bg-[var(--vk-bg-active)] text-[var(--vk-text-strong)]"
839
+ : "text-[var(--vk-text-muted)] hover:bg-[var(--vk-bg-hover)]"
840
+ }`}
841
+ aria-label="Toggle wrapped lines"
842
+ >
843
+ <WrapText className="h-[14px] w-[14px]" />
844
+ Wrap
845
+ </button>
846
+ </div>
847
+ </div>
848
+
849
+ <div className="flex min-h-0 flex-1 flex-col xl:flex-row">
850
+ <section className="flex min-h-0 min-w-0 flex-1 flex-col border-b border-[var(--vk-border)] xl:border-b-0 xl:border-r">
851
+ <div className="flex h-[30px] shrink-0 items-center gap-2 border-b border-[var(--vk-border)] px-2 text-[11px] text-[var(--vk-text-muted)]">
852
+ <span>{allFiles.length} files changed</span>
853
+ <span className="inline-flex items-center gap-0.5 text-[var(--vk-green)]">
854
+ <Plus className="h-[12px] w-[12px]" />
855
+ {totalAdds}
856
+ </span>
857
+ <span className="inline-flex items-center gap-0.5 text-[var(--vk-red)]">
858
+ <Minus className="h-[12px] w-[12px]" />
859
+ {totalDeletes}
860
+ </span>
861
+ {payload.truncated && (
862
+ <span className="ml-auto text-[var(--status-attention)]">Output truncated</span>
863
+ )}
864
+ </div>
865
+
866
+ <div className="min-h-0 flex-1 overflow-auto bg-[var(--vk-bg-panel)]">
867
+ {loading && allFiles.length === 0 && !error && (
868
+ <div className="flex h-full items-center justify-center p-8 text-[13px] text-[var(--vk-text-muted)]">
869
+ Loading session diff...
870
+ </div>
871
+ )}
872
+
873
+ {error && (
874
+ <div className="flex h-full items-center justify-center p-8 text-center text-[13px] text-[var(--status-error)]">
875
+ {error}
876
+ </div>
877
+ )}
878
+
879
+ {!loading && !error && allFiles.length === 0 && (
880
+ <div className="flex h-full flex-col items-center justify-center gap-2 p-8 text-center">
881
+ <CircleAlert className="h-7 w-7 text-[var(--vk-text-muted)]" />
882
+ <p className="text-[13px] text-[var(--vk-text-muted)]">No changed files in this session yet.</p>
883
+ </div>
884
+ )}
885
+
886
+ {!error &&
887
+ allFiles.length > 0 &&
888
+ allFiles.map((file) => {
889
+ const expanded = expandedFiles[file.path] ?? true;
890
+ const selected = selectedFile?.path === file.path;
891
+
892
+ return (
893
+ <div
894
+ key={file.path}
895
+ ref={(node) => {
896
+ fileRefs.current[file.path] = node;
897
+ }}
898
+ className={`border-b border-[var(--vk-border)] ${selected ? "bg-[var(--vk-bg-active)]/40" : "bg-[var(--vk-bg-panel)]"}`}
899
+ >
900
+ <div className="flex min-h-[40px] items-center gap-2 px-2">
901
+ <button
902
+ type="button"
903
+ onClick={() => toggleFile(file.path)}
904
+ className="inline-flex h-[20px] w-[20px] items-center justify-center rounded-[3px] text-[var(--vk-text-muted)] hover:bg-[var(--vk-bg-hover)]"
905
+ aria-label={expanded ? `Collapse ${file.path}` : `Expand ${file.path}`}
906
+ >
907
+ {expanded ? (
908
+ <ChevronDown className="h-[15px] w-[15px]" />
909
+ ) : (
910
+ <ChevronRight className="h-[15px] w-[15px]" />
911
+ )}
912
+ </button>
913
+
914
+ <span
915
+ className={`inline-flex h-[23px] min-w-[58px] items-center justify-center rounded-[3px] border px-1.5 text-[11px] ${statusPillClass(file)}`}
916
+ >
917
+ {statusLabel(file)}
918
+ </span>
919
+
920
+ <button
921
+ type="button"
922
+ onClick={() => handleSelectFile(file.path)}
923
+ className={`min-w-0 flex-1 truncate text-left font-mono text-[12px] ${
924
+ selected ? "text-[var(--vk-text-strong)]" : "text-[var(--vk-text-normal)]"
925
+ }`}
926
+ >
927
+ {file.path}
928
+ </button>
929
+
930
+ <div className="flex items-center gap-2 font-mono text-[11px]">
931
+ {file.additions > 0 && <span className="text-[var(--vk-green)]">+{file.additions}</span>}
932
+ {file.deletions > 0 && <span className="text-[var(--vk-red)]">-{file.deletions}</span>}
933
+ {file.additions === 0 && file.deletions === 0 && (
934
+ <span className="text-[var(--vk-text-muted)]">0</span>
935
+ )}
936
+ </div>
937
+ </div>
938
+
939
+ {expanded && (
940
+ <div className="border-t border-[var(--vk-border)] bg-[var(--vk-bg-outer)]/30">
941
+ {file.lines.length === 0 ? (
942
+ <div className="px-2 py-2 font-mono text-[11px] text-[var(--vk-text-muted)]">
943
+ {file.untracked
944
+ ? "Untracked file (line-level diff unavailable until staged)."
945
+ : "No line-level diff output for this file."}
946
+ </div>
947
+ ) : (
948
+ <div className={wrapLines ? "" : "overflow-x-auto"}>
949
+ <div className={wrapLines ? "" : "min-w-[760px]"}>
950
+ <div className="grid grid-cols-[56px_56px_20px_minmax(0,1fr)] border-b border-[var(--vk-border)] bg-[var(--vk-bg-panel)] px-2 py-1 font-mono text-[10px] uppercase tracking-wide text-[var(--vk-text-muted)]">
951
+ <div>Old</div>
952
+ <div>New</div>
953
+ <div />
954
+ <div>Line</div>
955
+ </div>
956
+
957
+ {file.lines.map((line, index) => (
958
+ <div
959
+ key={`${file.path}-${index}-${line.oldLine ?? "x"}-${line.newLine ?? "y"}`}
960
+ className={`grid grid-cols-[56px_56px_20px_minmax(0,1fr)] border-b border-[var(--vk-border)] px-2 py-[2px] font-mono text-[11px] last:border-b-0 ${lineTone(line.kind)}`}
961
+ >
962
+ <div className="text-[var(--vk-text-muted)]">{line.oldLine ?? ""}</div>
963
+ <div className="text-[var(--vk-text-muted)]">{line.newLine ?? ""}</div>
964
+ <div className={lineTextTone(line.kind)}>{markerForLine(line.kind)}</div>
965
+ <div className={`${lineTextTone(line.kind)} ${wrapLines ? "whitespace-pre-wrap break-words" : "whitespace-pre"}`}>
966
+ {line.text}
967
+ </div>
968
+ </div>
969
+ ))}
970
+ </div>
971
+ </div>
972
+ )}
973
+ </div>
974
+ )}
975
+ </div>
976
+ );
977
+ })}
978
+ </div>
979
+ </section>
980
+
981
+ <aside className="flex min-h-0 w-full shrink-0 flex-col bg-[var(--vk-bg-panel)] xl:w-[299px]">
982
+ <div className="flex h-[32px] items-center gap-1 border-b border-[var(--vk-border)] p-1">
983
+ <button
984
+ type="button"
985
+ onClick={() => setSidebarView("changes")}
986
+ className={`inline-flex h-[24px] items-center rounded-[3px] px-2 text-[12px] ${
987
+ sidebarView === "changes"
988
+ ? "bg-[var(--vk-bg-active)] text-[var(--vk-text-strong)]"
989
+ : "text-[var(--vk-text-muted)] hover:bg-[var(--vk-bg-hover)]"
990
+ }`}
991
+ >
992
+ Changes
993
+ </button>
994
+ <button
995
+ type="button"
996
+ onClick={() => setSidebarView("files")}
997
+ className={`inline-flex h-[24px] items-center rounded-[3px] px-2 text-[12px] ${
998
+ sidebarView === "files"
999
+ ? "bg-[var(--vk-bg-active)] text-[var(--vk-text-strong)]"
1000
+ : "text-[var(--vk-text-muted)] hover:bg-[var(--vk-bg-hover)]"
1001
+ }`}
1002
+ >
1003
+ Files
1004
+ </button>
1005
+ </div>
1006
+
1007
+ {sidebarView === "changes" ? (
1008
+ <>
1009
+ <div className="border-b border-[var(--vk-border)] p-2">
1010
+ <div className="flex items-center gap-2 rounded-[3px] border border-[var(--vk-border)] bg-[var(--vk-bg-panel)] px-2 py-[5px]">
1011
+ <Search className="h-[15px] w-[15px] text-[var(--vk-text-muted)]" />
1012
+ <input
1013
+ type="text"
1014
+ value={fileSearch}
1015
+ onChange={(event) => setFileSearch(event.target.value)}
1016
+ placeholder="Search files..."
1017
+ className="h-[20px] w-full bg-transparent text-[14px] text-[var(--vk-text-normal)] outline-none placeholder:text-[var(--vk-text-muted)]"
1018
+ />
1019
+ {fileSearch.length > 0 && (
1020
+ <button
1021
+ type="button"
1022
+ onClick={() => setFileSearch("")}
1023
+ className="inline-flex h-[17px] w-[17px] items-center justify-center rounded-[3px] text-[var(--vk-text-muted)] hover:bg-[var(--vk-bg-hover)]"
1024
+ aria-label="Clear file search"
1025
+ >
1026
+ <X className="h-[12px] w-[12px]" />
1027
+ </button>
1028
+ )}
1029
+ </div>
1030
+ </div>
1031
+
1032
+ <div className="min-h-0 flex-1 overflow-auto">
1033
+ {filteredFiles.length === 0 ? (
1034
+ <div className="px-3 py-3 text-[13px] text-[var(--vk-text-muted)]">
1035
+ {fileSearchValue.length > 0 ? "No files match the current search." : "No changed files."}
1036
+ </div>
1037
+ ) : (
1038
+ <div className="py-1">{renderTree(tree.children)}</div>
1039
+ )}
1040
+ </div>
1041
+
1042
+ <div className="border-t border-[var(--vk-border)] p-2">
1043
+ <div className="text-[16px] font-medium text-[var(--vk-text-normal)]">Git</div>
1044
+ <div className="mt-2 rounded-[3px] border border-[var(--vk-border)] bg-[var(--vk-bg-main)] px-2 py-2">
1045
+ <div className="flex items-center justify-between text-[12px] text-[var(--vk-text-muted)]">
1046
+ <span>Files</span>
1047
+ <span className="font-mono text-[var(--vk-text-normal)]">{allFiles.length}</span>
1048
+ </div>
1049
+ <div className="mt-1 flex items-center justify-between text-[12px]">
1050
+ <span className="text-[var(--vk-text-muted)]">Added</span>
1051
+ <span className="font-mono text-[var(--vk-green)]">+{totalAdds}</span>
1052
+ </div>
1053
+ <div className="mt-1 flex items-center justify-between text-[12px]">
1054
+ <span className="text-[var(--vk-text-muted)]">Deleted</span>
1055
+ <span className="font-mono text-[var(--vk-red)]">-{totalDeletes}</span>
1056
+ </div>
1057
+ <div className="mt-1 flex items-center justify-between text-[12px]">
1058
+ <span className="text-[var(--vk-text-muted)]">Source</span>
1059
+ <span className="font-mono text-[var(--vk-text-normal)]">{sourceLabel(payload.source)}</span>
1060
+ </div>
1061
+ </div>
1062
+ </div>
1063
+ </>
1064
+ ) : (
1065
+ <>
1066
+ <div className="border-b border-[var(--vk-border)] p-2">
1067
+ <div className="flex items-center gap-2 rounded-[3px] border border-[var(--vk-border)] bg-[var(--vk-bg-panel)] px-2 py-[5px]">
1068
+ <Search className="h-[15px] w-[15px] text-[var(--vk-text-muted)]" />
1069
+ <input
1070
+ type="text"
1071
+ value={workspaceSearch}
1072
+ onChange={(event) => setWorkspaceSearch(event.target.value)}
1073
+ placeholder="Search all files..."
1074
+ className="h-[20px] w-full bg-transparent text-[14px] text-[var(--vk-text-normal)] outline-none placeholder:text-[var(--vk-text-muted)]"
1075
+ />
1076
+ {workspaceSearch.length > 0 && (
1077
+ <button
1078
+ type="button"
1079
+ onClick={() => setWorkspaceSearch("")}
1080
+ className="inline-flex h-[17px] w-[17px] items-center justify-center rounded-[3px] text-[var(--vk-text-muted)] hover:bg-[var(--vk-bg-hover)]"
1081
+ aria-label="Clear workspace file search"
1082
+ >
1083
+ <X className="h-[12px] w-[12px]" />
1084
+ </button>
1085
+ )}
1086
+ </div>
1087
+ </div>
1088
+
1089
+ <div className="flex min-h-0 flex-1 flex-col">
1090
+ <div className="min-h-0 flex-1 overflow-auto border-b border-[var(--vk-border)]">
1091
+ {workspaceFilesLoading && (
1092
+ <div className="px-3 py-3 text-[13px] text-[var(--vk-text-muted)]">
1093
+ Loading workspace files...
1094
+ </div>
1095
+ )}
1096
+
1097
+ {workspaceFilesError && (
1098
+ <div className="px-3 py-3 text-[13px] text-[var(--status-error)]">
1099
+ {workspaceFilesError}
1100
+ </div>
1101
+ )}
1102
+
1103
+ {!workspaceFilesLoading && !workspaceFilesError && filteredWorkspaceFiles.length === 0 && (
1104
+ <div className="px-3 py-3 text-[13px] text-[var(--vk-text-muted)]">
1105
+ {workspaceSearchValue.length > 0 ? "No files match the current search." : "No files found."}
1106
+ </div>
1107
+ )}
1108
+
1109
+ {!workspaceFilesLoading && !workspaceFilesError && filteredWorkspaceFiles.length > 0 && (
1110
+ <div className="py-1">
1111
+ {filteredWorkspaceFiles.map((path) => {
1112
+ const selected = path === selectedWorkspacePath;
1113
+ const fileName = path.split("/").pop() ?? path;
1114
+ return (
1115
+ <button
1116
+ key={path}
1117
+ type="button"
1118
+ onClick={() => setSelectedWorkspacePath(path)}
1119
+ className={`flex h-[26px] w-full items-center gap-1.5 px-2 text-left text-[12px] ${
1120
+ selected
1121
+ ? "bg-[var(--vk-bg-active)] text-[var(--vk-text-strong)]"
1122
+ : "text-[var(--vk-text-normal)] hover:bg-[var(--vk-bg-hover)]"
1123
+ }`}
1124
+ >
1125
+ <FileCode2 className="h-3.5 w-3.5 shrink-0 text-[var(--vk-text-muted)]" />
1126
+ <span className="truncate">{fileName}</span>
1127
+ </button>
1128
+ );
1129
+ })}
1130
+ </div>
1131
+ )}
1132
+ </div>
1133
+
1134
+ <div className="min-h-0 flex-1 overflow-auto bg-[var(--vk-bg-main)] p-2">
1135
+ <div className="flex items-center justify-between border-b border-[var(--vk-border)] pb-2">
1136
+ <span className="truncate font-mono text-[11px] text-[var(--vk-text-normal)]">
1137
+ {selectedWorkspacePath ?? "Select a file"}
1138
+ </span>
1139
+ {workspaceFileSize > 0 && (
1140
+ <span className="ml-2 shrink-0 font-mono text-[10px] text-[var(--vk-text-muted)]">
1141
+ {workspaceFileSize.toLocaleString()} bytes
1142
+ </span>
1143
+ )}
1144
+ </div>
1145
+
1146
+ {workspaceFilesTruncated && (
1147
+ <p className="pt-2 text-[11px] text-[var(--status-attention)]">
1148
+ File list truncated to the first 4000 files.
1149
+ </p>
1150
+ )}
1151
+
1152
+ {workspaceFileLoading && (
1153
+ <p className="pt-2 text-[12px] text-[var(--vk-text-muted)]">Loading file content...</p>
1154
+ )}
1155
+
1156
+ {workspaceFileError && (
1157
+ <p className="pt-2 text-[12px] text-[var(--status-error)]">{workspaceFileError}</p>
1158
+ )}
1159
+
1160
+ {!workspaceFileLoading && !workspaceFileError && selectedWorkspacePath && workspaceFileBinary && (
1161
+ <p className="pt-2 text-[12px] text-[var(--vk-text-muted)]">
1162
+ Binary file preview is not available.
1163
+ </p>
1164
+ )}
1165
+
1166
+ {!workspaceFileLoading &&
1167
+ !workspaceFileError &&
1168
+ selectedWorkspacePath &&
1169
+ !workspaceFileBinary &&
1170
+ workspaceFileContent.length > 0 && (
1171
+ <pre className="pt-2 whitespace-pre-wrap break-words font-mono text-[11px] text-[var(--vk-text-normal)]">
1172
+ {workspaceFileContent}
1173
+ </pre>
1174
+ )}
1175
+
1176
+ {!workspaceFileLoading &&
1177
+ !workspaceFileError &&
1178
+ selectedWorkspacePath &&
1179
+ !workspaceFileBinary &&
1180
+ workspaceFileContent.length === 0 && (
1181
+ <p className="pt-2 text-[12px] text-[var(--vk-text-muted)]">File is empty.</p>
1182
+ )}
1183
+
1184
+ {workspaceFileTruncated && (
1185
+ <p className="pt-2 text-[11px] text-[var(--status-attention)]">
1186
+ Preview truncated to 1 MB.
1187
+ </p>
1188
+ )}
1189
+ </div>
1190
+ </div>
1191
+ </>
1192
+ )}
1193
+ </aside>
1194
+ </div>
1195
+ </div>
1196
+ );
1197
+ }