Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
80f6f41
feat: add cloud workspaces infrastructure
AviPeltz Jan 31, 2026
ca72083
feat(cloud): add cloud workspaces UI with chat history and home page
AviPeltz Jan 31, 2026
4ab40b8
feat(cloud): add back button to cloud session page
AviPeltz Jan 31, 2026
61929c0
feat(cloud): add collapsible sidebar to session page
AviPeltz Jan 31, 2026
f5d9a0a
feat(cloud): add tool call display and auto-spawn sandbox
AviPeltz Jan 31, 2026
5cd6c29
feat(cloud): improve chat UX with processing states and markdown
AviPeltz Jan 31, 2026
5fe561d
feat(cloud): integrate GitHub repo selection for cloud sessions
AviPeltz Jan 31, 2026
c762449
fix(cloud): fix GitHub connection prompt logic
AviPeltz Jan 31, 2026
644fac6
fix(github): fix sync in dev and update repo access link
AviPeltz Jan 31, 2026
c03e424
feat(cloud): add error recovery, warm-on-typing, and dev tooling
AviPeltz Jan 31, 2026
8bc1c88
feat(web): add separate ngrok URL for GitHub OAuth
AviPeltz Feb 1, 2026
952571b
fix(api): use ngrok URL for GitHub OAuth callback
AviPeltz Feb 1, 2026
3f95df5
fix(web): use localhost for GitHub install link, ngrok for callback only
AviPeltz Feb 1, 2026
173491c
docs: add GitHub App callback URL step to ngrok setup guide
AviPeltz Feb 1, 2026
7e022cf
fix(cloud): resolve sandbox bugs and participant duplication
AviPeltz Feb 2, 2026
9aa8524
feat(cloud): add sandbox pre-warming when typing on home page
AviPeltz Feb 2, 2026
545b53e
fix: simplify CloudHomePage to match NewSessionForm pattern
AviPeltz Feb 2, 2026
c71b25e
fix: add sessionId to useEffect dependency array
AviPeltz Feb 2, 2026
a815e14
feat: improve archive UI/UX
AviPeltz Feb 2, 2026
58515f1
refactor(cloud): extract CloudSidebar component and improve tool call…
AviPeltz Feb 3, 2026
9688239
refactor(cloud): componentize UI and apply lint fixes
AviPeltz Feb 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -106,3 +106,10 @@ QSTASH_NEXT_SIGNING_KEY=

# MCP API Key for Claude Code
SUPERSET_MCP_API_KEY=

# -----------------------------------------------------------------------------
# Ngrok (for local GitHub OAuth testing)
# -----------------------------------------------------------------------------
# Your ngrok subdomain (paid) or static domain (free)
# Run `bun run dev:cloud` to start ngrok + dev servers
NGROK_SUBDOMAIN=superset-dev
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -67,3 +67,6 @@ next-env.d.ts

# Reference material downloaded for agents
examples

# Temporary exploration directories
temp_modal_vibe
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,4 @@ Please note we have a [code of conduct](./CODE_OF_CONDUCT.md), please follow it

We try to follow guidelines from [Clean Code](https://gist.github.com/wojteklu/73c6914cc446146b8b533c0988cf8d29) and the boy scoute rule:

"Leave the code cleaner, not messier, than how you found it".
"Leave the code cleaner, not messier, than how you found it".
3 changes: 3 additions & 0 deletions apps/api/next.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ const config: NextConfig = {
reactCompiler: true,
typescript: { ignoreBuildErrors: true },

// Allow ngrok domains for local dev with GitHub OAuth
allowedDevOrigins: ["*.ngrok.io", "*.ngrok-free.app"],

images: {
remotePatterns: [
{
Expand Down
30 changes: 22 additions & 8 deletions apps/api/src/app/api/github/callback/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -121,15 +121,29 @@ export async function GET(request: Request) {
}

// Queue initial sync job
const syncUrl = `${env.NEXT_PUBLIC_API_URL}/api/github/jobs/initial-sync`;
const syncBody = {
installationDbId: savedInstallation.id,
organizationId,
};

try {
await qstash.publishJSON({
url: `${env.NEXT_PUBLIC_API_URL}/api/github/jobs/initial-sync`,
body: {
installationDbId: savedInstallation.id,
organizationId,
},
retries: 3,
});
// In development, call the sync endpoint directly (QStash can't reach localhost)
if (env.NODE_ENV === "development") {
fetch(syncUrl, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(syncBody),
}).catch((error) => {
console.error("[github/callback] Dev sync failed:", error);
});
} else {
await qstash.publishJSON({
url: syncUrl,
body: syncBody,
retries: 3,
});
}
} catch (error) {
console.error(
"[github/callback] Failed to queue initial sync job:",
Expand Down
7 changes: 3 additions & 4 deletions apps/api/src/app/api/github/install/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,14 +49,13 @@ export async function GET(request: Request) {
userId: session.user.id,
});

const apiUrl = env.NEXT_PUBLIC_NGROK_URL ?? env.NEXT_PUBLIC_API_URL;

const installUrl = new URL(
"https://github.com/apps/superset-app/installations/new",
);
installUrl.searchParams.set("state", state);
installUrl.searchParams.set(
"redirect_url",
`${env.NEXT_PUBLIC_API_URL}/api/github/callback`,
);
installUrl.searchParams.set("redirect_url", `${apiUrl}/api/github/callback`);

return Response.redirect(installUrl.toString());
}
2 changes: 2 additions & 0 deletions apps/api/src/env.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ export const env = createEnv({
NEXT_PUBLIC_API_URL: z.string().url(),
NEXT_PUBLIC_WEB_URL: z.string().url(),
NEXT_PUBLIC_ADMIN_URL: z.string().url(),
NEXT_PUBLIC_NGROK_URL: z.string().url().optional(),
NEXT_PUBLIC_SENTRY_DSN_API: z.string().optional(),
NEXT_PUBLIC_SENTRY_ENVIRONMENT: z
.enum(["development", "preview", "production"])
Expand All @@ -55,6 +56,7 @@ export const env = createEnv({
NEXT_PUBLIC_API_URL: process.env.NEXT_PUBLIC_API_URL,
NEXT_PUBLIC_WEB_URL: process.env.NEXT_PUBLIC_WEB_URL,
NEXT_PUBLIC_ADMIN_URL: process.env.NEXT_PUBLIC_ADMIN_URL,
NEXT_PUBLIC_NGROK_URL: process.env.NEXT_PUBLIC_NGROK_URL,
NEXT_PUBLIC_SENTRY_DSN_API: process.env.NEXT_PUBLIC_SENTRY_DSN_API,
NEXT_PUBLIC_SENTRY_ENVIRONMENT: process.env.NEXT_PUBLIC_SENTRY_ENVIRONMENT,
},
Expand Down
Loading