@seldonframe/mcp 1.3.1 → 1.3.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.
Files changed (2) hide show
  1. package/package.json +3 -1
  2. package/src/welcome.js +1 -1
package/package.json CHANGED
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "name": "@seldonframe/mcp",
3
- "version": "1.3.1",
3
+ "version": "1.3.3",
4
+ "description": "MCP server for SeldonFrame — AI-native Business OS platform. v1.3.3: ROOT CAUSE for the recurring 'wrong personality everywhere except landing' bug pattern + booking observability + per-service enrichment. (FIX 1) The booking POST /api/v1/public/bookings was returning 400 with literally NO LOGS ('No logs found for this request' in Vercel UI). Every reject path now emits a single-line structured JSON event (event: public_booking_rejected, reason: <stable_id>, ...context) so we can finally see WHICH validation is rejecting bookings. submitPublicBookingAction got the same treatment: every throw now logs reason + booking context (org_slug, weekday_in_workspace_tz, slot_local_hhmm, day_start, day_end, ...). The next time someone hits 'Couldn't book that time', the Vercel log will name the exact cause. (FIX 2 — REAL ROOT CAUSE) The LLM-generated CRMPersonality from create-full.ts was being THROWN AWAY by createAnonymousWorkspace — which called selectCRMPersonality (keyword-based) internally, ignoring the resolved personality. So booking template + intake form + landing seed all used the keyword-fallback personality (e.g. 'general' for nail salons → 'Get in Touch' intake title, 'New Lead → Quoted → ...' pipeline) while only the post-seed defensive override updated settings.crmPersonality with the LLM personality. Result: rendered intake HTML never had the personality title; that's why intake_title_rendered_html: FAIL kept appearing. Fix: createAnonymousWorkspace now accepts an opts.personality parameter; create-full.ts passes the LLM-resolved personality through. Booking template + intake form + landing seed all use the LLM personality from the start. (FIX 3a) Light mode is now the default fallback when personality.theme.mode is unset — premium verticals must opt in to dark via theme.mode='dark'. Previously the fallback used the BusinessType heuristic which routed saas/agency to cinematic (dark) by default. (FIX 3d/e) New optional services_enrichment field on CRMPersonality: array with one entry per operator service { service_name, description, icon }. The LLM is prompted to populate it with customer-facing descriptions + distinct icons per service from a known allowlist. Pipeline merges descriptions onto soul.offerings (so service cards show body copy) and overrides applyServiceIconsFromPersonality (so each card has a distinct LLM-picked icon instead of the keyword classifier's homogenous defaults). ⚠️ BACKEND REDEPLOY REQUIRED. Run a niche test post-deploy: every personality_resolved log line now also tells you whether bookings persist (public_booking_succeeded) or why they reject (public_booking_rejected with reason).",
5
+ "description": "MCP server for SeldonFrame — AI-native Business OS platform. v1.3.2: 3 fixes from the Bright Futures Tutoring test. (FIX 1, CRITICAL) Hardcoded model 'claude-3-5-sonnet-latest' returns 404 from the Anthropic API; every LLM personality call fell through to keyword fallback (coaching for everything that wasn't a known vertical). Replaced with ANTHROPIC_MODEL env var (default: claude-sonnet-4-20250514) + ANTHROPIC_MODEL_FALLBACK (default: claude-3-5-haiku-20241022) + a 404-detection retry that swaps to the haiku fallback. Model id is logged in the personality_resolved event so prod observability shows which model is actually serving. Zero-deploy rotation: when Anthropic retires another model, set the env var on Vercel and the next request picks it up. (FIX 2) Booking confirmation rejected every valid slot with 'Selected slot is no longer available'. Root cause: the strict slot inclusion check compared format strings produced from server-local time (Vercel = UTC), but the client picked the slot in the workspace's timezone (e.g. 4pm Vancouver). The UTC ISO landed on the server as 23:00 UTC, formatted as 'YYYY-MM-DDT23:00', which never appeared in the server-generated slot list (UTC 09:00–16:30). Replaced with timezone-aware validation: derive workspace-local components via Intl.DateTimeFormat.formatToParts (new partsInTimezone helper), check the day-of-week is enabled, the time-of-day is within business hours, the slot aligns to a 15-minute boundary, and there's no overlap with existing bookings. Works regardless of where the server runs. (FIX 3) Light mode is now the default. Added theme.mode ('light'|'dark') to CRMPersonality. Populated for the 7 hardcoded verticals: medspa+agency stay dark/cinematic; everything else (general, hvac, dental, legal, coaching) renders in light/clean. The LLM personality generator's prompt now instructs the model to choose 'light' for trades/tutoring/professional-services and 'dark' only for premium/luxury/aesthetic verticals. seedLandingFromSoul reads personality.theme.mode and selects the cinematic vs clean PagePersonality accordingly. ⚠️ BACKEND REDEPLOY REQUIRED + set ANTHROPIC_MODEL=claude-sonnet-4-20250514 in Vercel.",
4
6
  "description": "MCP server for SeldonFrame — AI-native Business OS platform. v1.3.1: 3 pipeline integration bugs fixed at the consumer side. The personality system, validator, cache all worked correctly — but downstream pipeline steps consumed the data from the wrong field shape (or didn't consume it at all). (BUG 1) booking metadata.availability was being written as {weekdays:[],startHour,endHour} but the booking actions read {monday:{enabled,start,end},...} (full day names). The shape mismatch silently fell back to defaults that happened to give Mon-Fri 9-17, masking the bug for happy paths but breaking per-personality booking hours (HVAC's Mon-Sat 7-19 was never honored), the React fallback path, and the validator. Fixed by sourcing canonical schedule from blueprint.booking.availability.weekly via buildAppointmentAvailabilityFromBlueprint. (BUG 2) personality.intake.title (added v1.1.9) only updated the DB row's name column; the rendered Formbricks HTML reads blueprint.intake.title which still had the JSON template's 'Tell us about your project'. Fixed by mutating seedBlueprint.intake.title + intake.questions from personality.intake + intakeFields in createAnonymousWorkspace, parallel to the booking eventType mutation. (BUG 3) getPersonalityImages returned null for unknown verticals — for v1.3.0 LLM-generated personalities (vertical='roofing'/'pet-grooming'/etc) the IMAGES map had no entry, so workspaces shipped text-only heroes. Fixed by falling back to the GENERAL_IMAGES bundle so every workspace gets industry-neutral photography. (VALIDATOR) +4 new checks: booking_availability_enabled_days (canonical shape), booking_renderer_data_island, hero_background_image, intake_title_rendered_html — every regression at any of the 3 integration points now surfaces in Vercel function logs. ⚠️ BACKEND REDEPLOY REQUIRED.",
5
7
  "description": "MCP server for SeldonFrame — AI-native Business OS platform. v1.3.0: LLM-generated personalities (the real Karpathy move). Hardcoding 7 personalities + a 'general' fallback (v1.2.0) doesn't scale to the long tail — pet grooming, photography, accounting, tutoring, and a hundred other niches will each fall into 'general' and produce mediocre output. v1.3.0: model GENERATES the personality, validator GATES the quality, cache SCALES the cost. Three-layer resolve: (1) cache: SELECT from new personality_cache table by stable business_type_key derived from services+description (e.g. 'roofing', 'pet-grooming', 'wedding-photography'). Hit → return cached schema, increment usage_count, zero LLM cost. (2) LLM: Claude generates a custom CRMPersonality for THIS specific business via a few-shot prompt with 4 hardcoded personalities as examples. Output validated by checkPersonalityCompleteness (intake.title, ≥3 FAQs, exactly 4 trust badges, ≥4 pipeline stages, etc.). Retry once on validation fail with errors appended to prompt. On success, INSERT into cache (ON CONFLICT DO NOTHING handles parallel-create races). (3) Fallback: existing keyword-based selectCRMPersonality if LLM unavailable / fails twice. Hardcoded personalities (general, hvac, dental, legal, agency, coaching, medspa) become SEED CACHE rows + few-shot examples — they're the warm starting point, not the final system. Cost model: ~$0.01 first workspace per niche; subsequent workspaces $0. Quality model: every cached schema passed completeness check. Anti-fragile: gets better as Claude gets better, no code changes. New observability: workspace_created_full event tags personality_source (cache/llm/fallback) + personality_cache_key for cache-hit-ratio analytics. ⚠️ BACKEND REDEPLOY REQUIRED + run migration 0035_personality_cache.sql.",
6
8
  "description": "MCP server for SeldonFrame — AI-native Business OS platform. v1.2.0: complete the default personality + add CTA defense layers. The Ironclad Roofing demo exposed the gap that v1.1.9 didn't catch: roofing fell through to coaching personality, both CTAs went to /intake, all 6 service cards collapsed to wrench, no hero image. Root cause: DEFAULT_PERSONALITY was COACHING (with coaching pipeline + 'Discovery call' CTAs); BUSINESS_TYPE_FALLBACK rerouted local_service+professional_service to coaching; trade keywords (roof/storm/gutter/siding/window/deck/etc) weren't in the icon RULES; and the v1.1.9 CTA hardcoding only ran in the soul-driven path, not in the template-load path. (1) NEW general personality — industry-neutral (Customer/Job/Activity, 'New Lead → Quoted → Approved → Scheduled → In Progress → Completed' pipeline, 'Book a free quote →' CTA, steel-blue accent #0e7490). Has its own content_templates, intake.title, image bundle. Made the new DEFAULT_PERSONALITY. BUSINESS_TYPE_FALLBACK rerouted local_service+professional_service from coaching → general. (2) +13 trade icons (cloud_lightning, columns, search, app_window, square_stack, hammer, paintbrush, layers, fence, blocks, thermometer, square, ruler) +20 keyword RULES (storm damage→cloud_lightning, tarping→shield, roof/shingle→home, gutter→droplets, siding→columns, deck→square_stack, renovation→hammer, etc.) ordered specific-first so 'roof repair' hits home before generic 'repair'→wrench. (3) CTA HARDCODING DEFENSE-IN-DEPTH — now applied at FOUR layers: (a) skills/templates/general.json + hvac.json fixed at source, (b) buildBlueprintForWorkspace normalizes hero/mid-cta CTAs immediately after pickTemplate, (c) seedLandingFromSoul applyResolvedContentToActions overrides at schema level (v1.1.9), (d) personality content_templates carry the labels. Even if one layer misses, the next catches. (4) +9 trade keywords in BusinessType classifier (roof, storm damage, gutter, siding, fencing, decking, drywall, stucco, masonry) so trade workspaces classify as local_service instead of professional_service. ⚠️ BACKEND REDEPLOY REQUIRED — npm package is just tool definitions.",
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.3.1";
11
+ export const VERSION = "1.3.3";
12
12
 
13
13
  export const WELCOME_MARKDOWN = `# SeldonFrame — create a real Business OS in one conversation
14
14