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,201 +1,5 @@
1
- import { NextResponse } from "next/server";
2
- import { existsSync, type Dirent } from "node:fs";
3
- import { readdir, stat } from "node:fs/promises";
4
- import { homedir } from "node:os";
5
- import { dirname, join, resolve, sep } from "node:path";
6
- import type { OrchestratorConfig } from "@conductor-oss/core";
7
- import { guardApiAccess } from "@/lib/auth";
8
- import { getServices } from "@/lib/services";
1
+ import { guardedProxyRoute } from "@/lib/proxyRoutes";
9
2
 
10
3
  export const dynamic = "force-dynamic";
11
4
 
12
- const MAX_FILES = 300;
13
- const MAX_DEPTH = 4;
14
-
15
- const IMAGE_EXTENSIONS = new Set([
16
- ".png", ".jpg", ".jpeg", ".gif", ".webp", ".svg", ".bmp", ".ico", ".tiff",
17
- ]);
18
-
19
- const CONTEXT_EXTENSIONS = new Set([
20
- ".md", ".mdx", ".txt", ".rtf", ".csv", ".tsv",
21
- ".json", ".jsonl", ".yaml", ".yml", ".toml", ".ini",
22
- ".js", ".jsx", ".ts", ".tsx", ".mjs", ".cjs", ".py", ".rb", ".go", ".rs",
23
- ".java", ".kt", ".swift", ".c", ".cc", ".cpp", ".h", ".hpp",
24
- ".css", ".scss", ".html", ".sql", ".sh", ".bash", ".zsh",
25
- ".pdf",
26
- ".png", ".jpg", ".jpeg", ".gif", ".webp", ".svg", ".bmp", ".ico", ".tiff",
27
- ]);
28
-
29
- function asNonEmptyString(value: unknown): string | null {
30
- if (typeof value !== "string") return null;
31
- const trimmed = value.trim();
32
- return trimmed.length > 0 ? trimmed : null;
33
- }
34
-
35
- function expandHome(value: string): string {
36
- if (value.startsWith("~/")) {
37
- return resolve(homedir(), value.slice(2));
38
- }
39
- return resolve(value);
40
- }
41
-
42
- function resolveWorkspacePath(config: OrchestratorConfig): string {
43
- if (process.env["CONDUCTOR_WORKSPACE"]?.trim()) {
44
- return expandHome(process.env["CONDUCTOR_WORKSPACE"]);
45
- }
46
- if (config.configPath) {
47
- return dirname(config.configPath);
48
- }
49
- return resolve(process.cwd());
50
- }
51
-
52
- function lastPathSegment(value: string): string {
53
- const normalized = value.replaceAll("\\", "/");
54
- const segments = normalized.split("/").filter(Boolean);
55
- return segments[segments.length - 1] ?? "";
56
- }
57
-
58
- function extensionOf(path: string): string {
59
- const index = path.lastIndexOf(".");
60
- if (index < 0) return "";
61
- return path.slice(index).toLowerCase();
62
- }
63
-
64
- function isAllowedContextFile(path: string): boolean {
65
- const ext = extensionOf(path);
66
- return CONTEXT_EXTENSIONS.has(ext);
67
- }
68
-
69
- function isImageFile(path: string): boolean {
70
- const ext = extensionOf(path);
71
- return IMAGE_EXTENSIONS.has(ext);
72
- }
73
-
74
- function toWorkspaceRelative(workspaceRoot: string, path: string): string | null {
75
- const resolvedWorkspace = resolve(workspaceRoot);
76
- const resolvedPath = resolve(path);
77
- const workspacePrefix = resolvedWorkspace.endsWith(sep)
78
- ? resolvedWorkspace
79
- : `${resolvedWorkspace}${sep}`;
80
- if (resolvedPath !== resolvedWorkspace && !resolvedPath.startsWith(workspacePrefix)) {
81
- return null;
82
- }
83
- return resolvedPath.slice(resolvedWorkspace.length).replace(/^[/\\]+/, "").replaceAll("\\", "/");
84
- }
85
-
86
- type ContextFileEntry = {
87
- path: string;
88
- name: string;
89
- kind: "image" | "file";
90
- source: string;
91
- sizeBytes: number | null;
92
- };
93
-
94
- async function collectContextFiles(params: {
95
- workspaceRoot: string;
96
- rootPath: string;
97
- source: string;
98
- seen: Set<string>;
99
- files: ContextFileEntry[];
100
- }): Promise<void> {
101
- if (!existsSync(params.rootPath)) return;
102
- const queue: Array<{ dir: string; depth: number }> = [{ dir: params.rootPath, depth: 0 }];
103
-
104
- while (queue.length > 0 && params.files.length < MAX_FILES) {
105
- const current = queue.shift();
106
- if (!current) break;
107
-
108
- let entries: Dirent[];
109
- try {
110
- entries = await readdir(current.dir, { withFileTypes: true, encoding: "utf8" }) as Dirent[];
111
- } catch {
112
- continue;
113
- }
114
-
115
- entries.sort((a, b) => String(a.name).localeCompare(String(b.name)));
116
- for (const entry of entries) {
117
- if (params.files.length >= MAX_FILES) break;
118
- const entryName = String(entry.name);
119
- if (entryName.startsWith(".")) continue;
120
- const fullPath = join(current.dir, entryName);
121
-
122
- if (entry.isDirectory()) {
123
- if (current.depth < MAX_DEPTH) {
124
- queue.push({ dir: fullPath, depth: current.depth + 1 });
125
- }
126
- continue;
127
- }
128
-
129
- if (!entry.isFile()) continue;
130
- const relativePath = toWorkspaceRelative(params.workspaceRoot, fullPath);
131
- if (!relativePath) continue;
132
- if (!isAllowedContextFile(relativePath)) continue;
133
- if (params.seen.has(relativePath)) continue;
134
-
135
- params.seen.add(relativePath);
136
- const fileStat = await stat(fullPath).catch(() => null);
137
- params.files.push({
138
- path: relativePath,
139
- name: entryName,
140
- kind: isImageFile(relativePath) ? "image" : "file",
141
- source: params.source,
142
- sizeBytes: fileStat?.size ?? null,
143
- });
144
- }
145
- }
146
- }
147
-
148
- /** GET /api/context-files?projectId=<id> -- List likely context/attachment files for task composer. */
149
- export async function GET(request: Request) {
150
- const denied = await guardApiAccess(undefined, "viewer");
151
- if (denied) return denied;
152
-
153
- try {
154
- const { config } = await getServices();
155
- const workspaceRoot = resolveWorkspacePath(config);
156
- const url = new URL(request.url);
157
- const projectId = asNonEmptyString(url.searchParams.get("projectId"));
158
-
159
- if (projectId && !config.projects[projectId]) {
160
- return NextResponse.json({ error: `Unknown project: ${projectId}` }, { status: 404 });
161
- }
162
-
163
- const roots: Array<{ path: string; source: string }> = [
164
- { path: resolve(workspaceRoot, "attachments"), source: "workspace/attachments" },
165
- { path: resolve(workspaceRoot, "context"), source: "workspace/context" },
166
- ];
167
-
168
- if (projectId) {
169
- const project = config.projects[projectId];
170
- const boardDir = lastPathSegment(project.boardDir ?? projectId) || projectId;
171
- roots.push({ path: resolve(workspaceRoot, "projects", boardDir, "attachments"), source: `projects/${boardDir}/attachments` });
172
- roots.push({ path: resolve(workspaceRoot, "projects", boardDir, "context"), source: `projects/${boardDir}/context` });
173
- roots.push({ path: resolve(workspaceRoot, boardDir, "attachments"), source: `${boardDir}/attachments` });
174
- roots.push({ path: resolve(workspaceRoot, boardDir, "context"), source: `${boardDir}/context` });
175
- }
176
-
177
- const files: ContextFileEntry[] = [];
178
- const seen = new Set<string>();
179
-
180
- for (const root of roots) {
181
- await collectContextFiles({
182
- workspaceRoot,
183
- rootPath: root.path,
184
- source: root.source,
185
- seen,
186
- files,
187
- });
188
- if (files.length >= MAX_FILES) break;
189
- }
190
-
191
- return NextResponse.json({
192
- workspacePath: workspaceRoot,
193
- files,
194
- });
195
- } catch (err) {
196
- return NextResponse.json(
197
- { error: err instanceof Error ? err.message : "Failed to list context files" },
198
- { status: 500 },
199
- );
200
- }
201
- }
5
+ export const GET = guardedProxyRoute("/api/context-files", { role: "viewer" });
@@ -1,125 +1,5 @@
1
- import { getServices } from "@/lib/services";
2
- import { guardApiAccess } from "@/lib/auth";
3
- import { sessionToDashboard } from "@/lib/serialize";
4
- import { getAttentionLevel } from "@/lib/types";
1
+ import { guardedProxyRoute } from "@/lib/proxyRoutes";
5
2
 
6
3
  export const dynamic = "force-dynamic";
7
4
 
8
- /**
9
- * GET /api/events -- SSE stream for real-time session updates.
10
- *
11
- * Polls SessionManager.list() every 5 seconds, sends compact snapshots.
12
- * Heartbeat every 15 seconds to keep the connection alive.
13
- *
14
- * Fixes applied:
15
- * - Respects request.signal for abort handling (prevents interval leaks)
16
- * - inFlight guard prevents overlapping poll promises
17
- * - Closed flag prevents enqueue-after-close errors
18
- */
19
- export async function GET(request: Request): Promise<Response> {
20
- const denied = await guardApiAccess(request, "viewer");
21
- if (denied) return denied;
22
-
23
- const encoder = new TextEncoder();
24
- let heartbeat: ReturnType<typeof setInterval> | undefined;
25
- let updates: ReturnType<typeof setInterval> | undefined;
26
- let closed = false;
27
- let inFlight = false;
28
-
29
- function cleanup(): void {
30
- closed = true;
31
- clearInterval(heartbeat);
32
- clearInterval(updates);
33
- }
34
-
35
- function safeSend(controller: ReadableStreamDefaultController, chunk: string): boolean {
36
- if (closed) return false;
37
- try {
38
- controller.enqueue(encoder.encode(chunk));
39
- return true;
40
- } catch {
41
- cleanup();
42
- return false;
43
- }
44
- }
45
-
46
- function buildSnapshotPayload(sessions: ReturnType<typeof sessionToDashboard>[]): string {
47
- const event = {
48
- type: "snapshot",
49
- sessions: sessions.map((s) => ({
50
- id: s.id,
51
- status: s.status,
52
- activity: s.activity,
53
- attentionLevel: getAttentionLevel(s),
54
- projectId: s.projectId,
55
- issueId: s.issueId,
56
- branch: s.branch,
57
- createdAt: s.createdAt,
58
- lastActivityAt: s.lastActivityAt,
59
- metadata: s.metadata,
60
- summary: s.summary,
61
- pr: s.pr,
62
- })),
63
- };
64
- return `data: ${JSON.stringify(event)}\n\n`;
65
- }
66
-
67
- const stream = new ReadableStream({
68
- start(controller) {
69
- // Abort when client disconnects
70
- request.signal.addEventListener("abort", () => {
71
- cleanup();
72
- try { controller.close(); } catch { /* already closed */ }
73
- });
74
-
75
- // Send initial snapshot
76
- void (async () => {
77
- try {
78
- const { sessionManager } = await getServices();
79
- const sessions = await sessionManager.list();
80
- const dashboardSessions = sessions.map(sessionToDashboard);
81
- safeSend(controller, buildSnapshotPayload(dashboardSessions));
82
- } catch {
83
- safeSend(controller, `data: ${JSON.stringify({ type: "snapshot", sessions: [] })}\n\n`);
84
- }
85
- })();
86
-
87
- // Heartbeat every 15s
88
- heartbeat = setInterval(() => {
89
- if (!safeSend(controller, `: heartbeat\n\n`)) {
90
- cleanup();
91
- }
92
- }, 15_000);
93
-
94
- // Poll for state changes every 5s (with inFlight guard)
95
- updates = setInterval(() => {
96
- if (closed || inFlight) return;
97
- inFlight = true;
98
- void (async () => {
99
- try {
100
- const { sessionManager } = await getServices();
101
- const sessions = await sessionManager.list();
102
- const dashboardSessions = sessions.map(sessionToDashboard);
103
- safeSend(controller, buildSnapshotPayload(dashboardSessions));
104
- } catch {
105
- // Skip this poll, retry next interval
106
- } finally {
107
- inFlight = false;
108
- }
109
- })();
110
- }, 3_000);
111
- },
112
- cancel() {
113
- cleanup();
114
- },
115
- });
116
-
117
- return new Response(stream, {
118
- headers: {
119
- "Content-Type": "text/event-stream",
120
- "Cache-Control": "no-cache",
121
- Connection: "keep-alive",
122
- "X-Accel-Buffering": "no",
123
- },
124
- });
125
- }
5
+ export const GET = guardedProxyRoute("/api/events", { role: "viewer" });
@@ -0,0 +1,5 @@
1
+ import { guardedProxyRoute } from "@/lib/proxyRoutes";
2
+
3
+ export const dynamic = "force-dynamic";
4
+
5
+ export const GET = guardedProxyRoute("/api/executor/health", { role: "viewer" });
@@ -1,145 +1,5 @@
1
- import { NextRequest, NextResponse } from "next/server";
2
- import { readdir, realpath, stat } from "node:fs/promises";
3
- import { homedir } from "node:os";
4
- import { isAbsolute, relative, resolve } from "node:path";
5
- import { guardApiAccess } from "@/lib/auth";
1
+ import { guardedProxyRoute } from "@/lib/proxyRoutes";
6
2
 
7
3
  export const dynamic = "force-dynamic";
8
4
 
9
- const HOME_ROOT = homedir();
10
- const VOLUMES_ROOT = "/Volumes";
11
- const SAFE_SEGMENT_PATTERN = /^[^/\\\0\r\n]+$/;
12
-
13
- type DirectoryEntry = {
14
- name: string;
15
- path: string;
16
- isDirectory: boolean;
17
- isGitRepo: boolean;
18
- };
19
-
20
- class InputError extends Error {}
21
-
22
- function ensureWithinRoot(root: string, candidatePath: string) {
23
- const rel = relative(root, candidatePath);
24
- if (rel !== "" && (rel.startsWith("..") || isAbsolute(rel))) {
25
- throw new InputError("Path is outside the allowed browse roots");
26
- }
27
- }
28
-
29
- function resolveRootSelection(rawPath: string | null): { root: string; relativePath: string } {
30
- if (!rawPath || rawPath.trim().length === 0) {
31
- return { root: HOME_ROOT, relativePath: "" };
32
- }
33
-
34
- const trimmed = rawPath.trim();
35
- if (/[\0\r\n]/.test(trimmed)) {
36
- throw new InputError("Invalid path");
37
- }
38
-
39
- if (trimmed === "~" || trimmed === HOME_ROOT) {
40
- return { root: HOME_ROOT, relativePath: "" };
41
- }
42
-
43
- if (trimmed.startsWith("~/")) {
44
- return { root: HOME_ROOT, relativePath: trimmed.slice(2) };
45
- }
46
-
47
- if (trimmed.startsWith(`${HOME_ROOT}/`)) {
48
- return { root: HOME_ROOT, relativePath: trimmed.slice(HOME_ROOT.length + 1) };
49
- }
50
-
51
- if (trimmed === VOLUMES_ROOT) {
52
- return { root: VOLUMES_ROOT, relativePath: "" };
53
- }
54
-
55
- if (trimmed.startsWith(`${VOLUMES_ROOT}/`)) {
56
- return { root: VOLUMES_ROOT, relativePath: trimmed.slice(VOLUMES_ROOT.length + 1) };
57
- }
58
-
59
- throw new InputError("Path is outside the allowed browse roots");
60
- }
61
-
62
- function parseSafeSegments(relativePath: string): string[] {
63
- return relativePath
64
- .split("/")
65
- .filter(Boolean)
66
- .map((segment) => {
67
- if (!SAFE_SEGMENT_PATTERN.test(segment) || segment === "." || segment === "..") {
68
- throw new InputError("Invalid path segment");
69
- }
70
- return segment;
71
- });
72
- }
73
-
74
- async function resolveRequestedPath(rawPath: string | null): Promise<string> {
75
- const { root, relativePath } = resolveRootSelection(rawPath);
76
- const canonicalRoot = await realpath(root);
77
- const segments = parseSafeSegments(relativePath);
78
-
79
- let currentPath = canonicalRoot;
80
-
81
- for (const segment of segments) {
82
- const candidatePath = resolve(currentPath, segment);
83
- const candidateStat = await stat(candidatePath);
84
- if (!candidateStat.isDirectory()) {
85
- throw new InputError("Path must be a directory");
86
- }
87
-
88
- const canonicalCandidate = await realpath(candidatePath);
89
- ensureWithinRoot(canonicalRoot, canonicalCandidate);
90
- currentPath = canonicalCandidate;
91
- }
92
-
93
- return currentPath;
94
- }
95
-
96
- async function isGitRepo(path: string): Promise<boolean> {
97
- try {
98
- const gitStat = await stat(resolve(path, ".git"));
99
- return gitStat.isDirectory();
100
- } catch {
101
- return false;
102
- }
103
- }
104
-
105
- export async function GET(request: NextRequest) {
106
- const denied = await guardApiAccess(request, "operator");
107
- if (denied) return denied;
108
-
109
- const rawPath = request.nextUrl.searchParams.get("path");
110
-
111
- try {
112
- const currentPath = await resolveRequestedPath(rawPath);
113
- const dirEntries = await readdir(currentPath, { withFileTypes: true });
114
-
115
- const entries = await Promise.all(
116
- dirEntries
117
- .filter((entry) => entry.isDirectory() && !entry.name.startsWith("."))
118
- .map(async (entry): Promise<DirectoryEntry> => {
119
- const entryPath = resolve(currentPath, entry.name);
120
- return {
121
- name: entry.name,
122
- path: entryPath,
123
- isDirectory: true,
124
- isGitRepo: await isGitRepo(entryPath),
125
- };
126
- }),
127
- );
128
-
129
- entries.sort((left, right) => {
130
- if (left.isDirectory !== right.isDirectory) {
131
- return left.isDirectory ? -1 : 1;
132
- }
133
- return left.name.localeCompare(right.name);
134
- });
135
-
136
- return NextResponse.json({
137
- currentPath,
138
- entries,
139
- });
140
- } catch (err) {
141
- const message = err instanceof Error ? err.message : "Failed to list directory";
142
- const status = err instanceof InputError ? 400 : 500;
143
- return NextResponse.json({ error: message }, { status });
144
- }
145
- }
5
+ export const GET = guardedProxyRoute("/api/filesystem/directory", { role: "operator" });
@@ -0,0 +1,5 @@
1
+ import { guardedProxyRoute } from "@/lib/proxyRoutes";
2
+
3
+ export const dynamic = "force-dynamic";
4
+
5
+ export const POST = guardedProxyRoute("/api/filesystem/pick-directory", { role: "operator" });
@@ -1,106 +1,5 @@
1
- import { NextRequest, NextResponse } from "next/server";
2
- import { promisify } from "node:util";
3
- import { execFile } from "node:child_process";
4
- import { guardApiAccess } from "@/lib/auth";
5
-
6
- const execFileAsync = promisify(execFile);
1
+ import { guardedProxyRoute } from "@/lib/proxyRoutes";
7
2
 
