@new-vintage-labs/guest-prep 0.1.0 → 0.1.1

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/README.md CHANGED
@@ -4,7 +4,7 @@ The New Vintage Guest Prep briefing as one script. Claude (in an artifact) or Ch
4
4
 
5
5
  ```html
6
6
  <div id="app"></div>
7
- <script src="https://cdn.jsdelivr.net/npm/@new-vintage-labs/guest-prep@0.1.0/dist/guest-prep.js"></script>
7
+ <script src="https://cdn.jsdelivr.net/npm/@new-vintage-labs/guest-prep@0.1.1/dist/guest-prep.js"></script>
8
8
  <script>
9
9
  NVGuestPrep.mount("#app", { tenantId, wineryName, guideVersion, connectorName, settings, days, customize, cards })
10
10
  </script>
@@ -14,7 +14,7 @@ The New Vintage Guest Prep briefing as one script. Claude (in an artifact) or Ch
14
14
  - **Data.** The page never writes SQL. It fetches the guide's `guest-prep-day-arrivals` query with `get_analysis_guide` and fills it with `fillGuestPrepQuery` (the day, the time zone, and one arrival for **Research this guest again**), the same function the library's PGlite tests run. Live days come through the viewer's own New Vintage connector (`claude.use("mcp")` in a Claude artifact, or a `callTool` the page passes, such as a ChatGPT Site's server-side New Vintage connection), and count only when `safe_tenant_sql` returns `resultMode: "complete"`. With `tenantId: null` the viewer picks a winery from the ones their connector can reach. Without the connector, the page shows the complete days written into `days`, and **Load this day** asks the chat for the rest (follow-up message, then clipboard, then a text box to copy). Finding the connector and asking the chat live in `packages/page-bridge`, which this package bundles.
15
15
  - **Clock.** Today's clock, countdowns and Earlier today move on the minute without SQL; a live page reloads the day every 15 minutes.
16
16
  - **Saving.** The last view is saved under `guest-prep:{tenantId}` (the winery picker under `guest-prep.tenant`) in `window.storage`, then `localStorage`. It comes back only on the day it was saved, so the page still opens on today.
17
- - **Customizing.** `customize` hides and renames sections (`summary`, `guestList`, `reservation`, `talkAbout`, `relationship`, `headsUp`, `personalNotes`), sets the title, and overrides theme tokens and fonts. `cards` adds custom cards after a section; a card after a guest panel section sits in the panel.
17
+ - **Customizing.** `customize` hides and renames sections (`summary`, `guestList`, `reservation`, `talkAbout`, `newVintageProfile`, `relationship`, `headsUp`, `personalNotes`), sets the title, and overrides theme tokens and fonts. `cards` adds custom cards after a section; a card after a guest panel section sits in the panel.
18
18
  - **Tracking.** The first `get_analysis_guide` call per open sends `pageSetup`, in the same shape as the commission dashboard's: the package version, the sections changed, and each custom card's title and purpose. Labels only.
19
19
 
20
20
  ## Tests
@@ -1,4 +1,4 @@
1
- var NVGuestPrep=(function(F){"use strict";class Q extends Error{constructor(t){super(t.kind==="tool"?t.message:t.kind),this.failure=t}}const rn=["New Vintage","New Vintage Staging"];function Fe(){const e=globalThis.claude;return e&&typeof e.use=="function"?e:null}function Ze(){const e=globalThis.openai;return e&&typeof e=="object"?e:null}function ye(){return Fe()?"claude":Ze()?"chatgpt":"browser"}function an(e,t){let n=t.length===1?t[0]:null;return async(r,a)=>{var c;if(n)return e.callTool(n,r,a);const s=[];for(const l of t)try{const d=await e.callTool(l,r,a);return n=l,d}catch(d){s.push(d)}throw(c=s.find(l=>ie(l).kind!=="reconnect"))!=null?c:s[0]}}async function sn(e){const t=Fe();if(t!=null&&t.use)try{const n=await Promise.race([t.use("mcp"),new Promise(r=>setTimeout(()=>r(null),1e4))]);return!n||typeof n.callTool!="function"?null:an(n,e?[e]:rn)}catch{return null}return null}function on(e){const t=e.content;if(!Array.isArray(t))return;const n=t.find(r=>r&&typeof r=="object"&&r.type==="text");if(typeof(n==null?void 0:n.text)=="string")try{return JSON.parse(n.text)}catch{return n.text}}function Be(e){var r,a,s;if(!e||typeof e!="object")throw new Q({kind:"tool",message:"The connector returned nothing."});const t=e,n=(s=(a=(r=t.payload)!=null?r:t.structuredContent)!=null?a:on(t))!=null?s:t;if(t.isError===!0||n&&typeof n=="object"&&n.ok===!1){const c=n.error,l=typeof(c==null?void 0:c.message)=="string"?c.message:typeof n=="string"?n:"The New Vintage tool returned an error.";throw new Q({kind:"tool",message:l})}if(!n||typeof n!="object")throw new Q({kind:"tool",message:String(n)});return n}function ie(e){var r,a,s;if(e instanceof Q)return e.failure;const t=String((r=e==null?void 0:e.code)!=null?r:""),n=String((s=(a=e==null?void 0:e.message)!=null?a:e)!=null?s:"");return/not_granted|consent|permission|denied/i.test(t)?{kind:"approval"}:/server_not_connected|unauthori[sz]ed|auth|reconnect/i.test(t+" "+n)?{kind:"reconnect"}:(e==null?void 0:e.retryable)===!0||/timeout|unavailable|rate_limited|network|5\d\d/i.test(t+" "+n)?{kind:"temporary"}:/cannot access|not in this session|tenant/i.test(n)?{kind:"unavailable"}:{kind:"tool",message:n||"The New Vintage tool returned an error."}}function ln(e=ye()){return e==="claude"?"Reconnect New Vintage in claude.ai Settings → Connectors.":"Reconnect New Vintage in your chat's connector settings."}async function cn(e,t={}){var a,s,c;const n=Ze(),r=(a=t.followUp)!=null?a:n&&typeof n.sendFollowUpMessage=="function"?l=>n.sendFollowUpMessage({prompt:l,...t.title?{title:t.title}:{}}):null;if(r)try{return await r(e),{kind:"sent"}}catch(l){return{kind:"failed",message:String((s=l==null?void 0:l.message)!=null?s:"The request was not sent.")}}try{const l=(c=globalThis.navigator)==null?void 0:c.clipboard;if(!l||typeof l.writeText!="function")throw new Error("no clipboard");return await l.writeText(e),{kind:"copied"}}catch{return{kind:"manual",text:e}}}const Ne=["America/Los_Angeles","America/Denver","America/Phoenix","America/Chicago","America/New_York","America/Anchorage","Pacific/Honolulu"],un=/^\d{4}-\d{2}-\d{2}$/,dn=/^[A-Za-z0-9-]{1,100}$/,He=/timestamptz '(\d{4}-\d{2}-\d{2}) 00:00:00 [^']*'/g,Ye=/(\bfocus as \(\s*(?:--[^\n]*\n\s*)?select \* from \(\s*values )\([^()]*\)(\s*\) focus_rows \()/;function X(e){throw new Error("fillGuestPrepQuery: "+e)}function pn(e){(typeof e!="string"||!un.test(e))&&X("day must be YYYY-MM-DD");const[t,n,r]=e.split("-").map(Number),a=new Date(Date.UTC(t,n-1,r));return a.toISOString().slice(0,10)!==e&&X("bad date "+e),new Date(a.getTime()+864e5).toISOString().slice(0,10)}function gn(e){return e==null?"(null::text, null::text)":(e.source!=="commerce7"&&e.source!=="tock"&&X("unexpected source "+String(e.source)),(typeof e.id!="string"||!dn.test(e.id))&&X("arrival id may only hold letters, digits and hyphens"),"('"+e.source+"'::text, '"+e.id+"'::text)")}function Ke(e,t){const n=t||{};Ne.indexOf(n.timeZone)<0&&X("unsupported time zone");const r=pn(n.day);let a=String(e);const s=Array.from(new Set(Array.from(a.matchAll(He),l=>l[1]))).sort();s.length>2&&X("expected at most two day literals"),a=a.replace(He,(l,d)=>"timestamptz '"+(s.length===2&&d===s[1]?r:n.day)+" 00:00:00 "+n.timeZone+"'"),a=a.replace(/at time zone '[^']*'/gi,l=>l.slice(0,l.indexOf("'"))+"'"+n.timeZone+"'");const c=gn(n.arrival);return Ye.test(a)?a=a.replace(Ye,(l,d,m)=>d+c+m):n.arrival&&X("this query has no focus row"),a}function E(e){if(e==null||e==="")return null;const t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}const fn=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",minimumFractionDigits:2,maximumFractionDigits:2}),mn=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",maximumFractionDigits:0});function z(e){var n;const t=(n=E(e))!=null?n:0;return Number.isInteger(Math.round(t*100)/100)?mn.format(t):fn.format(t)}function L(e,t,n=`${t}s`){return`${e} ${e===1?t:n}`}function hn(e){if(e)return e;try{return Intl.DateTimeFormat().resolvedOptions().timeZone||"America/Los_Angeles"}catch{return"America/Los_Angeles"}}function We(e,t){const n=new Intl.DateTimeFormat("en-CA",{timeZone:t,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",hourCycle:"h23"}).formatToParts(e),r=a=>{var s,c;return(c=(s=n.find(l=>l.type===a))==null?void 0:s.value)!=null?c:"00"};return{day:`${r("year")}-${r("month")}-${r("day")}`,minutes:Number(r("hour"))%24*60+Number(r("minute"))}}const yn=/^(\d{4})-(\d{2})-(\d{2})$/;function Je(e){return typeof e!="string"||!yn.test(e)?!1:le(e).toISOString().slice(0,10)===e}function le(e){const[t,n,r]=e.split("-").map(Number);return new Date(Date.UTC(t,n-1,r))}function O(e,t){return new Date(le(e).getTime()+t*864e5).toISOString().slice(0,10)}function be(e,t){const[n,r]=e.split("-").map(Number),a=n*12+r-1+t;return`${Math.floor(a/12)}-${String(a%12+1).padStart(2,"0")}`}function ve(e,t){return Math.round((le(t).getTime()-le(e).getTime())/864e5)}function ce(e){return le(e).getUTCDay()}const $e=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],xe=["January","February","March","April","May","June","July","August","September","October","November","December"],Qe=(e,t)=>e.slice(0,4)!==t.slice(0,4)?`, ${e.slice(0,4)}`:"";function Xe(e,t){return`${xe[Number(e.slice(5,7))-1].slice(0,3)} ${Number(e.slice(8,10))}${Qe(e,t)}`}function ee(e,t){return`${$e[ce(e)].slice(0,3)}, ${Xe(e,t)}`}function Ae(e,t){return`${$e[ce(e)]}, ${xe[Number(e.slice(5,7))-1]} ${Number(e.slice(8,10))}${Qe(e,t)}`}function et(e){return`${xe[Number(e.slice(5,7))-1]} ${e.slice(0,4)}`}function bn(e){const t=/^(\d{1,2}):(\d{2})/.exec(String(e!=null?e:""));return t?Number(t[1])*60+Number(t[2]):null}function ae(e){const t=Math.floor(e/60)%24;return`${t%12===0?12:t%12}:${String(e%60).padStart(2,"0")} ${t<12?"AM":"PM"}`}function ue(e,t,n){return`${ee(e,n)}, ${ae(t)}`}function _e(e){if(e<=0)return"now";const t=Math.floor(e/60),n=e%60;return t?n?`in ${t} hr ${n} min`:`in ${t} hr`:`in ${n} min`}function vn(e,t){const n=ve(e,t);if(n<=0)return"today";if(n===1)return"yesterday";if(n<14)return`${n} days ago`;let r=(Number(t.slice(0,4))-Number(e.slice(0,4)))*12+Number(t.slice(5,7))-Number(e.slice(5,7));return Number(t.slice(8,10))<Number(e.slice(8,10))&&(r-=1),r<2?`${Math.max(2,Math.floor(n/7))} weeks ago`:r<12?`${r} months ago`:`${L(Math.floor(r/12),"year")} ago`}function xn(e,t){var s;const n=((s=E(e))!=null?s:0)-1,r=xe[n],a=E(t);return r&&a?`${r} ${a}`:r!=null?r:a?String(a):""}function tt(e){const t=e.trim().toLowerCase();return t.charAt(0).toUpperCase()+t.slice(1)}const wn="guest-prep",Me="guest-prep-day-arrivals";function Ee(e,t){return{call:async(n,r)=>{const a=n==="get_analysis_guide"||!t?r:{tenantId:t,...r};try{return Be(await e(n,a))}catch(s){if(ie(s).kind!=="temporary")throw s;return await new Promise(c=>setTimeout(c,2e3)),Be(await e(n,a))}}}}async function nt(e,t){var s,c,l;const n=await e.call("get_analysis_guide",{context:"Opening the Guest Prep briefing with the latest day query.",slug:wn,includeReferenceQueries:!0,...t?{pageSetup:t}:{}}),r=(s=n.item)!=null?s:n,a={};for(const d of(c=r.referenceQueries)!=null?c:[])typeof d.slug=="string"&&typeof d.sqlText=="string"&&(a[d.slug]=d.sqlText);if(!a[Me])throw new Q({kind:"tool",message:`The guide is missing the ${Me} query.`});return{version:(l=E(r.version))!=null?l:0,queries:a}}async function rt(e,t,n){const r=await e.call("safe_tenant_sql",{context:n,sqlText:t});return{rows:Array.isArray(r.rows)?r.rows:[],complete:r.resultMode==="complete"}}function kn(e,t,n,r){try{return Ke(e.queries[Me],{timeZone:t,day:n,arrival:r})}catch{throw new Q({kind:"needs_update"})}}async function at(e,t,n){var s;const r=kn(t,n.timeZone,n.day,(s=n.arrival)!=null?s:null),a=n.arrival?"Refreshing one guest's briefing for the Guest Prep page.":"Loading one day's arrivals for the Guest Prep briefing.";for(let c=0;c<2;c+=1){const l=await rt(e,r,a);if(l.complete)return l.rows}throw new Q({kind:"tool",message:"New Vintage returned only a preview of this day, so it wasn't loaded. Try again."})}async function Sn(e){var t,n;try{const r=await e.call("discover_tenant_data_sources",{context:"Finding which wineries the Guest Prep page can load."}),a=(t=r.accessibleTenants)!=null?t:r.tenants;return Array.isArray(a)?a.filter(s=>typeof(s==null?void 0:s.tenantId)=="string").map(s=>({tenantId:String(s.tenantId),name:typeof s.name=="string"&&s.name?s.name:String(s.tenantId)})):typeof r.tenantId=="string"?[{tenantId:r.tenantId,name:typeof r.tenantName=="string"?r.tenantName:r.tenantId}]:[]}catch(r){const a=String((n=r==null?void 0:r.message)!=null?n:""),s=Array.from(a.matchAll(/(?:([^,:]+?) -> )?tenantId "([^"]+)"/g)).map(c=>{var l;return{tenantId:c[2],name:((l=c[1])!=null?l:"").replace(/^.*(?:values|these)[^:]*:\s*/i,"").trim()||c[2]}});if(s.length)return s;throw r}}const Tn="Name not on file";function de(e){var t;return(t=e.name)!=null?t:Tn}const Nn=/[A-Z0-9._%+-]+@[A-Z0-9-]+(?:\.[A-Z0-9-]+)*\.[A-Z]{2,}/gi,$n=/(?:\+?\d{1,3}[\s.-]?)?(?:\(\d{3}\)\s?|\b\d{3}[\s.-]?)\d{3}[\s.-]?\d{4}\b|\b\d{3}[\s.-]\d{4}\b/g;function st(e){const t=String(e!=null?e:"").replace(Nn,"").replace($n,"").replace(/\(\s*\)/g,"").replace(/\s{2,}/g," ").replace(/\s+([,.;:!?])/g,"$1").replace(/([,;:])(?=[.!?]|$)/g,"").replace(/^[\s,;:.-]+|[\s,;:-]+$/g,"");return t||null}function An(e){const t=n=>(n!=null?n:[]).flatMap(r=>{try{return[new RegExp(r,"i")]}catch{return[]}});return{hide:t(e.hide),interests:t(e.interests),vip:t(e.vip),club:t(e.club)}}function _n(e,t){var r;const n={vip:!1,interests:[],clubTags:[],accountTags:[]};for(const a of e){const s=a.trim();if(!s||t.hide.some(l=>l.test(s)))continue;const c=t.interests.map(l=>l.exec(s)).find(Boolean);if(c){n.interests.push(((r=c[1])!=null?r:c[0]).trim());continue}t.vip.some(l=>l.test(s))?n.vip=!0:t.club.some(l=>l.test(s))?n.clubTags.push(s):n.accountTags.push(s)}return n}function M(e){if(e==null)return null;const t=String(e).trim();return t||null}function we(e){if(Array.isArray(e))return e;if(typeof e=="string"&&e.trim().startsWith("["))try{const t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}return[]}function Ce(e){return typeof e=="string"&&!e.trim().startsWith("[")?e.split(",").map(t=>t.trim()).filter(Boolean):we(e).map(t=>M(t)).filter(t=>!!t)}const ot=e=>Ce(e).map(t=>t.toLowerCase());function it(e,t){if(!/^\d{2}-\d{2}$/.test(e))return null;const n=Number(t.slice(0,4)),a=[n-1,n,n+1].map(s=>`${s}-${e}`).filter(s=>O(s,0)===s).sort((s,c)=>Math.abs(ve(t,s))-Math.abs(ve(t,c)))[0];return a&&Math.abs(ve(t,a))<=30?a:null}function Mn(e,t,n){const r=[],a=M(e.bday_md),s=a?it(a,t):null;s&&r.push(s===t?"Birthday on this day":`Birthday ${ee(s,n)}`);const c=M(e.club_signup),l=c&&/^\d{4}-\d{2}-\d{2}$/.test(c)?it(c.slice(5),t):null,d=l&&c?Number(l.slice(0,4))-Number(c.slice(0,4)):0;return l&&d>0&&r.push(`${L(d,"year")} in the club ${l===t?"on this day":ee(l,n)}`),r}function En(e,t){var K,_,U;const n=e.source==="tock"?"tock":"commerce7",r=String((K=e.arr_id)!=null?K:""),a=(_=E(e.party))!=null?_:0,s=e.visit==="First visit"?"first":e.visit==="Return"?"return":"unknown",c=_n(Ce(e.tags),t.rules),l=M(e.club_titles),d=l!==null,m=M(e.signup_tier),S=M(e.churn_tier),f=!d&&ot(m).some(h=>h==="high"||h==="very high"),b=d&&ot(S).some(h=>h==="medium"||h==="high"),Z=M(e.last_taste),C=Z?{title:Z,day:M(e.last_taste_date)}:null,B=we(e.last_taste_items).map(h=>h).map(h=>{var N,T;return{title:(N=M(h==null?void 0:h.title))!=null?N:"",qty:(T=E(h==null?void 0:h.qty))!=null?T:0}}).filter(h=>h.title),D=we(e.notes).map(h=>h).map(h=>({content:st(h==null?void 0:h.content),when:xn(h==null?void 0:h.month,h==null?void 0:h.year)})).filter(h=>!!h.content).slice(0,3),A=new Set(D.map(h=>h.content.toLowerCase())),R=[];for(const h of we(e.last_taste_notes)){const N=st(h);if(!(!N||A.has(N.toLowerCase()))&&(A.add(N.toLowerCase()),R.push(N),R.length===3))break}const te=E(e.price_floor),P=E(e.price_ceiling),Y=E(e.avg_unit_price),q=E(e.ltv_cents),I=E(e.order_count);return{key:`${n}:${r}`,source:n,id:r,row:e,minutes:(U=bn(e.t))!=null?U:0,party:a,experience:M(e.experience),name:M(e.name),visit:s,vip:c.vip,clubMember:d,clubTitles:l,prospect:f,signupTier:m,atRisk:b,churnTier:S,clubPickup:M(e.next_ship)===t.day,large:a>=t.largeParty,occasions:Mn(e,t.day,t.today),interests:c.interests,clubTags:c.clubTags,accountTags:c.accountTags,varietals:Ce(e.top_varietals).slice(0,3),lastTaste:C,bought:C?{items:B,total:E(e.last_taste_spend)}:null,orderNotes:R,personalNotes:D,price:te!==null||P!==null||Y!==null?{floor:te,ceiling:P,avg:Y}:null,lifetime:q!==null&&(q>0||(I!=null?I:0)>0)?{spend:q/100,orders:I}:null,since:M(e.since_year)}}function Cn(e,t){return e.map(n=>En(n,t)).map((n,r)=>({arrival:n,index:r})).sort((n,r)=>n.arrival.minutes-r.arrival.minutes||n.index-r.index).map(({arrival:n})=>n)}function Le(e,t){return e<t?"past":e>t?"future":"today"}function Pe(e,t,n){return t!=="today"?{upcoming:e,earlier:[]}:{upcoming:e.filter(r=>r.minutes>=n),earlier:e.filter(r=>r.minutes<n)}}function Ln(e,t,n){if(t!=="today")return null;const r=e.minutes-n;return r>=0&&r<=120?_e(r):null}function Pn(e){const t=e.slice(0,2).map(de).join(", ");return e.length>2?`${t} and ${e.length-2} more`:t}function Ie(e,t,n,r,a){return n.length?n.length===1?{label:e,value:de(n[0]),detail:ue(r,n[0].minutes,a)}:{label:t,value:L(n.length,"guest"),detail:Pn(n)}:null}function lt(e,t,n){const r=[];r.push(Ie("Club pickup","Club pickups",e.filter(s=>s.clubPickup),t,n));const a=e.filter(s=>s.large);if(a.length===1)r.push({label:"Large party",value:`Party of ${a[0].party}`,detail:ue(t,a[0].minutes,n)});else if(a.length>1){const s=a.reduce((l,d)=>l+d.party,0),c=a.slice(0,2).map(l=>`${ae(l.minutes)} for ${l.party}`).join(", ");r.push({label:"Large parties",value:`${L(a.length,"party","parties")}, ${L(s,"guest")}`,detail:`${ee(t,n)}, ${c}${a.length>2?` and ${a.length-2} more`:""}`})}return r.push(Ie("VIP","VIPs",e.filter(s=>s.vip),t,n)),r.push(Ie("Club prospect","Club prospects",e.filter(s=>s.prospect),t,n)),r.filter(s=>s!==null)}function In(e,t,n){var l;const r=new Map;for(const d of e){const m=Math.floor(d.minutes/30)*30,S=(l=r.get(m))!=null?l:{parties:0,guests:0};r.set(m,{parties:S.parties+1,guests:S.guests+d.party})}const a=Array.from(r.entries()).sort((d,m)=>m[1].guests-d[1].guests||m[1].parties-d[1].parties||d[0]-m[0])[0];if(!a)return null;const[s,c]=a;return{label:"Busiest half hour",value:`${ae(s)} to ${ae(s+30)}`,detail:`${ee(t,n)}, ${L(c.parties,"party","parties")}, ${L(c.guests,"guest")}`}}function zn(e,t,n,r){const a={reservations:e.length,guests:e.reduce((m,S)=>m+S.party,0)};if(!e.length)return{...a,message:"No reservations on this day",facts:[]};const s=Le(t,n);if(s==="past")return{...a,message:"This day has passed",facts:[]};const{upcoming:c,earlier:l}=Pe(e,s,r);if(!c.length)return{...a,message:"No more arrivals today",facts:[]};if(l.length){const m=c[0];return{...a,message:null,facts:[{label:"Still to arrive",value:`${c.length} of ${e.length}`},{label:"Next arrival",value:ue(t,m.minutes,n),detail:_e(m.minutes-r)},...lt(c,t,n)]}}const d=lt(c,t,n);if(!d.length){const m=In(c,t,n);m&&d.push(m)}return{...a,message:null,facts:d}}function On(e){return new Set(e.map(n=>n.source)).size===1?e[0].source:null}const ze={commerce7:"Commerce7",tock:"Tock"},Dn="Load Guest Prep day";function Rn(e){var n;const t=((n=e.wineryName)==null?void 0:n.trim())||"this winery";return[`Load Guest Prep for ${e.day} for ${t} (tenantId ${e.tenantId}) through the New Vintage connector in ${e.timeZone}.`,"Use the specification's read-only day query and add only complete safe_tenant_sql results to this existing Guest Prep.","Narrow or split sampled results until every piece is complete.","Select the requested service day, preserve every previously loaded date, and return the updated interactive briefing.","Update both the in-chat and standalone versions when both exist in this conversation.","Preserve the design, confirmed tag rules, read-only access and privacy filtering.","Do not use exports or invent guests."].join(" ")}const ct="0.1.0",pe=(e,t)=>String(e!=null?e:"").replace(/\s+/g," ").trim().slice(0,t);function ut(e={},t=[]){var n,r,a,s,c,l;return{packageVersion:ct,hiddenSections:((n=e.hide)!=null?n:[]).slice(0,20).map(d=>pe(d,40)),reorderedViews:[],renamedSections:Object.keys((r=e.labels)!=null?r:{}).slice(0,20).map(d=>pe(d,40)),themeChanged:Object.keys((a=e.theme)!=null?a:{}).length+Object.keys((s=e.themeDark)!=null?s:{}).length>0,fontsChanged:!!((c=e.fonts)!=null&&c.display||(l=e.fonts)!=null&&l.body),titleChanged:!!e.title,customCards:t.slice(0,10).map(d=>{var m;return{title:pe(d.title,80),purpose:pe(d.purpose,160),view:pe((m=d.after)!=null?m:"page",20)}})}}const dt="guest-prep.tenant",pt=e=>`guest-prep:${e}`;function qn(){const e=globalThis.storage;return e&&typeof e.get=="function"&&typeof e.set=="function"?e:null}function Un(){try{const e=globalThis.localStorage,t="__nv_probe__";return e.setItem(t,"1"),e.removeItem(t),e}catch{return null}}function Vn(e){return typeof e=="string"?e:e&&typeof e=="object"&&typeof e.value=="string"?e.value:null}function Gn(e){if(e)return{adapter:e,mode:"artifact"};const t=qn();if(t)return{mode:"artifact",adapter:{get:async(r,a)=>Vn(await t.get(r,a)),set:async(r,a,s)=>{await t.set(r,a,s)}}};const n=Un();return n?{mode:"browser",adapter:{get:async r=>n.getItem(r),set:async(r,a)=>n.setItem(r,a)}}:{adapter:null,mode:"none"}}async function gt(e,t){if(!e)return null;try{return await e.get(t,!1)}catch{return null}}async function ft(e,t,n){if(e)try{await e.set(t,n,!1)}catch{}}function jn(e){if(!e)return null;try{const t=JSON.parse(e);return typeof t.day!="string"||typeof t.savedOn!="string"?null:{day:t.day,guest:typeof t.guest=="string"?t.guest:null,savedOn:t.savedOn}}catch{return null}}const Fn={"surface-base":"#f7f5f1","surface-subtle":"#f2efea","surface-raised":"#ffffff","text-primary":"#1a1917","text-secondary":"#4f4a43","text-tertiary":"#6b655d","border-subtle":"#ebe7df","border-default":"#ddd8ce","border-strong":"#8d877f","action-primary-bg":"#0b6623","action-primary-fg":"#ffffff","action-primary-hover":"#155826","focus-ring-color":"#1a6b30","status-warning":"#9c6110","status-warning-bg":"#fff7e7","font-display":"'Newsreader', Georgia, serif","font-body":"'Be Vietnam Pro', system-ui, sans-serif"},Zn={"surface-base":"#171614","surface-subtle":"#24211f","surface-raised":"#34302d","text-primary":"#f5f3ef","text-secondary":"#d0c8bd","text-tertiary":"#b4aba0","border-subtle":"#3b3632","border-default":"#4c4742","border-strong":"#8a8279","action-primary-bg":"#57bd76","action-primary-fg":"#06210d","action-primary-hover":"#7ecb93","focus-ring-color":"#8cd0a0","status-warning":"#f0c36a","status-warning-bg":"rgba(240,195,106,.16)"},Bn=/^[a-z][a-z0-9-]{0,40}$/,Hn=/^[^;{}<>\\]{1,120}$/;function mt(e){return Object.entries(e).filter(([t,n])=>Bn.test(t)&&typeof n=="string"&&Hn.test(n)).map(([t,n])=>`--${t}:${n};`).join("")}function Yn(e){return`https://fonts.googleapis.com/css2?${e.map(n=>`family=${encodeURIComponent(n).replace(/%20/g,"+")}:wght@300;400;500;600`).join("&")}&display=swap`}function Kn(e={},t={}){const n=mt({...Fn,...e}),r=mt({...Zn,...t});return`:root,.nvgp{${n}}@media (prefers-color-scheme: dark){:root,.nvgp{${r}}}`}const Oe="120ms cubic-bezier(0.2,0,0.2,1)",Wn=`
1
+ var NVGuestPrep=(function(j){"use strict";class Q extends Error{constructor(t){super(t.kind==="tool"?t.message:t.kind),this.failure=t}}const an=["New Vintage","New Vintage Staging"];function Ze(){const e=globalThis.claude;return e&&typeof e.use=="function"?e:null}function Be(){const e=globalThis.openai;return e&&typeof e=="object"?e:null}function be(){return Ze()?"claude":Be()?"chatgpt":"browser"}function sn(e,t){let n=t.length===1?t[0]:null;return async(r,a)=>{var c;if(n)return e.callTool(n,r,a);const s=[];for(const l of t)try{const d=await e.callTool(l,r,a);return n=l,d}catch(d){s.push(d)}throw(c=s.find(l=>le(l).kind!=="reconnect"))!=null?c:s[0]}}async function on(e){const t=Ze();if(t!=null&&t.use)try{const n=await Promise.race([t.use("mcp"),new Promise(r=>setTimeout(()=>r(null),1e4))]);return!n||typeof n.callTool!="function"?null:sn(n,e?[e]:an)}catch{return null}return null}function ln(e){const t=e.content;if(!Array.isArray(t))return;const n=t.find(r=>r&&typeof r=="object"&&r.type==="text");if(typeof(n==null?void 0:n.text)=="string")try{return JSON.parse(n.text)}catch{return n.text}}function He(e){var r,a,s;if(!e||typeof e!="object")throw new Q({kind:"tool",message:"The connector returned nothing."});const t=e,n=(s=(a=(r=t.payload)!=null?r:t.structuredContent)!=null?a:ln(t))!=null?s:t;if(t.isError===!0||n&&typeof n=="object"&&n.ok===!1){const c=n.error,l=typeof(c==null?void 0:c.message)=="string"?c.message:typeof n=="string"?n:"The New Vintage tool returned an error.";throw new Q({kind:"tool",message:l})}if(!n||typeof n!="object")throw new Q({kind:"tool",message:String(n)});return n}function le(e){var r,a,s;if(e instanceof Q)return e.failure;const t=String((r=e==null?void 0:e.code)!=null?r:""),n=String((s=(a=e==null?void 0:e.message)!=null?a:e)!=null?s:"");return/not_granted|consent|permission|denied/i.test(t)?{kind:"approval"}:/server_not_connected|unauthori[sz]ed|auth|reconnect/i.test(t+" "+n)?{kind:"reconnect"}:(e==null?void 0:e.retryable)===!0||/timeout|unavailable|rate_limited|network|5\d\d/i.test(t+" "+n)?{kind:"temporary"}:/cannot access|not in this session|tenant/i.test(n)?{kind:"unavailable"}:{kind:"tool",message:n||"The New Vintage tool returned an error."}}function cn(e=be()){return e==="claude"?"Reconnect New Vintage in claude.ai Settings → Connectors.":"Reconnect New Vintage in your chat's connector settings."}async function un(e,t={}){var a,s,c;const n=Be(),r=(a=t.followUp)!=null?a:n&&typeof n.sendFollowUpMessage=="function"?l=>n.sendFollowUpMessage({prompt:l,...t.title?{title:t.title}:{}}):null;if(r)try{return await r(e),{kind:"sent"}}catch(l){return{kind:"failed",message:String((s=l==null?void 0:l.message)!=null?s:"The request was not sent.")}}try{const l=(c=globalThis.navigator)==null?void 0:c.clipboard;if(!l||typeof l.writeText!="function")throw new Error("no clipboard");return await l.writeText(e),{kind:"copied"}}catch{return{kind:"manual",text:e}}}const $e=["America/Los_Angeles","America/Denver","America/Phoenix","America/Chicago","America/New_York","America/Anchorage","Pacific/Honolulu"],dn=/^\d{4}-\d{2}-\d{2}$/,pn=/^[A-Za-z0-9-]{1,100}$/,Ye=/timestamptz '(\d{4}-\d{2}-\d{2}) 00:00:00 [^']*'/g,We=/(\bfocus as \(\s*(?:--[^\n]*\n\s*)?select \* from \(\s*values )\([^()]*\)(\s*\) focus_rows \()/;function X(e){throw new Error("fillGuestPrepQuery: "+e)}function gn(e){(typeof e!="string"||!dn.test(e))&&X("day must be YYYY-MM-DD");const[t,n,r]=e.split("-").map(Number),a=new Date(Date.UTC(t,n-1,r));return a.toISOString().slice(0,10)!==e&&X("bad date "+e),new Date(a.getTime()+864e5).toISOString().slice(0,10)}function fn(e){return e==null?"(null::text, null::text)":(e.source!=="commerce7"&&e.source!=="tock"&&X("unexpected source "+String(e.source)),(typeof e.id!="string"||!pn.test(e.id))&&X("arrival id may only hold letters, digits and hyphens"),"('"+e.source+"'::text, '"+e.id+"'::text)")}function Ke(e,t){const n=t||{};$e.indexOf(n.timeZone)<0&&X("unsupported time zone");const r=gn(n.day);let a=String(e);const s=Array.from(new Set(Array.from(a.matchAll(Ye),l=>l[1]))).sort();s.length>2&&X("expected at most two day literals"),a=a.replace(Ye,(l,d)=>"timestamptz '"+(s.length===2&&d===s[1]?r:n.day)+" 00:00:00 "+n.timeZone+"'"),a=a.replace(/at time zone '[^']*'/gi,l=>l.slice(0,l.indexOf("'"))+"'"+n.timeZone+"'");const c=fn(n.arrival);return We.test(a)?a=a.replace(We,(l,d,h)=>d+c+h):n.arrival&&X("this query has no focus row"),a}function E(e){if(e==null||e==="")return null;const t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}const mn=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",minimumFractionDigits:2,maximumFractionDigits:2}),hn=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",maximumFractionDigits:0});function I(e){var n;const t=(n=E(e))!=null?n:0;return Number.isInteger(Math.round(t*100)/100)?hn.format(t):mn.format(t)}function P(e,t,n=`${t}s`){return`${e} ${e===1?t:n}`}function yn(e){if(e)return e;try{return Intl.DateTimeFormat().resolvedOptions().timeZone||"America/Los_Angeles"}catch{return"America/Los_Angeles"}}function Je(e,t){const n=new Intl.DateTimeFormat("en-CA",{timeZone:t,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",hourCycle:"h23"}).formatToParts(e),r=a=>{var s,c;return(c=(s=n.find(l=>l.type===a))==null?void 0:s.value)!=null?c:"00"};return{day:`${r("year")}-${r("month")}-${r("day")}`,minutes:Number(r("hour"))%24*60+Number(r("minute"))}}const bn=/^(\d{4})-(\d{2})-(\d{2})$/;function Qe(e){return typeof e!="string"||!bn.test(e)?!1:ce(e).toISOString().slice(0,10)===e}function ce(e){const[t,n,r]=e.split("-").map(Number);return new Date(Date.UTC(t,n-1,r))}function L(e,t){return new Date(ce(e).getTime()+t*864e5).toISOString().slice(0,10)}function ve(e,t){const[n,r]=e.split("-").map(Number),a=n*12+r-1+t;return`${Math.floor(a/12)}-${String(a%12+1).padStart(2,"0")}`}function xe(e,t){return Math.round((ce(t).getTime()-ce(e).getTime())/864e5)}function ue(e){return ce(e).getUTCDay()}const Ae=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],we=["January","February","March","April","May","June","July","August","September","October","November","December"],Xe=(e,t)=>e.slice(0,4)!==t.slice(0,4)?`, ${e.slice(0,4)}`:"";function et(e,t){return`${we[Number(e.slice(5,7))-1].slice(0,3)} ${Number(e.slice(8,10))}${Xe(e,t)}`}function ee(e,t){return`${Ae[ue(e)].slice(0,3)}, ${et(e,t)}`}function _e(e,t){return`${Ae[ue(e)]}, ${we[Number(e.slice(5,7))-1]} ${Number(e.slice(8,10))}${Xe(e,t)}`}function tt(e){return`${we[Number(e.slice(5,7))-1]} ${e.slice(0,4)}`}function vn(e){const t=/^(\d{1,2}):(\d{2})/.exec(String(e!=null?e:""));return t?Number(t[1])*60+Number(t[2]):null}function ae(e){const t=Math.floor(e/60)%24;return`${t%12===0?12:t%12}:${String(e%60).padStart(2,"0")} ${t<12?"AM":"PM"}`}function de(e,t,n){return`${ee(e,n)}, ${ae(t)}`}function Me(e){if(e<=0)return"now";const t=Math.floor(e/60),n=e%60;return t?n?`in ${t} hr ${n} min`:`in ${t} hr`:`in ${n} min`}function xn(e,t){const n=xe(e,t);if(n<=0)return"today";if(n===1)return"yesterday";if(n<14)return`${n} days ago`;let r=(Number(t.slice(0,4))-Number(e.slice(0,4)))*12+Number(t.slice(5,7))-Number(e.slice(5,7));return Number(t.slice(8,10))<Number(e.slice(8,10))&&(r-=1),r<2?`${Math.max(2,Math.floor(n/7))} weeks ago`:r<12?`${r} months ago`:`${P(Math.floor(r/12),"year")} ago`}function wn(e,t){var s;const n=((s=E(e))!=null?s:0)-1,r=we[n],a=E(t);return r&&a?`${r} ${a}`:r!=null?r:a?String(a):""}function nt(e){const t=e.trim().toLowerCase();return t.charAt(0).toUpperCase()+t.slice(1)}const kn="guest-prep",Ee="guest-prep-day-arrivals";function Ce(e,t){return{call:async(n,r)=>{const a=n==="get_analysis_guide"||!t?r:{tenantId:t,...r};try{return He(await e(n,a))}catch(s){if(le(s).kind!=="temporary")throw s;return await new Promise(c=>setTimeout(c,2e3)),He(await e(n,a))}}}}async function rt(e,t){var s,c,l;const n=await e.call("get_analysis_guide",{context:"Opening the Guest Prep briefing with the latest day query.",slug:kn,includeReferenceQueries:!0,...t?{pageSetup:t}:{}}),r=(s=n.item)!=null?s:n,a={};for(const d of(c=r.referenceQueries)!=null?c:[])typeof d.slug=="string"&&typeof d.sqlText=="string"&&(a[d.slug]=d.sqlText);if(!a[Ee])throw new Q({kind:"tool",message:`The guide is missing the ${Ee} query.`});return{version:(l=E(r.version))!=null?l:0,queries:a}}async function at(e,t,n){const r=await e.call("safe_tenant_sql",{context:n,sqlText:t});return{rows:Array.isArray(r.rows)?r.rows:[],complete:r.resultMode==="complete"}}function Sn(e,t,n,r){try{return Ke(e.queries[Ee],{timeZone:t,day:n,arrival:r})}catch{throw new Q({kind:"needs_update"})}}async function st(e,t,n){var s;const r=Sn(t,n.timeZone,n.day,(s=n.arrival)!=null?s:null),a=n.arrival?"Refreshing one guest's briefing for the Guest Prep page.":"Loading one day's arrivals for the Guest Prep briefing.";for(let c=0;c<2;c+=1){const l=await at(e,r,a);if(l.complete)return l.rows}throw new Q({kind:"tool",message:"New Vintage returned only a preview of this day, so it wasn't loaded. Try again."})}async function Tn(e){var t,n;try{const r=await e.call("discover_tenant_data_sources",{context:"Finding which wineries the Guest Prep page can load."}),a=(t=r.accessibleTenants)!=null?t:r.tenants;return Array.isArray(a)?a.filter(s=>typeof(s==null?void 0:s.tenantId)=="string").map(s=>({tenantId:String(s.tenantId),name:typeof s.name=="string"&&s.name?s.name:String(s.tenantId)})):typeof r.tenantId=="string"?[{tenantId:r.tenantId,name:typeof r.tenantName=="string"?r.tenantName:r.tenantId}]:[]}catch(r){const a=String((n=r==null?void 0:r.message)!=null?n:""),s=Array.from(a.matchAll(/(?:([^,:]+?) -> )?tenantId "([^"]+)"/g)).map(c=>{var l;return{tenantId:c[2],name:((l=c[1])!=null?l:"").replace(/^.*(?:values|these)[^:]*:\s*/i,"").trim()||c[2]}});if(s.length)return s;throw r}}const Nn="Name not on file";function pe(e){var t;return(t=e.name)!=null?t:Nn}const $n=/[A-Z0-9._%+-]+@[A-Z0-9-]+(?:\.[A-Z0-9-]+)*\.[A-Z]{2,}/gi,An=/(?:\+?\d{1,3}[\s.-]?)?(?:\(\d{3}\)\s?|\b\d{3}[\s.-]?)\d{3}[\s.-]?\d{4}\b|\b\d{3}[\s.-]\d{4}\b/g;function ot(e){const t=String(e!=null?e:"").replace($n,"[email]").replace(An,"[phone]").replace(/\s{2,}/g," ").replace(/\s+([,.;:!?])/g,"$1").replace(/([,;:])(?=[.!?]|$)/g,"").replace(/^[\s,;:.-]+|[\s,;:-]+$/g,"");return t||null}const Pe=e=>String(e!=null?e:"").trim().replace(/\s+/g," ").toLowerCase();function _n(e){const t=n=>(n!=null?n:[]).flatMap(r=>{try{return[new RegExp(r,"i")]}catch{return[]}});return{hide:t(e.hide),interests:t(e.interests),vip:t(e.vip),club:t(e.club)}}function Mn(e,t){var r;const n={vip:!1,interests:[],clubTags:[],accountTags:[]};for(const a of e){const s=a.trim();if(!s||t.hide.some(l=>l.test(s)))continue;const c=t.interests.map(l=>l.exec(s)).find(Boolean);if(c){n.interests.push(((r=c[1])!=null?r:c[0]).trim());continue}t.vip.some(l=>l.test(s))?n.vip=!0:t.club.some(l=>l.test(s))?n.clubTags.push(s):n.accountTags.push(s)}return n}function A(e){if(e==null)return null;const t=String(e).trim();return t||null}function ke(e){if(Array.isArray(e))return e;if(typeof e=="string"&&e.trim().startsWith("["))try{const t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}return[]}function se(e){return typeof e=="string"&&!e.trim().startsWith("[")?e.split(",").map(t=>t.trim()).filter(Boolean):ke(e).map(t=>A(t)).filter(t=>!!t)}const En=e=>/^rose$/i.test(e)?"Rosé":e,it=e=>se(e).map(t=>t.toLowerCase());function lt(e,t){if(!/^\d{2}-\d{2}$/.test(e))return null;const n=Number(t.slice(0,4)),a=[n-1,n,n+1].map(s=>`${s}-${e}`).filter(s=>L(s,0)===s).sort((s,c)=>Math.abs(xe(t,s))-Math.abs(xe(t,c)))[0];return a&&Math.abs(xe(t,a))<=30?a:null}function Cn(e,t,n){const r=[],a=A(e.bday_md),s=a?lt(a,t):null;s&&r.push(s===t?"Birthday on this day":`Birthday ${ee(s,n)}`);const c=A(e.club_signup),l=c&&/^\d{4}-\d{2}-\d{2}$/.test(c)?lt(c.slice(5),t):null,d=l&&c?Number(l.slice(0,4))-Number(c.slice(0,4)):0;return l&&d>0&&r.push(`${P(d,"year")} in the club ${l===t?"on this day":ee(l,n)}`),r}function Pn(e,t){var $,V,te;const n=e.source==="tock"?"tock":"commerce7",r=String(($=e.arr_id)!=null?$:""),a=(V=E(e.party))!=null?V:0,s=e.visit==="First visit"?"first":e.visit==="Return"?"return":"unknown",c=Mn(se(e.tags),t.rules),l=A(e.club_titles),d=l!==null,h=A(e.signup_tier),T=A(e.churn_tier),m=!d&&it(h).some(p=>p==="high"||p==="very high"),b=d&&it(T).some(p=>p==="medium"||p==="high"),G=A(e.last_taste),C=G?{title:G,day:A(e.last_taste_date)}:null,F=ke(e.last_taste_items).map(p=>p).map(p=>{var v,M;return{title:(v=A(p==null?void 0:p.title))!=null?v:"",qty:(M=E(p==null?void 0:p.qty))!=null?M:0}}).filter(p=>p.title),O=ke(e.notes).map(p=>p).map(p=>({content:ot(p==null?void 0:p.content),when:wn(p==null?void 0:p.month,p==null?void 0:p.year),original:Pe(p==null?void 0:p.content)})).filter(p=>!!p.content).slice(0,3),_=O.map(({content:p,when:v})=>({content:p,when:v})),Z=new Set(O.map(p=>p.original)),Y=[];for(const p of ke(e.last_taste_notes)){const v=ot(p);if(!(!v||Z.has(Pe(p)))&&(Z.add(Pe(p)),Y.push(v),Y.length===3))break}const z=E(e.price_floor),W=E(e.price_ceiling),B=E(e.avg_unit_price),D=E(e.ltv_cents),R=E(e.order_count);return{key:`${n}:${r}`,source:n,id:r,row:e,minutes:(te=vn(e.t))!=null?te:0,party:a,experience:A(e.experience),name:A(e.name),visit:s,vip:c.vip,clubMember:d,clubTitles:l,prospect:m,signupTier:h,atRisk:b,churnTier:T,clubPickup:A(e.next_ship)===t.day,large:a>=t.largeParty,occasions:Cn(e,t.day,t.today),interests:c.interests,clubTags:c.clubTags,accountTags:c.accountTags,varietals:se(e.top_varietals).slice(0,3),wineTypes:se(e.top_wine_types).map(En).slice(0,2),vintages:se(e.top_vintages).slice(0,3),appellations:se(e.top_appellations).slice(0,2),lastTaste:C,bought:C?{items:F,total:E(e.last_taste_spend)}:null,orderNotes:Y,personalNotes:_,price:z!==null||W!==null||B!==null?{floor:z,ceiling:W,avg:B}:null,lifetime:D!==null&&(D>0||(R!=null?R:0)>0)?{spend:D/100,orders:R}:null,since:A(e.since_year)}}function zn(e,t){return e.map(n=>Pn(n,t)).map((n,r)=>({arrival:n,index:r})).sort((n,r)=>n.arrival.minutes-r.arrival.minutes||n.index-r.index).map(({arrival:n})=>n)}function ze(e,t){return e<t?"past":e>t?"future":"today"}function Ie(e,t,n){return t!=="today"?{upcoming:e,earlier:[]}:{upcoming:e.filter(r=>r.minutes>=n),earlier:e.filter(r=>r.minutes<n)}}function In(e,t,n){if(t!=="today")return null;const r=e.minutes-n;return r>=0&&r<=120?Me(r):null}function Ln(e){const t=e.slice(0,2).map(pe).join(", ");return e.length>2?`${t} and ${e.length-2} more`:t}function Le(e,t,n,r,a){return n.length?n.length===1?{label:e,value:pe(n[0]),detail:de(r,n[0].minutes,a)}:{label:t,value:P(n.length,"guest"),detail:Ln(n)}:null}function ct(e,t,n){const r=[];r.push(Le("Club pickup","Club pickups",e.filter(s=>s.clubPickup),t,n));const a=e.filter(s=>s.large);if(a.length===1)r.push({label:"Large party",value:`Party of ${a[0].party}`,detail:de(t,a[0].minutes,n)});else if(a.length>1){const s=a.reduce((l,d)=>l+d.party,0),c=a.slice(0,2).map(l=>`${ae(l.minutes)} for ${l.party}`).join(", ");r.push({label:"Large parties",value:`${P(a.length,"party","parties")}, ${P(s,"guest")}`,detail:`${ee(t,n)}, ${c}${a.length>2?` and ${a.length-2} more`:""}`})}return r.push(Le("VIP","VIPs",e.filter(s=>s.vip),t,n)),r.push(Le("Club prospect","Club prospects",e.filter(s=>s.prospect),t,n)),r.filter(s=>s!==null)}function On(e,t,n){var l;const r=new Map;for(const d of e){const h=Math.floor(d.minutes/30)*30,T=(l=r.get(h))!=null?l:{parties:0,guests:0};r.set(h,{parties:T.parties+1,guests:T.guests+d.party})}const a=Array.from(r.entries()).sort((d,h)=>h[1].guests-d[1].guests||h[1].parties-d[1].parties||d[0]-h[0])[0];if(!a)return null;const[s,c]=a;return{label:"Busiest half hour",value:`${ae(s)} to ${ae(s+30)}`,detail:`${ee(t,n)}, ${P(c.parties,"party","parties")}, ${P(c.guests,"guest")}`}}function Dn(e,t,n,r){const a={reservations:e.length,guests:e.reduce((h,T)=>h+T.party,0)};if(!e.length)return{...a,message:"No reservations on this day",facts:[]};const s=ze(t,n);if(s==="past")return{...a,message:"This day has passed",facts:[]};const{upcoming:c,earlier:l}=Ie(e,s,r);if(!c.length)return{...a,message:"No more arrivals today",facts:[]};if(l.length){const h=c[0];return{...a,message:null,facts:[{label:"Still to arrive",value:`${c.length} of ${e.length}`},{label:"Next arrival",value:de(t,h.minutes,n),detail:Me(h.minutes-r)},...ct(c,t,n)]}}const d=ct(c,t,n);if(!d.length){const h=On(c,t,n);h&&d.push(h)}return{...a,message:null,facts:d}}function Rn(e){return new Set(e.map(n=>n.source)).size===1?e[0].source:null}const Oe={commerce7:"Commerce7",tock:"Tock"},Vn="Load Guest Prep day";function qn(e){var n;const t=((n=e.wineryName)==null?void 0:n.trim())||"this winery";return[`Load Guest Prep for ${e.day} for ${t} (tenantId ${e.tenantId}) through the New Vintage connector in ${e.timeZone}.`,"Use the specification's read-only day query and add only complete safe_tenant_sql results to this existing Guest Prep.","Narrow or split sampled results until every piece is complete.","Select the requested service day, preserve every previously loaded date, and return the updated interactive briefing.","Update both the in-chat and standalone versions when both exist in this conversation.","Preserve the design, confirmed tag rules, read-only access and privacy filtering.","Do not use exports or invent guests."].join(" ")}const ut="0.1.1",ge=(e,t)=>String(e!=null?e:"").replace(/\s+/g," ").trim().slice(0,t);function dt(e={},t=[]){var n,r,a,s,c,l;return{packageVersion:ut,hiddenSections:((n=e.hide)!=null?n:[]).slice(0,20).map(d=>ge(d,40)),reorderedViews:[],renamedSections:Object.keys((r=e.labels)!=null?r:{}).slice(0,20).map(d=>ge(d,40)),themeChanged:Object.keys((a=e.theme)!=null?a:{}).length+Object.keys((s=e.themeDark)!=null?s:{}).length>0,fontsChanged:!!((c=e.fonts)!=null&&c.display||(l=e.fonts)!=null&&l.body),titleChanged:!!e.title,customCards:t.slice(0,10).map(d=>{var h;return{title:ge(d.title,80),purpose:ge(d.purpose,160),view:ge((h=d.after)!=null?h:"page",20)}})}}const pt="guest-prep.tenant",gt=e=>`guest-prep:${e}`;function Un(){const e=globalThis.storage;return e&&typeof e.get=="function"&&typeof e.set=="function"?e:null}function jn(){try{const e=globalThis.localStorage,t="__nv_probe__";return e.setItem(t,"1"),e.removeItem(t),e}catch{return null}}function Gn(e){return typeof e=="string"?e:e&&typeof e=="object"&&typeof e.value=="string"?e.value:null}function Fn(e){if(e)return{adapter:e,mode:"artifact"};const t=Un();if(t)return{mode:"artifact",adapter:{get:async(r,a)=>Gn(await t.get(r,a)),set:async(r,a,s)=>{await t.set(r,a,s)}}};const n=jn();return n?{mode:"browser",adapter:{get:async r=>n.getItem(r),set:async(r,a)=>n.setItem(r,a)}}:{adapter:null,mode:"none"}}async function ft(e,t){if(!e)return null;try{return await e.get(t,!1)}catch{return null}}async function mt(e,t,n){if(e)try{await e.set(t,n,!1)}catch{}}function Zn(e){if(!e)return null;try{const t=JSON.parse(e);return typeof t.day!="string"||typeof t.savedOn!="string"?null:{day:t.day,guest:typeof t.guest=="string"?t.guest:null,savedOn:t.savedOn}}catch{return null}}const Bn={"surface-base":"#f7f5f1","surface-subtle":"#f2efea","surface-raised":"#ffffff","text-primary":"#1a1917","text-secondary":"#4f4a43","text-tertiary":"#6b655d","border-subtle":"#ebe7df","border-default":"#ddd8ce","border-strong":"#8d877f","action-primary-bg":"#0b6623","action-primary-fg":"#ffffff","action-primary-hover":"#155826","focus-ring-color":"#1a6b30","status-warning":"#9c6110","status-warning-bg":"#fff7e7","font-display":"'Newsreader', Georgia, serif","font-body":"'Be Vietnam Pro', system-ui, sans-serif"},Hn={"surface-base":"#171614","surface-subtle":"#24211f","surface-raised":"#34302d","text-primary":"#f5f3ef","text-secondary":"#d0c8bd","text-tertiary":"#b4aba0","border-subtle":"#3b3632","border-default":"#4c4742","border-strong":"#8a8279","action-primary-bg":"#57bd76","action-primary-fg":"#06210d","action-primary-hover":"#7ecb93","focus-ring-color":"#8cd0a0","status-warning":"#f0c36a","status-warning-bg":"rgba(240,195,106,.16)"},Yn=/^[a-z][a-z0-9-]{0,40}$/,Wn=/^[^;{}<>\\]{1,120}$/;function ht(e){return Object.entries(e).filter(([t,n])=>Yn.test(t)&&typeof n=="string"&&Wn.test(n)).map(([t,n])=>`--${t}:${n};`).join("")}function Kn(e){return`https://fonts.googleapis.com/css2?${e.map(n=>`family=${encodeURIComponent(n).replace(/%20/g,"+")}:wght@300;400;500;600`).join("&")}&display=swap`}function Jn(e={},t={}){const n=ht({...Bn,...e}),r=ht({...Hn,...t});return`:root,.nvgp{${n}}@media (prefers-color-scheme: dark){:root,.nvgp{${r}}}`}const De="120ms cubic-bezier(0.2,0,0.2,1)",Qn=`
2
2
  html,body{margin:0;background:var(--surface-base,#f7f5f1)}
3
3
  .nvgp{background:var(--surface-base);color:var(--text-primary);font:16px/1.5 var(--font-body);-webkit-font-smoothing:antialiased;min-height:100vh;overflow-x:clip}
4
4
  .nvgp *{box-sizing:border-box}
@@ -19,7 +19,7 @@ html,body{margin:0;background:var(--surface-base,#f7f5f1)}
19
19
  .nvgp .storage-note{font-size:13px;color:var(--text-tertiary);margin:0 0 8px}
20
20
  .nvgp .daybar{position:sticky;top:0;z-index:20;background:var(--surface-base);display:flex;flex-wrap:wrap;align-items:center;gap:8px 16px;padding:12px 0;padding-top:max(12px,env(safe-area-inset-top))}
21
21
  .nvgp .day-wrap{position:relative;max-width:100%}
22
- .nvgp .day-button{display:inline-flex;align-items:center;gap:8px;min-height:40px;max-width:100%;padding:0 14px;border:1px solid var(--border-default);border-radius:10px;background:var(--surface-raised);font-size:15px;font-weight:600;cursor:pointer;transition:border-color ${Oe}}
22
+ .nvgp .day-button{display:inline-flex;align-items:center;gap:8px;min-height:40px;max-width:100%;padding:0 14px;border:1px solid var(--border-default);border-radius:10px;background:var(--surface-raised);font-size:15px;font-weight:600;cursor:pointer;transition:border-color ${De}}
23
23
  .nvgp .day-button:hover{border-color:var(--border-strong)}
24
24
  .nvgp .day-button svg{flex:none;color:var(--text-secondary)}
25
25
  .nvgp .day-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
@@ -57,7 +57,7 @@ html,body{margin:0;background:var(--surface-base,#f7f5f1)}
57
57
  .nvgp h2{font:300 22px/1.3 var(--font-display);margin:0}
58
58
  .nvgp .card-aside{font-size:13px;color:var(--text-secondary)}
59
59
  .nvgp .rows{list-style:none;margin:0;padding:0}
60
- .nvgp .row{display:grid;grid-template-columns:88px minmax(0,1fr) auto;gap:12px;width:100%;padding:12px 24px;border:0;border-bottom:1px solid var(--border-subtle);border-left:3px solid transparent;background:none;text-align:left;cursor:pointer;transition:background ${Oe}}
60
+ .nvgp .row{display:grid;grid-template-columns:88px minmax(0,1fr) auto;gap:12px;width:100%;padding:12px 24px;border:0;border-bottom:1px solid var(--border-subtle);border-left:3px solid transparent;background:none;text-align:left;cursor:pointer;transition:background ${De}}
61
61
  .nvgp .row:hover{background:var(--surface-subtle)}
62
62
  .nvgp .row[aria-current="true"]{border-left-color:var(--action-primary-bg);background:var(--surface-subtle)}
63
63
  .nvgp .row-time{font-weight:600;font-variant-numeric:tabular-nums}
@@ -78,7 +78,7 @@ html,body{margin:0;background:var(--surface-base,#f7f5f1)}
78
78
  .nvgp .empty-title{font:300 22px/1.3 var(--font-display);color:var(--text-primary);margin:0 0 8px}
79
79
  .nvgp .note{font-size:14px;color:var(--text-secondary);margin:8px 0 0}
80
80
  .nvgp .problem{color:var(--status-warning)}
81
- .nvgp .button{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:40px;padding:0 16px;border:0;border-radius:8px;background:var(--action-primary-bg);color:var(--action-primary-fg);font-weight:500;cursor:pointer;transition:background ${Oe}}
81
+ .nvgp .button{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:40px;padding:0 16px;border:0;border-radius:8px;background:var(--action-primary-bg);color:var(--action-primary-fg);font-weight:500;cursor:pointer;transition:background ${De}}
82
82
  .nvgp .button:hover{background:var(--action-primary-hover)}
83
83
  .nvgp .button:disabled{opacity:.55;cursor:default}
84
84
  .nvgp .button-quiet{background:transparent;color:var(--text-primary);border:1px solid var(--border-strong)}
@@ -101,11 +101,21 @@ html,body{margin:0;background:var(--surface-base,#f7f5f1)}
101
101
  .nvgp .tile-warning{background:var(--status-warning-bg);color:var(--status-warning)}
102
102
  .nvgp .psec-facts{display:grid;gap:12px}
103
103
  .nvgp .fact-row{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}
104
+ .nvgp .fact-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 16px}
104
105
  .nvgp .soft{margin:4px 0 0;padding:8px 12px;border-radius:8px;background:var(--surface-subtle);font-size:14px;overflow-wrap:anywhere}
105
106
  .nvgp .soft-when{display:block;font-size:12px;color:var(--text-tertiary);margin-top:2px}
106
- .nvgp .bought{list-style:none;margin:4px 0 0;padding:4px 12px;border-radius:8px;background:var(--surface-subtle);font-size:14px}
107
- .nvgp .bought li{display:flex;justify-content:space-between;gap:12px;padding:6px 0;border-top:1px solid var(--border-subtle)}
108
- .nvgp .bought li:first-child{border-top:0}
107
+ .nvgp .psec-source{margin:-8px 0 12px 36px;font-size:13px;color:var(--text-secondary)}
108
+ .nvgp .visit{margin-top:4px;padding:10px 12px;border-radius:8px;background:var(--surface-subtle);font-size:14px;overflow-wrap:anywhere}
109
+ .nvgp .visit-title{margin:0;font-weight:500}
110
+ .nvgp .visit-muted{margin:2px 0 0;font-size:13px;color:var(--text-secondary);font-variant-numeric:tabular-nums}
111
+ .nvgp .visit-bought .visit-muted{margin:0}
112
+ .nvgp .visit-divider{margin:10px 0;border:0;border-top:1px solid var(--border-default)}
113
+ .nvgp .visit-note{margin:0}
114
+ .nvgp .visit-note+.visit-note{margin-top:6px;padding-top:6px;border-top:1px solid var(--border-default)}
115
+ .nvgp .bought{list-style:none;margin:0;padding:0}
116
+ .nvgp .bought li{display:flex;justify-content:space-between;gap:12px;padding:6px 0;border-top:1px solid var(--border-default)}
117
+ .nvgp .bought li:first-child{border-top:0;padding-top:0}
118
+ .nvgp .bought li:last-child{padding-bottom:0}
109
119
  .nvgp .bought .qty{color:var(--text-tertiary);font-variant-numeric:tabular-nums;white-space:nowrap}
110
120
  .nvgp .bought .total{font-weight:500}
111
121
  .nvgp .research{margin-top:8px}
@@ -141,7 +151,8 @@ html,body{margin:0;background:var(--surface-base,#f7f5f1)}
141
151
  .nvgp .earlier-head{padding:8px 16px}
142
152
  .nvgp .panel-body{padding:0 16px 24px}
143
153
  .nvgp .fact-row{grid-template-columns:repeat(2,minmax(0,1fr))}
154
+ .nvgp .fact-grid{grid-template-columns:minmax(0,1fr)}
144
155
  .nvgp .custom-card{padding:12px 16px}
145
156
  }
146
157
  @media (prefers-reduced-motion: reduce){.nvgp *{transition-duration:0ms!important;animation:none!important}}
147
- `,Jn=["summary","guestList"],ht=["reservation","talkAbout","relationship","headsUp","personalNotes"],Qn=[...Jn,...ht],ge={timeZone:"America/Los_Angeles",largeParty:10,tagRules:{interests:["^(?:client\\s+)?interest(?:ed)?(?:\\s+in)?\\s*[-–—:]\\s*(.+)$"],vip:["\\bvip\\b"],club:["(?:member|membership|club)"],hide:["^\\*+\\s*test\\s*\\*+$","^test\\b"]}};function o(e,t=null,...n){const r=document.createElement(e);for(const[a,s]of Object.entries(t!=null?t:{}))s==null||s===!1||(typeof s=="function"?r.addEventListener(a.replace(/^on/,"").toLowerCase(),s):s===!0?r.setAttribute(a,""):r.setAttribute(a,String(s)));return yt(r,n),r}function yt(e,t){for(const n of t)n==null||n===!1||(Array.isArray(n)?yt(e,n):e.append(n instanceof Node?n:String(n)))}const Xn="http://www.w3.org/2000/svg";function bt(e,t={},...n){const r=document.createElementNS(Xn,e);for(const[a,s]of Object.entries(t))r.setAttribute(a,String(s));return r.append(...n),r}const er={"chevron-left":["M15 18l-6-6 6-6"],"chevron-right":["M9 18l6-6-6-6"],"chevron-down":["M6 9l6 6 6-6"],calendar:["M8 2v4","M16 2v4","M5 4h14a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2z","M3 10h18"],"message-circle":["M7.9 20A9 9 0 1 0 4 16.1L2 22z"],heart:["M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7z"],"triangle-alert":["M21.73 18l-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3z","M12 9v4","M12 17h.01"],"sticky-note":["M16 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V8z","M15 3v4a2 2 0 0 0 2 2h4"],x:["M18 6L6 18","M6 6l12 12"],"refresh-cw":["M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8","M21 3v5h-5","M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16","M8 16H3v5"]};function H(e,t=16){var n;return bt("svg",{width:t,height:t,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":2,"stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true"},...((n=er[e])!=null?n:[]).map(r=>bt("path",{d:r})))}function $(e,t="note"){return o("p",{class:t},e)}function v(e,t,n,r=""){return o("div",{class:`fact${r?` ${r}`:""}`},o("div",{class:"fact-label"},e),o("div",{class:"fact-value"},t),n?o("div",{class:"fact-detail"},n):null)}function ke(e,t="neutral"){return o("div",{class:"chips"},e.map(n=>o("span",{class:`chip chip-${t}`},n)))}function vt(e){return o("span",{class:`badge${e==="VIP"?" badge-vip":""}`},e)}function xt(e){return Number(O(`${be(e,1)}-01`,-1).slice(8,10))}function wt(e,t){const n=be(e.slice(0,7),t);return`${n}-${String(Math.min(Number(e.slice(8,10)),xt(n))).padStart(2,"0")}`}function tr(e){const t=`${e}-01`,n=Array.from({length:ce(t)},()=>null);for(let r=0;r<xt(e);r+=1)n.push(O(t,r));return n}function nr(e,t){switch(t){case"ArrowLeft":return O(e,-1);case"ArrowRight":return O(e,1);case"ArrowUp":return O(e,-7);case"ArrowDown":return O(e,7);case"PageUp":return wt(e,-1);case"PageDown":return wt(e,1);case"Home":return O(e,-ce(e));case"End":return O(e,6-ce(e));default:return null}}function rr(e){const{state:t}=e,n=tr(t.month).map((s,c)=>{if(!s)return o("span",{"aria-hidden":"true","data-blank":c});const l=s===t.focus;return o("button",{type:"button",class:`cal-day${s===e.today?" is-today":""}`,"aria-label":Ae(s,e.today)+(s===e.today?", today":""),"aria-selected":s===e.selected?"true":"false","aria-current":s===e.today?"date":null,tabindex:l?0:-1,"data-day":s,"data-fid":l?"cal-focus":null,onclick:()=>e.onPick(s)},String(Number(s.slice(8,10))))}),r=o("div",{class:"cal-grid",role:"group","aria-label":et(t.month)},$e.map(s=>o("span",{class:"cal-dow","aria-hidden":"true"},s.slice(0,2))),n);r.addEventListener("keydown",s=>{const c=s.key,l=nr(t.focus,c);l&&(s.preventDefault(),e.onFocus(l))});const a=o("div",{class:"calendar",role:"dialog","aria-label":"Choose a day"},o("div",{class:"cal-head"},o("button",{type:"button",class:"icon-button","aria-label":"Previous month",onclick:()=>e.onMonth(be(t.month,-1))},H("chevron-left")),o("span",{class:"cal-title","aria-live":"polite"},et(t.month)),o("button",{type:"button",class:"icon-button","aria-label":"Next month",onclick:()=>e.onMonth(be(t.month,1))},H("chevron-right"))),r);return a.addEventListener("keydown",s=>{s.key==="Escape"&&(s.preventDefault(),s.stopPropagation(),e.onClose())}),a}const ar="https://newvintage.ai/?utm_source=guest-prep&utm_medium=referral&utm_campaign=guest-prep&utm_content=season-bar-logo",sr={summary:"Summary",guestList:"Everyone coming in",reservation:"Reservation",talkAbout:"Talk about",relationship:"Relationship",headsUp:"Heads-up",personalNotes:"Personal notes"},or={reservation:"calendar",talkAbout:"message-circle",relationship:"heart",headsUp:"triangle-alert",personalNotes:"sticky-note"};function De(e,t){var r,a;const n=(a=(r=e.options.customize)==null?void 0:r.labels)==null?void 0:a[t];return typeof n=="string"&&n.trim()?n.trim():sr[t]}function Re(e,t){var n,r;return((r=(n=e.options.customize)==null?void 0:n.hide)!=null?r:[]).includes(t)}const ir=()=>ye()==="claude";function lr(e){const t=e.dayState;let n="idle",r,a=null;return t.status==="choose"?r="Choose a winery to load reservations":t.status==="loading"?r="Loading reservations":t.status==="unloaded"?r="This day isn't loaded yet":t.status==="failed"?(n="problem",r="This day couldn't load"):t.arrivals.length?(n="loaded",r="Commerce7 reservations and Tock orders",a="Commerce7 and Tock"):r="No arrivals on this day",o("div",{class:`status status-${n}`,role:"status","aria-live":"polite"},o("span",{class:"dot","aria-hidden":"true"}),a?[o("span",{class:"status-long"},r),o("span",{class:"status-short","aria-hidden":"true"},a)]:o("span",null,r))}function cr(e,t){if(!e.wineries||e.wineries.length<2)return null;const n=o("select",{id:"winery-picker","data-fid":"winery-picker",onchange:r=>t.chooseWinery(r.target.value)},o("option",{value:"",disabled:!0,selected:!e.tenantId},"Choose a winery"),e.wineries.map(r=>o("option",{value:r.tenantId,selected:r.tenantId===e.tenantId},r.name)));return o("label",{class:"picker",for:"winery-picker"},"Winery",n)}function ur(e,t){return o("header",{class:"header"},o("a",{class:"logo",href:ar,target:"_blank",rel:"noopener","aria-label":"New Vintage"},o("span",{class:"logo-mark","aria-hidden":"true"},"New Vintage")),o("div",{class:"heading"},o("h1",null,e.title),lr(e),cr(e,t)))}function dr(e,t){const n=e.day===e.today?"Today":e.day===O(e.today,1)?"Tomorrow":null,r=o("button",{type:"button",class:"day-button","data-fid":"day-button","aria-haspopup":"dialog","aria-expanded":e.calendar.open?"true":"false",onclick:()=>t.toggleCalendar()},H("calendar",18),o("span",{class:"day-label"},Ae(e.day,e.today)),n?o("span",{class:"day-relative"},n):null,H("chevron-down",16)),a=e.calendar.open?rr({state:e.calendar,selected:e.day,today:e.today,onPick:t.pickDay,onFocus:t.focusDay,onMonth:t.showMonth,onClose:t.closeCalendar}):null;return o("div",{class:"daybar"},o("div",{class:"day-wrap"},r,a),e.dayNote?o("span",{class:`day-note${e.dayNote.problem?" problem":""}`,"aria-live":"polite"},e.dayNote.text):null)}function pr(e){if(e.dayState.status!=="ready"||Re(e,"summary"))return null;const t=zn(e.dayState.arrivals,e.day,e.today,e.nowMinutes),n=(r,a,s)=>o("div",{class:"number"},o("div",{class:"number-value"},String(r)),o("div",{class:"number-label"},r===1?a:s));return o("section",{class:"card summary","data-section":"summary","aria-label":De(e,"summary")},o("div",{class:"numbers"},n(t.reservations,"Reservation","Reservations"),n(t.guests,"Guest","Guests")),o("div",{class:"facts"},t.message?o("div",{class:"summary-message"},t.message):t.facts.map(r=>v(r.label,r.value,r.detail,r.label==="Next arrival"?"fact-countdown":""))),v("Now",ae(e.nowMinutes),ee(e.today,e.today),"now"))}function gr(e){const t=[];return e.vip&&t.push("VIP"),e.clubMember&&t.push("Club member"),e.prospect&&t.push("Club prospect"),e.atRisk&&t.push("Membership at risk"),e.visit==="first"&&t.push("First visit"),t.map(vt)}function kt(e,t,n,r,a){var l;const s=a?null:Ln(n,e.kind,e.nowMinutes),c=[n.experience,r?ze[n.source]:null].filter(Boolean).join(", ");return o("li",null,o("button",{type:"button",class:`row${a?" row-earlier":""}`,"data-key":n.key,"data-fid":`row-${n.key}`,"aria-current":((l=e.selected)==null?void 0:l.key)===n.key?"true":"false",onclick:()=>t.select(n.key)},o("span",{class:"row-when"},o("span",{class:"row-time"},ae(n.minutes)),o("span",{class:"row-date",style:"display:block"},ee(e.day,e.today)),s?o("span",{class:"row-soon soon",style:"display:block"},s):null),o("span",{style:"min-width:0"},o("span",{class:"row-name"},o("span",null,de(n)),gr(n)),c?o("span",{class:"row-experience",style:"display:block"},c):null),o("span",{class:"row-party"},L(n.party,"guest"))))}function fr(){return o("div",{"aria-hidden":"true"},[0,1,2,3].map(()=>o("div",{class:"skeleton-row"},o("span",{class:"skel",style:"flex:0 0 72px"}),o("span",{class:"skel",style:"flex:2"}),o("span",{class:"skel",style:"flex:0 0 56px"}))))}function mr(e){const t=e.request,n=Ae(e.day,e.today);return(t==null?void 0:t.kind)==="sent"?$(`Request sent. You may need to finish sending it in the chat. The briefing updates after the assistant loads ${n}.`):(t==null?void 0:t.kind)==="copied"?$(`Request copied. Paste it into this chat to load ${n}.`):(t==null?void 0:t.kind)==="manual"?o("div",null,$(`Copy this request into the chat to load ${n}.`),o("textarea",{class:"request-text",readonly:!0,rows:6,"aria-label":"Request to copy",onfocus:r=>r.target.select()},t.text)):(t==null?void 0:t.kind)==="failed"?$(`The request wasn't sent. ${t.message}`,"note problem"):null}function hr(e,t){var a;const n=((a=e.request)==null?void 0:a.kind)==="pending",r=ir()?"This page holds the days loaded in this chat. Load this day asks the chat for it, or open the page where the New Vintage connector can run to load any day.":"This page holds the days loaded in this chat. Load this day asks the chat for it.";return o("div",{class:"empty"},o("p",{class:"empty-title"},"This day isn't loaded yet"),$(r),o("div",{class:"actions"},o("button",{type:"button",class:"button","data-fid":"load-day",disabled:n,"aria-busy":n?"true":"false",onclick:()=>t.requestDay()},n?"Sending…":"Load this day")),mr(e))}function yr(e,t){if(Re(e,"guestList"))return null;const n=e.dayState,r=De(e,"guestList");let a=null,s;if(n.status==="loading")s=fr();else if(n.status==="choose")s=o("div",{class:"empty"},o("p",{class:"empty-title"},"Choose a winery"),n.message?$(n.message):null);else if(n.status==="unloaded")s=hr(e,t);else if(n.status==="failed")s=o("div",{class:"empty"},o("p",{class:"empty-title"},"This day couldn't load"),$(n.message,"note problem"),o("div",{class:"actions"},o("button",{type:"button",class:"button","data-fid":"retry",onclick:()=>t.retry()},"Try again")));else if(!n.arrivals.length)s=o("div",{class:"empty"},o("p",{class:"empty-title"},"No one is coming in on this day."));else{const c=On(n.arrivals);c&&(a=`All from ${ze[c]}`);const{upcoming:l,earlier:d}=Pe(n.arrivals,e.kind,e.nowMinutes);s=o("ul",{class:"rows"},l.map(m=>kt(e,t,m,!c,!1)),d.length?o("li",{class:"earlier-head"},"Earlier today",o("span",{class:"count","aria-label":L(d.length,"reservation")},String(d.length))):null,d.map(m=>kt(e,t,m,!c,!0)))}return o("section",{class:"card list-card","data-section":"guestList","aria-busy":n.status==="loading"?"true":"false"},o("div",{class:"card-head"},o("h2",null,r),a?o("span",{class:"card-aside"},a):null),s)}function St(e){return e.map(t=>o("p",{class:"soft"},t.text,t.when?o("span",{class:"soft-when"},t.when):null))}function br(e){const t=e.bought;return t?t.items.length?o("ul",{class:"bought"},t.items.map(n=>o("li",null,o("span",null,n.title),o("span",{class:"qty"},`× ${n.qty}`))),t.total!==null?o("li",{class:"total"},o("span",null,"Total"),o("span",null,z(t.total))):null):"Nothing beyond the tasting":null}function vr(e){const{floor:t,ceiling:n}=e;return t!==null&&n!==null?t===n?z(t):`${z(t)} to ${z(n)}`:t!==null?`From ${z(t)}`:n!==null?`Up to ${z(n)}`:e.avg!==null?z(e.avg):null}function xr(e,t,n){var s,c;const r=[],a=l=>{l&&r.push(l)};switch(n){case"reservation":{const l=e.kind==="today"&&t.minutes>=e.nowMinutes;r.push(o("div",{class:"fact-row"},v("Arrives",ue(e.day,t.minutes,e.today),l?_e(t.minutes-e.nowMinutes):null,l?"fact-countdown":""),v("Party",L(t.party,"guest")),v("Booked via",ze[t.source]))),a(t.experience?v("Experience",t.experience):null);break}case"talkAbout":{if(a(t.occasions.length?v("Occasion",t.occasions.map((d,m)=>o("div",{"data-line":m},d))):null),a(t.interests.length?v("Interested in",ke(t.interests)):null),a(t.varietals.length?v("Favorite varietals",t.varietals.join(", ")):null),t.lastTaste){const d=t.lastTaste.day?`${Xe(t.lastTaste.day,e.today)}, ${vn(t.lastTaste.day,e.today)}`:null;a(v("Last taste",t.lastTaste.title,d));const m=br(t);a(m?v("Bought that visit",m):null)}a(t.orderNotes.length?v("Order notes",St(t.orderNotes.map(d=>({text:d})))):null);const l=t.price?vr(t.price):null;a(l?v("Usual bottle price",l,((s=t.price)==null?void 0:s.avg)!==null&&((c=t.price)==null?void 0:c.avg)!==void 0?`Average ${z(t.price.avg)}`:null):null);break}case"relationship":a(t.since?v("Customer since",t.since):null),a(t.lifetime?v("Lifetime spend",z(t.lifetime.spend),t.lifetime.orders!==null?L(t.lifetime.orders,"order"):null):null),a(t.clubTitles?v("Club",t.clubTitles):null),a(t.clubPickup?v("Club pickup","Shipment ready to hand over"):null),a(t.prospect&&t.signupTier?v("Likely to join the club",tt(t.signupTier)):null),a(t.atRisk&&t.churnTier?v("Membership at risk",tt(t.churnTier)):null),a(t.clubTags.length?v("Club tags",ke(t.clubTags)):null);break;case"headsUp":a(t.accountTags.length?v("Account tags",ke(t.accountTags,"warning")):null);break;case"personalNotes":r.push(...St(t.personalNotes.map(l=>({text:l.content,when:l.when}))));break}return r}function wr(e){const t=[];return e.vip&&t.push("VIP"),t.push(e.visit==="first"?"First visit":e.visit==="return"?"Returning guest":"Visit history unknown"),e.clubMember&&t.push("Club member"),e.prospect&&t.push("Club prospect"),e.atRisk&&t.push("Membership at risk"),o("div",{class:"chips"},t.map(vt))}const kr=["reservation","talkAbout","relationship","headsUp","personalNotes"];function Sr(e,t,n){var d,m,S;const r=e.selected;if(!r||e.dayState.status!=="ready")return null;const a=[];for(const f of kr){if(!Re(e,f)){const b=xr(e,r,f);b.length&&a.push(o("section",{class:"psec","data-section":f},o("h3",{class:"psec-title"},o("span",{class:`tile${f==="headsUp"?" tile-warning":""}`},H((d=or[f])!=null?d:"",16)),De(e,f)),o("div",{class:"psec-facts"},b)))}a.push(...n(f))}const s=((m=e.research)==null?void 0:m.key)===r.key?e.research:null,c=(s==null?void 0:s.status)==="pending",l=e.live?o("div",{class:"research"},o("button",{type:"button",class:"button button-quiet","data-fid":"research",disabled:c,"aria-busy":c?"true":"false",onclick:()=>t.research()},H("refresh-cw",16),c?"Researching…":"Research this guest again"),(s==null?void 0:s.status)==="failed"?$((S=s.message)!=null?S:"This guest couldn't refresh.","note problem"):null):o("div",{class:"research"},o("button",{type:"button",class:"button button-quiet",disabled:!0,"aria-describedby":"research-reason"},H("refresh-cw",16),"Research this guest again"),o("p",{class:"note",id:"research-reason"},"Ask in this chat to refresh this guest."));return o("aside",{class:"card panel","aria-label":`Guest: ${de(r)}`,"data-key":r.key},o("div",{class:"panel-head"},o("div",{class:"handle","aria-hidden":"true"}),o("div",{class:"panel-head-row"},o("h2",{class:"panel-name"},de(r)),o("button",{type:"button",class:"icon-button close","aria-label":"Close","data-fid":"close-sheet",onclick:()=>t.closeSheet()},H("x",20))),wr(r)),o("div",{class:"panel-body"},a,l))}const Tt=900*1e3;function qe(e){switch(e.kind){case"unavailable":return ye()==="claude"?"Loading a day needs the New Vintage connector with access to this winery. Add the connector in this chat, then try again.":"This page shows the days loaded in the chat. Ask in the chat to load another.";case"approval":return"Loading a day needs your permission to use the New Vintage connector. Allow it for this page, then try again.";case"reconnect":return ln();case"temporary":return"New Vintage didn't answer. Try again in a moment.";case"needs_update":return"This page needs an update. Ask in this chat to update it.";case"not_reconciled":return"This day didn't load completely. Try again.";case"tool":return e.message}}function Tr(e,t){var Dt,Rt,qt,Ut,Vt,Gt,jt,Ft,Zt,Bt,Ht,Yt,Kt,Wt,Jt,Qt,Xt,en,tn;const n=(Dt=t.now)!=null?Dt:(()=>new Date),r={...ge,...(Rt=t.settings)!=null?Rt:{},tagRules:{...ge.tagRules,...(Ut=(qt=t.settings)==null?void 0:qt.tagRules)!=null?Ut:{}}},a=hn(t.settings?t.settings.timeZone:ge.timeZone),s=An(r.tagRules),c=Number(r.largeParty)>0?Number(r.largeParty):ge.largeParty,l=ut(t.customize,t.cards),d=Gn(t.storage),m=()=>We(n(),a);let S=m().day,f=S,b=(Vt=t.tenantId)!=null?Vt:null,Z=(Gt=t.wineryName)!=null?Gt:null,C=null,B=null,D=!0,A=null,R=null,te=!1,P=0;const Y=new Map,q=new Set,I=new Map;let K=null,_=null,U=!1;const h=new Map;let N=null,T={open:!1,month:f.slice(0,7),focus:f},V=null,Ue=null,Se=null,fe=!1;const Nt=new Map;e.innerHTML="";const $r=[(Zt=(Ft=(jt=t.customize)==null?void 0:jt.fonts)==null?void 0:Ft.display)!=null?Zt:"Newsreader",(Yt=(Ht=(Bt=t.customize)==null?void 0:Bt.fonts)==null?void 0:Ht.body)!=null?Yt:"Be Vietnam Pro"],$t=o("link",{rel:"stylesheet",href:Yn($r.filter(i=>/^[A-Za-z0-9 ]{1,40}$/.test(i)))}),Ve={};(Wt=(Kt=t.customize)==null?void 0:Kt.fonts)!=null&&Wt.display&&(Ve["font-display"]=`'${t.customize.fonts.display}', Georgia, serif`),(Qt=(Jt=t.customize)==null?void 0:Jt.fonts)!=null&&Qt.body&&(Ve["font-body"]=`'${t.customize.fonts.body}', system-ui, sans-serif`);const At=o("style",null,Kn({...Ve,...(en=(Xt=t.customize)==null?void 0:Xt.theme)!=null?en:{}},(tn=t.customize)==null?void 0:tn.themeDark)+Wn);document.head.append($t,At);const G=o("div",{class:"nvgp"});e.append(G);const _t=()=>Ct();window.addEventListener("resize",_t);const Mt=i=>{i.key==="Escape"&&(T.open?ne.closeCalendar():U&&ne.closeSheet())},Et=i=>{var p;if(!T.open)return;const u=i.target;(p=u==null?void 0:u.closest)!=null&&p.call(u,".day-wrap")||(T={...T,open:!1},x())};document.addEventListener("keydown",Mt),document.addEventListener("mousedown",Et);function Ct(){const i=G.querySelector(".daybar");i&&G.style.setProperty("--daybar-h",`${i.offsetHeight}px`);const u=G.querySelector(".summary");G.style.setProperty("--summary-h",`${u?u.offsetHeight+16:0}px`)}const W=()=>!!(B&&A&&b);function Ar(i){var p,g;const u=(p=t.days)==null?void 0:p[i];return u&&Array.isArray(u.arrivals)?{rows:u.arrivals,loadedAt:String((g=u.loadedAt)!=null?g:""),live:!1}:null}function Ge(i){var u;return(u=Y.get(i))!=null?u:Ar(i)}function Lt(){if(!b)return D?{status:"loading"}:{status:"choose",message:K};const i=Ge(f);if(i)return{status:"ready",arrivals:Cn(i.rows,{day:f,today:S,largeParty:c,rules:s}),rows:i.rows,loadedAt:i.loadedAt,live:i.live};if(D||q.has(f))return{status:"loading"};const u=I.get(f);return u?{status:"failed",message:u}:W()?{status:"loading"}:{status:"unloaded"}}function _r(i,u){var g,y;const{upcoming:p}=Pe(i,Le(f,S),u);return(y=(g=p[0])!=null?g:i[0])!=null?y:null}function Mr(i){const u=I.get(f);if(i&&u)return{text:u,problem:!0};if(!i)return null;if(q.has(f))return{text:"Checking for changes",problem:!1};if(i.live)return{text:"Up to date",problem:!1};const p=new Date(i.loadedAt);if(Number.isNaN(p.getTime()))return{text:"Loaded in the chat",problem:!1};const g=We(p,a);return{text:`Loaded in the chat ${ue(g.day,g.minutes,S)}`,problem:!1}}function Te(){var y,k,w,re;const i=m(),u=Lt(),p=u.status==="ready"?u.arrivals:[],g=(y=p.find(J=>J.key===_))!=null?y:_r(p,i.minutes);return{options:t,title:((w=(k=t.customize)==null?void 0:k.title)==null?void 0:w.trim())||(Z?`${Z} Guest Prep`:"Guest Prep"),timeZone:a,today:S,nowMinutes:i.minutes,day:f,kind:Le(f,S),live:W(),dayState:u,selected:g,sheetOpen:U,request:(re=h.get(f))!=null?re:null,research:N,calendar:T,dayNote:Mr(b?Ge(f):null),wineries:C,tenantId:b,storageNote:d.mode==="none"?"Changes won't be saved in this browser.":null}}const Er=()=>typeof window.matchMedia=="function"&&window.matchMedia("(max-width: 900px)").matches,ne={toggleCalendar:()=>{T=T.open?{...T,open:!1}:{open:!0,month:f.slice(0,7),focus:f},V=T.open?"cal-focus":"day-button",x()},closeCalendar:()=>{T={...T,open:!1},V="day-button",x()},pickDay:i=>{T={open:!1,month:i.slice(0,7),focus:i},V="day-button",i!==f&&(f=i,_=null,U=!1,N=null,Pt()),x();const u=Y.get(f);W()&&(!u||Date.parse(u.loadedAt)<n().getTime()-Tt)&&se()},focusDay:i=>{T={...T,focus:i,month:i.slice(0,7)},V="cal-focus",x()},showMonth:i=>{var g;const p=(g=[Number(T.focus.slice(8,10)),30,29,28].map(y=>`${i}-${String(y).padStart(2,"0")}`).find(Je))!=null?g:`${i}-01`;T={open:!0,month:i,focus:p},x()},select:i=>{_=i,U=!0,Er()&&(V="close-sheet"),Pt(),x()},closeSheet:()=>{U=!1,V=_?`row-${_}`:null,x()},retry:()=>void(b?se():zt()),requestDay:()=>void Ir(),research:()=>void Pr(),chooseWinery:i=>void zr(i)};async function Pt(){b&&await ft(d.adapter,pt(b),JSON.stringify({day:f,guest:_,savedOn:S}))}async function It(){if(!b)return;const i=jn(await gt(d.adapter,pt(b)));!i||i.savedOn!==S||!Je(i.day)||(f=i.day,_=i.guest,T={open:!1,month:f.slice(0,7),focus:f})}function Cr(i){var p,g;const u=Te();return{day:f,timeZone:a,live:W(),arrivals:u.dayState.status==="ready"?u.dayState.rows:null,selected:(g=(p=u.selected)==null?void 0:p.row)!=null?g:null,ui:{h:o,money:z,note:y=>$(y),fact:(y,k,w)=>v(y,k,w),chips:ke},runSql:async y=>{if(!A||!W())throw new Error(`${i.title} needs the New Vintage connector.`);const k=await rt(A,y,"Loading a custom card on the Guest Prep page.");if(!k.complete)throw new Error("New Vintage returned only a preview for this card.");return k.rows}}}function Lr(i){const u=Lt(),p=[f,_!=null?_:"",u.status,u.status==="ready"?u.loadedAt+u.rows.length:""].join("|"),g=Nt.get(i.id);if(g&&g.signature===p)return g.element;const y=o("div",null,$("Loading…")),k=o("section",{class:"card custom-card","data-card":i.id},o("h2",null,i.title),o("p",{class:"card-purpose"},i.purpose),y);return Nt.set(i.id,{signature:p,element:k}),Promise.resolve().then(()=>i.render(Cr(i))).then(w=>y.replaceChildren(w==null?$("Nothing to show yet."):typeof w=="string"?$(w):w)).catch(w=>y.replaceChildren($(`This card couldn't load: ${w instanceof Error?w.message:String(w)}`,"note problem"))),k}function je(i){var p;return((p=t.cards)!=null?p:[]).filter(g=>i===null?!g.after||!(g.after==="summary"||ht.includes(g.after)):g.after===i).map(Lr)}function x(){var w,re,J,me,j,he,nn;if(fe)return;const i=(J=V!=null?V:(re=(w=document.activeElement)==null?void 0:w.getAttribute)==null?void 0:re.call(w,"data-fid"))!=null?J:null;V=null;const u=G.querySelector(".panel"),p=u?{key:u.getAttribute("data-key"),top:(j=(me=u.querySelector(".panel-body"))==null?void 0:me.scrollTop)!=null?j:0}:null,g=Te(),y=Sr(g,ne,oe=>je(oe)),k=o("div",{class:`page${U&&y?" sheet-open":""}`},ur(g,ne),g.storageNote?$(g.storageNote,"storage-note"):null,dr(g,ne),pr(g),g.dayState.status==="ready"?je("summary"):null,o("div",{class:"layout"},o("div",{style:"min-width:0"},yr(g,ne),je(null)),y),U&&y?o("div",{class:"backdrop","aria-hidden":"true",onclick:()=>ne.closeSheet()}):null);if(G.replaceChildren(k),p&&p.key===((he=g.selected)==null?void 0:he.key)){const oe=G.querySelector(".panel-body");oe&&(oe.scrollTop=p.top)}i&&((nn=Array.from(G.querySelectorAll("[data-fid]")).find(oe=>oe.getAttribute("data-fid")===i))==null||nn.focus()),Ct()}async function se(i=f){if(!A||!b||fe)return;const u=P;if(!Ne.includes(a)){I.set(i,`Guest Prep can't load days in the ${a} time zone yet. Ask in this chat to set the winery's time zone.`),x();return}q.add(i),I.delete(i),x();try{R||(R=await nt(A,te?null:l),te=!0);const p=await at(A,R,{timeZone:a,day:i});if(u!==P)return;Y.set(i,{rows:p,loadedAt:n().toISOString(),live:!0})}catch(p){if(u!==P)return;I.set(i,qe(ie(p)))}finally{u===P&&q.delete(i),x()}}async function Pr(){const i=Te().selected;if(!i||!A||!b||(N==null?void 0:N.status)==="pending")return;const u=f,p=P;N={key:i.key,status:"pending"},x();try{R||(R=await nt(A,te?null:l),te=!0);const g=i.id.replace(/[^A-Za-z0-9-]/g,""),y=await at(A,R,{timeZone:a,day:u,arrival:{source:i.source,id:g}});if(p!==P)return;const k=Ge(u);if(k){const w=j=>{var he;return`${j.source==="tock"?"tock":"commerce7"}:${String((he=j.arr_id)!=null?he:"")}`},re=y.filter(j=>w(j)===i.key),J=[];let me=!1;for(const j of k.rows)w(j)!==i.key?J.push(j):me||(J.push(...re),me=!0);Y.set(u,{rows:J,loadedAt:k.loadedAt,live:k.live})}N=null}catch(g){if(p!==P)return;N={key:i.key,status:"failed",message:qe(ie(g))}}x()}async function Ir(){var p;if(!b||((p=h.get(f))==null?void 0:p.kind)==="pending")return;const i=f;h.set(i,{kind:"pending"}),x();const u=await cn(Rn({day:i,wineryName:Z,tenantId:b,timeZone:a}),{title:Dn,followUp:t.followUp});h.set(i,u),x()}async function zr(i){var u,p;!B||!i||i===b||(P+=1,b=i,Z=(p=(u=C==null?void 0:C.find(g=>g.tenantId===i))==null?void 0:u.name)!=null?p:Z,A=Ee(B,i),Y.clear(),I.clear(),q.clear(),_=null,N=null,await ft(d.adapter,dt,i),x(),await se())}async function zt(){var u,p,g;D=!0,K=null,x();const i=t.tenantId?null:await gt(d.adapter,dt);if(B=(u=t.callTool)!=null?u:await sn(t.connectorName),!fe){if(!B){D=!1,b||(K=ye()==="claude"?"Picking a winery needs the New Vintage connector. Add it in this chat, then reload the page.":"Ask in the chat which winery this page is for."),await It(),x();return}if(!b){try{C=await Sn(Ee(B,null))}catch(k){D=!1,K=qe(ie(k)),x();return}const y=(p=C.find(k=>k.tenantId===i))!=null?p:C.length===1?C[0]:null;if(!y){D=!1,K=C.length?null:"The New Vintage connector can't reach any winery for this account.",x();return}b=y.tenantId,Z=(g=t.wineryName)!=null?g:y.name}A=Ee(B,b),await It(),D=!1,await se(),!fe&&!Se&&(Se=setInterval(()=>void(W()&&!q.has(f)?se():void 0),Tt))}}function Ot(){const i=6e4-n().getTime()%6e4+50;Ue=setTimeout(()=>{S=m().day,x(),Ot()},i)}return x(),Ot(),zt(),{refresh:()=>W()?se():Promise.resolve(),destroy:()=>{fe=!0,Ue&&clearTimeout(Ue),Se&&clearInterval(Se),window.removeEventListener("resize",_t),document.removeEventListener("keydown",Mt),document.removeEventListener("mousedown",Et),At.remove(),$t.remove(),G.remove()},state:()=>{var u,p;const i=Te();return{day:f,tenantId:b,live:W(),selected:(p=(u=i.selected)==null?void 0:u.key)!=null?p:null,status:i.dayState.status}}}}function Nr(e,t){const n=typeof e=="string"?document.querySelector(e):e;if(!n)throw new Error(`NVGuestPrep: no element matches ${String(e)}`);return Tr(n,t)}return F.DEFAULT_SETTINGS=ge,F.SECTION_IDS=Qn,F.SUPPORTED_TIME_ZONES=Ne,F.VERSION=ct,F.fillGuestPrepQuery=Ke,F.mount=Nr,F.pageSetup=ut,Object.defineProperty(F,Symbol.toStringTag,{value:"Module"}),F})({});
158
+ `,Xn=["summary","guestList"],yt=["reservation","talkAbout","newVintageProfile","relationship","headsUp","personalNotes"],er=[...Xn,...yt],fe={timeZone:"America/Los_Angeles",largeParty:10,tagRules:{interests:["^(?:client\\s+)?interest(?:ed)?(?:\\s+in)?\\s*[-–—:]\\s*(.+)$"],vip:["\\bvip\\b"],club:["(?:member|membership|club)"],hide:["^\\*+\\s*test\\s*\\*+$","^test\\b"]}};function o(e,t=null,...n){const r=document.createElement(e);for(const[a,s]of Object.entries(t!=null?t:{}))s==null||s===!1||(typeof s=="function"?r.addEventListener(a.replace(/^on/,"").toLowerCase(),s):s===!0?r.setAttribute(a,""):r.setAttribute(a,String(s)));return bt(r,n),r}function bt(e,t){for(const n of t)n==null||n===!1||(Array.isArray(n)?bt(e,n):e.append(n instanceof Node?n:String(n)))}const tr="http://www.w3.org/2000/svg";function vt(e,t={},...n){const r=document.createElementNS(tr,e);for(const[a,s]of Object.entries(t))r.setAttribute(a,String(s));return r.append(...n),r}const nr={"chevron-left":["M15 18l-6-6 6-6"],"chevron-right":["M9 18l6-6-6-6"],"chevron-down":["M6 9l6 6 6-6"],calendar:["M8 2v4","M16 2v4","M5 4h14a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2z","M3 10h18"],"message-circle":["M7.9 20A9 9 0 1 0 4 16.1L2 22z"],heart:["M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7z"],"triangle-alert":["M21.73 18l-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3z","M12 9v4","M12 17h.01"],"sticky-note":["M16 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V8z","M15 3v4a2 2 0 0 0 2 2h4"],wine:["M8 22h8","M7 10h10","M12 15v7","M12 15a5 5 0 0 0 5-5c0-2-.5-4-2-8H9c-1.5 4-2 6-2 8a5 5 0 0 0 5 5z"],x:["M18 6L6 18","M6 6l12 12"],"refresh-cw":["M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8","M21 3v5h-5","M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16","M8 16H3v5"]};function H(e,t=16){var n;return vt("svg",{width:t,height:t,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":2,"stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true"},...((n=nr[e])!=null?n:[]).map(r=>vt("path",{d:r})))}function N(e,t="note"){return o("p",{class:t},e)}function x(e,t,n,r=""){return o("div",{class:`fact${r?` ${r}`:""}`},o("div",{class:"fact-label"},e),o("div",{class:"fact-value"},t),n?o("div",{class:"fact-detail"},n):null)}function Se(e,t="neutral"){return o("div",{class:"chips"},e.map(n=>o("span",{class:`chip chip-${t}`},n)))}function xt(e){return o("span",{class:`badge${e==="VIP"?" badge-vip":""}`},e)}function wt(e){return Number(L(`${ve(e,1)}-01`,-1).slice(8,10))}function kt(e,t){const n=ve(e.slice(0,7),t);return`${n}-${String(Math.min(Number(e.slice(8,10)),wt(n))).padStart(2,"0")}`}function rr(e){const t=`${e}-01`,n=Array.from({length:ue(t)},()=>null);for(let r=0;r<wt(e);r+=1)n.push(L(t,r));return n}function ar(e,t){switch(t){case"ArrowLeft":return L(e,-1);case"ArrowRight":return L(e,1);case"ArrowUp":return L(e,-7);case"ArrowDown":return L(e,7);case"PageUp":return kt(e,-1);case"PageDown":return kt(e,1);case"Home":return L(e,-ue(e));case"End":return L(e,6-ue(e));default:return null}}function sr(e){const{state:t}=e,n=rr(t.month).map((s,c)=>{if(!s)return o("span",{"aria-hidden":"true","data-blank":c});const l=s===t.focus;return o("button",{type:"button",class:`cal-day${s===e.today?" is-today":""}`,"aria-label":_e(s,e.today)+(s===e.today?", today":""),"aria-selected":s===e.selected?"true":"false","aria-current":s===e.today?"date":null,tabindex:l?0:-1,"data-day":s,"data-fid":l?"cal-focus":null,onclick:()=>e.onPick(s)},String(Number(s.slice(8,10))))}),r=o("div",{class:"cal-grid",role:"group","aria-label":tt(t.month)},Ae.map(s=>o("span",{class:"cal-dow","aria-hidden":"true"},s.slice(0,2))),n);r.addEventListener("keydown",s=>{const c=s.key,l=ar(t.focus,c);l&&(s.preventDefault(),e.onFocus(l))});const a=o("div",{class:"calendar",role:"dialog","aria-label":"Choose a day"},o("div",{class:"cal-head"},o("button",{type:"button",class:"icon-button","aria-label":"Previous month",onclick:()=>e.onMonth(ve(t.month,-1))},H("chevron-left")),o("span",{class:"cal-title","aria-live":"polite"},tt(t.month)),o("button",{type:"button",class:"icon-button","aria-label":"Next month",onclick:()=>e.onMonth(ve(t.month,1))},H("chevron-right"))),r);return a.addEventListener("keydown",s=>{s.key==="Escape"&&(s.preventDefault(),s.stopPropagation(),e.onClose())}),a}const or="https://newvintage.ai/?utm_source=guest-prep&utm_medium=referral&utm_campaign=guest-prep&utm_content=season-bar-logo",ir={summary:"Summary",guestList:"Everyone coming in",reservation:"Reservation",talkAbout:"Talk about",newVintageProfile:"New Vintage profile",relationship:"Relationship",headsUp:"Heads-up",personalNotes:"Personal notes"},lr={reservation:"calendar",talkAbout:"message-circle",newVintageProfile:"wine",relationship:"heart",headsUp:"triangle-alert",personalNotes:"sticky-note"},St={newVintageProfile:"From New Vintage's analysis of their wine purchases."};function Re(e,t){var r,a;const n=(a=(r=e.options.customize)==null?void 0:r.labels)==null?void 0:a[t];return typeof n=="string"&&n.trim()?n.trim():ir[t]}function Ve(e,t){var n,r;return((r=(n=e.options.customize)==null?void 0:n.hide)!=null?r:[]).includes(t)}const cr=()=>be()==="claude";function ur(e){const t=e.dayState;let n="idle",r,a=null;return t.status==="choose"?r="Choose a winery to load reservations":t.status==="loading"?r="Loading reservations":t.status==="unloaded"?r="This day isn't loaded yet":t.status==="failed"?(n="problem",r="This day couldn't load"):t.arrivals.length?(n="loaded",r="Commerce7 reservations and Tock orders",a="Commerce7 and Tock"):r="No arrivals on this day",o("div",{class:`status status-${n}`,role:"status","aria-live":"polite"},o("span",{class:"dot","aria-hidden":"true"}),a?[o("span",{class:"status-long"},r),o("span",{class:"status-short","aria-hidden":"true"},a)]:o("span",null,r))}function dr(e,t){if(!e.wineries||e.wineries.length<2)return null;const n=o("select",{id:"winery-picker","data-fid":"winery-picker",onchange:r=>t.chooseWinery(r.target.value)},o("option",{value:"",disabled:!0,selected:!e.tenantId},"Choose a winery"),e.wineries.map(r=>o("option",{value:r.tenantId,selected:r.tenantId===e.tenantId},r.name)));return o("label",{class:"picker",for:"winery-picker"},"Winery",n)}function pr(e,t){return o("header",{class:"header"},o("a",{class:"logo",href:or,target:"_blank",rel:"noopener","aria-label":"New Vintage"},o("span",{class:"logo-mark","aria-hidden":"true"},"New Vintage")),o("div",{class:"heading"},o("h1",null,e.title),ur(e),dr(e,t)))}function gr(e,t){const n=e.day===e.today?"Today":e.day===L(e.today,1)?"Tomorrow":null,r=o("button",{type:"button",class:"day-button","data-fid":"day-button","aria-haspopup":"dialog","aria-expanded":e.calendar.open?"true":"false",onclick:()=>t.toggleCalendar()},H("calendar",18),o("span",{class:"day-label"},_e(e.day,e.today)),n?o("span",{class:"day-relative"},n):null,H("chevron-down",16)),a=e.calendar.open?sr({state:e.calendar,selected:e.day,today:e.today,onPick:t.pickDay,onFocus:t.focusDay,onMonth:t.showMonth,onClose:t.closeCalendar}):null;return o("div",{class:"daybar"},o("div",{class:"day-wrap"},r,a),e.dayNote?o("span",{class:`day-note${e.dayNote.problem?" problem":""}`,"aria-live":"polite"},e.dayNote.text):null)}function fr(e){if(e.dayState.status!=="ready"||Ve(e,"summary"))return null;const t=Dn(e.dayState.arrivals,e.day,e.today,e.nowMinutes),n=(r,a,s)=>o("div",{class:"number"},o("div",{class:"number-value"},String(r)),o("div",{class:"number-label"},r===1?a:s));return o("section",{class:"card summary","data-section":"summary","aria-label":Re(e,"summary")},o("div",{class:"numbers"},n(t.reservations,"Reservation","Reservations"),n(t.guests,"Guest","Guests")),o("div",{class:"facts"},t.message?o("div",{class:"summary-message"},t.message):t.facts.map(r=>x(r.label,r.value,r.detail,r.label==="Next arrival"?"fact-countdown":""))),x("Now",ae(e.nowMinutes),ee(e.today,e.today),"now"))}function mr(e){const t=[];return e.vip&&t.push("VIP"),e.clubMember&&t.push("Club member"),e.prospect&&t.push("Club prospect"),e.atRisk&&t.push("Membership at risk"),e.visit==="first"&&t.push("First visit"),t.map(xt)}function Tt(e,t,n,r,a){var l;const s=a?null:In(n,e.kind,e.nowMinutes),c=[n.experience,r?Oe[n.source]:null].filter(Boolean).join(", ");return o("li",null,o("button",{type:"button",class:`row${a?" row-earlier":""}`,"data-key":n.key,"data-fid":`row-${n.key}`,"aria-current":((l=e.selected)==null?void 0:l.key)===n.key?"true":"false",onclick:()=>t.select(n.key)},o("span",{class:"row-when"},o("span",{class:"row-time"},ae(n.minutes)),o("span",{class:"row-date",style:"display:block"},ee(e.day,e.today)),s?o("span",{class:"row-soon soon",style:"display:block"},s):null),o("span",{style:"min-width:0"},o("span",{class:"row-name"},o("span",null,pe(n)),mr(n)),c?o("span",{class:"row-experience",style:"display:block"},c):null),o("span",{class:"row-party"},P(n.party,"guest"))))}function hr(){return o("div",{"aria-hidden":"true"},[0,1,2,3].map(()=>o("div",{class:"skeleton-row"},o("span",{class:"skel",style:"flex:0 0 72px"}),o("span",{class:"skel",style:"flex:2"}),o("span",{class:"skel",style:"flex:0 0 56px"}))))}function yr(e){const t=e.request,n=_e(e.day,e.today);return(t==null?void 0:t.kind)==="sent"?N(`Request sent. You may need to finish sending it in the chat. The briefing updates after the assistant loads ${n}.`):(t==null?void 0:t.kind)==="copied"?N(`Request copied. Paste it into this chat to load ${n}.`):(t==null?void 0:t.kind)==="manual"?o("div",null,N(`Copy this request into the chat to load ${n}.`),o("textarea",{class:"request-text",readonly:!0,rows:6,"aria-label":"Request to copy",onfocus:r=>r.target.select()},t.text)):(t==null?void 0:t.kind)==="failed"?N(`The request wasn't sent. ${t.message}`,"note problem"):null}function br(e,t){var a;const n=((a=e.request)==null?void 0:a.kind)==="pending",r=cr()?"This page holds the days loaded in this chat. Load this day asks the chat for it, or open the page where the New Vintage connector can run to load any day.":"This page holds the days loaded in this chat. Load this day asks the chat for it.";return o("div",{class:"empty"},o("p",{class:"empty-title"},"This day isn't loaded yet"),N(r),o("div",{class:"actions"},o("button",{type:"button",class:"button","data-fid":"load-day",disabled:n,"aria-busy":n?"true":"false",onclick:()=>t.requestDay()},n?"Sending…":"Load this day")),yr(e))}function vr(e,t){if(Ve(e,"guestList"))return null;const n=e.dayState,r=Re(e,"guestList");let a=null,s;if(n.status==="loading")s=hr();else if(n.status==="choose")s=o("div",{class:"empty"},o("p",{class:"empty-title"},"Choose a winery"),n.message?N(n.message):null);else if(n.status==="unloaded")s=br(e,t);else if(n.status==="failed")s=o("div",{class:"empty"},o("p",{class:"empty-title"},"This day couldn't load"),N(n.message,"note problem"),o("div",{class:"actions"},o("button",{type:"button",class:"button","data-fid":"retry",onclick:()=>t.retry()},"Try again")));else if(!n.arrivals.length)s=o("div",{class:"empty"},o("p",{class:"empty-title"},"No one is coming in on this day."));else{const c=Rn(n.arrivals);c&&(a=`All from ${Oe[c]}`);const{upcoming:l,earlier:d}=Ie(n.arrivals,e.kind,e.nowMinutes);s=o("ul",{class:"rows"},l.map(h=>Tt(e,t,h,!c,!1)),d.length?o("li",{class:"earlier-head"},"Earlier today",o("span",{class:"count","aria-label":P(d.length,"reservation")},String(d.length))):null,d.map(h=>Tt(e,t,h,!c,!0)))}return o("section",{class:"card list-card","data-section":"guestList","aria-busy":n.status==="loading"?"true":"false"},o("div",{class:"card-head"},o("h2",null,r),a?o("span",{class:"card-aside"},a):null),s)}function xr(e){return e.map(t=>o("p",{class:"soft"},t.text,t.when?o("span",{class:"soft-when"},t.when):null))}function wr(e){const t=e.bought;return t?t.items.length?o("ul",{class:"bought"},t.items.map(n=>o("li",null,o("span",null,n.title),o("span",{class:"qty"},`× ${n.qty}`))),t.total!==null?o("li",{class:"total"},o("span",null,"Total"),o("span",null,I(t.total))):null):o("p",{class:"visit-muted"},"Nothing beyond the tasting"):null}function kr(e,t){const n=t.lastTaste,r=[];if(n){const c=n.day?`${et(n.day,e.today)}, ${xn(n.day,e.today)}`:null;r.push(o("div",{class:"visit-part visit-taste"},o("p",{class:"visit-title"},n.title),c?o("p",{class:"visit-muted"},c):null))}const a=wr(t);if(a&&r.push(o("div",{class:"visit-part visit-bought"},a)),t.orderNotes.length&&r.push(o("div",{class:"visit-part visit-notes"},t.orderNotes.map(c=>o("p",{class:"visit-note"},c)))),!r.length)return null;const s=r.flatMap((c,l)=>l?[o("hr",{class:"visit-divider"}),c]:[c]);return o("div",{class:"fact fact-visit"},o("div",{class:"fact-label"},"Last visit"),o("div",{class:"visit"},s))}function Sr(e){const{floor:t,ceiling:n}=e;return t!==null&&n!==null?t===n?I(t):`${I(t)} to ${I(n)}`:t!==null?`From ${I(t)}`:n!==null?`Up to ${I(n)}`:e.avg!==null?I(e.avg):null}function Tr(e,t,n){var s,c;const r=[],a=l=>{l&&r.push(l)};switch(n){case"reservation":{const l=e.kind==="today"&&t.minutes>=e.nowMinutes;r.push(o("div",{class:"fact-row"},x("Arrives",de(e.day,t.minutes,e.today),l?Me(t.minutes-e.nowMinutes):null,l?"fact-countdown":""),x("Party",P(t.party,"guest")),x("Booked via",Oe[t.source]))),a(t.experience?x("Experience",t.experience):null);break}case"talkAbout":{a(t.occasions.length?x("Occasion",t.occasions.map((l,d)=>o("div",{"data-line":d},l))):null),a(t.interests.length?x("Interested in",Se(t.interests)):null),a(kr(e,t));break}case"newVintageProfile":{const l=t.price?Sr(t.price):null,d=[l?x("Usual bottle price",l,((s=t.price)==null?void 0:s.avg)!==null&&((c=t.price)==null?void 0:c.avg)!==void 0?`Average ${I(t.price.avg)}`:null):null,t.wineTypes.length?x("Wine types",t.wineTypes.join(", ")):null,t.varietals.length?x("Favorite varietals",t.varietals.join(", ")):null,t.vintages.length?x("Vintages",t.vintages.join(", ")):null,t.appellations.length?x("Appellations",t.appellations.join(", ")):null].filter(h=>h!==null);d.length&&r.push(o("div",{class:"fact-grid"},d));break}case"relationship":a(t.since?x("Customer since",t.since):null),a(t.lifetime?x("Lifetime spend",I(t.lifetime.spend),t.lifetime.orders!==null?P(t.lifetime.orders,"order"):null):null),a(t.clubTitles?x("Club",t.clubTitles):null),a(t.clubPickup?x("Club pickup","Shipment ready to hand over"):null),a(t.prospect&&t.signupTier?x("Likely to join the club",nt(t.signupTier)):null),a(t.atRisk&&t.churnTier?x("Membership at risk",nt(t.churnTier)):null),a(t.clubTags.length?x("Club tags",Se(t.clubTags)):null);break;case"headsUp":a(t.accountTags.length?x("Account tags",Se(t.accountTags,"warning")):null);break;case"personalNotes":r.push(...xr(t.personalNotes.map(l=>({text:l.content,when:l.when}))));break}return r}function Nr(e){const t=[];return e.vip&&t.push("VIP"),t.push(e.visit==="first"?"First visit":e.visit==="return"?"Returning guest":"Visit history unknown"),e.clubMember&&t.push("Club member"),e.prospect&&t.push("Club prospect"),e.atRisk&&t.push("Membership at risk"),o("div",{class:"chips"},t.map(xt))}const $r=["reservation","talkAbout","newVintageProfile","relationship","headsUp","personalNotes"];function Ar(e,t,n){var d,h,T;const r=e.selected;if(!r||e.dayState.status!=="ready")return null;const a=[];for(const m of $r){if(!Ve(e,m)){const b=Tr(e,r,m);b.length&&a.push(o("section",{class:"psec","data-section":m},o("h3",{class:"psec-title"},o("span",{class:`tile${m==="headsUp"?" tile-warning":""}`},H((d=lr[m])!=null?d:"",16)),Re(e,m)),St[m]?o("p",{class:"psec-source"},St[m]):null,o("div",{class:"psec-facts"},b)))}a.push(...n(m))}const s=((h=e.research)==null?void 0:h.key)===r.key?e.research:null,c=(s==null?void 0:s.status)==="pending",l=e.live?o("div",{class:"research"},o("button",{type:"button",class:"button button-quiet","data-fid":"research",disabled:c,"aria-busy":c?"true":"false",onclick:()=>t.research()},H("refresh-cw",16),c?"Researching…":"Research this guest again"),(s==null?void 0:s.status)==="failed"?N((T=s.message)!=null?T:"This guest couldn't refresh.","note problem"):null):o("div",{class:"research"},o("button",{type:"button",class:"button button-quiet",disabled:!0,"aria-describedby":"research-reason"},H("refresh-cw",16),"Research this guest again"),o("p",{class:"note",id:"research-reason"},"Ask in this chat to refresh this guest."));return o("aside",{class:"card panel","aria-label":`Guest: ${pe(r)}`,"data-key":r.key},o("div",{class:"panel-head"},o("div",{class:"handle","aria-hidden":"true"}),o("div",{class:"panel-head-row"},o("h2",{class:"panel-name"},pe(r)),o("button",{type:"button",class:"icon-button close","aria-label":"Close","data-fid":"close-sheet",onclick:()=>t.closeSheet()},H("x",20))),Nr(r)),o("div",{class:"panel-body"},a,l))}const Nt=900*1e3;function qe(e){switch(e.kind){case"unavailable":return be()==="claude"?"Loading a day needs the New Vintage connector with access to this winery. Add the connector in this chat, then try again.":"This page shows the days loaded in the chat. Ask in the chat to load another.";case"approval":return"Loading a day needs your permission to use the New Vintage connector. Allow it for this page, then try again.";case"reconnect":return cn();case"temporary":return"New Vintage didn't answer. Try again in a moment.";case"needs_update":return"This page needs an update. Ask in this chat to update it.";case"not_reconciled":return"This day didn't load completely. Try again.";case"tool":return e.message}}function _r(e,t){var Rt,Vt,qt,Ut,jt,Gt,Ft,Zt,Bt,Ht,Yt,Wt,Kt,Jt,Qt,Xt,en,tn,nn;const n=(Rt=t.now)!=null?Rt:(()=>new Date),r={...fe,...(Vt=t.settings)!=null?Vt:{},tagRules:{...fe.tagRules,...(Ut=(qt=t.settings)==null?void 0:qt.tagRules)!=null?Ut:{}}},a=yn(t.settings?t.settings.timeZone:fe.timeZone),s=_n(r.tagRules),c=Number(r.largeParty)>0?Number(r.largeParty):fe.largeParty,l=dt(t.customize,t.cards),d=Fn(t.storage),h=()=>Je(n(),a);let T=h().day,m=T,b=(jt=t.tenantId)!=null?jt:null,G=(Gt=t.wineryName)!=null?Gt:null,C=null,F=null,O=!0,_=null,Z=null,Y=!1,z=0;const W=new Map,B=new Set,D=new Map;let R=null,$=null,V=!1;const te=new Map;let p=null,v={open:!1,month:m.slice(0,7),focus:m},M=null,Ue=null,Te=null,me=!1;const $t=new Map;e.innerHTML="";const Er=[(Bt=(Zt=(Ft=t.customize)==null?void 0:Ft.fonts)==null?void 0:Zt.display)!=null?Bt:"Newsreader",(Wt=(Yt=(Ht=t.customize)==null?void 0:Ht.fonts)==null?void 0:Yt.body)!=null?Wt:"Be Vietnam Pro"],At=o("link",{rel:"stylesheet",href:Kn(Er.filter(i=>/^[A-Za-z0-9 ]{1,40}$/.test(i)))}),je={};(Jt=(Kt=t.customize)==null?void 0:Kt.fonts)!=null&&Jt.display&&(je["font-display"]=`'${t.customize.fonts.display}', Georgia, serif`),(Xt=(Qt=t.customize)==null?void 0:Qt.fonts)!=null&&Xt.body&&(je["font-body"]=`'${t.customize.fonts.body}', system-ui, sans-serif`);const _t=o("style",null,Jn({...je,...(tn=(en=t.customize)==null?void 0:en.theme)!=null?tn:{}},(nn=t.customize)==null?void 0:nn.themeDark)+Qn);document.head.append(At,_t);const q=o("div",{class:"nvgp"});e.append(q);const Mt=()=>Pt();window.addEventListener("resize",Mt);const Et=i=>{i.key==="Escape"&&(v.open?ne.closeCalendar():V&&ne.closeSheet())},Ct=i=>{var g;if(!v.open)return;const u=i.target;(g=u==null?void 0:u.closest)!=null&&g.call(u,".day-wrap")||(v={...v,open:!1},w())};document.addEventListener("keydown",Et),document.addEventListener("mousedown",Ct);function Pt(){const i=q.querySelector(".daybar");i&&q.style.setProperty("--daybar-h",`${i.offsetHeight}px`);const u=q.querySelector(".summary");q.style.setProperty("--summary-h",`${u?u.offsetHeight+16:0}px`)}const K=()=>!!(F&&_&&b);function Cr(i){var g,f;const u=(g=t.days)==null?void 0:g[i];return u&&Array.isArray(u.arrivals)?{rows:u.arrivals,loadedAt:String((f=u.loadedAt)!=null?f:""),live:!1}:null}function Ge(i){var u;return(u=W.get(i))!=null?u:Cr(i)}function zt(){if(!b)return O?{status:"loading"}:{status:"choose",message:R};const i=Ge(m);if(i)return{status:"ready",arrivals:zn(i.rows,{day:m,today:T,largeParty:c,rules:s}),rows:i.rows,loadedAt:i.loadedAt,live:i.live};if(O||B.has(m))return{status:"loading"};const u=D.get(m);return u?{status:"failed",message:u}:K()?{status:"loading"}:{status:"unloaded"}}function Pr(i,u){var f,y;const{upcoming:g}=Ie(i,ze(m,T),u);return(y=(f=g[0])!=null?f:i[0])!=null?y:null}function zr(i){const u=D.get(m);if(i&&u)return{text:u,problem:!0};if(!i)return null;if(B.has(m))return{text:"Checking for changes",problem:!1};if(i.live)return{text:"Up to date",problem:!1};const g=new Date(i.loadedAt);if(Number.isNaN(g.getTime()))return{text:"Loaded in the chat",problem:!1};const f=Je(g,a);return{text:`Loaded in the chat ${de(f.day,f.minutes,T)}`,problem:!1}}function Ne(){var y,S,k,re;const i=h(),u=zt(),g=u.status==="ready"?u.arrivals:[],f=(y=g.find(J=>J.key===$))!=null?y:Pr(g,i.minutes);return{options:t,title:((k=(S=t.customize)==null?void 0:S.title)==null?void 0:k.trim())||(G?`${G} Guest Prep`:"Guest Prep"),timeZone:a,today:T,nowMinutes:i.minutes,day:m,kind:ze(m,T),live:K(),dayState:u,selected:f,sheetOpen:V,request:(re=te.get(m))!=null?re:null,research:p,calendar:v,dayNote:zr(b?Ge(m):null),wineries:C,tenantId:b,storageNote:d.mode==="none"?"Changes won't be saved in this browser.":null}}const Ir=()=>typeof window.matchMedia=="function"&&window.matchMedia("(max-width: 900px)").matches,ne={toggleCalendar:()=>{v=v.open?{...v,open:!1}:{open:!0,month:m.slice(0,7),focus:m},M=v.open?"cal-focus":"day-button",w()},closeCalendar:()=>{v={...v,open:!1},M="day-button",w()},pickDay:i=>{v={open:!1,month:i.slice(0,7),focus:i},M="day-button",i!==m&&(m=i,$=null,V=!1,p=null,It()),w();const u=W.get(m);K()&&(!u||Date.parse(u.loadedAt)<n().getTime()-Nt)&&oe()},focusDay:i=>{v={...v,focus:i,month:i.slice(0,7)},M="cal-focus",w()},showMonth:i=>{var f;const g=(f=[Number(v.focus.slice(8,10)),30,29,28].map(y=>`${i}-${String(y).padStart(2,"0")}`).find(Qe))!=null?f:`${i}-01`;v={open:!0,month:i,focus:g},w()},select:i=>{$=i,V=!0,Ir()&&(M="close-sheet"),It(),w()},closeSheet:()=>{V=!1,M=$?`row-${$}`:null,w()},retry:()=>void(b?oe():Ot()),requestDay:()=>void Rr(),research:()=>void Dr(),chooseWinery:i=>void Vr(i)};async function It(){b&&await mt(d.adapter,gt(b),JSON.stringify({day:m,guest:$,savedOn:T}))}async function Lt(){if(!b)return;const i=Zn(await ft(d.adapter,gt(b)));!i||i.savedOn!==T||!Qe(i.day)||(m=i.day,$=i.guest,v={open:!1,month:m.slice(0,7),focus:m})}function Lr(i){var g,f;const u=Ne();return{day:m,timeZone:a,live:K(),arrivals:u.dayState.status==="ready"?u.dayState.rows:null,selected:(f=(g=u.selected)==null?void 0:g.row)!=null?f:null,ui:{h:o,money:I,note:y=>N(y),fact:(y,S,k)=>x(y,S,k),chips:Se},runSql:async y=>{if(!_||!K())throw new Error(`${i.title} needs the New Vintage connector.`);const S=await at(_,y,"Loading a custom card on the Guest Prep page.");if(!S.complete)throw new Error("New Vintage returned only a preview for this card.");return S.rows}}}function Or(i){const u=zt(),g=[m,$!=null?$:"",u.status,u.status==="ready"?u.loadedAt+u.rows.length:""].join("|"),f=$t.get(i.id);if(f&&f.signature===g)return f.element;const y=o("div",null,N("Loading…")),S=o("section",{class:"card custom-card","data-card":i.id},o("h2",null,i.title),o("p",{class:"card-purpose"},i.purpose),y);return $t.set(i.id,{signature:g,element:S}),Promise.resolve().then(()=>i.render(Lr(i))).then(k=>y.replaceChildren(k==null?N("Nothing to show yet."):typeof k=="string"?N(k):k)).catch(k=>y.replaceChildren(N(`This card couldn't load: ${k instanceof Error?k.message:String(k)}`,"note problem"))),S}function Fe(i){var g;return((g=t.cards)!=null?g:[]).filter(f=>i===null?!f.after||!(f.after==="summary"||yt.includes(f.after)):f.after===i).map(Or)}function w(){var k,re,J,he,U,ye,rn;if(me)return;const i=(J=M!=null?M:(re=(k=document.activeElement)==null?void 0:k.getAttribute)==null?void 0:re.call(k,"data-fid"))!=null?J:null;M=null;const u=q.querySelector(".panel"),g=u?{key:u.getAttribute("data-key"),top:(U=(he=u.querySelector(".panel-body"))==null?void 0:he.scrollTop)!=null?U:0}:null,f=Ne(),y=Ar(f,ne,ie=>Fe(ie)),S=o("div",{class:`page${V&&y?" sheet-open":""}`},pr(f,ne),f.storageNote?N(f.storageNote,"storage-note"):null,gr(f,ne),fr(f),f.dayState.status==="ready"?Fe("summary"):null,o("div",{class:"layout"},o("div",{style:"min-width:0"},vr(f,ne),Fe(null)),y),V&&y?o("div",{class:"backdrop","aria-hidden":"true",onclick:()=>ne.closeSheet()}):null);if(q.replaceChildren(S),g&&g.key===((ye=f.selected)==null?void 0:ye.key)){const ie=q.querySelector(".panel-body");ie&&(ie.scrollTop=g.top)}i&&((rn=Array.from(q.querySelectorAll("[data-fid]")).find(ie=>ie.getAttribute("data-fid")===i))==null||rn.focus()),Pt()}async function oe(i=m){if(!_||!b||me)return;const u=z;if(!$e.includes(a)){D.set(i,`Guest Prep can't load days in the ${a} time zone yet. Ask in this chat to set the winery's time zone.`),w();return}B.add(i),D.delete(i),w();try{Z||(Z=await rt(_,Y?null:l),Y=!0);const g=await st(_,Z,{timeZone:a,day:i});if(u!==z)return;W.set(i,{rows:g,loadedAt:n().toISOString(),live:!0})}catch(g){if(u!==z)return;D.set(i,qe(le(g)))}finally{u===z&&B.delete(i),w()}}async function Dr(){const i=Ne().selected;if(!i||!_||!b||(p==null?void 0:p.status)==="pending")return;const u=m,g=z;p={key:i.key,status:"pending"},w();try{Z||(Z=await rt(_,Y?null:l),Y=!0);const f=i.id.replace(/[^A-Za-z0-9-]/g,""),y=await st(_,Z,{timeZone:a,day:u,arrival:{source:i.source,id:f}});if(g!==z)return;const S=Ge(u);if(S){const k=U=>{var ye;return`${U.source==="tock"?"tock":"commerce7"}:${String((ye=U.arr_id)!=null?ye:"")}`},re=y.filter(U=>k(U)===i.key),J=[];let he=!1;for(const U of S.rows)k(U)!==i.key?J.push(U):he||(J.push(...re),he=!0);W.set(u,{rows:J,loadedAt:S.loadedAt,live:S.live})}p=null}catch(f){if(g!==z)return;p={key:i.key,status:"failed",message:qe(le(f))}}w()}async function Rr(){var g;if(!b||((g=te.get(m))==null?void 0:g.kind)==="pending")return;const i=m;te.set(i,{kind:"pending"}),w();const u=await un(qn({day:i,wineryName:G,tenantId:b,timeZone:a}),{title:Vn,followUp:t.followUp});te.set(i,u),w()}async function Vr(i){var u,g;!F||!i||i===b||(z+=1,b=i,G=(g=(u=C==null?void 0:C.find(f=>f.tenantId===i))==null?void 0:u.name)!=null?g:G,_=Ce(F,i),W.clear(),D.clear(),B.clear(),$=null,p=null,await mt(d.adapter,pt,i),w(),await oe())}async function Ot(){var u,g,f;O=!0,R=null,w();const i=t.tenantId?null:await ft(d.adapter,pt);if(F=(u=t.callTool)!=null?u:await on(t.connectorName),!me){if(!F){O=!1,b||(R=be()==="claude"?"Picking a winery needs the New Vintage connector. Add it in this chat, then reload the page.":"Ask in the chat which winery this page is for."),await Lt(),w();return}if(!b){try{C=await Tn(Ce(F,null))}catch(S){O=!1,R=qe(le(S)),w();return}const y=(g=C.find(S=>S.tenantId===i))!=null?g:C.length===1?C[0]:null;if(!y){O=!1,R=C.length?null:"The New Vintage connector can't reach any winery for this account.",w();return}b=y.tenantId,G=(f=t.wineryName)!=null?f:y.name}_=Ce(F,b),await Lt(),O=!1,await oe(),!me&&!Te&&(Te=setInterval(()=>void(K()&&!B.has(m)?oe():void 0),Nt))}}function Dt(){const i=6e4-n().getTime()%6e4+50;Ue=setTimeout(()=>{T=h().day,w(),Dt()},i)}return w(),Dt(),Ot(),{refresh:()=>K()?oe():Promise.resolve(),destroy:()=>{me=!0,Ue&&clearTimeout(Ue),Te&&clearInterval(Te),window.removeEventListener("resize",Mt),document.removeEventListener("keydown",Et),document.removeEventListener("mousedown",Ct),_t.remove(),At.remove(),q.remove()},state:()=>{var u,g;const i=Ne();return{day:m,tenantId:b,live:K(),selected:(g=(u=i.selected)==null?void 0:u.key)!=null?g:null,status:i.dayState.status}}}}function Mr(e,t){const n=typeof e=="string"?document.querySelector(e):e;if(!n)throw new Error(`NVGuestPrep: no element matches ${String(e)}`);return _r(n,t)}return j.DEFAULT_SETTINGS=fe,j.SECTION_IDS=er,j.SUPPORTED_TIME_ZONES=$e,j.VERSION=ut,j.fillGuestPrepQuery=Ke,j.mount=Mr,j.pageSetup=dt,Object.defineProperty(j,Symbol.toStringTag,{value:"Module"}),j})({});