conductor-oss 0.2.18 → 0.2.20

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 (187) hide show
  1. package/dist/commands/dashboard.js +2 -2
  2. package/dist/commands/start.d.ts +3 -6
  3. package/dist/commands/start.d.ts.map +1 -1
  4. package/dist/commands/start.js +450 -220
  5. package/dist/commands/start.js.map +1 -1
  6. package/dist/index.js +0 -4
  7. package/dist/index.js.map +1 -1
  8. package/native/conductor +0 -0
  9. package/node_modules/@conductor-oss/core/dist/session-manager.js +1 -1
  10. package/node_modules/@conductor-oss/core/dist/session-manager.js.map +1 -1
  11. package/node_modules/@conductor-oss/plugin-agent-amp/package.json +1 -1
  12. package/node_modules/@conductor-oss/plugin-agent-ccr/package.json +1 -1
  13. package/node_modules/@conductor-oss/plugin-agent-claude-code/package.json +1 -1
  14. package/node_modules/@conductor-oss/plugin-agent-codex/package.json +1 -1
  15. package/node_modules/@conductor-oss/plugin-agent-cursor-cli/package.json +1 -1
  16. package/node_modules/@conductor-oss/plugin-agent-droid/package.json +1 -1
  17. package/node_modules/@conductor-oss/plugin-agent-gemini/package.json +1 -1
  18. package/node_modules/@conductor-oss/plugin-agent-github-copilot/package.json +1 -1
  19. package/node_modules/@conductor-oss/plugin-agent-opencode/package.json +1 -1
  20. package/node_modules/@conductor-oss/plugin-agent-qwen-code/package.json +1 -1
  21. package/node_modules/@conductor-oss/plugin-mcp-server/package.json +1 -1
  22. package/node_modules/@conductor-oss/plugin-notifier-desktop/package.json +1 -1
  23. package/node_modules/@conductor-oss/plugin-notifier-discord/package.json +1 -1
  24. package/node_modules/@conductor-oss/plugin-runtime-tmux/package.json +1 -1
  25. package/node_modules/@conductor-oss/plugin-scm-github/package.json +1 -1
  26. package/node_modules/@conductor-oss/plugin-terminal-web/package.json +1 -1
  27. package/node_modules/@conductor-oss/plugin-tracker-github/package.json +1 -1
  28. package/node_modules/@conductor-oss/plugin-workspace-worktree/package.json +1 -1
  29. package/package.json +21 -22
  30. package/web/.next/standalone/packages/web/.next/BUILD_ID +1 -1
  31. package/web/.next/standalone/packages/web/.next/app-path-routes-manifest.json +0 -1
  32. package/web/.next/standalone/packages/web/.next/build-manifest.json +2 -2
  33. package/web/.next/standalone/packages/web/.next/prerender-manifest.json +3 -3
  34. package/web/.next/standalone/packages/web/.next/routes-manifest.json +0 -6
  35. package/web/.next/standalone/packages/web/.next/server/app/_global-error.html +2 -2
  36. package/web/.next/standalone/packages/web/.next/server/app/_global-error.rsc +1 -1
  37. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  38. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  39. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  40. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  41. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  42. package/web/.next/standalone/packages/web/.next/server/app/_not-found/page/server-reference-manifest.json +7 -7
  43. package/web/.next/standalone/packages/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  44. package/web/.next/standalone/packages/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  45. package/web/.next/standalone/packages/web/.next/server/app/_not-found.html +1 -1
  46. package/web/.next/standalone/packages/web/.next/server/app/_not-found.rsc +3 -3
  47. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  48. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  49. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  50. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  51. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  52. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  53. package/web/.next/standalone/packages/web/.next/server/app/api/access/route.js.nft.json +1 -1
  54. package/web/.next/standalone/packages/web/.next/server/app/api/attachments/route.js.nft.json +1 -1
  55. package/web/.next/standalone/packages/web/.next/server/app/api/boards/route.js.nft.json +1 -1
  56. package/web/.next/standalone/packages/web/.next/server/app/api/config/route.js.nft.json +1 -1
  57. package/web/.next/standalone/packages/web/.next/server/app/api/context-files/route.js.nft.json +1 -1
  58. package/web/.next/standalone/packages/web/.next/server/app/api/events/route.js.nft.json +1 -1
  59. package/web/.next/standalone/packages/web/.next/server/app/api/filesystem/directory/route.js.nft.json +1 -1
  60. package/web/.next/standalone/packages/web/.next/server/app/api/github/repos/route.js.nft.json +1 -1
  61. package/web/.next/standalone/packages/web/.next/server/app/api/health/boards/route.js.nft.json +1 -1
  62. package/web/.next/standalone/packages/web/.next/server/app/api/health/sessions/route.js.nft.json +1 -1
  63. package/web/.next/standalone/packages/web/.next/server/app/api/notifications/route.js.nft.json +1 -1
  64. package/web/.next/standalone/packages/web/.next/server/app/api/preferences/route.js.nft.json +1 -1
  65. package/web/.next/standalone/packages/web/.next/server/app/api/repositories/route.js.nft.json +1 -1
  66. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/actions/route.js.nft.json +1 -1
  67. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/checks/route.js.nft.json +1 -1
  68. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/diff/route.js.nft.json +1 -1
  69. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feed/route.js.nft.json +1 -1
  70. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feedback/route.js.nft.json +1 -1
  71. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/files/route.js.nft.json +1 -1
  72. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/keys/route.js.nft.json +1 -1
  73. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/kill/route.js.nft.json +1 -1
  74. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/route.js.nft.json +1 -1
  75. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/stream/route.js.nft.json +1 -1
  76. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/restore/route.js.nft.json +1 -1
  77. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -1
  78. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/send/route.js.nft.json +1 -1
  79. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/route.js.nft.json +1 -1
  80. package/web/.next/standalone/packages/web/.next/server/app/api/spawn/route.js.nft.json +1 -1
  81. package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/branches/route.js.nft.json +1 -1
  82. package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/route.js +4 -4
  83. package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/route.js.nft.json +1 -1
  84. package/web/.next/standalone/packages/web/.next/server/app/index.html +1 -1
  85. package/web/.next/standalone/packages/web/.next/server/app/index.rsc +4 -4
  86. package/web/.next/standalone/packages/web/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  87. package/web/.next/standalone/packages/web/.next/server/app/index.segments/_full.segment.rsc +4 -4
  88. package/web/.next/standalone/packages/web/.next/server/app/index.segments/_head.segment.rsc +1 -1
  89. package/web/.next/standalone/packages/web/.next/server/app/index.segments/_index.segment.rsc +3 -3
  90. package/web/.next/standalone/packages/web/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  91. package/web/.next/standalone/packages/web/.next/server/app/page/server-reference-manifest.json +7 -7
  92. package/web/.next/standalone/packages/web/.next/server/app/page.js.nft.json +1 -1
  93. package/web/.next/standalone/packages/web/.next/server/app/page_client-reference-manifest.js +1 -1
  94. package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page/server-reference-manifest.json +7 -7
  95. package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page.js.nft.json +1 -1
  96. package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page_client-reference-manifest.js +1 -1
  97. package/web/.next/standalone/packages/web/.next/server/app/sign-in/[[...sign-in]]/page/server-reference-manifest.json +7 -7
  98. package/web/.next/standalone/packages/web/.next/server/app/sign-in/[[...sign-in]]/page.js.nft.json +1 -1
  99. package/web/.next/standalone/packages/web/.next/server/app/sign-in/[[...sign-in]]/page_client-reference-manifest.js +1 -1
  100. package/web/.next/standalone/packages/web/.next/server/app/unlock/page/server-reference-manifest.json +7 -7
  101. package/web/.next/standalone/packages/web/.next/server/app/unlock/page.js.nft.json +1 -1
  102. package/web/.next/standalone/packages/web/.next/server/app/unlock/page_client-reference-manifest.js +1 -1
  103. package/web/.next/standalone/packages/web/.next/server/app-paths-manifest.json +0 -1
  104. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__1ed2e6c1._.js +1 -1
  105. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__3d6b30a3._.js +1 -1
  106. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__a0b6570d._.js +3 -0
  107. package/web/.next/standalone/packages/web/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0e4dc4f7.js +2 -1
  108. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{[root-of-the-server]__12eb9005._.js → [root-of-the-server]__48817f02._.js} +2 -2
  109. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__6622b514._.js +1 -1
  110. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__869d9ac0._.js +1 -1
  111. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__9dc23e5a._.js +1 -1
  112. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_0e1412de._.js +1 -1
  113. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_69e05fca._.js +1 -1
  114. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_80efe193._.js +1 -1
  115. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_b6d31783._.js +1 -1
  116. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_c0f0e227._.js +1 -1
  117. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_f36ddaa9._.js +1 -1
  118. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@clerk_nextjs_dist_esm_app-router_38e7b35d._.js +3 -0
  119. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@clerk_nextjs_dist_esm_app-router_f665760b._.js +3 -0
  120. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_f2ebd7a9._.js +1 -1
  121. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/packages_web_src_79316445._.js +1 -1
  122. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/packages_web_src_a078c137._.js +1 -1
  123. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/packages_web_src_app_page_tsx_cd282e82._.js +1 -1
  124. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{packages_web_src_components_3809c507._.js → packages_web_src_components_6cab1c8c._.js} +1 -1
  125. package/web/.next/standalone/packages/web/.next/server/functions-config-manifest.json +1 -2
  126. package/web/.next/standalone/packages/web/.next/server/pages/404.html +1 -1
  127. package/web/.next/standalone/packages/web/.next/server/pages/500.html +2 -2
  128. package/web/.next/standalone/packages/web/.next/server/server-reference-manifest.js +1 -1
  129. package/web/.next/standalone/packages/web/.next/server/server-reference-manifest.json +8 -8
  130. package/web/.next/standalone/packages/web/.next/static/chunks/062888342200567f.js +1 -0
  131. package/web/.next/{static/chunks/28dd6ef2af62b509.js → standalone/packages/web/.next/static/chunks/3b757dce050133c8.js} +2 -2
  132. package/web/.next/standalone/packages/web/.next/static/chunks/{c959976264f14eba.js → 5c7e8425945ad682.js} +1 -1
  133. package/web/.next/standalone/packages/web/.next/static/chunks/6c9a11faed9daf4d.js +1 -0
  134. package/web/.next/standalone/packages/web/.next/static/chunks/8221b78965a50858.js +1 -0
  135. package/web/.next/standalone/packages/web/.next/static/chunks/8de84e208e201d72.css +3 -0
  136. package/web/.next/standalone/packages/web/.next/static/chunks/{e862e73b22fe29c2.js → c4ea57fb949fb623.js} +1 -1
  137. package/web/.next/standalone/packages/web/src/components/layout/TopBar.tsx +8 -10
  138. package/web/.next/standalone/packages/web/src/features/dashboard/DashboardClient.tsx +32 -16
  139. package/web/.next/standalone/packages/web/src/features/sessions/SessionPageClient.tsx +12 -2
  140. package/web/.next/standalone/packages/web/src/proxy.ts +1 -0
  141. package/web/.next/static/chunks/062888342200567f.js +1 -0
  142. package/web/.next/{standalone/packages/web/.next/static/chunks/28dd6ef2af62b509.js → static/chunks/3b757dce050133c8.js} +2 -2
  143. package/web/.next/static/chunks/{c959976264f14eba.js → 5c7e8425945ad682.js} +1 -1
  144. package/web/.next/static/chunks/6c9a11faed9daf4d.js +1 -0
  145. package/web/.next/static/chunks/8221b78965a50858.js +1 -0
  146. package/web/.next/static/chunks/8de84e208e201d72.css +3 -0
  147. package/web/.next/static/chunks/{e862e73b22fe29c2.js → c4ea57fb949fb623.js} +1 -1
  148. package/dist/commands/watch.d.ts +0 -12
  149. package/dist/commands/watch.d.ts.map +0 -1
  150. package/dist/commands/watch.js +0 -84
  151. package/dist/commands/watch.js.map +0 -1
  152. package/dist/commands/webhook.d.ts +0 -12
  153. package/dist/commands/webhook.d.ts.map +0 -1
  154. package/dist/commands/webhook.js +0 -59
  155. package/dist/commands/webhook.js.map +0 -1
  156. package/node_modules/@conductor-oss/plugin-webhook/dist/index.d.ts +0 -28
  157. package/node_modules/@conductor-oss/plugin-webhook/dist/index.d.ts.map +0 -1
  158. package/node_modules/@conductor-oss/plugin-webhook/dist/index.js +0 -295
  159. package/node_modules/@conductor-oss/plugin-webhook/dist/index.js.map +0 -1
  160. package/node_modules/@conductor-oss/plugin-webhook/package.json +0 -11
  161. package/web/.next/standalone/packages/web/.next/server/app/api/agents/route/app-paths-manifest.json +0 -3
  162. package/web/.next/standalone/packages/web/.next/server/app/api/agents/route/build-manifest.json +0 -11
  163. package/web/.next/standalone/packages/web/.next/server/app/api/agents/route/server-reference-manifest.json +0 -4
  164. package/web/.next/standalone/packages/web/.next/server/app/api/agents/route.js +0 -8
  165. package/web/.next/standalone/packages/web/.next/server/app/api/agents/route.js.map +0 -5
  166. package/web/.next/standalone/packages/web/.next/server/app/api/agents/route.js.nft.json +0 -1
  167. package/web/.next/standalone/packages/web/.next/server/app/api/agents/route_client-reference-manifest.js +0 -2
  168. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__7633d324._.js +0 -4
  169. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__bf8faac8._.js +0 -4
  170. package/web/.next/standalone/packages/web/.next/server/chunks/packages_web__next-internal_server_app_api_agents_route_actions_29063d1a.js +0 -3
  171. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@clerk_nextjs_dist_esm_app-router_78af9fdf._.js +0 -3
  172. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@clerk_nextjs_dist_esm_app-router_c4bad84a._.js +0 -3
  173. package/web/.next/standalone/packages/web/.next/static/chunks/1e67fbc3874d3f51.js +0 -1
  174. package/web/.next/standalone/packages/web/.next/static/chunks/2b2a24dff50e7dc9.js +0 -1
  175. package/web/.next/standalone/packages/web/.next/static/chunks/483eb2824f5282c7.js +0 -1
  176. package/web/.next/standalone/packages/web/.next/static/chunks/860d84e1f09476a4.css +0 -3
  177. package/web/.next/standalone/packages/web/src/app/api/agents/route.ts +0 -223
  178. package/web/.next/static/chunks/1e67fbc3874d3f51.js +0 -1
  179. package/web/.next/static/chunks/2b2a24dff50e7dc9.js +0 -1
  180. package/web/.next/static/chunks/483eb2824f5282c7.js +0 -1
  181. package/web/.next/static/chunks/860d84e1f09476a4.css +0 -3
  182. /package/web/.next/standalone/packages/web/.next/static/{eSF3qxz6RT8UXiwr-uibJ → P8IBAo_woCzrGXJiYCZto}/_buildManifest.js +0 -0
  183. /package/web/.next/standalone/packages/web/.next/static/{eSF3qxz6RT8UXiwr-uibJ → P8IBAo_woCzrGXJiYCZto}/_clientMiddlewareManifest.json +0 -0
  184. /package/web/.next/standalone/packages/web/.next/static/{eSF3qxz6RT8UXiwr-uibJ → P8IBAo_woCzrGXJiYCZto}/_ssgManifest.js +0 -0
  185. /package/web/.next/static/{eSF3qxz6RT8UXiwr-uibJ → P8IBAo_woCzrGXJiYCZto}/_buildManifest.js +0 -0
  186. /package/web/.next/static/{eSF3qxz6RT8UXiwr-uibJ → P8IBAo_woCzrGXJiYCZto}/_clientMiddlewareManifest.json +0 -0
  187. /package/web/.next/static/{eSF3qxz6RT8UXiwr-uibJ → P8IBAo_woCzrGXJiYCZto}/_ssgManifest.js +0 -0
