-
由 Will Chen 提交于
## Summary - Add "Basic Agent" mode for non-Pro users with a 5 messages per 24-hour rolling window quota - Track quota usage via `usingFreeAgentModeQuota` column in messages table - Show quota remaining in mode selector (e.g., "4/5 remaining") and display warning banner when quota exceeded with upgrade/switch options - Default to Basic Agent mode if quota available, Build mode if exceeded ## Test plan - Run `npm run ts` and `npm run lint` to verify code compiles - Run `PLAYWRIGHT_HTML_OPEN=never npm run e2e -- --grep "free agent quota"` to run the E2E tests - Manual testing: 1. Without Dyad Pro, verify "Basic Agent" option appears in mode selector with quota display 2. Send 5 messages in Basic Agent mode, verify quota decrements 3. After 5 messages, verify quota exceeded banner appears 4. Click "Switch back to Build mode" button, verify mode changes
🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- devin-review-badge-begin --> --- <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2355"> <picture> <source media="(prefers-color-scheme: dark)" srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1"> <img src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1" alt="Open with Devin"> </picture> </a> <!-- devin-review-badge-end --> <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Introduces new quota enforcement and state changes in the chat streaming path plus a DB schema change; bugs could block non‑Pro agent usage or miscount/refund quota. Also adds a network call for trusted time and a test-only IPC channel, which increases surface area but is scoped and guarded. > > **Overview** > Adds a **non‑Pro “Basic Agent” mode** (implemented via `local-agent`) gated by a **5-message/day quota**, including quota-aware defaults and mode labeling (`Agent v2` for Pro vs `Basic Agent` for free). > > Implements **DB-backed quota tracking** via a new `messages.using_free_agent_mode_quota` column and new IPC handlers to compute/reset quota (using server time where possible), enforce limits before starting a `local-agent` stream, and **refund quota on stream failure/abort**. > > Updates the UI to display remaining quota, disable Basic Agent when exceeded, show a dedicated exceeded banner and error messaging, and adds targeted E2E tests plus a test-only IPC hook to simulate time passing. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit f4d3470477e247e782e8b5005d7fd60e6da98c13. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY --> <!-- This is an auto-generated description by cubic. --> --- ## Summary by cubic Adds a Basic Agent mode for non‑Pro users with a 5‑message quota in a 24‑hour window. Quota is enforced server‑side, with clear UI for remaining messages, a banner showing time until reset, a friendly error when exceeded, and engine tools disabled in Basic Agent mode. - **New Features** - Shows “Basic Agent” for non‑Pro users; defaults to Basic Agent when quota and a supported provider are available, falls back to Build when exceeded. - Tracks usage via messages.using_free_agent_mode_quota and enforces the limit before local‑agent streams; marks messages before stream and refunds quota on failure/abort; blocks the 6th message with a clear error. - Mode selector displays X/5 remaining and disables Basic Agent when the quota is exceeded. - Quota banner shows time until reset and provides “Upgrade to Dyad Pro” and “Switch back to Build mode” actions; useFreeAgentQuota hook auto‑refreshes every 30 minutes. - Disables engine-dependent tools in Basic Agent mode; E2E tests cover availability, tracking, banner, switching, exceeded-message blocking, and 24‑hour reset. - **Migration** - Apply drizzle migration 0024 to add the using_free_agent_mode_quota column to messages. <sup>Written for commit f4d3470477e247e782e8b5005d7fd60e6da98c13. Summary will update on new commits.</sup> <!-- End of auto-generated description by cubic. --> --------- Co-authored-by:Claude Opus 4.5 <noreply@anthropic.com>