Add Basic Agent mode for free users with 5-message daily quota (#2355)
## 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>
正在显示
drizzle/0024_useful_skin.sql
0 → 100644
drizzle/meta/0024_snapshot.json
0 → 100644
No preview for this file type
src/hooks/useFreeAgentQuota.ts
0 → 100644
src/ipc/types/free_agent_quota.ts
0 → 100644
src/lib/providerUtils.ts
0 → 100644
请
注册
或者
登录
后发表评论