-all skills files add and testing is done - #12
Conversation
|
Important Review skippedToo many files! This PR contains 140 files, which is 40 over the limit of 100. To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch. Upgrade to a paid plan to raise the limit. This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry. ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: ⛔ Files ignored due to path filters (13)
📒 Files selected for processing (140)
You can disable this status message by setting the Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
🟡 Changes recommended
Unresolved critical security, authorization, tenant-isolation, and billing-validation findings block approval.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
This pull request adds subscription-based dashboard gating, organization-aware Convex/widget flows, authentication redirects, Sentry/embed updates, and developer documentation.
Changes:
- Adds subscription schema, billing UI, webhook handling, and dashboard guards.
- Expands widget conversations, AI/Vapi flows, and embed configuration.
- Updates authentication, Sentry, theming, toast behavior, environment docs, and agent skills.
File summaries
| File | Review result |
|---|---|
packages/backend/package.json |
No final comment. |
packages/backend/convex/users.ts |
Critical — 1 vote: users.add always throws Tracking Test, preventing inserts. |
packages/backend/convex/schema.ts |
Moderate — 3 votes: Optional organization IDs exclude legacy conversations from organization-indexed reads; backfill or retain a fallback. |
packages/backend/convex/public/secrets.ts |
No final comment. |
packages/backend/convex/public/plugins.ts |
No final comment. |
packages/backend/convex/public/conversations.ts |
Moderate — 2 votes: Full-table scan ignores by_contactSessionId; use the index before pagination. |
packages/backend/convex/public/agent.ts |
Critical — 4 votes: No thread ownership check or action rate limit allows abuse and message injection. Moderate — 3 votes: Missing Gemini configuration silently produces no response and no widget failure state. |
packages/backend/convex/private/widgetSettings.ts |
No final comment. |
packages/backend/convex/private/vapi.ts |
Moderate — 2 votes: Vapi credentials still use the Convex secrets table instead of the added AWS Secrets Manager path. |
packages/backend/convex/private/subscriptions.ts |
Critical — 4 votes: Public mutation allows callers to set any tenant’s plan; use an internal mutation and server-side authorization. Critical — 3 votes: Client-supplied organization IDs can expose another organization’s subscription. Moderate — 2 votes: Organization claim parsing misses org_id and o.id formats.Moderate — 2 votes: Subscription lookup ignores the organization index. Moderate — 2 votes: getFeatures performs another unbounded subscription scan.Moderate — 3 votes: Billing authentication, scoping, claim formats, serialization, and status transitions lack tests. |
packages/backend/convex/private/secrets.ts |
Moderate — 2 votes: Querying with undefined organization IDs is invalid in Convex; use an explicit legacy representation or remove the branch. |
packages/backend/convex/private/plugins.ts |
No final comment. |
packages/backend/convex/private/messages.ts |
No final comment. |
packages/backend/convex/private/files.ts |
Critical — 1 vote: Missing organization IDs compare equal, allowing organization-less users to delete unscoped files. |
packages/backend/convex/private/conversations.ts |
No final comment. |
packages/backend/convex/private/contactSessions.ts |
No final comment. |
packages/backend/convex/lib/subscription.ts |
Critical — 2 votes: requireFeature ignores subscription status.Critical — 2 votes: Feature checks have no backend call sites and can be bypassed through Convex functions. Critical — 3 votes: Infinity cannot be serialized in Convex return values; use a supported unlimited representation.Critical — 1 vote: requirePlan grants access for inactive subscriptions. |
packages/backend/convex/lib/secrets.ts |
No final comment. |
packages/backend/convex/lib/auth.ts |
No final comment. |
packages/backend/convex/http.ts |
Critical — 4 votes: Webhook payloads are accepted without verifying the Clerk/Svix signature. |
packages/backend/convex/_saveFile.ts |
Critical — 1 vote: Public mutation accepts arbitrary tenant and storage IDs without authentication or ownership checks; use internalMutation. |
packages/backend/convex/_generated/api.d.ts |
No final comment. |
packages/backend/convex/_generated/ai/ai-files.state.json |
No final comment. |
packages/backend/AGENTS.md |
Moderate — 2 votes: Documentation claims private handlers enforce requireFeature, but the backend checks are not implemented. |
packages/backend/.claude/skills/convex-verify/SKILL.md |
No final comment. |
packages/backend/.claude/skills/convex-test/SKILL.md |
No final comment. |
packages/backend/.claude/skills/convex-suggest/SKILL.md |
No final comment. |
packages/backend/.claude/skills/convex-sentinel/SKILL.md |
No final comment. |
packages/backend/.claude/skills/convex-self-heal/SKILL.md |
No final comment. |
packages/backend/.claude/skills/convex-seed/SKILL.md |
No final comment. |
packages/backend/.claude/skills/convex-reviewer/SKILL.md |
No final comment. |
packages/backend/.claude/skills/convex-quickstart/SKILL.md |
No final comment. |
packages/backend/.claude/skills/convex-quickstart/assets/icon.svg |
No final comment. |
packages/backend/.claude/skills/convex-quickstart/agents/openai.yaml |
No final comment. |
packages/backend/.claude/skills/convex-optimize/SKILL.md |
No final comment. |
packages/backend/.claude/skills/convex-monitor/SKILL.md |
No final comment. |
packages/backend/.claude/skills/convex-migrate/SKILL.md |
No final comment. |
packages/backend/.claude/skills/convex-migrate-rehearse/SKILL.md |
No final comment. |
packages/backend/.claude/skills/convex-launch-readiness/SKILL.md |
No final comment. |
packages/backend/.claude/skills/convex-insights/SKILL.md |
No final comment. |
packages/backend/.claude/skills/convex-improve-convex-plugin/SKILL.md |
Critical — 1 vote: Executes an unpinned remote script through curl | bash; download, inspect, pin, and verify the artifact first. |
packages/backend/.claude/skills/convex-explain-app/SKILL.md |
No final comment. |
packages/backend/.claude/skills/convex-expert/SKILL.md |
No final comment. |
packages/backend/.claude/skills/convex-env/SKILL.md |
No final comment. |
packages/backend/.claude/skills/convex-domains/SKILL.md |
No final comment. |
packages/backend/.claude/skills/convex-docs/SKILL.md |
No final comment. |
packages/backend/.claude/skills/convex-design/SKILL.md |
No final comment. |
packages/backend/.claude/skills/convex-deploy-guard/SKILL.md |
No final comment. |
packages/backend/.claude/skills/convex-crons/SKILL.md |
No final comment. |
packages/backend/.claude/skills/convex-create-component/references/packaged-components.md |
No final comment. |
packages/backend/.claude/skills/convex-create-component/references/local-components.md |
No final comment. |
packages/backend/.claude/skills/convex-create-component/references/hybrid-components.md |
No final comment. |
packages/backend/.claude/skills/convex-create-component/references/advanced-patterns.md |
No final comment. |
packages/backend/.claude/skills/convex-create-component/assets/icon.svg |
No final comment. |
packages/backend/.claude/skills/convex-create-component/agents/openai.yaml |
No final comment. |
packages/backend/.claude/skills/convex-cost/SKILL.md |
No final comment. |
packages/backend/.claude/skills/convex-billing/SKILL.md |
No final comment. |
packages/backend/.claude/skills/convex-backup/SKILL.md |
No final comment. |
packages/backend/.claude/skills/convex-auth/SKILL.md |
No final comment. |
packages/backend/.claude/skills/convex-agent/SKILL.md |
No final comment. |
packages/backend/.claude/skills/convex-advisor/SKILL.md |
No final comment. |
packages/backend/.claude/skills/convex-add/SKILL.md |
No final comment. |
packages/backend/.agents/skills/convex-verify/SKILL.md |
No final comment. |
packages/backend/.agents/skills/convex-test/SKILL.md |
No final comment. |
packages/backend/.agents/skills/convex-suggest/SKILL.md |
No final comment. |
packages/backend/.agents/skills/convex-sentinel/SKILL.md |
No final comment. |
packages/backend/.agents/skills/convex-self-heal/SKILL.md |
No final comment. |
packages/backend/.agents/skills/convex-seed/SKILL.md |
No final comment. |
packages/backend/.agents/skills/convex-reviewer/SKILL.md |
No final comment. |
packages/backend/.agents/skills/convex-optimize/SKILL.md |
No final comment. |
packages/backend/.agents/skills/convex-monitor/SKILL.md |
No final comment. |
packages/backend/.agents/skills/convex-migrate/SKILL.md |
No final comment. |
packages/backend/.agents/skills/convex-migrate-rehearse/SKILL.md |
No final comment. |
packages/backend/.agents/skills/convex-launch-readiness/SKILL.md |
No final comment. |
packages/backend/.agents/skills/convex-insights/SKILL.md |
No final comment. |
packages/backend/.agents/skills/convex-improve-convex-plugin/SKILL.md |
Critical — 1 vote: Executes an unpinned remote script through curl | bash; download, inspect, pin, and verify the artifact first. |
packages/backend/.agents/skills/convex-explain-app/SKILL.md |
No final comment. |
packages/backend/.agents/skills/convex-expert/SKILL.md |
No final comment. |
packages/backend/.agents/skills/convex-env/SKILL.md |
No final comment. |
packages/backend/.agents/skills/convex-domains/SKILL.md |
No final comment. |
packages/backend/.agents/skills/convex-docs/SKILL.md |
No final comment. |
packages/backend/.agents/skills/convex-design/SKILL.md |
No final comment. |
packages/backend/.agents/skills/convex-deploy-guard/SKILL.md |
No final comment. |
packages/backend/.agents/skills/convex-crons/SKILL.md |
No final comment. |
packages/backend/.agents/skills/convex-create-component/SKILL.md |
No final comment. |
packages/backend/.agents/skills/convex-cost/SKILL.md |
No final comment. |
packages/backend/.agents/skills/convex-billing/SKILL.md |
No final comment. |
packages/backend/.agents/skills/convex-backup/SKILL.md |
No final comment. |
packages/backend/.agents/skills/convex-auth/SKILL.md |
No final comment. |
packages/backend/.agents/skills/convex-agent/SKILL.md |
No final comment. |
packages/backend/.agents/skills/convex-advisor/SKILL.md |
No final comment. |
packages/backend/.agents/skills/convex-add/SKILL.md |
No final comment. |
kimi.md |
No final comment. |
apps/widget/next.config.ts |
Moderate — 2 votes: ALLOWALL is invalid for X-Frame-Options; use an intentional CSP frame-ancestors policy. |
apps/widget/modules/widget/ui/screens/widget-selection-screen.tsx |
No final comment. |
apps/widget/modules/widget/ui/screens/widget-loading-screen.tsx |
No final comment. |
apps/widget/modules/widget/ui/screens/widget-chat-screen.tsx |
Moderate — 3 votes: Unawaited Gemini/save promises can report false success and create unhandled rejections. |
apps/widget/modules/widget/ui/screens/widget-auth-screen.tsx |
No final comment. |
apps/widget/modules/widget/hooks/use-vapi.ts |
No final comment. |
apps/widget/app/page.tsx |
Critical — 2 votes: Missing organization IDs fall back to a real tenant in all environments, risking cross-tenant data mixing; fail closed in production. |
apps/web/sentry.server.config.ts |
No final comment. |
apps/web/sentry.edge.config.ts |
No final comment. |
apps/web/next.config.ts |
No final comment. |
apps/web/modules/plugins/ui/views/vapi-view.tsx |
No final comment. |
apps/web/modules/integrations/ui/views/integrations-view.tsx |
No final comment. |
apps/web/modules/integrations/constants.ts |
Critical — 1 vote: Generated snippets hard-code localhost:3004, which cannot work from deployed dashboards; use a configured public embed URL. |
apps/web/modules/files/ui/components/upload-dialog.tsx |
No final comment. |
apps/web/modules/billing/ui/views/subscription-success-view.tsx |
Critical — 4 votes: The success page directly activates Pro without verifying payment, session, or webhook state; use verified webhook state and display/poll it. |
apps/web/modules/billing/ui/views/billing-view.tsx |
Critical — 2 votes: User-controlled synced=true grants Pro without checkout or webhook confirmation.Critical — 2 votes: The production demo control lets any organization member activate Pro without payment or role checks. |
apps/web/modules/billing/ui/components/subscription-guard.tsx |
Critical — 2 votes: Client-side gating does not protect callable Convex handlers; enforce feature checks in each backend handler. |
apps/web/modules/billing/ui/components/pricing-table.tsx |
No final comment. |
apps/web/modules/billing/ui/components/premium-feature-overlay.tsx |
Critical — 1 vote: Unrestricted Activate Pro unlocks gated pages without checkout; remove or restrict the flow and rely on verified subscription state.Critical — 1 vote: Protected children remain mounted and can execute queries; do not mount them until access is granted and enforce backend restrictions. |
apps/web/modules/billing/lib/use-subscription.ts |
No final comment. |
apps/web/instrumentation-client.ts |
No final comment. |
apps/web/components/landing/hero.tsx |
No final comment. |
apps/web/app/layout.tsx |
Moderate — 4 votes: Toaster is imported but not rendered, leaving toast notifications invisible; mount it inside the provider tree. |
apps/web/app/api/sentry-tunnel/route.ts |
No final comment. |
apps/web/app/(dashboard)/plugins/vapi/page.tsx |
No final comment. |
apps/web/app/(dashboard)/integrations/page.tsx |
No final comment. |
apps/web/app/(dashboard)/files/page.tsx |
No final comment. |
apps/web/app/(dashboard)/customization/page.tsx |
No final comment. |
apps/web/app/(dashboard)/conversations/page.tsx |
No final comment. |
apps/web/app/(dashboard)/conversations/layout.tsx |
No final comment. |
apps/web/app/(dashboard)/billing/success/page.tsx |
No final comment. |
apps/web/app/(auth)/sign-up/[[...sign-up]]/page.tsx |
No final comment. |
apps/web/app/(auth)/sign-in/[[...sign-in]]/page.tsx |
No final comment. |
apps/embed/vite.config.ts |
No final comment. |
apps/embed/package.json |
No final comment. |
apps/embed/landing.html |
No final comment. |
apps/embed/embed.ts |
Critical — 3 votes: Missing organization IDs silently map hosts to one real tenant; allow demo defaults only in development and abort production rendering. |
AGENTS.md |
No final comment. |
.env.example |
No final comment. |
.commandcode/taste/taste.md |
No final comment. |
Review details
Files not reviewed (1)
- pnpm-lock.yaml: Generated file
Suppressed comments (26)
apps/embed/embed.ts:35
- The new missing-attribute fallback is not exercised by
apps/embed/embed.test.ts: that test never imports/runs the IIFE and its mocked config omitsDEFAULT_ORG_ID. Add a test that executes the script withoutdata-organization-idand verifies the production-safe behavior, since this path controls tenant routing.
// Exit if no organization ID
if (!organizationId) {
console.warn('AetherLive Widget: data-organization-id not set, using default');
organizationId = EMBED_CONFIG.DEFAULT_ORG_ID;
apps/web/app/(auth)/sign-in/[[...sign-in]]/page.tsx:3
useAuthis imported but never referenced in this page. The repository's TypeScript ESLint recommended rules report unused variables, so this newly added import can fail the web lint step; remove it (or use it instead ofuseUser).
apps/web/app/(auth)/sign-up/[[...sign-up]]/page.tsx:3useAuthis imported but never referenced in this page. The repository's TypeScript ESLint recommended rules report unused variables, so this newly added import can fail the web lint step; remove it (or use it instead ofuseUser).
apps/web/app/api/sentry-tunnel/route.ts:17- The development short-circuit is after the missing-DSN error. In development without
NEXT_PUBLIC_SENTRY_DSN, this route returns 500 instead of the intended successful no-op response; checkNODE_ENVbefore requiring a DSN.
if (!DSN) {
return NextResponse.json({ error: "NEXT_PUBLIC_SENTRY_DSN not set" }, { status: 500 });
}
if (process.env.NODE_ENV === "development") {
apps/web/modules/billing/lib/use-subscription.ts:47
undefinedhere means the subscription query is still waiting for Clerk's organization, not that the user lacks the feature. Returningfalseimmediately makes paid users see the premium overlay and activation control on every initial render; expose a loading state and render the overlay only after the query resolves.
export function useFeature(feature: string): boolean {
const subscription = useSubscription();
if (!subscription) return false;
return subscription.features.includes(feature);
apps/web/modules/billing/ui/components/premium-feature-overlay.tsx:119
pointer-events-noneprevents pointer clicks but does not remove the blurred children from the keyboard tab order or accessibility tree. Keyboard users can still focus controls behind the overlay; mark the gated content inert/aria-hidden and implement the prompt as a proper modal/focus boundary.
<div className="pointer-events-none select-none blur-[2px]">
{children}
</div>
apps/web/modules/billing/ui/components/subscription-guard.tsx:3
useFeatureis imported but never used; this can fail the repository's TypeScript ESLint recommended unused-variable rule during the stated lint check. Remove the import.
import { useFeature } from "../../lib/use-subscription";
apps/widget/modules/widget/ui/screens/widget-auth-screen.tsx:29
- This new atom read has no effect because the auth header below still renders the hardcoded greeting. The customization fix is incomplete for the auth screen; use
widgetSettings?.greetMessagein that header as well.
apps/widget/modules/widget/ui/screens/widget-loading-screen.tsx:50 orgValidation.validis true for every non-empty string in the backend validator, so this branch does not verify that the organization exists or that the widget is configured for it. A typo or attacker-supplied ID can continue into contact-session creation and attribute data to an arbitrary tenant; perform a real server-side organization/configuration check before proceeding.
apps/widget/modules/widget/ui/screens/widget-loading-screen.tsx:80- When validation returns
{ valid: false }, this effect only recordssessionValidand still advances tosettingswhile retaining the stale session ID. The selection screen then callsconversations.createwith that invalid ID and shows an error instead of returning to the auth flow; clear the stored session and route toauth(or otherwise create a new session) on invalid results.
doc/BUGFIXES.md:75 - This report says the fix changed CSP
frame-srcto*, but the current widget config still usesframe-src 'none'; moreover,frame-srcgoverns frames loaded by the widget, not whether the widget itself may be framed. Correct the documented fix so it does not send maintainers toward an ineffective or overly broad policy.
kimi.md:2 - The new documentation refers to
agent.md, but the linked and actual repository file isAGENTS.md. Following this instruction points contributors to a nonexistent source-of-truth file.
packages/backend/.agents/skills/convex-billing/SKILL.md:14 - This project uses pnpm workspaces and commits
pnpm-lock.yaml, but the skill instructs agents to runnpm install, which can create a separate lockfile or install the component outside the workspace dependency graph. Use the repository package-manager command (for this backend,pnpm --filter @workspace/backend add ...).
packages/backend/.claude/skills/convex-billing/SKILL.md:14 - This project uses pnpm workspaces and commits
pnpm-lock.yaml, but the skill instructs agents to runnpm install, which can create a separate lockfile or install the component outside the workspace dependency graph. Use the repository package-manager command (for this backend,pnpm --filter @workspace/backend add ...).
packages/backend/convex/lib/secrets.ts:36 - The production documentation configures the AWS JSON as
VAPI_PUBLIC_KEY/VAPI_PRIVATE_KEY, but this parser only reads lowercasepublicApiKey/privateApiKey. With the documented secret it throwsmissing privateApiKey; accept the documented names (or update the secret format and every caller).
packages/backend/convex/lib/subscription.ts:53 - This shared subscription lookup also performs a full table filter even though
subscriptions.by_organizationIdis available. Every futurerequirePlan/requireFeaturecall will scan all tenants; use the index for the organization equality.
packages/backend/convex/private/conversations.ts:45 - The existing
private/conversations.test.tsmock for theconversationstable exposesorder/filterbut nowithIndex. This no-status path now callswithIndex, so both existinggetManytests throw before their assertions run. Update the test fixture to model the new query chain and add coverage for the indexed status branch.
packages/backend/convex/private/conversations.ts:35 - This path now reads only the new organization index, but existing conversation documents are valid with
organizationIdomitted because the schema makes it optional and no backfill is included. Those conversations will disappear from the dashboard, and the newupdateStatuscheck will reject them; backfill from the linked contact session or retain a compatibility path.
packages/backend/convex/private/files.ts:34 - The no-organization branch compares the optional field with JavaScript
undefined, which is not a valid Convex value. This makes the legacy/unscoped file path fail at runtime instead of returning files; use an explicit representation or a supported lookup strategy.
packages/backend/convex/private/subscriptions.ts:91 - These optional fields are included in the document even when their arguments are omitted. Convex does not accept JavaScript
undefinedas a stored value, so the normal UI calls that omit both fields can fail on insert/replace; conditionally omit absent properties (or use an explicit nullable representation).
packages/backend/convex/private/subscriptions.ts:84 - This state-changing lookup also scans all subscription documents even though
by_organizationIdwas added for this access pattern. Use the index before replacing/inserting the organization's subscription.
packages/backend/convex/private/vapi.ts:31 - The orgless secret lookup passes
undefinedinto a Convex equality expression, butundefinedis not a valid Convex value. An authenticated identity without an organization will fail this internal query instead of using the intended fallback; use an explicit legacy representation or avoid the branch.
packages/backend/convex/private/widgetSettings.ts:22 - The organization-less branch passes
undefinedtoq.eq, but JavaScriptundefinedis not a valid Convex value. Users without an organization will hit a query error rather than load legacy settings; use an explicit legacy representation or a supported lookup strategy.
packages/backend/convex/private/widgetSettings.ts:57 - This upsert fallback has the same invalid
q.eq(..., undefined)comparison, so an authenticated user without an organization cannot update or create legacy settings. Avoid passingundefinedto Convex and define how unscoped settings are selected.
packages/backend/convex/public/agent.ts:37 - Each request prepends a synthetic
userturn and then appends a syntheticmodelgreeting after the real latest user message. The Gemini request therefore ends onmodeland repeats the greeting on every turn instead of generating from the user's prompt; send the instruction as a system instruction and keep the latest user message last.
packages/backend/convex/public/secrets.ts:64 - The no-organization fallback compares a Convex field with JavaScript
undefined, which is not a valid Convex value. This branch will error instead of reading legacy unscoped secrets; migrate legacy rows to an explicit representation or use a query pattern that does not passundefined.
- Files reviewed: 140/153 changed files
- Comments generated: 35
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| // Exit if no organization ID | ||
| if (!organizationId) { | ||
| console.error('AetherLive Widget: data-organization-id attribute is required'); | ||
| return; | ||
| console.warn('AetherLive Widget: data-organization-id not set, using default'); | ||
| organizationId = EMBED_CONFIG.DEFAULT_ORG_ID; | ||
| } |
| import { ThemeProvider } from "@/components/theme-provider" | ||
| import { cn } from "@workspace/ui/lib/utils"; | ||
| import { ClerkProvider } from '@clerk/nextjs' | ||
| import { Toaster } from "@workspace/ui/components/sonner" |
| try { | ||
| await setPlan({ plan: "pro", status: "active", organizationId: orgId }); | ||
| setResult("success"); |
| <div className="pointer-events-none select-none blur-[2px]"> | ||
| {children} | ||
| </div> |
| export const SubscriptionGuard = ({ children, feature }: SubscriptionGuardProps) => { | ||
| return ( | ||
| <PremiumFeatureOverlay feature={feature}> | ||
| {children} | ||
| </PremiumFeatureOverlay> |
| export const respond = action({ | ||
| args: { | ||
| threadId: v.string(), | ||
| }, | ||
| handler: async (ctx, args) => { |
| const apiKey = process.env.GEMINI_API_KEY; | ||
| if (!apiKey) { | ||
| console.warn("[agent] No GEMINI_API_KEY configured — skipping AI response"); | ||
| return; |
| return await ctx.db | ||
| .query("conversations") | ||
| .filter((q) => q.eq(q.field("contactSessionId"), contactSessionId)) | ||
| .order("desc") | ||
| .paginate(args.paginationOpts); |
| ), | ||
| threadId: v.string(), | ||
| contactSessionId: v.id("contactSessions"), | ||
| organizationId: v.optional(v.string()), |
| throw new Error("Tracking Test"); | ||
| const userId = await ctx.db.insert("users", { | ||
| name: "prem" | ||
| }); | ||
| return userId; |
This pull request introduces several improvements across the codebase, focusing on enhanced subscription feature gating in the dashboard, improved authentication flows, developer experience enhancements, and various fixes and documentation updates.
Subscription Feature Gating in Dashboard:
conversations,customization,files,integrations,plugins/vapi) with theSubscriptionGuardcomponent to restrict access based on user subscription and feature flags.SubscriptionSuccessViewcomponent.Authentication and Routing Improvements:
/dashboard, preventing them from seeing the auth forms when already signed in.Developer Experience and Configuration:
apps/embeddev server to listen on all network interfaces (0.0.0.0) and updated the port to3004for both Vite config andpackage.jsonscripts..env.examplevariable forCLERK_WEBHOOK_SECRETto support Clerk subscription webhooks.enableLogsand integrations conditionally based on environment.UI/UX and Documentation Updates:
Toastercomponent to the main app layout to ensure toast notifications are visible.apps/embed/embed.tsto use a default organization ID if thedata-organization-idattribute is missing, logging a warning instead of an error.AGENTS.mdand.commandcode/taste/taste.mdto capture project knowledge, gotchas, and CLI usage notes.Testing and skills Updates: