Skip to content

-all skills files add and testing is done - #12

Merged
ladaniprem merged 1 commit into
masterfrom
18-testing-and-skills
Aug 23, 2026
Merged

ladaniprem merged 1 commit into
masterfrom
18-testing-and-skills

Conversation

@ladaniprem

@ladaniprem ladaniprem commented Aug 23, 2026

Copy link
Copy Markdown
Owner

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:

  • Wrapped key dashboard pages (conversations, customization, files, integrations, plugins/vapi) with the SubscriptionGuard component to restrict access based on user subscription and feature flags.
  • Added a new billing success page using the SubscriptionSuccessView component.

Authentication and Routing Improvements:

  • Updated sign-in and sign-up pages to automatically redirect authenticated users to /dashboard, preventing them from seeing the auth forms when already signed in.

Developer Experience and Configuration:

  • Changed the apps/embed dev server to listen on all network interfaces (0.0.0.0) and updated the port to 3004 for both Vite config and package.json scripts.
  • Added a .env.example variable for CLERK_WEBHOOK_SECRET to support Clerk subscription webhooks.
  • Improved Sentry configuration to disable tracing and session replay in development, and enabled them fully in production. Also, set enableLogs and integrations conditionally based on environment.
  • Updated the Sentry tunnel API route to short-circuit and return early in development mode.

UI/UX and Documentation Updates:

  • Improved the landing hero image to dynamically switch between dark and light versions based on the current theme.
  • Added a Toaster component to the main app layout to ensure toast notifications are visible.
  • Updated apps/embed/embed.ts to use a default organization ID if the data-organization-id attribute is missing, logging a warning instead of an error.
  • Added new developer documentation in AGENTS.md and .commandcode/taste/taste.md to capture project knowledge, gotchas, and CLI usage notes.

Testing and skills Updates:

  • all of backend and frontend skills files rule and actions defined it.
  • testing do it jest,playwrite,e2e testing done all important component test it
  • agents and Kimi-k3 md file add it

Copilot AI lite review requested due to automatic review settings August 23, 2026 16:03
@coderabbitai

coderabbitai Bot commented Aug 23, 2026

Copy link
Copy Markdown

Important

Review skipped

Too 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 configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 293b41f0-bcb8-4adf-9da9-c04329b0c3b6

📥 Commits

Reviewing files that changed from the base of the PR and between 4aee5f3 and 41a71a3.

⛔ Files ignored due to path filters (13)
  • apps/web/components/landing/hero-dashboard light.png is excluded by !**/*.png
  • apps/web/public/dashboard-dark.png is excluded by !**/*.png
  • apps/web/public/landing/hero-dashboard-light.png is excluded by !**/*.png
  • apps/web/public/mobile-dark.png is excluded by !**/*.png
  • packages/backend/.claude/skills/convex-create-component/assets/icon.svg is excluded by !**/*.svg
  • packages/backend/.claude/skills/convex-quickstart/assets/icon.svg is excluded by !**/*.svg
  • packages/backend/convex/_generated/ai/ai-files.state.json is excluded by !**/_generated/**
  • packages/backend/convex/_generated/ai/guidelines.md is excluded by !**/_generated/**
  • packages/backend/convex/_generated/api.d.ts is excluded by !**/_generated/**
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
  • project demo pic/Screenshot 2026-07-11 200025.png is excluded by !**/*.png
  • project demo pic/Screenshot 2026-07-11 200034.png is excluded by !**/*.png
  • project demo pic/Screenshot 2026-07-11 200050.png is excluded by !**/*.png
📒 Files selected for processing (140)
  • .commandcode/taste/taste.md
  • .env.example
  • AGENTS.md
  • apps/embed/demo.html
  • apps/embed/embed.ts
  • apps/embed/landing.html
  • apps/embed/package.json
  • apps/embed/vite.config.ts
  • apps/web/app/(auth)/sign-in/[[...sign-in]]/page.tsx
  • apps/web/app/(auth)/sign-up/[[...sign-up]]/page.tsx
  • apps/web/app/(dashboard)/billing/success/page.tsx
  • apps/web/app/(dashboard)/conversations/layout.tsx
  • apps/web/app/(dashboard)/conversations/page.tsx
  • apps/web/app/(dashboard)/customization/page.tsx
  • apps/web/app/(dashboard)/files/page.tsx
  • apps/web/app/(dashboard)/integrations/page.tsx
  • apps/web/app/(dashboard)/plugins/vapi/page.tsx
  • apps/web/app/api/sentry-tunnel/route.ts
  • apps/web/app/layout.tsx
  • apps/web/components/landing/hero.tsx
  • apps/web/instrumentation-client.ts
  • apps/web/modules/billing/lib/use-subscription.ts
  • apps/web/modules/billing/ui/components/premium-feature-overlay.tsx
  • apps/web/modules/billing/ui/components/pricing-table.tsx
  • apps/web/modules/billing/ui/components/subscription-guard.tsx
  • apps/web/modules/billing/ui/views/billing-view.tsx
  • apps/web/modules/billing/ui/views/subscription-success-view.tsx
  • apps/web/modules/files/ui/components/upload-dialog.tsx
  • apps/web/modules/integrations/constants.ts
  • apps/web/modules/integrations/ui/views/integrations-view.tsx
  • apps/web/modules/plugins/ui/views/vapi-view.tsx
  • apps/web/next.config.ts
  • apps/web/sentry.edge.config.ts
  • apps/web/sentry.server.config.ts
  • apps/widget/app/page.tsx
  • apps/widget/modules/widget/hooks/use-vapi.ts
  • apps/widget/modules/widget/ui/screens/widget-auth-screen.tsx
  • apps/widget/modules/widget/ui/screens/widget-chat-screen.tsx
  • apps/widget/modules/widget/ui/screens/widget-loading-screen.tsx
  • apps/widget/modules/widget/ui/screens/widget-selection-screen.tsx
  • apps/widget/next.config.ts
  • doc/ALGORITHM.md
  • doc/AetherLive-aws-clerk-production.md
  • doc/BUGFIXES.md
  • kimi.md
  • packages/backend/.agents/skills/convex-add/SKILL.md
  • packages/backend/.agents/skills/convex-advisor/SKILL.md
  • packages/backend/.agents/skills/convex-agent/SKILL.md
  • packages/backend/.agents/skills/convex-auth/SKILL.md
  • packages/backend/.agents/skills/convex-authz/SKILL.md
  • packages/backend/.agents/skills/convex-backup/SKILL.md
  • packages/backend/.agents/skills/convex-billing/SKILL.md
  • packages/backend/.agents/skills/convex-cost/SKILL.md
  • packages/backend/.agents/skills/convex-create-component/SKILL.md
  • packages/backend/.agents/skills/convex-crons/SKILL.md
  • packages/backend/.agents/skills/convex-deploy-guard/SKILL.md
  • packages/backend/.agents/skills/convex-design/SKILL.md
  • packages/backend/.agents/skills/convex-docs/SKILL.md
  • packages/backend/.agents/skills/convex-domains/SKILL.md
  • packages/backend/.agents/skills/convex-env/SKILL.md
  • packages/backend/.agents/skills/convex-expert/SKILL.md
  • packages/backend/.agents/skills/convex-explain-app/SKILL.md
  • packages/backend/.agents/skills/convex-improve-convex-plugin/SKILL.md
  • packages/backend/.agents/skills/convex-insights/SKILL.md
  • packages/backend/.agents/skills/convex-launch-readiness/SKILL.md
  • packages/backend/.agents/skills/convex-migrate-rehearse/SKILL.md
  • packages/backend/.agents/skills/convex-migrate/SKILL.md
  • packages/backend/.agents/skills/convex-monitor/SKILL.md
  • packages/backend/.agents/skills/convex-optimize/SKILL.md
  • packages/backend/.agents/skills/convex-quickstart/SKILL.md
  • packages/backend/.agents/skills/convex-reviewer/SKILL.md
  • packages/backend/.agents/skills/convex-seed/SKILL.md
  • packages/backend/.agents/skills/convex-self-heal/SKILL.md
  • packages/backend/.agents/skills/convex-sentinel/SKILL.md
  • packages/backend/.agents/skills/convex-suggest/SKILL.md
  • packages/backend/.agents/skills/convex-test/SKILL.md
  • packages/backend/.agents/skills/convex-verify/SKILL.md
  • packages/backend/.agents/skills/convex/SKILL.md
  • packages/backend/.claude/skills/convex-add/SKILL.md
  • packages/backend/.claude/skills/convex-advisor/SKILL.md
  • packages/backend/.claude/skills/convex-agent/SKILL.md
  • packages/backend/.claude/skills/convex-auth/SKILL.md
  • packages/backend/.claude/skills/convex-authz/SKILL.md
  • packages/backend/.claude/skills/convex-backup/SKILL.md
  • packages/backend/.claude/skills/convex-billing/SKILL.md
  • packages/backend/.claude/skills/convex-cost/SKILL.md
  • packages/backend/.claude/skills/convex-create-component/SKILL.md
  • packages/backend/.claude/skills/convex-create-component/agents/openai.yaml
  • packages/backend/.claude/skills/convex-create-component/references/advanced-patterns.md
  • packages/backend/.claude/skills/convex-create-component/references/hybrid-components.md
  • packages/backend/.claude/skills/convex-create-component/references/local-components.md
  • packages/backend/.claude/skills/convex-create-component/references/packaged-components.md
  • packages/backend/.claude/skills/convex-crons/SKILL.md
  • packages/backend/.claude/skills/convex-deploy-guard/SKILL.md
  • packages/backend/.claude/skills/convex-design/SKILL.md
  • packages/backend/.claude/skills/convex-docs/SKILL.md
  • packages/backend/.claude/skills/convex-domains/SKILL.md
  • packages/backend/.claude/skills/convex-env/SKILL.md
  • packages/backend/.claude/skills/convex-expert/SKILL.md
  • packages/backend/.claude/skills/convex-explain-app/SKILL.md
  • packages/backend/.claude/skills/convex-improve-convex-plugin/SKILL.md
  • packages/backend/.claude/skills/convex-insights/SKILL.md
  • packages/backend/.claude/skills/convex-launch-readiness/SKILL.md
  • packages/backend/.claude/skills/convex-migrate-rehearse/SKILL.md
  • packages/backend/.claude/skills/convex-migrate/SKILL.md
  • packages/backend/.claude/skills/convex-monitor/SKILL.md
  • packages/backend/.claude/skills/convex-optimize/SKILL.md
  • packages/backend/.claude/skills/convex-quickstart/SKILL.md
  • packages/backend/.claude/skills/convex-quickstart/agents/openai.yaml
  • packages/backend/.claude/skills/convex-reviewer/SKILL.md
  • packages/backend/.claude/skills/convex-seed/SKILL.md
  • packages/backend/.claude/skills/convex-self-heal/SKILL.md
  • packages/backend/.claude/skills/convex-sentinel/SKILL.md
  • packages/backend/.claude/skills/convex-suggest/SKILL.md
  • packages/backend/.claude/skills/convex-test/SKILL.md
  • packages/backend/.claude/skills/convex-verify/SKILL.md
  • packages/backend/.claude/skills/convex/SKILL.md
  • packages/backend/AGENTS.md
  • packages/backend/convex/_saveFile.ts
  • packages/backend/convex/http.ts
  • packages/backend/convex/lib/auth.ts
  • packages/backend/convex/lib/secrets.ts
  • packages/backend/convex/lib/subscription.ts
  • packages/backend/convex/private/contactSessions.ts
  • packages/backend/convex/private/conversations.ts
  • packages/backend/convex/private/files.ts
  • packages/backend/convex/private/messages.ts
  • packages/backend/convex/private/plugins.ts
  • packages/backend/convex/private/secrets.ts
  • packages/backend/convex/private/subscriptions.ts
  • packages/backend/convex/private/vapi.ts
  • packages/backend/convex/private/widgetSettings.ts
  • packages/backend/convex/public/agent.ts
  • packages/backend/convex/public/conversations.ts
  • packages/backend/convex/public/plugins.ts
  • packages/backend/convex/public/secrets.ts
  • packages/backend/convex/schema.ts
  • packages/backend/convex/users.ts
  • packages/backend/package.json
  • packages/backend/skills-lock.json

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.


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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@ladaniprem
ladaniprem merged commit 1041bf7 into master Aug 23, 2026
3 checks passed

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 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 omits DEFAULT_ORG_ID. Add a test that executes the script without data-organization-id and 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

  • useAuth is 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 of useUser).
    apps/web/app/(auth)/sign-up/[[...sign-up]]/page.tsx:3
  • useAuth is 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 of useUser).
    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; check NODE_ENV before 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

  • undefined here means the subscription query is still waiting for Clerk's organization, not that the user lacks the feature. Returning false immediately 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-none prevents 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

  • useFeature is 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?.greetMessage in that header as well.
    apps/widget/modules/widget/ui/screens/widget-loading-screen.tsx:50
  • orgValidation.valid is 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 records sessionValid and still advances to settings while retaining the stale session ID. The selection screen then calls conversations.create with that invalid ID and shows an error instead of returning to the auth flow; clear the stored session and route to auth (or otherwise create a new session) on invalid results.
    doc/BUGFIXES.md:75
  • This report says the fix changed CSP frame-src to *, but the current widget config still uses frame-src 'none'; moreover, frame-src governs 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 is AGENTS.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 run npm 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 run npm 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 lowercase publicApiKey/privateApiKey. With the documented secret it throws missing 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_organizationId is available. Every future requirePlan/requireFeature call will scan all tenants; use the index for the organization equality.
    packages/backend/convex/private/conversations.ts:45
  • The existing private/conversations.test.ts mock for the conversations table exposes order/filter but no withIndex. This no-status path now calls withIndex, so both existing getMany tests 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 organizationId omitted because the schema makes it optional and no backfill is included. Those conversations will disappear from the dashboard, and the new updateStatus check 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 undefined as 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_organizationId was 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 undefined into a Convex equality expression, but undefined is 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 undefined to q.eq, but JavaScript undefined is 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 passing undefined to Convex and define how unscoped settings are selected.
    packages/backend/convex/public/agent.ts:37
  • Each request prepends a synthetic user turn and then appends a synthetic model greeting after the real latest user message. The Gemini request therefore ends on model and 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 pass undefined.
  • 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.

Comment thread apps/embed/embed.ts
Comment on lines 32 to 36
// 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;
}
Comment thread apps/web/app/layout.tsx
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"
Comment on lines +104 to +106
try {
await setPlan({ plan: "pro", status: "active", organizationId: orgId });
setResult("success");
Comment on lines 117 to 119
<div className="pointer-events-none select-none blur-[2px]">
{children}
</div>
Comment on lines +11 to +15
export const SubscriptionGuard = ({ children, feature }: SubscriptionGuardProps) => {
return (
<PremiumFeatureOverlay feature={feature}>
{children}
</PremiumFeatureOverlay>
Comment on lines +6 to +10
export const respond = action({
args: {
threadId: v.string(),
},
handler: async (ctx, args) => {
Comment on lines +13 to +16
const apiKey = process.env.GEMINI_API_KEY;
if (!apiKey) {
console.warn("[agent] No GEMINI_API_KEY configured — skipping AI response");
return;
Comment on lines +42 to +46
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()),
Comment on lines +26 to +30
throw new Error("Tracking Test");
const userId = await ctx.db.insert("users", {
name: "prem"
});
return userId;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants