Skip to content

feat(cost): Cloudflare as a cost source, read with a pasted API token - #2541

Open
Makisuo wants to merge 11 commits into
mainfrom
cost/cloudflare-source
Open

Makisuo wants to merge 11 commits into
mainfrom
cost/cloudflare-source

feat(cost): Cloudflare marks, account label and drill-down on the rew…

25bbfad
Select commit
Loading
Failed to load commit list.
Maple Review Bot / Maple / review succeeded Nov 13, 2026 in 1m 5s

Confidence 10/10 · No issues found

🟢 Confidence 10/10 · safe to merge. The four files changed since 3feecf7 are display helpers, a dev lab and their tests; each new branch is pinned by a marks or scene test.
no findings · tests covered · risk low

The last commit gives Cloudflare rows the right mark, account label and drill-down, and moves /lab/cost onto the generic credential messages, with tests. It leaves the open VcsWebhookEnqueueFailure alone: apps/api/src/runtime/http-graph.ts only gains the Cloudflare cost route.

  • keyMark/keyDetail read a Cloudflare product and account as Cloudflare's
  • cost-lab.ts tracks per-provider credential changes, not one OpenRouter flag
  • New lab states cover adding, replacing and removing a Cloudflare source

Before merge

Production impact

Open errors in the changed files (1)
Issue Service Occurrences File
@maple/api/routes/VcsWebhookEnqueueFailure (2 issues) maple-api 9 apps/api/src/runtime/http-graph.ts

After this merges, Maple checks whether they stop.

Telemetry this change adds and removes (17)
  • ➕ span name HttpCloudflareCost.set · apps/api/src/routes/internal/cloudflare-cost.http.ts:36
  • ➕ span name HttpCloudflareCost.remove · apps/api/src/routes/internal/cloudflare-cost.http.ts:47
  • ➕ span name CloudflareCostConnectionService.validateWithCloudflare · packages/backend/src/services/cost/CloudflareCostConnectionService.ts:80
  • ➕ span name CloudflareCostConnectionService.set · packages/backend/src/services/cost/CloudflareCostConnectionService.ts:114
  • ➕ span name CloudflareCostConnectionService.remove · packages/backend/src/services/cost/CloudflareCostConnectionService.ts:153
  • ➕ span name CostConnectionStore.save · packages/backend/src/services/cost/CostConnectionStore.ts:88
  • ➕ span name CostConnectionStore.remove · packages/backend/src/services/cost/CostConnectionStore.ts:159
  • ➕ span name CostConnectionStore.load · packages/backend/src/services/cost/CostConnectionStore.ts:180
  • ➕ span name CostSyncService.reconcileConnections · packages/backend/src/services/cost/CostSyncService.ts:212
  • ➕ span name CloudflareCostProvider.pull · packages/backend/src/services/cost/providers/cloudflare/CloudflareCostProvider.ts:70
  • ➕ attribute maple.cost.cloudflare.fee_rows · packages/backend/src/services/cost/providers/cloudflare/CloudflareCostProvider.ts:110
  • ➕ attribute maple.cost.cloudflare.fees_skipped · packages/backend/src/services/cost/providers/cloudflare/CloudflareCostProvider.ts:112
  • ➕ attribute maple.cost.error_reason · packages/backend/src/services/cost/providers/cloudflare/CloudflareCostProvider.ts:118
  • ➕ attribute maple.cost.cloudflare.error · packages/backend/src/services/cost/providers/cloudflare/cloudflare-billing-api.ts:67
  • ➕ attribute maple.cost.cloudflare.listed · packages/backend/src/services/cost/providers/cloudflare/cloudflare-billing-api.ts:68
  • ➕ attribute maple.cost.cloudflare.read · packages/backend/src/services/cost/providers/cloudflare/cloudflare-billing-api.ts:69
  • ➕ attribute maple.cost.cloudflare.status · packages/backend/src/services/cost/providers/cloudflare/cloudflare-billing-api.ts:113
What was checked
  • serviceProvider names only the families normalize.ts:8-21 emits, and falls back to the org's sources
  • Every new lab state has sources and opening messages that reach the screen it names (cost-lab.ts:106-167)
  • marks.test.ts pins real icons: its sources fixture holds both an AWS and an OpenRouter source

25bbfad · Reply "won't fix" to dismiss a finding, or mention @maple-review-bot to ask about one.