conductor-oss 0.2.4 → 0.2.6

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 (502) hide show
  1. package/README.md +29 -6
  2. package/dist/commands/init.d.ts +2 -0
  3. package/dist/commands/init.d.ts.map +1 -1
  4. package/dist/commands/init.js +3 -0
  5. package/dist/commands/init.js.map +1 -1
  6. package/dist/commands/setup.d.ts +30 -0
  7. package/dist/commands/setup.d.ts.map +1 -1
  8. package/dist/commands/setup.js +131 -29
  9. package/dist/commands/setup.js.map +1 -1
  10. package/dist/commands/start.d.ts +3 -0
  11. package/dist/commands/start.d.ts.map +1 -1
  12. package/dist/commands/start.js +209 -15
  13. package/dist/commands/start.js.map +1 -1
  14. package/dist/index.js +1 -1
  15. package/node_modules/@conductor-oss/core/dist/board-diagnostics.d.ts.map +1 -1
  16. package/node_modules/@conductor-oss/core/dist/board-diagnostics.js +12 -2
  17. package/node_modules/@conductor-oss/core/dist/board-diagnostics.js.map +1 -1
  18. package/node_modules/@conductor-oss/core/dist/board-watcher.d.ts.map +1 -1
  19. package/node_modules/@conductor-oss/core/dist/board-watcher.js +18 -5
  20. package/node_modules/@conductor-oss/core/dist/board-watcher.js.map +1 -1
  21. package/node_modules/@conductor-oss/core/dist/config.d.ts +1 -1
  22. package/node_modules/@conductor-oss/core/dist/config.d.ts.map +1 -1
  23. package/node_modules/@conductor-oss/core/dist/config.js +36 -1
  24. package/node_modules/@conductor-oss/core/dist/config.js.map +1 -1
  25. package/node_modules/@conductor-oss/core/dist/index.d.ts +1 -0
  26. package/node_modules/@conductor-oss/core/dist/index.d.ts.map +1 -1
  27. package/node_modules/@conductor-oss/core/dist/index.js +1 -0
  28. package/node_modules/@conductor-oss/core/dist/index.js.map +1 -1
  29. package/node_modules/@conductor-oss/core/dist/project-paths.d.ts +2 -0
  30. package/node_modules/@conductor-oss/core/dist/project-paths.d.ts.map +1 -0
  31. package/node_modules/@conductor-oss/core/dist/project-paths.js +67 -0
  32. package/node_modules/@conductor-oss/core/dist/project-paths.js.map +1 -0
  33. package/node_modules/@conductor-oss/core/dist/scaffold.d.ts +14 -0
  34. package/node_modules/@conductor-oss/core/dist/scaffold.d.ts.map +1 -1
  35. package/node_modules/@conductor-oss/core/dist/scaffold.js +27 -4
  36. package/node_modules/@conductor-oss/core/dist/scaffold.js.map +1 -1
  37. package/node_modules/@conductor-oss/core/dist/types.d.ts +71 -0
  38. package/node_modules/@conductor-oss/core/dist/types.d.ts.map +1 -1
  39. package/node_modules/@conductor-oss/core/dist/types.js +244 -0
  40. package/node_modules/@conductor-oss/core/dist/types.js.map +1 -1
  41. package/node_modules/@conductor-oss/core/package.json +1 -1
  42. package/node_modules/@conductor-oss/plugin-agent-amp/dist/index.js +1 -1
  43. package/node_modules/@conductor-oss/plugin-agent-amp/package.json +2 -2
  44. package/node_modules/@conductor-oss/plugin-agent-ccr/dist/index.js +1 -1
  45. package/node_modules/@conductor-oss/plugin-agent-ccr/package.json +2 -2
  46. package/node_modules/@conductor-oss/plugin-agent-claude-code/dist/index.js +1 -1
  47. package/node_modules/@conductor-oss/plugin-agent-claude-code/package.json +2 -2
  48. package/node_modules/@conductor-oss/plugin-agent-codex/dist/index.js +1 -1
  49. package/node_modules/@conductor-oss/plugin-agent-codex/package.json +2 -2
  50. package/node_modules/@conductor-oss/plugin-agent-cursor-cli/dist/index.js +1 -1
  51. package/node_modules/@conductor-oss/plugin-agent-cursor-cli/package.json +2 -2
  52. package/node_modules/@conductor-oss/plugin-agent-droid/dist/index.js +1 -1
  53. package/node_modules/@conductor-oss/plugin-agent-droid/package.json +2 -2
  54. package/node_modules/@conductor-oss/plugin-agent-gemini/dist/index.js +1 -1
  55. package/node_modules/@conductor-oss/plugin-agent-gemini/package.json +2 -2
  56. package/node_modules/@conductor-oss/plugin-agent-github-copilot/dist/index.js +1 -1
  57. package/node_modules/@conductor-oss/plugin-agent-github-copilot/package.json +2 -2
  58. package/node_modules/@conductor-oss/plugin-agent-opencode/dist/index.js +1 -1
  59. package/node_modules/@conductor-oss/plugin-agent-opencode/package.json +2 -2
  60. package/node_modules/@conductor-oss/plugin-agent-qwen-code/dist/index.js +10 -6
  61. package/node_modules/@conductor-oss/plugin-agent-qwen-code/package.json +2 -2
  62. package/node_modules/@conductor-oss/plugin-mcp-server/dist/index.js +1 -1
  63. package/node_modules/@conductor-oss/plugin-mcp-server/package.json +2 -2
  64. package/node_modules/@conductor-oss/plugin-notifier-desktop/dist/index.js +1 -1
  65. package/node_modules/@conductor-oss/plugin-notifier-desktop/package.json +2 -2
  66. package/node_modules/@conductor-oss/plugin-notifier-discord/dist/index.js +1 -1
  67. package/node_modules/@conductor-oss/plugin-notifier-discord/package.json +2 -2
  68. package/node_modules/@conductor-oss/plugin-runtime-tmux/dist/index.js +1 -1
  69. package/node_modules/@conductor-oss/plugin-runtime-tmux/package.json +2 -2
  70. package/node_modules/@conductor-oss/plugin-scm-github/dist/index.js +1 -1
  71. package/node_modules/@conductor-oss/plugin-scm-github/package.json +2 -2
  72. package/node_modules/@conductor-oss/plugin-terminal-web/dist/index.js +1 -1
  73. package/node_modules/@conductor-oss/plugin-terminal-web/package.json +2 -2
  74. package/node_modules/@conductor-oss/plugin-tracker-github/dist/index.js +1 -1
  75. package/node_modules/@conductor-oss/plugin-tracker-github/package.json +2 -2
  76. package/node_modules/@conductor-oss/plugin-webhook/package.json +2 -2
  77. package/node_modules/@conductor-oss/plugin-workspace-worktree/dist/index.js +1 -1
  78. package/node_modules/@conductor-oss/plugin-workspace-worktree/package.json +2 -2
  79. package/package.json +22 -21
  80. package/web/.next/standalone/packages/web/.next/BUILD_ID +1 -1
  81. package/web/.next/standalone/packages/web/.next/app-path-routes-manifest.json +5 -1
  82. package/web/.next/standalone/packages/web/.next/build-manifest.json +4 -4
  83. package/web/.next/standalone/packages/web/.next/routes-manifest.json +24 -0
  84. package/web/.next/standalone/packages/web/.next/server/app/_global-error/page/build-manifest.json +2 -2
  85. package/web/.next/standalone/packages/web/.next/server/app/_global-error/page.js.nft.json +1 -1
  86. package/web/.next/standalone/packages/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  87. package/web/.next/standalone/packages/web/.next/server/app/_global-error.html +2 -2
  88. package/web/.next/standalone/packages/web/.next/server/app/_global-error.rsc +1 -1
  89. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  90. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  91. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  92. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  93. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  94. package/web/.next/standalone/packages/web/.next/server/app/_not-found/page/build-manifest.json +2 -2
  95. package/web/.next/standalone/packages/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  96. package/web/.next/standalone/packages/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  97. package/web/.next/standalone/packages/web/.next/server/app/_not-found.html +1 -1
  98. package/web/.next/standalone/packages/web/.next/server/app/_not-found.rsc +9 -9
  99. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_full.segment.rsc +9 -9
  100. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_head.segment.rsc +3 -3
  101. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_index.segment.rsc +5 -5
  102. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  103. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  104. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  105. package/web/.next/standalone/packages/web/.next/server/app/api/access/route/app-paths-manifest.json +3 -0
  106. package/web/.next/standalone/packages/web/.next/server/app/api/access/route/build-manifest.json +11 -0
  107. package/web/.next/standalone/packages/web/.next/server/app/api/access/route/server-reference-manifest.json +4 -0
  108. package/web/.next/standalone/packages/web/.next/server/app/api/access/route.js +11 -0
  109. package/web/.next/standalone/packages/web/.next/server/app/api/access/route.js.map +5 -0
  110. package/web/.next/standalone/packages/web/.next/server/app/api/access/route.js.nft.json +1 -0
  111. package/web/.next/standalone/packages/web/.next/server/app/api/access/route_client-reference-manifest.js +2 -0
  112. package/web/.next/standalone/packages/web/.next/server/app/api/agents/route.js +5 -3
  113. package/web/.next/standalone/packages/web/.next/server/app/api/agents/route.js.nft.json +1 -1
  114. package/web/.next/standalone/packages/web/.next/server/app/api/attachments/route.js +4 -2
  115. package/web/.next/standalone/packages/web/.next/server/app/api/attachments/route.js.nft.json +1 -1
  116. package/web/.next/standalone/packages/web/.next/server/app/api/auth/session/route/app-paths-manifest.json +3 -0
  117. package/web/.next/standalone/packages/web/.next/server/app/api/auth/session/route/build-manifest.json +11 -0
  118. package/web/.next/standalone/packages/web/.next/server/app/api/auth/session/route/server-reference-manifest.json +4 -0
  119. package/web/.next/standalone/packages/web/.next/server/app/api/auth/session/route.js +8 -0
  120. package/web/.next/standalone/packages/web/.next/server/app/api/auth/session/route.js.map +5 -0
  121. package/web/.next/standalone/packages/web/.next/server/app/api/auth/session/route.js.nft.json +1 -0
  122. package/web/.next/standalone/packages/web/.next/server/app/api/auth/session/route_client-reference-manifest.js +2 -0
  123. package/web/.next/standalone/packages/web/.next/server/app/api/boards/route.js +5 -3
  124. package/web/.next/standalone/packages/web/.next/server/app/api/boards/route.js.nft.json +1 -1
  125. package/web/.next/standalone/packages/web/.next/server/app/api/config/route.js +4 -2
  126. package/web/.next/standalone/packages/web/.next/server/app/api/config/route.js.nft.json +1 -1
  127. package/web/.next/standalone/packages/web/.next/server/app/api/context-files/route.js +3 -1
  128. package/web/.next/standalone/packages/web/.next/server/app/api/context-files/route.js.nft.json +1 -1
  129. package/web/.next/standalone/packages/web/.next/server/app/api/events/route.js +4 -2
  130. package/web/.next/standalone/packages/web/.next/server/app/api/events/route.js.nft.json +1 -1
  131. package/web/.next/standalone/packages/web/.next/server/app/api/filesystem/directory/route.js +3 -1
  132. package/web/.next/standalone/packages/web/.next/server/app/api/filesystem/directory/route.js.nft.json +1 -1
  133. package/web/.next/standalone/packages/web/.next/server/app/api/github/repos/route.js +4 -2
  134. package/web/.next/standalone/packages/web/.next/server/app/api/github/repos/route.js.nft.json +1 -1
  135. package/web/.next/standalone/packages/web/.next/server/app/api/health/boards/route.js +3 -1
  136. package/web/.next/standalone/packages/web/.next/server/app/api/health/boards/route.js.nft.json +1 -1
  137. package/web/.next/standalone/packages/web/.next/server/app/api/preferences/route.js +5 -3
  138. package/web/.next/standalone/packages/web/.next/server/app/api/preferences/route.js.nft.json +1 -1
  139. package/web/.next/standalone/packages/web/.next/server/app/api/repositories/route.js +5 -3
  140. package/web/.next/standalone/packages/web/.next/server/app/api/repositories/route.js.nft.json +1 -1
  141. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/checks/route.js +4 -2
  142. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/checks/route.js.nft.json +1 -1
  143. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/diff/route.js +4 -2
  144. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/diff/route.js.nft.json +1 -1
  145. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feedback/route.js +4 -2
  146. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feedback/route.js.nft.json +1 -1
  147. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/files/route.js +3 -1
  148. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/files/route.js.nft.json +1 -1
  149. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/keys/route.js +3 -1
  150. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/keys/route.js.nft.json +1 -1
  151. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/kill/route.js +4 -2
  152. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/kill/route.js.nft.json +1 -1
  153. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/route.js +4 -2
  154. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/route.js.nft.json +1 -1
  155. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/stream/route.js +4 -2
  156. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/stream/route.js.nft.json +1 -1
  157. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/restore/route.js +4 -2
  158. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/restore/route.js.nft.json +1 -1
  159. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/route.js +3 -1
  160. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -1
  161. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/send/route.js +4 -2
  162. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/send/route.js.nft.json +1 -1
  163. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/route.js +3 -1
  164. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/route.js.nft.json +1 -1
  165. package/web/.next/standalone/packages/web/.next/server/app/api/spawn/route.js +5 -3
  166. package/web/.next/standalone/packages/web/.next/server/app/api/spawn/route.js.nft.json +1 -1
  167. package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/branches/route.js +3 -1
  168. package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/branches/route.js.nft.json +1 -1
  169. package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/route.js +5 -3
  170. package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/route.js.nft.json +1 -1
  171. package/web/.next/standalone/packages/web/.next/server/app/auth/grant/route/app-paths-manifest.json +3 -0
  172. package/web/.next/standalone/packages/web/.next/server/app/auth/grant/route/build-manifest.json +11 -0
  173. package/web/.next/standalone/packages/web/.next/server/app/auth/grant/route/server-reference-manifest.json +4 -0
  174. package/web/.next/standalone/packages/web/.next/server/app/auth/grant/route.js +8 -0
  175. package/web/.next/standalone/packages/web/.next/server/app/auth/grant/route.js.map +5 -0
  176. package/web/.next/standalone/packages/web/.next/server/app/auth/grant/route.js.nft.json +1 -0
  177. package/web/.next/standalone/packages/web/.next/server/app/auth/grant/route_client-reference-manifest.js +2 -0
  178. package/web/.next/standalone/packages/web/.next/server/app/index.html +1 -1
  179. package/web/.next/standalone/packages/web/.next/server/app/index.rsc +4 -4
  180. package/web/.next/standalone/packages/web/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  181. package/web/.next/standalone/packages/web/.next/server/app/index.segments/_full.segment.rsc +4 -4
  182. package/web/.next/standalone/packages/web/.next/server/app/index.segments/_head.segment.rsc +1 -1
  183. package/web/.next/standalone/packages/web/.next/server/app/index.segments/_index.segment.rsc +3 -3
  184. package/web/.next/standalone/packages/web/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  185. package/web/.next/standalone/packages/web/.next/server/app/page/build-manifest.json +2 -2
  186. package/web/.next/standalone/packages/web/.next/server/app/page.js.nft.json +1 -1
  187. package/web/.next/standalone/packages/web/.next/server/app/page_client-reference-manifest.js +1 -1
  188. package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page/build-manifest.json +2 -2
  189. package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page.js.nft.json +1 -1
  190. package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page_client-reference-manifest.js +1 -1
  191. package/web/.next/standalone/packages/web/.next/server/app/sign-in/[[...sign-in]]/page/build-manifest.json +2 -2
  192. package/web/.next/standalone/packages/web/.next/server/app/sign-in/[[...sign-in]]/page.js.nft.json +1 -1
  193. package/web/.next/standalone/packages/web/.next/server/app/sign-in/[[...sign-in]]/page_client-reference-manifest.js +1 -1
  194. package/web/.next/standalone/packages/web/.next/server/app/unlock/page/app-paths-manifest.json +3 -0
  195. package/web/.next/standalone/packages/web/.next/server/app/unlock/page/build-manifest.json +18 -0
  196. package/web/.next/standalone/packages/web/.next/server/app/unlock/page/next-font-manifest.json +14 -0
  197. package/web/.next/standalone/packages/web/.next/server/app/unlock/page/react-loadable-manifest.json +1 -0
  198. package/web/.next/standalone/packages/web/.next/server/app/unlock/page/server-reference-manifest.json +110 -0
  199. package/web/.next/standalone/packages/web/.next/server/app/unlock/page.js +19 -0
  200. package/web/.next/standalone/packages/web/.next/server/app/unlock/page.js.map +5 -0
  201. package/web/.next/standalone/packages/web/.next/server/app/unlock/page.js.nft.json +1 -0
  202. package/web/.next/standalone/packages/web/.next/server/app/unlock/page_client-reference-manifest.js +2 -0
  203. package/web/.next/standalone/packages/web/.next/server/app-paths-manifest.json +5 -1
  204. package/web/.next/standalone/packages/web/.next/server/chunks/1bc17_next_dist_esm_build_templates_app-route_1651710d.js +1 -1
  205. package/web/.next/standalone/packages/web/.next/server/chunks/1bc17_next_dist_esm_build_templates_app-route_34b04c2b.js +1 -1
  206. package/web/.next/standalone/packages/web/.next/server/chunks/1bc17_next_dist_esm_build_templates_app-route_9c655a1d.js +3 -3
  207. package/web/.next/standalone/packages/web/.next/server/chunks/1bc17_next_dist_esm_build_templates_app-route_b41c4976.js +1 -1
  208. package/web/.next/standalone/packages/web/.next/server/chunks/1bc17_next_dist_esm_build_templates_app-route_f4104ae4.js +1 -1
  209. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__005aa909._.js +1 -1
  210. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__03ff76ee._.js +1 -1
  211. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__07ec6d5c._.js +1 -1
  212. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__0a0f0f01._.js +1 -1
  213. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__0ad3545b._.js +5 -5
  214. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__39e2947e._.js → [root-of-the-server]__0c65150d._.js} +2 -2
  215. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__000a39bb._.js → [root-of-the-server]__0d615ef4._.js} +2 -2
  216. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__13ad088c._.js +1 -1
  217. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__14b1d4a3._.js +1 -1
  218. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__4266ed21._.js → [root-of-the-server]__14d277b3._.js} +2 -2
  219. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__1741fb8a._.js +1 -1
  220. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__17d81825._.js +3 -0
  221. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__04d7f8e9._.js → [root-of-the-server]__1b7c6a55._.js} +2 -2
  222. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__1e288076._.js +3 -0
  223. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__1f626a16._.js +1 -1
  224. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__1f712b77._.js +3 -0
  225. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__2062aaab._.js +1 -1
  226. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__206c3d8a._.js +1 -1
  227. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__9469f247._.js → [root-of-the-server]__230d54da._.js} +2 -2
  228. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__24d8e6fc._.js +3 -0
  229. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__2556a816._.js +1 -1
  230. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__2af6c2e0._.js +3 -0
  231. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__2d57abda._.js +3 -0
  232. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__30b0f109._.js +3 -0
  233. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__30c75561._.js +3 -0
  234. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__31c39bd9._.js +3 -0
  235. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__49d4f276._.js → [root-of-the-server]__341657dd._.js} +2 -2
  236. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__34a19860._.js +3 -0
  237. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__3fde7043._.js +1 -1
  238. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__40c8037e._.js +2 -2
  239. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__41ee872a._.js +3 -0
  240. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__44606e04._.js +1 -1
  241. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__44d59fd0._.js +1 -1
  242. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__459839a6._.js +3 -0
  243. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__46a8e776._.js +3 -0
  244. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__48875cbb._.js +1 -1
  245. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__53306f53._.js → [root-of-the-server]__488ab4b2._.js} +2 -2
  246. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__4ac9d639._.js +1 -1
  247. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__4c3fb752._.js +1 -1
  248. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__4dab6a6a._.js +1 -1
  249. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__544326ac._.js +1 -1
  250. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__5494c5a2._.js +3 -0
  251. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__54a218f0._.js +3 -3
  252. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__54a76cd2._.js +1 -1
  253. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__5661ca72._.js +1 -1
  254. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__568f0a6e._.js +3 -0
  255. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__5cd49624._.js +1 -1
  256. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__5d76c5af._.js +3 -0
  257. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__5e0533de._.js +1 -1
  258. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__5f628cf2._.js +3 -0
  259. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__62608541._.js +1 -1
  260. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6d62709d._.js +5 -5
  261. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6e4e09be._.js +3 -0
  262. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__70258e45._.js +3 -0
  263. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__917adaec._.js → [root-of-the-server]__711dc459._.js} +2 -2
  264. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__720136dd._.js +3 -0
  265. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__749331b0._.js +3 -3
  266. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__755c7e10._.js +3 -0
  267. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__778e46a1._.js +5 -5
  268. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__7e6ea46e._.js +1 -1
  269. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__7f023a04._.js +4 -4
  270. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__7f2ed2cd._.js +3 -0
  271. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__7fa52da6._.js +1 -1
  272. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__82171aa3._.js +9 -0
  273. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__84362910._.js +1 -1
  274. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__848eb266._.js +1 -1
  275. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__8596d782._.js +1 -1
  276. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__85c5cb36._.js +3 -0
  277. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__878fbacc._.js +3 -0
  278. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__881858fa._.js +1 -1
  279. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__885e3a00._.js +3 -3
  280. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__893f6b3b._.js +1 -1
  281. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__8ac30f97._.js +3 -0
  282. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__8c519453._.js +1 -1
  283. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__919845e0._.js +3 -0
  284. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__6b396859._.js → [root-of-the-server]__927b9bce._.js} +2 -2
  285. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__93b3582e._.js +3 -0
  286. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__964f4e89._.js +3 -0
  287. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__96633022._.js +1 -1
  288. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__98697e45._.js +1 -1
  289. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__997ebfca._.js +3 -0
  290. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__9c930222._.js +3 -0
  291. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__9f36b7ec._.js +5 -5
  292. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__a44f91a4._.js +3 -3
  293. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__3319a78c._.js → [root-of-the-server]__a5d13971._.js} +2 -2
  294. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__a6c7bd91._.js +3 -0
  295. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ae580a1a._.js +3 -0
  296. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__af533b5e._.js +3 -0
  297. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__afa79f55._.js +1 -1
  298. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__b057f7b2._.js +1 -1
  299. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__b59abfbd._.js +1 -1
  300. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__bd8ace80._.js +3 -0
  301. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__be0f2c29._.js +3 -0
  302. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__bea07e07._.js +1 -1
  303. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__c8618cb1._.js +1 -1
  304. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__caf8e7cb._.js +1 -1
  305. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__cb112606._.js +1 -1
  306. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__cb51f2e3._.js +3 -0
  307. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__cba32afb._.js +3 -0
  308. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__cc74ea40._.js +1 -1
  309. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__cd3692a0._.js +1 -1
  310. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__cf3cdecd._.js +1 -1
  311. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__d09e7a99._.js +1 -1
  312. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__d538c110._.js +1 -1
  313. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__d93447b9._.js +1 -1
  314. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__d9c80b18._.js +3 -0
  315. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__dc0959da._.js +3 -0
  316. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__dda8eac1._.js +1 -1
  317. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__df2c6efe._.js +3 -0
  318. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__e113f6df._.js +1 -1
  319. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__e2573a77._.js +1 -1
  320. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__e2d60274._.js +3 -0
  321. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__e308bb89._.js +1 -1
  322. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__e345a443._.js +3 -0
  323. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__e80a520f._.js +3 -0
  324. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ea0bb124._.js +3 -0
  325. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ef773ea6._.js +1 -1
  326. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__f0d15920._.js +1 -1
  327. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__b029d2c1._.js → [root-of-the-server]__f2f30c04._.js} +2 -2
  328. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__f47a2a9e._.js +1 -1
  329. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__f48eb2d4._.js +1 -1
  330. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__f6a8bbd9._.js +12 -12
  331. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__faceea9b._.js +1 -1
  332. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__fb6ab669._.js +1 -1
  333. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__fcf96768._.js +3 -0
  334. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__fdaa8058._.js +7 -0
  335. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ff2b205d._.js +3 -0
  336. package/web/.next/standalone/packages/web/.next/server/chunks/packages_core_dist_index_cdd30418.js +1 -1
  337. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_agent-amp_dist_index_bf3d8239.js +1 -1
  338. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_agent-ccr_dist_index_69cbf726.js +1 -1
  339. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_agent-claude-code_dist_index_31314e43.js +1 -1
  340. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_agent-cursor-cli_dist_index_8d5cc426.js +1 -1
  341. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_agent-droid_dist_index_f731227a.js +1 -1
  342. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_agent-gemini_dist_index_b2d219e8.js +1 -1
  343. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_agent-github-copilot_dist_index_9f80cb45.js +1 -1
  344. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_agent-opencode_dist_index_7c7015da.js +1 -1
  345. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_agent-qwen-code_dist_index_46dd8653.js +1 -1
  346. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_notifier-desktop_dist_index_ef3473f0.js +1 -1
  347. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_notifier-discord_dist_index_34257226.js +1 -1
  348. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_scm-github_dist_index_3b5a621e.js +1 -1
  349. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_terminal-web_dist_index_1e0706d3.js +1 -1
  350. package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_tracker-github_dist_index_2d7af62f.js +1 -1
  351. package/web/.next/standalone/packages/web/.next/server/chunks/packages_web__next-internal_server_app_api_access_route_actions_06740e99.js +3 -0
  352. package/web/.next/standalone/packages/web/.next/server/chunks/packages_web__next-internal_server_app_api_auth_session_route_actions_078c0ee4.js +3 -0
  353. package/web/.next/standalone/packages/web/.next/server/chunks/packages_web__next-internal_server_app_auth_grant_route_actions_13ba4421.js +3 -0
  354. package/web/.next/standalone/packages/web/.next/server/chunks/packages_web_src_lib_13fee5eb._.js +3 -0
  355. package/web/.next/standalone/packages/web/.next/server/chunks/packages_web_src_lib_d64596cc._.js +3 -0
  356. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{[root-of-the-server]__1ddf22db._.js → [root-of-the-server]__1012a4c8._.js} +2 -2
  357. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{[root-of-the-server]__ed81e796._.js → [root-of-the-server]__81affb12._.js} +2 -2
  358. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__95e85d3d._.js +3 -0
  359. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{[root-of-the-server]__f577d85a._.js → [root-of-the-server]__9d698773._.js} +2 -2
  360. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__a38f483b._.js +1 -1
  361. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{[root-of-the-server]__3bf3fbfb._.js → [root-of-the-server]__c09a0c60._.js} +2 -2
  362. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__d9dde485._.js +1 -1
  363. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{[root-of-the-server]__d5970f3e._.js → [root-of-the-server]__dd435d80._.js} +2 -2
  364. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{[root-of-the-server]__469db3c3._.js → [root-of-the-server]__e78955d0._.js} +2 -2
  365. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_14a33487._.js +3 -0
  366. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_34d55bf1._.js +4 -0
  367. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{node_modules__pnpm_c636dc22._.js → node_modules__pnpm_597c265e._.js} +1 -1
  368. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/packages_web_src_app_page_tsx_cd282e82._.js +1 -1
  369. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/packages_web_src_app_unlock_UnlockForm_tsx_ce3149a7._.js +3 -0
  370. package/web/.next/standalone/packages/web/.next/server/middleware-build-manifest.js +2 -2
  371. package/web/.next/standalone/packages/web/.next/server/middleware.js +1 -1
  372. package/web/.next/standalone/packages/web/.next/server/next-font-manifest.js +1 -1
  373. package/web/.next/standalone/packages/web/.next/server/next-font-manifest.json +7 -0
  374. package/web/.next/standalone/packages/web/.next/server/pages/404.html +1 -1
  375. package/web/.next/standalone/packages/web/.next/server/pages/500.html +2 -2
  376. package/web/.next/standalone/packages/web/.next/server/server-reference-manifest.js +1 -1
  377. package/web/.next/standalone/packages/web/.next/server/server-reference-manifest.json +56 -7
  378. package/web/.next/standalone/packages/web/.next/static/chunks/{9b799cd7eb9a34ff.js → 1c4c14af475ada00.js} +1 -1
  379. package/web/.next/standalone/packages/web/.next/static/chunks/ba68284a3401d670.css +3 -0
  380. package/web/.next/{static/chunks/4372fb4d7779cd64.js → standalone/packages/web/.next/static/chunks/d00ddc86d1af3b6d.js} +1 -1
  381. package/web/.next/standalone/packages/web/.next/static/chunks/d8f4bf59132f70fd.js +1 -0
  382. package/web/.next/standalone/packages/web/.next/static/chunks/f355d4d60f0ec80e.js +1 -0
  383. package/web/.next/standalone/packages/web/.next/static/chunks/{turbopack-c3449aaab622f98c.js → turbopack-dc658d17ee981623.js} +1 -1
  384. package/web/.next/standalone/packages/web/package.json +1 -0
  385. package/web/.next/standalone/packages/web/src/app/api/access/route.ts +214 -0
  386. package/web/.next/standalone/packages/web/src/app/api/agents/route.ts +2 -2
  387. package/web/.next/standalone/packages/web/src/app/api/attachments/route.ts +1 -1
  388. package/web/.next/standalone/packages/web/src/app/api/auth/session/route.ts +54 -0
  389. package/web/.next/standalone/packages/web/src/app/api/boards/route.ts +2 -2
  390. package/web/.next/standalone/packages/web/src/app/api/config/route.ts +2 -1
  391. package/web/.next/standalone/packages/web/src/app/api/context-files/route.ts +1 -1
  392. package/web/.next/standalone/packages/web/src/app/api/events/route.ts +1 -1
  393. package/web/.next/standalone/packages/web/src/app/api/filesystem/directory/route.ts +1 -1
  394. package/web/.next/standalone/packages/web/src/app/api/github/repos/route.ts +1 -1
  395. package/web/.next/standalone/packages/web/src/app/api/health/boards/route.ts +1 -1
  396. package/web/.next/standalone/packages/web/src/app/api/preferences/route.ts +11 -3
  397. package/web/.next/standalone/packages/web/src/app/api/repositories/route.ts +21 -3
  398. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/checks/route.ts +1 -1
  399. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/diff/route.ts +1 -1
  400. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/feedback/route.ts +1 -1
  401. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/files/route.ts +1 -1
  402. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/keys/route.ts +1 -1
  403. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/kill/route.ts +1 -1
  404. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/output/route.ts +1 -1
  405. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/output/stream/route.ts +1 -1
  406. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/restore/route.ts +1 -1
  407. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/route.ts +1 -1
  408. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/send/route.ts +1 -1
  409. package/web/.next/standalone/packages/web/src/app/api/sessions/route.ts +1 -1
  410. package/web/.next/standalone/packages/web/src/app/api/spawn/route.ts +3 -2
  411. package/web/.next/standalone/packages/web/src/app/api/workspaces/branches/route.ts +1 -1
  412. package/web/.next/standalone/packages/web/src/app/api/workspaces/route.ts +11 -3
  413. package/web/.next/standalone/packages/web/src/app/auth/grant/route.ts +37 -0
  414. package/web/.next/standalone/packages/web/src/app/page.tsx +763 -9
  415. package/web/.next/standalone/packages/web/src/app/unlock/UnlockForm.tsx +77 -0
  416. package/web/.next/standalone/packages/web/src/app/unlock/page.tsx +41 -0
  417. package/web/.next/standalone/packages/web/src/components/Dashboard.tsx +11 -125
  418. package/web/.next/standalone/packages/web/src/hooks/useConfig.ts +4 -0
  419. package/web/.next/standalone/packages/web/src/lib/accessControl.test.ts +46 -0
  420. package/web/.next/standalone/packages/web/src/lib/accessControl.ts +115 -0
  421. package/web/.next/standalone/packages/web/src/lib/auth.ts +294 -53
  422. package/web/.next/standalone/packages/web/src/lib/edgeAuth.test.ts +91 -0
  423. package/web/.next/standalone/packages/web/src/lib/edgeAuth.ts +205 -0
  424. package/web/.next/standalone/packages/web/src/lib/modelAccess.ts +40 -0
  425. package/web/.next/standalone/packages/web/src/lib/projectConfigSync.ts +59 -9
  426. package/web/.next/standalone/packages/web/src/lib/remoteAuth.ts +104 -0
  427. package/web/.next/standalone/packages/web/src/proxy.ts +64 -0
  428. package/web/.next/standalone/packages/web/tsconfig.tsbuildinfo +1 -1
  429. package/web/.next/static/chunks/{9b799cd7eb9a34ff.js → 1c4c14af475ada00.js} +1 -1
  430. package/web/.next/static/chunks/ba68284a3401d670.css +3 -0
  431. package/web/.next/{standalone/packages/web/.next/static/chunks/4372fb4d7779cd64.js → static/chunks/d00ddc86d1af3b6d.js} +1 -1
  432. package/web/.next/static/chunks/d8f4bf59132f70fd.js +1 -0
  433. package/web/.next/static/chunks/f355d4d60f0ec80e.js +1 -0
  434. package/web/.next/static/chunks/{turbopack-c3449aaab622f98c.js → turbopack-dc658d17ee981623.js} +1 -1
  435. package/node_modules/@conductor-oss/core/dist/__tests__/board-parser.test.d.ts +0 -2
  436. package/node_modules/@conductor-oss/core/dist/__tests__/board-parser.test.d.ts.map +0 -1
  437. package/node_modules/@conductor-oss/core/dist/__tests__/board-parser.test.js +0 -67
  438. package/node_modules/@conductor-oss/core/dist/__tests__/board-parser.test.js.map +0 -1
  439. package/node_modules/@conductor-oss/core/dist/__tests__/board-watcher-support-files.test.d.ts +0 -2
  440. package/node_modules/@conductor-oss/core/dist/__tests__/board-watcher-support-files.test.d.ts.map +0 -1
  441. package/node_modules/@conductor-oss/core/dist/__tests__/board-watcher-support-files.test.js +0 -104
  442. package/node_modules/@conductor-oss/core/dist/__tests__/board-watcher-support-files.test.js.map +0 -1
  443. package/node_modules/@conductor-oss/core/dist/agent-cli-runtime.d.ts +0 -20
  444. package/node_modules/@conductor-oss/core/dist/agent-cli-runtime.d.ts.map +0 -1
  445. package/node_modules/@conductor-oss/core/dist/agent-cli-runtime.js +0 -192
  446. package/node_modules/@conductor-oss/core/dist/agent-cli-runtime.js.map +0 -1
  447. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__019d9c90._.js +0 -3
  448. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__08a3e108._.js +0 -3
  449. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__0b0ab434._.js +0 -3
  450. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__16fb4c3e._.js +0 -9
  451. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__22609b55._.js +0 -3
  452. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__2ff87bed._.js +0 -3
  453. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__3c1772ab._.js +0 -3
  454. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__5093c7e0._.js +0 -3
  455. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__5a67f1f9._.js +0 -3
  456. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__5cf55740._.js +0 -3
  457. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6bc94363._.js +0 -3
  458. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6cad94c3._.js +0 -3
  459. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6d28affc._.js +0 -3
  460. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6f84fa49._.js +0 -3
  461. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__70c9c405._.js +0 -3
  462. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__711294a3._.js +0 -3
  463. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__7791414d._.js +0 -3
  464. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__7fb2ee11._.js +0 -7
  465. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__86646048._.js +0 -3
  466. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__8ca91fef._.js +0 -3
  467. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__a15b5527._.js +0 -3
  468. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__a4a89ac9._.js +0 -3
  469. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__a8a53d4a._.js +0 -3
  470. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__a93c59df._.js +0 -3
  471. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__abf6274f._.js +0 -3
  472. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__acd4519a._.js +0 -3
  473. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__b87de88e._.js +0 -3
  474. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__bc304d71._.js +0 -3
  475. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__be52402d._.js +0 -3
  476. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__be74f171._.js +0 -3
  477. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__c03aa571._.js +0 -3
  478. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__c2850420._.js +0 -3
  479. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__c82b8934._.js +0 -3
  480. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__c8e31ad0._.js +0 -3
  481. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__deafbc7a._.js +0 -3
  482. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__e18c8e77._.js +0 -3
  483. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__e1f610fb._.js +0 -3
  484. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ec21c9a4._.js +0 -3
  485. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ec256a62._.js +0 -3
  486. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__edc8e5a5._.js +0 -3
  487. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ee0dea96._.js +0 -3
  488. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__f2c28004._.js +0 -3
  489. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__f7c743c0._.js +0 -3
  490. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__f95f5172._.js +0 -3
  491. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__fc292e1c._.js +0 -3
  492. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ffbf3faf._.js +0 -3
  493. package/web/.next/standalone/packages/web/.next/static/chunks/687bc713618f6993.js +0 -1
  494. package/web/.next/standalone/packages/web/.next/static/chunks/e7bb96d7efad8e32.css +0 -3
  495. package/web/.next/static/chunks/687bc713618f6993.js +0 -1
  496. package/web/.next/static/chunks/e7bb96d7efad8e32.css +0 -3
  497. /package/web/.next/standalone/packages/web/.next/static/{D95FTb8SiR6uFzjCQiKtd → tV9IvZT_f540bpw2KonCu}/_buildManifest.js +0 -0
  498. /package/web/.next/standalone/packages/web/.next/static/{D95FTb8SiR6uFzjCQiKtd → tV9IvZT_f540bpw2KonCu}/_clientMiddlewareManifest.json +0 -0
  499. /package/web/.next/standalone/packages/web/.next/static/{D95FTb8SiR6uFzjCQiKtd → tV9IvZT_f540bpw2KonCu}/_ssgManifest.js +0 -0
  500. /package/web/.next/static/{D95FTb8SiR6uFzjCQiKtd → tV9IvZT_f540bpw2KonCu}/_buildManifest.js +0 -0
  501. /package/web/.next/static/{D95FTb8SiR6uFzjCQiKtd → tV9IvZT_f540bpw2KonCu}/_clientMiddlewareManifest.json +0 -0
  502. /package/web/.next/static/{D95FTb8SiR6uFzjCQiKtd → tV9IvZT_f540bpw2KonCu}/_ssgManifest.js +0 -0
