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,1316 @@
1
+ "use client";
2
+
3
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
4
+ import { useRouter } from "next/navigation";
5
+ import { ExternalLink, Loader2, Pencil, Plus, Search } from "lucide-react";
6
+ import { AgentTileIcon } from "@/components/AgentTileIcon";
7
+ import { cn } from "@/lib/cn";
8
+
9
+ type BoardRole =
10
+ | "intake"
11
+ | "ready"
12
+ | "dispatching"
13
+ | "inProgress"
14
+ | "needsInput"
15
+ | "blocked"
16
+ | "errored"
17
+ | "review"
18
+ | "merge"
19
+ | "done"
20
+ | "cancelled";
21
+
22
+ type BoardTask = {
23
+ id: string;
24
+ text: string;
25
+ checked: boolean;
26
+ agent: string | null;
27
+ project: string | null;
28
+ type: string | null;
29
+ priority: string | null;
30
+ taskRef: string | null;
31
+ attemptRef: string | null;
32
+ };
33
+
34
+ type BoardColumn = {
35
+ role: BoardRole;
36
+ heading: string;
37
+ tasks: BoardTask[];
38
+ };
39
+
40
+ type BoardResponse = {
41
+ projectId: string;
42
+ boardPath: string;
43
+ workspacePath: string;
44
+ columns: BoardColumn[];
45
+ primaryRoles: BoardRole[];
46
+ watcherHint?: string;
47
+ };
48
+
49
+ type ContextFile = {
50
+ path: string;
51
+ name: string;
52
+ kind: "image" | "file";
53
+ source?: string;
54
+ sizeBytes?: number | null;
55
+ };
56
+
57
+ type ContextFilesResponse = {
58
+ files: ContextFile[];
59
+ };
60
+
61
+ type ProjectSession = {
62
+ id: string;
63
+ branch: string | null;
64
+ summary: string | null;
65
+ status: string;
66
+ issueId?: string | null;
67
+ lastActivityAt?: string | null;
68
+ metadata?: Record<string, string> | null;
69
+ };
70
+
71
+ interface WorkspaceKanbanProps {
72
+ projectId: string | null;
73
+ defaultAgent: string;
74
+ agentOptions: string[];
75
+ }
76
+
77
+ const ROLE_COLOR: Record<BoardRole, string> = {
78
+ intake: "#3c83f6",
79
+ ready: "#f59f0a",
80
+ dispatching: "#fb923c",
81
+ inProgress: "#f59f0a",
82
+ needsInput: "#eab308",
83
+ blocked: "#d53946",
84
+ errored: "#ef4444",
85
+ review: "#895af6",
86
+ merge: "#06b6d4",
87
+ done: "#21c45d",
88
+ cancelled: "#6b7280",
89
+ };
90
+
91
+ const ROLE_LABEL: Record<BoardRole, string> = {
92
+ intake: "To do",
93
+ ready: "Ready",
94
+ dispatching: "Dispatching",
95
+ inProgress: "In progress",
96
+ needsInput: "Needs input",
97
+ blocked: "Blocked",
98
+ errored: "Errored",
99
+ review: "In review",
100
+ merge: "Merge",
101
+ done: "Done",
102
+ cancelled: "Cancelled",
103
+ };
104
+ const ACTIVE_BOARD_REFRESH_MS = 10_000;
105
+ const HIDDEN_BOARD_REFRESH_MS = 30_000;
106
+
107
+ function toRole(value: string): BoardRole {
108
+ const roles: BoardRole[] = ["intake", "ready", "dispatching", "inProgress", "needsInput", "blocked", "errored", "review", "merge", "done", "cancelled"];
109
+ return roles.includes(value as BoardRole) ? (value as BoardRole) : "intake";
110
+ }
111
+
112
+ function splitTaskText(text: string): { title: string; description: string } {
113
+ const [title, ...rest] = text.split(" - ");
114
+ return {
115
+ title: (title ?? text).trim(),
116
+ description: rest.join(" - ").trim(),
117
+ };
118
+ }
119
+
120
+ function formatAgentLabel(value: string): string {
121
+ return value
122
+ .split(/[-_\s]+/g)
123
+ .filter(Boolean)
124
+ .map((segment) => segment[0]?.toUpperCase() + segment.slice(1))
125
+ .join(" ");
126
+ }
127
+
128
+ function formatFileSize(value: number | null | undefined): string {
129
+ if (!value || value <= 0) return "";
130
+ if (value < 1024) return `${value} B`;
131
+ if (value < 1024 * 1024) return `${(value / 1024).toFixed(1)} KB`;
132
+ return `${(value / (1024 * 1024)).toFixed(1)} MB`;
133
+ }
134
+
135
+ function boardsEqual(left: BoardResponse | null, right: BoardResponse): boolean {
136
+ if (!left) return false;
137
+ if (
138
+ left.projectId !== right.projectId ||
139
+ left.boardPath !== right.boardPath ||
140
+ left.workspacePath !== right.workspacePath ||
141
+ left.watcherHint !== right.watcherHint ||
142
+ left.primaryRoles.length !== right.primaryRoles.length ||
143
+ left.columns.length !== right.columns.length
144
+ ) {
145
+ return false;
146
+ }
147
+
148
+ for (let index = 0; index < left.primaryRoles.length; index += 1) {
149
+ if (left.primaryRoles[index] !== right.primaryRoles[index]) {
150
+ return false;
151
+ }
152
+ }
153
+
154
+ for (let columnIndex = 0; columnIndex < left.columns.length; columnIndex += 1) {
155
+ const leftColumn = left.columns[columnIndex];
156
+ const rightColumn = right.columns[columnIndex];
157
+ if (
158
+ leftColumn.role !== rightColumn.role ||
159
+ leftColumn.heading !== rightColumn.heading ||
160
+ leftColumn.tasks.length !== rightColumn.tasks.length
161
+ ) {
162
+ return false;
163
+ }
164
+
165
+ for (let taskIndex = 0; taskIndex < leftColumn.tasks.length; taskIndex += 1) {
166
+ const leftTask = leftColumn.tasks[taskIndex];
167
+ const rightTask = rightColumn.tasks[taskIndex];
168
+ if (
169
+ leftTask.id !== rightTask.id ||
170
+ leftTask.text !== rightTask.text ||
171
+ leftTask.checked !== rightTask.checked ||
172
+ leftTask.agent !== rightTask.agent ||
173
+ leftTask.project !== rightTask.project ||
174
+ leftTask.type !== rightTask.type ||
175
+ leftTask.priority !== rightTask.priority ||
176
+ leftTask.taskRef !== rightTask.taskRef ||
177
+ leftTask.attemptRef !== rightTask.attemptRef
178
+ ) {
179
+ return false;
180
+ }
181
+ }
182
+ }
183
+
184
+ return true;
185
+ }
186
+
187
+ function formatLinkedSessionLabel(session: ProjectSession): string {
188
+ return session.branch?.trim() || session.summary?.trim() || session.id.slice(0, 8);
189
+ }
190
+
191
+ function getTaskLinkKey(task: BoardTask): string {
192
+ return task.taskRef?.trim() || task.id;
193
+ }
194
+
195
+ function getSessionAgent(session: ProjectSession): string | null {
196
+ const candidate = session.metadata?.agent;
197
+ return typeof candidate === "string" && candidate.trim().length > 0 ? candidate.trim() : null;
198
+ }
199
+
200
+ function formatSessionStatus(status: string): string {
201
+ const normalized = status.trim().toLowerCase();
202
+ if (normalized === "working" || normalized === "running") return "Running";
203
+ if (normalized === "done") return "Done";
204
+ if (normalized === "killed") return "Interrupted";
205
+ if (normalized === "errored") return "Errored";
206
+ if (normalized === "archived") return "Archived";
207
+ return status
208
+ .split(/[-_\s]+/g)
209
+ .filter(Boolean)
210
+ .map((part) => part[0]?.toUpperCase() + part.slice(1))
211
+ .join(" ");
212
+ }
213
+
214
+ function sessionStatusPillClass(status: string): string {
215
+ const normalized = status.trim().toLowerCase();
216
+ if (normalized === "working" || normalized === "running") {
217
+ return "border-[rgba(60,131,246,0.35)] bg-[rgba(60,131,246,0.12)] text-[#8db8ff]";
218
+ }
219
+ if (normalized === "done") {
220
+ return "border-[rgba(84,176,79,0.35)] bg-[rgba(84,176,79,0.12)] text-[var(--vk-green)]";
221
+ }
222
+ if (normalized === "killed" || normalized === "archived") {
223
+ return "border-[rgba(143,143,143,0.35)] bg-[rgba(143,143,143,0.10)] text-[var(--vk-text-muted)]";
224
+ }
225
+ if (normalized === "errored") {
226
+ return "border-[rgba(210,81,81,0.35)] bg-[rgba(210,81,81,0.12)] text-[var(--vk-red)]";
227
+ }
228
+ return "border-[var(--vk-border)] bg-[rgba(255,255,255,0.03)] text-[var(--vk-text-muted)]";
229
+ }
230
+
231
+ function compareProjectSessions(left: ProjectSession, right: ProjectSession, primaryId: string | null): number {
232
+ if (primaryId) {
233
+ if (left.id === primaryId && right.id !== primaryId) return -1;
234
+ if (right.id === primaryId && left.id !== primaryId) return 1;
235
+ }
236
+ const leftTime = left.lastActivityAt ? Date.parse(left.lastActivityAt) : 0;
237
+ const rightTime = right.lastActivityAt ? Date.parse(right.lastActivityAt) : 0;
238
+ return rightTime - leftTime;
239
+ }
240
+
241
+ export function WorkspaceKanban({ projectId, defaultAgent, agentOptions }: WorkspaceKanbanProps) {
242
+ const router = useRouter();
243
+ const [board, setBoard] = useState<BoardResponse | null>(null);
244
+ const [loading, setLoading] = useState(false);
245
+ const [error, setError] = useState<string | null>(null);
246
+ const [search, setSearch] = useState("");
247
+
248
+ const [composerOpen, setComposerOpen] = useState(false);
249
+ const [composerRole, setComposerRole] = useState<BoardRole>("intake");
250
+ const [title, setTitle] = useState("");
251
+ const [description, setDescription] = useState("");
252
+ const [agent, setAgent] = useState(defaultAgent);
253
+ const [taskType, setTaskType] = useState("feature");
254
+ const [priority, setPriority] = useState("normal");
255
+ const [contextNotes, setContextNotes] = useState("");
256
+ const [selectedContextPaths, setSelectedContextPaths] = useState<string[]>([]);
257
+ const [contextSearch, setContextSearch] = useState("");
258
+ const [contextFiles, setContextFiles] = useState<ContextFile[]>([]);
259
+ const [contextLoading, setContextLoading] = useState(false);
260
+ const [contextError, setContextError] = useState<string | null>(null);
261
+ const [uploadFiles, setUploadFiles] = useState<File[]>([]);
262
+ const [submitting, setSubmitting] = useState(false);
263
+ const [submitError, setSubmitError] = useState<string | null>(null);
264
+ const [projectSessions, setProjectSessions] = useState<ProjectSession[]>([]);
265
+ const [editingTask, setEditingTask] = useState<{ task: BoardTask; role: BoardRole } | null>(null);
266
+ const [editRole, setEditRole] = useState<BoardRole>("intake");
267
+ const [editTitle, setEditTitle] = useState("");
268
+ const [editDescription, setEditDescription] = useState("");
269
+ const [editAgent, setEditAgent] = useState(defaultAgent);
270
+ const [editTaskType, setEditTaskType] = useState("feature");
271
+ const [editPriority, setEditPriority] = useState("normal");
272
+ const [editLinkedSession, setEditLinkedSession] = useState("");
273
+ const [editingBusy, setEditingBusy] = useState(false);
274
+ const [editingError, setEditingError] = useState<string | null>(null);
275
+ const [draggingTask, setDraggingTask] = useState<{ taskId: string; role: BoardRole } | null>(null);
276
+ const hasLoadedBoardRef = useRef(false);
277
+ const boardRequestInFlightRef = useRef(false);
278
+
279
+ const orderedAgentOptions = useMemo(() => {
280
+ const normalized = [...new Set(agentOptions.filter(Boolean))];
281
+ if (!normalized.includes(defaultAgent)) {
282
+ normalized.unshift(defaultAgent);
283
+ }
284
+ return normalized;
285
+ }, [agentOptions, defaultAgent]);
286
+
287
+ useEffect(() => {
288
+ if (!orderedAgentOptions.includes(agent)) {
289
+ setAgent(orderedAgentOptions[0] ?? "qwen-code");
290
+ }
291
+ }, [agent, orderedAgentOptions]);
292
+
293
+ useEffect(() => {
294
+ if (!orderedAgentOptions.includes(editAgent)) {
295
+ setEditAgent(orderedAgentOptions[0] ?? "qwen-code");
296
+ }
297
+ }, [editAgent, orderedAgentOptions]);
298
+
299
+ useEffect(() => {
300
+ if (!composerOpen || !projectId) return;
301
+ let cancelled = false;
302
+
303
+ const loadContextFiles = async () => {
304
+ setContextLoading(true);
305
+ setContextError(null);
306
+ try {
307
+ const res = await fetch(`/api/context-files?projectId=${encodeURIComponent(projectId)}`);
308
+ const payload = (await res.json().catch(() => null)) as
309
+ | ContextFilesResponse
310
+ | { error?: string }
311
+ | null;
312
+ if (!res.ok) {
313
+ throw new Error((payload as { error?: string } | null)?.error ?? `Failed to load context files: ${res.status}`);
314
+ }
315
+ if (cancelled) return;
316
+ const files = Array.isArray((payload as ContextFilesResponse | null)?.files)
317
+ ? (payload as ContextFilesResponse).files
318
+ : [];
319
+ setContextFiles(files);
320
+ } catch (err) {
321
+ if (cancelled) return;
322
+ setContextFiles([]);
323
+ setContextError(err instanceof Error ? err.message : "Failed to load context files");
324
+ } finally {
325
+ if (!cancelled) setContextLoading(false);
326
+ }
327
+ };
328
+
329
+ void loadContextFiles();
330
+ return () => {
331
+ cancelled = true;
332
+ };
333
+ }, [composerOpen, projectId]);
334
+
335
+ useEffect(() => {
336
+ if (!projectId || (!composerOpen && !editingTask)) return;
337
+ let cancelled = false;
338
+
339
+ const loadProjectSessions = async () => {
340
+ try {
341
+ const res = await fetch(`/api/sessions?project=${encodeURIComponent(projectId)}`);
342
+ const payload = (await res.json().catch(() => null)) as
343
+ | { sessions?: ProjectSession[] }
344
+ | ProjectSession[]
345
+ | null;
346
+ if (!res.ok) {
347
+ throw new Error(`Failed to load sessions: ${res.status}`);
348
+ }
349
+ if (cancelled) return;
350
+ const sessions = Array.isArray(payload)
351
+ ? payload
352
+ : Array.isArray(payload?.sessions)
353
+ ? payload.sessions
354
+ : [];
355
+ setProjectSessions(sessions);
356
+ } catch {
357
+ if (!cancelled) {
358
+ setProjectSessions([]);
359
+ }
360
+ }
361
+ };
362
+
363
+ void loadProjectSessions();
364
+ return () => {
365
+ cancelled = true;
366
+ };
367
+ }, [composerOpen, editingTask, projectId]);
368
+
369
+ useEffect(() => {
370
+ hasLoadedBoardRef.current = false;
371
+ }, [projectId]);
372
+
373
+ const loadBoard = useCallback(async (options?: { silent?: boolean }) => {
374
+ if (!projectId) {
375
+ setBoard(null);
376
+ setError(null);
377
+ setLoading(false);
378
+ hasLoadedBoardRef.current = false;
379
+ return;
380
+ }
381
+ if (boardRequestInFlightRef.current) {
382
+ return;
383
+ }
384
+
385
+ boardRequestInFlightRef.current = true;
386
+
387
+ if (!options?.silent) {
388
+ setLoading(true);
389
+ }
390
+ try {
391
+ const res = await fetch(`/api/boards?projectId=${encodeURIComponent(projectId)}`);
392
+ const data = (await res.json().catch(() => null)) as BoardResponse | { error?: string } | null;
393
+ if (!res.ok) {
394
+ throw new Error((data as { error?: string } | null)?.error ?? `Failed to load board: ${res.status}`);
395
+ }
396
+
397
+ const nextBoard = data as BoardResponse;
398
+ hasLoadedBoardRef.current = true;
399
+ setBoard((current) => (boardsEqual(current, nextBoard) ? current : nextBoard));
400
+ setError(null);
401
+ } catch (err) {
402
+ if (!options?.silent || !hasLoadedBoardRef.current) {
403
+ setBoard(null);
404
+ setError(err instanceof Error ? err.message : "Failed to load board");
405
+ }
406
+ } finally {
407
+ if (!options?.silent) {
408
+ setLoading(false);
409
+ }
410
+ boardRequestInFlightRef.current = false;
411
+ }
412
+ }, [projectId]);
413
+
414
+ useEffect(() => {
415
+ void loadBoard({ silent: false });
416
+ }, [loadBoard]);
417
+
418
+ useEffect(() => {
419
+ if (!projectId) return;
420
+
421
+ const refresh = () => {
422
+ if (typeof document !== "undefined" && document.visibilityState === "hidden") {
423
+ return;
424
+ }
425
+ void loadBoard({ silent: true });
426
+ };
427
+
428
+ let timeoutId: number | null = null;
429
+ const scheduleRefresh = () => {
430
+ const delay = document.visibilityState === "visible"
431
+ ? ACTIVE_BOARD_REFRESH_MS
432
+ : HIDDEN_BOARD_REFRESH_MS;
433
+ timeoutId = window.setTimeout(() => {
434
+ refresh();
435
+ scheduleRefresh();
436
+ }, delay);
437
+ };
438
+ scheduleRefresh();
439
+
440
+ window.addEventListener("focus", refresh);
441
+ const handleVisibilityChange = () => {
442
+ if (document.visibilityState === "visible") {
443
+ refresh();
444
+ }
445
+ };
446
+ document.addEventListener("visibilitychange", handleVisibilityChange);
447
+
448
+ return () => {
449
+ if (timeoutId != null) {
450
+ window.clearTimeout(timeoutId);
451
+ }
452
+ window.removeEventListener("focus", refresh);
453
+ document.removeEventListener("visibilitychange", handleVisibilityChange);
454
+ };
455
+ }, [loadBoard, projectId]);
456
+
457
+ const visibleColumns = useMemo(() => {
458
+ const query = search.trim().toLowerCase();
459
+ const source = board?.columns ?? [];
460
+
461
+ return source
462
+ .map((column) => {
463
+ if (!query) return column;
464
+ return {
465
+ ...column,
466
+ tasks: column.tasks.filter((task) => {
467
+ const haystack = `${task.text} ${task.agent ?? ""} ${task.type ?? ""} ${task.priority ?? ""}`.toLowerCase();
468
+ return haystack.includes(query);
469
+ }),
470
+ };
471
+ });
472
+ }, [board?.columns, search]);
473
+
474
+ const filteredContextFiles = useMemo(() => {
475
+ const query = contextSearch.trim().toLowerCase();
476
+ if (!query) return contextFiles;
477
+ return contextFiles.filter((file) => {
478
+ const haystack = `${file.path} ${file.name} ${file.source ?? ""}`.toLowerCase();
479
+ return haystack.includes(query);
480
+ });
481
+ }, [contextFiles, contextSearch]);
482
+ const editLinkedSessionOptions = useMemo(() => {
483
+ if (!editingTask) return projectSessions;
484
+ const taskKey = getTaskLinkKey(editingTask.task);
485
+ return [...projectSessions].sort((left, right) => {
486
+ const leftRelated = left.id === editingTask.task.attemptRef || left.issueId?.trim() === taskKey;
487
+ const rightRelated = right.id === editingTask.task.attemptRef || right.issueId?.trim() === taskKey;
488
+ if (leftRelated !== rightRelated) return leftRelated ? -1 : 1;
489
+ return compareProjectSessions(left, right, editingTask.task.attemptRef);
490
+ });
491
+ }, [editingTask, projectSessions]);
492
+
493
+ function openComposer(role: BoardRole) {
494
+ setComposerRole(role);
495
+ setComposerOpen(true);
496
+ setSubmitError(null);
497
+ setContextNotes("");
498
+ setContextSearch("");
499
+ setSelectedContextPaths([]);
500
+ setUploadFiles([]);
501
+ }
502
+
503
+ function toggleContextPath(path: string) {
504
+ setSelectedContextPaths((current) => (
505
+ current.includes(path)
506
+ ? current.filter((item) => item !== path)
507
+ : [...current, path]
508
+ ));
509
+ }
510
+
511
+ function removeUploadFile(file: File) {
512
+ setUploadFiles((current) => current.filter((entry) => (
513
+ entry.name !== file.name || entry.size !== file.size || entry.lastModified !== file.lastModified
514
+ )));
515
+ }
516
+
517
+ async function handleCreateTask() {
518
+ if (!projectId || !title.trim()) return;
519
+ setSubmitting(true);
520
+ setSubmitError(null);
521
+
522
+ try {
523
+ let uploadedPaths: string[] = [];
524
+ if (uploadFiles.length > 0) {
525
+ const formData = new FormData();
526
+ formData.append("projectId", projectId);
527
+ for (const file of uploadFiles) {
528
+ formData.append("files", file);
529
+ }
530
+ const uploadRes = await fetch("/api/attachments", {
531
+ method: "POST",
532
+ body: formData,
533
+ });
534
+ const uploadPayload = (await uploadRes.json().catch(() => null)) as
535
+ | { files?: Array<{ path?: string }>; error?: string }
536
+ | null;
537
+ if (!uploadRes.ok) {
538
+ throw new Error(uploadPayload?.error ?? `Upload failed: ${uploadRes.status}`);
539
+ }
540
+ uploadedPaths = (uploadPayload?.files ?? [])
541
+ .map((entry) => entry.path?.trim())
542
+ .filter((value): value is string => Boolean(value));
543
+ }
544
+
545
+ const attachments = [...new Set([...selectedContextPaths, ...uploadedPaths])];
546
+ const res = await fetch("/api/boards", {
547
+ method: "POST",
548
+ headers: { "Content-Type": "application/json" },
549
+ body: JSON.stringify({
550
+ projectId,
551
+ title: title.trim(),
552
+ description: description.trim() || undefined,
553
+ contextNotes: contextNotes.trim() || undefined,
554
+ attachments: attachments.length > 0 ? attachments : undefined,
555
+ agent,
556
+ role: composerRole,
557
+ type: taskType.trim() || undefined,
558
+ priority: priority.trim() || undefined,
559
+ }),
560
+ });
561
+
562
+ const payload = (await res.json().catch(() => null)) as
563
+ | BoardResponse
564
+ | { error?: string }
565
+ | null;
566
+
567
+ if (!res.ok) {
568
+ throw new Error((payload as { error?: string } | null)?.error ?? `Failed to create task: ${res.status}`);
569
+ }
570
+
571
+ setBoard((current) => {
572
+ if (!payload || !("columns" in payload)) return current;
573
+ const next = payload as BoardResponse;
574
+ return {
575
+ ...(current ?? next),
576
+ ...next,
577
+ };
578
+ });
579
+
580
+ setTitle("");
581
+ setDescription("");
582
+ setTaskType("feature");
583
+ setPriority("normal");
584
+ setContextNotes("");
585
+ setSelectedContextPaths([]);
586
+ setContextSearch("");
587
+ setUploadFiles([]);
588
+ setComposerOpen(false);
589
+ } catch (err) {
590
+ setSubmitError(err instanceof Error ? err.message : "Failed to create task");
591
+ } finally {
592
+ setSubmitting(false);
593
+ }
594
+ }
595
+
596
+ const mutatingRef = useRef(false);
597
+
598
+ async function handleBoardMutation(payload: Record<string, unknown>) {
599
+ if (!projectId || mutatingRef.current) return;
600
+ mutatingRef.current = true;
601
+ try {
602
+ const res = await fetch("/api/boards", {
603
+ method: "PATCH",
604
+ headers: { "Content-Type": "application/json" },
605
+ body: JSON.stringify({
606
+ projectId,
607
+ ...payload,
608
+ }),
609
+ });
610
+ const data = (await res.json().catch(() => null)) as BoardResponse | { error?: string } | null;
611
+ if (!res.ok) {
612
+ throw new Error((data as { error?: string } | null)?.error ?? `Failed to update board: ${res.status}`);
613
+ }
614
+ const nextBoard = data as BoardResponse;
615
+ setBoard((current) => (boardsEqual(current, nextBoard) ? current : nextBoard));
616
+ setError(null);
617
+ } finally {
618
+ mutatingRef.current = false;
619
+ }
620
+ }
621
+
622
+ function openEditor(task: BoardTask, role: BoardRole) {
623
+ const { title: nextTitle, description: nextDescription } = splitTaskText(task.text);
624
+ setEditingTask({ task, role });
625
+ setEditRole(role);
626
+ setEditTitle(nextTitle);
627
+ setEditDescription(nextDescription);
628
+ setEditAgent(task.agent ?? orderedAgentOptions[0] ?? "qwen-code");
629
+ setEditTaskType(task.type ?? "feature");
630
+ setEditPriority(task.priority ?? "normal");
631
+ setEditLinkedSession(task.attemptRef ?? "");
632
+ setEditingError(null);
633
+ }
634
+
635
+ function closeEditor() {
636
+ if (editingBusy) return;
637
+ setEditingTask(null);
638
+ setEditingError(null);
639
+ }
640
+
641
+ async function handleSaveEdit() {
642
+ if (!editingTask || !editTitle.trim()) return;
643
+ setEditingBusy(true);
644
+ setEditingError(null);
645
+ try {
646
+ await handleBoardMutation({
647
+ taskId: editingTask.task.id,
648
+ role: editRole,
649
+ title: editTitle.trim(),
650
+ description: editDescription,
651
+ agent: editAgent,
652
+ type: editTaskType,
653
+ priority: editPriority,
654
+ attemptRef: editLinkedSession,
655
+ taskRef: editLinkedSession
656
+ ? (editingTask.task.taskRef ?? editingTask.task.id)
657
+ : (editingTask.task.taskRef ?? ""),
658
+ });
659
+ setEditingTask(null);
660
+ } catch (err) {
661
+ setEditingError(err instanceof Error ? err.message : "Failed to update task");
662
+ } finally {
663
+ setEditingBusy(false);
664
+ }
665
+ }
666
+
667
+ if (!projectId) {
668
+ return (
669
+ <div className="flex h-full items-center justify-center text-[14px] text-[var(--vk-text-muted)]">
670
+ Select a workspace to view its Kanban board.
671
+ </div>
672
+ );
673
+ }
674
+
675
+ return (
676
+ <section className="flex h-full min-h-0 flex-col">
677
+ <header className="border-b border-[var(--vk-border)] px-4 py-3">
678
+ <div className="flex flex-wrap items-center gap-2">
679
+ <div className="inline-flex rounded-[3px] border border-[var(--vk-border)] p-px">
680
+ <span className="rounded-[2px] bg-[var(--vk-bg-active)] px-3 py-1 text-[13px] text-[var(--vk-text-strong)]">Active</span>
681
+ <span className="px-3 py-1 text-[13px] text-[var(--vk-text-muted)]">All</span>
682
+ <span className="px-3 py-1 text-[13px] text-[var(--vk-text-muted)]">Backlog</span>
683
+ <span className="px-3 py-1 text-[13px] text-[var(--vk-text-muted)]">Cancelled</span>
684
+ </div>
685
+
686
+ <div className="ml-auto flex w-full min-w-0 flex-wrap items-center gap-2 sm:w-auto sm:min-w-[220px] sm:flex-nowrap sm:flex-none">
687
+ <label className="flex h-[31px] min-w-0 flex-1 items-center rounded-[3px] border border-[var(--vk-border)] bg-[var(--vk-bg-panel)] px-2 sm:min-w-[200px] sm:w-[240px] sm:flex-none">
688
+ <Search className="h-3.5 w-3.5 text-[var(--vk-text-muted)]" />
689
+ <input
690
+ value={search}
691
+ onChange={(event) => setSearch(event.target.value)}
692
+ placeholder="Search tasks..."
693
+ className="ml-2 w-full bg-transparent text-[14px] text-[var(--vk-text-normal)] outline-none placeholder:text-[var(--vk-text-muted)]"
694
+ />
695
+ </label>
696
+
697
+ <button
698
+ type="button"
699
+ onClick={() => openComposer("intake")}
700
+ className="inline-flex h-[31px] w-full items-center justify-center gap-1 rounded-[3px] bg-[var(--vk-bg-active)] px-3 text-[14px] text-[var(--vk-text-strong)] hover:bg-[var(--vk-bg-hover)] sm:w-auto"
701
+ >
702
+ <span>New Issue</span>
703
+ <Plus className="h-3.5 w-3.5" />
704
+ </button>
705
+ </div>
706
+ </div>
707
+
708
+ {board?.watcherHint && (
709
+ <p className="pt-2 text-[12px] text-[var(--vk-text-muted)]">{board.watcherHint}</p>
710
+ )}
711
+ </header>
712
+
713
+ <div className="min-h-0 flex-1 overflow-auto p-4">
714
+ {loading ? (
715
+ <div className="flex h-full items-center justify-center text-[var(--vk-text-muted)]">
716
+ <Loader2 className="h-4 w-4 animate-spin" />
717
+ <span className="ml-2 text-[14px]">Loading board...</span>
718
+ </div>
719
+ ) : error ? (
720
+ <div className="rounded-[4px] border border-[color:color-mix(in_srgb,var(--vk-red)_55%,transparent)] bg-[color:color-mix(in_srgb,var(--vk-red)_12%,transparent)] px-3 py-2 text-[13px] text-[var(--vk-red)]">
721
+ {error}
722
+ </div>
723
+ ) : (
724
+ <div
725
+ className="grid min-w-[980px] gap-0 rounded-[4px] border border-[var(--vk-border)]"
726
+ style={{ gridTemplateColumns: `repeat(${Math.max(visibleColumns.length, 1)}, minmax(240px, 1fr))` }}
727
+ >
728
+ {visibleColumns.map((column, columnIndex) => (
729
+ <article
730
+ key={column.role}
731
+ className={cn(
732
+ "flex min-h-[540px] flex-col border-r border-[var(--vk-border)] bg-[var(--vk-bg-panel)]",
733
+ columnIndex === visibleColumns.length - 1 && "border-r-0",
734
+ )}
735
+ >
736
+ <header className="flex h-[41px] items-center border-b border-[var(--vk-border)] px-2">
737
+ <span className="h-2 w-2 rounded-full" style={{ backgroundColor: ROLE_COLOR[column.role] }} />
738
+ <span className="ml-2 text-[14px] text-[var(--vk-text-normal)]">
739
+ {column.heading || ROLE_LABEL[column.role]}
740
+ </span>
741
+ <button
742
+ type="button"
743
+ onClick={() => openComposer(column.role)}
744
+ className="ml-auto inline-flex h-6 w-6 items-center justify-center rounded-[3px] text-[var(--vk-text-muted)] hover:bg-[var(--vk-bg-hover)]"
745
+ aria-label={`Add task to ${column.heading}`}
746
+ >
747
+ <Plus className="h-3.5 w-3.5" />
748
+ </button>
749
+ </header>
750
+
751
+ <div
752
+ className={cn(
753
+ "flex-1 space-y-2 overflow-y-auto p-2",
754
+ draggingTask?.role === column.role && "bg-[rgba(255,255,255,0.02)]",
755
+ )}
756
+ onDragOver={(event) => {
757
+ if (!draggingTask) return;
758
+ event.preventDefault();
759
+ }}
760
+ onDrop={(event) => {
761
+ event.preventDefault();
762
+ if (!draggingTask || draggingTask.role === column.role) return;
763
+ void handleBoardMutation({
764
+ taskId: draggingTask.taskId,
765
+ role: column.role,
766
+ }).catch((err) => {
767
+ setError(err instanceof Error ? err.message : "Failed to move task");
768
+ });
769
+ setDraggingTask(null);
770
+ }}
771
+ >
772
+ {column.tasks.length === 0 && (
773
+ <div className="rounded-[3px] border border-dashed border-[var(--vk-border)] px-2 py-2 text-[13px] text-[var(--vk-text-muted)]">
774
+ No tasks
775
+ </div>
776
+ )}
777
+
778
+ {column.tasks.slice(0, 50).map((task) => {
779
+ const { title: taskTitle, description: taskDescription } = splitTaskText(task.text);
780
+ const taskLinkKey = getTaskLinkKey(task);
781
+ const linkedSessions = projectSessions
782
+ .filter((session) => session.id === task.attemptRef || session.issueId?.trim() === taskLinkKey)
783
+ .sort((left, right) => compareProjectSessions(left, right, task.attemptRef ?? null));
784
+ const primaryLinkedSession = task.attemptRef
785
+ ? linkedSessions.find((session) => session.id === task.attemptRef) ?? null
786
+ : (linkedSessions[0] ?? null);
787
+ const unresolvedPrimaryLink = task.attemptRef
788
+ && !linkedSessions.some((session) => session.id === task.attemptRef)
789
+ ? task.attemptRef
790
+ : null;
791
+ return (
792
+ <div
793
+ key={`${column.role}-${task.id}`}
794
+ draggable
795
+ onDragStart={() => setDraggingTask({ taskId: task.id, role: column.role })}
796
+ onDragEnd={() => setDraggingTask(null)}
797
+ className={cn(
798
+ "rounded-[3px] border border-[var(--vk-border)] bg-[color:#212121] p-2",
799
+ draggingTask?.taskId === task.id && "opacity-60",
800
+ )}
801
+ >
802
+ <div className="flex items-start gap-2">
803
+ <p className="min-w-0 flex-1 font-mono text-[12px] text-[var(--vk-text-muted)]">
804
+ {task.taskRef?.trim()
805
+ || (task.id.length > 12
806
+ ? `TASK-${task.id.split("-")[0]?.toUpperCase() ?? task.id.toUpperCase()}`
807
+ : task.id)}
808
+ </p>
809
+ <button
810
+ type="button"
811
+ onClick={() => openEditor(task, column.role)}
812
+ className="inline-flex h-6 w-6 items-center justify-center rounded-[3px] text-[var(--vk-text-muted)] hover:bg-[var(--vk-bg-hover)] hover:text-[var(--vk-text-normal)]"
813
+ aria-label="Edit task"
814
+ title="Edit task"
815
+ >
816
+ <Pencil className="h-3.5 w-3.5" />
817
+ </button>
818
+ </div>
819
+ <p className="pt-1 text-[15px] leading-[22px] text-[var(--vk-text-normal)]">{taskTitle}</p>
820
+ {taskDescription && (
821
+ <p className="pt-1 text-[13px] leading-[20px] text-[var(--vk-text-muted)]">{taskDescription}</p>
822
+ )}
823
+
824
+ {(linkedSessions.length > 0 || unresolvedPrimaryLink) && (
825
+ <div className="mt-3 rounded-[4px] border border-[var(--vk-border)] bg-[rgba(255,255,255,0.02)] p-2">
826
+ <div className="flex items-center justify-between gap-2">
827
+ <span className="text-[11px] uppercase tracking-[0.08em] text-[var(--vk-text-muted)]">
828
+ Runs
829
+ </span>
830
+ <span className="text-[11px] text-[var(--vk-text-muted)]">
831
+ {linkedSessions.length + (unresolvedPrimaryLink ? 1 : 0)}
832
+ </span>
833
+ </div>
834
+
835
+ <div className="mt-2 space-y-1.5">
836
+ {primaryLinkedSession ? (
837
+ <button
838
+ type="button"
839
+ onClick={() => router.push(`/sessions/${encodeURIComponent(primaryLinkedSession.id)}?tab=chat`)}
840
+ className="flex w-full items-center justify-between gap-2 rounded-[3px] border border-[rgba(255,255,255,0.05)] bg-[rgba(255,255,255,0.03)] px-2 py-1.5 text-left hover:bg-[var(--vk-bg-hover)]"
841
+ title={primaryLinkedSession.id}
842
+ >
843
+ <div className="flex min-w-0 items-center gap-2">
844
+ {getSessionAgent(primaryLinkedSession) ? (
845
+ <AgentTileIcon seed={{ label: getSessionAgent(primaryLinkedSession) as string }} className="h-5 w-5" />
846
+ ) : null}
847
+ <div className="min-w-0">
848
+ <div className="truncate text-[12px] text-[var(--vk-text-normal)]">
849
+ {formatLinkedSessionLabel(primaryLinkedSession)}
850
+ </div>
851
+ <div className="truncate text-[11px] text-[var(--vk-text-muted)]">
852
+ Primary run
853
+ </div>
854
+ </div>
855
+ </div>
856
+ <div className="flex shrink-0 items-center gap-2">
857
+ <span className={`inline-flex h-5 items-center rounded-[3px] border px-2 text-[10px] ${sessionStatusPillClass(primaryLinkedSession.status)}`}>
858
+ {formatSessionStatus(primaryLinkedSession.status)}
859
+ </span>
860
+ <ExternalLink className="h-3 w-3 text-[var(--vk-text-muted)]" />
861
+ </div>
862
+ </button>
863
+ ) : null}
864
+
865
+ {linkedSessions
866
+ .filter((session) => session.id !== primaryLinkedSession?.id)
867
+ .map((session) => (
868
+ <button
869
+ key={session.id}
870
+ type="button"
871
+ onClick={() => router.push(`/sessions/${encodeURIComponent(session.id)}?tab=chat`)}
872
+ className="flex w-full items-center justify-between gap-2 rounded-[3px] px-2 py-1.5 text-left hover:bg-[var(--vk-bg-hover)]"
873
+ title={session.id}
874
+ >
875
+ <div className="flex min-w-0 items-center gap-2">
876
+ {getSessionAgent(session) ? (
877
+ <AgentTileIcon seed={{ label: getSessionAgent(session) as string }} className="h-5 w-5" />
878
+ ) : null}
879
+ <span className="truncate text-[12px] text-[var(--vk-text-normal)]">
880
+ {formatLinkedSessionLabel(session)}
881
+ </span>
882
+ </div>
883
+ <div className="flex shrink-0 items-center gap-2">
884
+ <span className={`inline-flex h-5 items-center rounded-[3px] border px-2 text-[10px] ${sessionStatusPillClass(session.status)}`}>
885
+ {formatSessionStatus(session.status)}
886
+ </span>
887
+ <ExternalLink className="h-3 w-3 text-[var(--vk-text-muted)]" />
888
+ </div>
889
+ </button>
890
+ ))}
891
+
892
+ {unresolvedPrimaryLink ? (
893
+ <button
894
+ type="button"
895
+ onClick={() => router.push(`/sessions/${encodeURIComponent(unresolvedPrimaryLink)}?tab=chat`)}
896
+ className="flex w-full items-center justify-between gap-2 rounded-[3px] px-2 py-1.5 text-left hover:bg-[var(--vk-bg-hover)]"
897
+ title={unresolvedPrimaryLink}
898
+ >
899
+ <div className="min-w-0">
900
+ <div className="truncate text-[12px] text-[var(--vk-text-normal)]">{unresolvedPrimaryLink}</div>
901
+ <div className="truncate text-[11px] text-[var(--vk-text-muted)]">Primary run</div>
902
+ </div>
903
+ <ExternalLink className="h-3 w-3 shrink-0 text-[var(--vk-text-muted)]" />
904
+ </button>
905
+ ) : null}
906
+ </div>
907
+ </div>
908
+ )}
909
+
910
+ <div className="mt-2 flex items-center justify-between gap-2">
911
+ <div className="flex min-w-0 items-center gap-1.5">
912
+ {task.agent ? (
913
+ <>
914
+ <AgentTileIcon seed={{ label: task.agent }} className="h-6 w-6" />
915
+ <span className="truncate text-[12px] text-[var(--vk-text-muted)]">{formatAgentLabel(task.agent)}</span>
916
+ </>
917
+ ) : (
918
+ <span className="text-[12px] text-[var(--vk-text-muted)]">No agent</span>
919
+ )}
920
+ </div>
921
+
922
+ <div className="flex flex-wrap items-center gap-1">
923
+ {task.type && (
924
+ <span className="inline-flex h-5 items-center rounded-[3px] bg-[color:#292929] px-2 text-[11px] text-[var(--vk-text-muted)]">
925
+ {task.type}
926
+ </span>
927
+ )}
928
+ {task.priority && (
929
+ <span className="inline-flex h-5 items-center rounded-[3px] bg-[color:#292929] px-2 text-[11px] text-[var(--vk-text-muted)]">
930
+ {task.priority}
931
+ </span>
932
+ )}
933
+ </div>
934
+ </div>
935
+ </div>
936
+ );
937
+ })}
938
+ {column.tasks.length > 50 && (
939
+ <div className="rounded-[3px] border border-dashed border-[var(--vk-border)] px-2 py-2 text-center text-[12px] text-[var(--vk-text-muted)]">
940
+ +{column.tasks.length - 50} more tasks
941
+ </div>
942
+ )}
943
+ </div>
944
+ </article>
945
+ ))}
946
+ </div>
947
+ )}
948
+ </div>
949
+
950
+ {editingTask && (
951
+ <div className="fixed inset-0 z-[75] flex items-start justify-center overflow-y-auto bg-black/60 px-3 py-3 sm:items-center sm:py-0" onClick={closeEditor}>
952
+ <div
953
+ className="flex max-h-[calc(100dvh-1.5rem)] w-full max-w-[560px] flex-col overflow-hidden rounded-[6px] border border-[var(--vk-border)] bg-[var(--vk-bg-panel)]"
954
+ onClick={(event) => event.stopPropagation()}
955
+ role="dialog"
956
+ aria-modal="true"
957
+ >
958
+ <header className="border-b border-[var(--vk-border)] px-4 py-3">
959
+ <h2 className="text-[18px] text-[var(--vk-text-strong)]">Edit Board Task</h2>
960
+ <p className="pt-1 text-[12px] text-[var(--vk-text-muted)]">
961
+ Move the card, update the task, and link the latest session run.
962
+ </p>
963
+ </header>
964
+
965
+ <div className="min-h-0 flex-1 space-y-3 overflow-y-auto px-4 py-4">
966
+ <label className="block">
967
+ <span className="mb-1 block text-[12px] text-[var(--vk-text-muted)]">Title</span>
968
+ <input
969
+ value={editTitle}
970
+ onChange={(event) => setEditTitle(event.target.value)}
971
+ className="h-9 w-full rounded-[3px] border border-[var(--vk-border)] bg-transparent px-2 text-[14px] text-[var(--vk-text-normal)] outline-none focus:border-[var(--vk-orange)]"
972
+ />
973
+ </label>
974
+
975
+ <label className="block">
976
+ <span className="mb-1 block text-[12px] text-[var(--vk-text-muted)]">Description</span>
977
+ <textarea
978
+ value={editDescription}
979
+ onChange={(event) => setEditDescription(event.target.value)}
980
+ rows={3}
981
+ className="w-full rounded-[3px] border border-[var(--vk-border)] bg-transparent px-2 py-2 text-[14px] text-[var(--vk-text-normal)] outline-none focus:border-[var(--vk-orange)]"
982
+ />
983
+ </label>
984
+
985
+ <div className="grid grid-cols-1 gap-3 sm:grid-cols-2">
986
+ <label className="block">
987
+ <span className="mb-1 block text-[12px] text-[var(--vk-text-muted)]">Column</span>
988
+ <select
989
+ value={editRole}
990
+ onChange={(event) => setEditRole(toRole(event.target.value))}
991
+ className="h-9 w-full rounded-[3px] border border-[var(--vk-border)] bg-[var(--vk-bg-panel)] px-2 text-[14px] text-[var(--vk-text-normal)] outline-none focus:border-[var(--vk-orange)]"
992
+ >
993
+ {board?.columns.map((column) => (
994
+ <option key={column.role} value={column.role} className="bg-[var(--vk-bg-panel)] text-[var(--vk-text-normal)]">
995
+ {column.heading || ROLE_LABEL[column.role]}
996
+ </option>
997
+ ))}
998
+ </select>
999
+ </label>
1000
+
1001
+ <label className="block">
1002
+ <span className="mb-1 block text-[12px] text-[var(--vk-text-muted)]">Agent</span>
1003
+ <select
1004
+ value={editAgent}
1005
+ onChange={(event) => setEditAgent(event.target.value)}
1006
+ className="h-9 w-full rounded-[3px] border border-[var(--vk-border)] bg-[var(--vk-bg-panel)] px-2 text-[14px] text-[var(--vk-text-normal)] outline-none focus:border-[var(--vk-orange)]"
1007
+ >
1008
+ {orderedAgentOptions.map((item) => (
1009
+ <option key={item} value={item} className="bg-[var(--vk-bg-panel)] text-[var(--vk-text-normal)]">
1010
+ {formatAgentLabel(item)}
1011
+ </option>
1012
+ ))}
1013
+ </select>
1014
+ </label>
1015
+ </div>
1016
+
1017
+ <div className="grid grid-cols-1 gap-3 sm:grid-cols-2">
1018
+ <label className="block">
1019
+ <span className="mb-1 block text-[12px] text-[var(--vk-text-muted)]">Type</span>
1020
+ <input
1021
+ value={editTaskType}
1022
+ onChange={(event) => setEditTaskType(event.target.value)}
1023
+ className="h-9 w-full rounded-[3px] border border-[var(--vk-border)] bg-transparent px-2 text-[14px] text-[var(--vk-text-normal)] outline-none focus:border-[var(--vk-orange)]"
1024
+ />
1025
+ </label>
1026
+
1027
+ <label className="block">
1028
+ <span className="mb-1 block text-[12px] text-[var(--vk-text-muted)]">Priority</span>
1029
+ <input
1030
+ value={editPriority}
1031
+ onChange={(event) => setEditPriority(event.target.value)}
1032
+ className="h-9 w-full rounded-[3px] border border-[var(--vk-border)] bg-transparent px-2 text-[14px] text-[var(--vk-text-normal)] outline-none focus:border-[var(--vk-orange)]"
1033
+ />
1034
+ </label>
1035
+ </div>
1036
+
1037
+ <label className="block">
1038
+ <span className="mb-1 block text-[12px] text-[var(--vk-text-muted)]">Primary linked run</span>
1039
+ <select
1040
+ value={editLinkedSession}
1041
+ onChange={(event) => setEditLinkedSession(event.target.value)}
1042
+ className="h-9 w-full rounded-[3px] border border-[var(--vk-border)] bg-[var(--vk-bg-panel)] px-2 text-[14px] text-[var(--vk-text-normal)] outline-none focus:border-[var(--vk-orange)]"
1043
+ >
1044
+ <option value="" className="bg-[var(--vk-bg-panel)] text-[var(--vk-text-normal)]">No linked session</option>
1045
+ {editLinkedSessionOptions.map((session) => (
1046
+ <option key={session.id} value={session.id} className="bg-[var(--vk-bg-panel)] text-[var(--vk-text-normal)]">
1047
+ {formatLinkedSessionLabel(session)} · {session.status}
1048
+ </option>
1049
+ ))}
1050
+ </select>
1051
+ </label>
1052
+
1053
+ {editingError && (
1054
+ <p className="text-[12px] text-[var(--vk-red)]">{editingError}</p>
1055
+ )}
1056
+ </div>
1057
+
1058
+ <footer className="flex flex-wrap items-center justify-end gap-2 border-t border-[var(--vk-border)] px-4 py-3">
1059
+ <button
1060
+ type="button"
1061
+ onClick={closeEditor}
1062
+ disabled={editingBusy}
1063
+ className="inline-flex h-9 items-center rounded-[3px] border border-[var(--vk-border)] px-3 text-[13px] text-[var(--vk-text-normal)] hover:bg-[var(--vk-bg-hover)] disabled:opacity-50"
1064
+ >
1065
+ Cancel
1066
+ </button>
1067
+ <button
1068
+ type="button"
1069
+ onClick={() => void handleSaveEdit()}
1070
+ disabled={!editTitle.trim() || editingBusy}
1071
+ className="inline-flex h-9 items-center rounded-[3px] bg-[var(--vk-bg-active)] px-3 text-[13px] text-[var(--vk-text-strong)] hover:bg-[var(--vk-bg-hover)] disabled:opacity-50"
1072
+ >
1073
+ {editingBusy ? <Loader2 className="h-4 w-4 animate-spin" /> : "Save Task"}
1074
+ </button>
1075
+ </footer>
1076
+ </div>
1077
+ </div>
1078
+ )}
1079
+
1080
+ {composerOpen && (
1081
+ <div className="fixed inset-0 z-[75] flex items-start justify-center overflow-y-auto bg-black/60 px-3 py-3 sm:items-center sm:py-0" onClick={() => !submitting && setComposerOpen(false)}>
1082
+ <div
1083
+ className="flex max-h-[calc(100dvh-1.5rem)] w-full max-w-[560px] flex-col overflow-hidden rounded-[6px] border border-[var(--vk-border)] bg-[var(--vk-bg-panel)]"
1084
+ onClick={(event) => event.stopPropagation()}
1085
+ role="dialog"
1086
+ aria-modal="true"
1087
+ >
1088
+ <header className="border-b border-[var(--vk-border)] px-4 py-3">
1089
+ <h2 className="text-[18px] text-[var(--vk-text-strong)]">Create Board Task</h2>
1090
+ <p className="pt-1 text-[12px] text-[var(--vk-text-muted)]">
1091
+ Add a task card with project and agent tags for Obsidian + conductor watcher.
1092
+ </p>
1093
+ </header>
1094
+
1095
+ <div className="min-h-0 flex-1 space-y-3 overflow-y-auto px-4 py-4">
1096
+ <label className="block">
1097
+ <span className="mb-1 block text-[12px] text-[var(--vk-text-muted)]">Title</span>
1098
+ <input
1099
+ value={title}
1100
+ onChange={(event) => setTitle(event.target.value)}
1101
+ placeholder="Review payment flow regression"
1102
+ className="h-9 w-full rounded-[3px] border border-[var(--vk-border)] bg-transparent px-2 text-[14px] text-[var(--vk-text-normal)] outline-none focus:border-[var(--vk-orange)]"
1103
+ />
1104
+ </label>
1105
+
1106
+ <label className="block">
1107
+ <span className="mb-1 block text-[12px] text-[var(--vk-text-muted)]">Description (optional)</span>
1108
+ <textarea
1109
+ value={description}
1110
+ onChange={(event) => setDescription(event.target.value)}
1111
+ rows={3}
1112
+ placeholder="Investigate failing specs and propose a safe fix."
1113
+ className="w-full rounded-[3px] border border-[var(--vk-border)] bg-transparent px-2 py-2 text-[14px] text-[var(--vk-text-normal)] outline-none focus:border-[var(--vk-orange)]"
1114
+ />
1115
+ </label>
1116
+
1117
+ <label className="block">
1118
+ <span className="mb-1 block text-[12px] text-[var(--vk-text-muted)]">Context notes (optional)</span>
1119
+ <textarea
1120
+ value={contextNotes}
1121
+ onChange={(event) => setContextNotes(event.target.value)}
1122
+ rows={2}
1123
+ placeholder="Anything the agent should prioritize or avoid for this task."
1124
+ className="w-full rounded-[3px] border border-[var(--vk-border)] bg-transparent px-2 py-2 text-[14px] text-[var(--vk-text-normal)] outline-none focus:border-[var(--vk-orange)]"
1125
+ />
1126
+ </label>
1127
+
1128
+ <div className="grid grid-cols-1 gap-3 sm:grid-cols-2">
1129
+ <label className="block">
1130
+ <span className="mb-1 block text-[12px] text-[var(--vk-text-muted)]">Agent</span>
1131
+ <select
1132
+ value={agent}
1133
+ onChange={(event) => setAgent(event.target.value)}
1134
+ className="h-9 w-full rounded-[3px] border border-[var(--vk-border)] bg-[var(--vk-bg-panel)] px-2 text-[14px] text-[var(--vk-text-normal)] outline-none focus:border-[var(--vk-orange)]"
1135
+ >
1136
+ {orderedAgentOptions.map((item) => (
1137
+ <option key={item} value={item} className="bg-[var(--vk-bg-panel)] text-[var(--vk-text-normal)]">
1138
+ {formatAgentLabel(item)}
1139
+ </option>
1140
+ ))}
1141
+ </select>
1142
+ </label>
1143
+
1144
+ <label className="block">
1145
+ <span className="mb-1 block text-[12px] text-[var(--vk-text-muted)]">Column</span>
1146
+ <select
1147
+ value={composerRole}
1148
+ onChange={(event) => setComposerRole(toRole(event.target.value))}
1149
+ className="h-9 w-full rounded-[3px] border border-[var(--vk-border)] bg-[var(--vk-bg-panel)] px-2 text-[14px] text-[var(--vk-text-normal)] outline-none focus:border-[var(--vk-orange)]"
1150
+ >
1151
+ {visibleColumns.map((column) => (
1152
+ <option key={column.role} value={column.role} className="bg-[var(--vk-bg-panel)] text-[var(--vk-text-normal)]">
1153
+ {column.heading || ROLE_LABEL[column.role]}
1154
+ </option>
1155
+ ))}
1156
+ </select>
1157
+ </label>
1158
+ </div>
1159
+
1160
+ <div className="grid grid-cols-1 gap-3 sm:grid-cols-2">
1161
+ <label className="block">
1162
+ <span className="mb-1 block text-[12px] text-[var(--vk-text-muted)]">Type</span>
1163
+ <input
1164
+ value={taskType}
1165
+ onChange={(event) => setTaskType(event.target.value)}
1166
+ placeholder="feature"
1167
+ className="h-9 w-full rounded-[3px] border border-[var(--vk-border)] bg-transparent px-2 text-[14px] text-[var(--vk-text-normal)] outline-none focus:border-[var(--vk-orange)]"
1168
+ />
1169
+ </label>
1170
+
1171
+ <label className="block">
1172
+ <span className="mb-1 block text-[12px] text-[var(--vk-text-muted)]">Priority</span>
1173
+ <input
1174
+ value={priority}
1175
+ onChange={(event) => setPriority(event.target.value)}
1176
+ placeholder="normal"
1177
+ className="h-9 w-full rounded-[3px] border border-[var(--vk-border)] bg-transparent px-2 text-[14px] text-[var(--vk-text-normal)] outline-none focus:border-[var(--vk-orange)]"
1178
+ />
1179
+ </label>
1180
+ </div>
1181
+
1182
+ <div className="rounded-[4px] border border-[var(--vk-border)] p-3">
1183
+ <div className="flex flex-wrap items-center justify-between gap-2">
1184
+ <p className="text-[12px] text-[var(--vk-text-muted)]">Context attachments</p>
1185
+ <p className="text-[12px] text-[var(--vk-text-muted)]">
1186
+ {selectedContextPaths.length} selected
1187
+ {uploadFiles.length > 0 ? ` · ${uploadFiles.length} upload(s)` : ""}
1188
+ </p>
1189
+ </div>
1190
+
1191
+ <div className="mt-2">
1192
+ <label className="inline-flex cursor-pointer items-center rounded-[3px] border border-[var(--vk-border)] px-2 py-1 text-[12px] text-[var(--vk-text-normal)] hover:bg-[var(--vk-bg-hover)]">
1193
+ <input
1194
+ type="file"
1195
+ multiple
1196
+ className="hidden"
1197
+ onChange={(event) => {
1198
+ const next = Array.from(event.target.files ?? []);
1199
+ if (next.length === 0) return;
1200
+ setUploadFiles((current) => {
1201
+ const merged = [...current];
1202
+ for (const file of next) {
1203
+ const exists = merged.some((entry) => (
1204
+ entry.name === file.name
1205
+ && entry.size === file.size
1206
+ && entry.lastModified === file.lastModified
1207
+ ));
1208
+ if (!exists) merged.push(file);
1209
+ }
1210
+ return merged;
1211
+ });
1212
+ event.currentTarget.value = "";
1213
+ }}
1214
+ />
1215
+ Upload files/images
1216
+ </label>
1217
+ </div>
1218
+
1219
+ {uploadFiles.length > 0 && (
1220
+ <div className="mt-2 flex flex-wrap gap-1">
1221
+ {uploadFiles.map((file) => (
1222
+ <button
1223
+ key={`${file.name}-${file.size}-${file.lastModified}`}
1224
+ type="button"
1225
+ onClick={() => removeUploadFile(file)}
1226
+ className="inline-flex items-center gap-1 rounded-[3px] border border-[var(--vk-border)] bg-[var(--vk-bg-hover)] px-2 py-1 text-[11px] text-[var(--vk-text-normal)]"
1227
+ title="Remove upload"
1228
+ >
1229
+ <span className="truncate max-w-[220px]">{file.name}</span>
1230
+ <span className="text-[var(--vk-text-muted)]">×</span>
1231
+ </button>
1232
+ ))}
1233
+ </div>
1234
+ )}
1235
+
1236
+ <label className="mt-3 block">
1237
+ <span className="mb-1 block text-[12px] text-[var(--vk-text-muted)]">Select existing context</span>
1238
+ <input
1239
+ value={contextSearch}
1240
+ onChange={(event) => setContextSearch(event.target.value)}
1241
+ placeholder="Search context files..."
1242
+ className="h-8 w-full rounded-[3px] border border-[var(--vk-border)] bg-transparent px-2 text-[13px] text-[var(--vk-text-normal)] outline-none focus:border-[var(--vk-orange)]"
1243
+ />
1244
+ </label>
1245
+
1246
+ <div className="mt-2 max-h-[180px] overflow-auto rounded-[3px] border border-[var(--vk-border)]">
1247
+ {contextLoading ? (
1248
+ <div className="flex items-center gap-2 px-2 py-2 text-[12px] text-[var(--vk-text-muted)]">
1249
+ <Loader2 className="h-3.5 w-3.5 animate-spin" />
1250
+ <span>Loading context files...</span>
1251
+ </div>
1252
+ ) : contextError ? (
1253
+ <p className="px-2 py-2 text-[12px] text-[var(--vk-red)]">{contextError}</p>
1254
+ ) : filteredContextFiles.length === 0 ? (
1255
+ <p className="px-2 py-2 text-[12px] text-[var(--vk-text-muted)]">No context files found.</p>
1256
+ ) : (
1257
+ <ul className="divide-y divide-[var(--vk-border)]">
1258
+ {filteredContextFiles.map((file) => {
1259
+ const checked = selectedContextPaths.includes(file.path);
1260
+ return (
1261
+ <li key={file.path} className="px-2 py-1.5">
1262
+ <label className="flex cursor-pointer items-start gap-2 text-[12px] text-[var(--vk-text-normal)]">
1263
+ <input
1264
+ type="checkbox"
1265
+ checked={checked}
1266
+ onChange={() => toggleContextPath(file.path)}
1267
+ className="mt-0.5 h-3.5 w-3.5 rounded border-[var(--vk-border)] bg-transparent"
1268
+ />
1269
+ <span className="min-w-0">
1270
+ <span className="block truncate">
1271
+ {file.path}
1272
+ </span>
1273
+ <span className="block text-[11px] text-[var(--vk-text-muted)]">
1274
+ {file.kind}
1275
+ {file.source ? ` · ${file.source}` : ""}
1276
+ {file.sizeBytes ? ` · ${formatFileSize(file.sizeBytes)}` : ""}
1277
+ </span>
1278
+ </span>
1279
+ </label>
1280
+ </li>
1281
+ );
1282
+ })}
1283
+ </ul>
1284
+ )}
1285
+ </div>
1286
+ </div>
1287
+
1288
+ {submitError && (
1289
+ <p className="text-[12px] text-[var(--vk-red)]">{submitError}</p>
1290
+ )}
1291
+ </div>
1292
+
1293
+ <footer className="flex flex-wrap items-center justify-end gap-2 border-t border-[var(--vk-border)] px-4 py-3">
1294
+ <button
1295
+ type="button"
1296
+ onClick={() => setComposerOpen(false)}
1297
+ disabled={submitting}
1298
+ className="inline-flex h-9 items-center rounded-[3px] border border-[var(--vk-border)] px-3 text-[13px] text-[var(--vk-text-normal)] hover:bg-[var(--vk-bg-hover)] disabled:opacity-50"
1299
+ >
1300
+ Cancel
1301
+ </button>
1302
+ <button
1303
+ type="button"
1304
+ onClick={() => void handleCreateTask()}
1305
+ disabled={!title.trim() || submitting}
1306
+ className="inline-flex h-9 items-center rounded-[3px] bg-[var(--vk-bg-active)] px-3 text-[13px] text-[var(--vk-text-strong)] hover:bg-[var(--vk-bg-hover)] disabled:opacity-50"
1307
+ >
1308
+ {submitting ? <Loader2 className="h-4 w-4 animate-spin" /> : "Create Task"}
1309
+ </button>
1310
+ </footer>
1311
+ </div>
1312
+ </div>
1313
+ )}
1314
+ </section>
1315
+ );
1316
+ }