feat: IndexNow + Bing Webmaster telemetry, deploy webhook, MCP authz/SSRF hardening, War Room dashboard - #197
Open
ramonmnavarro-byte wants to merge 11 commits into
Open
feat: IndexNow + Bing Webmaster telemetry, deploy webhook, MCP authz/SSRF hardening, War Room dashboard#197ramonmnavarro-byte wants to merge 11 commits into
ramonmnavarro-byte wants to merge 11 commits into
Conversation
GHSA-3jxr-9vmj-r5cp (High): exponential-time expansion of consecutive non-expanding {} groups. Transitive via the glob/minimatch family; pnpm override bumps the single resolved copy 5.0.6 -> 5.0.7. pnpm audit --prod is back to 0 High/Critical (1 low + 1 ignored moderate remain, pre-existing). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ENROUTER_MODEL overrides route cleanly
DataForSEO Labs related/ideas sources return raw candidate rows with no relevance signal; the research service accepted every non-seed row into coverage regardless of topical overlap with the seed. City-modified niche seeds (e.g. "AI receptionist Miami") degraded to token-level matching, returning unrelated high-volume keywords sharing only the location token (school names, USCIS, NFL content). usedFallback only reflected which source succeeded, not whether results were trustworthy. Added shared meaningful-token overlap filtering across all Labs sources before selection; expansions with no relevant candidates now collapse to the existing "not enough keyword data" empty response instead of silently substituting noise. Cache version bumped to invalidate previously-cached polluted results. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Shared workboard view reading clients/seo-warroom.md, wired into nav/route tree.
.wrangler-d1-backup-*.sqlite sat untracked and un-gitignored in the repo root — a broad git add would have committed a database backup with real project/tenant data. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…rity floors Raises pnpm.overrides in pnpm-workspace.yaml to patched versions and removes the now-dead package.json#pnpm.overrides field pnpm was silently ignoring (see existing comment on the workspace overrides block). fast-uri and js-yaml are temporarily added to minimumReleaseAgeExclude since their patched releases (2026-07-31) haven't cleared the 8-day supply-chain window yet; both entries are dated for removal on 2026-08-08. Resolves 5 High pnpm audit findings: GHSA-7p8r-x3mc-p8w7 (fast-uri), GHSA-4cwx-7wf7-3272 (undici), GHSA-mwp4-54f8-5fhr/-4xrf-jv44-h6hh/-22jq-vg5j-6vgg (ip-address), GHSA-rgw5-rvv9-x895 (brace-expansion), GHSA-5p4m-2wfm-xmqj (js-yaml). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Adds IndexNow URL submission (config + event repositories, client, service, UI page, route, D1/PG schema + migrations, seed scripts, spec doc) and four MCP tools: crawl_audit (with a literal-IP SSRF denylist, self-documented DNS-rebinding ceiling), ga4_traffic and gsc_second_page (project-membership authz via withMcpProjectAuth, self-documented gap vs per-resource ownership), and get_indexing_queue/submit_indexnow_urls. This work had been sitting uncommitted on local disk for over a week (last touched 2026-07-31) while origin/main moved 26 commits ahead — flagged as a standing risk-of-loss finding in the daily security audit. tsc --noEmit passes clean on the full tree. Not pushed: local branch is 5 ahead / 26 behind origin/main and needs a rebase (and its own review) before going up. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- gsc-second-page: use toSorted instead of sort - ga4-traffic: hoist rows() helper to module scope, type Ga4Report - crawl-audit: extract analyzePage() to cut complexity/max-depth/max-params - war-room: replace unsafe type assertion with toAssignee() guard - googleServiceAccount: use isRecord() type guard All 786 tests pass; our files typecheck and lint clean. Remaining lint/typecheck errors are pre-existing upstream alchemy.run.ts (untouched).
…e 2) - bing_connections table (sqlite + pg, mirrors gsc_connections), migrations drizzle/0038_loose_frog_thor.sql + drizzle-pg/0015_tricky_molecule_man.sql - BING_OAUTH_PROVIDER_ID=bing-webmaster, scopes webmaster.read/manage - Better Auth OAuth config + self-hosted callback route + API-key fallback (BING_WEBMASTER_API_KEY env) - BingConnectionRepository, BingService, bingClient (crawl issues, visibility) - MCP tools: get_bing_visibility, get_bing_crawl_issues (project-auth wrapped) - 797 tests pass; schema parity green; db:generate clean on both dialects
…ls (Phase 3) - War Room server functions: getWarRoomIndexingTelemetry + getWarRoomBingTelemetry (authenticated, read-only, org-scoped; IndexNow config/event counts + recent ledger, Bing connection status + visibility + crawl issues, per-project errors) - WarRoomTelemetry.tsx: IndexNow + Bing telemetry sections in the War Room UI - web/content/docs/mcp.md: document submit_indexnow_urls, get_indexing_queue, get_bing_visibility, get_bing_crawl_issues - 797 tests pass; typecheck + lint clean (only pre-existing alchemy.run.ts errors)
- POST /api/webhooks/indexnow: shared-secret auth (X-IndexNow-Webhook-Secret or Bearer) + INDEXNOW_WEBHOOK_HOSTS exact allowlist; no browser session - Payload sources: urls / changedUrls / single url / sitemap+homepage discovery fallback; HTTPS + public-host validation, SSRF guards, 64 KiB / 2,000 URL / 500-per-project caps - 5-minute dedupe via successful indexing_events ledger rows (idempotent) - Route tree + env examples + docs/INDEXNOW_WEBHOOKS.md + 4 focused tests - 801 tests pass; parity 132; db:generate clean both dialects; typecheck + lint clean (only pre-existing alchemy.run.ts errors)
Author
|
👋 @bensenescu — ready for review whenever you get a chance. This PR implements the full Indexing + Bing Visibility feature set (Phases 1–4 of the roadmap) plus MCP security hardening and the War Room dashboard:
Verification: 801 tests pass (incl. 132 schema-parity), Fork PR since direct push to upstream is denied. Happy to split into smaller PRs or adjust anything to fit your review process. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds the Indexing & Bing Visibility feature set (Phases 1–4 of the roadmap) plus security hardening and the War Room dashboard.
What's included
Phase 1 — IndexNow submission
IndexNowService— submit URLs toapi.indexnow.org, batch (max 100/req), retry 429/network with backoff, ledger every attemptindexnow_configs,indexing_eventssubmit_indexnow_urls,get_indexing_queue/p/:projectId/indexing+ sidebar entryPhase 2 — Bing Webmaster OAuth + read-only telemetry
bing_connectionstable (both dialects, mirrorsgsc_connections)bing-webmasterprovider) + self-hosted API-key fallbackBingService+bingClient(crawl issues, visibility)get_bing_visibility,get_bing_crawl_issuesPhase 3 — War Room telemetry + MCP docs
getWarRoomIndexingTelemetry+getWarRoomBingTelemetryserver functions (authenticated, read-only, org-scoped) +WarRoomTelemetry.tsxUIweb/content/docs/mcp.mddocuments all 4 new MCP toolsPhase 4 — IndexNow deploy webhook (new)
POST /api/webhooks/indexnow— callable by external systems (Vercel deploy hook / CI) without a browser sessionX-IndexNow-Webhook-Secretor Bearer) + exactINDEXNOW_WEBHOOK_HOSTSallowlisturls/changedUrls/url, or sitemap+homepage discovery fallbackdocs/INDEXNOW_WEBHOOKS.md+ env examplesMCP tool authz / SSRF hardening
withMcpProjectAuth(project-scoped authorization); SSRF protections on outbound fetchesWar Room dashboard
/war-roomroute + nav entrySecurity floors
Verification
db:generateclean on both d1 + pg dialectsalchemy.run.tserrors untouched)Note
Fork PR (upstream denies direct push).