@seldonframe/mcp 1.38.3 → 1.38.5

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.
Files changed (2) hide show
  1. package/package.json +3 -1
  2. package/src/welcome.js +2 -2
package/package.json CHANGED
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "name": "@seldonframe/mcp",
3
- "version": "1.38.3",
3
+ "version": "1.38.5",
4
+ "description": "MCP server for SeldonFrame — AI-native Business OS platform. v1.38.5: THREE PRESENTATION-LAYER FIXES discovered after the Texas MAGA Roofing test (v1.38.4 generation quality was at the $10k bar — Hormozi headline + per-business gallery + verbatim testimonials all rendered correctly — but three smaller bugs kept the page from being light-mode + properly iconed). (1) DEFAULT_ORG_THEME.mode flipped from 'dark' to 'light'. Customer-facing public surfaces (workspace landing, booking page, intake form) should be light by industry convention; operators who want a dark public brand can opt-in via theme settings. The 95% case wants light. Existing workspaces unaffected (their theme is already stored in organizations.theme); only newly-created workspaces inherit the new default. (2) /s/[orgSlug]/[...slug]/page.tsx now applies the same light-mode override v1.38.4 added to /l/ and /book/. proxy.ts rewrites the workspace subdomain root '/' to '/s/[slug]/[defaultLandingSlug]' — NOT /l/ as v1.38.4 assumed. So v1.38.4's landing-page light-mode fix never reached the workspace home; the page rendered against whatever theme.mode was stored. v1.38.5 adds publicTheme = {...theme, mode:'light'} + className='light' wrapper to /s/ so the workspace home is now light by default for both new (light by default per fix 1) and old (already-stored-as-dark) workspaces. (3) PER-SERVICE ICONS — services-grid was rendering <Sparkles> on every card even after v1.38.4 added the dynamic icon resolver, because the enhance-blocks prompt didn't ask Claude for an `icon` field per service AND payloadToSections didn't pass icon through. v1.38.5 adds (a) `icon` to the servicesGrid.services[] schema in the prompt, (b) a 'Per-service icons' instruction block teaching Claude which lucide names + vertical-aliases to pick (storm→cloud-rain-wind, shingle→home, gutter→droplets, drain→droplets, heater→zap, ductwork→home, treatment→leaf, etc.), and (c) icon propagation in payloadToSections.servicesGrid. Extended the ICON_MAP in services-grid.tsx with 24 more vertical aliases (roofing: shingle/metal/gutter/tarp/hail/roof; plumbing: drain/leak/heater/pipe/water; hvac: cooling/ac/heating/furnace/ductwork/duct/thermostat/hvac; spa: treatment/facial/massage/laser; auto: vehicle/van/fleet) so any LLM-generated icon name resolves to a sensible visual. NO new env vars. NO migrations. Backend redeploy required. EXPECTED IMPACT: Texas MAGA Roofing re-test (or fresh workspace) renders LIGHT MODE landing page + LIGHT MODE booking calendar + DISTINCT icons across the 7 service cards. 9.5/10 first-shot for the visual surface. Booking-form personalization (asking address/phone/issue per vertical) remains for v1.39.0.",
5
+ "description": "MCP server for SeldonFrame — AI-native Business OS platform. v1.38.4: VISUAL-POLISH BUNDLE — fixes the four issues that kept Hill Mountain Roofing from being 10/10. Generation quality was already at the $10k bar (Hormozi headline + per-business gallery + verbatim testimonials all rendered correctly in v1.38.3); this ship fixes the presentation layer. (1) LIGHT-MODE-BY-DEFAULT for customer-facing surfaces. The pre-1.38.4 PublicThemeProvider only set --sf-* CSS variables; layout components increasingly use Tailwind utility classes (bg-card, text-foreground, bg-muted/15) which resolve to --card / --foreground / --muted-foreground controlled GLOBALLY by the .dark class on <html>. So flipping our theme.mode = 'light' updated --sf-bg to white but bg-card stayed dark, leaving half the page rendered against the global dark cascade. v1.38.4 adds a className='light' wrapper on /l/[orgSlug]/[slug]/page.tsx + book/[orgSlug]/[bookingSlug]/page.tsx to locally disable the global .dark cascade, AND extends themeToCSS to also set the shadcn-convention vars (--background, --foreground, --card, --card-foreground, --muted, --muted-foreground, --border, --input, --ring, --popover, --popover-foreground, --accent, --accent-foreground, --primary, --primary-foreground, --secondary, --secondary-foreground, --destructive, --destructive-foreground) so Tailwind utilities resolve to our intended palette. Two layers of defense — both required because Tailwind v4's :where() selectors otherwise win against inline-styled vars. Same fix kills booking page dark mode (the v1.36.3 bug we'd been failing to root-cause). (2) HERO IMAGE NOW RENDERS. Pre-1.38.4 hero.tsx used next/image, which silently fails when the source domain isn't in next.config.js images.remotePatterns. Hill Mountain Roofing's hero showed alt-text instead of the Unsplash photo because images.unsplash.com wasn't allowlisted. v1.38.4 (a) switches hero to raw <img> with referrerPolicy='no-referrer' + loading='eager' (same pattern project-gallery.tsx already used), AND (b) adds images.remotePatterns for images.unsplash.com / source.unsplash.com / *.public.blob.vercel-storage.com / *.app.seldonframe.com as defense-in-depth for any future next/image usage. (3) DYNAMIC SERVICE ICONS. Pre-1.38.4 services-grid.tsx hardcoded <Sparkles> on every card — even when the LLM generated distinct icon names per service, the component ignored them. v1.38.4 adds a 35-entry name→lucide-component ICON_MAP plus aliases (storm→CloudRainWind, repair→Wrench, install→Hammer, emergency→Zap, warranty→BadgeCheck, etc.) and a normalized-lookup resolver that handles 'BadgeCheck' / 'badge-check' / 'badge_check' equivalently. Each service card now picks its own icon based on the LLM's icon string. Falls back to <Sparkles> on unknown names so a stale icon string never breaks the render. (4) Defense-in-depth on PublicThemeProvider already covered above. NO new env vars. NO migrations. Backend redeploy required. EXPECTED IMPACT: Hill Mountain Roofing test reproduced with v1.38.4 should render light-mode landing + booking, real Unsplash hero photo in the right column, distinct icons across the 7 service cards, and a clearly-light booking calendar where future dates are visually distinguishable from past dates. 9.5/10 first-shot. Remaining gap to 10/10 = operator-supplied logo + real photos.",
4
6
  "description": "MCP server for SeldonFrame — AI-native Business OS platform. v1.38.3 (bundles 1.38.1 + 1.38.2 + 1.38.3): three quality-bar blocks shipped together. (1.38.1) NEW projectGallery block — masonry grid of 6 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. NEW src/components/landing/sections/project-gallery.tsx (responsive 2/3/4 col, hover-lift + zoom interaction, optional caption-on-hover, optional bottom CTA). NEW src/lib/crm/personality-images.ts → resolveGalleryImageUrlsForQueries() helper — square 800x800 thumbs via Unsplash API (when UNSPLASH_ACCESS_KEY env set) with deduplication across queries (avoids 6 services all returning the same generic photo) + keyless source.unsplash.com fallback with per-query random seed. enhance-blocks prompt extended with 'Gallery queries' section that teaches Claude to generate 6 vertical-specific Unsplash queries (e.g. for HVAC: 'hvac technician outdoor unit', 'ductwork installation', 'thermostat residential' — bias toward queries that return DIFFERENT photos). projectGallery section emitted between process and serviceArea in the LandingPageSection[] order. (1.38.2) NEW stickyMobileCTA block — fixed bottom-of-screen Call/Book bar, MOBILE ONLY (md:hidden via Tailwind). Industry-standard for trades sites with measured 2-3x mobile booking lift (Cal.com, Calendly, Mr. Rooter, Roto-Rooter precedent). NEW src/components/landing/sections/sticky-mobile-cta.tsx — 56px tap targets meet WCAG 2.5.5, position:fixed bottom:0 with safe-area-inset-bottom for iOS home indicator clearance, z-index:50 sits above sections but below modals, gradient-divided two-column layout (Call left, Book right). Auto-emitted as the LAST section whenever input.phone is set; position:fixed pulls it out of document flow at runtime so visual order doesn't matter. (1.38.3) Testimonial synthesis from Maps reviews paste. NEW testimonials field on create_workspace_from_google_paste MCP tool input — array of { quote, name?, role?, company?, rating? } extracted VERBATIM by Claude Code from review excerpts in the paste. NEVER fabricated — when paste has no review text, the testimonials field is OMITTED entirely (better empty than fake). Backend route /api/v1/workspaces/create-full reads + shape-validates via readTestimonials() (cap 8 entries, quote ≤800 chars, drop entries missing quote). Plumbed through CreateFullWorkspaceInput → createAnonymousWorkspace → soul + enhance-blocks. enhance-blocks emits a testimonials LandingPageSection (between serviceArea and faq in the order) when input.testimonials.length > 0. Quotes pass through verbatim — the LLM does not get to rewrite them. ALL THREE block types registered in src/components/landing/block-registry.tsx with grapesContent placeholders for the visual editor. EMAIL-FIRST GUARDRAIL UNCHANGED. NO new env vars (uses existing UNSPLASH_ACCESS_KEY for higher-quality gallery photos when set; works keylessly via source.unsplash.com when not). NO migrations. Backend redeploy required. EXPECTED IMPACT: every fresh paste-driven workspace now ships with 11 sections including a populated photo gallery + mobile sticky CTA + real testimonials when paste has reviews. Visible-quality bar: 9/10 first-shot. Remaining gap to 10/10 = operator-supplied logos + real photos.",
5
7
  "description": "MCP server for SeldonFrame — AI-native Business OS platform. v1.38.0: ATOMIC HORMOZI-QUALITY OUTPUT for every workspace. Pre-1.38.0, create_full_workspace produced workspaces whose landing rendered via the BLUEPRINT path (lib/page-schema/seed-landing-from-soul → renderGeneralServiceV1 → contentHtml/contentCss seeded from canned personality.content_templates.hero_headlines[0] — generic 'Welcome to X' copy, generic personality-bundle hero photo, no motion). Tirionforge HVAC happened to look great because Claude Code followed up with the BLOCK-AS-SKILL flow per block (get_block_skill + persist_block); atlantic-plumbing didn't, so it got the canned output. Same atomic create, very different visible quality. Operators NEVER see this dance — they just see the page. v1.38.0 closes the gap atomically: ONE server-side Claude Opus 4.7 call inside the orchestrator generates Hormozi-quality content for hero + servicesGrid + about + benefits + process + faq + cta using the exact same SKILL.md files in src/blocks/*/SKILL.md that Claude Code reads via get_block_skill. Single source of truth, no duplication — the SKILL.md IS the fat skill, the MCP server stays a thin shim. WHAT SHIPS: (1) NEW src/lib/workspace/enhance-blocks.ts. enhanceLandingForWorkspace() loads SKILL.md files, builds prompt with business context (name/city/state/phone/services/description/reviews/emergency/hours/service_area), calls Anthropic via getAIClient (BYOK first via organizations.integrations.anthropic.apiKey, falls back to platform ANTHROPIC_API_KEY env). Model fallback chain: claude-opus-4-7 → claude-sonnet-4-5-20250929. Parses JSON, validates each section, resolves Unsplash for hero.heroImage_query, writes LandingPageSection[] to landingPages.sections, NULLs contentHtml/Css. (2) NEW Step 12.7 inside createFullWorkspace orchestrator (lib/workspace/create-full.ts). Soft-fails on every error path — workspace stays valid (canned-copy Path A intact) if Claude is unreachable. (3) Route /l/[orgSlug]/[slug] preference unchanged but now falls through to PageRenderer correctly because contentHtml/Css are nulled — PageRenderer wraps below-fold sections in <RevealOnScroll> for scroll-triggered fade-up motion. (4) FIRST_CALL_BANNER bumped to v1.38.0 with Hormozi-quality guidance. EMAIL-FIRST GUARDRAIL UNCHANGED: create_full_workspace + create_workspace_from_google_paste still return BEFORE the email collection step — operator can't see URLs until they reply with email, finalize_workspace mints magic admin link + sends welcome email via Resend. NO new env vars (uses existing ANTHROPIC_API_KEY + organizations.integrations BYOK). NO migrations. Backend redeploy required. EXPECTED IMPACT: every fresh workspace produced by either atomic-create tool looks $10k-tier first-shot — Hormozi value-equation hero copy + per-business Unsplash photo + scroll-triggered motion + branded services grid with prices + 3-step process + real FAQs + final CTA. No 'create workspace then enhance blocks' two-step dance. atlantic-plumbing.app.seldonframe.com on next workspace re-creation will render with the rich output by default. Cost ~$0.10 per workspace via BYOK or platform key — irrelevant given the operator-visible quality uplift.",
