Conversation
|
Too many files changed for review. ( |
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
PR SummaryHigh Risk Overview Updates SEO/metadata messaging across Refactors copilot-related APIs: moves auto-allowed tool preferences from direct DB writes to server-to-server calls to the Go backend, extracts SSE streaming into shared Adjusts usage/accounting and UI defaults: billing cost updates now accept more Written by Cursor Bugbot for commit b07925f. Configure here. |
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 2 potential issues.
Bugbot Autofix prepared fixes for both issues found in the latest run.
- ✅ Fixed: Non-copilot sources misattributed to copilot billing counters
- Added conditional check to only increment copilot-specific counters (totalCopilotCost, currentPeriodCopilotCost, totalCopilotCalls, totalCopilotTokens) when source is 'copilot' or 'mcp_copilot', preventing workspace-chat and mothership_block costs from being misattributed.
- ✅ Fixed: Duplicated
hexToRgbautility across landing components- Extracted the hexToRgba function to a shared utility at lib/core/utils/color.ts and updated both features.tsx and templates.tsx to import from the shared location.
Or push these changes by commenting:
@cursor push a1b4fb2499
Preview (a1b4fb2499)
diff --git a/apps/sim/app/(home)/components/features/features.tsx b/apps/sim/app/(home)/components/features/features.tsx
--- a/apps/sim/app/(home)/components/features/features.tsx
+++ b/apps/sim/app/(home)/components/features/features.tsx
@@ -3,14 +3,8 @@
import { useState } from 'react'
import Image from 'next/image'
import { Badge } from '@/components/emcn'
+import { hexToRgba } from '@/lib/core/utils/color'
-function hexToRgba(hex: string, alpha: number): string {
- const r = Number.parseInt(hex.slice(1, 3), 16)
- const g = Number.parseInt(hex.slice(3, 5), 16)
- const b = Number.parseInt(hex.slice(5, 7), 16)
- return `rgba(${r},${g},${b},${alpha})`
-}
-
const FEATURE_TABS = [
{
label: 'Integrations',
diff --git a/apps/sim/app/(home)/components/templates/templates.tsx b/apps/sim/app/(home)/components/templates/templates.tsx
--- a/apps/sim/app/(home)/components/templates/templates.tsx
+++ b/apps/sim/app/(home)/components/templates/templates.tsx
@@ -6,6 +6,7 @@
import Link from 'next/link'
import { Badge, ChevronDown } from '@/components/emcn'
import { cn } from '@/lib/core/utils/cn'
+import { hexToRgba } from '@/lib/core/utils/color'
import { TEMPLATE_WORKFLOWS } from '@/app/(home)/components/templates/template-workflows'
const LandingPreviewWorkflow = dynamic(
@@ -19,13 +20,6 @@
}
)
-function hexToRgba(hex: string, alpha: number): string {
- const r = Number.parseInt(hex.slice(1, 3), 16)
- const g = Number.parseInt(hex.slice(3, 5), 16)
- const b = Number.parseInt(hex.slice(5, 7), 16)
- return `rgba(${r},${g},${b},${alpha})`
-}
-
const LEFT_WALL_CLIP = 'polygon(0 8px, 100% 0, 100% 100%, 0 100%)'
const BOTTOM_WALL_CLIP = 'polygon(0 0, 100% 0, calc(100% - 8px) 100%, 0 100%)'
diff --git a/apps/sim/app/api/billing/update-cost/route.ts b/apps/sim/app/api/billing/update-cost/route.ts
--- a/apps/sim/app/api/billing/update-cost/route.ts
+++ b/apps/sim/app/api/billing/update-cost/route.ts
@@ -78,6 +78,7 @@
}
const { userId, cost, model, inputTokens, outputTokens, source } = validation.data
+ const isCopilot = source === 'copilot' || source === 'mcp_copilot'
const isMcp = source === 'mcp_copilot'
logger.info(`[${requestId}] Processing cost update`, {
@@ -105,13 +106,16 @@
const updateFields: Record<string, unknown> = {
totalCost: sql`total_cost + ${cost}`,
currentPeriodCost: sql`current_period_cost + ${cost}`,
- totalCopilotCost: sql`total_copilot_cost + ${cost}`,
- currentPeriodCopilotCost: sql`current_period_copilot_cost + ${cost}`,
- totalCopilotCalls: sql`total_copilot_calls + 1`,
- totalCopilotTokens: sql`total_copilot_tokens + ${totalTokens}`,
lastActive: new Date(),
}
+ if (isCopilot) {
+ updateFields.totalCopilotCost = sql`total_copilot_cost + ${cost}`
+ updateFields.currentPeriodCopilotCost = sql`current_period_copilot_cost + ${cost}`
+ updateFields.totalCopilotCalls = sql`total_copilot_calls + 1`
+ updateFields.totalCopilotTokens = sql`total_copilot_tokens + ${totalTokens}`
+ }
+
if (isMcp) {
updateFields.totalMcpCopilotCost = sql`total_mcp_copilot_cost + ${cost}`
updateFields.currentPeriodMcpCopilotCost = sql`current_period_mcp_copilot_cost + ${cost}`
diff --git a/apps/sim/lib/core/utils/color.ts b/apps/sim/lib/core/utils/color.ts
new file mode 100644
--- /dev/null
+++ b/apps/sim/lib/core/utils/color.ts
@@ -1,0 +1,12 @@
+/**
+ * Converts a hex color string to an rgba string with the specified alpha.
+ * @param hex - Hex color string (e.g., '#FF0000')
+ * @param alpha - Alpha value between 0 and 1
+ * @returns An rgba color string (e.g., 'rgba(255,0,0,0.5)')
+ */
+export function hexToRgba(hex: string, alpha: number): string {
+ const r = Number.parseInt(hex.slice(1, 3), 16)
+ const g = Number.parseInt(hex.slice(3, 5), 16)
+ const b = Number.parseInt(hex.slice(5, 7), 16)
+ return `rgba(${r},${g},${b},${alpha})`
+}| totalCopilotCost: sql`total_copilot_cost + ${cost}`, | ||
| currentPeriodCopilotCost: sql`current_period_copilot_cost + ${cost}`, | ||
| totalCopilotCalls: sql`total_copilot_calls + 1`, | ||
| totalCopilotTokens: sql`total_copilot_tokens + ${totalTokens}`, |
There was a problem hiding this comment.
Non-copilot sources misattributed to copilot billing counters
High Severity
The source enum was expanded to include 'workspace-chat' and 'mothership_block', but the updateFields unconditionally increments copilot-specific counters (totalCopilotCost, currentPeriodCopilotCost, totalCopilotCalls, totalCopilotTokens) for all sources. Costs from workspace chat and mothership blocks are incorrectly attributed to copilot usage, corrupting billing analytics and cost attribution.
| const g = Number.parseInt(hex.slice(3, 5), 16) | ||
| const b = Number.parseInt(hex.slice(5, 7), 16) | ||
| return `rgba(${r},${g},${b},${alpha})` | ||
| } |
There was a problem hiding this comment.
Duplicated hexToRgba utility across landing components
Low Severity
The hexToRgba function is identically defined in both features.tsx and templates.tsx. This duplicated logic increases maintenance burden — a bug fix in one copy could easily be missed in the other. It could be extracted to a shared utility.



Summary
Brief description of what this PR does and why.
Fixes #(issue)
Type of Change
Testing
How has this been tested? What should reviewers focus on?
Checklist
Screenshots/Videos