@@ -0,0 +1,214 @@
1
+ import { type NextRequest, NextResponse } from "next/server";
2
+ import { readFile, writeFile } from "node:fs/promises";
3
+ import { parse, stringify } from "yaml";
4
+ import type { DashboardAccessConfig, DashboardRoleBindings } from "@conductor-oss/core/types";
5
+ import { getDashboardAccess, guardApiAccess, guardApiActionAccess } from "@/lib/auth";
6
+ import { getServices, invalidateServicesCache } from "@/lib/services";
7
+ import { normalizeRootProjectPaths } from "@/lib/projectConfigSync";
8
+
9
+ export const dynamic = "force-dynamic";
10
+
11
+ type MutableConfig = Record<string, unknown>;
12
+
13
+ type AccessPatchBody = {
14
+ requireAuth?: unknown;
15
+ defaultRole?: unknown;
16
+ trustedHeaders?: unknown;
17
+ roles?: unknown;
18
+ };
19
+
20
+ function toObject(value: unknown): Record<string, unknown> {
21
+ if (!value || typeof value !== "object" || Array.isArray(value)) return {};
22
+ return { ...(value as Record<string, unknown>) };
23
+ }
24
+
25
+ function asOptionalRole(value: unknown): DashboardAccessConfig["defaultRole"] | undefined {
26
+ if (value === "viewer" || value === "operator" || value === "admin") {
27
+ return value;
28
+ }
29
+ return undefined;
30
+ }
31
+
32
+ function normalizeStringList(value: unknown): string[] {
33
+ if (Array.isArray(value)) {
34
+ return value
35
+ .filter((item): item is string => typeof item === "string")
36
+ .map((item) => item.trim())
37
+ .filter(Boolean);
38
+ }
39
+ if (typeof value !== "string") return [];
40
+ return value
41
+ .split(/[\n,]+/g)
42
+ .map((item) => item.trim())
43
+ .filter(Boolean);
44
+ }
45
+
46
+ function normalizeRoles(value: unknown): DashboardRoleBindings | undefined {
47
+ const root = toObject(value);
48
+ const next: DashboardRoleBindings = {};
49
+
50
+ const viewers = normalizeStringList(root["viewers"]);
51
+ const operators = normalizeStringList(root["operators"]);
52
+ const admins = normalizeStringList(root["admins"]);
53
+ const viewerDomains = normalizeStringList(root["viewerDomains"]);
54
+ const operatorDomains = normalizeStringList(root["operatorDomains"]);
55
+ const adminDomains = normalizeStringList(root["adminDomains"]);
56
+
57
+ if (viewers.length > 0) next.viewers = viewers;
58
+ if (operators.length > 0) next.operators = operators;
59
+ if (admins.length > 0) next.admins = admins;
60
+ if (viewerDomains.length > 0) next.viewerDomains = viewerDomains;
61
+ if (operatorDomains.length > 0) next.operatorDomains = operatorDomains;
62
+ if (adminDomains.length > 0) next.adminDomains = adminDomains;
63
+
64
+ return Object.keys(next).length > 0 ? next : undefined;
65
+ }
66
+
67
+ function normalizeAccessConfig(value: unknown): DashboardAccessConfig {
68
+ const root = toObject(value);
69
+ const trustedHeaders = toObject(root["trustedHeaders"]);
70
+ const defaultRole = asOptionalRole(root["defaultRole"]);
71
+
72
+ const next: DashboardAccessConfig = {
73
+ requireAuth: root["requireAuth"] === true,
74
+ trustedHeaders: {
75
+ enabled: trustedHeaders["enabled"] === true,
76
+ provider:
77
+ trustedHeaders["provider"] === "generic"
78
+ ? "generic"
79
+ : "cloudflare-access",
80
+ emailHeader:
81
+ (typeof trustedHeaders["emailHeader"] === "string" && trustedHeaders["emailHeader"].trim().length > 0
82
+ ? trustedHeaders["emailHeader"].trim()
83
+ : "Cf-Access-Authenticated-User-Email"),
84
+ jwtHeader:
85
+ (typeof trustedHeaders["jwtHeader"] === "string" && trustedHeaders["jwtHeader"].trim().length > 0
86
+ ? trustedHeaders["jwtHeader"].trim()
87
+ : "Cf-Access-Jwt-Assertion"),
88
+ },
89
+ };
90
+
91
+ if (typeof trustedHeaders["teamDomain"] === "string" && trustedHeaders["teamDomain"].trim().length > 0) {
92
+ next.trustedHeaders!.teamDomain = trustedHeaders["teamDomain"].trim();
93
+ }
94
+
95
+ if (typeof trustedHeaders["audience"] === "string" && trustedHeaders["audience"].trim().length > 0) {
96
+ next.trustedHeaders!.audience = trustedHeaders["audience"].trim();
97
+ }
98
+
99
+ if (defaultRole) {
100
+ next.defaultRole = defaultRole;
101
+ }
102
+
103
+ const roles = normalizeRoles(root["roles"]);
104
+ if (roles) {
105
+ next.roles = roles;
106
+ }
107
+
108
+ return next;
109
+ }
110
+
111
+ export async function GET(request: NextRequest) {
112
+ const denied = await guardApiAccess(request, "viewer");
113
+ if (denied) return denied;
114
+
115
+ try {
116
+ const { config } = await getServices();
117
+ const access = normalizeAccessConfig(config.access);
118
+ const current = await getDashboardAccess(request);
119
+
120
+ return NextResponse.json({
121
+ access,
122
+ current: {
123
+ authenticated: current.authenticated,
124
+ role: current.role ?? null,
125
+ email: current.email ?? null,
126
+ provider: current.provider ?? null,
127
+ },
128
+ });
129
+ } catch (err) {
130
+ const message = err instanceof Error ? err.message : "Failed to load access settings";
131
+ return NextResponse.json({ error: message }, { status: 500 });
132
+ }
133
+ }
134
+
135
+ export async function PUT(request: NextRequest) {
136
+ const denied = await guardApiAccess(request, "admin");
137
+ if (denied) return denied;
138
+ const deniedAction = guardApiActionAccess(request);
139
+ if (deniedAction) return deniedAction;
140
+
141
+ const body = (await request.json().catch(() => null)) as AccessPatchBody | null;
142
+ if (!body || typeof body !== "object") {
143
+ return NextResponse.json({ error: "Invalid JSON body" }, { status: 400 });
144
+ }
145
+
146
+ try {
147
+ const { config } = await getServices();
148
+ const configPath = config.configPath;
149
+ if (!configPath) {
150
+ return NextResponse.json({ error: "Unable to resolve conductor config path" }, { status: 500 });
151
+ }
152
+
153
+ const originalConfigRaw = await readFile(configPath, "utf8");
154
+ const parsed = (parse(originalConfigRaw) ?? {}) as MutableConfig;
155
+ const nextRoot: MutableConfig =
156
+ parsed && typeof parsed === "object" && !Array.isArray(parsed)
157
+ ? { ...parsed }
158
+ : {};
159
+
160
+ const nextAccess = normalizeAccessConfig(nextRoot["access"]);
161
+
162
+ if (typeof body.requireAuth === "boolean") {
163
+ nextAccess.requireAuth = body.requireAuth;
164
+ }
165
+
166
+ if (body.defaultRole !== undefined) {
167
+ nextAccess.defaultRole = asOptionalRole(body.defaultRole);
168
+ }
169
+
170
+ if (body.trustedHeaders !== undefined) {
171
+ const nextTrusted = toObject(body.trustedHeaders);
172
+ nextAccess.trustedHeaders = {
173
+ enabled: nextTrusted["enabled"] === true,
174
+ emailHeader:
175
+ (typeof nextTrusted["emailHeader"] === "string" && nextTrusted["emailHeader"].trim().length > 0
176
+ ? nextTrusted["emailHeader"].trim()
177
+ : "Cf-Access-Authenticated-User-Email"),
178
+ };
179
+ }
180
+
181
+ if (body.roles !== undefined) {
182
+ nextAccess.roles = normalizeRoles(body.roles);
183
+ }
184
+
185
+ nextRoot["access"] = nextAccess;
186
+ await normalizeRootProjectPaths(nextRoot);
187
+
188
+ const updatedYaml = stringify(nextRoot, { lineWidth: 0 });
189
+ await writeFile(configPath, updatedYaml, "utf8");
190
+
191
+ try {
192
+ invalidateServicesCache("access updated");
193
+ await getServices();
194
+ } catch (err) {
195
+ await writeFile(configPath, originalConfigRaw, "utf8");
196
+ invalidateServicesCache("access update rollback");
197
+ throw err;
198
+ }
199
+
200
+ const current = await getDashboardAccess(request);
201
+ return NextResponse.json({
202
+ access: nextAccess,
203
+ current: {
204
+ authenticated: current.authenticated,
205
+ role: current.role ?? null,
206
+ email: current.email ?? null,
207
+ provider: current.provider ?? null,
208
+ },
209
+ });
210
+ } catch (err) {
211
+ const message = err instanceof Error ? err.message : "Failed to update access settings";
212
+ return NextResponse.json({ error: message }, { status: 500 });
213
+ }
214
+ }
@@ -108,7 +108,7 @@ const PATH_AGENT_HINTS: AgentHint[] = [
108
108
  },