6
8
  "description": "MCP server for SeldonFrame — AI-native Business OS platform. v1.37.0: GOOGLE MAPS PASTE → WORKSPACE (no Places API). New MCP tool create_workspace_from_google_paste — sibling to create_full_workspace, same backend pipeline (/workspaces/create-full), same atomic guarantees, same finalize_workspace follow-up. The differentiator is the docstring: it teaches Claude Code how to extract structured fields from a raw Google Maps business listing — bold title → business_name, phone-icon row → phone, location-pin line → address (parse city + state), categories chip row + 'Services' section → services (deduped), '4.7 ★ (950)' → review_rating + review_count, 'Monday: 9 AM-5 PM, Tuesday: closed, …' → weekly_hours in canonical {monday:{enabled,start,end}, ...} shape. Thin harness, fat skill: NO regex parser, NO LLM call, NO Places API key on the SF side. Claude Code (the agent) parses the paste; the MCP server is just a typed shim. WHAT SHIPS: (1) NEW tool create_workspace_from_google_paste in skills/mcp-server/src/tools.js. Inherits create_full_workspace's input schema and adds two fields — weekly_hours (canonical schedule shape) and google_place_url (audit URL). Tool description embeds 11 numbered extraction rules so Claude Code generates the right call shape on first try. (2) BACKEND extends CreateFullWorkspaceInput with weekly_hours + google_place_url. After the orchestrator's existing 13 steps land, two new soft-fail steps run: 12.5 UPDATE every booking template's metadata.availability with the parsed hours (closing the loop with v1.36.4's read-path fix — the booking page now hydrates real Maps-extracted hours on first GET). 12.6 stamp soul.business.maps_url with the source URL for future re-sync. Both UPDATEs catch + log errors; never block workspace creation. (3) ROUTE /api/v1/workspaces/create-full reads + shape-validates weekly_hours via readWeeklyHours() — full-day-name keys only (sunday/monday/.../saturday), HH:MM 24-hour format, malformed entries silently dropped (workspace creation must not fail on a paste-extraction quirk). (4) FIRST_CALL_BANNER updated with paste-workflow guidance: 'when the operator pastes a Google Maps business listing, use create_workspace_from_google_paste — NOT create_full_workspace.' (5) Updated banner header from v1.34.0 to v1.37.0. NO new env vars (no Places API key, no Maps key). NO migrations. Backend redeploy required. EXPECTED IMPACT: when the user says 'make me a workspace from this Google Maps listing for Top Plumbing Experts', Claude Code parses the paste in-context (Maps listings are plain text), calls create_workspace_from_google_paste with the structured fields, and the operator's real business hours appear on the public /book page immediately — no second tool call, no Places API cost, works in any language. ~1 day total ship. Pairs with v1.36.4 fix.",
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.38.3";
11
+ export const VERSION = "1.38.5";
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.38.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. ws1-webhook-pricing-fixes branch ships this; redeploy required.`;
436
+ export const FIRST_CALL_BANNER = `🚀 SeldonFrame v1.38.5 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.`;