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.
- package/README.md +29 -6
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +3 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/setup.d.ts +30 -0
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +131 -29
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/start.d.ts +3 -0
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +209 -15
- package/dist/commands/start.js.map +1 -1
- package/dist/index.js +1 -1
- package/node_modules/@conductor-oss/core/dist/board-diagnostics.d.ts.map +1 -1
- package/node_modules/@conductor-oss/core/dist/board-diagnostics.js +12 -2
- package/node_modules/@conductor-oss/core/dist/board-diagnostics.js.map +1 -1
- package/node_modules/@conductor-oss/core/dist/board-watcher.d.ts.map +1 -1
- package/node_modules/@conductor-oss/core/dist/board-watcher.js +18 -5
- package/node_modules/@conductor-oss/core/dist/board-watcher.js.map +1 -1
- package/node_modules/@conductor-oss/core/dist/config.d.ts +1 -1
- package/node_modules/@conductor-oss/core/dist/config.d.ts.map +1 -1
- package/node_modules/@conductor-oss/core/dist/config.js +36 -1
- package/node_modules/@conductor-oss/core/dist/config.js.map +1 -1
- package/node_modules/@conductor-oss/core/dist/index.d.ts +1 -0
- package/node_modules/@conductor-oss/core/dist/index.d.ts.map +1 -1
- package/node_modules/@conductor-oss/core/dist/index.js +1 -0
- package/node_modules/@conductor-oss/core/dist/index.js.map +1 -1
- package/node_modules/@conductor-oss/core/dist/project-paths.d.ts +2 -0
- package/node_modules/@conductor-oss/core/dist/project-paths.d.ts.map +1 -0
- package/node_modules/@conductor-oss/core/dist/project-paths.js +67 -0
- package/node_modules/@conductor-oss/core/dist/project-paths.js.map +1 -0
- package/node_modules/@conductor-oss/core/dist/scaffold.d.ts +14 -0
- package/node_modules/@conductor-oss/core/dist/scaffold.d.ts.map +1 -1
- package/node_modules/@conductor-oss/core/dist/scaffold.js +27 -4
- package/node_modules/@conductor-oss/core/dist/scaffold.js.map +1 -1
- package/node_modules/@conductor-oss/core/dist/types.d.ts +71 -0
- package/node_modules/@conductor-oss/core/dist/types.d.ts.map +1 -1
- package/node_modules/@conductor-oss/core/dist/types.js +244 -0
- package/node_modules/@conductor-oss/core/dist/types.js.map +1 -1
- package/node_modules/@conductor-oss/core/package.json +1 -1
- package/node_modules/@conductor-oss/plugin-agent-amp/dist/index.js +1 -1
- package/node_modules/@conductor-oss/plugin-agent-amp/package.json +2 -2
- package/node_modules/@conductor-oss/plugin-agent-ccr/dist/index.js +1 -1
- package/node_modules/@conductor-oss/plugin-agent-ccr/package.json +2 -2
- package/node_modules/@conductor-oss/plugin-agent-claude-code/dist/index.js +1 -1
- package/node_modules/@conductor-oss/plugin-agent-claude-code/package.json +2 -2
- package/node_modules/@conductor-oss/plugin-agent-codex/dist/index.js +1 -1
- package/node_modules/@conductor-oss/plugin-agent-codex/package.json +2 -2
- package/node_modules/@conductor-oss/plugin-agent-cursor-cli/dist/index.js +1 -1
- package/node_modules/@conductor-oss/plugin-agent-cursor-cli/package.json +2 -2
- package/node_modules/@conductor-oss/plugin-agent-droid/dist/index.js +1 -1
- package/node_modules/@conductor-oss/plugin-agent-droid/package.json +2 -2
- package/node_modules/@conductor-oss/plugin-agent-gemini/dist/index.js +1 -1
- package/node_modules/@conductor-oss/plugin-agent-gemini/package.json +2 -2
- package/node_modules/@conductor-oss/plugin-agent-github-copilot/dist/index.js +1 -1
- package/node_modules/@conductor-oss/plugin-agent-github-copilot/package.json +2 -2
- package/node_modules/@conductor-oss/plugin-agent-opencode/dist/index.js +1 -1
- package/node_modules/@conductor-oss/plugin-agent-opencode/package.json +2 -2
- package/node_modules/@conductor-oss/plugin-agent-qwen-code/dist/index.js +10 -6
- package/node_modules/@conductor-oss/plugin-agent-qwen-code/package.json +2 -2
- package/node_modules/@conductor-oss/plugin-mcp-server/dist/index.js +1 -1
- package/node_modules/@conductor-oss/plugin-mcp-server/package.json +2 -2
- package/node_modules/@conductor-oss/plugin-notifier-desktop/dist/index.js +1 -1
- package/node_modules/@conductor-oss/plugin-notifier-desktop/package.json +2 -2
- package/node_modules/@conductor-oss/plugin-notifier-discord/dist/index.js +1 -1
- package/node_modules/@conductor-oss/plugin-notifier-discord/package.json +2 -2
- package/node_modules/@conductor-oss/plugin-runtime-tmux/dist/index.js +1 -1
- package/node_modules/@conductor-oss/plugin-runtime-tmux/package.json +2 -2
- package/node_modules/@conductor-oss/plugin-scm-github/dist/index.js +1 -1
- package/node_modules/@conductor-oss/plugin-scm-github/package.json +2 -2
- package/node_modules/@conductor-oss/plugin-terminal-web/dist/index.js +1 -1
- package/node_modules/@conductor-oss/plugin-terminal-web/package.json +2 -2
- package/node_modules/@conductor-oss/plugin-tracker-github/dist/index.js +1 -1
- package/node_modules/@conductor-oss/plugin-tracker-github/package.json +2 -2
- package/node_modules/@conductor-oss/plugin-webhook/package.json +2 -2
- package/node_modules/@conductor-oss/plugin-workspace-worktree/dist/index.js +1 -1
- package/node_modules/@conductor-oss/plugin-workspace-worktree/package.json +2 -2
- package/package.json +22 -21
- package/web/.next/standalone/packages/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/packages/web/.next/app-path-routes-manifest.json +5 -1
- package/web/.next/standalone/packages/web/.next/build-manifest.json +4 -4
- package/web/.next/standalone/packages/web/.next/routes-manifest.json +24 -0
- package/web/.next/standalone/packages/web/.next/server/app/_global-error/page/build-manifest.json +2 -2
- package/web/.next/standalone/packages/web/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/standalone/packages/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/_not-found/page/build-manifest.json +2 -2
- package/web/.next/standalone/packages/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/_not-found.html +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/_not-found.rsc +9 -9
- package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_full.segment.rsc +9 -9
- package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_head.segment.rsc +3 -3
- package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_index.segment.rsc +5 -5
- package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
- package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/web/.next/standalone/packages/web/.next/server/app/api/access/route/app-paths-manifest.json +3 -0
- package/web/.next/standalone/packages/web/.next/server/app/api/access/route/build-manifest.json +11 -0
- package/web/.next/standalone/packages/web/.next/server/app/api/access/route/server-reference-manifest.json +4 -0
- package/web/.next/standalone/packages/web/.next/server/app/api/access/route.js +11 -0
- package/web/.next/standalone/packages/web/.next/server/app/api/access/route.js.map +5 -0
- package/web/.next/standalone/packages/web/.next/server/app/api/access/route.js.nft.json +1 -0
- package/web/.next/standalone/packages/web/.next/server/app/api/access/route_client-reference-manifest.js +2 -0
- package/web/.next/standalone/packages/web/.next/server/app/api/agents/route.js +5 -3
- package/web/.next/standalone/packages/web/.next/server/app/api/agents/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/attachments/route.js +4 -2
- package/web/.next/standalone/packages/web/.next/server/app/api/attachments/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/auth/session/route/app-paths-manifest.json +3 -0
- package/web/.next/standalone/packages/web/.next/server/app/api/auth/session/route/build-manifest.json +11 -0
- package/web/.next/standalone/packages/web/.next/server/app/api/auth/session/route/server-reference-manifest.json +4 -0
- package/web/.next/standalone/packages/web/.next/server/app/api/auth/session/route.js +8 -0
- package/web/.next/standalone/packages/web/.next/server/app/api/auth/session/route.js.map +5 -0
- package/web/.next/standalone/packages/web/.next/server/app/api/auth/session/route.js.nft.json +1 -0
- package/web/.next/standalone/packages/web/.next/server/app/api/auth/session/route_client-reference-manifest.js +2 -0
- package/web/.next/standalone/packages/web/.next/server/app/api/boards/route.js +5 -3
- package/web/.next/standalone/packages/web/.next/server/app/api/boards/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/config/route.js +4 -2
- package/web/.next/standalone/packages/web/.next/server/app/api/config/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/context-files/route.js +3 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/context-files/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/events/route.js +4 -2
- package/web/.next/standalone/packages/web/.next/server/app/api/events/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/filesystem/directory/route.js +3 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/filesystem/directory/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/github/repos/route.js +4 -2
- package/web/.next/standalone/packages/web/.next/server/app/api/github/repos/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/health/boards/route.js +3 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/health/boards/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/preferences/route.js +5 -3
- package/web/.next/standalone/packages/web/.next/server/app/api/preferences/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/repositories/route.js +5 -3
- package/web/.next/standalone/packages/web/.next/server/app/api/repositories/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/checks/route.js +4 -2
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/checks/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/diff/route.js +4 -2
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/diff/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feedback/route.js +4 -2
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feedback/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/files/route.js +3 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/files/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/keys/route.js +3 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/keys/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/kill/route.js +4 -2
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/kill/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/route.js +4 -2
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/stream/route.js +4 -2
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/stream/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/restore/route.js +4 -2
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/restore/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/route.js +3 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/send/route.js +4 -2
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/send/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/route.js +3 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/spawn/route.js +5 -3
- package/web/.next/standalone/packages/web/.next/server/app/api/spawn/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/branches/route.js +3 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/branches/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/route.js +5 -3
- package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/auth/grant/route/app-paths-manifest.json +3 -0
- package/web/.next/standalone/packages/web/.next/server/app/auth/grant/route/build-manifest.json +11 -0
- package/web/.next/standalone/packages/web/.next/server/app/auth/grant/route/server-reference-manifest.json +4 -0
- package/web/.next/standalone/packages/web/.next/server/app/auth/grant/route.js +8 -0
- package/web/.next/standalone/packages/web/.next/server/app/auth/grant/route.js.map +5 -0
- package/web/.next/standalone/packages/web/.next/server/app/auth/grant/route.js.nft.json +1 -0
- package/web/.next/standalone/packages/web/.next/server/app/auth/grant/route_client-reference-manifest.js +2 -0
- package/web/.next/standalone/packages/web/.next/server/app/index.html +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/index.rsc +4 -4
- package/web/.next/standalone/packages/web/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/web/.next/standalone/packages/web/.next/server/app/index.segments/_full.segment.rsc +4 -4
- package/web/.next/standalone/packages/web/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/index.segments/_index.segment.rsc +3 -3
- package/web/.next/standalone/packages/web/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/web/.next/standalone/packages/web/.next/server/app/page/build-manifest.json +2 -2
- package/web/.next/standalone/packages/web/.next/server/app/page.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page/build-manifest.json +2 -2
- package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/sign-in/[[...sign-in]]/page/build-manifest.json +2 -2
- package/web/.next/standalone/packages/web/.next/server/app/sign-in/[[...sign-in]]/page.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/sign-in/[[...sign-in]]/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/unlock/page/app-paths-manifest.json +3 -0
- package/web/.next/standalone/packages/web/.next/server/app/unlock/page/build-manifest.json +18 -0
- package/web/.next/standalone/packages/web/.next/server/app/unlock/page/next-font-manifest.json +14 -0
- package/web/.next/standalone/packages/web/.next/server/app/unlock/page/react-loadable-manifest.json +1 -0
- package/web/.next/standalone/packages/web/.next/server/app/unlock/page/server-reference-manifest.json +110 -0
- package/web/.next/standalone/packages/web/.next/server/app/unlock/page.js +19 -0
- package/web/.next/standalone/packages/web/.next/server/app/unlock/page.js.map +5 -0
- package/web/.next/standalone/packages/web/.next/server/app/unlock/page.js.nft.json +1 -0
- package/web/.next/standalone/packages/web/.next/server/app/unlock/page_client-reference-manifest.js +2 -0
- package/web/.next/standalone/packages/web/.next/server/app-paths-manifest.json +5 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/1bc17_next_dist_esm_build_templates_app-route_1651710d.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/1bc17_next_dist_esm_build_templates_app-route_34b04c2b.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/1bc17_next_dist_esm_build_templates_app-route_9c655a1d.js +3 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/1bc17_next_dist_esm_build_templates_app-route_b41c4976.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/1bc17_next_dist_esm_build_templates_app-route_f4104ae4.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__005aa909._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__03ff76ee._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__07ec6d5c._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__0a0f0f01._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__0ad3545b._.js +5 -5
- package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__39e2947e._.js → [root-of-the-server]__0c65150d._.js} +2 -2
- package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__000a39bb._.js → [root-of-the-server]__0d615ef4._.js} +2 -2
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__13ad088c._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__14b1d4a3._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__4266ed21._.js → [root-of-the-server]__14d277b3._.js} +2 -2
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__1741fb8a._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__17d81825._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__04d7f8e9._.js → [root-of-the-server]__1b7c6a55._.js} +2 -2
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__1e288076._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__1f626a16._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__1f712b77._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__2062aaab._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__206c3d8a._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__9469f247._.js → [root-of-the-server]__230d54da._.js} +2 -2
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__24d8e6fc._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__2556a816._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__2af6c2e0._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__2d57abda._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__30b0f109._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__30c75561._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__31c39bd9._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__49d4f276._.js → [root-of-the-server]__341657dd._.js} +2 -2
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__34a19860._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__3fde7043._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__40c8037e._.js +2 -2
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__41ee872a._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__44606e04._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__44d59fd0._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__459839a6._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__46a8e776._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__48875cbb._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__53306f53._.js → [root-of-the-server]__488ab4b2._.js} +2 -2
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__4ac9d639._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__4c3fb752._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__4dab6a6a._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__544326ac._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__5494c5a2._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__54a218f0._.js +3 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__54a76cd2._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__5661ca72._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__568f0a6e._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__5cd49624._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__5d76c5af._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__5e0533de._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__5f628cf2._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__62608541._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6d62709d._.js +5 -5
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6e4e09be._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__70258e45._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__917adaec._.js → [root-of-the-server]__711dc459._.js} +2 -2
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__720136dd._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__749331b0._.js +3 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__755c7e10._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__778e46a1._.js +5 -5
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__7e6ea46e._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__7f023a04._.js +4 -4
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__7f2ed2cd._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__7fa52da6._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__82171aa3._.js +9 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__84362910._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__848eb266._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__8596d782._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__85c5cb36._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__878fbacc._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__881858fa._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__885e3a00._.js +3 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__893f6b3b._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__8ac30f97._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__8c519453._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__919845e0._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__6b396859._.js → [root-of-the-server]__927b9bce._.js} +2 -2
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__93b3582e._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__964f4e89._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__96633022._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__98697e45._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__997ebfca._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__9c930222._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__9f36b7ec._.js +5 -5
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__a44f91a4._.js +3 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__3319a78c._.js → [root-of-the-server]__a5d13971._.js} +2 -2
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__a6c7bd91._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ae580a1a._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__af533b5e._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__afa79f55._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__b057f7b2._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__b59abfbd._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__bd8ace80._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__be0f2c29._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__bea07e07._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__c8618cb1._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__caf8e7cb._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__cb112606._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__cb51f2e3._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__cba32afb._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__cc74ea40._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__cd3692a0._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__cf3cdecd._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__d09e7a99._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__d538c110._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__d93447b9._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__d9c80b18._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__dc0959da._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__dda8eac1._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__df2c6efe._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__e113f6df._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__e2573a77._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__e2d60274._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__e308bb89._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__e345a443._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__e80a520f._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ea0bb124._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ef773ea6._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__f0d15920._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__b029d2c1._.js → [root-of-the-server]__f2f30c04._.js} +2 -2
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__f47a2a9e._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__f48eb2d4._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__f6a8bbd9._.js +12 -12
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__faceea9b._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__fb6ab669._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__fcf96768._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__fdaa8058._.js +7 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ff2b205d._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/packages_core_dist_index_cdd30418.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_agent-amp_dist_index_bf3d8239.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_agent-ccr_dist_index_69cbf726.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_agent-claude-code_dist_index_31314e43.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_agent-cursor-cli_dist_index_8d5cc426.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_agent-droid_dist_index_f731227a.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_agent-gemini_dist_index_b2d219e8.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_agent-github-copilot_dist_index_9f80cb45.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_agent-opencode_dist_index_7c7015da.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_agent-qwen-code_dist_index_46dd8653.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_notifier-desktop_dist_index_ef3473f0.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_notifier-discord_dist_index_34257226.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_scm-github_dist_index_3b5a621e.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_terminal-web_dist_index_1e0706d3.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/packages_plugins_tracker-github_dist_index_2d7af62f.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/packages_web__next-internal_server_app_api_access_route_actions_06740e99.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/packages_web__next-internal_server_app_api_auth_session_route_actions_078c0ee4.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/packages_web__next-internal_server_app_auth_grant_route_actions_13ba4421.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/packages_web_src_lib_13fee5eb._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/packages_web_src_lib_d64596cc._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{[root-of-the-server]__1ddf22db._.js → [root-of-the-server]__1012a4c8._.js} +2 -2
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{[root-of-the-server]__ed81e796._.js → [root-of-the-server]__81affb12._.js} +2 -2
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__95e85d3d._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{[root-of-the-server]__f577d85a._.js → [root-of-the-server]__9d698773._.js} +2 -2
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__a38f483b._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{[root-of-the-server]__3bf3fbfb._.js → [root-of-the-server]__c09a0c60._.js} +2 -2
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__d9dde485._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{[root-of-the-server]__d5970f3e._.js → [root-of-the-server]__dd435d80._.js} +2 -2
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{[root-of-the-server]__469db3c3._.js → [root-of-the-server]__e78955d0._.js} +2 -2
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_14a33487._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_34d55bf1._.js +4 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{node_modules__pnpm_c636dc22._.js → node_modules__pnpm_597c265e._.js} +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/packages_web_src_app_page_tsx_cd282e82._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/packages_web_src_app_unlock_UnlockForm_tsx_ce3149a7._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/middleware-build-manifest.js +2 -2
- package/web/.next/standalone/packages/web/.next/server/middleware.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/next-font-manifest.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/next-font-manifest.json +7 -0
- package/web/.next/standalone/packages/web/.next/server/pages/404.html +1 -1
- package/web/.next/standalone/packages/web/.next/server/pages/500.html +2 -2
- package/web/.next/standalone/packages/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/server-reference-manifest.json +56 -7
- package/web/.next/standalone/packages/web/.next/static/chunks/{9b799cd7eb9a34ff.js → 1c4c14af475ada00.js} +1 -1
- package/web/.next/standalone/packages/web/.next/static/chunks/ba68284a3401d670.css +3 -0
- package/web/.next/{static/chunks/4372fb4d7779cd64.js → standalone/packages/web/.next/static/chunks/d00ddc86d1af3b6d.js} +1 -1
- package/web/.next/standalone/packages/web/.next/static/chunks/d8f4bf59132f70fd.js +1 -0
- package/web/.next/standalone/packages/web/.next/static/chunks/f355d4d60f0ec80e.js +1 -0
- package/web/.next/standalone/packages/web/.next/static/chunks/{turbopack-c3449aaab622f98c.js → turbopack-dc658d17ee981623.js} +1 -1
- package/web/.next/standalone/packages/web/package.json +1 -0
- package/web/.next/standalone/packages/web/src/app/api/access/route.ts +214 -0
- package/web/.next/standalone/packages/web/src/app/api/agents/route.ts +2 -2
- package/web/.next/standalone/packages/web/src/app/api/attachments/route.ts +1 -1
- package/web/.next/standalone/packages/web/src/app/api/auth/session/route.ts +54 -0
- package/web/.next/standalone/packages/web/src/app/api/boards/route.ts +2 -2
- package/web/.next/standalone/packages/web/src/app/api/config/route.ts +2 -1
- package/web/.next/standalone/packages/web/src/app/api/context-files/route.ts +1 -1
- package/web/.next/standalone/packages/web/src/app/api/events/route.ts +1 -1
- package/web/.next/standalone/packages/web/src/app/api/filesystem/directory/route.ts +1 -1
- package/web/.next/standalone/packages/web/src/app/api/github/repos/route.ts +1 -1
- package/web/.next/standalone/packages/web/src/app/api/health/boards/route.ts +1 -1
- package/web/.next/standalone/packages/web/src/app/api/preferences/route.ts +11 -3
- package/web/.next/standalone/packages/web/src/app/api/repositories/route.ts +21 -3
- package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/checks/route.ts +1 -1
- package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/diff/route.ts +1 -1
- package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/feedback/route.ts +1 -1
- package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/files/route.ts +1 -1
- package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/keys/route.ts +1 -1
- package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/kill/route.ts +1 -1
- package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/output/route.ts +1 -1
- package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/output/stream/route.ts +1 -1
- package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/restore/route.ts +1 -1
- package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/route.ts +1 -1
- package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/send/route.ts +1 -1
- package/web/.next/standalone/packages/web/src/app/api/sessions/route.ts +1 -1
- package/web/.next/standalone/packages/web/src/app/api/spawn/route.ts +3 -2
- package/web/.next/standalone/packages/web/src/app/api/workspaces/branches/route.ts +1 -1
- package/web/.next/standalone/packages/web/src/app/api/workspaces/route.ts +11 -3
- package/web/.next/standalone/packages/web/src/app/auth/grant/route.ts +37 -0
- package/web/.next/standalone/packages/web/src/app/page.tsx +763 -9
- package/web/.next/standalone/packages/web/src/app/unlock/UnlockForm.tsx +77 -0
- package/web/.next/standalone/packages/web/src/app/unlock/page.tsx +41 -0
- package/web/.next/standalone/packages/web/src/components/Dashboard.tsx +11 -125
- package/web/.next/standalone/packages/web/src/hooks/useConfig.ts +4 -0
- package/web/.next/standalone/packages/web/src/lib/accessControl.test.ts +46 -0
- package/web/.next/standalone/packages/web/src/lib/accessControl.ts +115 -0
- package/web/.next/standalone/packages/web/src/lib/auth.ts +294 -53
- package/web/.next/standalone/packages/web/src/lib/edgeAuth.test.ts +91 -0
- package/web/.next/standalone/packages/web/src/lib/edgeAuth.ts +205 -0
- package/web/.next/standalone/packages/web/src/lib/modelAccess.ts +40 -0
- package/web/.next/standalone/packages/web/src/lib/projectConfigSync.ts +59 -9
- package/web/.next/standalone/packages/web/src/lib/remoteAuth.ts +104 -0
- package/web/.next/standalone/packages/web/src/proxy.ts +64 -0
- package/web/.next/standalone/packages/web/tsconfig.tsbuildinfo +1 -1
- package/web/.next/static/chunks/{9b799cd7eb9a34ff.js → 1c4c14af475ada00.js} +1 -1
- package/web/.next/static/chunks/ba68284a3401d670.css +3 -0
- package/web/.next/{standalone/packages/web/.next/static/chunks/4372fb4d7779cd64.js → static/chunks/d00ddc86d1af3b6d.js} +1 -1
- package/web/.next/static/chunks/d8f4bf59132f70fd.js +1 -0
- package/web/.next/static/chunks/f355d4d60f0ec80e.js +1 -0
- package/web/.next/static/chunks/{turbopack-c3449aaab622f98c.js → turbopack-dc658d17ee981623.js} +1 -1
- package/node_modules/@conductor-oss/core/dist/__tests__/board-parser.test.d.ts +0 -2
- package/node_modules/@conductor-oss/core/dist/__tests__/board-parser.test.d.ts.map +0 -1
- package/node_modules/@conductor-oss/core/dist/__tests__/board-parser.test.js +0 -67
- package/node_modules/@conductor-oss/core/dist/__tests__/board-parser.test.js.map +0 -1
- package/node_modules/@conductor-oss/core/dist/__tests__/board-watcher-support-files.test.d.ts +0 -2
- package/node_modules/@conductor-oss/core/dist/__tests__/board-watcher-support-files.test.d.ts.map +0 -1
- package/node_modules/@conductor-oss/core/dist/__tests__/board-watcher-support-files.test.js +0 -104
- package/node_modules/@conductor-oss/core/dist/__tests__/board-watcher-support-files.test.js.map +0 -1
- package/node_modules/@conductor-oss/core/dist/agent-cli-runtime.d.ts +0 -20
- package/node_modules/@conductor-oss/core/dist/agent-cli-runtime.d.ts.map +0 -1
- package/node_modules/@conductor-oss/core/dist/agent-cli-runtime.js +0 -192
- package/node_modules/@conductor-oss/core/dist/agent-cli-runtime.js.map +0 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__019d9c90._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__08a3e108._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__0b0ab434._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__16fb4c3e._.js +0 -9
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__22609b55._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__2ff87bed._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__3c1772ab._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__5093c7e0._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__5a67f1f9._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__5cf55740._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6bc94363._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6cad94c3._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6d28affc._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6f84fa49._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__70c9c405._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__711294a3._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__7791414d._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__7fb2ee11._.js +0 -7
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__86646048._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__8ca91fef._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__a15b5527._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__a4a89ac9._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__a8a53d4a._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__a93c59df._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__abf6274f._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__acd4519a._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__b87de88e._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__bc304d71._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__be52402d._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__be74f171._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__c03aa571._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__c2850420._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__c82b8934._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__c8e31ad0._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__deafbc7a._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__e18c8e77._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__e1f610fb._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ec21c9a4._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ec256a62._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__edc8e5a5._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ee0dea96._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__f2c28004._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__f7c743c0._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__f95f5172._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__fc292e1c._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ffbf3faf._.js +0 -3
- package/web/.next/standalone/packages/web/.next/static/chunks/687bc713618f6993.js +0 -1
- package/web/.next/standalone/packages/web/.next/static/chunks/e7bb96d7efad8e32.css +0 -3
- package/web/.next/static/chunks/687bc713618f6993.js +0 -1
- package/web/.next/static/chunks/e7bb96d7efad8e32.css +0 -3
- /package/web/.next/standalone/packages/web/.next/static/{D95FTb8SiR6uFzjCQiKtd → tV9IvZT_f540bpw2KonCu}/_buildManifest.js +0 -0
- /package/web/.next/standalone/packages/web/.next/static/{D95FTb8SiR6uFzjCQiKtd → tV9IvZT_f540bpw2KonCu}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/standalone/packages/web/.next/static/{D95FTb8SiR6uFzjCQiKtd → tV9IvZT_f540bpw2KonCu}/_ssgManifest.js +0 -0
- /package/web/.next/static/{D95FTb8SiR6uFzjCQiKtd → tV9IvZT_f540bpw2KonCu}/_buildManifest.js +0 -0
- /package/web/.next/static/{D95FTb8SiR6uFzjCQiKtd → tV9IvZT_f540bpw2KonCu}/_clientMiddlewareManifest.json +0 -0
- /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 {
|
|
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 {
|