8
3
  export const dynamic = "force-dynamic";
9
4
 
10
- type GitHubRepo = {
11
- name: string;
12
- fullName: string;
13
- httpsUrl: string;
14
- sshUrl: string;
15
- defaultBranch: string;
16
- private: boolean;
17
- };
18
-
19
- type GhRepoListItem = {
20
- nameWithOwner?: string;
21
- url?: string;
22
- sshUrl?: string;
23
- isPrivate?: boolean;
24
- defaultBranchRef?: {
25
- name?: string;
26
- } | null;
27
- };
28
-
29
- async function assertGhAuthenticated(): Promise<void> {
30
- try {
31
- await execFileAsync("gh", ["auth", "status"], {
32
- timeout: 20_000,
33
- env: {
34
- ...process.env,
35
- GH_PAGER: "cat",
36
- },
37
- });
38
- } catch (err) {
39
- if (typeof err === "object" && err !== null && "code" in err && err.code === "ENOENT") {
40
- throw new Error("GitHub CLI is not installed. Install `gh` and run `gh auth login`.");
41
- }
42
- throw new Error("GitHub CLI is not authenticated. Run `gh auth login` first.");
43
- }
44
- }
45
-
46
- export async function GET(request: NextRequest) {
47
- const denied = await guardApiAccess(undefined, "operator");
48
- if (denied) return denied;
49
-
50
- const query = request.nextUrl.searchParams.get("q")?.trim().toLowerCase() ?? "";
51
-
52
- try {
53
- await assertGhAuthenticated();
54
-
55
- const { stdout } = await execFileAsync(
56
- "gh",
57
- [
58
- "repo",
59
- "list",
60
- "--limit",
61
- "200",
62
- "--json",
63
- "nameWithOwner,url,sshUrl,isPrivate,defaultBranchRef",
64
- ],
65
- {
66
- timeout: 30_000,
67
- env: {
68
- ...process.env,
69
- GH_PAGER: "cat",
70
- },
71
- },
72
- );
73
-
74
- const parsed = JSON.parse(stdout) as GhRepoListItem[];
75
- let repos: GitHubRepo[] = parsed
76
- .filter((item) => !!item.nameWithOwner)
77
- .map((item) => {
78
- const fullName = item.nameWithOwner ?? "";
79
- const name = fullName.split("/").pop() ?? fullName;
80
- const httpsUrl = item.url ? `${item.url}.git` : `https://github.com/${fullName}.git`;
81
- return {
82
- name,
83
- fullName,
84
- httpsUrl,
85
- sshUrl: item.sshUrl ?? `git@github.com:${fullName}.git`,
86
- defaultBranch: item.defaultBranchRef?.name ?? "main",
87
- private: item.isPrivate === true,
88
- };
89
- });
90
-
91
- if (query.length > 0) {
92
- repos = repos.filter((repo) => {
93
- return repo.fullName.toLowerCase().includes(query)
94
- || repo.name.toLowerCase().includes(query)
95
- || repo.defaultBranch.toLowerCase().includes(query);
96
- });
97
- }
98
-
99
- repos.sort((left, right) => left.fullName.localeCompare(right.fullName));
100
-
101
- return NextResponse.json({ repos });
102
- } catch (err) {
103
- const message = err instanceof Error ? err.message : "Failed to list GitHub repositories";
104
- return NextResponse.json({ error: message }, { status: 500 });
105
- }
106
- }
5
+ export const GET = guardedProxyRoute("/api/github/repos", { role: "operator" });
@@ -1,72 +1,5 @@
1
- import { readFileSync, existsSync } from "node:fs";
2
- import { NextResponse } from "next/server";
3
- import { getServices } from "@/lib/services";
4
- import { guardApiAccess } from "@/lib/auth";
1
+ import { guardedProxyRoute } from "@/lib/proxyRoutes";
5
2
 
