• Will Chen's avatar
    Add Basic Agent mode for free users with 5-message daily quota (#2355) · 58b9b1d4
    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: 's avatarClaude Opus 4.5 <noreply@anthropic.com>
    58b9b1d4
名称
最后提交
最后更新
..
AgentConsentBanner.tsx 正在载入提交数据...
AttachmentsList.tsx 正在载入提交数据...
AuxiliaryActionsMenu.tsx 正在载入提交数据...
ChatActivity.tsx 正在载入提交数据...
ChatError.tsx 正在载入提交数据...
ChatErrorBox.tsx 正在载入提交数据...
ChatHeader.tsx 正在载入提交数据...
ChatInput.tsx 正在载入提交数据...
ChatMessage.tsx 正在载入提交数据...
CodeHighlight.tsx 正在载入提交数据...
ContextLimitBanner.tsx 正在载入提交数据...
DeleteChatDialog.tsx 正在载入提交数据...
DragDropOverlay.tsx 正在载入提交数据...
DyadAddDependency.tsx 正在载入提交数据...
DyadAddIntegration.tsx 正在载入提交数据...
DyadCodeSearch.tsx 正在载入提交数据...
DyadCodeSearchResult.tsx 正在载入提交数据...
DyadCodebaseContext.tsx 正在载入提交数据...
DyadDatabaseSchema.tsx 正在载入提交数据...
DyadDelete.tsx 正在载入提交数据...
DyadEdit.tsx 正在载入提交数据...
DyadExecuteSql.tsx 正在载入提交数据...
DyadGrep.tsx 正在载入提交数据...
DyadListFiles.tsx 正在载入提交数据...
DyadLogs.tsx 正在载入提交数据...
DyadMarkdownParser.tsx 正在载入提交数据...
DyadMcpToolCall.tsx 正在载入提交数据...
DyadMcpToolResult.tsx 正在载入提交数据...
DyadOutput.tsx 正在载入提交数据...
DyadProblemSummary.tsx 正在载入提交数据...
DyadRead.tsx 正在载入提交数据...
DyadRename.tsx 正在载入提交数据...
DyadSearchReplace.tsx 正在载入提交数据...
DyadStatus.tsx 正在载入提交数据...
DyadSupabaseProjectInfo.tsx 正在载入提交数据...
DyadSupabaseTableSchema.tsx 正在载入提交数据...
DyadThink.tsx 正在载入提交数据...
DyadTokenSavings.tsx 正在载入提交数据...
DyadWebCrawl.tsx 正在载入提交数据...
DyadWebSearch.tsx 正在载入提交数据...
DyadWebSearchResult.tsx 正在载入提交数据...
DyadWrite.tsx 正在载入提交数据...
FileAttachmentDropdown.tsx 正在载入提交数据...
FixAllErrorsButton.tsx 正在载入提交数据...
FreeAgentQuotaBanner.tsx 正在载入提交数据...
HomeChatInput.tsx 正在载入提交数据...
LexicalChatInput.tsx 正在载入提交数据...
MessagesList.tsx 正在载入提交数据...
PromoMessage.tsx 正在载入提交数据...
RenameChatDialog.tsx 正在载入提交数据...
SelectedComponentDisplay.tsx 正在载入提交数据...
SummarizeInNewChatButton.tsx 正在载入提交数据...
TodoList.tsx 正在载入提交数据...
TokenBar.tsx 正在载入提交数据...
UncommittedFilesBanner.tsx 正在载入提交数据...
VersionPane.tsx 正在载入提交数据...
monaco.ts 正在载入提交数据...
stateTypes.ts 正在载入提交数据...
types.d.ts 正在载入提交数据...