@@ -2,32 +2,30 @@
2
2
 
3
3
  import { memo } from "react";
4
4
  import { Settings } from "lucide-react";
5
- import type { DashboardSession } from "@/lib/types";
6
5
 
7
6
  interface TopBarProps {
8
- session: DashboardSession | null;
9
- fallbackTitle?: string;
7
+ title?: string;
10
8
  onOpenPreferences?: () => void;
11
9
  }
12
10
 
13
- export const TopBar = memo(function TopBar({ session, fallbackTitle, onOpenPreferences }: TopBarProps) {
14
- const title = session?.summary ?? fallbackTitle ?? "Create Workspace";
15
-
11
+ export const TopBar = memo(function TopBar({ title, onOpenPreferences }: TopBarProps) {
16
12
  return (
17
- <header className="flex h-[36px] items-center border-b border-[var(--vk-border)] bg-[var(--vk-bg-panel)] px-2 text-[11px] text-[var(--vk-text-muted)] sm:h-[33px]">
13
+ <header className="flex h-12 items-center border-b border-[var(--vk-border)] bg-[var(--vk-bg-panel)] px-4 text-[13px] text-[var(--vk-text-muted)] sm:h-14 sm:px-5 sm:text-[14px]">
18
14
  <div className="min-w-0 flex-1 text-center">
19
- <span className="block truncate">{title}</span>
15
+ <span className="block truncate font-medium tracking-[0.01em] text-[var(--vk-text-normal)]">
16
+ {title ?? "All Projects"}
17
+ </span>
20
18
  </div>
21
19
  {onOpenPreferences ? (
22
20
  <div className="ml-1 flex shrink-0">
23
21
  <button
24
22
  type="button"
25
23
  onClick={onOpenPreferences}
26
- className="inline-flex h-6 w-6 items-center justify-center rounded-[4px] text-[var(--vk-text-muted)] hover:bg-[var(--vk-bg-hover)] hover:text-[var(--vk-text-normal)]"
24
+ className="inline-flex h-8 w-8 items-center justify-center rounded-[6px] text-[var(--vk-text-muted)] hover:bg-[var(--vk-bg-hover)] hover:text-[var(--vk-text-normal)]"
27
25
  aria-label="Open preferences"
28
26
  title="Preferences"
29
27
  >
30
- <Settings className="h-3.5 w-3.5" />
28
+ <Settings className="h-4 w-4" />
31
29
  </button>
32
30
  </div>
33
31
  ) : null}
@@ -75,6 +75,8 @@ const EXECUTOR_ORDER = [
75
75
  "ccr",
76
76
  ];
77
77
 
78
+ const DEFAULT_AGENT = "claude-code";
79
+
78
80
  const EXECUTOR_LABELS: Record<string, string> = {
79
81
  codex: "Codex",
80
82
  gemini: "Gemini",
@@ -928,6 +930,17 @@ export default function DashboardClient() {
928
930
  () => projects.find((project) => project.id === selectedProjectId) ?? null,
929
931
  [projects, selectedProjectId],
930
932
  );
933
+ const topBarTitle = useMemo(() => {
934
+ if (selectedSession) {
935
+ return [selectedSession.projectId, selectedSession.branch].filter(Boolean).join(" \u00b7 ");
936
+ }
937
+
938
+ if (selectedProject) {
939
+ return [selectedProject.id, selectedProject.defaultBranch || "main"].filter(Boolean).join(" \u00b7 ");
940
+ }
941
+
942
+ return "All Projects";
943
+ }, [selectedProject, selectedSession]);
931
944
 
932
945
  const agentOptions = useMemo(() => {
933
946
  const safeAgents = Array.isArray(agents)
@@ -950,7 +963,7 @@ export default function DashboardClient() {
950
963
  opts.add(selectedAgent);
951
964
  }
952
965
  if (opts.size === 0) {
953
- opts.add(preferences?.codingAgent || "qwen-code");
966
+ opts.add(preferences?.codingAgent || DEFAULT_AGENT);
954
967
  }
955
968
  return [...opts];
956
969
  }, [agents, preferences?.codingAgent, projects, selectedAgent]);
@@ -1017,12 +1030,12 @@ export default function DashboardClient() {
1017
1030
  throw new Error(data?.error ?? `Failed to load preferences: ${res.status}`);
1018
1031
  }
1019
1032
  if (cancelled) return;
1020
- const normalized = normalizePreferences(data?.preferences, "qwen-code");
1033
+ const normalized = normalizePreferences(data?.preferences, DEFAULT_AGENT);
1021
1034
  setPreferences(normalized);
1022
1035
  setPreferencesError(null);
1023
1036
  } catch (err) {
1024
1037
  if (cancelled) return;
1025
- setPreferences(normalizePreferences(null, "qwen-code"));
1038
+ setPreferences(normalizePreferences(null, DEFAULT_AGENT));
1026
1039
  setPreferencesError(err instanceof Error ? err.message : "Failed to load preferences");
1027
1040
  } finally {
1028
1041
  if (!cancelled) {
@@ -1063,17 +1076,17 @@ export default function DashboardClient() {
1063
1076
  useEffect(() => {
1064
1077
  if (agentOptions.length === 0) return;
1065
1078
  if (!selectedAgent || !agentOptions.includes(selectedAgent)) {
1066
- const fallbackAgent = preferences?.codingAgent || "qwen-code";
1079
+ const fallbackAgent = preferences?.codingAgent || DEFAULT_AGENT;
1067
1080
  setSelectedAgent(
1068
1081
  agentOptions.includes(fallbackAgent)
1069
1082
  ? fallbackAgent
1070
- : agentOptions[0] ?? "qwen-code",
1083
+ : agentOptions[0] ?? DEFAULT_AGENT,
1071
1084
  );
1072
1085
  }
1073
1086
  }, [agentOptions, preferences?.codingAgent, selectedAgent]);
1074
1087
 
1075
1088
  useEffect(() => {
1076
- const effectiveAgent = selectedAgent || selectedProject?.agent || preferences?.codingAgent || "qwen-code";
1089
+ const effectiveAgent = selectedAgent || selectedProject?.agent || preferences?.codingAgent || DEFAULT_AGENT;
1077
1090
  const preferredModel = selectedProject && normalizeAgentName(selectedProject.agent) === normalizeAgentName(effectiveAgent)
1078
1091
  ? selectedProject.agentModel
1079
1092
  : null;
@@ -1110,7 +1123,7 @@ export default function DashboardClient() {
1110
1123
  if (!res.ok) {
1111
1124
  throw new Error(data?.error ?? `Failed to save preferences: ${res.status}`);
1112
1125
  }
1113
- const normalized = normalizePreferences(data?.preferences, next.codingAgent || "qwen-code");
1126
+ const normalized = normalizePreferences(data?.preferences, next.codingAgent || DEFAULT_AGENT);
1114
1127
  setPreferences(normalized);
1115
1128
  setSelectedAgent(normalized.codingAgent);
1116
1129
  if (options?.closeDialog !== false) {
@@ -1165,7 +1178,7 @@ export default function DashboardClient() {
1165
1178
  return;
1166
1179
  }
1167
1180
 
1168
- const effectiveAgent = selectedAgent || "qwen-code";
1181
+ const effectiveAgent = selectedAgent || DEFAULT_AGENT;
1169
1182
  const selectedAgentState = agentStatesByName[normalizeAgentName(effectiveAgent)] ?? null;
1170
1183
  if (selectedAgentState && !selectedAgentState.ready) {
1171
1184
  setCreateError(
@@ -1300,14 +1313,18 @@ export default function DashboardClient() {
1300
1313
  }, [refreshConfig, syncSidebarForViewport]);
1301
1314
 
1302
1315
  const onboardingRequired = !preferencesLoading && !!preferences && !preferences.onboardingAcknowledged;
1303
- const resolvedPreferences = preferences ?? normalizePreferences(null, selectedAgent || "qwen-code");
1304
- const resolvedCodingAgent = selectedAgent || resolvedPreferences.codingAgent || "qwen-code";
1316
+ const resolvedPreferences = preferences ?? normalizePreferences(null, selectedAgent || DEFAULT_AGENT);
1317
+ const resolvedCodingAgent = selectedAgent || resolvedPreferences.codingAgent || DEFAULT_AGENT;
1305
1318
 
1306
1319
  const handleSelectProject = useCallback((projectId: string | null) => {
1307
1320
  setSelectedProjectId(projectId);
1308
1321
  setSelectedSessionId(null);
1322
+ const nextAgent = projectId
1323
+ ? projects.find((project) => project.id === projectId)?.agent
1324
+ : preferences?.codingAgent;
1325
+ setSelectedAgent(nextAgent || DEFAULT_AGENT);
1309
1326
  closeSidebarOnMobile();
1310
- }, [closeSidebarOnMobile]);
1327
+ }, [closeSidebarOnMobile, preferences?.codingAgent, projects]);
1311
1328
 
1312
1329
  const handleSelectSession = useCallback((id: string) => {
1313
1330
  setSelectedSessionId(id);
@@ -1459,8 +1476,7 @@ export default function DashboardClient() {
1459
1476
  sidebar={sidebarContent}
1460
1477
  >
1461
1478
  <TopBar
1462
- session={selectedSession}
1463
- fallbackTitle={selectedProjectId ?? "All Projects"}
1479
+ title={topBarTitle}
1464
1480
  onOpenPreferences={handleOpenPreferences}
1465
1481
  />
1466
1482
 
@@ -1583,7 +1599,7 @@ function NewWorkspaceDialog({
1583
1599
  const orderedAgentOptions = useMemo(() => {
1584
1600
  const opts = [...new Set(agentOptions)];
1585
1601
  if (opts.length === 0) {
1586
- opts.push(defaultAgent || "qwen-code");
1602
+ opts.push(defaultAgent || DEFAULT_AGENT);
1587
1603
  }
1588
1604
 
1589
1605
  const rankMap = new Map(EXECUTOR_ORDER.map((name, index) => [name, index]));
@@ -1597,7 +1613,7 @@ function NewWorkspaceDialog({
1597
1613
 
1598
1614
  useEffect(() => {
1599
1615
  if (!orderedAgentOptions.includes(agent)) {
1600
- setAgent(orderedAgentOptions[0] ?? "qwen-code");
1616
+ setAgent(orderedAgentOptions[0] ?? DEFAULT_AGENT);
1601
1617
  }
1602
1618
  }, [agent, orderedAgentOptions]);
1603
1619
 
@@ -3349,7 +3365,7 @@ function SettingsDialog({
3349
3365
  opts.add(codingAgent);
3350
3366
  }
3351
3367
  if (opts.size === 0) {
3352
- opts.add("qwen-code");
3368
+ opts.add(DEFAULT_AGENT);
3353
3369
  }
3354
3370
  const rankMap = new Map(EXECUTOR_ORDER.map((name, index) => [name, index]));
3355
3371
  return [...opts].sort((left, right) => {
@@ -30,6 +30,17 @@ export default function SessionPageClient() {
30
30
  () => dashboardSessions.find((session) => session.id === params.id) ?? null,
31
31
  [dashboardSessions, params.id],
32
32
  );
33
+ const topBarTitle = useMemo(() => {
34
+ if (selectedSession) {
35
+ return [selectedSession.projectId, selectedSession.branch].filter(Boolean).join(" \u00b7 ");
36
+ }
37
+
38
+ if (selectedProjectId) {
39
+ return selectedProjectId;
40
+ }
41
+
42
+ return "Session";
43
+ }, [selectedProjectId, selectedSession]);
33
44
 
34
45
  useEffect(() => {
35
46
  if (selectedSession?.projectId) {
@@ -114,8 +125,7 @@ export default function SessionPageClient() {
114
125
  }
115
126
  >
116
127
  <TopBar
117
- session={selectedSession}
118
- fallbackTitle={selectedSession?.projectId ?? "Session"}
128
+ title={topBarTitle}
119
129
  />
120
130
  <div className="min-h-0 flex-1 overflow-hidden">
121
131
  <SessionDetail sessionId={params.id} />
@@ -14,6 +14,7 @@ const clerkConfigured = Boolean(
14
14
 
15
15
  const backendUrl = process.env.CONDUCTOR_BACKEND_URL?.trim() || "";
16
16
  const RUST_API_PREFIXES = [
17
+ "/api/agents",
17
18
  "/api/config",
18
19
  "/api/preferences",
19
20
  "/api/access",