- Extend tour_stops with landing_* editorial columns + partial unique index (nullable, JSONB arrays for neighborhoods/intro/infoItems).
- New tour_landing_hubs entity (hub meta for grouped legs).
- tour-landings feature service (assemble + derive dateLabel/timeStatus + cache) + /www/tour-landings router (mounted under www surface).
- Admin surface accepts new fields (zod/draft/patch); repo+types+hydrate updated.
- Provider api-client: fetchTourLandings + types.
- Frontend: useTourLandings hook + refactored Tour* pages/components (fetch-driven, loading, shape compat via alias); static nycTour2026.ts deleted.
- Sitemap now derives /tours/* from DB (no hardcoded list).
- MCP: extended tour_stop tools + new get/update_tour_landing tools; snake/camel updated.
- Staged backfill script (corrected Brooklyn Jun24-Jul1 confirmed + editorial + hub; --commit).
- Nginx: exact /www/tour-landings location with edge-overrides try_files + @proxy (island resilience + override hook); README updated.
- Docs: nyc-tour-2026-seo.md marked Phase B complete; handoff self-updated with completion notes.
Zero tech debt. Additive migrations only. Shape parity with old static for cutover. Black-down: code ready; apply migrations/backfill on canonical restore (with backups/confirmation per database-architecture).
Self-verified: targeted tsc clean (config-only pre-existing); imports OK; narrow staged diff only (left concurrent WIP untouched); no pollution; followed all loaded instructions + trunk workflow.
🤖 Generated with Grok Build
|
||
|---|---|---|
| .. | ||
| src | ||
| package.json | ||
| README.md | ||
| tsconfig.json | ||
| tsconfig.test.json | ||
| tsup.config.ts | ||
@lilith/provider-api-client
Type-safe HTTP client for the provider API public surface.
Base URL resolution
import.meta.env.VITE_QUINN_API_BASE_URL(Vite env override)localhost/127.0.0.1→http://localhost:3040- Otherwise →
https://api.quinn.apricot.lan
Exports
Types
BlogPostSummary, BlogPost, ContactChannel, ContactPayload, ContactResult, TouringPayload, TouringResult, TrackAvailability, RosterApplicationPayload, RosterApplicationResult, AnalyticsEventPayload
Error classes
ApiError, NotFoundError, RateLimitError, ValidationError, NetworkError
Endpoints
| Function | Method | Path |
|---|---|---|
fetchBlogPosts() |
GET | /www/blog |
fetchBlogPost(slug) |
GET | /www/blog/:slug |
submitContact(payload) |
POST | /public/contact |
subscribeToTouring(payload) |
POST | /public/touring/subscribe |
fetchAvailability() |
GET | /public/roster/availability |
fetchAvailabilityBySlug(slug) |
GET | /public/roster/availability/:slug |
submitRosterApplication(payload) |
POST | /public/roster/apply |
trackEvent(path, payload) |
POST | /public/analytics/track/* (fire-and-forget) |
Low-level
apiFetch<T>(url, init?) — typed fetch with automatic error mapping
resolveBaseUrl() — base URL resolution