Include last 4-chars of Dyad Pro user id for bug reports (#1933)

This allows us to identify which Dyad Pro user filed an issue on GitHub
by using a partial internal identifier

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Adds a redacted Dyad Pro user ID (last 4 chars) to bug report/session
templates, sourced from the Pro user info endpoint and exposed via user
budget info.
> 
> - **Frontend (HelpDialog)**:
> - Display `Pro User ID` in prefilled bug report and session report
bodies using `userBudget.redactedUserId`.
>   - Consume `useUserBudgetInfo` to access `userBudget`.
> - **IPC/Backend**:
> - `get-user-budget`: derive `redactedUserId` from `user_info.user_id`
(mask all but last 4 chars); include in test mock and response.
> - **Types**:
>   - Extend `UserBudgetInfoSchema` with `redactedUserId: string`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
1883a1ef94fec25b370df3d46054fb56d659dee8. 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 redacted Dyad Pro user ID (last 4 chars) to bug report templates
to help correlate GitHub issues with Pro accounts while protecting
privacy.

- **New Features**
- Derives redactedUserId from user_info.user_id in the Pro IPC handler
and adds it to UserBudgetInfo.
  - Shows “Pro User ID” in HelpDialog’s debug info and session details.
  - Extends UserBudgetInfo schema with a redactedUserId field.

<sup>Written for commit 1883a1ef94fec25b370df3d46054fb56d659dee8.
Summary will update automatically on new commits.</sup>

<!-- End of auto-generated description by cubic. -->
This commit is contained in:
Will Chen
2025-12-11 14:19:57 -08:00
committed by GitHub
parent 5b789cb971
commit 976e065fe5
3 changed files with 13 additions and 1 deletions

View File

@@ -22,6 +22,7 @@ export function registerProHandlers() {
usedCredits: 100,
totalCredits: 1000,
budgetResetDate: resetDate,
redactedUserId: "<redacted-user-id-testing>",
};
}
logger.info("Attempting to fetch user budget information.");
@@ -58,11 +59,18 @@ export function registerProHandlers() {
const data = await response.json();
const userInfoData = data["user_info"];
const userId = userInfoData["user_id"];
// Turn user_abc1234 => "****1234"
// Preserve the last 4 characters so we can correlate bug reports
// with the user.
const redactedUserId =
userId.length > 8 ? "****" + userId.slice(-4) : "<redacted>";
logger.info("Successfully fetched user budget information.");
return UserBudgetInfoSchema.parse({
usedCredits: userInfoData["spend"] * CONVERSION_RATIO,
totalCredits: userInfoData["max_budget"] * CONVERSION_RATIO,
budgetResetDate: new Date(userInfoData["budget_reset_at"]),
redactedUserId: redactedUserId,
});
} catch (error: any) {
logger.error(`Error fetching user budget: ${error.message}`, error);