109
109
  {
110
110
  name: "qwen-code",
111
- commands: ["qwen-code"],
111
+ commands: ["qwen", "qwen-code"],
112
112
  aliases: ["qwen", "qwen code", "qwen-code-cli", "qwen_code", "qwen-code"],
113
113
  description: "Qwen Code CLI",
114
114
  homepage: "https://qwenlm.github.io/announcements/",
@@ -445,7 +445,7 @@ async function collectBinaryAgents(candidates: string[]): Promise<AgentInfo[]> {
445
445
  }
446
446
 
447
447
  export async function GET() {
448
- const denied = await guardApiAccess();
448
+ const denied = await guardApiAccess(undefined, "viewer");
449
449
  if (denied) return denied;
450
450
 
451
451
  try {
@@ -87,7 +87,7 @@ function isImagePath(path: string): boolean {
87
87
  }
88
88
 
89
89
  export async function POST(request: NextRequest) {
90
- const denied = await guardApiAccess();
90
+ const denied = await guardApiAccess(request, "operator");
91
91
  if (denied) return denied;
92
92
  const deniedAction = guardApiActionAccess(request);
93
93
  if (deniedAction) return deniedAction;
@@ -0,0 +1,54 @@
1
+ import { type NextRequest, NextResponse } from "next/server";
2
+ import {
3
+ BUILTIN_REMOTE_SESSION_COOKIE,
4
+ createBuiltinRemoteSessionValue,
5
+ getBuiltinRemoteSessionCookieOptions,
6
+ isBuiltinRemoteAuthEnabled,
7
+ isValidBuiltinAccessToken,
8
+ } from "@/lib/remoteAuth";
9
+
10
+ type SessionRequestBody = {
11
+ token?: unknown;
12
+ };
13
+
14
+ function clearSession(response: NextResponse): void {
15
+ response.cookies.set(BUILTIN_REMOTE_SESSION_COOKIE, "", {
16
+ ...getBuiltinRemoteSessionCookieOptions(false),
17
+ maxAge: 0,
18
+ });
19
+ }
20
+
21
+ export async function POST(request: NextRequest): Promise<NextResponse> {
22
+ if (!isBuiltinRemoteAuthEnabled()) {
23
+ return NextResponse.json({ error: "Built-in remote auth is not enabled" }, { status: 404 });
24
+ }
25
+
26
+ const body = (await request.json().catch(() => null)) as SessionRequestBody | null;
27
+ const token = typeof body?.token === "string" ? body.token.trim() : "";
28
+ if (!isValidBuiltinAccessToken(token)) {
29
+ return NextResponse.json({ error: "Invalid access token" }, { status: 403 });
30
+ }
31
+
32
+ const response = NextResponse.json({ ok: true });
33
+ response.cookies.set(
34
+ BUILTIN_REMOTE_SESSION_COOKIE,
35
+ await createBuiltinRemoteSessionValue(),
36
+ getBuiltinRemoteSessionCookieOptions(request.nextUrl.protocol === "https:"),
37
+ );
38
+ return response;
39
+ }
40
+
41
+ export async function DELETE(request: NextRequest): Promise<NextResponse> {
42
+ const response = NextResponse.json({ ok: true });
43
+ clearSession(response);
44
+
45
+ if (!isBuiltinRemoteAuthEnabled()) {
46
+ return response;
47
+ }
48
+
49
+ response.cookies.set(BUILTIN_REMOTE_SESSION_COOKIE, "", {
50
+ ...getBuiltinRemoteSessionCookieOptions(request.nextUrl.protocol === "https:"),
51
+ maxAge: 0,
52
+ });
53
+ return response;
54
+ }
@@ -383,7 +383,7 @@ function buildTaskLine(params: {
383
383
 
384
384
  /** GET /api/boards?projectId=<id> -- Return parsed kanban board for a project. */
385
385
  export async function GET(request: NextRequest) {
386
- const denied = await guardApiAccess();
386
+ const denied = await guardApiAccess(undefined, "viewer");
387
387
  if (denied) return denied;
388
388
 
389
389
  const projectId = asNonEmptyString(request.nextUrl.searchParams.get("projectId"));
@@ -436,7 +436,7 @@ export async function GET(request: NextRequest) {
436
436
  * Body: { projectId, title, description?, contextNotes?, attachments?, agent, role?, type?, priority? }
437
437
  */
438
438
  export async function POST(request: NextRequest) {
439
- const denied = await guardApiAccess();
439
+ const denied = await guardApiAccess(request, "operator");
440
440
  if (denied) return denied;
441
441
  const deniedAction = guardApiActionAccess(request);
442
442
  if (deniedAction) return deniedAction;
@@ -44,7 +44,7 @@ function resolveBoardFile(
44
44
 
45
45
  /** GET /api/config -- Return configured projects and their board paths. */
46
46
  export async function GET() {
47
- const denied = await guardApiAccess();
47
+ const denied = await guardApiAccess(undefined, "viewer");
48
48
  if (denied) return denied;
49
49
  try {
50
50
  const { config } = await getServices();
@@ -67,6 +67,7 @@ export async function GET() {
67
67
  ),
68
68
  description: (project as { description?: string }).description ?? null,
69
69
  agent: (project as { agent?: string }).agent ?? "claude-code",
70
+ agentModel: (project as { agentConfig?: { model?: string } }).agentConfig?.model ?? null,
70
71
  };
71
72
  });
72
73
  return NextResponse.json({ projects });
@@ -147,7 +147,7 @@ async function collectContextFiles(params: {
147
147
 
148
148
  /** GET /api/context-files?projectId=<id> -- List likely context/attachment files for task composer. */
149
149
  export async function GET(request: Request) {
150
- const denied = await guardApiAccess();
150
+ const denied = await guardApiAccess(undefined, "viewer");
151
151
  if (denied) return denied;
152
152
 
153
153
  try {
@@ -17,7 +17,7 @@ export const dynamic = "force-dynamic";
17
17
  * - Closed flag prevents enqueue-after-close errors
18
18
  */
19
19
  export async function GET(request: Request): Promise<Response> {
20
- const denied = await guardApiAccess();
20
+ const denied = await guardApiAccess(request, "viewer");
21
21
  if (denied) return denied;
22
22
 
23
23
  const encoder = new TextEncoder();
@@ -36,7 +36,7 @@ async function isGitRepo(path: string): Promise<boolean> {
36
36
  }
37
37
 
38
38
  export async function GET(request: NextRequest) {
39
- const denied = await guardApiAccess();
39
+ const denied = await guardApiAccess(request, "operator");
40
40
  if (denied) return denied;
41
41
 
42
42
  const rawPath = request.nextUrl.searchParams.get("path");
@@ -44,7 +44,7 @@ async function assertGhAuthenticated(): Promise<void> {
44
44
  }
45
45
 
46
46
  export async function GET(request: NextRequest) {
47
- const denied = await guardApiAccess();
47
+ const denied = await guardApiAccess(undefined, "operator");
48
48
  if (denied) return denied;
49
49
 
50
50
  const query = request.nextUrl.searchParams.get("q")?.trim().toLowerCase() ?? "";
@@ -7,7 +7,7 @@ export const dynamic = "force-dynamic";
7
7
 
8
8
  /** GET /api/health/boards -- watcher board parse/health snapshot. */
9
9
  export async function GET() {
10
- const denied = await guardApiAccess();
10
+ const denied = await guardApiAccess(undefined, "viewer");
11
11
  if (denied) return denied;
12
12
 
13
13
  try {
@@ -4,7 +4,8 @@ import { parse, stringify } from "yaml";
4
4
  import { syncWorkspaceSupportFiles, type UserPreferences } from "@conductor-oss/core";
5
5
  import { getServices, invalidateServicesCache } from "@/lib/services";
6
6
  import { guardApiAccess, guardApiActionAccess } from "@/lib/auth";
7
- import { syncAllProjectLocalConfigs } from "@/lib/projectConfigSync";
7
+ import { normalizeModelAccessPreferences } from "@/lib/modelAccess";
8
+ import { normalizeRootProjectPaths, syncAllProjectLocalConfigs } from "@/lib/projectConfigSync";
8
9
 
9
10
  export const dynamic = "force-dynamic";
10
11
 
@@ -17,6 +18,7 @@ type PreferencesPatchBody = {
17
18
  remoteSshHost?: unknown;
18
19
  remoteSshUser?: unknown;
19
20
  markdownEditor?: unknown;
21
+ modelAccess?: unknown;
20
22
  notifications?: unknown;
21
23
  };
22
24
 
@@ -48,6 +50,7 @@ function normalizePreferences(
48
50
  ...(remoteSshHost ? { remoteSshHost } : {}),
49
51
  ...(remoteSshUser ? { remoteSshUser } : {}),
50
52
  markdownEditor: asNonEmptyString(root["markdownEditor"]) ?? "obsidian",
53
+ modelAccess: normalizeModelAccessPreferences(root["modelAccess"]),
51
54
  notifications: {
52
55
  soundEnabled: notifications["soundEnabled"] !== false,
53
56
  soundFile: soundFile === null
@@ -58,7 +61,7 @@ function normalizePreferences(
58
61
  }
59
62
 
60
63
  export async function GET() {
61
- const denied = await guardApiAccess();
64
+ const denied = await guardApiAccess(undefined, "viewer");
62
65
  if (denied) return denied;
63
66
 
64
67
  try {
@@ -73,7 +76,7 @@ export async function GET() {
73
76
  }
74
77
 
75
78
  export async function PUT(request: NextRequest) {
76
- const denied = await guardApiAccess();
79
+ const denied = await guardApiAccess(request, "operator");
77
80
  if (denied) return denied;
78
81
  const deniedAction = guardApiActionAccess(request);
79
82
  if (deniedAction) return deniedAction;
@@ -142,6 +145,10 @@ export async function PUT(request: NextRequest) {
142
145
  if (value) nextPreferences.markdownEditor = value;
143
146
  }
144
147
 
148
+ if (body.modelAccess !== undefined) {
149
+ nextPreferences.modelAccess = normalizeModelAccessPreferences(body.modelAccess);
150
+ }
151
+
145
152
  if (body.notifications !== undefined) {
146
153
  const notificationsPatch = toObject(body.notifications);
147
154
  if (typeof notificationsPatch["soundEnabled"] === "boolean") {
@@ -158,6 +165,7 @@ export async function PUT(request: NextRequest) {
158
165
  }
159
166
 
160
167
  nextRoot["preferences"] = nextPreferences;
168
+ await normalizeRootProjectPaths(nextRoot);
161
169
 
162
170
  const updatedYaml = stringify(nextRoot, {
163
171
  lineWidth: 0,
@@ -9,7 +9,7 @@ import { parse, stringify } from "yaml";
9
9
  import { syncWorkspaceSupportFiles } from "@conductor-oss/core";
10
10
  import { getServices, invalidateServicesCache } from "@/lib/services";
11
11
  import { guardApiAccess, guardApiActionAccess } from "@/lib/auth";
12
- import { syncProjectLocalConfig } from "@/lib/projectConfigSync";
12
+ import { normalizeRootProjectPaths, syncProjectLocalConfig } from "@/lib/projectConfigSync";
13
13
 
14
14
  export const dynamic = "force-dynamic";
15
15
 
@@ -24,6 +24,7 @@ type RepositoryPatchBody = {
24
24
  repo?: unknown;
25
25
  path?: unknown;
26
26
  agent?: unknown;
27
+ agentModel?: unknown;
27
28
  defaultWorkingDirectory?: unknown;
28
29
  defaultBranch?: unknown;
29
30
  devServerScript?: unknown;
@@ -208,6 +209,7 @@ async function suggestRepoPath(projectPath: string, repoValue?: string | null):
208
209
  async function serializeRepository(projectId: string, project: Record<string, unknown>) {
209
210
  const path = asNonEmptyString(project["path"]) ?? "";
210
211
  const repo = asNonEmptyString(project["repo"]) ?? "";
212
+ const agentConfig = toObject(project["agentConfig"]);
211
213
  const expandedPath = path ? expandHome(path) : "";
212
214
  const pathExists = expandedPath ? existsSync(expandedPath) : false;
213
215
  const gitRepository = expandedPath ? await isGitRepository(expandedPath) : false;
@@ -221,6 +223,7 @@ async function serializeRepository(projectId: string, project: Record<string, un
221
223
  repo,
222
224
  path,
223
225
  agent: asNonEmptyString(project["agent"]) ?? "claude-code",
226
+ agentModel: asNonEmptyString(agentConfig["model"]) ?? "",
224
227
  workspaceMode: asNonEmptyString(project["workspace"]) ?? "worktree",
225
228
  runtimeMode: asNonEmptyString(project["runtime"]) ?? "tmux",
226
229
  scmMode: asNonEmptyString(project["scm"]) ?? "github",
@@ -241,7 +244,7 @@ async function serializeRepository(projectId: string, project: Record<string, un
241
244
  }
242
245
 
243
246
  export async function GET() {
244
- const denied = await guardApiAccess();
247
+ const denied = await guardApiAccess(undefined, "viewer");
245
248
  if (denied) return denied;
246
249
 
247
250
  try {
@@ -262,7 +265,7 @@ export async function GET() {
262
265
  }
263
266
 
264
267
  export async function PUT(request: NextRequest) {
265
- const denied = await guardApiAccess();
268
+ const denied = await guardApiAccess(request, "operator");
266
269
  if (denied) return denied;
267
270
  const deniedAction = guardApiActionAccess(request);
268
271
  if (deniedAction) return deniedAction;
@@ -303,6 +306,7 @@ export async function PUT(request: NextRequest) {
303
306
  const repo = asNonEmptyString(body.repo);
304
307
  const path = asNonEmptyString(body.path);
305
308
  const agent = asNonEmptyString(body.agent) ?? asNonEmptyString(existingProject["agent"]) ?? "claude-code";
309
+ const agentModel = asNonEmptyString(body.agentModel);
306
310
  const defaultBranch = asNonEmptyString(body.defaultBranch) ?? "main";
307
311
  const defaultWorkingDirectory = normalizeWorkingDirectory(asNonEmptyString(body.defaultWorkingDirectory));
308
312
 
@@ -318,6 +322,19 @@ export async function PUT(request: NextRequest) {
318
322
  nextProject["path"] = expandHome(path);
319
323
  nextProject["agent"] = agent;
320
324
  nextProject["defaultBranch"] = defaultBranch;
325
+ const nextAgentConfig = toObject(nextProject["agentConfig"]);
326
+ if (agentModel) {
327
+ nextProject["agentConfig"] = {
328
+ ...nextAgentConfig,
329
+ model: agentModel,
330
+ };
331
+ } else if ("model" in nextAgentConfig) {
332
+ const { model: _removedModel, ...rest } = nextAgentConfig;
333
+ nextProject["agentConfig"] = rest;
334
+ if (Object.keys(rest).length === 0) {
335
+ delete nextProject["agentConfig"];
336
+ }
337
+ }
321
338
 
322
339
  if (defaultWorkingDirectory) {
323
340
  nextProject["defaultWorkingDirectory"] = defaultWorkingDirectory;
@@ -371,6 +388,7 @@ export async function PUT(request: NextRequest) {
371
388
 
372
389
  nextProjects[id] = nextProject;
373
390
  nextRoot["projects"] = nextProjects;
391
+ await normalizeRootProjectPaths(nextRoot);
374
392
 
375
393
  const updatedYaml = stringify(nextRoot, { lineWidth: 0 });
376
394
  await writeFile(configPath, updatedYaml, "utf8");
@@ -98,7 +98,7 @@ export async function GET(
98
98
  _request: NextRequest,
99
99
  context: { params: Promise<{ id: string }> },
100
100
  ) {
101
- const denied = await guardApiAccess();
101
+ const denied = await guardApiAccess(undefined, "viewer");
102
102
  const { id } = await context.params;
103
103
  if (denied) return denied;
104
104
 
@@ -362,7 +362,7 @@ export async function GET(
362
362
  _request: NextRequest,
363
363
  context: { params: Promise<{ id: string }> },
364
364
  ) {
365
- const denied = await guardApiAccess();
365
+ const denied = await guardApiAccess(undefined, "viewer");
366
366
  if (denied) return denied;
367
367
 
368
368
  const { id } = await context.params;
@@ -11,7 +11,7 @@ export async function POST(
11
11
  request: NextRequest,
12
12
  context: { params: Promise<{ id: string }> },
13
13
  ) {
14
- const denied = await guardApiAccess();
14
+ const denied = await guardApiAccess(request, "operator");
15
15
  if (denied) return denied;
16
16
  const deniedAction = guardApiActionAccess(request);
17
17
  if (deniedAction) return deniedAction;
@@ -158,7 +158,7 @@ export async function GET(
158
158
  request: NextRequest,
159
159
  context: { params: Promise<unknown> },
160
160
  ) {
161
- const denied = await guardApiAccess();
161
+ const denied = await guardApiAccess(undefined, "viewer");
162
162
  if (denied) return denied;
163
163
 
164
164
  const params = await context.params as { id?: unknown } | null;
@@ -89,7 +89,7 @@ export async function POST(
89
89
  request: NextRequest,
90
90
  { params }: { params: Promise<{ id: string }> },
91
91
  ): Promise<NextResponse> {
92
- const denied = await guardApiAccess();
92
+ const denied = await guardApiAccess(request, "operator");
93
93
  if (denied) return denied;
94
94
  const deniedAction = guardApiActionAccess(request);
95
95
  if (deniedAction) return deniedAction;
@@ -9,7 +9,7 @@ export async function POST(
9
9
  request: NextRequest,
10
10
  context: { params: Promise<{ id: string }> },
11
11
  ) {
12
- const denied = await guardApiAccess();
12
+ const denied = await guardApiAccess(request, "operator");
13
13
  if (denied) return denied;
14
14
  const deniedAction = guardApiActionAccess(request);
15
15
  if (deniedAction) return deniedAction;
@@ -221,7 +221,7 @@ export async function GET(
221
221
  request: NextRequest,
222
222
  context: { params: Promise<{ id: string }> },
223
223
  ) {
224
- const denied = await guardApiAccess();
224
+ const denied = await guardApiAccess(undefined, "viewer");
225
225
  if (denied) return denied;
226
226
 
227
227
  const params = await context.params;
@@ -14,7 +14,7 @@ export async function GET(
14
14
  request: NextRequest,
15
15
  context: { params: Promise<{ id: string }> },
16
16
  ): Promise<Response> {
17
- const denied = await guardApiAccess();
17
+ const denied = await guardApiAccess(request, "viewer");
18
18
  if (denied) return denied;
19
19
 
20
20
  const params = await context.params;
@@ -10,7 +10,7 @@ export async function POST(
10
10
  request: NextRequest,
11
11
  context: { params: Promise<{ id: string }> },
12
12
  ) {
13
- const denied = await guardApiAccess();
13
+ const denied = await guardApiAccess(request, "operator");
14
14
  if (denied) return denied;
15
15
  const deniedAction = guardApiActionAccess(request);
16
16
  if (deniedAction) return deniedAction;
@@ -173,7 +173,7 @@ export async function GET(
173
173
  { params }: { params: Promise<{ id: string }> },
174
174
  ) {
175
175
  try {
176
- const denied = await guardApiAccess();
176
+ const denied = await guardApiAccess(undefined, "viewer");
177
177
  if (denied) return denied;
178
178
  const { id } = await params;
179
179
  const sessionId = id.trim();
@@ -11,7 +11,7 @@ export async function POST(
11
11
  request: NextRequest,
12
12
  context: { params: Promise<{ id: string }> },
13
13
  ) {
14
- const denied = await guardApiAccess();
14
+ const denied = await guardApiAccess(request, "operator");
15
15
  if (denied) return denied;
16
16
  const deniedAction = guardApiActionAccess(request);
17
17
  if (deniedAction) return deniedAction;
@@ -8,7 +8,7 @@ export const dynamic = "force-dynamic";
8
8
 
9
9
  /** GET /api/sessions -- list current sessions for the dashboard. */
10
10
  export async function GET(request: NextRequest) {
11
- const denied = await guardApiAccess();
11
+ const denied = await guardApiAccess(undefined, "viewer");
12
12
  if (denied) return denied;
13
13
 
14
14
  try {