PageSourceSearch

https://antler.digital/_next/static/chunks/pages/booking-agent-41768919b969c369.js

js antler.digital collected 2026-10-06 06:10:28 UTC 44,962 bytes, 1 lines download raw bytes

1(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[615],{88496:function(t,s,c){(window.__NEXT_P=window.__NEXT_P||[]).push(["/booking-agent",function(){return c(35698)}])},57550:function(t,s,c){"use strict";var u=c(85893),d=c(18834),p=c(25675),f=c.n(p),y=c(70478),x=c(79742),b=c(5988),k=c(6014);s.Z=()=>(0,u.jsx)("div",{className:"py-12 md:py-24 relative z-10",children:(0,u.jsxs)("div",{className:"flex items-center justify-between max-w-screen-lg px-4 md:px-12 mx-auto",children:[(0,u.jsx)(d.m.div,{className:"relative w-[40%] min-h-[500px] hidden md:flex",initial:{y:50,opacity:0},whileInView:{y:0,opacity:1},viewport:{once:!0,margin:"-10% 0%"},transition:{type:"tween",delay:.2},children:(0,u.jsx)(f(),{src:x.Z,fill:!0,alt:"Yellow building illustration representing growth and partnership",className:"object-contain"})}),(0,u.jsxs)("div",{className:"md:max-w-[52%] space-y-8 text-left",children:[(0,u.jsx)(d.m.h2,{className:"".concat(y.ptSerif.variable," font-serif text-3xl md:text-5xl"),initial:{y:50,opacity:0},whileInView:{y:0,opacity:1},viewport:{once:!0,margin:"-10% 0%"},transition:{type:"tween",delay:.2},children:"Lets grow your business together"}),(0,u.jsxs)("div",{className:"space-y-4",children:[(0,u.jsx)(d.m.p,{initial:{y:50,opacity:0},whileInView:{y:0,opacity:1},viewport:{once:!0,margin:"-10% 0%"},transition:{type:"tween",delay:.2},children:"At Antler Digital, we believe that collaboration and communication are the keys to a successful partnership. Our small, dedicated team is passionate about designing and building web applications that exceed our clients' expectations. We take pride in our ability to create modern, scalable solutions that help businesses of all sizes achieve their digital goals."}),(0,u.jsx)(d.m.p,{initial:{y:50,opacity:0},whileInView:{y:0,opacity:1},viewport:{once:!0,margin:"-10% 0%"},transition:{type:"tween",delay:.2},children:"If you're looking for a partner who will work closely with you to develop a customized web application that meets your unique needs, look no further. From handling the project directly, to fitting in with an existing team, we're here to help."}),(0,u.jsx)(b.Z,{className:"mt-4",initial:{y:50,opacity:0},whileInView:{y:0,opacity:1},viewport:{once:!0,margin:"-10% 0%"},transition:{type:"tween",delay:.2},onClick:()=>{(0,k.T)(19277114),window.open("https://calendly.com/antler-digital/15min","_blank","noopener,noreferrer")},children:"BOOK A DISCOVERY CALL TODAY"})]})]})]})})},96755:function(t,s,c){"use strict";c.d(s,{Z:function(){return AnimatedGridPattern}});var u=c(85893),d=c(88805),p=c(67294),f=c(68990);function AnimatedGridPattern(t){let{width:s=40,height:c=40,x:y=-1,y:x=-1,strokeDasharray:b=0,numSquares:k=50,className:_,maxOpacity:S=.5,duration:C=4,repeatDelay:A=.5,...I}=t,M=(0,p.useId)(),j=(0,p.useRef)(null),[D,F]=(0,p.useState)({width:0,height:0}),[E,N]=(0,p.useState)(()=>generateSquares(k));function getPos(){return[Math.floor(Math.random()*D.width/s),Math.floor(Math.random()*D.height/c)]}function generateSquares(t){return Array.from({length:t},(t,s)=>({id:s,pos:getPos()}))}let updateSquarePosition=t=>{N(s=>s.map(s=>s.id===t?{...s,pos:getPos()}:s))};return(0,p.useEffect)(()=>{D.width&&D.height&&N(generateSquares(k))},[D,k]),(0,p.useEffect)(()=>{let t=new ResizeObserver(t=>{for(let s of t)F({width:s.contentRect.width,height:s.contentRect.height})});return j.current&&t.observe(j.current),()=>{j.current&&t.unobserve(j.current)}},[j]),(0,u.jsxs)("svg",{ref:j,"aria-hidden":"true",className:(0,f.cn)("pointer-events-none absolute inset-0 h-full w-full fill-gray-400/30 stroke-gray-400/30",_),...I,children:[(0,u.jsx)("defs",{children:(0,u.jsx)("pattern",{id:M,width:s,height:c,patternUnits:"userSpaceOnUse",x:y,y:x,children:(0,u.jsx)("path",{d:"M.5 ".concat(c,"V.5H").concat(s),fill:"none",strokeDasharray:b})})}),(0,u.jsx)("rect",{width:"100%",height:"100%",fill:"url(#".concat(M,")")}),(0,u.jsx)("svg",{x:y,y:x,className:"overflow-visible",children:E.map((t,p)=>{let{pos:[f,y],id:x}=t;return(0,u.jsx)(d.EAS.rect,{initial:{opacity:0}
1,animate:{opacity:S},transition:{duration:C,repeat:1,delay:.1*p,repeatType:"reverse"},onAnimationComplete:()=>updateSquarePosition(x),width:s-1,height:c-1,x:f*s+1,y:y*c+1,fill:"currentColor",strokeWidth:"0"},"".concat(f,"-").concat(y,"-").concat(p))})})]})}},35698:function(t,s,c){"use strict";c.r(s),c.d(s,{__N_SSG:function(){return T},default:function(){return BookingAgent}});var u=c(85893),d=c(67294),p=c(18834);function e(){return(e=Object.assign?Object.assign.bind():function(t){for(var s=1;s<arguments.length;s++){var c=arguments[s];for(var u in c)({}).hasOwnProperty.call(c,u)&&(t[u]=c[u])}return t}).apply(null,arguments)}let f=new Uint8Array(0);let n=class n{static getFullOptions(t){return e({clientTools:{},onConnect:()=>{},onDebug:()=>{},onDisconnect:()=>{},onError:()=>{},onMessage:()=>{},onAudio:()=>{},onModeChange:()=>{},onStatusChange:()=>{},onCanSendFeedbackChange:()=>{}},t)}constructor(t,s){var c=this;this.options=void 0,this.connection=void 0,this.lastInterruptTimestamp=0,this.mode="listening",this.status="connecting",this.volume=1,this.currentEventId=1,this.lastFeedbackEventId=1,this.canSendFeedback=!1,this.endSessionWithDetails=async function(t){"connected"!==c.status&&"connecting"!==c.status||(c.updateStatus("disconnecting"),await c.handleEndSession(),c.updateStatus("disconnected"),c.options.onDisconnect(t))},this.onMessage=async function(t){switch(t.type){case"interruption":return void c.handleInterruption(t);case"agent_response":return void c.handleAgentResponse(t);case"user_transcript":return void c.handleUserTranscript(t);case"internal_tentative_agent_response":return void c.handleTentativeAgentResponse(t);case"client_tool_call":return void await c.handleClientToolCall(t);case"audio":return void c.handleAudio(t);case"ping":return void c.connection.sendMessage({type:"pong",event_id:t.ping_event.event_id});default:return void c.options.onDebug(t)}},this.setVolume=({volume:t})=>{this.volume=t},this.options=t,this.connection=s,this.options.onConnect({conversationId:s.conversationId}),this.connection.onMessage(this.onMessage),this.connection.onDisconnect(this.endSessionWithDetails),this.updateStatus("connected")}endSession(){return this.endSessionWithDetails({reason:"user"})}async handleEndSession(){this.connection.close()}updateMode(t){t!==this.mode&&(this.mode=t,this.options.onModeChange({mode:t}))}updateStatus(t){t!==this.status&&(this.status=t,this.options.onStatusChange({status:t}))}updateCanSendFeedback(){let t=this.currentEventId!==this.lastFeedbackEventId;this.canSendFeedback!==t&&(this.canSendFeedback=t,this.options.onCanSendFeedbackChange({canSendFeedback:t}))}handleInterruption(t){t.interruption_event&&(this.lastInterruptTimestamp=t.interruption_event.event_id)}handleAgentResponse(t){this.options.onMessage({source:"ai",message:t.agent_response_event.agent_response})}handleUserTranscript(t){this.options.onMessage({source:"user",message:t.user_transcription_event.user_transcript})}handleTentativeAgentResponse(t){this.options.onDebug({type:"tentative_agent_response",response:t.tentative_agent_response_internal_event.tentative_agent_response})}async handleClientToolCall(t){if(this.options.clientTools.hasOwnProperty(t.client_tool_call.tool_name))try{var s;let c=null!=(s=await this.options.clientTools[t.client_tool_call.tool_name](t.client_tool_call.parameters))?s:"Client tool execution successful.",u="object"==typeof c?JSON.stringify(c):String(c);this.connection.sendMessage({type:"client_tool_result",tool_call_id:t.client_tool_call.tool_call_id,result:u,is_error:!1})}catch(s){this.onError("Client tool execution failed with following error: "+(null==s?void 0:s.message),{clientToolName:t.client_tool_call.tool_name}),this.connection.sendMessage({type:"client_tool_result",tool_call_id:t.client_tool_call.tool_call_id,result:"Client tool execution failed: "+(null==s?void 0:s.message),is_error:!0})}else{if(this.options.onUnhandledClientToolCall)return void this.options.onUnhandledClientToolCall(t.client_tool_call);this.onError(`Client tool with name ${t.client_tool_call.tool_name} is not defined on client`,{clientToolName:t.client_tool_call.tool_name}),this.connection.sendMessage({type:"client_tool_result",tool_call_id:t.client_tool_call.tool_call_id,result:`Client tool with name ${t.client_tool_call.tool_name} is not defined on client`,is_error:!0})}}handleAudio(t){}onError(t,s){console.error(t,s),this.options.onError(t,s)}getId(){return this.connection.conversationId}isOpen(){return"connected"===this.status}setMicMuted(t){}getInputByteFrequencyData(){return f}getOutputByteFrequencyData(){return f}getInputVolume(){return 0}getOutputVolume(){return 0}sendFeedback(t){this.canSendFeedback?(this.connection.sendMessage({type:"feedback",score:t?"like":"dislike",event_id:this.currentEventId}),this.lastFeedbackEventId=this.currentEventId,this.updateCanSendFeedback()):console.warn(0===this.lastFeedbackEventId?"Cannot send feedback: the conversation has not started yet.":"Cannot send feedback: feedback has already been sent for the current response.")}sendContextualUpdate(t){this.connection.sendMessage({type:"contextual_update",text:t})}sendUserMessage(t){this.connection.sendMessage({type:"user_message",text:t})}sendUserActivity(){this.connection.sendMessage({type:"user_activity"})}sendMCPToolApprovalResult(t,s){this.connection.sendMessage({type:"mcp_tool_approval_result",tool_call_id:t,is_a
1pproved:s})}};let a=class a{static async create(t){var s,c;let u=null;try{let c=null!=(s=t.origin)?s:"wss://api.elevenlabs.io",d=t.signedUrl?t.signedUrl:c+"/v1/convai/conversation?agent_id="+t.agentId,p=["convai"];t.authorization&&p.push(`bearer.${t.authorization}`),u=new WebSocket(d,p);let f=await new Promise((s,c)=>{u.addEventListener("open",()=>{var s,c,d,p,f,y;let x={type:"conversation_initiation_client_data"};t.overrides&&(x.conversation_config_override={agent:{prompt:null==(c=t.overrides.agent)?void 0:c.prompt,first_message:null==(d=t.overrides.agent)?void 0:d.firstMessage,language:null==(p=t.overrides.agent)?void 0:p.language},tts:{voice_id:null==(f=t.overrides.tts)?void 0:f.voiceId},conversation:{text_only:null==(y=t.overrides.conversation)?void 0:y.textOnly}}),t.customLlmExtraBody&&(x.custom_llm_extra_body=t.customLlmExtraBody),t.dynamicVariables&&(x.dynamic_variables=t.dynamicVariables),null==(s=u)||s.send(JSON.stringify(x))},{once:!0}),u.addEventListener("error",t=>{setTimeout(()=>c(t),0)}),u.addEventListener("close",c),u.addEventListener("message",t=>{let c=JSON.parse(t.data);c.type&&("conversation_initiation_metadata"===c.type?s(c.conversation_initiation_metadata_event):console.warn("First received message is not conversation metadata."))},{once:!0})}),{conversation_id:y,agent_output_audio_format:x,user_input_audio_format:b}=f,k=o(null!=b?b:"pcm_16000"),_=o(x);return new a(u,y,k,_)}catch(t){throw null==(c=u)||c.close(),t}}constructor(t,s,c,u){this.socket=void 0,this.conversationId=void 0,this.inputFormat=void 0,this.outputFormat=void 0,this.queue=[],this.disconnectionDetails=null,this.onDisconnectCallback=null,this.onMessageCallback=null,this.socket=t,this.conversationId=s,this.inputFormat=c,this.outputFormat=u,this.socket.addEventListener("error",t=>{setTimeout(()=>this.disconnect({reason:"error",message:"The connection was closed due to a socket error.",context:t}),0)}),this.socket.addEventListener("close",t=>{this.disconnect(1e3===t.code?{reason:"agent",context:t}:{reason:"error",message:t.reason||"The connection was closed by the server.",context:t})}),this.socket.addEventListener("message",t=>{try{let s=JSON.parse(t.data);if(!s.type)return;this.onMessageCallback?this.onMessageCallback(s):this.queue.push(s)}catch(t){}})}close(){this.socket.close()}sendMessage(t){this.socket.send(JSON.stringify(t))}onMessage(t){this.onMessageCallback=t;let s=this.queue;this.queue=[],s.length>0&&queueMicrotask(()=>{s.forEach(t)})}onDisconnect(t){this.onDisconnectCallback=t;let s=this.disconnectionDetails;s&&queueMicrotask(()=>{t(s)})}disconnect(t){var s;this.disconnectionDetails||(this.disconnectionDetails=t,null==(s=this.onDisconnectCallback)||s.call(this,t))}};function o(t){let[s,c]=t.split("_");if(!["pcm","ulaw"].includes(s))throw Error(`Invalid format: ${t}`);let u=parseInt(c);if(isNaN(u))throw Error(`Invalid sample rate: ${c}`);return{format:s,sampleRate:u}}function i(){return["iPad Simulator","iPhone Simulator","iPod Simulator","iPad","iPhone","iPod"].includes(navigator.platform)||navigator.userAgent.includes("Mac")&&"ontouchend"in document}async function r(t={default:0,android:3e3}){var s,c;let u=t.default;/android/i.test(navigator.userAgent)?u=null!=(s=t.android)?s:u:i()&&(u=null!=(c=t.ios)?c:u),u>0&&await new Promise(t=>setTimeout(t,u))}let l=class l extends n{static async startSession(t){let s=n.getFullOptions(t);s.onStatusChange({status:"connecting"}),s.onCanSendFeedbackChange({canSendFeedback:!1});let c=null;try{return await r(s.connectionDelay),c=await a.create(t),new l(s,c)}catch(t){var u;throw s.onStatusChange({status:"disconnected"}),null==(u=c)||u.close(),t}}};let y=new Map;function h(t,s){return async c=>{let u=y.get(t);if(u)return c.addModule(u);let d=new Blob([s],{type:"application/javascript"}),p=URL.createObjectURL(d);try{return await c.addModule(p),void y.set(t,p)}catch(t){URL.revokeObjectURL(p)}try{let u=`data:application/javascript;base64,${btoa(s)}`;await c.addModule(u),y.set(t,u)}catch(s){throw Error(`Failed to load the ${t} worklet module. Make sure the browser supports AudioWorklets.`)}}}let x=h("raw-audio-processor",'\nconst BIAS = 0x84;\nconst CLIP = 32635;\nconst encodeTable = [\n  0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,\n  4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,\n  5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,\n  5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,\n  6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,\n  6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,\n  6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,\n  6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,\n  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,\n  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,\n  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,\n  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,\n  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,\n  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,\n  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,\n  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7\n];\n\nfunction encodeSample(sample) {\n  let sign;\n  let exponent;
1\n  let mantissa;\n  let muLawSample;\n  sign = (sample >> 8) & 0x80;\n  if (sign !== 0) sample = -sample;\n  sample = sample + BIAS;\n  if (sample > CLIP) sample = CLIP;\n  exponent = encodeTable[(sample>>7) & 0xFF];\n  mantissa = (sample >> (exponent+3)) & 0x0F;\n  muLawSample = ~(sign | (exponent << 4) | mantissa);\n  \n  return muLawSample;\n}\n\nclass RawAudioProcessor extends AudioWorkletProcessor {\n  constructor() {\n    super();\n              \n    this.port.onmessage = ({ data }) => {\n      switch (data.type) {\n        case "setFormat":\n          this.isMuted = false;\n          this.buffer = []; // Initialize an empty buffer\n          this.bufferSize = data.sampleRate / 4;\n          this.format = data.format;\n\n          if (globalThis.LibSampleRate && sampleRate !== data.sampleRate) {\n            globalThis.LibSampleRate.create(1, sampleRate, data.sampleRate).then(resampler => {\n              this.resampler = resampler;\n            });\n          }\n          break;\n        case "setMuted":\n          this.isMuted = data.isMuted;\n          break;\n      }\n    };\n  }\n  process(inputs) {\n    if (!this.buffer) {\n      return true;\n    }\n    \n    const input = inputs[0]; // Get the first input node\n    if (input.length > 0) {\n      let channelData = input[0]; // Get the first channel\'s data\n\n      // Resample the audio if necessary\n      if (this.resampler) {\n        channelData = this.resampler.full(channelData);\n      }\n\n      // Add channel data to the buffer\n      this.buffer.push(...channelData);\n      // Get max volume \n      let sum = 0.0;\n      for (let i = 0; i < channelData.length; i++) {\n        sum += channelData[i] * channelData[i];\n      }\n      const maxVolume = Math.sqrt(sum / channelData.length);\n      // Check if buffer size has reached or exceeded the threshold\n      if (this.buffer.length >= this.bufferSize) {\n        const float32Array = this.isMuted \n          ? new Float32Array(this.buffer.length)\n          : new Float32Array(this.buffer);\n\n        let encodedArray = this.format === "ulaw"\n          ? new Uint8Array(float32Array.length)\n          : new Int16Array(float32Array.length);\n\n        // Iterate through the Float32Array and convert each sample to PCM16\n        for (let i = 0; i < float32Array.length; i++) {\n          // Clamp the value to the range [-1, 1]\n          let sample = Math.max(-1, Math.min(1, float32Array[i]));\n\n          // Scale the sample to the range [-32768, 32767]\n          let value = sample < 0 ? sample * 32768 : sample * 32767;\n          if (this.format === "ulaw") {\n            value = encodeSample(Math.round(value));\n          }\n\n          encodedArray[i] = value;\n        }\n\n        // Send the buffered data to the main script\n        this.port.postMessage([encodedArray, maxVolume]);\n\n        // Clear the buffer after sending\n        this.buffer = [];\n      }\n    }\n    return true; // Continue processing\n  }\n}\nregisterProcessor("raw-audio-processor", RawAudioProcessor);\n');let m=class m{static async create({sampleRate:t,format:s,preferHeadphonesForIosDevices:c}){let u=null,d=null;try{let p={sampleRate:{ideal:t},echoCancellation:{ideal:!0},noiseSuppression:{ideal:!0}};if(i()&&c){let t=(await window.navigator.mediaDevices.enumerateDevices()).find(t=>"audioinput"===t.kind&&["airpod","headphone","earphone"].find(s=>t.label.toLowerCase().includes(s)));t&&(p.deviceId={ideal:t.deviceId})}let f=navigator.mediaDevices.getSupportedConstraints().sampleRate;u=new window.AudioContext(f?{sampleRate:t}:{});let y=u.createAnalyser();f||await u.audioWorklet.addModule("https://cdn.jsdelivr.net/npm/@alexanderolsen/[email protected]/dist/libsamplerate.worklet.js"),await x(u.audioWorklet),d=await navigator.mediaDevices.getUserMedia({audio:p});let b=u.createMediaStreamSource(d),k=new AudioWorkletNode(u,"raw-audio-processor");return k.port.postMessage({type:"setFormat",format:s,sampleRate:t}),b.connect(y),y.connect(k),await u.resume(),new m(u,y,k,d)}catch(t){var p,f;throw null==(p=d)||p.getTracks().forEach(t=>t.stop()),null==(f=u)||f.close(),t}}constructor(t,s,c,u){this.context=void 0,this.analyser=void 0,this.worklet=void 0,this.inputStream=void 0,this.context=t,this.analyser=s,this.worklet=c,this.inputStream=u}
1async close(){this.inputStream.getTracks().forEach(t=>t.stop()),await this.context.close()}setMuted(t){this.worklet.port.postMessage({type:"setMuted",isMuted:t})}};let b=h("audio-concat-processor",'\nconst decodeTable = [0,132,396,924,1980,4092,8316,16764];\n\nexport function decodeSample(muLawSample) {\n  let sign;\n  let exponent;\n  let mantissa;\n  let sample;\n  muLawSample = ~muLawSample;\n  sign = (muLawSample & 0x80);\n  exponent = (muLawSample >> 4) & 0x07;\n  mantissa = muLawSample & 0x0F;\n  sample = decodeTable[exponent] + (mantissa << (exponent+3));\n  if (sign !== 0) sample = -sample;\n\n  return sample;\n}\n\nclass AudioConcatProcessor extends AudioWorkletProcessor {\n  constructor() {\n    super();\n    this.buffers = []; // Initialize an empty buffer\n    this.cursor = 0;\n    this.currentBuffer = null;\n    this.wasInterrupted = false;\n    this.finished = false;\n    \n    this.port.onmessage = ({ data }) => {\n      switch (data.type) {\n        case "setFormat":\n          this.format = data.format;\n          break;\n        case "buffer":\n          this.wasInterrupted = false;\n          this.buffers.push(\n            this.format === "ulaw"\n              ? new Uint8Array(data.buffer)\n              : new Int16Array(data.buffer)\n          );\n          break;\n        case "interrupt":\n          this.wasInterrupted = true;\n          break;\n        case "clearInterrupted":\n          if (this.wasInterrupted) {\n            this.wasInterrupted = false;\n            this.buffers = [];\n            this.currentBuffer = null;\n          }\n      }\n    };\n  }\n  process(_, outputs) {\n    let finished = false;\n    const output = outputs[0][0];\n    for (let i = 0; i < output.length; i++) {\n      if (!this.currentBuffer) {\n        if (this.buffers.length === 0) {\n          finished = true;\n          break;\n        }\n        this.currentBuffer = this.buffers.shift();\n        this.cursor = 0;\n      }\n\n      let value = this.currentBuffer[this.cursor];\n      if (this.format === "ulaw") {\n        value = decodeSample(value);\n      }\n      output[i] = value / 32768;\n      this.cursor++;\n\n      if (this.cursor >= this.currentBuffer.length) {\n        this.currentBuffer = null;\n      }\n    }\n\n    if (this.finished !== finished) {\n      this.finished = finished;\n      this.port.postMessage({ type: "process", finished });\n    }\n\n    return true; // Continue processing\n  }\n}\n\nregisterProcessor("audio-concat-processor", AudioConcatProcessor);\n');let g=class g{static async create({sampleRate:t,format:s}){let c=null;try{c=new AudioContext({sampleRate:t});let u=c.createAnalyser(),d=c.createGain();d.connect(u),u.connect(c.destination),await b(c.audioWorklet);let p=new AudioWorkletNode(c,"audio-concat-processor");return p.port.postMessage({type:"setFormat",format:s}),p.connect(d),await c.resume(),new g(c,u,d,p)}catch(t){var u;throw null==(u=c)||u.close(),t}}constructor(t,s,c,u){this.context=void 0,this.analyser=void 0,this.gain=void 0,this.worklet=void 0,this.context=t,this.analyser=s,this.gain=c,this.worklet=u}async close(){await this.context.close()}};let v=class v extends n{static async startSession(t){var s,c,u,d,p,f,y;let x=n.getFullOptions(t);x.onStatusChange({status:"connecting"}),x.onCanSendFeedbackChange({canSendFeedback:!1});let b=null,k=null,_=null,S=null,C=null;if(null==(s=t.useWakeLock)||s)try{C=await navigator.wakeLock.request("screen")}catch(t){}try{return S=await navigator.mediaDevices.getUserMedia({audio:!0}),await r(x.connectionDelay),k=await a.create(t),[b,_]=await Promise.all([m.create(e({},k.inputFormat,{preferHeadphonesForIosDevices:t.preferHeadphonesForIosDevices})),g.create(k.outputFormat)]),null==(c=S)||c.getTracks().forEach(t=>t.stop()),S=null,new v(x,k,b,_,C)}catch(t){x.onStatusChange({status:"disconnected"}),null==(u=S)||u.getTracks().forEach(t=>t.stop()),null==(d=k)||d.close(),await (null==(p=b)?void 0:p.close()),await (null==(f=_)?void 0:f.close());try{await (null==(y=C)?void 0:y.release()),C=null}catch(t){}throw t}}constructor(t,s,c,u,d){super(t,s),this.input=void 0,this.output=void 0,this.wakeLock=void 0,this.inputFrequencyData=void 0,this.outputFrequencyData=void 0,this.onInputWorkletMessage=t=>{"connected"===this.status&&this.connection.sendMessage({user_audio_chunk:function(t){let s=new Uint8Array(t);return window.btoa(String.fromCharCode(...s))}(t.data[0].buffer)})},this.onOutputWorkletMessage=({data:t})=>{"process"===t.type&&this.updateMode(t.finished?"listening":"speaking")},this.addAudioBase64Chunk=t=>{this.output.gain.gain.value=this.volume,this.output.worklet.port.postMessage({type:"clearInterrupted"}),this.output.worklet.port.postMessage({type:"buffer",buffer:function(t){let s=window.atob(t),c=s.length,u=new Uint8Array(c);for(let t=0;t<c;t++)u[t]=s.charCodeAt(t);return u.buffer}(t)})},this.fadeOutAudio=()=>{this.updateMode("listening"),this.output.worklet.port.postMessage({type:"interrupt"}),this.output.gain.gain.exponentialRampToValueAtTime(1e-4,this.output.context.currentTime+2),setTimeout(()=>{this.output.gain.gain.value=this.volume,this.output.worklet.port.postMessage({type:"clearInterrupted"})},2e3)},this.calculateVolume=t=>{if(0===t.length)return 0;let s=0;for(let c=0;c<t.length;c++)s+=t[c]/255;return(s/=t.length)<0?0:s>1?1:s},this.input=c,this.output=u,this.wakeLock=d,this.input.worklet.port.onmessage=this.onInputWorkletMessage,this.output.worklet.port.onmessage=this.onOutputWorkletMessage}async handleEndSession(){await super.handleEndSession();try{var t;
1await (null==(t=this.wakeLock)?void 0:t.release()),this.wakeLock=null}catch(t){}await this.input.close(),await this.output.close()}handleInterruption(t){super.handleInterruption(t),this.fadeOutAudio()}handleAudio(t){this.lastInterruptTimestamp<=t.audio_event.event_id&&(this.options.onAudio(t.audio_event.audio_base_64),this.addAudioBase64Chunk(t.audio_event.audio_base_64),this.currentEventId=t.audio_event.event_id,this.updateCanSendFeedback(),this.updateMode("speaking"))}setMicMuted(t){this.input.setMuted(t)}getInputByteFrequencyData(){return null!=this.inputFrequencyData||(this.inputFrequencyData=new Uint8Array(this.input.analyser.frequencyBinCount)),this.input.analyser.getByteFrequencyData(this.inputFrequencyData),this.inputFrequencyData}getOutputByteFrequencyData(){return null!=this.outputFrequencyData||(this.outputFrequencyData=new Uint8Array(this.output.analyser.frequencyBinCount)),this.output.analyser.getByteFrequencyData(this.outputFrequencyData),this.outputFrequencyData}getInputVolume(){return this.calculateVolume(this.getInputByteFrequencyData())}getOutputVolume(){return this.calculateVolume(this.getOutputByteFrequencyData())}};let w=class w extends n{static startSession(t){return t.textOnly?l.startSession(t):v.startSession(t)}};function lib_modern_u(){return(lib_modern_u=Object.assign?Object.assign.bind():function(t){for(var s=1;s<arguments.length;s++){var c=arguments[s];for(var u in c)({}).hasOwnProperty.call(c,u)&&(t[u]=c[u])}return t}).apply(null,arguments)}let k=["micMuted","volume"];var _=c(63506),S=c(99607),C=c(96755),A=c(49566),I=c(18821),M=c(57550),j=c(20417),D=c(79745),F=c(70858);let E=d.forwardRef(function({title:t,titleId:s,...c},u){return d.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor","aria-hidden":"true","data-slot":"icon",ref:u,"aria-labelledby":s},c),t?d.createElement("title",{id:s},t):null,d.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9 12.75 11.25 15 15 9.75M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z"}))}),N=d.forwardRef(function({title:t,titleId:s,...c},u){return d.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor","aria-hidden":"true","data-slot":"icon",ref:u,"aria-labelledby":s},c),t?d.createElement("title",{id:s},t):null,d.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M2.25 6.75c0 8.284 6.716 15 15 15h2.25a2.25 2.25 0 0 0 2.25-2.25v-1.372c0-.516-.351-.966-.852-1.091l-4.423-1.106c-.44-.11-.902.055-1.173.417l-.97 1.293c-.282.376-.769.542-1.21.38a12.035 12.035 0 0 1-7.143-7.143c-.162-.441.004-.928.38-1.21l1.293-.97c.363-.271.527-.734.417-1.173L6.963 3.102a1.125 1.125 0 0 0-1.091-.852H4.5A2.25 2.25 0 0 0 2.25 4.5v2.25Z"}))}),R=d.forwardRef(function({title:t,titleId:s,...c},u){return d.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor","aria-hidden":"true","data-slot":"icon",ref:u,"aria-labelledby":s},c),t?d.createElement("title",{id:s},t):null,d.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M20.25 8.511c.884.284 1.5 1.128 1.5 2.097v4.286c0 1.136-.847 2.1-1.98 2.193-.34.027-.68.052-1.02.072v3.091l-3-3c-1.354 0-2.694-.055-4.02-.163a2.115 2.115 0 0 1-.825-.242m9.345-8.334a2.126 2.126 0 0 0-.476-.095 48.64 48.64 0 0 0-8.048 0c-1.131.094-1.976 1.057-1.976 2.192v4.286c0 .837.46 1.58 1.155 1.951m9.345-8.334V6.637c0-1.621-1.152-3.026-2.76-3.235A48.455 48.455 0 0 0 11.25 3c-2.115 0-4.198.137-6.24.402-1.608.209-2.76 1.614-2.76 3.235v6.226c0 1.621 1.152 3.026 2.76 3.235.577.075 1.157.14 1.74.194V21l4.155-4.155"}))}),O=d.forwardRef(function({title:t,titleId:s,...c},u){return d.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor","aria-hidden":"true","data-slot":"icon",ref:u,"aria-labelledby":s},c),t?d.createElement("title",{id:s},t):null,d.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 0 1 2.25-2.25h13.5A2.25 2.25 0 0 1 21 7.5v11.25m-18 0A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75m-18 0v-7.5A2.25 2.25 0 0 1 5.25 9h13.5A2.25 2.25 0 0 1 21 11.25v7.5m-9-6h.008v.008H12v-.008ZM12 15h.008v.008H12V15Zm0 2.25h.008v.008H12v-.008ZM9.75 15h.008v.008H9.75V15Zm0 2.25h.008v.008H9.75v-.008ZM7.5 15h.008v.008H7.5V15Zm0 2.25h.008v.008H7.5v-.008Zm6.75-4.5h.008v.008h-.008v-.008Zm0 2.25h.008v.008h-.008V15Zm0 2.25h.008v.008h-.008v-.008Zm2.25-4.5h.008v.008H16.5v-.008Zm0 2.25h.008v.008H16.5V15Z"}))}),L=d.forwardRef(function({title:t,titleId:s,...c},u){return d.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor","aria-hidden":"true","data-slot":"icon",ref:u,"aria-labelledby":s},c),t?d.createElement("title",{id:s},t):null,d.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M12 6v6h4.5m4.5 0a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z"}))});var T=!0;function BookingAgent(t){let{clients:s}=t,[c,f]=(0,d.useState)(!1),[y,x]=(0,d.useState)(!1),[b,_]=(0,d.useState)("listening"),[N,R]=(0,d.useState)(120),[O,L]=(0,d.useState)(null),T=(0,d.useRef)(null),U=(0,d.useRef)(null),V=(0,d.useCallback)(()=>{T.current&&(clearInterval(T.current),T.current=null)},[]),W=(0,d.useCallback)(async()=>
1{if(U.current)try{await U.current()}catch(t){}V()},[V]),Z=(0,d.useCallback)(()=>{V(),R(120),T.current=setInterval(()=>{R(t=>t<=1?(W(),120):t-1)},1e3)},[W,V]),H=(0,d.useCallback)(()=>{f(!0),x(!1),L(null),Z()},[Z]),z=(0,d.useCallback)(t=>{f(!1),x(!1),V(),R(120),t&&"object"==typeof t&&"user"===t.reason?L(null):t?L("Connection ended unexpectedly: ".concat(JSON.stringify(t))):L("Connection ended without a reason.")},[V]),G=(0,d.useCallback)(t=>{x(!1),f(!1),V();let s=(null==t?void 0:t.message)||(null==t?void 0:t.toString())||"Unknown error",c=(null==t?void 0:t.type)||"unknown";L("Connection error (".concat(c,"): ").concat(s))},[V]),J=(0,d.useCallback)(t=>{_("speaking"===t.mode?"speaking":"listening")},[]),$=(0,d.useCallback)(t=>{},[]),Y=function(t={}){let{micMuted:s,volume:c}=t,u=function(t,s){if(null==t)return{};var c={};for(var u in t)if(({}).hasOwnProperty.call(t,u)){if(s.includes(u))continue;c[u]=t[u]}return c}(t,k),p=(0,d.useRef)(null),f=(0,d.useRef)(null),[y,x]=(0,d.useState)("disconnected"),[b,_]=(0,d.useState)(!1),[S,C]=(0,d.useState)("listening");return(0,d.useEffect)(()=>{var t;void 0!==s&&(null==p||null==(t=p.current)||t.setMicMuted(s))},[s]),(0,d.useEffect)(()=>{var t;void 0!==c&&(null==p||null==(t=p.current)||t.setVolume({volume:c}))},[c]),(0,d.useEffect)(()=>()=>{var t;null==(t=p.current)||t.endSession()},[]),{startSession:async t=>{var d;if(null!=(d=p.current)&&d.isOpen())return p.current.getId();if(f.current)return(await f.current).getId();try{return f.current=w.startSession(lib_modern_u({},null!=u?u:{},null!=t?t:{},{onModeChange:({mode:t})=>{C(t)},onStatusChange:({status:t})=>{x(t)},onCanSendFeedbackChange:({canSendFeedback:t})=>{_(t)}})),p.current=await f.current,void 0!==s&&p.current.setMicMuted(s),void 0!==c&&p.current.setVolume({volume:c}),p.current.getId()}finally{f.current=null}},endSession:async()=>{let t=p.current;p.current=null,await (null==t?void 0:t.endSession())},setVolume:({volume:t})=>{var s;null==(s=p.current)||s.setVolume({volume:t})},getInputByteFrequencyData:()=>{var t;return null==(t=p.current)?void 0:t.getInputByteFrequencyData()},getOutputByteFrequencyData:()=>{var t;return null==(t=p.current)?void 0:t.getOutputByteFrequencyData()},getInputVolume:()=>{var t,s;return null!=(t=null==(s=p.current)?void 0:s.getInputVolume())?t:0},getOutputVolume:()=>{var t,s;return null!=(t=null==(s=p.current)?void 0:s.getOutputVolume())?t:0},sendFeedback:t=>{var s;null==(s=p.current)||s.sendFeedback(t)},getId:()=>{var t;return null==(t=p.current)?void 0:t.getId()},sendContextualUpdate:t=>{var s;null==(s=p.current)||s.sendContextualUpdate(t)},sendUserMessage:t=>{var s;null==(s=p.current)||s.sendUserMessage(t)},sendUserActivity:()=>{var t;null==(t=p.current)||t.sendUserActivity()},sendMCPToolApprovalResult:(t,s)=>{var c;null==(c=p.current)||c.sendMCPToolApprovalResult(t,s)},status:y,canSendFeedback:b,micMuted:s,isSpeaking:"speaking"===S}}({onConnect:H,onDisconnect:z,onError:G,onModeChange:J,onMessage:$});(0,d.useEffect)(()=>{Y&&"function"==typeof Y.endSession?U.current=Y.endSession.bind(Y):U.current=null},[Y]);let K=(0,d.useCallback)(async()=>{try{let t=await fetch("/api/get-signed-url");if(!t.ok){let s=await t.text(),c="Failed to get signed URL";try{let t=JSON.parse(s);c=t.error||c}catch(u){c="HTTP ".concat(t.status,": ").concat(s)}throw Error(c)}let s=await t.json();if(!s.signedUrl)throw Error("No signed URL returned from server");return s.signedUrl}catch(t){return L("Authentication failed: ".concat(t instanceof Error?t.message:"Unknown error")),null}},[]),X=(0,d.useCallback)(async()=>{try{x(!0),L(null),await navigator.mediaDevices.getUserMedia({audio:!0});let t=await K();if(!t)throw Error("Failed to obtain signed URL for private agent");if(!t.startsWith("wss://"))throw Error("Invalid signed URL format: ".concat(t));if(Y&&Y.startSession)await Y.startSession({signedUrl:t});else throw Error("Conversation object not ready for startSession")}catch(s){x(!1);let t="❌ Failed to start";if(s instanceof Error){let{message:c}=s;t=c.includes("getUserMedia")?"\uD83C\uDF99️ Microphone access denied. Please allow microphone access and try again.":c.includes("403")||c.includes("Permission")||c.includes("401")?"\uD83D\uDD12 Authentication failed. Please check your ElevenLabs API key configuration.":c.includes("signed URL")?"\uD83D\uDD10 Failed to authenticate with signed URL. Please check your API key and agent configuration.":"❌ Failed to start: ".concat(c)}else t="❌ Failed to start: ".concat(String(s));L(t)}},[Y,K]),Q=(0,d.useCallback)(async()=>{await W()},[W]);return(0,d.useEffect)(()=>()=>{W()},[W]),(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)("div",{className:"-z-50 fixed w-screen h-screen opacity-10",children:(0,u.jsx)(C.Z,{numSquares:30,maxOpacity:.5,duration:1,repeatDelay:.1})}),(0,u.jsx)(S.ZP,{title:"AI Restaurant Booking Agent",description:"AI-powered restaurant booking agent that handles phone reservations 24/7 with natural voice conversations, smart scheduling, and POS integration.",path:"booking-agent",keywords:["AI restaurant booking","automated phone reservation","AI booking agent","restaurant phone AI","voice AI restaurant"],schemas:[(0,S.qM)({name:"Antler AI Restaurant Booking Agent",description:"AI-powered voice agent for restaurant reservations that handles phone bookings 24/7 with natural conversations.",category:"BusinessApplication",featureList:"Natural voice conversations, Smart scheduling, 24/7 availability, Multilingual support, POS integration"}),(0,S.KZ)({name:"AI Restaurant Booking Agent",description:"Intelligent AI booking agent that handles restaurant phone reservations with 
1natural voice conversations, smart scheduling, and seamless POS integration.",url:"https://antler.digital/booking-agent",serviceType:"AI Voice Agent"})]}),(0,u.jsxs)(D.Z,{headerSize:"h1",title:"AI Restaurant Booking Agent",animateWords:!1,children:[(0,u.jsx)(p.m.p,{initial:{opacity:0},animate:{opacity:1},viewport:{once:!0,margin:"-20% 0%"},transition:{type:"tween",delay:.2},className:"max-w-screen-md px-12 font-sans text-xl text-center mb-8",children:"Transform your restaurant's reservation system with our intelligent AI agent. Handle bookings, answer questions, and provide exceptional customer service 24/7."}),(0,u.jsxs)(p.m.div,{initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{type:"tween",delay:.4},className:"flex flex-col items-center space-y-4",children:[(0,u.jsx)("div",{className:"bg-gradient-to-r from-purple-600 to-pink-600 p-1 rounded-full",children:(0,u.jsx)("button",{onClick:c?Q:X,disabled:y,className:"bg-white px-8 py-4 rounded-full font-bold text-lg transition-colors shadow-lg ".concat(y?"text-gray-400 cursor-not-allowed":c?"text-red-600 hover:bg-red-50":"text-purple-600 hover:bg-gray-50"),children:y?"\uD83D\uDD04 Connecting...":c?"\uD83D\uDD34 End Demo":"\uD83C\uDF99️ Try Live Demo"})}),(0,u.jsxs)("div",{className:"text-center space-y-2",children:[O&&(0,u.jsxs)("div",{className:"bg-red-100 border border-red-400 text-red-700 px-4 py-2 rounded-lg max-w-md",children:[(0,u.jsx)("p",{className:"text-sm font-medium",children:O}),O.includes("private agent")&&(0,u.jsxs)("div",{className:"mt-2 text-xs",children:[(0,u.jsx)("p",{children:"This agent requires server-side authentication with signed URLs."}),(0,u.jsx)("p",{children:"Please contact the site administrator to configure proper authentication."})]})]}),(0,u.jsxs)("div",{className:"flex items-center justify-center space-x-4",children:[(0,u.jsx)("div",{className:"px-3 py-1 rounded-full text-sm font-medium ".concat(c?"bg-green-100 text-green-800":"bg-gray-100 text-gray-600"),children:c?"Connected":"Disconnected"}),c&&(0,u.jsxs)("div",{className:"px-3 py-1 rounded-full text-sm font-medium ".concat("speaking"===b?"bg-blue-100 text-blue-800":"bg-purple-100 text-purple-800"),children:["Agent is ",b]})]}),c&&(0,u.jsxs)("div",{className:"text-sm text-gray-600",children:["Time remaining:"," ",(0,u.jsx)("span",{className:"font-mono font-bold",children:"".concat(Math.floor(N/60),":").concat((N%60).toString().padStart(2,"0"))})]}),(0,u.jsx)("p",{className:"text-sm text-gray-600 max-w-md",children:c?"Speak naturally to book a table at your favorite restaurant":"Click the button above to start talking with our AI booking agent"})]})]})]}),(0,u.jsxs)("section",{className:"py-20 px-4 max-w-7xl mx-auto",children:[(0,u.jsxs)(p.m.div,{initial:{opacity:0,y:20},whileInView:{opacity:1,y:0},viewport:{once:!0},transition:{duration:.6},className:"text-center mb-16",children:[(0,u.jsx)("h2",{className:"text-4xl font-bold mb-6",children:"How It Works"}),(0,u.jsx)("p",{className:"text-xl text-gray-600 max-w-3xl mx-auto",children:"Our AI agent seamlessly integrates with your restaurant operations to handle reservations with human-like conversation."})]}),(0,u.jsx)("div",{className:"grid md:grid-cols-3 gap-8",children:P.map((t,s)=>(0,u.jsxs)(p.m.div,{initial:{opacity:0,y:20},whileInView:{opacity:1,y:0},viewport:{once:!0},transition:{duration:.6,delay:.2*s},className:"text-center",children:[(0,u.jsx)("div",{className:"w-16 h-16 mx-auto mb-4 bg-gradient-to-r from-purple-500 to-pink-500 rounded-full flex items-center justify-center",children:t.icon}),(0,u.jsx)("h3",{className:"text-xl font-semibold mb-2",children:t.title}),(0,u.jsx)("p",{className:"text-gray-600",children:t.description})]},s))})]}),(0,u.jsx)(F.Z,{cards:q,ctaText:"Get Started Today"}),(0,u.jsxs)("section",{className:"py-20 px-4 max-w-7xl mx-auto",children:[(0,u.jsx)(p.m.div,{initial:{opacity:0,y:20},whileInView:{opacity:1,y:0},viewport:{once:!0},transition:{duration:.6},className:"text-center mb-16",children:(0,u.jsx)("h2",{className:"text-4xl font-bold mb-6",children:"Why Choose Our AI Booking Agent?"})}),(0,u.jsx)("div",{className:"grid md:grid-cols-2 lg:grid-cols-3 gap-8",children:B.map((t,s)=>(0,u.jsxs)(p.m.div,{initial:{opacity:0,y:20},whileInView:{opacity:1,y:0},viewport:{once:!0},transition:{duration:.6,delay:.1*s},className:"bg-white p-6 rounded-lg shadow-md hover:shadow-lg transition-shadow",children:[(0,u.jsxs)("div",{className:"flex items-center mb-4",children:[(0,u.jsx)(E,{className:"w-6 h-6 text-green-500 mr-2"}),(0,u.jsx)("h3",{className:"text-lg font-semibold",children:t.title})]}),(0,u.jsx)("p",{className:"text-gray-600",children:t.description})]},s))})]}),(0,u.jsx)(A.Z,{}),(0,u.jsx)(j.Z,{heading:"Questions about the AI booking agent",subheading:"What restaurant owners ask us before getting started.",faqs:[{question:"How does the AI booking agent handle phone calls?",answer:"The agent uses advanced voice AI to conduct natural phone conversations with your customers. It understands context, handles accents and background noise, recognises special requests, and confirms reservations — all while sounding natural and professional. Customers often cannot tell they are speaking with AI."},{question:"Can it integrate with my existing reservation system?",answer:"Yes, the AI agent is designed to integrate seamlessly with popular restaurant POS and reservation systems. It syncs bookings in real time, checks live availability, and updates your calendar automatically. We handle the integration as part of the setup process."},{question:"What languages does the booking agent support?",answer:"The agent supports multilingual conversations and can handle calls in multiple languages, switching naturally based on the caller. This is particularly valuable for restaurants in tourist areas or diverse communities where staff language skills may be limited."},{question:"How does pricing compare to hiring additional staff?",answer:"The AI agent typically costs a fraction of a full-time front-of-house employee while operating 24/7 without breaks, sick days, or holiday cover. Most restaurants see a positive ROI within the first month through increased bookings and reduced missed calls, especially during peak hours and after closing time."}],ctaText:"Get started today",ctaHref:"/work-with-us"}),(0,u.jsx)(I.Z,{clients:s}),(0,u.jsx)(M.Z,{})]})}let P=[{icon:(0,u.jsx)(N,{className:"w-8 h-8 text-white"}),title:"Customer Calls",description:"Customers call your restaurant to make a reservation"},{icon:(0,u.jsx)(R,{className:"w-8 h-8 text-white"}),title:"AI Converses",description:"Our AI agent handles the conversation naturally and professionally"},{icon:(0,u.jsx)(O,{className:"w-8 h-8 text-white"}),title:"Booking Confirmed",description:"Reservation is confirmed and synced with your booking system"}],q=[{icon:(0,u.jsx)(N,{className:"w-10 h-10 text-blue-500"}),title:"Natural Conversations",borderColor:"border-blue-500",text:["Human-like voice interactions that make customers feel heard and valued.","Key capabilities include:",(0,u.jsxs)("ul",{className:"pl-4 list-disc marker:text-blue-500 font-bold",children:[(0,u.jsx)("li",{children:"Multilingual Support"},"multilingual"),(0,u.jsx)("li",{children:"Context-Aware Responses"},"context-aware"),(0,u.jsx)("li",{children:"Emotion Recognition"},"emotion-recognition"),(0,u.jsx)("li",{children:"Natural Speech Patterns"},"natural-speech")]},"conversation-features"),"Providing a seamless booking experience that feels authentically human."]},{icon:(0,u.jsx)(O,{className:"w-10 h-10 text-purple-500"}),title:"Smart Scheduling",borderColor:"border-purple-500",text:["Intelligent booking management that optimizes 
1your restaurant&apos;s capacity and customer satisfaction.","Features include:",(0,u.jsxs)("ul",{className:"pl-4 list-disc marker:text-purple-500 font-bold",children:[(0,u.jsx)("li",{children:"Real-time Availability"},"real-time-availability"),(0,u.jsx)("li",{children:"Automatic Confirmations"},"automatic-confirmations"),(0,u.jsx)("li",{children:"Waitlist Management"},"waitlist-management"),(0,u.jsx)("li",{children:"Special Request Handling"},"special-requests")]},"scheduling-features"),"Maximizing your bookings while maintaining exceptional service quality."]},{icon:(0,u.jsx)(L,{className:"w-10 h-10 text-green-500"}),title:"24/7 Availability",borderColor:"border-green-500",text:["Never miss a booking opportunity with round-the-clock AI assistance.","Benefits include:",(0,u.jsxs)("ul",{className:"pl-4 list-disc marker:text-green-500 font-bold",children:[(0,u.jsx)("li",{children:"Always Available"},"always-available"),(0,u.jsx)("li",{children:"Instant Responses"},"instant-responses"),(0,u.jsx)("li",{children:"No Busy Signals"},"no-busy-signals"),(0,u.jsx)("li",{children:"Holiday Coverage"},"holiday-coverage")]},"availability-features"),"Ensuring every potential customer can make a reservation when they want to."]}],B=[{title:"Increased Bookings",description:"Never miss a reservation call, even during peak hours or after closing time."},{title:"Reduced Staff Workload",description:"Free up your staff to focus on providing excellent in-person service."},{title:"Cost Effective",description:"Significant savings compared to hiring additional front-of-house staff."},{title:"Consistent Service",description:"Every customer receives the same high-quality booking experience."},{title:"Data Insights",description:"Gain valuable insights about customer preferences and booking patterns."},{title:"Easy Integration",description:"Seamlessly connects with your existing reservation and POS systems."}];BookingAgent.getLayout=function(t){return(0,u.jsx)(_.Z,{children:t})}}},function(t){t.O(0,[144,675,241,506,607,381,814,774,888,179],function(){return t(t.s=88496)}),_N_E=t.O()}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.