{"service":"Hono Production Server","endpoints":{"GET /health":"Health check endpoint (Public)","GET /":"Service info endpoint (Public)","POST /queue/webscrape":"Queue web scraping job (Auth required - Editor+)","POST /job-splitting/split":"Manual job splitting (Auth required - Editor+)","POST /job-splitting/trigger-split":"Trigger job splitting (Auth required - Editor+)","GET /job-splitting/status/:sourceId":"Get job splitting status (Auth required - Editor+)","POST /event-parsing/queue":"Queue event parsing (Auth required - Editor+)","POST /email-processing/queue":"Queue email processing (Auth required - Editor+)","GET /scrapes/stream":"SSE stream for scrape monitoring (Auth required - Editor+)","GET /emails/stream":"SSE stream for email monitoring (Auth required - Editor+)","POST /jobs/:jobId/force-pass-curation":"Force pass curation (Auth required - Editor+)","POST /article/generate":"Generate article via SQS (Auth required - Editor+)","POST /article-writer/run":"Execute Article Writer orchestrator (Auth required - Editor+)","POST /article-writer/autosuggest":"Get inline article autosuggest completion (Auth required - Editor+)","POST /article-writer/excerpt":"Generate preview excerpt for article cards (Auth required - Editor+)","POST /article/featured-image/generate":"Generate featured image for article (Auth required - Editor+)","POST /articles/generate-bulk":"Start bulk article generation with autosave (Auth required - Editor+)","GET /articles/generate-bulk/:batchId/status":"Get bulk generation batch status (Auth required - Editor+)","GET /articles/generate-bulk/:batchId/stream":"SSE stream for bulk generation progress (Auth required - Editor+)","GET /articles/generate-bulk/batches":"List all bulk generation batches (Auth required - Editor+)","POST /chat/wyatt":"Chat with Wyatt Unified agent - 35 tools for events, businesses, artists, images (Auth required - Editor+)","GET /chat/wyatt/info":"Get Wyatt agent capabilities and available tools (Auth required - Editor+)","GET /chat/wyatt/history":"Load chat history for a thread (Auth required - Editor+)","GET /chat/wyatt/threads":"List all chat threads for a user (Auth required - Editor+)","DELETE /chat/wyatt/thread/:threadId":"Delete a chat thread (Auth required - Editor+)","POST /legacy-articles/run/async":"Start async legacy article generation with SSE (Auth required - Editor+)","GET /legacy-articles/stream/:runId":"SSE stream for legacy article progress (Auth required - Editor+)","GET /legacy-articles/runs":"List cached legacy article runs (Auth required - Editor+)","GET /legacy-articles/result/:runId":"Recover cached legacy article result (Auth required - Editor+)","POST /poster/generate":"Generate event poster (Auth required - Editor+)","POST /poster/generate-sample":"Generate poster sample with database tracking (Auth required - Editor+)","POST /poster/enhance-prompt":"Enhance poster prompt (Auth required - Editor+)","POST /prompt/generate-from-image":"Generate style prompt from image using vision LLM (Auth required - Editor+)","POST /poster/generate-batch":"Generate posters for multiple events with config support and default fallback (Auth required - Editor+)","POST /jobs/:jobId/force-business-match":"Force business match (Auth required - Editor+)","GET /weather/currentTemp":"Get current temperature (Public)","GET /weather/today":"Get today's weather summary (Public)","GET /weather/forecast7":"Get 7-day weather forecast (Public)","GET /scheduled-jobs/status":"Get status of scheduled jobs (Auth required - Editor+)","POST /scheduled-jobs/trigger-email-fetch":"Manually trigger email fetch (Auth required - Editor+)","POST /newsletter-content/events-table/by-date-range":"Generate events table by date range (Auth required - Editor+)","POST /newsletter-content/events-table/by-ids":"Generate events table by occurrence IDs (Auth required - Editor+)","POST /newsletter-content/moon-data":"Get moon data HTML (Auth required - Editor+)","POST /newsletter-content/weather-data":"Get weather data HTML (Auth required - Editor+)","POST /newsletter-content/newsletter-components":"Get all newsletter components (Auth required - Editor+)","POST /cloudflare-images/upload/url":"Upload image from URL to Cloudflare Images (Auth required - Editor+)","POST /cloudflare-images/signed-upload":"Get signed upload URL for client-side uploads (Auth required - Editor+)","POST /cloudflare-images/confirm-upload":"Confirm client-side upload and save to database with auto-captioning (Auth required - Editor+)","GET /cloudflare-images/batch-token":"Get batch token for high-rate uploads (Auth required - Editor+)","POST /cloudflare-images/batch-upload":"Batch upload multiple images from URLs (Auth required - Editor+)","DELETE /cloudflare-images/:id":"Delete an image from Cloudflare Images (Auth required - Editor+)","GET /cloudflare-images/:id":"Get image details from Cloudflare Images (Auth required - Editor+)","GET /cloudflare-images":"List images with pagination from Cloudflare Images (Auth required - Editor+)","PATCH /cloudflare-images/:id/metadata":"Update image metadata in Cloudflare Images (Auth required - Editor+)","GET/POST /hooks/embed/:type/:id":"Create embeddings for content (Auth required - Editor+)","GET /search/articles?query=...&limit=10":"Semantic search for articles (Public)","GET /search/businesses?query=...&limit=10":"Semantic search for businesses (Public)","GET /search/events?query=...&limit=10":"Semantic search for events (Public)","GET /search/stats":"Get embedding statistics for all content types (Public)","GET /related/articles?slug={article_slug}&limit={number}":"Find articles similar to a specific article (Public)","GET /related/businesses?slug={business_slug}&limit={number}":"Find businesses similar to a specific business (Public)","GET /related/events?slug={event_slug}&occurrenceId={occurrence_id}&limit={number}":"Find events similar to a specific event (Public)","GET/POST /embed/batch":"Batch embed all content without embeddings (Editor+ required). Use dangerouslyRefreshAllEmbeddings=true to refresh all embeddings instead of just missing ones","GET/POST /embed/batch-images":"Batch embed images with autoCaption (Editor+ required). Use refreshAll=true to refresh all image embeddings instead of just missing ones","POST /public/submit-event":"Submit an event for processing (Public - protected by honeypot and timing checks)","GET /admin/cache/stats":"Get Redis cache statistics by category (Auth required - Admin)","GET /admin/cache/keys":"List cache keys with pagination and filtering (Auth required - Admin)","GET /admin/cache/categories":"Get list of all cache categories (Auth required - Admin)","DELETE /admin/cache/invalidate":"Bulk invalidate cache keys by patterns or categories (Auth required - Admin)"},"authentication":{"methods":["Session token (cookies)","API key (X-API-Key header)"],"roles":["ADMIN","EDITOR","VIEWER"],"required_role":"EDITOR+ for all POST endpoints"},"port":8080}