6
3
  export const dynamic = "force-dynamic";
7
4
 
8
- /** GET /api/health/boards -- watcher board parse/health snapshot. */
9
- export async function GET() {
10
- const denied = await guardApiAccess(undefined, "viewer");
11
- if (denied) return denied;
12
-
13
- try {
14
- const { config } = await getServices();
15
- const coreModule = await import("@conductor-oss/core");
16
- const core = coreModule as Record<string, unknown>;
17
- const discoverBoards = core["discoverBoards"] as
18
- | ((workspacePath: string, boardPathsOrConfig?: unknown) => string[])
19
- | undefined;
20
- const resolveBoardAliasesForPath = core["resolveBoardAliasesForPath"] as
21
- | ((cfg: unknown, workspacePath: string, boardPath: string) => Record<string, string[]>)
22
- | undefined;
23
- const parseBoardStatus = core["parseBoardStatus"] as
24
- | ((boardPath: string, content: string, aliases: Record<string, string[]>, projectIds: Set<string>) => Record<string, unknown>)
25
- | undefined;
26
- const readRecentWatcherActions = core["readRecentWatcherActions"] as
27
- | ((workspacePath: string, limit?: number) => unknown[])
28
- | undefined;
29
- const defaultAliasMapping = core["defaultAliasMapping"] as (() => Record<string, string[]>) | undefined;
30
- if (!discoverBoards || !parseBoardStatus || !readRecentWatcherActions) {
31
- throw new Error("Core diagnostics helpers are unavailable. Run pnpm build.");
32
- }
33
- const workspace =
34
- process.env["CONDUCTOR_WORKSPACE"] ?? `${process.env["HOME"]}/.conductor/workspace`;
35
-
36
- const boardPatternsOrConfig = config.boards?.length ? config.boards : config;
37
- const watchedBoards = discoverBoards(workspace, boardPatternsOrConfig);
38
- const projectIds = new Set(Object.keys(config.projects));
39
-
40
- const boards = watchedBoards.map((boardPath) => {
41
- const aliases = resolveBoardAliasesForPath
42
- ? resolveBoardAliasesForPath(config, workspace, boardPath)
43
- : (defaultAliasMapping ? defaultAliasMapping() : {});
44
- if (!existsSync(boardPath)) {
45
- return {
46
- boardPath,
47
- exists: false,
48
- parseOk: false,
49
- errors: ["Board file does not exist"],
50
- aliases,
51
- };
52
- }
53
- const content = readFileSync(boardPath, "utf-8");
54
- const status = parseBoardStatus(boardPath, content, aliases, projectIds);
55
- return { ...status, aliases };
56
- });
57
-
58
- const recentActions = readRecentWatcherActions(workspace, 20);
59
-
60
- return NextResponse.json({
61
- workspace,
62
- watchedBoards,
63
- boards,
64
- recentActions,
65
- });
66
- } catch (err) {
67
- return NextResponse.json(
68
- { error: err instanceof Error ? err.message : "Failed to build board health" },
69
- { status: 500 },
70
- );
71
- }
72
- }
5
+ export const GET = guardedProxyRoute("/api/health/boards", { role: "viewer" });