Download app.js from Adaptive-Machine-Patterns/amp-embodied-ai-workbench-demo: direct link, hf CLI and curl.
- Browser
- Download file 58.1 kB
-
https://huggingface.co/spaces/Adaptive-Machine-Patterns/amp-embodied-ai-workbench-demo/resolve/main/app.js
- Command line
-
hf download hf://spaces/Adaptive-Machine-Patterns/amp-embodied-ai-workbench-demo/app.js
-
curl -L -o app.js https://huggingface.co/spaces/Adaptive-Machine-Patterns/amp-embodied-ai-workbench-demo/resolve/main/app.js
58.1 kB
| import"./chunks/chunk-PHKIAKHS.js";var it=["pointerdown","mousedown","pointerup","mouseup","click"],ke=new WeakMap;function rt(e,t,n){xe(e);let o=i=>{let r=i.target;e.contains(r)&&((!n||n(r))&&(i.preventDefault(),i.stopPropagation(),i.stopImmediatePropagation()),i.type==="click"&&t?.(i))};for(let i of it)document.addEventListener(i,o,!0);ke.set(e,o)}function xe(e){let t=ke.get(e);if(t){for(let n of it)document.removeEventListener(n,t,!0);ke.delete(e)}}function tn(e,t){let n=e.wrapper.getBoundingClientRect();return{width:n.width+t,height:n.height+t,realWidth:n.width,realHeight:n.height}}function Ze(e,t){let{elementDimensions:n,popoverDimensions:o,popoverPadding:i,popoverArrowDimensions:r}=t;return e==="start"?Math.max(Math.min(n.top-i,window.innerHeight-o.realHeight-r.width),r.width):e==="end"?Math.max(Math.min(n.top-o?.realHeight+n.height+i,window.innerHeight-o?.realHeight-r.width),r.width):e==="center"?Math.max(Math.min(n.top+n.height/2-o?.realHeight/2,window.innerHeight-o?.realHeight-r.width),r.width):0}function Je(e,t){let{elementDimensions:n,popoverDimensions:o,popoverPadding:i,popoverArrowDimensions:r}=t;return e==="start"?Math.max(Math.min(n.left-i,window.innerWidth-o.realWidth-r.width),r.width):e==="end"?Math.max(Math.min(n.left-o?.realWidth+n.width+i,window.innerWidth-o?.realWidth-r.width),r.width):e==="center"?Math.max(Math.min(n.left+n.width/2-o?.realWidth/2,window.innerWidth-o?.realWidth-r.width),r.width):0}function Ee(e,t,n){let{align:o,side:i}=n,r=n.centered?"over":i,a=n.padding,c=tn(e,n.offset),g=e.arrow.getBoundingClientRect(),p=t.getBoundingClientRect(),L=p.top-c.height,y=L>=0,d=window.innerHeight-(p.bottom+c.height),m=d>=0,b=p.left-c.width,C=b>=0,l=window.innerWidth-(p.right+c.width),u=l>=0,h=!y&&!m&&!C&&!u,v=r;if(r==="top"&&y?u=C=m=!1:r==="bottom"&&m?u=C=y=!1:r==="left"&&C?u=y=m=!1:r==="right"&&u&&(C=y=m=!1),r==="over"){let w=window.innerWidth/2-c.realWidth/2,x=window.innerHeight/2-c.realHeight/2;e.wrapper.style.left=`${w}px`,e.wrapper.style.right="auto",e.wrapper.style.top=`${x}px`,e.wrapper.style.bottom="auto"}else if(h){let w=window.innerWidth/2-c?.realWidth/2;e.wrapper.style.left=`${w}px`,e.wrapper.style.right="auto",e.wrapper.style.bottom="10px",e.wrapper.style.top="auto"}else if(C){let w=Math.min(b,window.innerWidth-c?.realWidth-g.width),x=Ze(o,{elementDimensions:p,popoverDimensions:c,popoverPadding:a,popoverArrowDimensions:g});e.wrapper.style.left=`${w}px`,e.wrapper.style.top=`${x}px`,e.wrapper.style.bottom="auto",e.wrapper.style.right="auto",v="left"}else if(u){let w=Math.min(l,window.innerWidth-c?.realWidth-g.width),x=Ze(o,{elementDimensions:p,popoverDimensions:c,popoverPadding:a,popoverArrowDimensions:g});e.wrapper.style.right=`${w}px`,e.wrapper.style.top=`${x}px`,e.wrapper.style.bottom="auto",e.wrapper.style.left="auto",v="right"}else if(y){let w=Math.min(L,window.innerHeight-c.realHeight-g.width),x=Je(o,{elementDimensions:p,popoverDimensions:c,popoverPadding:a,popoverArrowDimensions:g});e.wrapper.style.top=`${w}px`,e.wrapper.style.left=`${x}px`,e.wrapper.style.bottom="auto",e.wrapper.style.right="auto",v="top"}else if(m){let w=Math.min(d,window.innerHeight-c?.realHeight-g.width),x=Je(o,{elementDimensions:p,popoverDimensions:c,popoverPadding:a,popoverArrowDimensions:g});e.wrapper.style.left=`${x}px`,e.wrapper.style.bottom=`${w}px`,e.wrapper.style.top="auto",e.wrapper.style.right="auto",v="bottom"}on(e,h?"over":v,o,t),[...e.wrapper.classList].filter(w=>w.startsWith("driver-popover-side-")||w.startsWith("driver-popover-align-")).forEach(w=>e.wrapper.classList.remove(w)),e.wrapper.classList.add(`driver-popover-side-${v}`),e.wrapper.classList.add(`driver-popover-align-${o}`)}function et(e,t,n,o,i,r=10){let a=o-n;return e<=n&&t>=o?i==="start"?15+r/2:i==="end"?a-15-r/2:a/2:(Math.min(Math.max(e,n),o)+Math.min(Math.max(t,n),o))/2-n}function tt(e,t,n=10){let o=t-15-n;if(o<15)return Math.max(0,(t-n)/2);let i=e-n/2;return Math.min(Math.max(i,15),o)}function nn(e,t,n){return e==="left"||e==="right"?t.bottom>n.top&&t.top<n.bottom?e:t.bottom<=n.top?"bottom":"top":t.right>n.left&&t.left<n.right?e:t.right<=n.left?"right":"left"}function on(e,t,n,o){let i=e.arrow;if(i.className="driver-popover-arrow",i.style.top="",i.style.right="",i.style.bottom="",i.style.left="",t==="over"){i.classList.add("driver-popover-arrow-none");return}let r=o.getBoundingClientRect(),a=e.wrapper.getBoundingClientRect(),c=nn(t,r,a);i.classList.add(`driver-popover-arrow-side-${c}`);let g=i.getBoundingClientRect().width||10;if(c==="left"||c==="right"){let p=et(r.top,r.bottom,a.top,a.bottom,n,g);i.style.top=`${tt(p,a.height,g)}px`}else{let p=et(r.left,r.right,a.left,a.right,n,g);i.style.left=`${tt(p,a.width,g)}px`}}function oe(e){return typeof e=="function"?e():typeof e=="string"?document.querySelector(e):e}function rn(e){let t=window.getComputedStyle(e);return[t.overflow,t.overflowX,t.overflowY].some(n=>n==="auto"||n==="scroll")}function te(e,t,n,o){return(e/=o/2)<1?n/2*e*e+t:-n/2*(--e*(e-2)-1)+t}function st(e){let t='a[href]:not([disabled]), button:not([disabled]), textarea:not([disabled]), input[type="text"]:not([disabled]), input[type="radio"]:not([disabled]), input[type="checkbox"]:not([disabled]), select:not([disabled])';return e.flatMap(n=>{let o=n.matches(t),i=Array.from(n.querySelectorAll(t));return[...o?[n]:[],...i]}).filter(n=>getComputedStyle(n).pointerEvents!=="none"&&ln(n))}function at(e,t){if(!e||an(e))return;let n=e.offsetHeight>window.innerHeight;e.scrollIntoView({behavior:!t||sn(e)?"auto":"smooth",inline:"center",block:n?"start":"center"})}function sn(e){if(!e||!e.parentElement)return;let t=e.parentElement;return t.scrollHeight>t.clientHeight}function an(e){let t=e.getBoundingClientRect();return t.top>=0&&t.left>=0&&t.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&t.right<=(window.innerWidth||document.documentElement.clientWidth)}function ln(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)}function dn(e){e&&(e.wrapper.style.display="none")}function cn(e,t){let n=un();document.body.appendChild(n.wrapper);let{title:o,description:i,showButtons:r,disableButtons:a,showProgress:c,nextBtnText:g,prevBtnText:p,progressText:L}=t;n.nextButton.innerHTML=g,n.previousButton.innerHTML=p,n.progress.innerHTML=L,t.doneButton&&n.nextButton.classList.add("driver-popover-done-btn"),o?(n.title.innerHTML=o,n.title.style.display="block"):n.title.style.display="none",i?(n.description.innerHTML=i,n.description.style.display="block"):n.description.style.display="none";let y=r.includes("next")||r.includes("previous")||c;n.closeButton.style.display=r.includes("close")?"block":"none",y?(n.footer.style.display="flex",n.progress.style.display=c?"block":"none",n.nextButton.style.display=r.includes("next")?"block":"none",n.previousButton.style.display=r.includes("previous")?"block":"none"):n.footer.style.display="none",a.includes("next")&&(n.nextButton.disabled=!0,n.nextButton.classList.add("driver-popover-btn-disabled")),a.includes("previous")&&(n.previousButton.disabled=!0,n.previousButton.classList.add("driver-popover-btn-disabled")),a.includes("close")&&(n.closeButton.disabled=!0,n.closeButton.classList.add("driver-popover-btn-disabled"));let d=n.wrapper;d.style.display="block",d.style.left="",d.style.top="",d.style.bottom="",d.style.right="",d.id="driver-popover-content",d.setAttribute("role","dialog"),d.setAttribute("aria-labelledby","driver-popover-title"),d.setAttribute("aria-describedby","driver-popover-description");let m=n.arrow;m.className="driver-popover-arrow",d.className=`driver-popover ${t.popoverClass||""}`.trim(),rt(n.wrapper,C=>{let l=C.target;if(l.closest(".driver-popover-next-btn"))return t.onNextClick?.();if(l.closest(".driver-popover-prev-btn"))return t.onPrevClick?.();if(l.closest(".driver-popover-close-btn"))return t.onCloseClick?.()},C=>n.description.contains(C)||n.title.contains(C)?!1:!!C.closest(".driver-popover-prev-btn, .driver-popover-next-btn, .driver-popover-close-btn")),t.onRender?.(n),Ee(n,e,t.position),pn(n,e,t.position),at(d,t.smoothScroll);let b=st([d,e]);return b.length>0&&b[0].focus(),n}function pn(e,t,n){e.wrapper.querySelectorAll("img").forEach(o=>{if(o.complete)return;let i=()=>Ee(e,t,n);o.addEventListener("load",i,{once:!0}),o.addEventListener("error",i,{once:!0})})}function un(){let e=document.createElement("div");e.classList.add("driver-popover");let t=document.createElement("div");t.classList.add("driver-popover-arrow");let n=document.createElement("header");n.id="driver-popover-title",n.classList.add("driver-popover-title"),n.style.display="none",n.innerText="Popover Title";let o=document.createElement("div");o.id="driver-popover-description",o.classList.add("driver-popover-description"),o.style.display="none",o.innerText="Popover description is here";let i=document.createElement("button");i.type="button",i.classList.add("driver-popover-close-btn"),i.setAttribute("aria-label","Close"),i.innerHTML="×";let r=document.createElement("footer");r.classList.add("driver-popover-footer");let a=document.createElement("span");a.classList.add("driver-popover-progress-text"),a.innerText="";let c=document.createElement("span");c.classList.add("driver-popover-navigation-btns");let g=document.createElement("button");g.type="button",g.classList.add("driver-popover-prev-btn","driver-popover-footer-btn"),g.innerHTML="Previous";let p=document.createElement("button");return p.type="button",p.classList.add("driver-popover-next-btn","driver-popover-footer-btn"),p.innerHTML="Next",c.appendChild(g),c.appendChild(p),r.appendChild(a),r.appendChild(c),e.appendChild(i),e.appendChild(t),e.appendChild(n),e.appendChild(o),e.appendChild(r),{wrapper:e,arrow:t,title:n,description:o,footer:r,previousButton:g,nextButton:p,closeButton:i,footerButtons:c,progress:a}}function lt(e){e&&(xe(e.wrapper),e.wrapper.parentElement?.removeChild(e.wrapper))}function dt(e,t){let n=window.innerWidth,o=window.innerHeight,i=t.padding,r=t.radius,a=e.width+i*2,c=e.height+i*2,g=Math.min(r,a/2,c/2),p=Math.floor(Math.max(g,0)),L=e.x-i+p,y=e.y-i,d=a-p*2,m=c-p*2;return`M${n},0L0,0L0,${o}L${n},${o}L${n},0Z | |
| M${L},${y} h${d} a${p},${p} 0 0 1 ${p},${p} v${m} a${p},${p} 0 0 1 -${p},${p} h-${d} a${p},${p} 0 0 1 -${p},-${p} v-${m} a${p},${p} 0 0 1 ${p},-${p} z`}function mn(e,t,n,o,i){let r=e.getState("__activeStagePosition"),a=r||o.getBoundingClientRect(),c=i.getBoundingClientRect();r={x:te(t,a.x,c.x-a.x,n),y:te(t,a.y,c.y-a.y,n),width:te(t,a.width,c.width-a.width,n),height:te(t,a.height,c.height-a.height,n)},pt(e,r),e.setState("__activeStagePosition",r)}function ct(e,t){if(!t)return;let n=t.getBoundingClientRect(),o={x:n.x,y:n.y,width:n.width,height:n.height};e.setState("__activeStagePosition",o),pt(e,o)}function hn(e){let t=e.getState("__activeStagePosition"),n=e.getState("__overlaySvg");if(!t)return;if(!n){console.warn("No stage svg found.");return}let o=window.innerWidth,i=window.innerHeight;n.setAttribute("viewBox",`0 0 ${o} ${i}`)}function gn(e,t){let n=vn(e,t);document.body.appendChild(n),rt(n,o=>{o.target.tagName==="path"&&e.emit("overlayClick")}),e.setState("__overlaySvg",n)}function pt(e,t){let n=e.getState("__overlaySvg");if(!n){gn(e,t);return}let o=n.firstElementChild;if(o?.tagName!=="path")throw Error("no path element found in stage svg");o.setAttribute("d",dt(t,ut(e)))}function ut(e){return{padding:e.getConfig("stagePadding")||0,radius:e.getConfig("stageRadius")||0}}function vn(e,t){let n=window.innerWidth,o=window.innerHeight,i=document.createElementNS("http://www.w3.org/2000/svg","svg");i.classList.add("driver-overlay","driver-overlay-animated"),i.setAttribute("viewBox",`0 0 ${n} ${o}`),i.setAttribute("xmlSpace","preserve"),i.setAttribute("xmlnsXlink","http://www.w3.org/1999/xlink"),i.setAttribute("version","1.1"),i.setAttribute("preserveAspectRatio","xMinYMin slice"),i.style.fillRule="evenodd",i.style.clipRule="evenodd",i.style.strokeLinejoin="round",i.style.strokeMiterlimit="2",i.style.zIndex="10000",i.style.position="fixed",i.style.top="0",i.style.left="0",i.style.width="100%",i.style.height="100%";let r=document.createElementNS("http://www.w3.org/2000/svg","path");return r.setAttribute("d",dt(t,ut(e))),r.style.fill=e.getConfig("overlayColor")||"rgb(0,0,0)",r.style.opacity=`${e.getConfig("overlayOpacity")}`,r.style.pointerEvents="auto",r.style.cursor="auto",i.appendChild(r),i}function fn(e){let t=e.getState("__overlaySvg");t&&(xe(t),t.remove())}var mt="{{current}} of {{total}}";function ht(e,t){return!(t.skipMissingElement??e.getConfig("skipMissingElement"))||!t.element?!1:!oe(t.element)}function _(e,t,n){let o=e.getConfig("steps")||[];for(let i=t;i>=0&&i<o.length;i+=n)if(!ht(e,o[i]))return i}function ne(e,t){let n=e.getState("activeIndex"),o=n!==void 0&&_(e,n+1,1)===void 0,i=t?.popover?.onDoneClick||e.getConfig("onDoneClick");return o&&i?i:t?.popover?.onNextClick||e.getConfig("onNextClick")}function gt(e,t){return t?.popover?.onPrevClick||e.getConfig("onPrevClick")}function wn(e,t){return t?.popover?.onCloseClick||e.getConfig("onCloseClick")}function yn(e,t,n){let o=e.getConfig("steps")||[],i=o[t],r=i.popover||{},a=_(e,t+1,1)!==void 0,c=_(e,t-1,-1)!==void 0,g=r.doneBtnText||e.getConfig("doneBtnText")||"Done",p=e.getConfig("allowClose"),L=r.showProgress===void 0?e.getConfig("showProgress"):r.showProgress,y=(r.progressText||e.getConfig("progressText")||mt).replace("{{current}}",`${t+1}`).replace("{{total}}",`${o.length}`),d=r.showButtons||e.getConfig("showButtons"),m=["next","previous",...p?["close"]:[]].filter(u=>!d?.length||d.includes(u)),b=r.onNextClick||e.getConfig("onNextClick"),C=r.onPrevClick||e.getConfig("onPrevClick"),l=r.onCloseClick||e.getConfig("onCloseClick");return{...i,popover:{showButtons:m,nextBtnText:a?void 0:g,disableButtons:[...c?[]:["previous"]],showProgress:L,onNextClick:b||n.onNextClick,onPrevClick:C||n.onPrevClick,onCloseClick:l||n.onCloseClick,...r,progressText:y}}}function vt(e,t,n){let o=e.getConfig("stagePadding")||0;return{side:n.popover?.side||"bottom",align:n.popover?.align||"start",offset:o+(e.getConfig("popoverOffset")||0),padding:o,centered:t.id==="driver-dummy-element"}}function bn(e,t,n){let o=n.popover||{},i=e.getState("activeIndex"),r=i!==void 0&&_(e,i+1,1)===void 0;return{title:o.title,description:o.description,showButtons:o.showButtons||e.getConfig("showButtons"),disableButtons:o.disableButtons||e.getConfig("disableButtons")||[],showProgress:o.showProgress||e.getConfig("showProgress")||!1,progressText:o.progressText??(e.getConfig("progressText")||mt),nextBtnText:o.nextBtnText??(e.getConfig("nextBtnText")||"Next"),prevBtnText:o.prevBtnText??(e.getConfig("prevBtnText")||"Previous"),doneButton:r,popoverClass:o.popoverClass||e.getConfig("popoverClass")||"",smoothScroll:e.getConfig("smoothScroll"),onNextClick:()=>{let a=ne(e,n);return a?a(t,n,e.getHookOpts()):e.emit("nextClick")},onPrevClick:()=>{let a=gt(e,n);return a?a(t,n,e.getHookOpts()):e.emit("prevClick")},onCloseClick:()=>{let a=wn(e,n);return a?a(t,n,e.getHookOpts()):e.emit("closeClick")},onRender:a=>{e.setState("popover",a),(o.onPopoverRender||e.getConfig("onPopoverRender"))?.(a,e.getHookOpts())},position:vt(e,t,n)}}function nt(e,t,n){lt(e.getState("popover")),cn(t,bn(e,t,n))}function Cn(e,t,n){let o=e.getState("popover");o&&Ee(o,t,vt(e,t,n))}function kn(){let e=document.getElementById("driver-dummy-element");if(e)return e;let t=document.createElement("div");return t.id="driver-dummy-element",t.style.width="0",t.style.height="0",t.style.pointerEvents="none",t.style.opacity="0",t.style.position="fixed",t.style.top="50%",t.style.left="50%",document.body.appendChild(t),t}function ot(e,t){let n=oe(t.element);n||(n=kn()),xn(e,n,t)}function Sn(e){let t=e.getState("__activeElement"),n=e.getState("__activeStep");t&&(ct(e,t),hn(e),Cn(e,t,n))}function xn(e,t,n){let o=e.getConfig("duration")||400,i=Date.now(),r=e.getState("__activeStep"),a=e.getState("__activeElement")||t,c=!a||a===t,g=t.id==="driver-dummy-element",p=a.id==="driver-dummy-element",L=e.getConfig("animate"),y=n.onHighlightStarted||e.getConfig("onHighlightStarted"),d=n?.onHighlighted||e.getConfig("onHighlighted"),m=r?.onDeselected||e.getConfig("onDeselected"),b=e.getHookOpts();!c&&m&&m(p?void 0:a,r,b),y&&y(g?void 0:t,n,b);let C=!c&&L,l=!1;dn(e.getState("popover")),e.setState("previousStep",r),e.setState("previousElement",a),e.setState("activeStep",n),e.setState("activeElement",t);let u=()=>{if(e.getState("__transitionCallback")!==u)return;let v=Date.now()-i,w=o-v<=o/2;n.popover&&w&&!l&&C&&(nt(e,t,n),l=!0),e.getConfig("animate")&&v<o?mn(e,v,o,a,t):(ct(e,t),d&&d(g?void 0:t,n,e.getHookOpts()),e.setState("__transitionCallback",void 0),e.setState("__previousStep",r),e.setState("__previousElement",a),e.setState("__activeStep",n),e.setState("__activeElement",t)),window.requestAnimationFrame(u)};e.setState("__transitionCallback",u),window.requestAnimationFrame(u),at(t,e.getConfig("smoothScroll")),!C&&n.popover&&nt(e,t,n),document.querySelectorAll(".driver-active-element-parent").forEach(v=>{v.classList.remove("driver-active-element-parent","driver-active-element-parent-no-scroll")}),a.classList.remove("driver-active-element","driver-no-interaction"),a.removeAttribute("aria-haspopup"),a.removeAttribute("aria-expanded"),a.removeAttribute("aria-controls"),(n.disableActiveInteraction??e.getConfig("disableActiveInteraction"))&&t.classList.add("driver-no-interaction");let h=t.parentElement;h&&h!==document.body&&(h.classList.add("driver-active-element-parent"),rn(h)&&h.classList.add("driver-active-element-parent-no-scroll")),t.classList.add("driver-active-element"),t.setAttribute("aria-haspopup","dialog"),t.setAttribute("aria-expanded","true"),t.setAttribute("aria-controls","driver-popover-content")}function En(){document.getElementById("driver-dummy-element")?.remove(),document.querySelectorAll(".driver-active-element").forEach(e=>{let t=e.parentElement;t&&t!==document.body&&t.classList.remove("driver-active-element-parent","driver-active-element-parent-no-scroll"),e.classList.remove("driver-active-element","driver-no-interaction"),e.removeAttribute("aria-haspopup"),e.removeAttribute("aria-expanded"),e.removeAttribute("aria-controls")})}function Se(e){let t=e.getState("__resizeTimeout");t&&window.cancelAnimationFrame(t),e.setState("__resizeTimeout",window.requestAnimationFrame(()=>Sn(e)))}function Ln(e,t){if(!e.getState("isInitialized")||!(t.key==="Tab"||t.keyCode===9))return;let n=e.getState("__activeElement"),o=e.getState("popover")?.wrapper,i=st([...o?[o]:[],...n?[n]:[]]),r=i[0],a=i[i.length-1];t.preventDefault(),t.shiftKey?(i[i.indexOf(document.activeElement)-1]||a)?.focus():(i[i.indexOf(document.activeElement)+1]||r)?.focus()}function Mn(e,t){(e.getConfig("allowKeyboardControl")??!0)&&(t.key==="Escape"?e.emit("escapePress"):t.key==="ArrowRight"?e.emit("arrowRightPress"):t.key==="ArrowLeft"&&e.emit("arrowLeftPress"))}function Tn(e,t){let n=e.getState("__activeElement"),o=t.target;!n||!o||!n.contains(o)||e.emit("activeElementClick")}function An(e){let t=a=>Mn(e,a),n=a=>Ln(e,a),o=()=>Se(e),i=()=>Se(e),r=a=>Tn(e,a);e.setState("__events",{onKeyup:t,onKeydown:n,onResize:o,onScroll:i,onClick:r}),window.addEventListener("keyup",t,!1),window.addEventListener("keydown",n,!1),window.addEventListener("resize",o),window.addEventListener("scroll",i),document.addEventListener("click",r,!1)}function Pn(e){let t=e.getState("__events");t&&(window.removeEventListener("keyup",t.onKeyup),window.removeEventListener("keydown",t.onKeydown),window.removeEventListener("resize",t.onResize),window.removeEventListener("scroll",t.onScroll),document.removeEventListener("click",t.onClick,!1))}function Hn(){let e={};function t(n={}){e={animate:!0,duration:400,allowClose:!0,allowScroll:!0,overlayClickBehavior:"close",overlayOpacity:.7,smoothScroll:!1,disableActiveInteraction:!1,advanceOnClick:!1,skipMissingElement:!1,waitForElement:0,showProgress:!1,stagePadding:10,stageRadius:5,popoverOffset:10,showButtons:["next","previous","close"],disableButtons:[],overlayColor:"#000",...n}}return t(),{getConfig:(n=>n?e[n]:e),configure:t}}function In(){let e={},t=(i=>i?e[i]:e),n=(i,r)=>{e[i]=r};function o(){e={}}return{getState:t,setState:n,resetState:o}}function _n(){let e={};function t(i,r){e[i]=r}function n(i){e[i]?.()}function o(){e={}}return{listen:t,emit:n,reset:o}}function Bn(e={}){let t=Hn();t.configure(e);let n=In(),o=_n(),i;return{getConfig:t.getConfig,setConfig:t.configure,getState:n.getState,setState:n.setState,resetState:n.resetState,listen:o.listen,emit:o.emit,resetEmitter:o.reset,getDriver:()=>i,setDriver:r=>{i=r},getHookOpts:r=>{let a=r||n.getState();return{config:t.getConfig(),state:a,driver:i,index:a.activeIndex}}}}function Le(e={}){let t=Bn(e);function n(){t.getConfig("allowClose")&&b()}function o(){let l=t.getConfig("overlayClickBehavior");if(t.getConfig("allowClose")&&l==="close"){b();return}if(typeof l=="function"){let u=t.getState("__activeStep");l(t.getState("__activeElement"),u,t.getHookOpts());return}if(l==="nextStep"){let u=t.getState("activeStep"),h=t.getState("activeElement"),v=ne(t,u);if(v){v(h,u,t.getHookOpts());return}i()}}function i(){let l=t.getState("activeIndex"),u=t.getConfig("steps")||[];if(l===void 0)return;let h=l+1;u[h]?m(h):b()}function r(){let l=t.getState("activeIndex"),u=t.getConfig("steps")||[];if(l===void 0)return;let h=l-1;u[h]?m(h):b()}function a(l){(t.getConfig("steps")||[])[l]?m(l):b()}function c(){if(t.getState("__transitionCallback"))return;let l=t.getState("__activeStep");if(!l||!(l.advanceOnClick??t.getConfig("advanceOnClick")))return;let u=t.getState("__activeElement"),h=ne(t,l);if(h){h(u,l,t.getHookOpts());return}i()}function g(){if(t.getState("__transitionCallback"))return;let l=t.getState("activeIndex"),u=t.getState("__activeStep"),h=t.getState("__activeElement");if(l===void 0||u===void 0||!(t.getConfig("steps")||[])[l-1])return;let v=gt(t,u);if(v)return v(h,u,t.getHookOpts());r()}function p(){if(t.getState("__transitionCallback"))return;let l=t.getState("activeIndex"),u=t.getState("__activeStep"),h=t.getState("__activeElement");if(l===void 0||u===void 0)return;let v=ne(t,u);if(v)return v(h,u,t.getHookOpts());i()}function L(){t.getState("isInitialized")||(t.setState("isInitialized",!0),document.body.classList.add("driver-active",t.getConfig("animate")?"driver-fade":"driver-simple"),t.getConfig("allowScroll")||document.body.classList.add("driver-no-scroll"),document.body.style.setProperty("--driver-animation-duration",`${t.getConfig("duration")||400}ms`),An(t),t.listen("overlayClick",o),t.listen("activeElementClick",c),t.listen("escapePress",n),t.listen("closeClick",n),t.listen("arrowLeftPress",g),t.listen("arrowRightPress",p))}function y(){let l=t.getState("__pendingWaitCancel");l&&(t.setState("__pendingWaitCancel",void 0),l())}function d(l,u,h){let v=()=>{w.disconnect(),window.clearTimeout(x),t.setState("__pendingWaitCancel",void 0),h()},w=new MutationObserver(()=>{oe(l.element)&&v()}),x=window.setTimeout(v,u);t.setState("__pendingWaitCancel",()=>{w.disconnect(),window.clearTimeout(x)}),w.observe(document.documentElement,{childList:!0,subtree:!0,attributes:!0})}function m(l=0,u=!1){y();let h=t.getConfig("steps");if(!h){console.error("No steps to drive through"),b();return}if(!h[l]){b();return}let v=h[l],w=v.waitForElement??t.getConfig("waitForElement")??0;if(!u&&w>0&&v.element&&!oe(v.element)){d(v,w,()=>m(l,!0));return}if(ht(t,v)){let Z=t.getState("activeIndex"),Y=typeof Z=="number"&&l<Z?-1:1;h[l+Y]?m(l+Y):Y===1&&b();return}t.setState("__activeOnDestroyed",document.activeElement),t.setState("activeIndex",l);let x=h[l+1];ot(t,yn(t,l,{onNextClick:()=>{x?m(l+1):b()},onPrevClick:()=>{m(l-1)},onCloseClick:()=>{b()}}))}function b(l=!0){let u=t.getState("__activeElement"),h=t.getState("__activeStep"),v=t.getState("__activeOnDestroyed"),w=t.getConfig("onDestroyStarted");if(l&&w){w(!u||u?.id==="driver-dummy-element"?void 0:u,h,t.getHookOpts());return}let x=h?.onDeselected||t.getConfig("onDeselected"),Z=t.getConfig("onDestroyed");document.body.classList.remove("driver-active","driver-fade","driver-simple","driver-no-scroll"),document.body.style.removeProperty("--driver-animation-duration"),y(),Pn(t),lt(t.getState("popover")),En(),fn(t),t.resetEmitter();let Y=t.getState();if(t.resetState(),u&&h){let Qe=u.id==="driver-dummy-element";x&&x(Qe?void 0:u,h,t.getHookOpts(Y)),Z&&Z(Qe?void 0:u,h,t.getHookOpts(Y))}v&&v.focus()}let C={isActive:()=>t.getState("isInitialized")||!1,refresh:()=>Se(t),drive:(l=0)=>{L(),m(l)},setConfig:t.setConfig,setSteps:l=>{y(),t.resetState(),t.setConfig({...t.getConfig(),steps:l})},getConfig:t.getConfig,getState:t.getState,getActiveIndex:()=>t.getState("activeIndex"),isFirstStep:()=>{let l=t.getState("activeIndex");return l!==void 0&&_(t,l-1,-1)===void 0},isLastStep:()=>{let l=t.getState("activeIndex");return l!==void 0&&_(t,l+1,1)===void 0},getActiveStep:()=>t.getState("activeStep"),getActiveElement:()=>t.getState("activeElement"),getPreviousElement:()=>t.getState("previousElement"),getPreviousStep:()=>t.getState("previousStep"),getNextStep:()=>{let l=t.getConfig("steps")||[],u=t.getState("activeIndex");if(u===void 0)return;let h=_(t,u+1,1);return h===void 0?void 0:l[h]},moveNext:i,movePrevious:r,moveTo:a,hasNextStep:()=>{let l=t.getState("activeIndex");return l!==void 0&&_(t,l+1,1)!==void 0},hasPreviousStep:()=>{let l=t.getState("activeIndex");return l!==void 0&&_(t,l-1,-1)!==void 0},highlight:l=>{L(),ot(t,{...l,popover:l.popover?{showButtons:[],showProgress:!1,progressText:"",...l.popover}:void 0})},destroy:()=>{b(!1)}};return t.setDriver(C),C}var ft="amp-workbench-tour-seen",wt="amp-workbench-inside-tour-seen";function yt(e){try{return localStorage.getItem(e)==="1"}catch{return!1}}function bt(e){try{localStorage.setItem(e,"1")}catch{}}var Ct=()=>yt(ft),$n=()=>!document.getElementById("listen")?.hidden,kt=()=>yt(wt),Dn=()=>bt(ft);function ie(e){return t=>{let n=document.createElement("button");n.textContent="End tour",n.className="tour-end",n.onclick=()=>e.destroy(),t.footerButtons.prepend(n)}}var Me="<b><i>AMP Tadpole</i></b>";function Te(e){let t=()=>e.objects().includes(e.traced())?e.traced():e.objects()[0]??"teal star",n=async i=>{e.reset(),e.setBackend(i),e.setText(`pick up the ${t()} then return home`),e.play(),await e.wait("done"),o.isActive()&&o.moveNext()},o=Le({showProgress:!0,allowClose:!0,overlayOpacity:.55,popoverClass:"amp-tour",onDestroyed:Dn,steps:[{element:"#main",popover:{title:"A robot arm, in your browser",description:"A six-joint arm and four shapes. Everything here is simulated and drawn on your computer: drag the picture to look around."}},{element:"#strip",popover:{title:"What the model sees",description:"A model gets only these three camera pictures, the arm's seven joint numbers and one instruction. It is never told where the shapes are: it has to find them in the pictures. It answers with the arm's next eight moves."}},{element:".backend",popover:{title:"The Teacher",description:"The Teacher is a scripted controller, not AI. It knows where everything is, and it makes the examples the model learns from."}},{element:".command",popover:{title:"Press Play",description:"Watch the Teacher pick up a shape and go home.",nextBtnText:"Play \u25B6"}},{element:"#main",onHighlighted:()=>{n("Teacher")},popover:{title:"The Teacher is driving\u2026",description:"Watch it pick up the shape and take the arm home. The next tip comes when it has finished.",showButtons:["close"]}},{element:"#main",popover:{title:"Now let AI drive!",description:`${Me} is a small AI model from Adaptive Machine Patterns: a vision-language-action model, 6.5 million parameters, that learned to drive this arm only from the Teacher's examples. It runs here in your browser. It gets the same three camera pictures and the same words, but nobody tells it where the shapes are: it has to see them.`,nextBtnText:"Let AI drive \u25B6"}},{element:"#main",onHighlighted:()=>{n("AMP Tadpole")},popover:{title:"AMP Tadpole is driving\u2026",description:`Same scene, same words: ${Me} is working out every move from the pictures. The next tip comes when it has finished.`,showButtons:["close"]}},{element:"#hints",popover:{title:"Your turn",description:"Type an instruction, or build one with these buttons. Chain commands with \u201Cthen\u201D: <i>move to the midpoint between two shapes then open the gripper</i>. New scene gives you shapes and places the model has never seen.",onPopoverRender:i=>ie(o)(i)}},...$n()?[{element:".voice-wrap",popover:{title:"Or just say it",description:"Press <b>Listen</b>, then hold Space (or the Hold to talk button) and speak your command; let go and it is typed for you. Start with \u201Cthen \u2026\u201D to add to the command already there. <b>Read</b> says the command aloud. The first time, Listen fetches a speech model (about 47 MB); what you say is recognised on your computer and never leaves the page.",onPopoverRender:i=>ie(o)(i)}}]:[],{element:"#tab-inside",popover:{title:"The Model Viewer",description:`See ${Me} at work, layer by layer: what each part of it does with the pictures and the words.`,nextBtnText:"Take a look \u25B6",onPopoverRender:i=>ie(o)(i),onNextClick:()=>{o.destroy(),e.showInside()}}}]});o.drive()}function Ae(e){let t=Le({showProgress:!0,allowClose:!0,overlayOpacity:.55,popoverClass:"amp-tour",onDestroyed:()=>bt(wt),steps:[{element:"#v-main",popover:{title:"AMP Tadpole as a \u201Cbuilding\u201D",description:"This is AMP Tadpole, the AI that just drove the arm, drawn as a <i>\u201Cbuilding\u201D</i>. Every layer of the model is a storey. The camera pictures lie on the ground, the words and the arm's state stand beside them, and the arm's next moves come out at the top. Each square of the floor is one token, and keeps its place all the way up. Drag to turn it, scroll to zoom."}},{element:".v-scene-label",popover:{side:"bottom",align:"end",title:"Real runs, prepared ahead",description:"Each scene is one real run of AMP Tadpole, recorded layer by layer: the scene you start on in the Robot tab, and four scenes it never saw in training."}},{element:".v-stage .cam-bar",popover:{side:"right",align:"start",title:"Blocks and glow",description:"Blocks show what the model is made of; the colour is the kind of layer. Glow shows the calculation itself: in Token delta, each token's square lights by how much that storey changed it."}},{element:".v-bar",popover:{title:"Watch it think",description:"Play runs the calculation from the ground to the top. Drag the handle to stop at any storey.",nextBtnText:"Play \u25B6"}},{element:"#v-main",onHighlighted:async()=>{e.glowAndPlay(),await e.played(),t.isActive()&&t.moveNext()},popover:{title:"Thinking\u2026",description:"Each storey lights up as AMP Tadpole computes it, from the camera pictures on the ground to its answer at the top: the arm's next eight moves. The next tip comes when it has finished.",showButtons:["close"]}},{element:"#v-side-wrap",popover:{side:"left",align:"end",onPopoverRender:n=>ie(t)(n),title:"Click any block",description:"The side panel says what a block is, how many parameters it has and where it sits in the code. Click a cell on a transformer storey to see what that token reads; the plates at the side show who reads whom."}}]});t.drive()}var St=` | |
| <p>The AMP Embodied AI Workbench Demo is made by | |
| <a href="https://adaptive-machine-patterns.com" target="_blank" rel="noopener">Adaptive Machine Patterns Ltd</a> | |
| and runs entirely in your browser. It is built on:</p> | |
| <ul> | |
| <li><b>AMP Toy Robotics Benchmark</b>, Adaptive Machine Patterns Ltd (Apache-2.0). Object colours: ColorBrewer Set2, Cynthia A. Brewer, Pennsylvania State University (Apache-2.0).</li> | |
| <li><b>AMP Tadpole</b>, Adaptive Machine Patterns Ltd (CC BY-NC 4.0; commercial licences from AMP). Its token ids come from the tokenizer of SmolVLM2 (Hugging Face, Apache-2.0).</li> | |
| <li><b>Pyodide</b> (MPL-2.0), with <b>CPython</b> (PSF License), <b>NumPy</b> (BSD-3-Clause) and <b>Pillow</b> (MIT-CMU).</li> | |
| <li><b>ONNX Runtime Web</b>, Microsoft (MIT).</li> | |
| <li><b>driver.js</b>, Kamran Ahmed (MIT), for the tour.</li> | |
| <li><b>vosk-browser</b>, Ciaran O'Reilly (Apache-2.0), for Listen. It contains the <b>Vosk API</b> (Alpha Cephei Inc), <b>Kaldi</b> | |
| and <b>OpenFst</b> (Apache-2.0), <b>CLAPACK</b> (BSD) with clapack-wasm (INRIA, Apache-2.0), <b>zlib</b> (zlib License), | |
| <b>libarchive</b> (BSD-2-Clause) and <b>Emscripten</b>/<b>musl</b> (MIT).</li> | |
| <li><b>vosk-model-small-en-us-0.15</b>, Alpha Cephei Inc (Apache-2.0), the speech model Listen downloads on first use.</li> | |
| <li>The model previews are pictures of traces made by AMP of <b>SmolVLA</b> (Hugging Face, Apache-2.0), | |
| <b>NVIDIA Cosmos3-Edge</b> (NVIDIA Corporation, <a href="https://openmdw.ai/license/1-1/" target="_blank" rel="noopener">OpenMDW-1.1</a>, | |
| <a href="https://huggingface.co/nvidia/Cosmos3-Edge" target="_blank" rel="noopener">huggingface.co/nvidia/Cosmos3-Edge</a>) | |
| and <b>VLA-Adapter</b> (OpenHelix, MIT). No part of these models is included in the Demo.</li> | |
| </ul> | |
| <p>Their licence texts are in <a href="THIRD_PARTY_LICENSES.txt" target="_blank">THIRD_PARTY_LICENSES.txt</a>.</p> | |
| <p>SmolVLA and Hugging Face are trademarks of Hugging Face, Inc.; NVIDIA and Cosmos are trademarks of NVIDIA Corporation. | |
| Other names are trademarks of their owners. Their mention here implies no endorsement.</p> | |
| <p>© 2026 Adaptive Machine Patterns Ltd, registered in England & Wales, no. 15618869. | |
| The Demo is free to use; it is provided as is, without warranty of any kind.</p> | |
| `;var f=e=>document.getElementById(e),J=window,N,B=[],Mt="",O=!1,F=!1,$=[],re,se=!1,W={},He=[],xt=new Set(["orbit","slide","zoom","progress","spread"]),Tt=()=>f("v-main"),Rn=()=>f("v-side");function At(){return Math.round(Math.min(380,f("v-side-wrap").clientWidth||380))}function Ie(){let e=f("v-stage").clientWidth-16,t=Math.max(300,Math.min(900,e));return[t,Math.round(Math.min(720,t*.8))]}function k(e,t,n){if(!O)return;let o=$[$.length-1];o&&o.op===e&&e==="zoom"&&n==="pinch"&&o.b==="pinch"?o.a*=t:o&&o.op===e&&xt.has(e)?(o.a=t,o.b=n):$.push({op:e,a:t,b:n}),(xt.has(e)||e==="key")&&(clearTimeout(re),re=window.setTimeout(()=>{re=void 0,k("draw")},160)),Pe()}J.viewerIdle=()=>O&&!F&&!$.length&&re===void 0;function Pe(){if(F||!$.length)return;F=!0;let e=$.shift();N.send({type:"viewer",...e,sideW:At()})}function Et(e,t,n,o){(e.width!==n||e.height!==o)&&(e.width=n,e.height=o),e.getContext("2d").putImageData(new ImageData(new Uint8ClampedArray(t.buffer,t.byteOffset,n*o*4),n,o),0,0)}function Lt(e){W=e,f("v-progress").value=String(e.progress),f("v-percent").textContent=e.progress>=99.5?"done":`${Math.round(e.progress)}%`,f("v-play").textContent=e.playing?"\u25A0 Stop":"\u25B6 Play",f("v-caption").textContent=e.caption||"",document.querySelectorAll("#v-modes button").forEach(n=>n.classList.toggle("on",n.dataset.mode===e.mode));let t=He.find(n=>n.id===e.what);t&&(f("v-what-label").textContent=t.label),f("v-what-list").querySelectorAll("li").forEach(n=>n.setAttribute("aria-selected",String(n.dataset.id===e.what)))}function Wn(){f("v-what-list").replaceChildren(...He.map(t=>{let n=document.createElement("li"),o=!!t.needs&&!N.has(t.needs);return n.setAttribute("role","option"),n.dataset.id=t.id,o&&(n.className="pro-item",n.dataset.pro=t.needs),n.setAttribute("aria-selected",String(t.id===W.what)),n.innerHTML=`<span>${t.label}<span class="note">${t.note}</span></span>`+(o?'<span class="badge pro">Pro</span>':""),n.tabIndex=0,n.onclick=()=>{ae(!1),o?N.pro(t.needs):k("what",t.id)},n.onkeydown=i=>{(i.key==="Enter"||i.key===" ")&&(i.preventDefault(),n.click()),i.key==="ArrowDown"&&(i.preventDefault(),n.nextElementSibling?.focus()),i.key==="ArrowUp"&&(i.preventDefault(),n.previousElementSibling?.focus()),i.key==="Escape"&&(ae(!1),f("v-what").focus())},n}))}function ae(e){let t=f("v-what-list"),n=e??t.hidden;t.hidden=!n,f("v-what").setAttribute("aria-expanded",String(n)),n&&t.querySelector('[aria-selected="true"]')?.focus()}function Pt(e){switch(e.type){case"viewer-progress":return f("v-loading-step").textContent=e.total?`Downloading ${(e.got/1e6).toFixed(0)} of ${(e.total/1e6).toFixed(0)} MB`:`${(e.got/1e6).toFixed(0)} MB`,f("v-loading-bar").style.width=e.total?`${100*e.got/e.total}%`:"50%",!0;case"viewer-loaded":return O=!0,f("v-loading").hidden=!0,He=e.info.choices,Wn(),J.events?.push({type:"viewer-loaded",scene:e.scene}),N.loaded?.()&&(se=!1),It(),!0;case"viewer-frame":return F=!1,Et(Tt(),e.img,e.w,e.h),e.side&&Et(Rn(),e.side,e.sideW,e.sideH),Lt(e.status),J.viewerFrames=(J.viewerFrames??0)+1,J.lastViewer={ms:e.ms,draft:e.draft,status:e.status,at:performance.now()},Pe(),!0;case"viewer-status":return F=!1,Lt(e.status),Pe(),!0}return!1}function Ht(e,t=!1){let n=B.find(r=>r.name===e);t&&n&&N.moment?.(n.seed,n.play??n.text),Mt=e,se=!0,O=!1,$=[],F=!1,f("v-loading").hidden=!1,f("v-loading-step").textContent="",f("v-loading-bar").style.width="0%";let[o,i]=Ie();N.send({type:"viewer-load",scene:e,w:o,h:i,sideW:At()})}function It(){!se||!O||f("view-inside").hidden||(se=!1,W.playing||k("play"))}function _e(){k("mode","glow"),W.playing||k("play")}function Be(){return new Promise(e=>{let t=!1,n=performance.now(),o=setInterval(()=>{W.playing&&(t=!0),(t&&!W.playing&&W.progress>=100&&!F&&!$.length||performance.now()-n>12e4)&&(clearInterval(o),e())},200)})}var $e=()=>B[0];function De(){!Mt&&B.length?Ht(B[0].name):O&&(k("resize",...Ie()),It())}async function _t(e){N=e,B=await(await fetch("traces/scenes.json")).json();let t=B.length-1;e.phone&&(B=B.slice(0,1)),f("v-phone-note").hidden=!e.phone||t<=0,f("v-phone-note").textContent=`${t} more scenes on a desktop screen.`;let n=f("v-scene");n.replaceChildren(...B.map(d=>{let m=document.createElement("option");return m.value=d.name,m.textContent=`\u201C${d.text}\u201D (scene ${d.seed})`,m})),n.onchange=()=>Ht(n.value,!0);let o=Tt(),i=!1,r=0,a=new Map,c=0,g=()=>{let[d,m]=[...a.values()];return Math.hypot(d[0]-m[0],d[1]-m[1])},p=d=>{let m=o.getBoundingClientRect();return[(d.clientX-m.left)*(o.width/m.width),(d.clientY-m.top)*(o.height/m.height)]};o.addEventListener("pointerdown",d=>{if(a.set(d.pointerId,[d.clientX,d.clientY]),a.size===2){c=g();return}a.size>2||(i=!0,r=d.button,o.setPointerCapture(d.pointerId),k("press",...p(d)))}),o.addEventListener("pointermove",d=>{if(a.has(d.pointerId)&&a.set(d.pointerId,[d.clientX,d.clientY]),a.size===2){let m=g();c>0&&Math.abs(m/c-1)>.04&&(k("zoom",m/c,"pinch"),c=m);return}i&&c===0&&k(r===0&&!d.shiftKey?"orbit":"slide",...p(d))});let L=d=>{a.delete(d.pointerId),!(a.size>=1&&c>0)&&(i&&(i=!1,k("release",...p(d))),a.size===0&&(c=0))};o.addEventListener("pointerup",L),o.addEventListener("pointercancel",L),o.addEventListener("contextmenu",d=>d.preventDefault()),o.addEventListener("wheel",d=>{d.preventDefault(),k("zoom",d.deltaY<0?1.1:1/1.1)},{passive:!1}),o.addEventListener("keydown",d=>{let m=d.key;["w","a","s","d","q","e","W","A","S","D","Q","E","+","=","-","r","R","g","G","v","V"," ","Escape","ArrowLeft","ArrowRight","ArrowUp","ArrowDown"].includes(m)&&(d.preventDefault(),k("key",m))}),document.querySelectorAll("#v-modes button").forEach(d=>d.onclick=()=>k("mode",d.dataset.mode)),f("v-what").onclick=()=>ae(),document.addEventListener("click",d=>{d.target.closest(".glow-pick")||ae(!1)}),f("v-play").onclick=()=>k("play"),f("v-reset").onclick=()=>k("reset"),f("v-progress").oninput=d=>k("progress",+d.target.value),f("v-spread").oninput=d=>k("spread",+d.target.value),f("v-keys-toggle").onclick=()=>f("v-keys").classList.toggle("folded");let y;window.addEventListener("resize",()=>{clearTimeout(y),y=window.setTimeout(()=>{O&&!f("view-inside").hidden&&k("resize",...Ie())},200)})}var s=e=>document.getElementById(e),T=window;T.events=[];var Ve=new URLSearchParams(location.search),K=Ve.get("phone")==="1"||matchMedia("(max-width: 700px)").matches;document.documentElement.classList.toggle("phone",K);Ve.get("phone")!=="1"&&matchMedia("(max-width: 700px)").addEventListener("change",e=>document.documentElement.classList.toggle("phone",e.matches));var A=await(await fetch("features.json")).json();{let e=A.sizes,t=c=>`about ${Math.round(c)} MB`;s("gate-start").textContent=t(e.start_mb),s("gate-inside").textContent=t(K?e.phone_scene_mb:e.scene_mb),s("gate-phone").hidden=!K,s("loading-size").textContent=`The first visit downloads ${t(e.start_mb)}; after that your browser keeps a copy.`;let n="amp-workbench-start-ok",o=!1;try{o=localStorage.getItem(n)==="1"}catch{}let i=navigator.connection,r=!!i&&(i.saveData||i.type==="cellular");if((K||matchMedia("(orientation: portrait), (max-width: 820px)").matches||r)&&!o){s("gate").hidden=!1,s("loading-run").hidden=!0,await new Promise(c=>s("gate-start-btn").onclick=()=>c());try{localStorage.setItem(n,"1")}catch{}s("gate").hidden=!0,s("loading-run").hidden=!1}}var Ue=new Worker(new URL("./robot.js",import.meta.url),{type:"module"}),Wt=new Worker(new URL("./model.js",import.meta.url),{type:"module"}),de=new MessageChannel;Wt.postMessage({type:"port",port:de.port1},[de.port1]);var H=e=>Ue.postMessage(e);Wt.onmessage=e=>{let t=e.data;t.type!=="progress"||ve||(s("backend-label").textContent=Q==="Teacher"?"Teacher":Q,s("model-progress").textContent=`Loading AMP Tadpole\u2026 ${Math.round(100*t.got/t.total)}%`)};T.send=H;var G=new Set,ve=!1,Q="Teacher",D=!1,Nt=0,q=[],Bt={main:s("main").getContext("2d"),top:s("cam-top").getContext("2d"),side:s("cam-side").getContext("2d"),iso:s("cam-iso").getContext("2d")};function $t(e,t,n){e.putImageData(new ImageData(new Uint8ClampedArray(t.buffer,t.byteOffset,n*n*4),n,n),0,0)}function Nn(e){$t(Bt.main,e.main,e.size),e.camera&&(Un(),T.cameraFrames=(T.cameraFrames??0)+1,T.lastCameraAt=performance.now()),e.strip&&["top","side","iso"].forEach((n,o)=>$t(Bt[n],e.strip[o],e.stripSize)),s("status").textContent=e.info.status;let t=e.info.frames?100*(e.info.idx+1)/e.info.frames:0;s("progress-bar").style.width=`${Math.min(100,t)}%`,T.lastFrame={ms:e.ms,info:e.info}}function M(e,t=""){let n=document.createElement("li");n.textContent=e,t&&(n.className=t);let o=s("log");for(o.prepend(n);o.children.length>40;)o.lastElementChild.remove()}Ue.onmessage=e=>{let t=e.data;if(t.type==="frame")return Nn(t);if(!(t.type.startsWith("viewer")&&Pt(t)))switch(T.events.push(t),t.type){case"python-ready":s("loading-text").textContent="Loading AMP Tadpole\u2026",s("loading-bar").style.width="80%",s("loading").hidden=!0,s("play").disabled=!1,we();break;case"ready":G=new Set(t.capabilities),ve=!0,s("model-progress").textContent="",Ye(),qt(),qn(),_t({send:H,has:n=>G.has(n),pro:n=>jn(n),loaded:en,phone:K,moment:On}).then(()=>{let n=$e();n&&!S.value&&I(Ne(n.play??n.text)),s("view-inside").hidden||De()}),M(t.timings?.model?`AMP Tadpole ready (${t.timings.model.provider==="webgpu"?"GPU":"CPU"})`:"Ready","dim"),Ct()||Te(Ft);break;case"started":t.clauses.length>1&&M("chained: "+t.clauses.join(" \u2192 "),"dim"),M(`\u2699 ${t.backend}\u2026`,"dim");break;case"done":D=!1,R(!1);for(let n of(t.log||[]).slice(-3))M(n);break;case"hints":t.id===Nt&&Vn(t.hints);break;case"composed":I(t.text);break;case"refused":D=!1,R(!1),M(t.message,"err");break;case"skipped":M(t.message,"warn");break;case"error":ue=!1,D=!1,R(!1),M("\u2717 "+t.message,"err");break}};function Fn(e){return new Promise(t=>{let n=T.events.length,o=setInterval(()=>{let i=T.events.slice(n).find(r=>r.type===e||r.type==="error");i&&(clearInterval(o),t(i))},100)})}function On(e,t){H({type:"reset",seed:e}),D=!1,R(!1),Ke("AMP Tadpole"),I(Ne(t)),M(`From the Model Viewer: scene ${e.toLocaleString("en-GB")}, \u201C${Ne(t)}\u201D, AMP Tadpole`,"dim")}var Ne=e=>e.slice(0,1).toLowerCase()+e.slice(1),Ft={setBackend:Ke,setText:I,play:Xe,wait:Fn,objects:()=>q,traced:()=>($e()?.text??"").replace(/^pick up the /i,""),reset:()=>H({type:"reset"}),showInside:()=>{Fe=!0,s("tab-inside").click(),Ot&&en()}},Fe=!1,Ot=!1;s("loading-bar").style.width="15%";document.querySelectorAll("a.about-link").forEach(e=>{e.href=zt(e.dataset.place,"home"in e.dataset)});Ye();qt();Ue.postMessage({type:"init",port:de.port2,provider:Ve.get("provider")||"auto"},[de.port2]);function zt(e,t=!1){let n=new URL(t?A.contact.home:A.contact.url);return n.searchParams.set("utm_source","hf-demo"),n.searchParams.set("utm_content",e),n.toString()}function Ye(){if(!A)return;let e=s("backend-list");if(e.innerHTML="",!ve){e.innerHTML='<li class="dim">Loading the models\u2026</li>';return}for(let t of A.backends){let n=document.createElement("li"),o=G.has(t.capability);n.setAttribute("role","option"),n.setAttribute("aria-selected",String(t.label===Q)),n.innerHTML=o?`<span>${t.label}<span class="note">${t.note??""}</span></span>`:`<span><span class="locked">${t.label}</span><span class="note">${t.note??""}</span></span><span class="badge pro">Pro</span>`,o||(n.className="pro-item"),n.tabIndex=0,n.onkeydown=i=>{(i.key==="Enter"||i.key===" ")&&(i.preventDefault(),n.click()),i.key==="ArrowDown"&&n.nextElementSibling?.focus(),i.key==="ArrowUp"&&n.previousElementSibling?.focus()},n.onclick=()=>{fe(!1),o?Ke(t.label):ee(t)},e.append(n)}}function fe(e){let t=s("backend-list"),n=e??t.hidden;t.hidden=!n,document.querySelector(".backend-btn").setAttribute("aria-expanded",String(n)),n&&t.querySelector('[aria-selected="true"]')?.focus()}document.addEventListener("keydown",e=>{e.key==="Escape"&&!s("backend-list").hidden&&(fe(!1),document.querySelector(".backend-btn").focus())});document.querySelector(".backend-btn").addEventListener("click",()=>fe());document.addEventListener("click",e=>{e.target.closest(".backend")||fe(!1)});function Ke(e){Q=e,s("backend-label").textContent=e,Ye(),we()}function qt(){if(!A||!ve)return;let e=s("pro-list");e.innerHTML="";let t=A.catalogue.filter(n=>!G.has(n.capability));for(let n of[...t.filter(o=>!o.soon),...t.filter(o=>o.soon)]){let o=document.createElement("li"),i=document.createElement("button");o.innerHTML='<span class="badge pro">Pro</span>',i.innerHTML=`<span class="pro-item-label">${n.label}</span><span class="pro-item-note">${n.note??""}</span>`,i.onclick=()=>ee(n),o.append(i),e.append(o)}}var Oe={smolvla_live:{file:"smolvla",title:"SmolVLA (smolvla_step25000.pt)",params:"450,046,176 parameters",note:"Hugging Face's 450M-parameter VLA, traced layer by layer.",about:"SmolVLA's blocks, from a trace of AMP's fine-tuned SmolVLA. Each camera image goes through a vision encoder (the wide block at the bottom), and only 64 tokens per camera go on into the language model and the action expert (the narrow columns): little room for where things are."},cosmos3_live:{file:"cosmos3-edge",title:"Cosmos3-Edge (policy mode, weights as released)",params:"4,074,345,692 parameters",note:"NVIDIA's world-model policy, traced through every sampling pass.",about:"NVIDIA Cosmos3-Edge's blocks, from a trace of the released weights: a 4-billion-parameter transformer, here as a policy that answers with the arm's next moves."},vla_adapter_live:{file:"vla-adapter",title:"VLA-Adapter (1.6B): published base weights",params:"1,575,044,575 parameters",note:"OpenHelix's VLA-Adapter, traced automatically.",about:"VLA-Adapter's blocks, traced automatically from its published base weights: a vision-language model with a small policy that reads it layer by layer."}},ce=null;function zn(e){let t=Oe[e.f.capability];ce=e.f,s("v-preview-img").src=`previews/${t.file}.webp`,s("v-preview-img").alt=`${e.label}: its layers drawn as blocks`,s("v-preview-title").textContent=e.label,s("v-preview-note").textContent=t.about,s("v-side-title").textContent=t.title,s("v-side-params").textContent=t.params,s("v-side-model").textContent=e.label,s("v-preview").hidden=!1,s("view-inside").classList.add("previewing"),document.querySelector("#v-model span").textContent=e.label,T.events.push({type:"preview",model:e.label})}function jt(){s("v-preview").hidden=!0,s("view-inside").classList.remove("previewing"),ce=null,document.querySelector("#v-model span").textContent="AMP Tadpole"}s("v-preview-pro").onclick=()=>{ce&&ee(ce)};s("v-preview-back").onclick=()=>jt();function qn(){let e=s("v-model-list"),t=[{label:"AMP Tadpole",note:"AMP's 6.5M-parameter model: the one that drives the arm here.",live:!0},...A.backends.filter(n=>n.capability in Oe).map(n=>({label:n.label,note:Oe[n.capability].note,live:G.has(n.capability),f:n})),...A.features.filter(n=>n.capability==="load_package").map(n=>({label:"Your own model\u2026",note:"Any model package, traced automatically.",live:G.has(n.capability),f:n,card:!0}))];e.replaceChildren(...t.map(n=>{let o=document.createElement("li");o.setAttribute("role","option"),o.setAttribute("aria-selected",String(n.live&&n.label==="AMP Tadpole"));let i=!n.live&&n.card;return i&&(o.className="pro-item"),o.innerHTML=`<span>${n.label}<span class="note">${n.note}</span></span>`+(i?'<span class="badge pro">Pro</span>':""),o.tabIndex=0,o.onclick=()=>{pe(!1),n.live?jt():n.card?ee(n.f):zn(n)},o.onkeydown=r=>{(r.key==="Enter"||r.key===" ")&&(r.preventDefault(),o.click()),r.key==="ArrowDown"&&(r.preventDefault(),o.nextElementSibling?.focus()),r.key==="ArrowUp"&&(r.preventDefault(),o.previousElementSibling?.focus()),r.key==="Escape"&&(pe(!1),s("v-model").focus())},o}))}function pe(e){let t=s("v-model-list"),n=e??t.hidden;t.hidden=!n,s("v-model").setAttribute("aria-expanded",String(n)),n&&t.querySelector('[aria-selected="true"]')?.focus()}s("v-model").onclick=()=>pe();document.addEventListener("click",e=>{e.target.closest("#v-model-wrap")||pe(!1)});function jn(e){let t=[...A.backends,...A.features,...A.catalogue].find(n=>n.capability===e);t&&ee(t)}function ee(e){s("pro-title").textContent=e.label,s("pro-blurb").textContent=e.blurb??"",s("pro-why").textContent=e.why?`We can't put this in the demo because ${e.why}`:"",s("pro-why").hidden=!e.why,s("pro-part").innerHTML=e.soon?"It's coming soon to <b>AMP Embodied AI Workbench Pro</b>, the desktop app.":"It's in <b>AMP Embodied AI Workbench Pro</b>, the desktop app.";let t=s("pro-contact");t.href=zt(`card-${e.id}`),s("pro-dialog").showModal()}var S=s("text");function I(e){S.value=e,we()}function we(){H({type:"hints",text:S.value,id:++Nt,backend:Q})}S.addEventListener("input",we);S.addEventListener("keydown",e=>{e.key==="Enter"&&Xe()});var Dt={circle:'<circle cx="9" cy="9" r="7"/>',square:'<rect x="2.5" y="2.5" width="13" height="13"/>',triangle:'<polygon points="9,2 16,15.5 2,15.5"/>',star:'<polygon points="9,1.5 11,6.7 16.5,7 12.2,10.5 13.6,16 9,13 4.4,16 5.8,10.5 1.5,7 7,6.7"/>',hexagon:'<polygon points="9,1.5 15.5,5.2 15.5,12.8 9,16.5 2.5,12.8 2.5,5.2"/>'};function Re(e,t,n=""){let o=document.createElement("button");return o.innerHTML=n+`<span>${e}</span>`,o.disabled=!t.has(e),o.onclick=()=>H({type:"compose",text:S.value,key:e,id:0}),o}function Vn(e){if(q=e.objects.map(r=>r.name),q.length&&(S.placeholder=`e.g. pick up the ${q[0]} then return home`),ze&&q.length){ze=!1,I(`pick up the ${q[0]} then return home`);return}let t=new Set(e.allowed);s("h-verbs").replaceChildren(...e.verbs.map(r=>Re(r,t))),s("h-objects").replaceChildren(...e.objects.map(r=>Re(r.name,t,`<svg width="18" height="18" viewBox="0 0 18 18" aria-hidden="true" fill="rgb(${r.rgb.join(",")})">${Dt[r.shape]??Dt.circle}</svg>`))),s("h-connectors").replaceChildren(...e.connectors.map(r=>Re(r,t)));let n=s("h-state"),o=e.words;n.textContent=o.missing.length?o.message:e.message;let i=o.missing.length?o.runs===null:e.state==="invalid";n.className="hint-state"+(i?" bad":o.missing.length?" warn":e.state==="done"?" good":""),S.classList.toggle("invalid",i)}function R(e){s("play").disabled=e}function Xe(){!S.value.trim()&&S.placeholder.startsWith("e.g. ")&&I(S.placeholder.slice(5));let e=S.value.trim();if(!e){M("Type an instruction first, or build one with the buttons","dim");return}D=!0,R(!0),H({type:"play",text:e,backend:Q})}s("play").onclick=Xe;s("stop").onclick=()=>{H({type:"stop"}),D=!1,R(!1),M("\u25A0 Stopped: Play starts a new command from here","dim")};s("reset").onclick=()=>{H({type:"reset"}),D=!1,R(!1),M("\u27F2 Back to the start of the scene","dim")};var ze=!1;s("new-scene").onclick=()=>{let e=92e5+Math.floor(Math.random()*8e5);H({type:"reset",seed:e}),D=!1,R(!1),ze=!0,I(""),M(`Scene ${e.toLocaleString("en-GB")}: never seen in training`,"dim")};var Vt="Free 3D",ye=s("az"),be=s("el"),ue=!1,qe=!1;function Ce(){if(ue){qe=!0;return}ue=!0,H({type:"camera",az:+ye.value,el:+be.value,mode:Vt})}function Un(){ue=!1,qe&&(qe=!1,Ce())}ye.oninput=be.oninput=()=>{Ge("Free 3D"),Ce()};function Ge(e){Vt=e,document.querySelectorAll(".modes button").forEach(t=>t.classList.toggle("on",t.dataset.mode===e))}document.querySelectorAll(".modes button").forEach(e=>e.onclick=()=>{Ge(e.dataset.mode),Ce()});var j=null,We=!1,me=s("main");me.addEventListener("pointerdown",e=>{j={x:e.clientX,y:e.clientY,az:+ye.value,el:+be.value},me.setPointerCapture(e.pointerId)});me.addEventListener("pointermove",e=>{if(!j)return;let t=n=>(n+540)%360-180;ye.value=String(Math.round(t(j.az+(e.clientX-j.x)*.5))),be.value=String(Math.round(Math.max(0,Math.min(89,j.el+(e.clientY-j.y)*.4)))),Ge("Free 3D"),We||(We=!0,requestAnimationFrame(()=>{We=!1,Ce()}))});me.addEventListener("pointerup",()=>j=null);s("say").onclick=()=>{let e=S.value.trim();!e||!("speechSynthesis"in window)||(speechSynthesis.cancel(),speechSynthesis.speak(new SpeechSynthesisUtterance(e)))};var U=s("listen"),P=s("listen-pop"),E=null,le=null,Ut=0,he=!1,ge="";U.hidden=K||!navigator.mediaDevices?.getUserMedia||!window.isSecureContext;function z(e,t,n="",o=null,i=!1){P.hidden=!1,s("listen-setup").hidden=!1,s("listen-live").hidden=!0,P.classList.toggle("error",i),s("listen-title").textContent=e,s("listen-msg").textContent=t,s("listen-step").textContent=n;let r=s("listen-bar");r.classList.toggle("indeterminate",o==="busy"),typeof o=="number"&&(r.style.width=`${o}%`)}function V(e,t=!1){let n=s("listen-status");n.textContent=e,n.classList.toggle("rec",t),s("listen-hold").classList.toggle("on",t),U.classList.toggle("on",t)}function X(e){U.classList.toggle("open",e),U.setAttribute("aria-expanded",String(e))}function Yt(){cancelAnimationFrame(Ut),E?.close(),E=null,P.hidden=!0,S.classList.remove("heard"),V("READY hold SPACE to talk"),X(!1)}var Kt=[];async function Yn(){he=!0,U.classList.add("busy"),X(!0),z("Starting Listen","Getting speech recognition ready\u2026","","busy");try{let e=await import("./chunks/listen-MFBYX2EG.js");Kt=e.EXTRA;let t=!e.setUpBefore();t&&z("Setting up Listen",`A one-off download of the speech recogniser (about ${A.sizes.listen_mb} MB). Next time, Listen starts straight away.`,"Your browser will ask to use the microphone. What you say is recognised on this computer and never leaves the page.",0);let n=new AbortController,o=navigator.mediaDevices.getUserMedia({audio:{channelCount:1,echoCancellation:!0,noiseSuppression:!0}});o.catch(()=>n.abort());let i=await e.loadModel(c=>{if(!t)return z("Starting Listen","The speech model is already saved in this browser.","","busy");c.stage==="download"?z("Setting up Listen",s("listen-msg").textContent,`Downloading ${(c.got/1e6).toFixed(0)} of ${(c.total/1e6).toFixed(0)} MB`,100*c.got/c.total):z("Setting up Listen",s("listen-msg").textContent,"Starting the speech model\u2026","busy")},n.signal).catch(c=>{if(n.signal.aborted)return null;throw c}),r;try{r=await o}catch{z("Microphone blocked","Listen needs the microphone. Allow it from the icon in the address bar, then press Listen again.","",null,!0),X(!1),setTimeout(()=>{E||(P.hidden=!0)},8e3);return}if(!i)return;if(P.hidden){r.getTracks().forEach(c=>c.stop());return}E=new e.Mic(i,r),s("listen-setup").hidden=!0,s("listen-live").hidden=!1,P.classList.remove("error"),le||(le=new(await import("./chunks/meter-XECMPID2.js")).Meter(s("listen-meter")));let a=()=>{E&&(le.update(E.levels()),T.meterLit=le.lit(),Ut=requestAnimationFrame(a))};a(),V("READY hold SPACE to talk"),T.events.push({type:"listen-ready"})}catch(e){z("Listen could not start",String(e?.message??e??"unknown error"),"Press Listen to try again.",null,!0),X(!1)}finally{he=!1,U.classList.remove("busy")}}U.onclick=()=>{he||(!P.hidden&&(E||!s("listen-live").hidden)?Yt():!P.hidden&&P.classList.contains("error")?(P.hidden=!0,X(!1)):Yn())};document.addEventListener("pointerdown",e=>{P.hidden||he||E?.holding||e.target.closest("#listen-pop, #listen, #main")||(E?Yt():(P.hidden=!0,X(!1)))});function Xt(){!E||E.holding||(ge=S.value,S.classList.add("heard"),V("REC release to send",!0),E.hold(q,e=>{e&&(S.value=Gt(ge,e))}))}function Gt(e,t){return/^then\b/i.test(t)?e.trim()?`${e.trim()} ${t}`:t.replace(/^then\s*/i,""):t}async function Qt(){if(!E||!E.holding)return;V("\u2026 reading");let e=await E.release();if(S.classList.remove("heard"),e){I(Gt(ge,e));let t=e.replace(/\(unclear\)/g,"_").split(" "),n=t.filter(o=>o==="_"||Kt.includes(o)).length;V(`READY heard ${t.length} word${t.length===1?"":"s"}`+(n?` \xB7 ${n} not understood`:"")),M(`Heard: ${e}`),T.events.push({type:"heard",text:e})}else I(ge),V("heard nothing hold SPACE and speak")}s("listen-clear").onclick=()=>{I(""),V("READY hold SPACE to talk")};var je=s("listen-hold");je.addEventListener("pointerdown",e=>{e.preventDefault(),je.setPointerCapture(e.pointerId),Xt()});for(let e of["pointerup","pointercancel"])je.addEventListener(e,()=>Qt());var Zt=e=>e instanceof HTMLElement&&(e.isContentEditable||["INPUT","TEXTAREA","SELECT"].includes(e.tagName));document.addEventListener("keydown",e=>{e.key!==" "||!E||Zt(e.target)||s("view-robot").hidden||(e.preventDefault(),e.repeat||Xt())});document.addEventListener("keyup",e=>{e.key!==" "||!E||Zt(e.target)||s("view-robot").hidden||(e.preventDefault(),Qt())});document.querySelectorAll(".tabs button").forEach(e=>e.onclick=()=>{document.querySelectorAll(".tabs button").forEach(t=>t.setAttribute("aria-selected",String(t===e))),s("view-robot").hidden=e.dataset.tab!=="robot",s("view-inside").hidden=e.dataset.tab!=="inside",e.dataset.tab==="inside"&&De()});s("credits-btn").onclick=()=>{s("credits-body").innerHTML=St,s("credits-dialog").showModal()};var Jt=()=>!s("view-inside").hidden;s("tour-btn").onclick=()=>Jt()?Ae({glowAndPlay:_e,played:Be}):Te(Ft);var Rt=!0;function en(){Ot=!0;let e=Fe||Rt&&!kt();return Rt=!1,Fe=!1,e&&Jt()&&!document.querySelector(".driver-popover")?(setTimeout(()=>Ae({glowAndPlay:_e,played:Be}),300),!0):!1} | |