@seldonframe/mcp 1.40.2 → 1.40.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -1
- package/src/welcome.js +2 -2
package/package.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seldonframe/mcp",
|
|
3
|
-
"version": "1.40.
|
|
3
|
+
"version": "1.40.3",
|
|
4
|
+
"description": "MCP server for SeldonFrame — AI-native Business OS platform. v1.40.3: HOTFIX — kill the broken keyless source.unsplash.com fallback. The HERO Aesthetic Co. test reproduced a hero broken-image icon despite v1.40.2's onError handler being deployed (proven by the gallery rendering 4 medspa photos correctly). ROOT CAUSE: resolveHeroImageUrlForQuery + resolveGalleryImageUrlsForQueries fell back to https://source.unsplash.com/{w}x{h}/?{query} when the official Unsplash API returned no results or errored. That endpoint is DEPRECATED and now frequently returns broken responses, which were stored verbatim in landingPages.sections (LandingPageSection[]) and rendered as broken-image icons before the v1.40.2 onError handler eventually flipped state. The bandage was working but the sutures still leaked. FIX: never store a known-broken URL. Both resolvers now return EMPTY for misses (resolveHeroImageUrlForQuery returns '', resolveGalleryImageUrlsForQueries skips the slot entirely). When hero query misses, hero component renders its designed branded-gradient empty-state from frame zero — no broken icon ever flickers in. When gallery query misses, the masonry grid auto-reflows to a clean N-tile composition (a 6-service gallery with 4 valid Unsplash hits renders as 4 tiles, not 4 photos + 2 broken). Trade-off: workspaces without UNSPLASH_ACCESS_KEY env var now ship gradient hero + empty gallery instead of keyless-CDN attempts. That's the right trade — gradient is intentional; broken icon is broken. Operators get full control by setting UNSPLASH_ACCESS_KEY (free Unsplash developer account, 50 req/hour) or replacing images post-launch via update_landing_section. Server-side: also added an unsplash_gallery_no_results log event to surface API quota exhaustion in production. NO new env vars, NO migrations. Backend redeploy required. EXPECTED IMPACT: HERO Aesthetic Co. (or any fresh medspa) renders a real Unsplash medspa photo in the hero (when API key configured) OR a polished branded-gradient fallback (when not) — never a broken-image icon. Pairs with v1.40.2's per-tile onError defense as belt + suspenders.",
|
|
4
5
|
"description": "MCP server for SeldonFrame — AI-native Business OS platform. v1.40.2: HOTFIX — booking timezone bug + foolproof image fallbacks. Three real bugs surfaced by the Vesper Aesthetic test. (1) BOOKING TIMEZONE BUG — slot_outside_business_hours rejection on every booking from a non-UTC customer. ROOT CAUSE: listPublicBookingSlotsAction generated slot strings using server-local time (UTC on Vercel) but workspace business hours are in operator's IANA TZ (America/Chicago for Vesper). Customer in Toronto picked '2:00 PM' → slot string '2026-05-14T14:00' (no Z) → server interpreted as 14:00 UTC = 9 AM CDT = OUTSIDE Vesper's 10 AM–8 PM CDT hours → REJECTED. The submit handler validated correctly in workspace TZ; the slot generator did not. FIX: NEW utcMomentForLocalTime(year, month, day, hour, minute, timeZone) helper builds a UTC Date that, when formatted in target TZ, shows the intended local Y-M-D H:M (DST-robust via Intl.DateTimeFormat round-trip). listPublicBookingSlotsAction now (a) reads workspace.timezone from organizations.timezone, (b) parses the requested date in workspace TZ, (c) builds slot starts via utcMomentForLocalTime so they match workspace's local hours, (d) returns slots as full UTC ISO strings (with Z suffix) — unambiguous, no more browser-vs-server interpretation drift. PublicBookingForm now formats slots via .toLocaleTimeString({timeZone: workspaceTimezone}), shows '< times shown in CDT >' label, and surfaces the workspace's IANA TZ in the meta row. Customer sees operator's actual hours, server sees the same UTC moment, submit validates against the same workspace TZ. (2) HERO IMAGE onError CLIENT-SIDE FALLBACK. Pre-1.40.2 a 404 / unreachable Unsplash URL still rendered as a broken <img> with alt-text visible (Vesper test: 'Board-Certified Skin Care' alt text bled through the gradient overlay). v1.40.2 adds useState imageFailed + onError handlers across all 4 hero variants (cinematic-fullbleed, split-screen-50-50, left-aligned-asymmetric, founder-portrait) — when the image fails, the variant flips to its branded gradient empty-state with the headline's first word as a typographic anchor. Same pattern, robust against any Unsplash hiccup. Hero made 'use client' to support state. (3) GALLERY PER-TILE onError FALLBACK. Pre-1.40.2 broken gallery photos rendered as broken-image icons inside the masonry grid (Vesper had 2 of 6 broken). NEW GalleryTile internal component with useState failed → returns null when image fails. Grid auto-reflows around missing tiles, leaving a clean 4-tile or 5-tile composition instead of broken slots. Project-gallery component made 'use client' to support per-tile state. NO new env vars. NO migrations. Backend redeploy required. EXPECTED IMPACT: bookings in any customer TZ submit successfully. Hero with broken Unsplash URL falls back to a polished branded gradient — operator-perceived 'always intentional' on first generation. Gallery never shows broken-image icons; grid reflows. Vesper booking flow works end-to-end with intake fields collected and emailed via Resend.",
|
|
5
6
|
"description": "MCP server for SeldonFrame — AI-native Business OS platform. v1.40.1: VERTICAL-AWARE BOOKING + HERO POLISH. Five fixes after the v1.40.0 Lumen test surfaced the gaps. (1) FOOTER 'Powered by SeldonFrame' BADGE REWRITE. Pre-1.40.1 the badge loaded an SVG file whose text was rendered via SVG <text> with a serif font fallback chain — when the user's browser fell back from 'Instrument Serif' to a wider serif, the text overflowed the SVG viewBox and clipped mid-letter ('SeldonFra' instead of 'SeldonFrame'). Replaced with an inline-component approach: geometric mark as inline SVG (no font dependency, can never clip), wordmark as plain HTML text alongside. Faster paint, robust across all browsers. (2) HERO CINEMATIC-FULLBLEED FALLBACK + LIGHTER OVERLAY. When Unsplash returns a 404 / unreachable URL for the hero query (which happened on Lumen — alt text was visible in the upper-left), the variant now renders a brand-tinted gradient anchor with the headline's first word as a typographic element instead of a broken <img>. Looks intentional, not broken. Also softened the gradient overlay from from-black/30 via-black/50 to-black/80 to from-black/10 via-black/40 to-black/65 so working hero photos actually show through. (3) ARCHETYPE-AWARE HERO QUERY GUIDANCE. enhance-blocks prompt extended with per-archetype Unsplash query examples (cinematic-aspirational → 'minimalist spa treatment room', 'serene aesthetic clinic marble'; clinical-trust → 'modern dental clinic interior bright'; soft-residential → 'tidy living room natural light'; brutalist → 'concrete loft natural light'; etc). The previous universal guidance worked for trades but produced weak medspa hero queries. (4) SERVICE PRE-FILL VIA URL PARAM. Services-grid CTAs now append ?service=<slug> derived from each service name. PublicBookingForm reads useSearchParams().get('service'), shows a 'Service requested' banner at the top of step 3, and includes the requested_service value in the intake responses sent to the operator's CRM. The customer's intent finally reaches the operator without a follow-up call. (5) VERTICAL-AWARE BOOKING FORM FIELDS — the structural ship. NEW src/lib/workspace/booking-intake-fields.ts with per-archetype field schemas. bold-urgency (trades) asks address+phone+issue_type+urgency. cinematic-aspirational (medspa) asks phone+primary_goal+previous_treatments+allergies+preferred_provider. clinical-trust (legal/dental) asks phone+client_status+concern+insurance+referral_source. technical-restrained (B2B) asks company+role+team_size+scope+timeline+budget. soft-residential (home cleaning/landscape) asks address+phone+frequency+preferred_day+special_notes. editorial-warm (craft trades) asks address+phone+scope+timeline+budget. brutalist (creative studios) asks company+project_type+brief+timeline+budget. Plus universal 'notes' textarea trailer for every archetype. NEW BookingIntakeField type in lib/bookings/actions.ts (text/textarea/tel/select/radio with options + helpText + required). When create_full_workspace runs, the orchestrator UPDATEs every booking template's metadata.intakeFields with the archetype's defaults. getPublicBookingContext exposes them. PublicBookingForm renders them dynamically as a custom form (replaced CustomerActionForm for step 3) — input/select/radio/textarea per field type, validation for required fields, all values flow through submitPublicBookingAction's new intakeResponses param into the booking row's metadata.intakeResponses field. Operators see structured lead data ('Address: 1234 Main St | Issue: Active emergency | Urgency: Today') the moment a booking lands in their CRM, not after a follow-up call. NO new env vars. NO migrations (additive metadata). Backend redeploy required. EXPECTED IMPACT: a fresh medspa workspace's booking form now asks 'What's your primary goal for this visit?' + 'Previous treatments?' + 'Allergies or sensitivities?' + 'Preferred provider?' instead of a generic notes field. A fresh roofing workspace asks 'Service address' + 'What's happening?' (with options like 'Active emergency', 'Diagnostic visit', 'Repair quote') + 'How urgent is this?'. A fresh law firm asks 'Are you a new client?' + 'What's the matter?' + 'Insurance carrier' + 'How did you hear about us?'. Each operator's CRM lights up with the EXACT data they need to dispatch / schedule / route the lead, automatically, on first booking. Hero image broken? Branded gradient looks intentional. Footer 'Powered by SeldonFrame' renders cleanly across all browsers. The launch-video moment.",
|
|
6
7
|
"description": "MCP server for SeldonFrame — AI-native Business OS platform. v1.40.0: TASTE + CONVERSION + ARCHETYPE SYNTHESIS — the structural ship that closes the gap between SF auto-generated workspaces and hand-tuned designer output. Three forces converge in one commit. (1) AESTHETIC ARCHETYPES (the 'fat skill', inspired by github.com/leonxlnx/taste-skill). NEW src/lib/workspace/aesthetic-archetypes.ts with 7 curated archetypes (editorial-warm / bold-urgency / clinical-trust / cinematic-aspirational / technical-restrained / soft-residential / brutalist), each defining palette + fonts + dials (DESIGN_VARIANCE / MOTION_INTENSITY / VISUAL_DENSITY) + heroVariant + bannedHere tokens + voice (tone / pace / lean-into / avoid words). NOT keyed by vertical — keyed by EMOTIONAL CATEGORY because vertical is too narrow (a custom-restoration roofer has different brand needs than a storm-chaser; both are 'roofing'). NEW classifyArchetype() picks based on (vertical + emergency_service + voice signals + business description keywords). Adding new archetypes = one entry. (2) TASTE-SKILL DISCIPLINE injected into the LLM prompt. enhance-blocks now renders an archetype-specific design brief at the top of every Opus call: voice tone, banned tokens (Inter banned, centered hero banned, 3-equal-card grids banned, AI purple/blue banned, pure black banned), universal taste-skill rules (max 1 accent < 80% sat, transform/opacity-only animation, asymmetric layouts), output discipline (headlines convey value standalone, 'so that' chaining, specific time numbers, effort-reduction subheads). Anti-AI-slop discipline becomes a hard constraint, not a passing instruction. (3) HORMOZI VALUE EQUATION baked into prompt. Above-the-fold gets 80-90% of generation weight per Hormozi: dream outcome in headline, 'so that' principle, time-delay numbers, effort-reduction in subhead, perceived-likelihood-of-success via proof + testimonials, risk-reversal via badges under CTA. NEW hero.tsx renders 4 variants by archetype: cinematic-fullbleed (image as page background, copy overlays), founder-portrait (square portrait right + copy left), split-screen-50-50 (classic 50/50, urgency-friendly), left-aligned-asymmetric (60/40 editorial — the default). NEW ProofTile component above CTA cluster (rating + count + descriptor in compact pill row). NEW RiskReversalBadges row under CTA with license #s, BBB, insured, certifications. (4) FONTS. DEFAULT_ORG_THEME flipped from Inter to Geist. OrgTheme.fontFamily union expanded with Cabinet Grotesk, Satoshi (added Fontshare CDN support to googleFontUrl helper). The taste-skill explicitly bans Inter as the AI-default font; we comply. Each archetype overrides the org theme with its own font pair on workspace creation, so a roofer gets Outfit/Geist, a medspa gets Cabinet Grotesk/Satoshi, a legal firm gets Cabinet Grotesk/Geist. (5) THEME PROPAGATION. After classifying archetype, enhanceLandingForWorkspace UPDATEs organizations.theme with the archetype's primary/secondary/font tokens so PublicThemeProvider cascades the right palette + font on every public surface (landing, booking, intake) automatically. (6) personality_vertical threaded from createFullWorkspace into enhance-blocks so classifier uses the resolved CRMPersonality vertical instead of inferring from soup. SOFT-FAIL on every step. NO new env vars. NO migrations. Backend redeploy required. EXPECTED IMPACT: a fresh roofing workspace renders with Outfit/Geist typography, deep-terracotta + warm-cream palette, left-aligned-asymmetric hero (NOT centered), proof tile above CTA, risk-reversal badges under CTA, taste-skill-disciplined section copy. A fresh medspa renders Cabinet Grotesk/Satoshi, muted gold + cream, cinematic-fullbleed hero. A fresh legal firm renders Cabinet Grotesk/Geist, deep navy + burgundy, restrained left-aligned hero. Same template, same pipeline, FUNDAMENTALLY different visual identities per niche. 9.5+/10 first-shot for the visual surface. Inspired by Trevor Foyer's manual workflow (inspiration → Stitch → design.md → Claude + taste-skill → 21st.dev), automated server-side in ~30s instead of 25min.",
|
package/src/welcome.js
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
// stripped. `create_full_workspace` is the only workspace-creation
|
|
9
9
|
// path mentioned anywhere in this briefing.
|
|
10
10
|
|
|
11
|
-
export const VERSION = "1.40.
|
|
11
|
+
export const VERSION = "1.40.3";
|
|
12
12
|
|
|
13
13
|
export const WELCOME_MARKDOWN = `# SeldonFrame — create a real Business OS in one conversation
|
|
14
14
|
|
|
@@ -433,4 +433,4 @@ admin dashboard. Pre-fills their email automatically.
|
|
|
433
433
|
<https://seldonframe.com> · **Discord:** <https://discord.gg/sbVUu976NW>
|
|
434
434
|
`;
|
|
435
435
|
|
|
436
|
-
export const FIRST_CALL_BANNER = `🚀 SeldonFrame v1.40.2 is connected. STEP ZERO: for any workspace task call get_workspace_state({workspace_id}) FIRST — returns workspace identity + integrations status + agents with inline health stats + counts + tailored next_steps in ONE round-trip. Replaces 4-6 progressive discovery calls. ANTI-PATTERNS: don't ls/cat/read .env (SF is hosted, not local files); don't check node/npm versions (irrelevant); don't ask 'is Anthropic key configured?' (state response tells you); don't create a duplicate agent (state response shows existing ones — use update_website_chatbot instead of build_website_chatbot when one exists). Token-budget concept removed in v1.27.9 — ignore stale references. CAPABILITY MAP — pick the right primitive BEFORE exploring tools: (a) "build me a website" → WORKSPACE → create_workspace_v2 + block tools. (b) "add a chatbot to my website / landing page" → AGENT (web chat) → build_website_chatbot (v1.28+ skill bundle: configure_llm + create_agent + publish-test in 1 call; auto-detects ANTHROPIC_API_KEY from env). Drop to primitives (configure_llm_provider + create_agent + publish_agent) only for custom flows. CRITICAL ANTI-PATTERN: chat widgets are NOT blocks. Don't search list_blocks for chat — chat agents are a separate primitive (v1.26+). (c) "auto-reply to inbound SMS/email" → CONVERSATION → send_conversation_turn (one-shot Soul-aware reply, not a website widget). (d) "add hero/services/faq/cta section" → BLOCK → get_block_skill + persist_block. (e) "send campaign email/sms" → MESSAGING. (f) CRM ops → list_contacts/create_deal/etc. CHATBOT CANONICAL FLOW (v1.28+ — 1 call instead of 5): build_website_chatbot({workspace_id, name, faq, pricing_facts, greeting}) → wraps configure_llm + create_agent + publish-test in one call, auto-detects ANTHROPIC_API_KEY from env. Then: operator sandbox-tests at /agents/[id]/test → publish_agent({status:"live"}) auto-runs 8-scenario eval gate (≥87.5% pass required). Observability tools after publish: list_agents, tail_agent_conversations, get_agent_conversation, get_agent_metrics, run_agent_evals, replay_conversation. Dashboard surfaces /agents, /agents/[id]/test, /agents/[id]/settings, /agents/[id]/evals, /agents/[id]/conversations let operators iterate without leaving the browser. WORKSPACE FLOW (legacy reference): create_workspace_v2 → IN PARALLEL for all 7 recommended_blocks (hero, services, about, faq, cta, booking, intake): get_block_skill + persist_block → complete_workspace_v2 → finalize_workspace({workspace_id, email}). Run blocks in PARALLEL (Promise.all) — sequential takes 60+ seconds. v1.10+ CUSTOMIZE: regenerate_block, upload_workspace_image (image_url preferred over base64). v1.11+ STRUCTURAL: get_landing_structure, move_section, delete_section. v1.12+ COMPOSITES: add_composite_section / update_composite_section — manifest ANY block from 12 low-level primitives. Skipping finalize_workspace leaves the operator with no admin login. Every URL is real. NEVER create local files. v1.34+ UI POLISH (smart defaults + optional levers): every published page ships with motion baked in (RevealOnScroll on sections, Stagger on grid blocks, HoverLift on CTAs) — no operator action required. For operators who want to tune intensity: apply_motion_preset({preset: "minimal"|"subtle"|"balanced"|"editorial"}). For operators bringing their own design system: apply_design_md({design_md_content}) accepts the Google Labs DESIGN.md format; import_claude_design_handoff({bundle}) accepts Claude Design's handoff bundle. All three tools are OPTIONAL — surface them only when the operator's vibe asks for it ("make it feel premium", "I have a brand kit", "I just exported from Claude Design"). Never push these on a user who just wants a working site. v1.36+ PROMPT-FATIGUE GUIDANCE: workspace creation typically fires 8–18 MCP tool calls (workspace + blocks + agent + booking + intake + landing). Claude Code prompts on each by default and create_landing_page's Puck schema is verbose JSON the operator should NOT read. DO TWO THINGS to avoid spamming: (1) RECOMMEND THE OPERATOR pick option 2 ('Yes, and do not ask again for seldonframe – <tool>') the FIRST time create_landing_page / persist_block / build_website_chatbot fire — Claude Code caches per-tool autoapprove for the project, the rest of workspace creation runs without interrupting them. Mention this proactively before the flow starts. (2) BUNDLE TOOL CALLS in parallel via Promise.all — never call get_block_skill + persist_block sequentially for 7 blocks; fire them all at once. v1.36+ LANDING-PAGE COMPOSITION FOR LOCAL-SERVICE BUSINESSES: for trades/service businesses (plumbing, HVAC, locksmith, electrician, roofing, towing, dental, salon, mobile mechanic), default to a 10-section composition: navbar → hero (branded gradient empty-state when no photo) → emergencyStrip (sticky brand-colored banner with phone) → trust strip via the Grid block → servicesGrid (per-service cards with price + duration + Book CTA — replaces the SaaS-style pricing block) → benefits (3 differentiators) → process (3-step what-happens-after-booking) → serviceArea (chip cloud of cities/neighborhoods) → testimonials (5+ quotes — placeholder OK pre-launch) → faq → cta → footer. The Pricing block belongs to TIER-based businesses (SaaS, coaches, gyms) NOT per-service businesses — substitute servicesGrid. v1.36.0 added the servicesGrid, emergencyStrip, serviceArea block types — use them when persisting landing pages for trades verticals. The hero block ships a branded-gradient empty state when heroImage is missing; if the operator does not provide a photo, suggest a stock-photo prompt ('your tech truck on a job, sunset shot in Phoenix') so they can drop one in via /landing → Edit later. v1.37.0 GOOGLE MAPS PASTE → WORKSPACE: when the operator pastes a Google Maps business listing (Top Plumbing Experts, ABC Plumbing of San Antonio, etc.), use create_workspace_from_google_paste — NOT create_full_workspace. Same backend pipeline + same finalize_workspace follow-up; the paste-tool's docstring documents the extraction rules (name → bold title, phone → phone-icon row, address → location-pin line, services → categories chip row + 'Services' section deduped, rating + count → '4.7 ★ (950)' element, weekly_hours → 'Monday: 9 AM-5 PM, Tuesday: closed' parsed into canonical {monday:{enabled:true,start:'09:00',end:'17:00'},...} shape). The weekly_hours field flows DIRECTLY into the booking template's metadata.availability, so the operator's actual hours appear on the public /book page on first GET — no separate configure_booking call. 'Open 24 hours' → start:'00:00', end:'23:59'. 'Closed' day → enabled:false. Wrong key shape (e.g. 'mon' instead of 'monday') is silently dropped by the backend and falls back to Mon-Fri 9-5 defaults. NO Google Places API key required — the paste IS the source of truth. v1.36.4 paired fix: the booking page's normalizeAvailability now accepts both 3-letter and full-name day keys, so any legacy rows already in the DB also hydrate correctly. v1.38.3 ADDITIONAL QUALITY BLOCKS: (a) projectGallery — 6-photo masonry of stock photos auto-fetched per service via Unsplash from queries Claude generates inside enhance-blocks; closes the "feels populated" gap that's the single biggest visible difference between a generic SF workspace and a real-business landing page. (b) stickyMobileCTA — fixed bottom-of-screen Call/Book bar, MOBILE ONLY (md:hidden), industry-standard for trades sites with 2-3x mobile booking lift; auto-included whenever a phone is set. (c) testimonial synthesis from Maps paste — when the operator pastes a Google Maps listing that contains review excerpts, Claude Code extracts them VERBATIM into a 'testimonials' field on create_workspace_from_google_paste; backend renders them as-is. NEVER fabricated — if the paste has no review text, the testimonials block is OMITTED from the page entirely (better empty than fake). The testimonials field in the MCP tool input is OPTIONAL — Claude must omit it when the paste doesn't contain real review text. v1.38.0 ATOMIC HORMOZI-QUALITY OUTPUT: every workspace produced by create_full_workspace OR create_workspace_from_google_paste now ships with Hormozi value-equation hero copy + per-business Unsplash photos + scroll-triggered motion baked in — atomically, no follow-up tool calls, no operator action. Pre-1.38.0 the atomic create produced canned 'Welcome to X' copy from personality content templates; only workspaces where Claude Code did the BLOCK-AS-SKILL flow afterward (get_block_skill + persist_block per block) got the rich output. Tirionforge HVAC happened to look great because of that follow-up; atlantic-plumbing didn't get it. v1.38.0 closes the gap by adding Step 12.7 inside the orchestrator: ONE Claude Opus 4.7 call generates hero + servicesGrid + about + benefits + process + faq + cta from src/blocks/*/SKILL.md (the exact same fat skill files Claude Code reads via get_block_skill — single source of truth, no duplication). Output writes to landingPages.sections (LandingPageSection[]), contentHtml/Css get NULLED, route /l/[orgSlug]/[slug] falls through to <PageRenderer> which auto-wraps below-fold sections in <RevealOnScroll>. Hormozi copy + per-business Unsplash + motion all light up at once. EMAIL-FIRST GUARDRAIL UNCHANGED: create_full_workspace + create_workspace_from_google_paste both still RETURN BEFORE THE EMAIL DANCE — operator can't see URLs until they reply with email, finalize_workspace mints the magic admin link + sends the welcome email via Resend. BYOK pass-through: getAIClient checks organizations.integrations.anthropic.apiKey first, falls back to platform ANTHROPIC_API_KEY env. Cost ~$0.10 per workspace, irrelevant since the operator typically supplies their own key. SOFT-FAIL: any error in Step 12.7 leaves the workspace valid (canned-copy Path A intact); never blocks creation. EXPECTED IMPACT: every fresh workspace looks $10k-tier first-shot, no "create workspace then enhance blocks" two-step dance. ws1-webhook-pricing-fixes branch ships this; redeploy required.`;
|
|
436
|
+
export const FIRST_CALL_BANNER = `🚀 SeldonFrame v1.40.3 is connected. STEP ZERO: for any workspace task call get_workspace_state({workspace_id}) FIRST — returns workspace identity + integrations status + agents with inline health stats + counts + tailored next_steps in ONE round-trip. Replaces 4-6 progressive discovery calls. ANTI-PATTERNS: don't ls/cat/read .env (SF is hosted, not local files); don't check node/npm versions (irrelevant); don't ask 'is Anthropic key configured?' (state response tells you); don't create a duplicate agent (state response shows existing ones — use update_website_chatbot instead of build_website_chatbot when one exists). Token-budget concept removed in v1.27.9 — ignore stale references. CAPABILITY MAP — pick the right primitive BEFORE exploring tools: (a) "build me a website" → WORKSPACE → create_workspace_v2 + block tools. (b) "add a chatbot to my website / landing page" → AGENT (web chat) → build_website_chatbot (v1.28+ skill bundle: configure_llm + create_agent + publish-test in 1 call; auto-detects ANTHROPIC_API_KEY from env). Drop to primitives (configure_llm_provider + create_agent + publish_agent) only for custom flows. CRITICAL ANTI-PATTERN: chat widgets are NOT blocks. Don't search list_blocks for chat — chat agents are a separate primitive (v1.26+). (c) "auto-reply to inbound SMS/email" → CONVERSATION → send_conversation_turn (one-shot Soul-aware reply, not a website widget). (d) "add hero/services/faq/cta section" → BLOCK → get_block_skill + persist_block. (e) "send campaign email/sms" → MESSAGING. (f) CRM ops → list_contacts/create_deal/etc. CHATBOT CANONICAL FLOW (v1.28+ — 1 call instead of 5): build_website_chatbot({workspace_id, name, faq, pricing_facts, greeting}) → wraps configure_llm + create_agent + publish-test in one call, auto-detects ANTHROPIC_API_KEY from env. Then: operator sandbox-tests at /agents/[id]/test → publish_agent({status:"live"}) auto-runs 8-scenario eval gate (≥87.5% pass required). Observability tools after publish: list_agents, tail_agent_conversations, get_agent_conversation, get_agent_metrics, run_agent_evals, replay_conversation. Dashboard surfaces /agents, /agents/[id]/test, /agents/[id]/settings, /agents/[id]/evals, /agents/[id]/conversations let operators iterate without leaving the browser. WORKSPACE FLOW (legacy reference): create_workspace_v2 → IN PARALLEL for all 7 recommended_blocks (hero, services, about, faq, cta, booking, intake): get_block_skill + persist_block → complete_workspace_v2 → finalize_workspace({workspace_id, email}). Run blocks in PARALLEL (Promise.all) — sequential takes 60+ seconds. v1.10+ CUSTOMIZE: regenerate_block, upload_workspace_image (image_url preferred over base64). v1.11+ STRUCTURAL: get_landing_structure, move_section, delete_section. v1.12+ COMPOSITES: add_composite_section / update_composite_section — manifest ANY block from 12 low-level primitives. Skipping finalize_workspace leaves the operator with no admin login. Every URL is real. NEVER create local files. v1.34+ UI POLISH (smart defaults + optional levers): every published page ships with motion baked in (RevealOnScroll on sections, Stagger on grid blocks, HoverLift on CTAs) — no operator action required. For operators who want to tune intensity: apply_motion_preset({preset: "minimal"|"subtle"|"balanced"|"editorial"}). For operators bringing their own design system: apply_design_md({design_md_content}) accepts the Google Labs DESIGN.md format; import_claude_design_handoff({bundle}) accepts Claude Design's handoff bundle. All three tools are OPTIONAL — surface them only when the operator's vibe asks for it ("make it feel premium", "I have a brand kit", "I just exported from Claude Design"). Never push these on a user who just wants a working site. v1.36+ PROMPT-FATIGUE GUIDANCE: workspace creation typically fires 8–18 MCP tool calls (workspace + blocks + agent + booking + intake + landing). Claude Code prompts on each by default and create_landing_page's Puck schema is verbose JSON the operator should NOT read. DO TWO THINGS to avoid spamming: (1) RECOMMEND THE OPERATOR pick option 2 ('Yes, and do not ask again for seldonframe – <tool>') the FIRST time create_landing_page / persist_block / build_website_chatbot fire — Claude Code caches per-tool autoapprove for the project, the rest of workspace creation runs without interrupting them. Mention this proactively before the flow starts. (2) BUNDLE TOOL CALLS in parallel via Promise.all — never call get_block_skill + persist_block sequentially for 7 blocks; fire them all at once. v1.36+ LANDING-PAGE COMPOSITION FOR LOCAL-SERVICE BUSINESSES: for trades/service businesses (plumbing, HVAC, locksmith, electrician, roofing, towing, dental, salon, mobile mechanic), default to a 10-section composition: navbar → hero (branded gradient empty-state when no photo) → emergencyStrip (sticky brand-colored banner with phone) → trust strip via the Grid block → servicesGrid (per-service cards with price + duration + Book CTA — replaces the SaaS-style pricing block) → benefits (3 differentiators) → process (3-step what-happens-after-booking) → serviceArea (chip cloud of cities/neighborhoods) → testimonials (5+ quotes — placeholder OK pre-launch) → faq → cta → footer. The Pricing block belongs to TIER-based businesses (SaaS, coaches, gyms) NOT per-service businesses — substitute servicesGrid. v1.36.0 added the servicesGrid, emergencyStrip, serviceArea block types — use them when persisting landing pages for trades verticals. The hero block ships a branded-gradient empty state when heroImage is missing; if the operator does not provide a photo, suggest a stock-photo prompt ('your tech truck on a job, sunset shot in Phoenix') so they can drop one in via /landing → Edit later. v1.37.0 GOOGLE MAPS PASTE → WORKSPACE: when the operator pastes a Google Maps business listing (Top Plumbing Experts, ABC Plumbing of San Antonio, etc.), use create_workspace_from_google_paste — NOT create_full_workspace. Same backend pipeline + same finalize_workspace follow-up; the paste-tool's docstring documents the extraction rules (name → bold title, phone → phone-icon row, address → location-pin line, services → categories chip row + 'Services' section deduped, rating + count → '4.7 ★ (950)' element, weekly_hours → 'Monday: 9 AM-5 PM, Tuesday: closed' parsed into canonical {monday:{enabled:true,start:'09:00',end:'17:00'},...} shape). The weekly_hours field flows DIRECTLY into the booking template's metadata.availability, so the operator's actual hours appear on the public /book page on first GET — no separate configure_booking call. 'Open 24 hours' → start:'00:00', end:'23:59'. 'Closed' day → enabled:false. Wrong key shape (e.g. 'mon' instead of 'monday') is silently dropped by the backend and falls back to Mon-Fri 9-5 defaults. NO Google Places API key required — the paste IS the source of truth. v1.36.4 paired fix: the booking page's normalizeAvailability now accepts both 3-letter and full-name day keys, so any legacy rows already in the DB also hydrate correctly. v1.38.3 ADDITIONAL QUALITY BLOCKS: (a) projectGallery — 6-photo masonry of stock photos auto-fetched per service via Unsplash from queries Claude generates inside enhance-blocks; closes the "feels populated" gap that's the single biggest visible difference between a generic SF workspace and a real-business landing page. (b) stickyMobileCTA — fixed bottom-of-screen Call/Book bar, MOBILE ONLY (md:hidden), industry-standard for trades sites with 2-3x mobile booking lift; auto-included whenever a phone is set. (c) testimonial synthesis from Maps paste — when the operator pastes a Google Maps listing that contains review excerpts, Claude Code extracts them VERBATIM into a 'testimonials' field on create_workspace_from_google_paste; backend renders them as-is. NEVER fabricated — if the paste has no review text, the testimonials block is OMITTED from the page entirely (better empty than fake). The testimonials field in the MCP tool input is OPTIONAL — Claude must omit it when the paste doesn't contain real review text. v1.38.0 ATOMIC HORMOZI-QUALITY OUTPUT: every workspace produced by create_full_workspace OR create_workspace_from_google_paste now ships with Hormozi value-equation hero copy + per-business Unsplash photos + scroll-triggered motion baked in — atomically, no follow-up tool calls, no operator action. Pre-1.38.0 the atomic create produced canned 'Welcome to X' copy from personality content templates; only workspaces where Claude Code did the BLOCK-AS-SKILL flow afterward (get_block_skill + persist_block per block) got the rich output. Tirionforge HVAC happened to look great because of that follow-up; atlantic-plumbing didn't get it. v1.38.0 closes the gap by adding Step 12.7 inside the orchestrator: ONE Claude Opus 4.7 call generates hero + servicesGrid + about + benefits + process + faq + cta from src/blocks/*/SKILL.md (the exact same fat skill files Claude Code reads via get_block_skill — single source of truth, no duplication). Output writes to landingPages.sections (LandingPageSection[]), contentHtml/Css get NULLED, route /l/[orgSlug]/[slug] falls through to <PageRenderer> which auto-wraps below-fold sections in <RevealOnScroll>. Hormozi copy + per-business Unsplash + motion all light up at once. EMAIL-FIRST GUARDRAIL UNCHANGED: create_full_workspace + create_workspace_from_google_paste both still RETURN BEFORE THE EMAIL DANCE — operator can't see URLs until they reply with email, finalize_workspace mints the magic admin link + sends the welcome email via Resend. BYOK pass-through: getAIClient checks organizations.integrations.anthropic.apiKey first, falls back to platform ANTHROPIC_API_KEY env. Cost ~$0.10 per workspace, irrelevant since the operator typically supplies their own key. SOFT-FAIL: any error in Step 12.7 leaves the workspace valid (canned-copy Path A intact); never blocks creation. EXPECTED IMPACT: every fresh workspace looks $10k-tier first-shot, no "create workspace then enhance blocks" two-step dance. v1.40.3 IMAGE PIPELINE FOOLPROOFING: removed the deprecated source.unsplash.com keyless fallback from BOTH resolveHeroImageUrlForQuery and resolveGalleryImageUrlsForQueries. Pre-1.40.3 when the official Unsplash API errored or returned no results we fell back to https://source.unsplash.com/{w}x{h}/?{query} — that endpoint is deprecated and now frequently returns broken responses, which were stored verbatim in landingPages.sections and rendered as broken-image icons before the v1.40.2 onError handler eventually flipped state. The HERO Aesthetic Co. test exposed this: hero showed a broken-image icon despite the gallery rendering 4 medspa photos correctly (proving onError wasn't reliably catching deprecated-CDN failures). Fix: never store a known-broken URL. Hero query miss → empty string → branded-gradient empty-state from frame zero (no broken icon ever). Gallery query miss → SKIP that slot → grid auto-reflows to a clean 4-tile composition instead of 6 tiles with 2 broken. Trade-off: workspaces without UNSPLASH_ACCESS_KEY now ship gradient hero + empty gallery (better than broken images). Operators get full control by setting the env var or replacing images post-launch via update_landing_section. ws1-webhook-pricing-fixes branch ships this; redeploy required.`;
|