conductor-oss 0.2.20 → 0.3.1

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 (538) hide show
  1. package/README.md +16 -0
  2. package/dist/commands/start.d.ts.map +1 -1
  3. package/dist/commands/start.js +28 -2
  4. package/dist/commands/start.js.map +1 -1
  5. package/dist/launcher.d.ts +3 -0
  6. package/dist/launcher.d.ts.map +1 -0
  7. package/dist/launcher.js +3 -0
  8. package/dist/launcher.js.map +1 -0
  9. package/node_modules/@conductor-oss/core/dist/config.d.ts.map +1 -1
  10. package/node_modules/@conductor-oss/core/dist/config.js +106 -1
  11. package/node_modules/@conductor-oss/core/dist/config.js.map +1 -1
  12. package/node_modules/@conductor-oss/core/dist/types.d.ts +4 -4
  13. package/node_modules/@conductor-oss/core/dist/types.d.ts.map +1 -1
  14. package/node_modules/@conductor-oss/core/dist/types.js +185 -8
  15. package/node_modules/@conductor-oss/core/dist/types.js.map +1 -1
  16. package/node_modules/@conductor-oss/plugin-agent-amp/package.json +1 -1
  17. package/node_modules/@conductor-oss/plugin-agent-ccr/package.json +1 -1
  18. package/node_modules/@conductor-oss/plugin-agent-claude-code/package.json +1 -1
  19. package/node_modules/@conductor-oss/plugin-agent-codex/package.json +1 -1
  20. package/node_modules/@conductor-oss/plugin-agent-cursor-cli/package.json +1 -1
  21. package/node_modules/@conductor-oss/plugin-agent-droid/package.json +1 -1
  22. package/node_modules/@conductor-oss/plugin-agent-gemini/package.json +1 -1
  23. package/node_modules/@conductor-oss/plugin-agent-github-copilot/package.json +1 -1
  24. package/node_modules/@conductor-oss/plugin-agent-opencode/package.json +1 -1
  25. package/node_modules/@conductor-oss/plugin-agent-qwen-code/package.json +1 -1
  26. package/node_modules/@conductor-oss/plugin-mcp-server/package.json +1 -1
  27. package/node_modules/@conductor-oss/plugin-notifier-desktop/package.json +1 -1
  28. package/node_modules/@conductor-oss/plugin-notifier-discord/package.json +1 -1
  29. package/node_modules/@conductor-oss/plugin-runtime-tmux/package.json +1 -1
  30. package/node_modules/@conductor-oss/plugin-scm-github/package.json +1 -1
  31. package/node_modules/@conductor-oss/plugin-terminal-web/package.json +1 -1
  32. package/node_modules/@conductor-oss/plugin-tracker-github/package.json +1 -1
  33. package/node_modules/@conductor-oss/plugin-workspace-worktree/package.json +1 -1
  34. package/package.json +29 -25
  35. package/web/.next/standalone/packages/web/.next/BUILD_ID +1 -1
  36. package/web/.next/standalone/packages/web/.next/app-path-routes-manifest.json +5 -0
  37. package/web/.next/standalone/packages/web/.next/build-manifest.json +2 -2
  38. package/web/.next/standalone/packages/web/.next/prerender-manifest.json +3 -3
  39. package/web/.next/standalone/packages/web/.next/routes-manifest.json +34 -0
  40. package/web/.next/standalone/packages/web/.next/server/app/_global-error.html +2 -2
  41. package/web/.next/standalone/packages/web/.next/server/app/_global-error.rsc +1 -1
  42. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  43. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  44. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  45. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  46. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  47. package/web/.next/standalone/packages/web/.next/server/app/_not-found/page/server-reference-manifest.json +7 -7
  48. package/web/.next/standalone/packages/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  49. package/web/.next/standalone/packages/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  50. package/web/.next/standalone/packages/web/.next/server/app/_not-found.html +1 -1
  51. package/web/.next/standalone/packages/web/.next/server/app/_not-found.rsc +3 -3
  52. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  53. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  54. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  55. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  56. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  57. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  58. package/web/.next/standalone/packages/web/.next/server/app/api/access/route.js +3 -4
  59. package/web/.next/standalone/packages/web/.next/server/app/api/access/route.js.nft.json +1 -1
  60. package/web/.next/standalone/packages/web/.next/server/app/api/agents/route/app-paths-manifest.json +3 -0
  61. package/web/.next/standalone/packages/web/.next/server/app/api/agents/route/build-manifest.json +11 -0
  62. package/web/.next/standalone/packages/web/.next/server/app/api/agents/route/server-reference-manifest.json +4 -0
  63. package/web/.next/standalone/packages/web/.next/server/app/api/agents/route.js +10 -0
  64. package/web/.next/standalone/packages/web/.next/server/app/api/agents/route.js.map +5 -0
  65. package/web/.next/standalone/packages/web/.next/server/app/api/agents/route.js.nft.json +1 -0
  66. package/web/.next/standalone/packages/web/.next/server/app/api/agents/route_client-reference-manifest.js +2 -0
  67. package/web/.next/standalone/packages/web/.next/server/app/api/attachments/route.js +2 -2
  68. package/web/.next/standalone/packages/web/.next/server/app/api/attachments/route.js.nft.json +1 -1
  69. package/web/.next/standalone/packages/web/.next/server/app/api/auth/session/route.js +3 -1
  70. package/web/.next/standalone/packages/web/.next/server/app/api/auth/session/route.js.nft.json +1 -1
  71. package/web/.next/standalone/packages/web/.next/server/app/api/boards/route.js +3 -5
  72. package/web/.next/standalone/packages/web/.next/server/app/api/boards/route.js.nft.json +1 -1
  73. package/web/.next/standalone/packages/web/.next/server/app/api/config/route.js +2 -2
  74. package/web/.next/standalone/packages/web/.next/server/app/api/config/route.js.nft.json +1 -1
  75. package/web/.next/standalone/packages/web/.next/server/app/api/context-files/route.js +2 -2
  76. package/web/.next/standalone/packages/web/.next/server/app/api/context-files/route.js.nft.json +1 -1
  77. package/web/.next/standalone/packages/web/.next/server/app/api/events/route.js +3 -3
  78. package/web/.next/standalone/packages/web/.next/server/app/api/events/route.js.nft.json +1 -1
  79. package/web/.next/standalone/packages/web/.next/server/app/api/executor/health/route/app-paths-manifest.json +3 -0
  80. package/web/.next/standalone/packages/web/.next/server/app/api/executor/health/route/build-manifest.json +11 -0
  81. package/web/.next/standalone/packages/web/.next/server/app/api/executor/health/route/server-reference-manifest.json +4 -0
  82. package/web/.next/standalone/packages/web/.next/server/app/api/executor/health/route.js +10 -0
  83. package/web/.next/standalone/packages/web/.next/server/app/api/executor/health/route.js.map +5 -0
  84. package/web/.next/standalone/packages/web/.next/server/app/api/executor/health/route.js.nft.json +1 -0
  85. package/web/.next/standalone/packages/web/.next/server/app/api/executor/health/route_client-reference-manifest.js +2 -0
  86. package/web/.next/standalone/packages/web/.next/server/app/api/filesystem/directory/route.js +2 -2
  87. package/web/.next/standalone/packages/web/.next/server/app/api/filesystem/directory/route.js.nft.json +1 -1
  88. package/web/.next/standalone/packages/web/.next/server/app/api/filesystem/pick-directory/route/app-paths-manifest.json +3 -0
  89. package/web/.next/standalone/packages/web/.next/server/app/api/filesystem/pick-directory/route/build-manifest.json +11 -0
  90. package/web/.next/standalone/packages/web/.next/server/app/api/filesystem/pick-directory/route/server-reference-manifest.json +4 -0
  91. package/web/.next/standalone/packages/web/.next/server/app/api/filesystem/pick-directory/route.js +10 -0
  92. package/web/.next/standalone/packages/web/.next/server/app/api/filesystem/pick-directory/route.js.map +5 -0
  93. package/web/.next/standalone/packages/web/.next/server/app/api/filesystem/pick-directory/route.js.nft.json +1 -0
  94. package/web/.next/standalone/packages/web/.next/server/app/api/filesystem/pick-directory/route_client-reference-manifest.js +2 -0
  95. package/web/.next/standalone/packages/web/.next/server/app/api/github/repos/route.js +2 -2
  96. package/web/.next/standalone/packages/web/.next/server/app/api/github/repos/route.js.nft.json +1 -1
  97. package/web/.next/standalone/packages/web/.next/server/app/api/health/boards/route.js +2 -2
  98. package/web/.next/standalone/packages/web/.next/server/app/api/health/boards/route.js.nft.json +1 -1
  99. package/web/.next/standalone/packages/web/.next/server/app/api/health/sessions/route.js +2 -2
  100. package/web/.next/standalone/packages/web/.next/server/app/api/health/sessions/route.js.nft.json +1 -1
  101. package/web/.next/standalone/packages/web/.next/server/app/api/notifications/route.js +2 -2
  102. package/web/.next/standalone/packages/web/.next/server/app/api/notifications/route.js.nft.json +1 -1
  103. package/web/.next/standalone/packages/web/.next/server/app/api/preferences/route.js +3 -4
  104. package/web/.next/standalone/packages/web/.next/server/app/api/preferences/route.js.nft.json +1 -1
  105. package/web/.next/standalone/packages/web/.next/server/app/api/repositories/[id]/route/app-paths-manifest.json +3 -0
  106. package/web/.next/standalone/packages/web/.next/server/app/api/repositories/[id]/route/build-manifest.json +11 -0
  107. package/web/.next/standalone/packages/web/.next/server/app/api/repositories/[id]/route/server-reference-manifest.json +4 -0
  108. package/web/.next/standalone/packages/web/.next/server/app/api/repositories/[id]/route.js +10 -0
  109. package/web/.next/standalone/packages/web/.next/server/app/api/repositories/[id]/route.js.map +5 -0
  110. package/web/.next/standalone/packages/web/.next/server/app/api/repositories/[id]/route.js.nft.json +1 -0
  111. package/web/.next/standalone/packages/web/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +2 -0
  112. package/web/.next/standalone/packages/web/.next/server/app/api/repositories/route.js +4 -6
  113. package/web/.next/standalone/packages/web/.next/server/app/api/repositories/route.js.nft.json +1 -1
  114. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/actions/route.js +2 -2
  115. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/actions/route.js.nft.json +1 -1
  116. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/archive/route/app-paths-manifest.json +3 -0
  117. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/archive/route/build-manifest.json +11 -0
  118. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/archive/route/server-reference-manifest.json +4 -0
  119. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/archive/route.js +10 -0
  120. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/archive/route.js.map +5 -0
  121. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/archive/route.js.nft.json +1 -0
  122. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/archive/route_client-reference-manifest.js +2 -0
  123. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/checks/route.js +2 -2
  124. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/checks/route.js.nft.json +1 -1
  125. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/diff/route.js +4 -5
  126. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/diff/route.js.nft.json +1 -1
  127. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feed/route.js +2 -2
  128. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feed/route.js.nft.json +1 -1
  129. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feedback/route.js +2 -2
  130. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feedback/route.js.nft.json +1 -1
  131. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/files/route.js +2 -2
  132. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/files/route.js.nft.json +1 -1
  133. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/keys/route.js +2 -2
  134. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/keys/route.js.nft.json +1 -1
  135. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/kill/route.js +2 -2
  136. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/kill/route.js.nft.json +1 -1
  137. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/route.js +2 -2
  138. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/route.js.nft.json +1 -1
  139. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/stream/route.js +3 -3
  140. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/stream/route.js.nft.json +1 -1
  141. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/restore/route.js +2 -2
  142. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/restore/route.js.nft.json +1 -1
  143. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/route.js +2 -2
  144. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -1
  145. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/send/route.js +2 -2
  146. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/send/route.js.nft.json +1 -1
  147. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/route.js +2 -2
  148. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/route.js.nft.json +1 -1
  149. package/web/.next/standalone/packages/web/.next/server/app/api/spawn/route.js +3 -4
  150. package/web/.next/standalone/packages/web/.next/server/app/api/spawn/route.js.nft.json +1 -1
  151. package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/branches/route.js +2 -2
  152. package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/branches/route.js.nft.json +1 -1
  153. package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/route.js +4 -6
  154. package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/route.js.nft.json +1 -1
  155. package/web/.next/standalone/packages/web/.next/server/app/index.html +1 -1
  156. package/web/.next/standalone/packages/web/.next/server/app/index.rsc +4 -4
  157. package/web/.next/standalone/packages/web/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  158. package/web/.next/standalone/packages/web/.next/server/app/index.segments/_full.segment.rsc +4 -4
  159. package/web/.next/standalone/packages/web/.next/server/app/index.segments/_head.segment.rsc +1 -1
  160. package/web/.next/standalone/packages/web/.next/server/app/index.segments/_index.segment.rsc +3 -3
  161. package/web/.next/standalone/packages/web/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  162. package/web/.next/standalone/packages/web/.next/server/app/page/react-loadable-manifest.json +2 -2
  163. package/web/.next/standalone/packages/web/.next/server/app/page/server-reference-manifest.json +7 -7
  164. package/web/.next/standalone/packages/web/.next/server/app/page.js.nft.json +1 -1
  165. package/web/.next/standalone/packages/web/.next/server/app/page_client-reference-manifest.js +1 -1
  166. package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page/server-reference-manifest.json +7 -7
  167. package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page.js.nft.json +1 -1
  168. package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page_client-reference-manifest.js +1 -1
  169. package/web/.next/standalone/packages/web/.next/server/app/sign-in/[[...sign-in]]/page/server-reference-manifest.json +7 -7
  170. package/web/.next/standalone/packages/web/.next/server/app/sign-in/[[...sign-in]]/page.js.nft.json +1 -1
  171. package/web/.next/standalone/packages/web/.next/server/app/sign-in/[[...sign-in]]/page_client-reference-manifest.js +1 -1
  172. package/web/.next/standalone/packages/web/.next/server/app/unlock/page/server-reference-manifest.json +7 -7
  173. package/web/.next/standalone/packages/web/.next/server/app/unlock/page.js.nft.json +1 -1
  174. package/web/.next/standalone/packages/web/.next/server/app/unlock/page_client-reference-manifest.js +1 -1
  175. package/web/.next/standalone/packages/web/.next/server/app-paths-manifest.json +5 -0
  176. package/web/.next/standalone/packages/web/.next/server/chunks/29f24__next-internal_server_app_api_filesystem_pick-directory_route_actions_51e42977.js +3 -0
  177. package/web/.next/standalone/packages/web/.next/server/chunks/730ea_web__next-internal_server_app_api_executor_health_route_actions_8e415531.js +3 -0
  178. package/web/.next/standalone/packages/web/.next/server/chunks/730ea_web__next-internal_server_app_api_repositories_[id]_route_actions_4d42b4b5.js +3 -0
  179. package/web/.next/standalone/packages/web/.next/server/chunks/730ea_web__next-internal_server_app_api_sessions_[id]_archive_route_actions_bdb25739.js +3 -0
  180. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__0074ebac._.js +3 -0
  181. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__03a6b3e6._.js +3 -0
  182. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__049daed6._.js +3 -0
  183. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__6023a748._.js → [root-of-the-server]__095ffdaa._.js} +1 -1
  184. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__2a83553a._.js → [root-of-the-server]__0c7f79b1._.js} +1 -1
  185. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__137c9740._.js +3 -0
  186. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__1aa339ea._.js → [root-of-the-server]__144e8e60._.js} +1 -1
  187. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__1ed2e6c1._.js → [root-of-the-server]__14949257._.js} +17 -163
  188. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__15594e11._.js +3 -0
  189. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__159ecc1b._.js +3 -0
  190. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__29be362d._.js → [root-of-the-server]__16d4a78f._.js} +1 -1
  191. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__171dd44e._.js +3 -0
  192. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__177505ca._.js +3 -0
  193. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__18aa1fa3._.js +3 -0
  194. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__1c3521a3._.js +3 -0
  195. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__1c793b78._.js +3 -0
  196. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__22fbbc7b._.js +3 -0
  197. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__25bbe81a._.js +3 -0
  198. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__2d10de49._.js +3 -0
  199. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__30442998._.js +3 -0
  200. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__31d22800._.js +3 -0
  201. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__3d6b30a3._.js +1 -1
  202. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__44892736._.js +3 -0
  203. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__495221b1._.js +3 -0
  204. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__4ff9e8b0._.js +3 -0
  205. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__54eb1ef0._.js +3 -0
  206. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__5c375e13._.js +3 -0
  207. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6362697f._.js +3 -0
  208. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__69b36e36._.js +3 -0
  209. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6badbf4e._.js +3 -0
  210. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6c4cd852._.js +3 -0
  211. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6f7b329b._.js +3 -0
  212. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__70b7af90._.js +3 -0
  213. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__71077192._.js +3 -0
  214. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__758687ca._.js +3 -0
  215. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__7604e43b._.js +3 -0
  216. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__77b23eae._.js +3 -0
  217. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__78650ac9._.js +3 -0
  218. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__789107eb._.js +3 -0
  219. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__78c062a8._.js +3 -0
  220. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__78c4bb1e._.js +3 -0
  221. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__790d1d4b._.js +3 -0
  222. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__8132442f._.js +3 -0
  223. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__833a2cd9._.js +3 -0
  224. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__85d6ae4c._.js +3 -0
  225. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__8d933120._.js +3 -0
  226. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__90ac5665._.js +3 -0
  227. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__92a4f9bf._.js +3 -0
  228. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__93d550e2._.js +3 -0
  229. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__96e59c1f._.js +3 -0
  230. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__9d98fee2._.js +3 -0
  231. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__9fcf6265._.js +3 -0
  232. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__a5b78741._.js +3 -0
  233. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__a8a4b101._.js +3 -0
  234. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__a8d11727._.js +3 -0
  235. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__b2e0e81c._.js +3 -0
  236. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__bf756716._.js +3 -0
  237. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__c09452b3._.js +3 -0
  238. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__c43dcff1._.js +3 -0
  239. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__c923cbdc._.js +3 -0
  240. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ce993e7b._.js +3 -0
  241. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__cfbdd2bf._.js +3 -0
  242. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__d1d8bfb5._.js +3 -0
  243. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__d4d1744d._.js +3 -0
  244. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__d8852803._.js +3 -0
  245. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ea1961bd._.js +3 -0
  246. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ee8a3221._.js +3 -0
  247. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ef8c815b._.js +3 -0
  248. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ef918d06._.js +3 -0
  249. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__f3693403._.js +3 -0
  250. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__f62cac3a._.js +3 -0
  251. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__f73117e9._.js +3 -0
  252. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__f7651519._.js +3 -0
  253. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__fc6ffe6c._.js +3 -0
  254. package/web/.next/standalone/packages/web/.next/server/chunks/packages_web__next-internal_server_app_api_agents_route_actions_29063d1a.js +3 -0
  255. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__6622b514._.js +1 -1
  256. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__869d9ac0._.js +1 -1
  257. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__b388693f._.js +1 -1
  258. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{[root-of-the-server]__48817f02._.js → [root-of-the-server]__c3eb4913._.js} +2 -2
  259. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_0e1412de._.js +1 -1
  260. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{_20a4007d._.js → _3acfb388._.js} +2 -2
  261. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_668c9201._.js +3 -0
  262. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_69e05fca._.js +1 -1
  263. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_80efe193._.js +1 -1
  264. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_b6d31783._.js +1 -1
  265. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_c0f0e227._.js +1 -1
  266. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_f36ddaa9._.js +1 -1
  267. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@clerk_nextjs_dist_esm_app-router_129dde21._.js +3 -0
  268. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@clerk_nextjs_dist_esm_app-router_1776df7f._.js +3 -0
  269. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_f2ebd7a9._.js +1 -1
  270. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/packages_web_src_79316445._.js +1 -1
  271. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/packages_web_src_a078c137._.js +1 -1
  272. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/packages_web_src_app_page_tsx_cd282e82._.js +1 -1
  273. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/packages_web_src_app_unlock_UnlockForm_tsx_ce3149a7._.js +1 -1
  274. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{packages_web_src_components_6cab1c8c._.js → packages_web_src_components_aad7de7c._.js} +1 -1
  275. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/packages_web_src_components_board_WorkspaceKanban_tsx_735b7999._.js +1 -1
  276. package/web/.next/standalone/packages/web/.next/server/pages/404.html +1 -1
  277. package/web/.next/standalone/packages/web/.next/server/pages/500.html +2 -2
  278. package/web/.next/standalone/packages/web/.next/server/server-reference-manifest.js +1 -1
  279. package/web/.next/standalone/packages/web/.next/server/server-reference-manifest.json +8 -8
  280. package/web/.next/standalone/packages/web/.next/static/chunks/{5c7e8425945ad682.js → 07a5ac7389686572.js} +1 -1
  281. package/web/.next/standalone/packages/web/.next/static/chunks/3603312f8407bd12.js +1 -0
  282. package/web/.next/standalone/packages/web/.next/static/chunks/382be8f0b30c5f08.js +1 -0
  283. package/web/.next/standalone/packages/web/.next/static/chunks/479b8cb58c95a8a0.js +1 -0
  284. package/web/.next/standalone/packages/web/.next/static/chunks/53e4f3b495e423c9.js +1 -0
  285. package/web/.next/{static/chunks/3b757dce050133c8.js → standalone/packages/web/.next/static/chunks/5c5637796e242130.js} +2 -2
  286. package/web/.next/standalone/packages/web/.next/static/chunks/{695b7cb206c6dadd.js → 5e05e67a26b7ecbc.js} +1 -1
  287. package/web/.next/standalone/packages/web/.next/static/chunks/6d083840413686dd.css +3 -0
  288. package/web/.next/standalone/packages/web/.next/static/chunks/870a993d28314a90.js +1 -0
  289. package/web/.next/standalone/packages/web/.next/static/chunks/c5caacf383990e7b.js +1 -0
  290. package/web/.next/standalone/packages/web/.next/static/chunks/c7c1bd729f17c8bf.js +1 -0
  291. package/web/.next/standalone/packages/web/.next/static/chunks/e8d146cc2723147b.js +1 -0
  292. package/web/.next/standalone/packages/web/package.json +1 -1
  293. package/web/.next/standalone/packages/web/src/app/api/access/route.ts +3 -211
  294. package/web/.next/standalone/packages/web/src/app/api/agents/route.ts +5 -0
  295. package/web/.next/standalone/packages/web/src/app/api/attachments/route.ts +2 -166
  296. package/web/.next/standalone/packages/web/src/app/api/auth/session/route.ts +4 -52
  297. package/web/.next/standalone/packages/web/src/app/api/boards/route.ts +3 -517
  298. package/web/.next/standalone/packages/web/src/app/api/config/route.ts +2 -78
  299. package/web/.next/standalone/packages/web/src/app/api/context-files/route.ts +2 -198
  300. package/web/.next/standalone/packages/web/src/app/api/events/route.ts +2 -122
  301. package/web/.next/standalone/packages/web/src/app/api/executor/health/route.ts +5 -0
  302. package/web/.next/standalone/packages/web/src/app/api/filesystem/directory/route.ts +2 -142
  303. package/web/.next/standalone/packages/web/src/app/api/filesystem/pick-directory/route.ts +5 -0
  304. package/web/.next/standalone/packages/web/src/app/api/github/repos/route.ts +2 -103
  305. package/web/.next/standalone/packages/web/src/app/api/health/boards/route.ts +2 -69
  306. package/web/.next/standalone/packages/web/src/app/api/health/sessions/route.ts +2 -74
  307. package/web/.next/standalone/packages/web/src/app/api/notifications/route.ts +3 -88
  308. package/web/.next/standalone/packages/web/src/app/api/preferences/route.ts +3 -191
  309. package/web/.next/standalone/packages/web/src/app/api/repositories/[id]/route.ts +8 -0
  310. package/web/.next/standalone/packages/web/src/app/api/repositories/route.ts +4 -416
  311. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/actions/route.ts +5 -77
  312. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/archive/route.ts +8 -0
  313. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/checks/route.ts +5 -172
  314. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/diff/route.ts +5 -423
  315. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/feed/route.ts +5 -94
  316. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/feedback/route.ts +5 -44
  317. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/files/route.ts +5 -194
  318. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/keys/route.ts +6 -138
  319. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/kill/route.ts +5 -42
  320. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/output/route.ts +5 -259
  321. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/output/stream/route.ts +5 -108
  322. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/restore/route.ts +5 -46
  323. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/route.ts +6 -204
  324. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/send/route.ts +5 -55
  325. package/web/.next/standalone/packages/web/src/app/api/sessions/route.ts +2 -102
  326. package/web/.next/standalone/packages/web/src/app/api/spawn/route.ts +3 -214
  327. package/web/.next/standalone/packages/web/src/app/api/workspaces/branches/route.ts +2 -230
  328. package/web/.next/standalone/packages/web/src/app/api/workspaces/route.ts +3 -589
  329. package/web/.next/standalone/packages/web/src/app/unlock/UnlockForm.tsx +25 -4
  330. package/web/.next/standalone/packages/web/src/components/board/WorkspaceKanban.tsx +8 -8
  331. package/web/.next/standalone/packages/web/src/components/layout/WorkspaceSidebarPanel.tsx +199 -84
  332. package/web/.next/standalone/packages/web/src/components/sessions/ChatPanel.tsx +36 -5
  333. package/web/.next/standalone/packages/web/src/features/dashboard/DashboardClient.tsx +86 -36
  334. package/web/.next/standalone/packages/web/src/features/dashboard/components/WorkspaceOverview.tsx +57 -9
  335. package/web/.next/standalone/packages/web/src/hooks/useSessionOutputStream.ts +11 -0
  336. package/web/.next/standalone/packages/web/src/lib/auth.ts +90 -14
  337. package/web/.next/standalone/packages/web/src/lib/guardedRustProxy.ts +25 -0
  338. package/web/.next/standalone/packages/web/src/lib/liveEvents.ts +64 -7
  339. package/web/.next/standalone/packages/web/src/lib/proxyRoutes.ts +46 -0
  340. package/web/.next/standalone/packages/web/src/lib/runtimeAgentModels.ts +1 -1
  341. package/web/.next/standalone/packages/web/src/lib/rustBackendProxy.ts +154 -0
  342. package/web/.next/standalone/packages/web/src/proxy.ts +3 -20
  343. package/web/.next/static/chunks/{5c7e8425945ad682.js → 07a5ac7389686572.js} +1 -1
  344. package/web/.next/static/chunks/3603312f8407bd12.js +1 -0
  345. package/web/.next/static/chunks/382be8f0b30c5f08.js +1 -0
  346. package/web/.next/static/chunks/479b8cb58c95a8a0.js +1 -0
  347. package/web/.next/static/chunks/53e4f3b495e423c9.js +1 -0
  348. package/web/.next/{standalone/packages/web/.next/static/chunks/3b757dce050133c8.js → static/chunks/5c5637796e242130.js} +2 -2
  349. package/web/.next/static/chunks/{695b7cb206c6dadd.js → 5e05e67a26b7ecbc.js} +1 -1
  350. package/web/.next/static/chunks/6d083840413686dd.css +3 -0
  351. package/web/.next/static/chunks/870a993d28314a90.js +1 -0
  352. package/web/.next/static/chunks/c5caacf383990e7b.js +1 -0
  353. package/web/.next/static/chunks/c7c1bd729f17c8bf.js +1 -0
  354. package/web/.next/static/chunks/e8d146cc2723147b.js +1 -0
  355. package/native/conductor +0 -0
  356. package/web/.next/standalone/packages/web/.next/server/chunks/[externals]__f25f12d4._.js +0 -3
  357. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__005aa909._.js +0 -3
  358. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__008d962e._.js +0 -3
  359. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__00cf28e7._.js +0 -3
  360. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__03ff76ee._.js +0 -3
  361. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__06365513._.js +0 -3
  362. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__075f8697._.js +0 -3
  363. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__097be5a7._.js +0 -3
  364. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__0a0f0f01._.js +0 -3
  365. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__1003246b._.js +0 -3
  366. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__11918223._.js +0 -3
  367. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__13ad088c._.js +0 -3
  368. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__1458f8ec._.js +0 -3
  369. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__14b1d4a3._.js +0 -3
  370. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__1741fb8a._.js +0 -3
  371. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__1875f00e._.js +0 -3
  372. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__1beced71._.js +0 -3
  373. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__1f626a16._.js +0 -129
  374. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__2062aaab._.js +0 -3
  375. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__206c3d8a._.js +0 -3
  376. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__22f8f0d6._.js +0 -129
  377. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__23bebaf9._.js +0 -3
  378. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__2556a816._.js +0 -3
  379. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__25788ed3._.js +0 -54
  380. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__2c3f6397._.js +0 -3
  381. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__2c909fe3._.js +0 -3
  382. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__30921756._.js +0 -3
  383. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__31eea08c._.js +0 -3
  384. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__346d9484._.js +0 -3
  385. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__3edd3509._.js +0 -3
  386. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__3f8b49ba._.js +0 -3
  387. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__3f8e82c2._.js +0 -3
  388. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__44d59fd0._.js +0 -3
  389. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__48875cbb._.js +0 -7
  390. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__49c6a20e._.js +0 -3
  391. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__4ac9d639._.js +0 -3
  392. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__4c3fb752._.js +0 -3
  393. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__4ca8b259._.js +0 -3
  394. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__4dab6a6a._.js +0 -3
  395. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__53385c40._.js +0 -3
  396. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__544326ac._.js +0 -3
  397. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__54a218f0._.js +0 -54
  398. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__55e337f7._.js +0 -3
  399. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__5661ca72._.js +0 -3
  400. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__5cd49624._.js +0 -3
  401. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__5e0533de._.js +0 -3
  402. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__5e161db4._.js +0 -3
  403. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__5ebcb223._.js +0 -3
  404. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__5fd609c9._.js +0 -3
  405. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__60cf7bf4._.js +0 -3
  406. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__60ee4897._.js +0 -3
  407. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6559c1a4._.js +0 -3
  408. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__659938b1._.js +0 -3
  409. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6712f45a._.js +0 -3
  410. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__69227de6._.js +0 -3
  411. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6ab08a39._.js +0 -129
  412. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6c10c03b._.js +0 -3
  413. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6cd54de1._.js +0 -3
  414. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6ce2b5d7._.js +0 -3
  415. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6cfd00d2._.js +0 -3
  416. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6d62709d._.js +0 -129
  417. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6e08e4e4._.js +0 -3
  418. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__749331b0._.js +0 -54
  419. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__74a53184._.js +0 -3
  420. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__76c16426._.js +0 -3
  421. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__778e46a1._.js +0 -129
  422. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__7a26e452._.js +0 -3
  423. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__7ba96fa5._.js +0 -3
  424. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__7e684560._.js +0 -3
  425. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__848eb266._.js +0 -3
  426. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__8596d782._.js +0 -7
  427. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__85d8966b._.js +0 -3
  428. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__86aff2b8._.js +0 -3
  429. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__879cf4d2._.js +0 -3
  430. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__881858fa._.js +0 -3
  431. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__885e3a00._.js +0 -54
  432. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__887ea436._.js +0 -3
  433. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__893f6b3b._.js +0 -3
  434. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__89dfcd05._.js +0 -3
  435. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__8cc5826f._.js +0 -3
  436. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__913af875._.js +0 -3
  437. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__91b42119._.js +0 -3
  438. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__93ce1b75._.js +0 -3
  439. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__96633022._.js +0 -3
  440. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__96951362._.js +0 -3
  441. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__971fcc75._.js +0 -9
  442. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__99da6324._.js +0 -3
  443. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__9f07930d._.js +0 -3
  444. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__9f36b7ec._.js +0 -129
  445. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__9fd08bbc._.js +0 -3
  446. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__a05953cc._.js +0 -3
  447. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__a0b6570d._.js +0 -3
  448. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__a3766ac1._.js +0 -3
  449. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__a3bfaabf._.js +0 -3
  450. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__a420e374._.js +0 -3
  451. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__a4a33247._.js +0 -54
  452. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ac544bb5._.js +0 -3
  453. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ad84d2e0._.js +0 -54
  454. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__b3095e9d._.js +0 -3
  455. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__b59abfbd._.js +0 -3
  456. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__b9692a3c._.js +0 -3
  457. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__bcc08c70._.js +0 -3
  458. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__be051d52._.js +0 -3
  459. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__bea07e07._.js +0 -3
  460. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__c1759514._.js +0 -3
  461. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__c2ef2bfc._.js +0 -3
  462. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__c8618cb1._.js +0 -3
  463. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ca8a18f8._.js +0 -3
  464. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__cafd7bb3._.js +0 -3
  465. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__cb112606._.js +0 -3
  466. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__cc74ea40._.js +0 -3
  467. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__cd3692a0._.js +0 -3
  468. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__cf3cdecd._.js +0 -3
  469. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__d09e7a99._.js +0 -3
  470. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__d40b50e7._.js +0 -3
  471. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__d4721d30._.js +0 -3
  472. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__d538c110._.js +0 -3
  473. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__d73ea818._.js +0 -3
  474. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__db3d0133._.js +0 -3
  475. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__dd0cf085._.js +0 -3
  476. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__de0f2533._.js +0 -7
  477. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__e113f6df._.js +0 -3
  478. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__e1a418bc._.js +0 -3
  479. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__e6c1d827._.js +0 -3
  480. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ea69c4ce._.js +0 -3
  481. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__eac16890._.js +0 -3
  482. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__eb1dfcc6._.js +0 -3
  483. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ee75d43a._.js +0 -3
  484. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ef773ea6._.js +0 -3
  485. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__f0d15920._.js +0 -3
  486. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__f15cbcfc._.js +0 -3
  487. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__f48eb2d4._.js +0 -3
  488. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__fb6ab669._.js +0 -3
  489. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__fe8419b5._.js +0 -129
  490. package/web/.next/standalone/packages/web/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0e4dc4f7.js +0 -4
  491. package/web/.next/standalone/packages/web/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_dd27f857.js +0 -3
  492. package/web/.next/standalone/packages/web/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_e445b36c.js +0 -3
  493. package/web/.next/standalone/packages/web/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_f375f3c4.js +0 -28
  494. package/web/.next/standalone/packages/web/.next/server/chunks/packages_core_dist_index_cdd30418.js +0 -3
  495. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_agent-amp_dist_index_bf3d8239.js +0 -3
  496. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_agent-ccr_dist_index_69cbf726.js +0 -3
  497. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_agent-claude-code_dist_index_31314e43.js +0 -125
  498. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_agent-cursor-cli_dist_index_8d5cc426.js +0 -3
  499. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_agent-droid_dist_index_f731227a.js +0 -3
  500. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_agent-gemini_dist_index_b2d219e8.js +0 -54
  501. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_agent-github-copilot_dist_index_9f80cb45.js +0 -3
  502. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_agent-opencode_dist_index_7c7015da.js +0 -3
  503. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_agent-qwen-code_dist_index_46dd8653.js +0 -3
  504. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_notifier-desktop_dist_index_ef3473f0.js +0 -3
  505. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_notifier-discord_dist_index_34257226.js +0 -3
  506. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_scm-github_dist_index_3b5a621e.js +0 -3
  507. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_terminal-web_dist_index_1e0706d3.js +0 -3
  508. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_tracker-github_dist_index_2d7af62f.js +0 -3
  509. package/web/.next/standalone/packages/web/.next/server/chunks/packages_web_src_lib_13fee5eb._.js +0 -3
  510. package/web/.next/standalone/packages/web/.next/server/chunks/packages_web_src_lib_d64596cc._.js +0 -3
  511. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_b88bcf2c._.js +0 -3
  512. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@clerk_nextjs_dist_esm_app-router_38e7b35d._.js +0 -3
  513. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@clerk_nextjs_dist_esm_app-router_f665760b._.js +0 -3
  514. package/web/.next/standalone/packages/web/.next/static/chunks/062888342200567f.js +0 -1
  515. package/web/.next/standalone/packages/web/.next/static/chunks/6c9a11faed9daf4d.js +0 -1
  516. package/web/.next/standalone/packages/web/.next/static/chunks/8221b78965a50858.js +0 -1
  517. package/web/.next/standalone/packages/web/.next/static/chunks/8de84e208e201d72.css +0 -3
  518. package/web/.next/standalone/packages/web/.next/static/chunks/a8d4e0d75ca51921.js +0 -1
  519. package/web/.next/standalone/packages/web/.next/static/chunks/ac6a06c17a4f651f.js +0 -1
  520. package/web/.next/standalone/packages/web/.next/static/chunks/c4ea57fb949fb623.js +0 -1
  521. package/web/.next/standalone/packages/web/.next/static/chunks/d9d05e7b540400af.js +0 -1
  522. package/web/.next/standalone/packages/web/.next/static/chunks/f5d9ad0f62ede339.js +0 -1
  523. package/web/.next/standalone/packages/web/src/lib/services.ts +0 -319
  524. package/web/.next/static/chunks/062888342200567f.js +0 -1
  525. package/web/.next/static/chunks/6c9a11faed9daf4d.js +0 -1
  526. package/web/.next/static/chunks/8221b78965a50858.js +0 -1
  527. package/web/.next/static/chunks/8de84e208e201d72.css +0 -3
  528. package/web/.next/static/chunks/a8d4e0d75ca51921.js +0 -1
  529. package/web/.next/static/chunks/ac6a06c17a4f651f.js +0 -1
  530. package/web/.next/static/chunks/c4ea57fb949fb623.js +0 -1
  531. package/web/.next/static/chunks/d9d05e7b540400af.js +0 -1
  532. package/web/.next/static/chunks/f5d9ad0f62ede339.js +0 -1
  533. /package/web/.next/standalone/packages/web/.next/static/{P8IBAo_woCzrGXJiYCZto → oFTStwDpHHac4pinj0rAJ}/_buildManifest.js +0 -0
  534. /package/web/.next/standalone/packages/web/.next/static/{P8IBAo_woCzrGXJiYCZto → oFTStwDpHHac4pinj0rAJ}/_clientMiddlewareManifest.json +0 -0
  535. /package/web/.next/standalone/packages/web/.next/static/{P8IBAo_woCzrGXJiYCZto → oFTStwDpHHac4pinj0rAJ}/_ssgManifest.js +0 -0
  536. /package/web/.next/static/{P8IBAo_woCzrGXJiYCZto → oFTStwDpHHac4pinj0rAJ}/_buildManifest.js +0 -0
  537. /package/web/.next/static/{P8IBAo_woCzrGXJiYCZto → oFTStwDpHHac4pinj0rAJ}/_clientMiddlewareManifest.json +0 -0
  538. /package/web/.next/static/{P8IBAo_woCzrGXJiYCZto → oFTStwDpHHac4pinj0rAJ}/_ssgManifest.js +0 -0
