release: promote staging to main - #671
Conversation
* fix(annotations): centralize annotation coordinate validation * fix(analytics): enforce one date-range contract * fix(mcp): harden tool boundary contracts * fix(api): use a consistent API-key authentication challenge * fix(discovery): remove unsupported OAuth discovery * refactor(mcp): prune duplicate contract scaffolding * refactor(mcp): reuse shared workflow schemas * refactor(mcp): inline flag targeting normalization * refactor(docs): route discovery aliases to canonical endpoints * test(mcp): cover annotation ranges at the boundary * fix(discovery): use portable zod import * refactor(discovery): consolidate builder coverage * fix(audit): clarify event vocabulary and filtering * feat(dashboard): improve audit log review experience
…taging chore(staging): sync main promoted changes
* fix(sdk): catch storage errors in getAnonymousId and getSessionId * chore: add changeset for sdk storage error fix * refactor(sdk): use arrow functions in storage-throw test mocks
* fix(dashboard): invalidate flag list with route website id * fix(dashboard): invalidate archived flag restore with route website id --------- Co-authored-by: iza <59828082+izadoesdev@users.noreply.github.com>
* docs: document minimum bun version requirement * docs(contributing): note packageManager bun pin alongside minimum version * docs: fix bun upgrade guidance --------- Co-authored-by: iza <59828082+izadoesdev@users.noreply.github.com>
…667) * fix(shared): respect trackOnlyCategories in generic isBot() fallback * test(shared): fix describe title style --------- Co-authored-by: iza <59828082+izadoesdev@users.noreply.github.com>
* feat(notifications): add Discord provider TODO.md checked off Discord/Teams/Telegram/Google Chat as implemented, but only Slack/email/webhook existed in providers/ and NotificationChannel. Adds a real Discord provider as a first, self-contained slice; corrects the TODO.md checkboxes for the three still-unimplemented channels. - providers/discord.ts: webhook-based DiscordProvider mirroring SlackProvider, posting an embed (title/description/fields, with a priority color + footer for non-normal priority) - providers/payload-utils.ts: truncate/isUserFacingMetadata/ formatMetadataLabel extracted out of slack.ts so Discord doesn't duplicate them; slack.ts now imports from here - types.ts: NotificationChannel gains "discord"; DiscordPayload/ DiscordEmbed/DiscordEmbedField added - client.ts, providers/index.ts: DiscordProvider wired in and exported Deliberately not touched: the alarms DB schema, RPC destination validation (packages/rpc/src/routers/alarms.ts), and the dashboard alarm-sheet UI. Wiring a new channel into the alarms feature end-to-end is a separate, larger surface — a natural follow-up once this provider itself lands. Refs #635 * fix(notifications): enforce Discord's aggregate 6000-char embed limit Greptile flagged that per-component caps alone aren't enough: Discord rejects an embed whose title + description + every field's name/value + footer text sum past 6000 characters, even when each piece individually respects its own limit (25 fields at the max 1024 chars each alone sums to 25,600). Track a running total while building fields and stop adding more once the next one would push the embed over the aggregate limit. * fix(notifications): skip empty discord embed fields --------- Co-authored-by: iza <59828082+izadoesdev@users.noreply.github.com>
…636) * fix(rpc): align funnel cache invalidation key and re-enable caching invalidateFunnelsCache invalidated `byId:<funnelId>:<websiteId>`, but the getById handler cached under `byId:<funnelId>` — the keys never matched, so invalidation silently deleted a Redis key that was never written. All three funnel read paths (list, getById, analyticsByLink) had caching disabled entirely to work around this, even though list and analyticsByLink already used a key/tag format the invalidation helper handles correctly. Fixes #634 * fix(rpc): authorize funnel getById before the cache, not inside it Greptile flagged that re-enabling the getById cache let a workspace authorization check that lived inside queryFn get skipped on a cache hit: withCache returns the cached row directly without ever invoking queryFn, so a second caller without access to the funnel's website could read it once someone else had populated the cache. Resolve the owning websiteId and call withWorkspace before touching the cache, mirroring the same two-step pattern already used in update/delete in this file. Authorization now runs on every request regardless of cache state; only the row fetch itself is cached. Also add the new funnels-cache.test.ts to the package's configured test script (packages/rpc/package.json) — it was passing locally only because `bun test` with no arguments picks up every *.test.ts file, but the package's actual `test` script lists files explicitly and was silently skipping it. * chore(rpc): drop narrative comments from funnel cache changes --------- Co-authored-by: iza <59828082+izadoesdev@users.noreply.github.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
2 Skipped Deployments
|
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository UI Review profile: ASSERTIVE Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Remove the JSON health parser, content hashing, and jsonParsingConfig from the check pipeline. Classify fetch errors (DNS, refused, reset, TLS) instead of passing raw messages, treat 4xx as down, and report real retry counts. Replace the infinite fixed-delay BullMQ retry policy with 3 exponential attempts for checks and bounded fixed retries for delivery, with failure retention. Add a 15-minute scheduler resync loop, memoize the health check, time-box health probes, back off failed probe-IP lookups, and clear the resync timer on shutdown. Add a Docker smoke stage that boots the compiled binary and drives /health/status before the image can ship.
…aching Replace loose record outputs on the uptime router with strict schemas and drop cron/jsonParsingConfig from responses. Fix schedule permissions to require create for creation and delete for deletion instead of update. Pass websiteId through withResource so website-scoped API keys are checked at the website level. Cache and rate limit the public status-page sitemap, cap it at 1000 entries, and set audit organization on mutations. Remove dead uptime AI builders (overview, status breakdown, SSL, by-region) and the pending status they referenced.
Drop cron/jsonParsingConfig/isPublic from monitor types and forms, add the new 12h/24h granularities to the status-page add-monitor dialog, surface a scheduler-inactive warning on monitor details, use DeleteDialog for monitor deletion, and toast on pulse refresh failure instead of console logging.
Scope
Single promotion of the staging integration line to main. No direct-to-main changes.
Included
Deliberately excluded
Validation