@@ -1,216 +1,5 @@
1
- import { type NextRequest, NextResponse } from "next/server";
2
- import { readFile, writeFile } from "node:fs/promises";
3
- import { parse, stringify } from "yaml";
4
- import { normalizeProjectConfigMap, syncWorkspaceSupportFiles } from "@conductor-oss/core";
5
- import { getServices, invalidateServicesCache } from "@/lib/services";
6
- import { guardApiAccess, guardApiActionAccess } from "@/lib/auth";
7
- import { sessionToDashboard } from "@/lib/serialize";
8
- import { normalizeRootProjectPaths, syncProjectLocalConfig } from "@/lib/projectConfigSync";
1
+ import { guardedProxyRoute } from "@/lib/proxyRoutes";
9
2
 
10
- /** POST /api/spawn -- Spawn a new agent session. */
3
+ export const dynamic = "force-dynamic";
11
4
 
12
- type MutableConfig = Record<string, unknown>;
13
-
14
- function toObject(value: unknown): Record<string, unknown> {
15
- if (!value || typeof value !== "object" || Array.isArray(value)) {
16
- return {};
17
- }
18
- return { ...(value as Record<string, unknown>) };
19
- }
20
-
21
- async function persistSpawnAgentSelection(configPath: string, projectId: string, agent: string): Promise<void> {
22
- const originalConfigRaw = await readFile(configPath, "utf8");
23
- const parsed = (parse(originalConfigRaw) ?? {}) as MutableConfig;
24
- const nextRoot: MutableConfig =
25
- parsed && typeof parsed === "object" && !Array.isArray(parsed)
26
- ? { ...parsed }
27
- : {};
28
-
29
- const nextProjects = normalizeProjectConfigMap(nextRoot["projects"]);
30
- const existingProject = toObject(nextProjects[projectId]);
31
- nextProjects[projectId] = {
32
- ...existingProject,
33
- agent,
34
- };
35
- nextRoot["projects"] = nextProjects;
36
-
37
- const nextPreferences = toObject(nextRoot["preferences"]);
38
- nextRoot["preferences"] = {
39
- ...nextPreferences,
40
- codingAgent: agent,
41
- };
42
- await normalizeRootProjectPaths(nextRoot);
43
-
44
- const updatedYaml = stringify(nextRoot, { lineWidth: 0 });
45
- await writeFile(configPath, updatedYaml, "utf8");
46
-
47
- try {
48
- invalidateServicesCache("spawn agent selection updated");
49
- const { config: refreshedConfig, registry } = await getServices();
50
- await syncProjectLocalConfig(refreshedConfig as unknown as Record<string, unknown>, projectId);
51
- syncWorkspaceSupportFiles(refreshedConfig, {
52
- agentNames: registry.list("agent").map((agent) => agent.name),
53
- });
54
- } catch (err) {
55
- await writeFile(configPath, originalConfigRaw, "utf8");
56
- invalidateServicesCache("spawn agent selection rollback");
57
- throw err;
58
- }
59
- }
60
-
61
- export async function POST(request: NextRequest) {
62
- const denied = await guardApiAccess(request, "operator");
63
- if (denied) return denied;
64
- const deniedAction = guardApiActionAccess(request);
65
- if (deniedAction) return deniedAction;
66
-
67
- const body = (await request.json().catch(() => null)) as Record<string, unknown> | null;
68
- if (!body) {
69
- return NextResponse.json({ error: "Invalid JSON body" }, { status: 400 });
70
- }
71
-
72
- const projectId = body.projectId;
73
- if (typeof projectId !== "string" || projectId.trim().length === 0) {
74
- return NextResponse.json(
75
- { error: "projectId is required and must be a non-empty string" },
76
- { status: 400 },
77
- );
78
- }
79
-
80
- const issueId = body.issueId;
81
- if (issueId !== undefined && issueId !== null && typeof issueId !== "string") {
82
- return NextResponse.json(
83
- { error: "issueId must be a string if provided" },
84
- { status: 400 },
85
- );
86
- }
87
-
88
- const prompt = body.prompt;
89
- if (prompt !== undefined && prompt !== null && typeof prompt !== "string") {
90
- return NextResponse.json(
91
- { error: "prompt must be a string if provided" },
92
- { status: 400 },
93
- );
94
- }
95
-
96
- const agent = body.agent;
97
- if (agent !== undefined && agent !== null && typeof agent !== "string") {
98
- return NextResponse.json(
99
- { error: "agent must be a string if provided" },
100
- { status: 400 },
101
- );
102
- }
103
-
104
- const model = body.model;
105
- if (model !== undefined && model !== null && typeof model !== "string") {
106
- return NextResponse.json(
107
- { error: "model must be a string if provided" },
108
- { status: 400 },
109
- );
110
- }
111
-
112
- const reasoningEffort = body.reasoningEffort;
113
- if (reasoningEffort !== undefined && reasoningEffort !== null && typeof reasoningEffort !== "string") {
114
- return NextResponse.json(
115
- { error: "reasoningEffort must be a string if provided" },
116
- { status: 400 },
117
- );
118
- }
119
-
120
- const profile = body.profile;
121
- if (profile !== undefined && profile !== null && typeof profile !== "string") {
122
- return NextResponse.json(
123
- { error: "profile must be a string if provided" },
124
- { status: 400 },
125
- );
126
- }
127
-
128
- const branch = body.branch;
129
- if (branch !== undefined && branch !== null && typeof branch !== "string") {
130
- return NextResponse.json(
131
- { error: "branch must be a string if provided" },
132
- { status: 400 },
133
- );
134
- }
135
-
136
- const baseBranch = body.baseBranch;
137
- if (baseBranch !== undefined && baseBranch !== null && typeof baseBranch !== "string") {
138
- return NextResponse.json(
139
- { error: "baseBranch must be a string if provided" },
140
- { status: 400 },
141
- );
142
- }
143
-
144
- const normalizedProjectId = projectId.trim();
145
- const normalizedIssueId = typeof issueId === "string" && issueId.trim().length > 0
146
- ? issueId.trim()
147
- : undefined;
148
- const normalizedPrompt = typeof prompt === "string" && prompt.trim().length > 0
149
- ? prompt.trim()
150
- : undefined;
151
- const normalizedAgent = typeof agent === "string" && agent.trim().length > 0
152
- ? agent.trim()
153
- : undefined;
154
- const normalizedModel = typeof model === "string" && model.trim().length > 0
155
- ? model.trim()
156
- : undefined;
157
- const normalizedReasoningEffort = typeof reasoningEffort === "string" && reasoningEffort.trim().length > 0
158
- ? reasoningEffort.trim().toLowerCase()
159
- : undefined;
160
- const normalizedProfile = typeof profile === "string" && profile.trim().length > 0
161
- ? profile.trim()
162
- : undefined;
163
- const normalizedBranch = typeof branch === "string" && branch.trim().length > 0
164
- ? branch.trim()
165
- : undefined;
166
- const normalizedBaseBranch = typeof baseBranch === "string" && baseBranch.trim().length > 0
167
- ? baseBranch.trim()
168
- : undefined;
169
-
170
- try {
171
- const { sessionManager, config } = await getServices();
172
- if (!config.projects[normalizedProjectId]) {
173
- return NextResponse.json(
174
- { error: `Unknown project: ${normalizedProjectId}` },
175
- { status: 404 },
176
- );
177
- }
178
-
179
- if (!normalizedPrompt && !normalizedIssueId) {
180
- return NextResponse.json(
181
- { error: "Either prompt or issueId is required to create a workspace" },
182
- { status: 400 },
183
- );
184
- }
185
-
186
- if (normalizedAgent && config.configPath) {
187
- const currentProjectAgent = config.projects[normalizedProjectId]?.agent;
188
- const currentPreferredAgent = config.preferences?.codingAgent;
189
- if (normalizedAgent !== currentProjectAgent || normalizedAgent !== currentPreferredAgent) {
190
- await persistSpawnAgentSelection(config.configPath, normalizedProjectId, normalizedAgent);
191
- }
192
- }
193
-
194
- const session = await sessionManager.spawn({
195
- projectId: normalizedProjectId,
196
- issueId: normalizedIssueId,
197
- prompt: normalizedPrompt,
198
- agent: normalizedAgent,
199
- model: normalizedModel,
200
- reasoningEffort: normalizedReasoningEffort,
201
- profile: normalizedProfile,
202
- branch: normalizedBranch,
203
- baseBranch: normalizedBaseBranch,
204
- });
205
-
206
- return NextResponse.json(
207
- { session: sessionToDashboard(session) },
208
- { status: 201 },
209
- );
210
- } catch (err) {
211
- return NextResponse.json(
212
- { error: err instanceof Error ? err.message : "Failed to spawn session" },
213
- { status: 500 },
214
- );
215
- }
216
- }
5
+ export const POST = guardedProxyRoute("/api/spawn", { role: "operator", requireActionGuard: true });
@@ -1,233 +1,5 @@
1
- import { NextRequest, NextResponse } from "next/server";
2
- import { promisify } from "node:util";
3
- import { execFile } from "node:child_process";
4
- import { realpath, stat } from "node:fs/promises";
5
- import { homedir } from "node:os";
6
- import { isAbsolute, relative, resolve } from "node:path";
7
- import { guardApiAccess } from "@/lib/auth";
8
-
9
- const execFileAsync = promisify(execFile);
1
+ import { guardedProxyRoute } from "@/lib/proxyRoutes";
10
2
 
11
3
  export const dynamic = "force-dynamic";
12
4
 
13
- const HOME_ROOT = homedir();
14
- const VOLUMES_ROOT = "/Volumes";
15
- const ALLOWED_REMOTE_PROTOCOLS = new Set(["https:", "http:", "ssh:", "git:"]);
16
- const SAFE_SEGMENT_PATTERN = /^[^/\\\0\r\n]+$/;
17
-
18
- function asNonEmpty(value: string | null): string | null {
19
- if (!value) return null;
20
- const trimmed = value.trim();
21
- return trimmed.length > 0 ? trimmed : null;
22
- }
23
-
24
- class InputError extends Error {}
25
-
26
- function expandHome(path: string): string {
27
- if (path.startsWith("~/")) {
28
- return resolve(HOME_ROOT, path.slice(2));
29
- }
30
- return resolve(path);
31
- }
32
-
33
- function ensureWithinRoot(root: string, candidatePath: string) {
34
- const rel = relative(root, candidatePath);
35
- if (rel !== "" && (rel.startsWith("..") || isAbsolute(rel))) {
36
- throw new InputError("Path is outside the allowed repository roots");
37
- }
38
- }
39
-
40
- function normalizeScpStyleRemote(value: string): string | null {
41
- const match = value.match(
42
- /^(?<user>[A-Za-z0-9._-]+)@(?<host>[A-Za-z0-9.-]+):(?<repo>[A-Za-z0-9._~/-]+(?:\.git)?)$/,
43
- );
44
- if (!match?.groups) return null;
45
- const { user, host, repo } = match.groups;
46
- return `ssh://${user}@${host}/${repo}`;
47
- }
48
-
49
- function normalizeGitRemote(rawValue: string): string {
50
- if (/[\0\r\n]/.test(rawValue) || rawValue.startsWith("-")) {
51
- throw new InputError("Invalid gitUrl");
52
- }
53
-
54
- const candidate = normalizeScpStyleRemote(rawValue) ?? rawValue;
55
- const url = new URL(candidate);
56
-
57
- if (!ALLOWED_REMOTE_PROTOCOLS.has(url.protocol) || !url.hostname || url.search || url.hash) {
58
- throw new InputError("Unsupported gitUrl");
59
- }
60
-
61
- if (url.hostname.startsWith("-")) {
62
- throw new InputError("Unsupported gitUrl");
63
- }
64
-
65
- const normalizedPathname = url.pathname.replace(/\/+$/, "");
66
- if (normalizedPathname.length <= 1) {
67
- throw new InputError("gitUrl must include a repository path");
68
- }
69
-
70
- const normalized = new URL(`${url.protocol}//${url.host}${normalizedPathname}`);
71
- if (url.username) {
72
- normalized.username = url.username;
73
- }
74
- return normalized.toString();
75
- }
76
-
77
- async function resolveLocalRepoPath(rawPath: string): Promise<string> {
78
- const trimmed = rawPath.trim();
79
- if (/[\0\r\n]/.test(trimmed)) {
80
- throw new InputError("Invalid path");
81
- }
82
-
83
- let root: string;
84
- let relativePath: string;
85
-
86
- if (trimmed === "~" || trimmed === HOME_ROOT) {
87
- root = HOME_ROOT;
88
- relativePath = "";
89
- } else if (trimmed.startsWith("~/")) {
90
- root = HOME_ROOT;
91
- relativePath = trimmed.slice(2);
92
- } else if (trimmed.startsWith(`${HOME_ROOT}/`)) {
93
- root = HOME_ROOT;
94
- relativePath = trimmed.slice(HOME_ROOT.length + 1);
95
- } else if (trimmed === VOLUMES_ROOT) {
96
- root = VOLUMES_ROOT;
97
- relativePath = "";
98
- } else if (trimmed.startsWith(`${VOLUMES_ROOT}/`)) {
99
- root = VOLUMES_ROOT;
100
- relativePath = trimmed.slice(VOLUMES_ROOT.length + 1);
101
- } else {
102
- throw new InputError("Path is outside the allowed repository roots");
103
- }
104
-
105
- const canonicalRoot = await realpath(root);
106
- const segments = relativePath
107
- .split("/")
108
- .filter(Boolean)
109
- .map((segment) => {
110
- if (!SAFE_SEGMENT_PATTERN.test(segment) || segment === "." || segment === "..") {
111
- throw new InputError("Invalid path segment");
112
- }
113
- return segment;
114
- });
115
-
116
- let currentPath = canonicalRoot;
117
-
118
- for (const segment of segments) {
119
- const candidatePath = expandHome(resolve(currentPath, segment));
120
- const candidateStat = await stat(candidatePath);
121
- if (!candidateStat.isDirectory()) {
122
- throw new InputError("Path must be a directory");
123
- }
124
-
125
- const canonicalCandidate = await realpath(candidatePath);
126
- ensureWithinRoot(canonicalRoot, canonicalCandidate);
127
- currentPath = canonicalCandidate;
128
- }
129
-
130
- return currentPath;
131
- }
132
-
133
- function dedupeAndSortBranches(branches: string[]): string[] {
134
- const normalized = branches
135
- .map((branch) => branch.trim())
136
- .filter((branch) => branch.length > 0)
137
- .map((branch) => branch.replace(/^origin\//, ""));
138
-
139
- return [...new Set(normalized)].sort((left, right) => left.localeCompare(right));
140
- }
141
-
142
- async function readRemoteDefaultBranch(gitUrl: string): Promise<string | null> {
143
- try {
144
- const { stdout } = await execFileAsync(
145
- "git",
146
- ["ls-remote", "--symref", "--", gitUrl, "HEAD"],
147
- { timeout: 30_000 },
148
- );
149
- const line = stdout
150
- .split("\n")
151
- .find((entry) => entry.startsWith("ref: refs/heads/"));
152
- if (!line) return null;
153
- const match = line.match(/^ref:\s+refs\/heads\/([^\s]+)\s+HEAD$/);
154
- return match?.[1] ?? null;
155
- } catch {
156
- return null;
157
- }
158
- }
159
-
160
- async function listRemoteBranches(gitUrl: string): Promise<{ branches: string[]; defaultBranch: string | null }> {
161
- const { stdout } = await execFileAsync(
162
- "git",
163
- ["ls-remote", "--heads", "--refs", "--", gitUrl],
164
- { timeout: 30_000 },
165
- );
166
-
167
- const branches = stdout
168
- .split("\n")
169
- .map((line) => line.trim())
170
- .filter((line) => line.length > 0)
171
- .map((line) => {
172
- const ref = line.split("\t")[1] ?? "";
173
- return ref.replace("refs/heads/", "");
174
- })
175
- .filter(Boolean);
176
-
177
- const defaultBranch = await readRemoteDefaultBranch(gitUrl);
178
- return {
179
- branches: dedupeAndSortBranches(branches),
180
- defaultBranch,
181
- };
182
- }
183
-
184
- async function listLocalBranches(path: string): Promise<{ branches: string[]; defaultBranch: string | null }> {
185
- const { stdout } = await execFileAsync(
186
- "git",
187
- ["for-each-ref", "--format=%(refname:short)", "refs/heads", "refs/remotes/origin"],
188
- { timeout: 20_000, cwd: path },
189
- );
190
-
191
- const defaultBranchRaw = await execFileAsync(
192
- "git",
193
- ["symbolic-ref", "--short", "refs/remotes/origin/HEAD"],
194
- { timeout: 20_000, cwd: path },
195
- ).then((result) => result.stdout.trim()).catch(() => "");
196
-
197
- const branches = stdout.split("\n").filter(Boolean);
198
- const defaultBranch = defaultBranchRaw.startsWith("origin/")
199
- ? defaultBranchRaw.slice("origin/".length)
200
- : null;
201
-
202
- return {
203
- branches: dedupeAndSortBranches(branches),
204
- defaultBranch,
205
- };
206
- }
207
-
208
- export async function GET(request: NextRequest) {
209
- const denied = await guardApiAccess(undefined, "viewer");
210
- if (denied) return denied;
211
-
212
- const gitUrl = asNonEmpty(request.nextUrl.searchParams.get("gitUrl"));
213
- const rawPath = asNonEmpty(request.nextUrl.searchParams.get("path"));
214
-
215
- if (!gitUrl && !rawPath) {
216
- return NextResponse.json({ error: "Provide either gitUrl or path" }, { status: 400 });
217
- }
218
-
219
- try {
220
- if (rawPath) {
221
- const path = await resolveLocalRepoPath(rawPath);
222
- const payload = await listLocalBranches(path);
223
- return NextResponse.json({ ...payload, source: "local" });
224
- }
225
-
226
- const payload = await listRemoteBranches(normalizeGitRemote(gitUrl!));
227
- return NextResponse.json({ ...payload, source: "remote" });
228
- } catch (err) {
229
- const message = err instanceof Error ? err.message : "Failed to load branches";
230
- const status = err instanceof InputError ? 400 : 500;
231
- return NextResponse.json({ error: message }, { status });
232
- }
233
- }
5
+ export const GET = guardedProxyRoute("/api/workspaces/branches", { role: "viewer" });