runbot-next 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,45 @@
1
+ # runbot-next
2
+
3
+ Bun CLI and reusable function definitions for reading public Odoo Runbot pages.
4
+
5
+ The core functions live in `src/runbot/tools.ts`. Each tool has:
6
+
7
+ - `name`
8
+ - `summary`
9
+ - `description`
10
+ - Zod `inputSchema`
11
+ - async `handler`
12
+
13
+ That single definition list is used by the CLI and can also be adapted for MCP or oRPC via `src/adapters`.
14
+
15
+ ## Usage
16
+
17
+ Run the web app locally from the published package:
18
+
19
+ ```sh
20
+ npx runbot-next
21
+ bunx runbot-next
22
+ ```
23
+
24
+ Use `PORT` to choose a port:
25
+
26
+ ```sh
27
+ PORT=5173 npx runbot-next
28
+ PORT=5173 bunx runbot-next
29
+ ```
30
+
31
+ Develop or use the CLI from the repo:
32
+
33
+ ```sh
34
+ bun install
35
+ bun run src/cli.ts projects
36
+ bun run src/cli.ts batches /runbot/rd-1 --search master
37
+ bun run src/cli.ts batch 2526059 --json
38
+ bun run src/cli.ts build 110606813
39
+ bun run src/cli.ts tests --batch 2413720 --slot "Enterprise Tests" --unparsed
40
+ bun run src/cli.ts link 110606813 log run
41
+ ```
42
+
43
+ ## Notes
44
+
45
+ Runbot's public pages are server-rendered HTML. The tool parses public links and text from those pages instead of relying on a JSON API.
@@ -0,0 +1,12 @@
1
+ (function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var e={context:void 0,registry:void 0,effects:void 0,done:!1,getContextId(){return t(this.context.count)},getNextContextId(){return t(this.context.count++)}};function t(t){let n=String(t),r=n.length-1;return e.context.id+(r?String.fromCharCode(96+r):``)+n}function n(t){e.context=t}function r(){return{...e.context,id:e.getNextContextId(),count:0}}var i=(e,t)=>e===t,a=Symbol(`solid-track`),o={equals:i},s=null,c=se,l=1,u=2,d={owned:null,cleanups:null,context:null,owner:null},f={},p=null,m=null,h=null,g=null,_=null,v=null,y=null,b=0;function x(e,t){let n=_,r=p,i=e.length===0,a=t===void 0?r:t,o=i?d:{owned:null,cleanups:null,context:a?a.context:null,owner:a},s=i?e:()=>e(()=>k(()=>z(o)));p=o,_=null;try{return R(s,!0)}finally{_=n,p=r}}function S(e,t){t=t?Object.assign({},o,t):o;let n={value:e,observers:null,observerSlots:null,comparator:t.equals||void 0};return[I.bind(n),e=>(typeof e==`function`&&(e=m&&m.running&&m.sources.has(n)?e(n.tValue):e(n.value)),ne(n,e))]}function C(e,t,n){let r=ie(e,t,!0,l);h&&m&&m.running?v.push(r):L(r)}function w(e,t,n){let r=ie(e,t,!1,l);h&&m&&m.running?v.push(r):L(r)}function T(e,t,n){c=le;let r=ie(e,t,!1,l),i=F&&te(F);i&&(r.suspense=i),(!n||!n.render)&&(r.user=!0),y?y.push(r):L(r)}function E(e,t,n){n=n?Object.assign({},o,n):o;let r=ie(e,t,!0,0);return r.observers=null,r.observerSlots=null,r.comparator=n.equals||void 0,h&&m&&m.running?(r.tState=l,v.push(r)):L(r),I.bind(r)}function D(e){return e&&typeof e==`object`&&`then`in e}function O(t,n,r){let i,a,o;typeof n==`function`?(i=t,a=n,o=r||{}):(i=!0,a=t,o=n||{});let s=null,c=f,l=null,u=!1,d=!1,h=`initialValue`in o,g=typeof i==`function`&&E(i),v=new Set,[y,b]=(o.storage||S)(o.initialValue),[x,w]=S(void 0),[T,O]=S(void 0,{equals:!1}),[A,ee]=S(h?`ready`:`unresolved`);e.context&&(l=e.getNextContextId(),o.ssrLoadFrom===`initial`?c=o.initialValue:e.load&&e.has(l)&&(c=e.load(l)));function M(e,t,n,r){return s===e&&(s=null,r!==void 0&&(h=!0),(e===c||t===c)&&o.onHydrated&&queueMicrotask(()=>o.onHydrated(r,{value:t})),c=f,m&&e&&u?(m.promises.delete(e),u=!1,R(()=>{m.running=!0,N(t,n)},!1)):N(t,n)),t}function N(e,t){R(()=>{t===void 0&&b(()=>e),ee(t===void 0?h?`ready`:`unresolved`:`errored`),w(t);for(let e of v.keys())e.decrement();v.clear()},!1)}function P(){let e=F&&te(F),t=y(),n=x();if(n!==void 0&&!s)throw n;return _&&!_.user&&e&&C(()=>{T(),s&&(e.resolved&&m&&u?m.promises.add(s):v.has(e)||(e.increment(),v.add(e)))}),t}function I(e=!0){if(e!==!1&&d)return;d=!1;let t=g?g():i;if(u=m&&m.running,t==null||t===!1){M(s,k(y));return}m&&s&&m.promises.delete(s);let n,r=c===f?k(()=>{try{return a(t,{value:y(),refetching:e})}catch(e){n=e}}):c;if(n!==void 0){M(s,void 0,pe(n),t);return}else if(!D(r))return M(s,r,void 0,t),r;return s=r,`v`in r?(r.s===1?M(s,r.v,void 0,t):M(s,void 0,pe(r.v),t),r):(d=!0,queueMicrotask(()=>d=!1),R(()=>{ee(h?`refreshing`:`pending`),O()},!1),r.then(e=>M(r,e,void 0,t),e=>M(r,void 0,pe(e),t)))}Object.defineProperties(P,{state:{get:()=>A()},error:{get:()=>x()},loading:{get(){let e=A();return e===`pending`||e===`refreshing`}},latest:{get(){if(!h)return P();let e=x();if(e&&!s)throw e;return y()}}});let ne=p;return g?C(()=>(ne=p,I(!1))):I(!1),[P,{refetch:e=>j(ne,()=>I(e)),mutate:b}]}function k(e){if(!g&&_===null)return e();let t=_;_=null;try{return g?g.untrack(e):e()}finally{_=t}}function A(e){return p===null||(p.cleanups===null?p.cleanups=[e]:p.cleanups.push(e)),e}function j(e,t){let n=p,r=_;p=e,_=null;try{return R(t,!0)}catch(e){he(e)}finally{p=n,_=r}}function ee(e){if(m&&m.running)return e(),m.done;let t=_,n=p;return Promise.resolve().then(()=>{_=t,p=n;let r;return(h||F)&&(r=m||={sources:new Set,effects:[],promises:new Set,disposed:new Set,queue:new Set,running:!0},r.done||=new Promise(e=>r.resolve=e),r.running=!0),R(e,!1),_=p=null,r?r.done:void 0})}var[M,N]=S(!1);function te(e){let t;return p&&p.context&&(t=p.context[e.id])!==void 0?t:e.defaultValue}function P(e){let t=E(e),n=E(()=>B(t()));return n.toArray=()=>{let e=n();return Array.isArray(e)?e:e==null?[]:[e]},n}var F;function I(){let e=m&&m.running;if(this.sources&&(e?this.tState:this.state))if((e?this.tState:this.state)===l)L(this);else{let e=v;v=null,R(()=>ue(this),!1),v=e}if(_){let e=this.observers?this.observers.length:0;_.sources?(_.sources.push(this),_.sourceSlots.push(e)):(_.sources=[this],_.sourceSlots=[e]),this.observers?(this.observers.push(_),this.observerSlots.push(_.sources.length-1)):(this.observers=[_],this.observerSlots=[_.sources.length-1])}return e&&m.sources.has(this)?this.tValue:this.value}function ne(e,t,n){let r=m&&m.running&&m.sources.has(e)?e.tValue:e.value;if(!e.comparator||!e.comparator(r,t)){if(m){let r=m.running;(r||!n&&m.sources.has(e))&&(m.sources.add(e),e.tValue=t),r||(e.value=t)}else e.value=t;e.observers&&e.observers.length&&R(()=>{for(let t=0;t<e.observers.length;t+=1){let n=e.observers[t],r=m&&m.running;r&&m.disposed.has(n)||((r?!n.tState:!n.state)&&(n.pure?v.push(n):y.push(n),n.observers&&de(n)),r?n.tState=l:n.state=l)}if(v.length>1e6)throw v=[],Error()},!1)}return t}function L(e){if(!e.fn)return;z(e);let t=b;re(e,m&&m.running&&m.sources.has(e)?e.tValue:e.value,t),m&&!m.running&&m.sources.has(e)&&queueMicrotask(()=>{R(()=>{m&&(m.running=!0),_=p=e,re(e,e.tValue,t),_=p=null},!1)})}function re(e,t,n){let r,i=p,a=_;_=p=e;try{r=e.fn(t)}catch(t){return e.pure&&(m&&m.running?(e.tState=l,e.tOwned&&e.tOwned.forEach(z),e.tOwned=void 0):(e.state=l,e.owned&&e.owned.forEach(z),e.owned=null)),e.updatedAt=n+1,he(t)}finally{_=a,p=i}(!e.updatedAt||e.updatedAt<=n)&&(e.updatedAt!=null&&`observers`in e?ne(e,r,!0):m&&m.running&&e.pure?(m.sources.has(e)||(e.value=r),m.sources.add(e),e.tValue=r):e.value=r,e.updatedAt=n)}function ie(e,t,n,r=l,i){let a={fn:e,state:r,updatedAt:null,owned:null,sources:null,sourceSlots:null,cleanups:null,value:t,owner:p,context:p?p.context:null,pure:n};if(m&&m.running&&(a.state=0,a.tState=r),p===null||p!==d&&(m&&m.running&&p.pure?p.tOwned?p.tOwned.push(a):p.tOwned=[a]:p.owned?p.owned.push(a):p.owned=[a]),g&&a.fn){let e=a.fn,[t,n]=S(void 0,{equals:!1}),r=g.factory(e,n);A(()=>r.dispose());let i,o=()=>ee(n).then(()=>{i&&=(i.dispose(),void 0)});a.fn=n=>(t(),m&&m.running?(i||=g.factory(e,o),i.track(n)):r.track(n))}return a}function ae(e){let t=m&&m.running;if((t?e.tState:e.state)===0)return;if((t?e.tState:e.state)===u)return ue(e);if(e.suspense&&k(e.suspense.inFallback))return e.suspense.effects.push(e);let n=[e];for(;(e=e.owner)&&(!e.updatedAt||e.updatedAt<b);){if(t&&m.disposed.has(e))return;(t?e.tState:e.state)&&n.push(e)}for(let r=n.length-1;r>=0;r--){if(e=n[r],t){let t=e,i=n[r+1];for(;(t=t.owner)&&t!==i;)if(m.disposed.has(t))return}if((t?e.tState:e.state)===l)L(e);else if((t?e.tState:e.state)===u){let t=v;v=null,R(()=>ue(e,n[0]),!1),v=t}}}function R(e,t){if(v)return e();let n=!1;t||(v=[]),y?n=!0:y=[],b++;try{let t=e();return oe(n),t}catch(e){n||(y=null),v=null,he(e)}}function oe(e){if(v&&=(h&&m&&m.running?ce(v):se(v),null),e)return;let t;if(m){if(!m.promises.size&&!m.queue.size){let e=m.sources,n=m.disposed;y.push.apply(y,m.effects),t=m.resolve;for(let e of y)`tState`in e&&(e.state=e.tState),delete e.tState;m=null,R(()=>{for(let e of n)z(e);for(let t of e){if(t.value=t.tValue,t.owned)for(let e=0,n=t.owned.length;e<n;e++)z(t.owned[e]);t.tOwned&&(t.owned=t.tOwned),delete t.tValue,delete t.tOwned,t.tState=0}N(!1)},!1)}else if(m.running){m.running=!1,m.effects.push.apply(m.effects,y),y=null,N(!0);return}}let n=y;y=null,n.length&&R(()=>c(n),!1),t&&t()}function se(e){for(let t=0;t<e.length;t++)ae(e[t])}function ce(e){for(let t=0;t<e.length;t++){let n=e[t],r=m.queue;r.has(n)||(r.add(n),h(()=>{r.delete(n),R(()=>{m.running=!0,ae(n)},!1),m&&(m.running=!1)}))}}function le(t){let r,i=0;for(r=0;r<t.length;r++){let e=t[r];e.user?t[i++]=e:ae(e)}if(e.context){if(e.count){e.effects||=[],e.effects.push(...t.slice(0,i));return}n()}for(e.effects&&(e.done||!e.count)&&(t=[...e.effects,...t],i+=e.effects.length,delete e.effects),r=0;r<i;r++)ae(t[r])}function ue(e,t){let n=m&&m.running;n?e.tState=0:e.state=0;for(let r=0;r<e.sources.length;r+=1){let i=e.sources[r];if(i.sources){let e=n?i.tState:i.state;e===l?i!==t&&(!i.updatedAt||i.updatedAt<b)&&ae(i):e===u&&ue(i,t)}}}function de(e){let t=m&&m.running;for(let n=0;n<e.observers.length;n+=1){let r=e.observers[n];(t?!r.tState:!r.state)&&(t?r.tState=u:r.state=u,r.pure?v.push(r):y.push(r),r.observers&&de(r))}}function z(e){let t;if(e.sources)for(;e.sources.length;){let t=e.sources.pop(),n=e.sourceSlots.pop(),r=t.observers;if(r&&r.length){let e=r.pop(),i=t.observerSlots.pop();n<r.length&&(e.sourceSlots[i]=n,r[n]=e,t.observerSlots[n]=i)}}if(e.tOwned){for(t=e.tOwned.length-1;t>=0;t--)z(e.tOwned[t]);delete e.tOwned}if(m&&m.running&&e.pure)fe(e,!0);else if(e.owned){for(t=e.owned.length-1;t>=0;t--)z(e.owned[t]);e.owned=null}if(e.cleanups){for(t=e.cleanups.length-1;t>=0;t--)e.cleanups[t]();e.cleanups=null}m&&m.running?e.tState=0:e.state=0}function fe(e,t){if(t||(e.tState=0,m.disposed.add(e)),e.owned)for(let t=0;t<e.owned.length;t++)fe(e.owned[t])}function pe(e){return e instanceof Error?e:Error(typeof e==`string`?e:`Unknown error`,{cause:e})}function me(e,t,n){try{for(let n of t)n(e)}catch(e){he(e,n&&n.owner||null)}}function he(e,t=p){let n=s&&t&&t.context&&t.context[s],r=pe(e);if(!n)throw r;y?y.push({fn(){me(r,n,t)},state:l}):me(r,n,t)}function B(e){if(typeof e==`function`&&!e.length)return B(e());if(Array.isArray(e)){let t=[];for(let n=0;n<e.length;n++){let r=B(e[n]);Array.isArray(r)?t.push.apply(t,r):t.push(r)}return t}return e}var ge=Symbol(`fallback`);function _e(e){for(let t=0;t<e.length;t++)e[t]()}function ve(e,t,n={}){let r=[],i=[],o=[],s=0,c=t.length>1?[]:null;return A(()=>_e(o)),()=>{let l=e()||[],u=l.length,d,f;return l[a],k(()=>{let e,t,a,m,h,g,_,v,y;if(u===0)s!==0&&(_e(o),o=[],r=[],i=[],s=0,c&&=[]),n.fallback&&(r=[ge],i[0]=x(e=>(o[0]=e,n.fallback())),s=1);else if(s===0){for(i=Array(u),f=0;f<u;f++)r[f]=l[f],i[f]=x(p);s=u}else{for(a=Array(u),m=Array(u),c&&(h=Array(u)),g=0,_=Math.min(s,u);g<_&&r[g]===l[g];g++);for(_=s-1,v=u-1;_>=g&&v>=g&&r[_]===l[v];_--,v--)a[v]=i[_],m[v]=o[_],c&&(h[v]=c[_]);for(e=new Map,t=Array(v+1),f=v;f>=g;f--)y=l[f],d=e.get(y),t[f]=d===void 0?-1:d,e.set(y,f);for(d=g;d<=_;d++)y=r[d],f=e.get(y),f!==void 0&&f!==-1?(a[f]=i[d],m[f]=o[d],c&&(h[f]=c[d]),f=t[f],e.set(y,f)):o[d]();for(f=g;f<u;f++)f in a?(i[f]=a[f],o[f]=m[f],c&&(c[f]=h[f],c[f](f))):i[f]=x(p);i=i.slice(0,s=u),r=l.slice(0)}return i});function p(e){if(o[f]=e,c){let[e,n]=S(f);return c[f]=n,t(l[f],e)}return t(l[f])}}}var ye=!1;function V(t,i){if(ye&&e.context){let a=e.context;n(r());let o=k(()=>t(i||{}));return n(a),o}return k(()=>t(i||{}))}var be=e=>`Stale read from <${e}>.`;function H(e){let t=`fallback`in e&&{fallback:()=>e.fallback};return E(ve(()=>e.each,e.children,t||void 0))}function U(e){let t=e.keyed,n=E(()=>e.when,void 0,void 0),r=t?n:E(n,void 0,{equals:(e,t)=>!e==!t});return E(()=>{let i=r();if(i){let a=e.children;return typeof a==`function`&&a.length>0?k(()=>a(t?i:()=>{if(!k(r))throw be(`Show`);return n()})):a}return e.fallback},void 0,void 0)}function xe(e){let t=P(()=>e.children),n=E(()=>{let e=t(),n=Array.isArray(e)?e:[e],r=()=>void 0;for(let e=0;e<n.length;e++){let t=e,i=n[e],a=r,o=E(()=>a()?void 0:i.when,void 0,void 0),s=i.keyed?o:E(o,void 0,{equals:(e,t)=>!e==!t});r=()=>a()||(s()?[t,o,i]:void 0)}return r});return E(()=>{let t=n()();if(!t)return e.fallback;let[r,i,a]=t,o=a.children;return typeof o==`function`&&o.length>0?k(()=>o(a.keyed?i():()=>{if(k(n)()?.[0]!==r)throw be(`Match`);return i()})):o},void 0,void 0)}function Se(e){return e}var W=e=>E(()=>e());function Ce(e,t,n){let r=n.length,i=t.length,a=r,o=0,s=0,c=t[i-1].nextSibling,l=null;for(;o<i||s<a;){if(t[o]===n[s]){o++,s++;continue}for(;t[i-1]===n[a-1];)i--,a--;if(i===o){let t=a<r?s?n[s-1].nextSibling:n[a-s]:c;for(;s<a;)e.insertBefore(n[s++],t)}else if(a===s)for(;o<i;)(!l||!l.has(t[o]))&&t[o].remove(),o++;else if(t[o]===n[a-1]&&n[s]===t[i-1]){let r=t[--i].nextSibling;e.insertBefore(n[s++],t[o++].nextSibling),e.insertBefore(n[--a],r),t[i]=n[a]}else{if(!l){l=new Map;let e=s;for(;e<a;)l.set(n[e],e++)}let r=l.get(t[o]);if(r!=null)if(s<r&&r<a){let c=o,u=1,d;for(;++c<i&&c<a&&!((d=l.get(t[c]))==null||d!==r+u);)u++;if(u>r-s){let i=t[o];for(;s<r;)e.insertBefore(n[s++],i)}else e.replaceChild(n[s++],t[o++])}else o++;else t[o++].remove()}}}var we=`_$DX_DELEGATE`;function Te(e,t,n,r={}){let i;return x(r=>{i=r,t===document?e():J(t,e(),t.firstChild?null:void 0,n)},r.owner),()=>{i(),t.textContent=``}}function G(e,t,n,r){let i,a=()=>{let t=r?document.createElementNS(`http://www.w3.org/1998/Math/MathML`,`template`):document.createElement(`template`);return t.innerHTML=e,n?t.content.firstChild.firstChild:r?t.firstChild:t.content.firstChild},o=t?()=>k(()=>document.importNode(i||=a(),!0)):()=>(i||=a()).cloneNode(!0);return o.cloneNode=o,o}function Ee(e,t=window.document){let n=t[we]||(t[we]=new Set);for(let r=0,i=e.length;r<i;r++){let i=e[r];n.has(i)||(n.add(i),t.addEventListener(i,ke))}}function K(e,t,n){Oe(e)||(n==null?e.removeAttribute(t):e.setAttribute(t,n))}function De(e,t,n,r){if(r)Array.isArray(n)?(e[`$$${t}`]=n[0],e[`$$${t}Data`]=n[1]):e[`$$${t}`]=n;else if(Array.isArray(n)){let r=n[0];e.addEventListener(t,n[0]=t=>r.call(e,n[1],t))}else e.addEventListener(t,n,typeof n!=`function`&&n)}function q(e,t,n){n==null?e.style.removeProperty(t):e.style.setProperty(t,n)}function J(e,t,n,r){if(n!==void 0&&!r&&(r=[]),typeof t!=`function`)return Ae(e,t,r,n);w(r=>Ae(e,t(),r,n),r)}function Oe(t){return!!e.context&&!e.done&&(!t||t.isConnected)}function ke(t){if(e.registry&&e.events&&e.events.find(([e,n])=>n===t))return;let n=t.target,r=`$$${t.type}`,i=t.target,a=t.currentTarget,o=e=>Object.defineProperty(t,`target`,{configurable:!0,value:e}),s=()=>{let e=n[r];if(e&&!n.disabled){let i=n[`${r}Data`];if(i===void 0?e.call(n,t):e.call(n,i,t),t.cancelBubble)return}return n.host&&typeof n.host!=`string`&&!n.host._$host&&n.contains(t.target)&&o(n.host),!0},c=()=>{for(;s()&&(n=n._$host||n.parentNode||n.host););};if(Object.defineProperty(t,`currentTarget`,{configurable:!0,get(){return n||document}}),e.registry&&!e.done&&(e.done=_$HY.done=!0),t.composedPath){let e=t.composedPath();o(e[0]);for(let t=0;t<e.length-2&&(n=e[t],s());t++){if(n._$host){n=n._$host,c();break}if(n.parentNode===a)break}}else c();o(i)}function Ae(e,t,n,r,i){let a=Oe(e);if(a){!n&&(n=[...e.childNodes]);let t=[];for(let e=0;e<n.length;e++){let r=n[e];r.nodeType===8&&r.data.slice(0,2)===`!$`?r.remove():t.push(r)}n=t}for(;typeof n==`function`;)n=n();if(t===n)return n;let o=typeof t,s=r!==void 0;if(e=s&&n[0]&&n[0].parentNode||e,o===`string`||o===`number`){if(a||o===`number`&&(t=t.toString(),t===n))return n;if(s){let i=n[0];i&&i.nodeType===3?i.data!==t&&(i.data=t):i=document.createTextNode(t),n=Y(e,n,r,i)}else n=n!==``&&typeof n==`string`?e.firstChild.data=t:e.textContent=t}else if(t==null||o===`boolean`){if(a)return n;n=Y(e,n,r)}else if(o===`function`)return w(()=>{let i=t();for(;typeof i==`function`;)i=i();n=Ae(e,i,n,r)}),()=>n;else if(Array.isArray(t)){let o=[],c=n&&Array.isArray(n);if(je(o,t,n,i))return w(()=>n=Ae(e,o,n,r,!0)),()=>n;if(a){if(!o.length)return n;if(r===void 0)return n=[...e.childNodes];let t=o[0];if(t.parentNode!==e)return n;let i=[t];for(;(t=t.nextSibling)!==r;)i.push(t);return n=i}if(o.length===0){if(n=Y(e,n,r),s)return n}else c?n.length===0?Me(e,o,r):Ce(e,n,o):(n&&Y(e),Me(e,o));n=o}else if(t.nodeType){if(a&&t.parentNode)return n=s?[t]:t;if(Array.isArray(n)){if(s)return n=Y(e,n,r,t);Y(e,n,null,t)}else n==null||n===``||!e.firstChild?e.appendChild(t):e.replaceChild(t,e.firstChild);n=t}return n}function je(e,t,n,r){let i=!1;for(let a=0,o=t.length;a<o;a++){let o=t[a],s=n&&n[e.length],c;if(!(o==null||o===!0||o===!1))if((c=typeof o)==`object`&&o.nodeType)e.push(o);else if(Array.isArray(o))i=je(e,o,s)||i;else if(c===`function`)if(r){for(;typeof o==`function`;)o=o();i=je(e,Array.isArray(o)?o:[o],Array.isArray(s)?s:[s])||i}else e.push(o),i=!0;else{let t=String(o);s&&s.nodeType===3&&s.data===t?e.push(s):e.push(document.createTextNode(t))}}return i}function Me(e,t,n=null){for(let r=0,i=t.length;r<i;r++)e.insertBefore(t[r],n)}function Y(e,t,n,r){if(n===void 0)return e.textContent=``;let i=r||document.createTextNode(``);if(t.length){let r=!1;for(let a=t.length-1;a>=0;a--){let o=t[a];if(i!==o){let t=o.parentNode===e;!r&&!a?t?e.replaceChild(i,o):e.insertBefore(i,n):t&&o.remove()}else r=!0}}else e.insertBefore(i,n);return[i]}var Ne=G(`<div aria-hidden=true style=background-repeat:no-repeat;transform-origin:center;image-rendering:auto>`),Pe={idle:{row:0,frames:6},"running-right":{row:1,frames:8},"running-left":{row:2,frames:8},waving:{row:3,frames:4},jumping:{row:4,frames:5},failed:{row:5,frames:8},waiting:{row:6,frames:6},running:{row:7,frames:6},review:{row:8,frames:6}};function Fe(e){let[t,n]=S(0),r=0,i=()=>e.frameWidth??192,a=()=>e.frameHeight??208,o=()=>e.size??1,s=()=>Math.max(16,e.frameDelay??140),c=()=>Math.max(0,e.runEvery??3)*1e3,l=()=>e.state??`idle`,u=()=>Pe[l()]||Pe.idle;return T(()=>{if(window.clearTimeout(r),n(0),e.paused)return;if(e.autoRun){let e=()=>{let t=u().frames,i=a=>{if(a>=t){n(0),r=window.setTimeout(e,c());return}n(a),r=window.setTimeout(()=>i(a+1),s())};i(1)};e();return}let t=()=>{n(e=>(e+1)%u().frames),r=window.setTimeout(t,s())};r=window.setTimeout(t,s())}),A(()=>{window.clearTimeout(r)}),(()=>{var n=Ne();return w(r=>{var s=`${i()}px`,c=`${a()}px`,l=`url("${e.atlasUrl}")`,d=`-${t()*i()}px -${u().row*a()}px`,f=`scaleX(${e.flipped===!1?1:-1}) scale(${o()})`;return s!==r.e&&q(n,`width`,r.e=s),c!==r.t&&q(n,`height`,r.t=c),l!==r.a&&q(n,`background-image`,r.a=l),d!==r.o&&q(n,`background-position`,r.o=d),f!==r.i&&q(n,`transform`,r.i=f),r},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0}),n})()}var X=`/assets/spritesheet-020-Dw_WbII0.webp`,Ie=`/assets/spritesheet-025-bv62npoV.webp`,Le=`/assets/spritesheet-050-BrdJ20b7.webp`,Re=`/assets/spritesheet-075-H0zxKdm9.webp`,ze=`/assets/spritesheet-CwDqNQDP.webp`,Be=G(`<main class=pet-configurator><section class=stage aria-label="Pet preview"></section><section class=panel><div><h1></h1><p class=meta></p></div><div class=box><div class=grid><label>Config<select></select></label><label>Name<input type=text></label></div><div class=grid-3><button type=button>New</button><button class=primary type=button>Save</button><button type=button>Delete</button></div><button type=button>Reset controls</button></div><div class=box><div class=grid><label>State<select></select></label><label>Asset<select></select></label></div><div class=grid><label>Size<input type=range min=0.2 max=2 step=0.05><span class=readout>x</span></label><label>Frame delay<input type=range min=70 max=420 step=10><span class=readout> ms</span></label></div><div class=grid><label>Run every<input type=range min=0.5 max=5 step=0.5><span class=readout> sec</span></label><div class=grid style=align-self:end><label class=check><input type=checkbox>Flip</label><label class=check><input type=checkbox>Auto run</label></div></div><button type=button></button></div><section class=usage aria-label="Solid usage"><div class=usage-head><h2>Solid usage</h2><button type=button></button></div><pre><code>`),Ve=G(`<option>`),He=G(`<option> (<!>x<!>)`),Ue=[{name:`idle`,row:0,frames:6},{name:`running-right`,row:1,frames:8},{name:`running-left`,row:2,frames:8},{name:`waving`,row:3,frames:4},{name:`jumping`,row:4,frames:5},{name:`failed`,row:5,frames:8},{name:`waiting`,row:6,frames:6},{name:`running`,row:7,frames:6},{name:`review`,row:8,frames:6}],We=[{id:`020`,label:`20% WebP`,atlasUrl:X,frameWidth:38,frameHeight:42},{id:`025`,label:`25% WebP`,atlasUrl:Ie,frameWidth:48,frameHeight:52},{id:`050`,label:`50% WebP`,atlasUrl:Le,frameWidth:96,frameHeight:104},{id:`075`,label:`75% WebP`,atlasUrl:Re,frameWidth:144,frameHeight:156},{id:`100`,label:`100% WebP`,atlasUrl:ze,frameWidth:192,frameHeight:208}],Ge={id:`default`,name:`Default`,state:`idle`,assetId:`100`,size:1,frameDelay:140,flipped:!0,paused:!1,autoRun:!1,runEvery:3};function Z(e){try{let t=JSON.parse(localStorage.getItem(e));return Array.isArray(t)&&t.length?t:[{...Ge}]}catch{return[{...Ge}]}}function Ke(e){let t=()=>e.states||Ue,n=()=>e.assets||We,r=()=>e.storageKey||`runbot-chameleon-configs`,i=()=>`${r()}-active`,a=Z(r()),o=localStorage.getItem(i())||a[0].id,s=a.find(e=>e.id===o)||a[0],[c,l]=S(a),[u,d]=S(s.id),[f,p]=S(!1),m=E(()=>c().find(e=>e.id===u())||c()[0]||{...Ge}),h=E(()=>n().find(e=>e.id===m().assetId)||n()[n().length-1]),g=E(()=>`<RunbotChameleonPet
2
+ state="${m().state}"
3
+ atlasUrl="${h().atlasUrl}"
4
+ frameWidth={${h().frameWidth}}
5
+ frameHeight={${h().frameHeight}}
6
+ size={${Number(m().size).toFixed(2)}}
7
+ frameDelay={${m().frameDelay}}
8
+ paused={${m().paused}}
9
+ flipped={${m().flipped}}
10
+ autoRun={${m().autoRun}}
11
+ runEvery={${Number(m().runEvery).toFixed(1)}}
12
+ />`);T(()=>{localStorage.setItem(r(),JSON.stringify(c())),localStorage.setItem(i(),u())});function _(e){l(t=>t.map(t=>t.id===m().id?{...t,...e}:t))}function v(){let e={...m(),id:`config-${Date.now()}`,name:`New config`};l(t=>[...t,e]),d(e.id)}function y(){if(c().length===1)return;let e=c().filter(e=>e.id!==m().id);l(e),d(e[0].id)}function b(){let e={...Ge};l([e]),d(e.id)}async function x(){await navigator.clipboard.writeText(g()),p(!0),window.setTimeout(()=>p(!1),1200)}return(()=>{var r=Be(),i=r.firstChild,a=i.nextSibling.firstChild,o=a.firstChild,s=o.nextSibling,l=a.nextSibling,u=l.firstChild,p=u.firstChild,S=p.firstChild.nextSibling,C=p.nextSibling.firstChild.nextSibling,T=u.nextSibling,E=T.firstChild,D=E.nextSibling,O=D.nextSibling,k=T.nextSibling,A=l.nextSibling,j=A.firstChild,ee=j.firstChild,M=ee.firstChild.nextSibling,N=ee.nextSibling.firstChild.nextSibling,te=j.nextSibling,P=te.firstChild,F=P.firstChild.nextSibling,I=F.nextSibling,ne=I.firstChild,L=P.nextSibling.firstChild.nextSibling,re=L.nextSibling,ie=re.firstChild,ae=te.nextSibling,R=ae.firstChild,oe=R.firstChild.nextSibling,se=oe.nextSibling,ce=se.firstChild,le=R.nextSibling.firstChild,ue=le.firstChild,de=le.nextSibling.firstChild,z=ae.nextSibling,fe=A.nextSibling.firstChild,pe=fe.firstChild.nextSibling,me=fe.nextSibling.firstChild;return J(i,V(Fe,{get state(){return m().state},get atlasUrl(){return h().atlasUrl},get frameWidth(){return h().frameWidth},get frameHeight(){return h().frameHeight},get size(){return m().size},get frameDelay(){return m().frameDelay},get paused(){return m().paused},get flipped(){return m().flipped},get autoRun(){return m().autoRun},get runEvery(){return m().runEvery}})),J(o,()=>e.title||`Runbot Chameleon`),J(s,()=>e.description||`Config editor for browser/Solid usage. Each config explicitly selects the atlas asset and frame size.`),S.$$input=e=>d(e.currentTarget.value),J(S,V(H,{get each(){return c()},children:e=>(()=>{var t=Ve();return J(t,()=>e.name),w(()=>t.value=e.id),t})()})),C.$$input=e=>_({name:e.currentTarget.value||`Untitled`}),E.$$click=v,D.$$click=()=>_({...m()}),O.$$click=y,k.$$click=b,M.$$input=e=>_({state:e.currentTarget.value}),J(M,V(H,{get each(){return t()},children:e=>(()=>{var t=Ve();return J(t,()=>e.name),w(()=>t.value=e.name),t})()})),N.$$input=e=>_({assetId:e.currentTarget.value}),J(N,V(H,{get each(){return n()},children:e=>(()=>{var t=He(),n=t.firstChild,r=n.nextSibling,i=r.nextSibling.nextSibling;return i.nextSibling,J(t,()=>e.label,n),J(t,()=>e.frameWidth,r),J(t,()=>e.frameHeight,i),w(()=>t.value=e.id),t})()})),F.$$input=e=>_({size:Number(e.currentTarget.value)}),J(I,()=>Number(m().size).toFixed(2),ne),L.$$input=e=>_({frameDelay:Number(e.currentTarget.value)}),J(re,()=>m().frameDelay,ie),oe.$$input=e=>_({runEvery:Number(e.currentTarget.value)}),J(se,()=>Number(m().runEvery).toFixed(1),ce),ue.$$input=e=>_({flipped:e.currentTarget.checked}),de.$$input=e=>_({autoRun:e.currentTarget.checked}),z.$$click=()=>_({paused:!m().paused}),J(z,()=>m().paused?`Play`:`Pause`),pe.$$click=x,J(pe,()=>f()?`Copied`:`Copy`),J(me,g),w(()=>K(z,`aria-pressed`,m().paused)),w(()=>S.value=m().id),w(()=>C.value=m().name),w(()=>M.value=m().state),w(()=>N.value=m().assetId),w(()=>F.value=m().size),w(()=>L.value=m().frameDelay),w(()=>oe.value=m().runEvery),w(()=>ue.checked=m().flipped),w(()=>de.checked=m().autoRun),r})()}Ee([`input`,`click`]);var qe=G(`<label class=theme-checkbox><input type=checkbox><span class=theme-checkbox-box aria-hidden=true></span><span class=theme-checkbox-label>`),Q=G(`<a target=_blank rel=noreferrer>`),Je=G(`<span>`),Ye=G(`<svg aria-hidden=true viewBox="0 0 16 16"><path d="M4 3v5a3 3 0 0 0 3 3h1"></path><path d="M12 4v8"></path><circle cx=4 cy=3 r=2></circle><circle cx=12 cy=4 r=2></circle><circle cx=12 cy=12 r=2>`),Xe=G(`<svg aria-hidden=true viewBox="0 0 16 16"><circle cx=4 cy=4 r=2></circle><circle cx=4 cy=12 r=2></circle><circle cx=12 cy=12 r=2></circle><path d="M4 6v4"></path><path d="M6 4h2a4 4 0 0 1 4 4v2">`),Ze=G(`<svg aria-hidden=true viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=1.6 stroke-linecap=round stroke-linejoin=round><path>`),Qe=G(`<span class=pill>`),$e=G(`<span class=status-dot>`),et=G(`<section class=configurator-view aria-label="Chameleon configurator">`),tt=G(`<aside class=settings-popover><div class=section-head><div class=lhs><span>Settings</span></div></div><label class=setting-row><input type=checkbox><span>Show status bar`),nt=G(`<footer class=statusbar><span class=sb-item></span><span class="sb-item muted mono"></span><span class=sb-item>Batch </span><span class=spacer></span><span class="sb-item muted">build </span><span class="sb-item muted">wait </span><span class=sb-item>odoo.runbot`),rt=G(`<div class=app><aside class=activity><button class=activity-btn title=Runbot aria-label=Runbot></button><button class=activity-btn title="Chameleon configurator"aria-label="Chameleon configurator"></button><div class=spacer></div><button class=activity-btn title=Settings aria-label=Settings></button></aside><div class=appmain><header class=topbar><div class=crumbs><span class=proj><span class=mark>R</span> </span><span class=sep>/</span><span class=cur></span><span class=sep>·</span><span class="mono muted"></span></div><div class=topbar-spacer></div><label class=project-select title=Project><select></select></label><div class=searchwrap><input placeholder="branch, sha, module, PR"><span class=kbd>/</span></div><button class=filter-chip> PRs</button><button class=icon-btn title=Traffic>Traffic</button><button class="icon-btn primary"title=Refresh>Refresh`),it=G(`<option value=/runbot/rd-1>R&D`),at=G(`<option>`),ot=G(`<button class="section-head section-toggle"><div class=lhs><span class="chev sidebar-chev">›</span><span>Pinned branches</span></div><span class=count>`),st=G(`<div class=list>`),ct=G(`<div class=empty>Loading branches`),lt=G(`<div class=message-error>`),ut=G(`<aside class="col sidebar scroll"><button class="section-head section-toggle"><div class=lhs><span class="chev sidebar-chev">›</span><span>Branches</span></div><span class=count></span></button><button class="section-head section-toggle"><div class=lhs><span class="chev sidebar-chev">›</span><span>Batches</span><span class="pill-name mono"></span></div><span class=count>`),dt=G(`<div class=traffic-list>`),ft=G(`<aside class=traffic-pane><div class=traffic-head><h2>Server Traffic</h2><div class=traffic-actions><button class=record>Record</button><button>Stop</button><button>Clear`),pt=G(`<div class=main><section class=detail>`),mt=G(`<div class=list-row><button class=list-item><span class=name></span></button><button class="row-action pinned"title="Unstar branch">`),ht=G(`<div class=list-row><button class=list-item><span class=name></span></button><button class=row-action title="Star branch">`),gt=G(`<div class=empty>Search for a branch`),_t=G(`<button class=show-more>`),vt=G(`<button class=list-item><span class="name mono"></span><span class=meta>`),yt=G(`<div class=empty>`),bt=G(`<div class=builds><button class=load-logs> Expand All Logs`),xt=G(`<div class=log-loading>Loading tests`),St=G(`<div class="message-error compact">Invalid regular expression`),Ct=G(`<div class=test-group-list>`),wt=G(`<div class=test-section-head>Unparsed`),Tt=G(`<div class=failed-list>`),Et=G(`<div class="empty compact-empty">No tests for this filter`),Dt=G(`<div class="failed-view tests-view"><div class=failed-toolbar><select class=test-kind><option value=all>All</option><option value=parsed>Parsed</option><option value=unparsed>Unparsed</option><option value=raw>Raw</option></select><div class=failed-search><input placeholder="Search tests"></div><button title="Match case">Aa</button><button title="Match whole word">ab</button><button title="Use regular expression">.*</button><span class=toolbar-separator aria-hidden=true></span><button title="Expand all groups and tests"aria-label="Expand all groups and tests"></button><button title="Collapse all groups and tests"aria-label="Collapse all groups and tests"></button><button title="Show time in raw log lines">time</button></div><div class=test-results>`),Ot=G(`<div class=detail-body><div class=build-tabs><div class=tabbar><button>Builds</button><button>Tests <span>/`),kt=G(`<details class=detail-head><summary><div class=row1><span class=chev>›</span><span class=branch-name></span><span class=batch-chip>Batch </span><span class=batch-chip></span><label class=slot-select><select></select></label><div class=head-actions><button class=icon-btn title=More></button></div></div></summary><div class=batch-panel><div class=batch-panel-head><span></span></div><div class=build-meta-row><span class=metrics><span><span class=metric-label>build</span> <span class=metric-value></span></span><span><span class=metric-label>wait</span> <span class=metric-value></span></span><span><span class=metric-label>load</span> <span class=metric-value></span></span><span><span class=metric-value>/</span> <span class=metric-label>pass</span></span><span><span class=metric-error> fail</span> · <span class=metric-value></span> <span class=metric-label>run`),At=G(`<option> · <!> · `),jt=G(`<div class=log-loading>Loading logs`),Mt=G(`<details class=build-node><summary class=build-row><span class=tree></span><span class=chev>›</span><div class=bname><span class=bid></span><span class=label></span></div><span class=timing>`),Nt=G(`<div class=test-list>`),Pt=G(`<section class=test-group><div class=test-group-head role=button tabindex=0><span class=chev>›</span><span> (<!>)</span><button class=test-group-action>`),Ft=G(`<div class="empty compact-empty">No recorded traffic`),It=G(`<article class=traffic-entry><span></span><strong></strong><a class=traffic-url target=_blank rel=noreferrer></a><small>ms</small><time>`),Lt=G(`<details class=link-menu><summary>Links</summary><div>`),Rt=G(`<section><strong>`),zt=G(`<div class=batch-columns><section><h3>Links</h3><div class=commits></div></section><section><h3>Build slots</h3><div class=build-grid>`),Bt=G(`<a class="commit-ref branch-link"target=_blank rel=noreferrer><span class=ref-icon>`),Vt=G(`<a class="commit-ref pr-link"target=_blank rel=noreferrer><span class=ref-icon></span><span>`),Ht=G(`<div class=commit><span>:`),Ut=G(`<div class=build-card><button class=build-select><span class=build-name></span></button><span class=build-id>`),Wt=G(`<span class=run-link>`),Gt=G(`<span class=test-tag>`),Kt=G(`<button class=test-raw-toggle title="Show raw log lines parsed for this test">raw`),qt=G(`<div class=test-runner><span></span><code>`),Jt=G(`<div class=test-sub>tour <code>`),Yt=G(`<div class=test-sub>file <code>`),Xt=G(`<div class=test-lines>`),Zt=G(`<div class=test-crashes><div class=test-source-head>Browser crash`),Qt=G(`<div class=test-source><div class=test-source-head>Parsed from`),$t=G(`<article class=test-card><div class=test-main><button class=test-card-toggle><span class=chev>›</span></button><span class=test-kind-pill></span><span class=test-title></span><span class=test-child>`),en=G(`<div class=test-command><code></code><button title="Copy command">`),tn=G(`<pre class=test-message>`),nn=G(`<pre class="test-message crash">`),rn=G(`<pre class="test-message source">`),an=G(`<span>Date (UTC)`),on=G(`<span>Level`),sn=G(`<div class=log-table-head><span>Message`),cn=G(`<div class=log-table>`),ln=G(`<div class=inline-log>`),un=G(`<div class=log-loading>No visible log: `),dn=G(`<time>`),fn=G(`<strong>`),pn=G(`<div class=log-line><pre>`);async function mn(e,t){let n=await fetch(`/orpc/${e}`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(t)}),r=await n.json();if(!n.ok||r.error)throw Error(r.error??`oRPC call failed: ${e}`);return r.data}async function hn(e=``,t=`GET`){let n=await fetch(`/traffic${e}`,{method:t});if(!n.ok)throw Error(`Traffic request failed: ${n.status}`);return n.json()}function gn(e,t){return[e,t.date,t.level,t.message].join(``)}function _n(e){return[e.child.id,e.kind,e.id,e.pythonTest??``,e.jsTest??``,e.tourName??``,e.title].join(``)}function vn(e){return(()=>{var t=qe(),n=t.firstChild,r=n.nextSibling.nextSibling;return n.addEventListener(`change`,t=>e.onChange(t.currentTarget.checked)),J(r,()=>e.label),w(()=>K(t,`title`,e.title)),w(()=>n.checked=e.checked),t})()}function yn(e){let t=E(()=>e.href.startsWith(`/`)?`https://runbot.odoo.com${e.href}`:e.href);return(()=>{var n=Q();return J(n,()=>e.children),w(()=>K(n,`href`,t())),n})()}function bn(){return Ye()}function xn(){return Xe()}function $(e){let t={search:`M11 19a8 8 0 1 1 0-16 8 8 0 0 1 0 16ZM21 21l-3.5-3.5`,refresh:`M21 12a9 9 0 1 1-3-6.7L21 8M21 3v5h-5`,traffic:`M5 6h14M9 12h10M13 18h6`,open:`M14 3h7v7M21 3l-9 9M5 5h6M5 19h14v-6`,copy:`M9 9h11v11H9zM5 5h11v3M5 5v11h3`,layers:`M2 12 12 17l10-5M2 7l10 5 10-5L12 2 2 7Zm0 10 10 5 10-5`,branch:`M6 3v12M6 21v-2a4 4 0 0 1 4-4h4a4 4 0 0 0 4-4V3M6 19a2 2 0 1 0 0-4 2 2 0 0 0 0 4Zm12-14a2 2 0 1 0 0-4 2 2 0 0 0 0 4ZM6 5a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z`,list:`M8 6h13M8 12h13M8 18h13M3 6h.01M3 12h.01M3 18h.01`,bell:`M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9M14 21a2 2 0 1 1-4 0`,settings:`M12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6Zm7.4-3a8 8 0 0 0-.1-1.3l2-1.6-2-3.4-2.4.9a8 8 0 0 0-2.3-1.3L14 2h-4l-.6 2.3a8 8 0 0 0-2.3 1.3l-2.4-.9-2 3.4 2 1.6a8 8 0 0 0 0 2.6l-2 1.6 2 3.4 2.4-.9a8 8 0 0 0 2.3 1.3L10 22h4l.6-2.3a8 8 0 0 0 2.3-1.3l2.4.9 2-3.4-2-1.6c.1-.4.1-.9.1-1.3Z`,more:`M5 12h.01M12 12h.01M19 12h.01`,pet:`M6.5 10.5c0-3 2.3-5.5 5.2-5.5 3.2 0 5.8 2.6 5.8 5.8 0 4.2-3.5 7.2-7.6 6.3M7 8.5 4 6M6.5 13.5 3 15M15.2 8.4h.01M11.5 13.2c-1.4.2-2.9.8-4 1.9-1.4 1.4-2 3.2-1.6 4.7 1.5.4 3.3-.2 4.7-1.6 1.1-1.1 1.8-2.6 1.9-4`,star:`m12 2 3.1 6.3 6.9 1-5 4.9 1.2 6.8-6.2-3.3L5.8 21l1.2-6.8-5-4.9 6.9-1L12 2Z`,expand:`M8 3H3v5M3 3l6 6M16 3h5v5M21 3l-6 6M8 21H3v-5M3 21l6-6M16 21h5v-5M21 21l-6-6`,collapse:`M9 9H4V4M4 9l6-6M15 9h5V4M20 9l-6-6M9 15H4v5M4 15l6 6M15 15h5v5M20 15l-6 6`};return(()=>{var n=Ze(),r=n.firstChild;return w(i=>{var a=e.size??13,o=e.size??13,s=t[e.name];return a!==i.e&&K(n,`width`,i.e=a),o!==i.t&&K(n,`height`,i.t=o),s!==i.a&&K(r,`d`,i.a=s),i},{e:void 0,t:void 0,a:void 0}),n})()}function Sn(e,t){if(!e)return;if(e.status)return e.status;let n=t?.builds.map(e=>e.status).filter(Boolean)??[];if(n.includes(`error`))return`error`;if(n.includes(`warning`))return`warning`;if(n.includes(`pending`))return`pending`;if(n.includes(`success`))return`success`;if(e.buildIds.length===0)return`pending`}function Cn(e){return e===`warning`?`warn`:e===`pending`?`running`:e??`unknown`}function wn(e){return e===`success`?`PASS`:e===`error`?`FAIL`:e===`warning`?`WARN`:e===`pending`?`RUN`:(e??`UNKNOWN`).toUpperCase()}function Tn(e){let t=E(()=>Cn(e.status));return e.pill?(()=>{var n=Qe();return J(n,()=>wn(e.status)),w(()=>K(n,`data-status`,t())),n})():(()=>{var e=$e();return w(()=>K(e,`data-status`,t())),e})()}function En(e){return Sn(e.batches[0])}function Dn(e){return e.name?.trim()||`Build ${e.id}`}function On(e){return e.replace(/\s*View batch\.{0,3}\s*$/i,``).trim()}function kn(e){try{let t=new URL(e);return`${t.pathname}${t.search}${t.hash}`}catch{return e}}function An(e,t){return e.branches.find(e=>e.repository===t.repository)}function jn(e){let t=e?.mainBranch?.trim();return t&&/^\d+$/.test(t)?t:void 0}function Mn(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function Nn(e,t){if(!e)return;let n=t.regex?e:Mn(e),r=t.wholeWord?`\\b(?:${n})\\b`:n;try{return new RegExp(r,t.matchCase?`g`:`gi`)}catch{return}}function Pn(e,t){return t?(t.lastIndex=0,t.test(`${e.date} ${e.level} ${e.message}`)):!0}function Fn(){let e=new URLSearchParams(location.search).get(`state`);if(!e)return{};try{return JSON.parse(decodeURIComponent(atob(e)))}catch{return{}}}function In(e){let t=new URLSearchParams(location.search);t.set(`state`,btoa(encodeURIComponent(JSON.stringify(e)))),history.replaceState(null,``,`${location.pathname}?${t.toString()}`)}var Ln=`runbot-ui-prefs`;function Rn(){try{return JSON.parse(localStorage.getItem(Ln)??`{}`)}catch{return{}}}function zn(e){localStorage.setItem(Ln,JSON.stringify(e))}function Bn(){let e=Fn(),t=Rn(),[n,r]=S(e.projectPath??`/runbot/rd-1`),[i,a]=S(e.search??``),[o,s]=S(e.hasPr??!1),[c,l]=S(e.selectedBranchPath),[u,d]=S(e.selectedBatchId),[f,p]=S(e.selectedBuildId),[m,h]=S(e.selectedBuildName??e.buildName??`Community Run`),[g,_]=S({}),[v,y]=S({}),[b,x]=S(),[C,D]=S({}),[k,j]=S(),[ee,M]=S(0),[N,te]=S(!1),[P,F]=S(e.trafficOpen??!1),[I,ne]=S(t.headerOpen??e.headerOpen??!0),[L,re]=S(t.sidebarOpen??!0),[ie,ae]=S(e.activeView??`runbot`),[R,oe]=S(!1),[se,ce]=S(t.statusBarOpen??e.statusBarOpen??!0),[le,ue]=S(t.pinnedBranchesOpen??!0),[de,z]=S(t.branchesOpen??!0),[fe,pe]=S(t.batchesOpen??!0),[me,he]=S((()=>{let e=e=>/^\/runbot\/bundle\/\d{5,}$/.test(e),n=(t.pinnedBranches??[]).filter(t=>e(t.path)),r=new Set(n.map(e=>e.path)),i=(t.pinnedBranchPaths??[]).filter(e).filter(e=>!r.has(e)).map(e=>({path:e,name:e}));return[...n,...i]})()),[B,ge]=S(t.buildView===`failed`?`tests`:t.buildView??`builds`),[_e,ve]=S(``),[ye,be]=S(t.failedMatchCase??!1),[Ce,we]=S(t.failedWholeWord??!1),[Te,G]=S(t.failedRegex??!1),[Ee,De]=S(t.failedShowTime??!1),[q,Oe]=S(t.showRawTests??!1),[ke,Ae]=S(t.showSummaryTests??!1),[je,Me]=S(t.groupTestsByType??!1),[Y,Ne]=S({}),[Pe,Fe]=S({}),[X,Ie]=S(t.testViewMode??`all`),[Le,Re]=S(``),[ze,Be]=S(t.testMatchCase??!1),[Ve,He]=S(t.testWholeWord??!1),[Ue,We]=S(t.testRegex??!1),[Ge]=O(()=>mn(`list_projects`,{})),[Z,{refetch:qe}]=O(()=>({path:n(),search:i()||void 0,hasPr:o()}),e=>mn(`search_branches`,e)),Q=E(()=>{let e=Z()??[],t=me(),n=c();if(n){let r=e.find(e=>e.path===n);if(r)return r;let i=t.find(e=>e.path===n);if(i)return{...i,batches:i.batches??[]}}let r=t[0];return e[0]??(r?{...r,batches:r.batches??[]}:void 0)}),[Je]=O(u,e=>mn(`get_batch`,{batchId:e})),[Ye]=O(f,e=>mn(`get_build`,{buildId:e})),[Xe]=O(()=>Q()?.path,e=>mn(`list_batches`,{path:e})),[Ze]=O(k,e=>mn(`get_child_logs`,{...e,maxBytesPerLog:4e4})),[Qe,{refetch:$e}]=O(ee,()=>hn()),Lt=E(()=>new Set(me().map(e=>e.path))),Rt=E(()=>{let e=new Map((Z()??[]).map(e=>[e.path,e]));return me().map(t=>e.get(t.path)??{...t,batches:t.batches??[]})}),zt=E(()=>(Z()??[]).filter(e=>!Lt().has(e.path))),Bt=e=>{if(C()[e])return;let t=k();Ze.loading&&t?.buildId===e||j({buildId:e,logMatch:``})},Vt=E(()=>{let e=f();if(!e)return;let t=C()[e];if(t)return t;let n=k(),r=Ze();if(n?.buildId===e&&r)return r}),Ht=e=>Ze.loading&&!C()[e]&&k()?.buildId===e;T(()=>{let e=Ze();e&&D(t=>({...t,[e.buildId]:e}))}),T(()=>{let e=new Map((Z()??[]).map(e=>[e.path,e]));e.size!==0&&he(t=>t.map(t=>{let n=e.get(t.path);return n?{name:n.name,path:n.path,batches:n.batches}:t}))}),T(()=>{let e=Qe();e&&te(e.recording)}),T(()=>{if(!N())return;let e=window.setInterval(()=>M(e=>e+1),1e3);A(()=>window.clearInterval(e))});let Ut=async()=>{te((await hn(`/start`,`POST`)).recording),$e()},Wt=async()=>{te((await hn(`/stop`,`POST`)).recording),$e()},Gt=async()=>{te((await hn(`/clear`,`POST`)).recording),$e()},Kt=()=>{D({}),j(void 0),x(void 0),qe()};T(()=>{In({projectPath:n(),search:i(),hasPr:o(),selectedBranchPath:c(),selectedBatchId:u(),selectedBuildId:f(),selectedBuildName:m(),trafficOpen:P(),activeView:ie()})}),T(()=>{zn({buildView:B(),failedMatchCase:ye(),failedWholeWord:Ce(),failedRegex:Te(),failedShowTime:Ee(),showRawTests:q(),showSummaryTests:ke(),groupTestsByType:je(),testViewMode:X(),testMatchCase:ze(),testWholeWord:Ve(),testRegex:Ue(),headerOpen:I(),sidebarOpen:L(),statusBarOpen:se(),pinnedBranchesOpen:le(),branchesOpen:de(),batchesOpen:fe(),pinnedBranchPaths:me().map(e=>e.path),pinnedBranches:me()})});let qt=e=>{l(e.path);let t=g()[e.path];d((e.batches.find(e=>e.id===t)??e.batches[0])?.id)},Jt=e=>{he(t=>t.some(t=>t.path===e.path)?t.filter(t=>t.path!==e.path):[...t,{name:e.name,path:e.path,batches:e.batches}])},Yt=e=>{d(e),p(void 0);let t=Q();t&&_(n=>({...n,[t.path]:e}))},Xt=E(()=>{let e=Q();if(!e)return[];let t=Xe()&&Xe().length>0?Xe():e.batches;return v()[e.path]?t:t.slice(0,10)});T(()=>{let e=Q(),t=Xe();if(!e||!t||t.length===0)return;let n=g()[e.path];t.some(e=>e.id===u())||d((t.find(e=>e.id===n)??t[0])?.id)});let Zt=E(()=>{let e=new Map;for(let t of Vt()?.entries??[])e.set(t.child.id,[...e.get(t.child.id)??[],t]);return e}),Qt=E(()=>Nn(_e(),{matchCase:ye(),wholeWord:Ce(),regex:Te()}));E(()=>{let e=Qt();return(Vt()?.entries??[]).map(t=>{let n=(t.logs??[]).filter(e=>e.isError).filter(t=>Pn(t,e));return{...t,logs:n}}).filter(e=>e.logs.length>0)});let $t=E(()=>Nn(Le(),{matchCase:ze(),wholeWord:Ve(),regex:Ue()})),en=E(()=>{let e=$t();return(ke()?[...Vt()?.tests??[],...Vt()?.summaries??[]]:Vt()?.tests??[]).filter(t=>e?(e.lastIndex=0,e.test([t.kind,t.title,t.runner,t.pythonTest,t.pythonFile,t.jsTest,t.tourName,t.preset,t.command,...t.tags,...t.lines.map(e=>e.message),...(t.sourceLines??[]).map(e=>e.message),...(t.crashes??[]).flatMap(e=>[e.title,e.message])].filter(Boolean).join(` `))):!0)}),tn=E(()=>{let e={hoot:`Hoot`,tour:`Tours`,python:`Python`,summary:`Summary`,unknown:`Unknown`},t=[`python`,`hoot`,`tour`,`summary`,`unknown`],n=new Map;for(let t of en()){let r=n.get(t.kind)??{kind:t.kind,label:e[t.kind]??t.kind,tests:[]};r.tests.push(t),n.set(t.kind,r)}return[...n.values()].sort((e,n)=>t.indexOf(e.kind)-t.indexOf(n.kind))}),nn=()=>{Ne({}),Fe({})},rn=()=>{Ne(Object.fromEntries(tn().map(e=>[e.kind,!0]))),Fe(Object.fromEntries(en().map(e=>[_n(e),!0])))},an=e=>e.every(e=>Pe()[_n(e)]),on=(e,t)=>{Fe(n=>{let r={...n};for(let n of e)r[_n(n)]=t;return r})},sn=E(()=>{let e=$t();return(Vt()?.entries??[]).map(t=>{let n=(t.logs??[]).filter(e=>e.isError).filter(t=>Pn(t,e));return{...t,logs:n}}).filter(e=>e.logs.length>0)}),cn=E(()=>{let e=$t(),t=new Map;for(let n of Vt()?.unparsed??[]){if(!Pn(n.line,e))continue;let r=t.get(n.child.id);if(r){r.logs=[...r.logs??[],n.line];continue}t.set(n.child.id,{child:n.child,status:n.child.status,logs:[n.line]})}return[...t.values()].filter(e=>e.logs.length>0)}),ln=e=>{h(e.name),p(e.id),x(void 0)};return T(()=>{let e=Je();if(!e)return;let t=m().toLowerCase(),n=f();if(n&&e.builds.some(e=>e.id===n))return;let r=e.builds.find(e=>e.name.toLowerCase()===t)??e.builds.find(e=>e.name.toLowerCase().includes(t))??e.builds[0];r&&(h(r.name),p(r.id))}),T(()=>{let e=f();!e||B()===`builds`||Bt(e)}),(()=>{var e=rt(),t=e.firstChild,c=t.firstChild,l=c.nextSibling,d=l.nextSibling.nextSibling,p=t.nextSibling,h=p.firstChild.firstChild,g=h.firstChild;g.firstChild.nextSibling;var _=g.nextSibling.nextSibling,S=_.nextSibling.nextSibling,C=h.nextSibling.nextSibling,T=C.firstChild,D=C.nextSibling,O=D.firstChild,k=D.nextSibling,A=k.firstChild,j=k.nextSibling,ee=j.firstChild,M=j.nextSibling,te=M.firstChild;return c.$$click=()=>{ae(`runbot`),re(!0)},J(c,V($,{name:`list`,size:16})),l.$$click=()=>ae(`configurator`),J(l,V($,{name:`pet`,size:17})),d.$$click=()=>oe(e=>!e),J(d,V($,{name:`settings`,size:16})),J(g,()=>Ge()?.find(e=>e.path===n())?.name??`R&D`,null),J(_,()=>Q()?.name??`branch`),J(S,()=>u()??`batch`),T.$$input=e=>r(e.currentTarget.value),J(T,V(U,{get when(){return Ge()},get fallback(){return it()},get children(){return V(H,{get each(){return Ge()},children:e=>(()=>{var t=at();return J(t,()=>e.name),w(()=>t.value=e.path),t})()})}})),J(D,V($,{name:`search`,size:12}),O),O.$$input=e=>a(e.currentTarget.value),k.$$click=()=>s(e=>!e),J(k,V(xn,{}),A),j.$$click=()=>F(e=>!e),J(j,V($,{name:`traffic`,size:13}),ee),M.$$click=Kt,J(M,V($,{name:`refresh`,size:13}),te),J(p,V(U,{get when(){return ie()===`configurator`},get fallback(){return(()=>{var e=pt(),t=e.firstChild;return J(e,V(U,{get when(){return L()},get children(){var e=ut(),t=e.firstChild,n=t.firstChild.nextSibling,r=t.nextSibling,i=r.firstChild,a=i.firstChild.nextSibling.nextSibling,o=i.nextSibling;return J(e,V(U,{get when(){return Rt().length>0},get children(){return[(()=>{var e=ot(),t=e.firstChild.nextSibling;return e.$$click=()=>ue(e=>!e),J(t,()=>Rt().length),w(()=>K(e,`aria-expanded`,le())),e})(),V(U,{get when(){return le()},get children(){var e=st();return J(e,V(H,{get each(){return Rt()},children:e=>(()=>{var t=mt(),n=t.firstChild,r=n.firstChild,i=n.nextSibling;return n.$$click=()=>qt({...e,batches:e.batches??[]}),J(n,V(Tn,{get status(){return En({...e,batches:e.batches??[]})}}),r),J(r,()=>e.name),i.$$click=()=>Jt({...e,batches:e.batches??[]}),J(i,V($,{name:`star`,size:11})),w(t=>{var r=Cn(En({...e,batches:e.batches??[]})),a=Q()?.path===e.path?`1`:`0`,o=`Unstar ${e.name}`;return r!==t.e&&K(n,`data-status`,t.e=r),a!==t.t&&K(n,`data-selected`,t.t=a),o!==t.a&&K(i,`aria-label`,t.a=o),t},{e:void 0,t:void 0,a:void 0}),t})()})),e}})]}}),t),t.$$click=()=>z(e=>!e),J(n,()=>Z()?.length??0),J(e,V(U,{get when(){return de()},get children(){return V(xe,{get children(){return[V(Se,{get when(){return Z.loading},get children(){return ct()}}),V(Se,{get when(){return Z.error},get children(){var e=lt();return J(e,()=>String(Z.error)),e}}),V(Se,{get when(){return Z()},get children(){var e=st();return J(e,V(H,{get each(){return zt()},children:e=>(()=>{var t=ht(),n=t.firstChild,r=n.firstChild,i=n.nextSibling;return n.$$click=()=>qt(e),J(n,V(Tn,{get status(){return En(e)}}),r),J(r,()=>e.name),i.$$click=()=>Jt(e),J(i,V($,{name:`star`,size:11})),w(t=>{var r=Cn(En(e)),a=Q()?.path===e.path?`1`:`0`,o=`Star ${e.name}`;return r!==t.e&&K(n,`data-status`,t.e=r),a!==t.t&&K(n,`data-selected`,t.t=a),o!==t.a&&K(i,`aria-label`,t.a=o),t},{e:void 0,t:void 0,a:void 0}),t})()})),e}})]}})}}),r),r.$$click=()=>pe(e=>!e),J(a,()=>Q()?.name),J(o,()=>Xe()?.length??Q()?.batches.length??0),J(e,V(U,{get when(){return fe()},get children(){return V(U,{get when(){return Q()},get fallback(){return gt()},children:e=>(()=>{var t=st();return J(t,V(H,{get each(){return Xt()},children:e=>(()=>{var t=vt(),n=t.firstChild,r=n.nextSibling;return t.$$click=()=>Yt(e.id),J(t,V(Tn,{get status(){return Sn(e)}}),n),J(n,()=>e.id),J(r,()=>On(e.label)),w(n=>{var r=Cn(Sn(e)),i=u()===e.id?`1`:`0`;return r!==n.e&&K(t,`data-status`,n.e=r),i!==n.t&&K(t,`data-selected`,n.t=i),n},{e:void 0,t:void 0}),t})()}),null),J(t,V(U,{get when(){return(Xe()?.length??e().batches.length)>10},get children(){var t=_t();return t.$$click=()=>y(t=>({...t,[e().path]:!t[e().path]})),J(t,(()=>{var t=W(()=>!!v()[e().path]);return()=>t()?`Show less`:`Show more (${(Xe()?.length??e().batches.length)-10})`})()),t}}),null),t})()})}}),null),w(e=>{var n=de(),i=fe();return n!==e.e&&K(t,`aria-expanded`,e.e=n),i!==e.t&&K(r,`aria-expanded`,e.t=i),e},{e:void 0,t:void 0}),e}}),t),J(t,V(U,{get when(){return Ye()},get fallback(){return(()=>{var e=yt();return J(e,()=>f()||Ye.loading?`Loading build`:`Select a build`),e})()},children:e=>{let t=E(()=>e().children.filter(e=>e.status===`success`).length),n=E(()=>e().children.filter(e=>e.status===`error`).length),r=E(()=>e().children.filter(e=>e.status===`pending`).length);return[V(U,{get when(){return Je()},children:i=>(()=>{var a=kt(),o=a.firstChild,s=o.firstChild,c=s.firstChild.nextSibling,l=c.nextSibling;l.firstChild;var u=l.nextSibling,d=u.nextSibling,p=d.firstChild,h=d.nextSibling,g=h.firstChild,_=o.nextSibling,v=_.firstChild,y=v.firstChild,b=v.nextSibling,x=b.firstChild.firstChild,S=x.firstChild.nextSibling.nextSibling,C=x.nextSibling,T=C.firstChild.nextSibling.nextSibling,E=C.nextSibling,D=E.firstChild.nextSibling.nextSibling,O=E.nextSibling,k=O.firstChild,A=k.firstChild,j=O.nextSibling.firstChild,ee=j.firstChild,M=j.nextSibling.nextSibling;return a.addEventListener(`toggle`,e=>ne(e.currentTarget.open)),J(s,V(Tn,{get status(){return e().status}}),c),J(c,()=>i().bundle??Q()?.name),J(l,()=>i().id,null),J(u,()=>i().version??`version ?`),d.$$click=e=>e.stopPropagation(),p.addEventListener(`change`,e=>{let t=Number(e.currentTarget.value),n=i().builds.find(e=>e.id===t);n&&ln(n)}),J(p,V(H,{get each(){return i().builds},children:e=>(()=>{var t=At(),n=t.firstChild,r=n.nextSibling;return r.nextSibling,J(t,()=>Dn(e),n),J(t,()=>e.id,r),J(t,()=>wn(e.status),null),w(()=>t.value=e.id),t})()})),J(h,V(yn,{get href(){return`/runbot/build/${e().id}`},get children(){return[V($,{name:`open`,size:12}),` Open`]}}),g),J(g,V($,{name:`more`,size:14})),J(y,()=>i().createDate??`date ?`),J(v,V(yn,{get href(){return`/runbot/batch/${i().id}`},children:`Open batch`}),null),J(_,V(Hn,{get batch(){return i()},get selectedBuildId(){return f()},get selectedBuildName(){return m()},selectBuildSlot:ln}),b),J(S,()=>e().buildTime??`?`),J(T,()=>e().waitTime??`?`),J(D,()=>e().loadTime??`?`),J(k,t,A),J(k,()=>e().children.length,null),J(j,n,ee),J(M,r),w(()=>a.open=I()),w(()=>p.value=f()??``),a})()}),(()=>{var t=Ot(),n=t.firstChild,r=n.firstChild.firstChild,i=r.nextSibling,a=i.firstChild.nextSibling,o=a.firstChild;return r.$$click=()=>ge(`builds`),i.$$click=()=>{ge(`tests`),Bt(e().id)},J(a,()=>en().length,o),J(a,()=>cn().reduce((e,t)=>e+t.logs.length,0),null),J(n,V(xe,{get children(){return[V(Se,{get when(){return B()===`builds`},get children(){var t=bt(),n=t.firstChild,r=n.firstChild;return n.$$click=()=>{x(e().id),Bt(e().id)},J(n,V($,{name:`layers`,size:11}),r),J(t,V(H,{get each(){return e().children},children:t=>(()=>{var n=Mt(),r=n.firstChild,i=r.firstChild.nextSibling.nextSibling,a=i.firstChild,o=a.nextSibling,s=i.nextSibling;return J(a,()=>t.id),J(o,()=>t.name),J(s,()=>t.duration??``),J(r,V(Tn,{get status(){return t.status},pill:!0}),null),J(r,V(Vn,{get links(){return t.links}}),null),J(n,V(U,{get when(){return Ht(e().id)},get children(){return jt()}}),null),J(n,V(H,{get each(){return Zt().get(t.id)??[]},children:e=>V(Wn,{entry:e})}),null),w(r=>{var i=Cn(t.status),a=b()===e().id;return i!==r.e&&K(n,`data-status`,r.e=i),a!==r.t&&(n.open=r.t=a),r},{e:void 0,t:void 0}),n})()}),null),t}}),V(Se,{get when(){return B()===`tests`},get children(){var t=Dt(),n=t.firstChild,r=n.firstChild,i=r.nextSibling,a=i.firstChild,o=i.nextSibling,s=o.nextSibling,c=s.nextSibling,l=c.nextSibling.nextSibling,u=l.nextSibling,d=u.nextSibling,f=n.nextSibling;return r.addEventListener(`change`,e=>Ie(e.currentTarget.value)),J(i,V($,{name:`search`,size:11}),a),a.$$input=e=>Re(e.currentTarget.value),o.$$click=()=>Be(e=>!e),s.$$click=()=>He(e=>!e),c.$$click=()=>We(e=>!e),J(n,V(vn,{get checked(){return q()},label:`Raw`,title:`Show original raw log lines under parsed tests`,onChange:Oe}),l),J(n,V(vn,{get checked(){return ke()},label:`Summary`,title:`Show summary log lines in parsed tests`,onChange:Ae}),l),J(n,V(vn,{get checked(){return je()},label:`Group`,title:`Group parsed tests by type`,onChange:Me}),l),l.$$click=nn,J(l,V($,{name:`expand`,size:12})),u.$$click=rn,J(u,V($,{name:`collapse`,size:12})),d.$$click=()=>De(e=>!e),J(t,V(U,{get when(){return Ht(e().id)},get children(){return xt()}}),f),J(t,V(U,{get when(){return W(()=>!!(Le()&&Ue()))()&&!$t()},get children(){return St()}}),f),J(f,V(U,{get when(){return W(()=>X()===`all`||X()===`parsed`)()&&en().length>0},get children(){return V(U,{get when(){return je()},get fallback(){return(()=>{var e=Nt();return J(e,V(H,{get each(){return en()},children:e=>V(Un,{test:e,get showRaw(){return q()},get collapsed(){return!!Pe()[_n(e)]},onToggleCollapsed:()=>Fe(t=>({...t,[_n(e)]:!t[_n(e)]}))})})),e})()},get children(){var e=Ct();return J(e,V(H,{get each(){return tn()},children:e=>(()=>{var t=Pt(),n=t.firstChild,r=n.firstChild.nextSibling,i=r.firstChild,a=i.nextSibling;a.nextSibling;var o=r.nextSibling;return n.$$keydown=t=>{t.key!==`Enter`&&t.key!==` `||(t.preventDefault(),Ne(t=>({...t,[e.kind]:!t[e.kind]})))},n.$$click=()=>Ne(t=>({...t,[e.kind]:!t[e.kind]})),J(r,()=>e.label,i),J(r,()=>e.tests.length,a),o.$$click=t=>{t.stopPropagation(),on(e.tests,!an(e.tests))},J(o,V($,{get name(){return an(e.tests)?`expand`:`collapse`},size:11})),J(t,V(U,{get when(){return!Y()[e.kind]},get children(){var t=Nt();return J(t,V(H,{get each(){return e.tests},children:e=>V(Un,{test:e,get showRaw(){return q()},get collapsed(){return!!Pe()[_n(e)]},onToggleCollapsed:()=>Fe(t=>({...t,[_n(e)]:!t[_n(e)]}))})})),t}}),null),w(t=>{var r=!Y()[e.kind],i=`${Y()[e.kind]?`Expand`:`Collapse`} ${e.label}`,a=`${an(e.tests)?`Expand`:`Collapse`} tests in ${e.label}`,s=`${an(e.tests)?`Expand`:`Collapse`} tests in ${e.label}`;return r!==t.e&&K(n,`aria-expanded`,t.e=r),i!==t.t&&K(n,`title`,t.t=i),a!==t.a&&K(o,`title`,t.a=a),s!==t.o&&K(o,`aria-label`,t.o=s),t},{e:void 0,t:void 0,a:void 0,o:void 0}),t})()})),e}})}}),null),J(f,V(U,{get when(){return W(()=>X()===`all`||X()===`unparsed`)()&&cn().length>0},get children(){return[wt(),(()=>{var e=Tt();return J(e,V(H,{get each(){return cn()},children:e=>V(Wn,{entry:e,showHeader:!1,showLevel:!1,get showTime(){return Ee()},compact:!0})})),e})()]}}),null),J(f,V(U,{get when(){return W(()=>X()===`raw`)()&&sn().length>0},get children(){var e=Tt();return J(e,V(H,{get each(){return sn()},children:e=>V(Wn,{entry:e,showHeader:!1,showLevel:!1,get showTime(){return Ee()},compact:!0})})),e}}),null),J(f,V(U,{get when(){return W(()=>!Ht(e().id))()&&(X()===`parsed`&&en().length===0||X()===`unparsed`&&cn().length===0||X()===`raw`&&sn().length===0||X()===`all`&&en().length===0&&cn().length===0)},get children(){return Et()}}),null),w(e=>{var t=!!ze(),n=!!Ve(),r=!!Ue(),i=!!Ee();return t!==e.e&&o.classList.toggle(`active`,e.e=t),n!==e.t&&s.classList.toggle(`active`,e.t=n),r!==e.a&&c.classList.toggle(`active`,e.a=r),i!==e.o&&d.classList.toggle(`active`,e.o=i),e},{e:void 0,t:void 0,a:void 0,o:void 0}),w(()=>r.value=X()),w(()=>a.value=Le()),t}})]}}),null),w(e=>{var t=B()===`builds`,n=B()===`tests`;return t!==e.e&&r.classList.toggle(`active`,e.e=t),n!==e.t&&i.classList.toggle(`active`,e.t=n),e},{e:void 0,t:void 0}),t})()]}})),J(e,V(U,{get when(){return P()},get children(){var e=ft(),t=e.firstChild.firstChild.nextSibling.firstChild,n=t.nextSibling,r=n.nextSibling;return t.$$click=Ut,n.$$click=Wt,r.$$click=Gt,J(e,V(xe,{get children(){return[V(Se,{get when(){return Qe.error},get children(){var e=lt();return J(e,()=>String(Qe.error)),e}}),V(Se,{get when(){return Qe()},get children(){var e=dt();return J(e,V(U,{get when(){return(Qe()?.entries.length??0)>0},get fallback(){return Ft()},get children(){return V(H,{get each(){return Qe()?.entries},children:e=>(()=>{var t=It(),n=t.firstChild,r=n.nextSibling,i=r.nextSibling,a=i.nextSibling,o=a.firstChild,s=a.nextSibling;return J(n,()=>e.status??`ERR`),J(r,()=>e.method),J(i,()=>kn(e.url)),J(a,()=>e.durationMs??`?`,o),J(s,()=>new Date(e.time).toLocaleTimeString()),w(n=>{var r=!!(e.error||(e.status??200)>=400),a=e.url,o=e.url;return r!==n.e&&t.classList.toggle(`failed`,n.e=r),a!==n.t&&K(i,`href`,n.t=a),o!==n.a&&K(i,`title`,n.a=o),n},{e:void 0,t:void 0,a:void 0}),t})()})}})),e}})]}}),null),w(e=>{var r=N(),i=!N();return r!==e.e&&(t.disabled=e.e=r),i!==e.t&&(n.disabled=e.t=i),e},{e:void 0,t:void 0}),e}}),null),w(t=>{var n=!!P(),r=!L();return n!==t.e&&e.classList.toggle(`traffic-open`,t.e=n),r!==t.t&&e.classList.toggle(`sidebar-hidden`,t.t=r),t},{e:void 0,t:void 0}),e})()},get children(){var e=et();return J(e,V(Ke,{title:`Chameleon Configurator`,description:`Tune the runbot pet atlas, animation state, timing, and exported Solid snippet.`})),e}}),null),J(e,V(U,{get when(){return R()},get children(){var e=tt(),t=e.firstChild.nextSibling.firstChild;return t.$$input=e=>ce(e.currentTarget.checked),w(()=>t.checked=se()),e}}),null),J(e,V(U,{get when(){return se()},get children(){var e=nt(),t=e.firstChild,n=t.nextSibling,r=n.nextSibling;r.firstChild;var i=r.nextSibling.nextSibling;i.firstChild;var a=i.nextSibling;return a.firstChild,J(t,V($,{name:`branch`,size:11}),null),J(t,()=>Q()?.name??`branch`,null),J(n,()=>Ye()?.commit??``),J(r,()=>u()??`?`,null),J(i,()=>Ye()?.buildTime??`?`,null),J(a,()=>Ye()?.waitTime??`?`,null),e}}),null),w(e=>{var t=ie()===`runbot`,n=ie()===`configurator`,r=!!R(),i=o()?`1`:`0`,a=!!P();return t!==e.e&&c.classList.toggle(`active`,e.e=t),n!==e.t&&l.classList.toggle(`active`,e.t=n),r!==e.a&&d.classList.toggle(`active`,e.a=r),i!==e.o&&K(k,`data-on`,e.o=i),a!==e.i&&j.classList.toggle(`active`,e.i=a),e},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0}),w(()=>T.value=n()),w(()=>O.value=i()),e})()}function Vn(e){let t=E(()=>{let t=new Map;for(let n of e.links)t.set(n.kind,[...t.get(n.kind)??[],n]);return[...t.entries()].filter(([e])=>e!==`other`)});return(()=>{var e=Lt(),n=e.firstChild.nextSibling;return e.$$click=e=>e.stopPropagation(),J(n,V(H,{get each(){return t()},children:([e,t])=>(()=>{var n=Rt(),r=n.firstChild;return J(r,e),J(n,V(H,{each:t,children:e=>V(yn,{get href(){return e.url},get children(){return e.label}})}),null),n})()})),e})()}function Hn(e){return(()=>{var t=zt(),n=t.firstChild,r=n.firstChild.nextSibling,i=n.nextSibling.firstChild.nextSibling;return J(r,V(H,{get each(){return e.batch.commits},children:t=>{let n=E(()=>An(e.batch,t));return(()=>{var e=Ht(),r=e.firstChild,i=r.firstChild;return J(r,()=>t.repository,i),J(e,V(U,{get when(){return t.githubUrl},get fallback(){return(()=>{var e=Je();return J(e,()=>t.sha),e})()},get children(){return V(yn,{get href(){return t.githubUrl},get children(){return t.sha}})}}),null),J(e,V(U,{get when(){return W(()=>!!n()?.devUrl)()&&n()?.devBranch},get fallback(){return Je()},get children(){var e=Bt(),t=e.firstChild;return J(t,V(bn,{})),w(t=>{var r=n().devUrl,i=`Branch ${n().devBranch}`;return r!==t.e&&K(e,`href`,t.e=r),i!==t.t&&K(e,`title`,t.t=i),t},{e:void 0,t:void 0}),e}}),null),J(e,V(U,{get when(){return W(()=>!!n()?.mainUrl)()&&jn(n())},get fallback(){return Je()},get children(){var e=Vt(),t=e.firstChild,r=t.nextSibling;return J(t,V(xn,{})),J(r,()=>jn(n())),w(t=>{var r=n().mainUrl,i=`PR ${jn(n())}`;return r!==t.e&&K(e,`href`,t.e=r),i!==t.t&&K(e,`title`,t.t=i),t},{e:void 0,t:void 0}),e}}),null),e})()}})),J(i,V(H,{get each(){return e.batch.builds},children:t=>(()=>{var n=Ut(),r=n.firstChild,i=r.firstChild,a=r.nextSibling;return r.$$click=()=>e.selectBuildSlot(t),J(i,()=>Dn(t)),J(a,()=>t.id),J(n,V(Tn,{get status(){return t.status},pill:!0}),null),J(n,V(U,{get when(){return t.runUrl},children:e=>V(yn,{get href(){return e()},get children(){var e=Wt();return J(e,V($,{name:`open`,size:11})),w(n=>{var r=`Open run ${t.id}`,i=`Open run ${t.id}`;return r!==n.e&&K(e,`title`,n.e=r),i!==n.t&&K(e,`aria-label`,n.t=i),n},{e:void 0,t:void 0}),e}})}),null),w(i=>{var o=Cn(t.status),s=e.selectedBuildId===t.id||e.selectedBuildName===t.name?`1`:`0`,c=`${Dn(t)} ${t.id} ${t.statusLabel??t.status??``}`.trim(),l=`Select ${Dn(t)}`,u=`Build ${t.id}`;return o!==i.e&&K(n,`data-status`,i.e=o),s!==i.t&&K(n,`data-selected`,i.t=s),c!==i.a&&K(n,`title`,i.a=c),l!==i.o&&K(r,`title`,i.o=l),u!==i.i&&K(a,`title`,i.i=u),i},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0}),n})()})),t})()}function Un(e){let[t,n]=S(!1),r=E(()=>{let t=new Set;return[...e.test.sourceLines??e.test.lines,...(e.test.crashes??[]).map(e=>e.sourceLine)].filter(n=>{let r=gn(e.test.child.id,n);return t.has(r)?!1:(t.add(r),!0)})}),i=E(()=>e.showRaw||t()),a=async()=>{e.test.command&&await navigator.clipboard?.writeText(e.test.command)};return(()=>{var t=$t(),o=t.firstChild,s=o.firstChild,c=s.nextSibling,l=c.nextSibling,u=l.nextSibling;return De(o,`click`,e.onToggleCollapsed,!0),J(c,()=>e.test.kind),J(l,()=>e.test.title),J(u,()=>e.test.child.id),J(o,V(U,{get when(){return e.test.preset},get children(){var t=Gt();return J(t,()=>e.test.preset),t}}),null),J(o,V(U,{get when(){return r().length>0},get children(){var e=Kt();return e.$$click=e=>{e.stopPropagation(),n(e=>!e)},w(()=>e.classList.toggle(`active`,!!i())),e}}),null),J(t,V(U,{get when(){return!e.collapsed},get children(){return[V(U,{get when(){return e.test.pythonTest},get children(){var t=qt(),n=t.firstChild,r=n.nextSibling;return J(n,(()=>{var t=W(()=>e.test.runner===`start_tour`);return()=>t()?`tour runner`:e.test.runner===`browser_js`?`browser runner`:`python`})()),J(r,()=>e.test.pythonTest),t}}),V(U,{get when(){return W(()=>!!e.test.tourName)()&&e.test.title!==e.test.tourName},get children(){var t=Jt(),n=t.firstChild.nextSibling;return J(n,()=>e.test.tourName),t}}),V(U,{get when(){return e.test.pythonFile},get children(){var t=Yt(),n=t.firstChild.nextSibling;return J(n,()=>e.test.pythonFile),t}}),V(U,{get when(){return e.test.command},children:e=>(()=>{var t=en(),n=t.firstChild,r=n.nextSibling;return J(n,e),r.$$click=a,J(r,V($,{name:`copy`,size:11})),t})()}),(()=>{var t=Xt();return J(t,V(H,{get each(){return e.test.lines},children:e=>(()=>{var t=tn();return J(t,()=>e.message),t})()})),t})(),V(U,{get when(){return(e.test.crashes??[]).length>0},get children(){var t=Zt();return t.firstChild,J(t,V(H,{get each(){return e.test.crashes},children:e=>(()=>{var t=nn();return J(t,()=>e.message),t})()}),null),t}}),V(U,{get when(){return W(()=>!!i())()&&r().length>0},get children(){var e=Qt();return e.firstChild,J(e,V(H,{get each(){return r()},children:e=>(()=>{var t=rn();return J(t,()=>e.message),t})()}),null),e}})]}}),null),w(n=>{var r=e.test.kind,i=e.collapsed?`Expand test`:`Collapse test`,a=!e.collapsed,c=e.collapsed?`Expand test`:`Collapse test`,l=e.collapsed?`Expand test`:`Collapse test`,u=!e.collapsed;return r!==n.e&&K(t,`data-kind`,n.e=r),i!==n.t&&K(o,`title`,n.t=i),a!==n.a&&s.classList.toggle(`expanded`,n.a=a),c!==n.o&&K(s,`title`,n.o=c),l!==n.i&&K(s,`aria-label`,n.i=l),u!==n.n&&K(s,`aria-expanded`,n.n=u),n},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0}),t})()}function Wn(e){let t=E(()=>e.entry.logs??[]),n=E(()=>e.showHeader??!0),r=E(()=>e.showLevel??!0),i=E(()=>e.showTime??!0);return(()=>{var a=ln();return J(a,V(U,{get when(){return t().length>0},get fallback(){return(()=>{var t=un();return t.firstChild,J(t,()=>e.entry.status,null),t})()},get children(){var e=cn();return J(e,V(U,{get when(){return n()},get children(){var e=sn(),t=e.firstChild;return J(e,V(U,{get when(){return i()},get children(){return an()}}),t),J(e,V(U,{get when(){return r()},get children(){return on()}}),t),e}}),null),J(e,V(H,{get each(){return t()},children:e=>(()=>{var t=pn(),n=t.firstChild;return J(t,V(U,{get when(){return i()},get children(){var t=dn();return J(t,()=>e.date),t}}),n),J(t,V(U,{get when(){return r()},get children(){var t=fn();return J(t,()=>e.level),t}}),n),J(n,()=>e.message),w(()=>t.classList.toggle(`is-error`,!!e.isError)),t})()}),null),e}})),w(t=>{var n=e.entry.child.status===`error`||e.entry.status===`error`,o=!!e.compact,s=!r(),c=!i();return n!==t.e&&a.classList.toggle(`is-error`,t.e=n),o!==t.t&&a.classList.toggle(`is-compact`,t.t=o),s!==t.a&&a.classList.toggle(`no-level`,t.a=s),c!==t.o&&a.classList.toggle(`no-time`,t.o=c),t},{e:void 0,t:void 0,a:void 0,o:void 0}),a})()}Te(()=>V(Bn,{}),document.getElementById(`root`)),Ee([`click`,`input`,`keydown`]);
@@ -0,0 +1 @@
1
+ :root{--bg:#fff;--bg-elev:#fafaf9;--bg-sunken:#f3f3f0;--bg-side:#f6f6f4;--bg-activity:#ececea;--bg-hover:#0000000a;--bg-selected:color-mix(in oklab, var(--bg-sunken) 78%, #d7d7d1);--bg-focus:color-mix(in oklab, var(--bg-sunken) 70%, #c9c9c1);--fg:#1c1b18;--fg-muted:#5e5d56;--fg-subtle:#8a8981;--fg-faint:#b6b5ad;--border:#14140c14;--border-strong:#14140c29;--accent:#5f625c;--success:#1f9d55;--success-bg:color-mix(in oklab, var(--success) 12%, transparent);--error:#d2351b;--error-bg:color-mix(in oklab, var(--error) 11%, transparent);--warn:#d28d1b;--warn-bg:color-mix(in oklab, var(--warn) 13%, transparent);--info:#2563eb;--info-bg:color-mix(in oklab, var(--info) 12%, transparent);--neutral:#6b7280;--neutral-bg:color-mix(in oklab, var(--neutral) 14%, transparent);--radius:3px;--row-h:22px;--activity-w:40px;--sidebar-w:280px;--font-sans:-apple-system, "Inter", "Segoe UI", Roboto, "Helvetica Neue", system-ui, sans-serif;--font-mono:"JetBrains Mono", ui-monospace, "SF Mono", Menlo, Consolas, monospace;--t-xxs:9.5px;--t-xs:10.5px;--t-sm:11px;--t-md:12px;--t-lg:13px}*,:before,:after{box-sizing:border-box}html,body,#root{height:100%}body{background:var(--bg);color:var(--fg);font-family:var(--font-sans);font-size:var(--t-md);text-rendering:optimizelegibility;margin:0;line-height:1.35;overflow:hidden}button,input,select{font:inherit}button{color:inherit}a{color:var(--info);text-decoration:none}a:hover{text-decoration:underline}h1,h2,h3,p{margin:0}.mono{font-family:var(--font-mono)}.muted{color:var(--fg-muted)}.app{grid-template-areas:"act main""status status";grid-template-columns:var(--activity-w) 1fr;grid-template-rows:1fr auto;height:100vh;display:grid;overflow:hidden}.activity{grid-area:act}.appmain{grid-area:main;grid-template-rows:auto 1fr;min-width:0;min-height:0;display:grid;overflow:hidden}.statusbar{grid-area:status}.activity{background:var(--bg-activity);border-right:1px solid var(--border);flex-direction:column;align-items:center;gap:2px;padding:6px 0;display:flex}.activity .spacer,.statusbar .spacer{flex:1}.activity-btn{color:var(--fg-subtle);cursor:default;background:0 0;border:0;border-radius:4px;place-items:center;width:32px;height:32px;display:grid;position:relative}.activity-btn:hover,.activity-btn.active{color:var(--fg)}.activity-btn.active:before{background:var(--fg-muted);content:"";border-radius:0 2px 2px 0;width:2px;position:absolute;top:4px;bottom:4px;left:-4px}.topbar{background:var(--bg-elev);border-bottom:1px solid var(--border);align-items:center;gap:8px;height:34px;padding:5px 10px;display:flex}.crumbs{color:var(--fg-muted);white-space:nowrap;align-items:center;gap:5px;min-width:0;display:flex}.crumbs .cur{color:var(--fg);text-overflow:ellipsis;max-width:260px;font-weight:500;overflow:hidden}.crumbs .sep{color:var(--fg-faint)}.proj{background:var(--bg-sunken);border:1px solid var(--border);border-radius:var(--radius);color:var(--fg);align-items:center;gap:5px;padding:1px 6px 1px 4px;display:inline-flex}.mark{background:var(--fg-muted);color:#fff;font-family:var(--font-mono);border-radius:3px;place-items:center;width:14px;height:14px;font-size:9px;font-weight:700;display:grid}.topbar-spacer{flex:1}.project-select select{background:var(--bg-sunken);border:1px solid var(--border);border-radius:var(--radius);color:var(--fg);max-width:130px;height:22px}.searchwrap{background:var(--bg-sunken);border:1px solid var(--border-strong);border-radius:var(--radius);flex:300px;align-items:center;gap:5px;min-width:160px;max-width:460px;height:22px;padding:0 8px;display:flex}.searchwrap:focus-within{background:var(--bg);border-color:var(--border-strong);box-shadow:0 0 0 2px var(--bg-focus)}.searchwrap input{color:inherit;background:0 0;border:0;outline:none;flex:1;min-width:0;height:100%}.kbd{color:var(--fg-subtle);font-family:var(--font-mono);font-size:10px}.icon-btn,.filter-chip{border-radius:var(--radius);color:var(--fg-muted);cursor:default;white-space:nowrap;background:0 0;border:1px solid #0000;align-items:center;gap:5px;height:22px;padding:0 7px;display:inline-flex}.icon-btn:hover,.filter-chip:hover,.icon-btn.active{background:var(--bg-hover);color:var(--fg)}.icon-btn.primary{background:var(--fg-muted);border-color:color-mix(in oklab, var(--fg-muted) 70%, #000);color:#fff}.filter-chip{border-color:var(--border);font-size:var(--t-sm);border-radius:999px}.filter-chip[data-on="1"]{background:var(--bg-selected);border-color:var(--border-strong);color:var(--fg)}.filter-chip svg{width:12px;height:12px}.main{grid-template-columns:var(--sidebar-w) minmax(0, 1fr);min-width:0;min-height:0;display:grid;overflow:hidden}.main.traffic-open{grid-template-columns:var(--sidebar-w) minmax(0, 1fr) 330px}.main.sidebar-hidden{grid-template-columns:minmax(0,1fr)}.main.sidebar-hidden.traffic-open{grid-template-columns:minmax(0,1fr) 330px}.col{border-right:1px solid var(--border);flex-direction:column;min-width:0;min-height:0;display:flex;overflow:hidden}.sidebar{background:var(--bg-side)}.scroll{overflow-y:auto}.section-head{color:var(--fg-muted);cursor:default;font-size:var(--t-xxs);letter-spacing:.08em;text-transform:uppercase;-webkit-user-select:none;user-select:none;background:0 0;border:0;justify-content:space-between;align-items:center;gap:6px;width:100%;height:22px;padding:0 8px 0 10px;font-weight:600;line-height:1;display:flex}.section-toggle{cursor:default}.section-toggle:hover{background:var(--bg-hover)}.section-head .lhs{flex:1;align-items:center;gap:4px;min-width:0;display:flex}.section-head .twirl,.section-head .sidebar-chev{color:var(--fg-faint);font-size:var(--t-sm);justify-content:center;align-items:center;width:10px;height:14px;line-height:14px;display:inline-flex}.section-head .sidebar-chev{transition:transform .12s}.section-toggle[aria-expanded=true] .sidebar-chev{transform:rotate(90deg)}.section-head .count,.pill-name{color:var(--fg-faint);font-family:var(--font-mono);font-size:var(--t-sm);letter-spacing:0;text-overflow:ellipsis;text-transform:none;white-space:nowrap;font-weight:500;overflow:hidden}.pill-name{color:var(--fg-subtle)}.list{flex-direction:column;padding:0 4px 4px;display:flex}.subsection-head{color:var(--fg-faint);font-size:var(--t-xxs);letter-spacing:.06em;text-transform:uppercase;height:18px;padding:0 6px;line-height:18px}.list-row{grid-template-columns:minmax(0,1fr) 20px;align-items:stretch;display:grid}.list-row:hover{background:var(--bg-hover)}.list-row:has(.list-item[data-selected="1"]){background:var(--bg-selected);box-shadow:inset 2px 0 0 var(--fg-muted)}.list-item{border-radius:var(--radius);color:var(--fg);cursor:default;font-size:var(--t-md);min-height:var(--row-h);text-align:left;background:0 0;border:0;grid-template-columns:12px minmax(0,1fr) auto;align-items:center;gap:6px;width:100%;padding:0 6px;display:grid;position:relative}.row-action{border-radius:var(--radius);color:var(--fg-faint);cursor:default;min-height:var(--row-h);opacity:0;background:0 0;border:0;justify-content:center;align-items:center;padding:0;display:inline-flex}.list-row:hover .row-action,.row-action:focus-visible,.row-action.pinned{opacity:1}.list-row:hover .row-action{color:var(--fg-subtle)}.row-action:hover,.row-action.pinned{color:var(--fg)}.row-action svg{fill:none}.row-action.pinned svg,.row-action:hover svg,.row-action:focus-visible svg{fill:currentColor}.list>.list-item:hover{background:var(--bg-hover)}.list>.list-item[data-selected="1"]{background:var(--bg-selected);box-shadow:inset 2px 0 0 var(--fg-muted)}.list-item:hover{background:0 0}.list-item[data-selected="1"]{box-shadow:none;background:0 0}.list-item .name{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.list-item .meta{color:var(--fg-subtle);font-family:var(--font-mono);font-size:var(--t-sm);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.show-more,.load-logs{border:1px dashed var(--border-strong);border-radius:var(--radius);color:var(--fg-muted);cursor:default;font-size:var(--t-sm);background:0 0;justify-content:center;align-items:center;gap:5px;height:20px;margin:4px 8px;padding:2px 8px;display:inline-flex}.show-more:hover,.load-logs:hover{background:var(--bg-hover);color:var(--fg)}.status-dot{background:var(--neutral);border-radius:50%;flex-shrink:0;width:7px;height:7px}.status-dot[data-status=success]{background:var(--success)}.status-dot[data-status=error]{background:var(--error)}.status-dot[data-status=warn]{background:var(--warn)}.status-dot[data-status=running]{background:var(--info)}.status-dot[data-status=unknown]{background:var(--neutral)}.pill{font-family:var(--font-mono);letter-spacing:.06em;text-transform:uppercase;white-space:nowrap;border:1px solid #0000;border-radius:2px;align-items:center;height:14px;padding:0 5px;font-size:9.5px;font-weight:600;display:inline-flex}.pill[data-status=success]{background:var(--success-bg);border-color:color-mix(in oklab, var(--success) 25%, transparent);color:var(--success)}.pill[data-status=error]{background:var(--error-bg);border-color:color-mix(in oklab, var(--error) 25%, transparent);color:var(--error)}.pill[data-status=warn]{background:var(--warn-bg);border-color:color-mix(in oklab, var(--warn) 25%, transparent);color:var(--warn)}.pill[data-status=running]{background:var(--info-bg);border-color:color-mix(in oklab, var(--info) 25%, transparent);color:var(--info)}.pill[data-status=unknown]{background:var(--neutral-bg);border-color:var(--border);color:var(--neutral)}.detail{flex-direction:column;min-width:0;min-height:0;display:flex;overflow:hidden}.detail-head{background:var(--bg-elev);border-bottom:1px solid var(--border);flex-shrink:0;padding:0;display:grid}.detail-head>summary{cursor:pointer;padding:6px 12px;list-style:none}.detail-head>summary::-webkit-details-marker{display:none}.detail-head[open]>summary .row1>.chev{transform:rotate(90deg)}.detail-head>summary:hover{background:var(--bg-hover)}.batch-panel{background:var(--bg-elev);border-top:1px solid var(--border);padding:6px 12px 8px}.batch-panel-head{color:var(--fg-muted);font-size:var(--t-sm);align-items:center;gap:8px;margin-bottom:5px;display:flex}.detail-head .row1{align-items:center;gap:8px;min-height:22px;display:flex}.branch-name{color:var(--fg);font-size:var(--t-lg);text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-weight:600;overflow:hidden}.detail-head .build-id,.build-id{color:var(--fg-muted);font-family:var(--font-mono);font-size:var(--t-sm)}.detail-head h1{font-size:var(--t-lg);text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-weight:600;overflow:hidden}.head-actions{align-items:center;gap:4px;display:flex}.meta-row{color:var(--fg-muted);font-size:var(--t-sm);flex-wrap:wrap;align-items:center;gap:5px;display:flex}.batch-panel .build-meta-row{border-top:1px solid var(--border);margin-top:8px;padding-top:6px}.meta-row .sep{color:var(--fg-faint);padding:0 2px}.detail-body{flex:1;min-height:0;padding:8px 12px 30px;display:flex;overflow:hidden}.batch-chip{background:var(--bg-sunken);border:1px solid var(--border);border-radius:var(--radius);font-size:var(--t-sm);padding:1px 5px}.slot-select{align-items:center;display:inline-grid;position:relative}.slot-select:after{color:var(--fg-subtle);content:"⌄";pointer-events:none;position:absolute;top:1px;right:7px}.slot-select select{appearance:none;background:var(--bg);border:1px solid var(--border-strong);border-radius:var(--radius);color:var(--fg);font-size:var(--t-sm);min-width:190px;max-width:260px;height:22px;padding:0 22px 0 7px}.slot-select select:focus{border-color:var(--border-strong);box-shadow:0 0 0 2px var(--bg-focus);outline:none}.metrics{color:var(--fg-subtle);font-size:var(--t-sm);flex-wrap:wrap;flex:320px;align-items:center;gap:10px;min-width:180px;font-weight:400;display:flex}.metrics span{white-space:nowrap;font-weight:400}.metrics .metric-label{color:var(--fg-subtle)}.metrics .metric-value{color:var(--fg)}.metrics .metric-error{color:var(--error)}.batch-columns{grid-template-columns:minmax(260px,1fr) minmax(260px,1fr);gap:8px;display:grid}.batch-columns h3{color:var(--fg-muted);font-size:var(--t-xxs);letter-spacing:.08em;text-transform:uppercase;margin:0 0 4px;font-weight:600}.commits,.build-grid{gap:0;display:grid}.commit,.build-card{background:var(--bg);border:1px solid var(--border);font-size:var(--t-sm);align-items:center;min-width:0;height:22px;margin-top:-1px;padding:0 6px;display:grid;overflow:hidden}.commit:first-child,.build-card:first-child{margin-top:0}.commit{grid-template-columns:minmax(54px,76px) 64px 18px minmax(0,1fr);gap:4px}.commit span,.commit a,.build-card span{text-overflow:ellipsis;white-space:nowrap;font-weight:400;overflow:hidden}.commit-ref{grid-template-columns:auto minmax(0,1fr);align-items:center;gap:3px;min-width:0;display:grid}.ref-icon{color:var(--fg-muted);justify-content:center;align-items:center;width:14px;height:14px;display:flex}.ref-icon svg{fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.6px;width:13px;height:13px}.pr-link{color:var(--info)}.build-card{cursor:default;text-align:left;border-radius:0;grid-template-columns:minmax(0,1fr) 76px auto auto;gap:6px;padding:0 4px 0 0}.build-card:hover{background:var(--bg-hover)}.build-card[data-selected="1"]{background:var(--bg-selected);box-shadow:inset 2px 0 0 var(--fg-muted)}.build-card[data-status=success]{color:var(--success)}.build-card[data-status=error]{color:var(--error)}.build-card[data-status=warn]{color:var(--warn)}.build-card[data-status=running]{color:var(--info)}.build-card .build-id{color:inherit;font-family:var(--font-mono);text-align:right;-webkit-user-select:text;user-select:text}.build-select{color:inherit;font:inherit;text-align:left;background:0 0;border:0;align-items:center;gap:6px;min-width:0;height:100%;padding:0 0 0 6px;display:grid}.run-link{border-left:1px solid var(--border);color:var(--info);justify-content:center;align-items:center;width:20px;height:18px;display:flex}.run-link:hover{background:var(--bg-hover);color:var(--info)}.builds{background:var(--bg);border:1px solid var(--border);border-radius:4px;flex-direction:column;display:flex;overflow:visible}.build-tabs{border:1px solid var(--border);border-radius:4px;flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.tabbar{background:var(--bg-elev);border-bottom:1px solid var(--border);align-items:end;gap:0;height:25px;padding-left:4px;display:flex}.tabbar button{border:0;border-right:1px solid var(--border);color:var(--fg-muted);cursor:default;background:0 0;border-top:2px solid #0000;align-items:center;gap:5px;height:25px;padding:0 10px;display:inline-flex}.tabbar button:hover{background:var(--bg-hover);color:var(--fg)}.tabbar button.active{background:var(--bg);border-top-color:var(--fg-muted);color:var(--fg)}.tabbar button span{color:var(--fg-subtle);font-family:var(--font-mono);font-size:var(--t-sm)}.build-tabs .builds{border:0;border-radius:0;flex:1;min-height:0;overflow:auto}.build-node{border-bottom:1px solid var(--border)}.build-node:last-child{border-bottom:0}.build-row{cursor:pointer;font-size:var(--t-md);grid-template-columns:14px 10px minmax(0,1fr) auto auto auto;align-items:center;gap:8px;min-height:24px;padding:0 10px 0 4px;display:grid}.build-row:hover{background:var(--bg-hover)}.build-node[open]>.build-row{background:var(--bg-sunken)}.build-node[data-status=success]{background:color-mix(in oklab, var(--success) 5%, transparent)}.build-node[data-status=error]{background:var(--error-bg)}.build-node[data-status=warn]{background:var(--warn-bg)}.build-node[data-status=running]{background:var(--info-bg)}.tree{width:14px;height:100%;position:relative}.tree:before{border-left:1px solid var(--border-strong);content:"";position:absolute;top:0;bottom:0;left:6px}.tree:after{border-top:1px solid var(--border-strong);content:"";width:8px;position:absolute;top:50%;left:6px}.chev{color:var(--fg-faint);place-items:center;transition:transform .12s;display:grid}.build-node[open]>.build-row .chev{transform:rotate(90deg)}.bname{color:var(--fg);font-family:var(--font-mono);font-size:var(--t-sm);text-overflow:ellipsis;white-space:nowrap;align-items:baseline;gap:8px;min-width:0;display:flex;overflow:hidden}.bname .bid{color:var(--fg);font-weight:600}.bname .stage{color:var(--fg-faint);text-overflow:ellipsis;overflow:hidden}.timing{color:var(--fg-subtle);font-family:var(--font-mono);font-size:var(--t-sm);white-space:nowrap}.link-menu{justify-self:end;position:relative}.link-menu>summary{background:var(--bg);border:1px solid var(--border-strong);border-radius:var(--radius);color:var(--fg-muted);cursor:pointer;font-size:var(--t-sm);height:20px;padding:2px 7px;list-style:none}.link-menu>summary::-webkit-details-marker{display:none}.link-menu[open]>div{background:var(--bg);border:1px solid var(--border-strong);z-index:10;min-width:220px;padding:3px;display:grid;position:absolute;top:22px;right:0;box-shadow:0 8px 18px #10182824}.link-menu section{gap:2px;padding:3px;display:grid}.link-menu section+section{border-top:1px solid var(--border)}.link-menu section strong,.link-menu a{font-size:var(--t-sm);text-overflow:ellipsis;white-space:nowrap;font-weight:400;overflow:hidden}.link-menu section strong{color:var(--fg-subtle);text-transform:uppercase}.log-loading{border-top:1px solid var(--border);color:var(--fg-muted);font-size:var(--t-sm);padding:3px 36px}.inline-log{background:var(--bg);border-top:1px solid var(--border);margin-left:28px}.log-table{border-top:0}.log-table-head,.log-line{grid-template-columns:126px 56px minmax(0,1fr);display:grid}.inline-log.no-level .log-table-head,.inline-log.no-level .log-line{grid-template-columns:126px minmax(0,1fr)}.inline-log.no-time .log-table-head,.inline-log.no-time .log-line{grid-template-columns:56px minmax(0,1fr)}.inline-log.no-level.no-time .log-table-head,.inline-log.no-level.no-time .log-line{grid-template-columns:minmax(0,1fr)}.log-table-head{background:var(--bg);border-bottom:1px solid var(--border-strong);color:var(--fg);font-weight:700}.log-table-head span,.log-line time,.log-line strong,.log-line pre{border-bottom:1px solid var(--border);font-size:var(--t-sm);margin:0;padding:3px 4px;line-height:1.35}.log-line strong{color:#0f9f95;font-weight:700}.log-line pre{font-family:var(--font-mono);white-space:pre-wrap;overflow:visible}.log-line.is-error time,.log-line.is-error strong,.log-line.is-error pre{background:#f7dede}.log-line.is-error strong{color:var(--error)}.failed-view{background:var(--bg);flex-direction:column;flex:1;min-height:80px;display:flex;overflow:hidden}.failed-toolbar{background:var(--bg-elev);border-bottom:1px solid var(--border);flex-shrink:0;align-items:center;gap:4px;min-height:26px;padding:3px 6px;display:flex}.failed-search{background:var(--bg);border:1px solid var(--border-strong);border-radius:var(--radius);flex:1;align-items:center;gap:5px;min-width:160px;height:20px;padding:0 6px;display:flex}.failed-search:focus-within{border-color:var(--border-strong);box-shadow:0 0 0 2px var(--bg-focus)}.failed-search input{color:var(--fg);background:0 0;border:0;outline:none;flex:1;min-width:0;height:100%}.failed-toolbar button{border:1px solid var(--border);border-radius:var(--radius);color:var(--fg-muted);cursor:default;font-family:var(--font-mono);font-size:var(--t-sm);background:0 0;min-width:24px;height:20px;padding:0 5px}.failed-toolbar button:hover,.failed-toolbar button.active{background:var(--bg-selected);border-color:var(--border-strong);color:var(--fg)}.theme-checkbox{border:1px solid var(--border);border-radius:var(--radius);color:var(--fg-muted);cursor:default;font-family:var(--font-mono);font-size:var(--t-sm);-webkit-user-select:none;user-select:none;white-space:nowrap;align-items:center;gap:5px;height:20px;padding:0 6px 0 5px;display:inline-flex}.theme-checkbox:hover{background:var(--bg-selected);border-color:var(--border-strong);color:var(--fg)}.theme-checkbox:has(input:checked){background:var(--bg-selected);border-color:var(--border-strong);color:var(--fg)}.theme-checkbox input{opacity:0;width:1px;height:1px;position:absolute}.theme-checkbox-box{background:var(--bg);border:1px solid var(--border-strong);border-radius:2px;place-items:center;width:12px;height:12px;display:inline-grid}.theme-checkbox-box:after{border:solid var(--bg);content:"";border-width:0 1.5px 1.5px 0;width:3px;height:6px;display:none;transform:rotate(45deg)translate(-1px,-1px)}.theme-checkbox input:checked+.theme-checkbox-box{background:var(--fg-muted);border-color:var(--fg-muted)}.theme-checkbox input:checked+.theme-checkbox-box:after{display:block}.theme-checkbox:focus-within{box-shadow:0 0 0 2px var(--bg-focus)}.test-kind{background:var(--bg);border:1px solid var(--border-strong);border-radius:var(--radius);color:var(--fg);font-size:var(--t-sm);height:20px;padding:0 22px 0 6px}.toolbar-separator{background:var(--border-strong);width:1px;height:16px;margin:0 2px}.failed-list{gap:0;display:grid}.failed-list .inline-log{border-top:0;margin-left:0}.failed-list .log-line time{color:var(--fg-subtle)}.failed-list .log-line.is-error time,.failed-list .log-line.is-error strong,.failed-list .log-line.is-error pre{background:var(--bg)}.failed-list .log-line pre{padding-left:6px}.message-error.compact{border-bottom:1px solid var(--border);font-size:var(--t-sm);flex-shrink:0;padding:4px 8px}.test-results{flex:1;min-height:0;overflow:auto}.test-list,.test-group-list,.test-group{display:grid}.test-group-head{background:var(--bg-elev);border:0;border-bottom:1px solid var(--border);border-top:1px solid var(--border);color:var(--fg-muted);font-size:var(--t-xs);text-align:left;grid-template-columns:auto max-content minmax(0,1fr) auto;align-items:center;gap:6px;width:100%;height:26px;padding:0 7px 0 4px;font-weight:600;display:grid}.test-group-head:hover{background:var(--bg-hover);color:var(--fg)}.test-group-head[aria-expanded=true] .chev{transform:rotate(90deg)}.test-group-action{border:1px solid var(--border);border-radius:var(--radius);color:var(--fg-muted);background:0 0;justify-content:center;justify-self:end;align-items:center;width:24px;height:20px;padding:0;display:inline-flex}.test-group-action:hover{background:var(--bg-selected);border-color:var(--border-strong);color:var(--fg)}.test-section-head{background:var(--bg-elev);border-bottom:1px solid var(--border);border-top:1px solid var(--border);color:var(--fg-muted);font-size:var(--t-xxs);letter-spacing:.08em;text-transform:uppercase;padding:5px 7px;font-weight:600}.test-card{background:var(--bg);border-bottom:1px solid var(--border);gap:0;display:grid}.test-main{background:var(--bg-selected);border-bottom:1px solid var(--border);cursor:default;grid-template-columns:auto auto minmax(0,1fr) auto auto auto;align-items:center;gap:6px;min-height:24px;padding:2px 6px;display:grid}.test-card-toggle{color:var(--fg-faint);background:0 0;border:0;justify-content:center;align-items:center;width:10px;height:20px;padding:0;display:inline-flex}.test-card-toggle:hover{color:var(--fg)}.test-card-toggle.expanded .chev{transform:rotate(90deg)}.test-kind-pill,.test-tag{border:1px solid var(--border);border-radius:var(--radius);color:var(--fg-muted);font-size:var(--t-xs);text-transform:uppercase;white-space:nowrap;padding:0 4px;line-height:16px}.test-kind-pill{background:var(--bg-elev)}.test-card[data-kind=hoot] .test-kind-pill,.test-card[data-kind=hoot] .test-tag{background:var(--info-bg);border-color:color-mix(in oklab, var(--info) 35%, var(--border));color:var(--info)}.test-card[data-kind=tour] .test-kind-pill,.test-card[data-kind=tour] .test-tag{background:var(--warn-bg);border-color:color-mix(in oklab, var(--warn) 35%, var(--border));color:var(--warn)}.test-card[data-kind=python] .test-kind-pill,.test-card[data-kind=python] .test-tag{background:var(--bg-hover);border-color:var(--border-strong);color:var(--fg-muted)}.test-title{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.test-child,.test-sub,.test-runner{color:var(--fg-muted);font-size:var(--t-sm)}.test-raw-toggle{border:1px solid var(--border);border-radius:var(--radius);color:var(--fg-muted);font-size:var(--t-xs);text-transform:uppercase;white-space:nowrap;background:0 0;height:20px;padding:0 6px}.test-raw-toggle:hover,.test-raw-toggle.active{background:var(--bg-hover);border-color:var(--border-strong);color:var(--fg)}.test-sub,.test-runner,.test-command{border-top:1px solid var(--border);padding:2px 6px}.test-main+.test-sub,.test-main+.test-runner,.test-main+.test-command,.test-main+.test-lines .test-message:first-child{border-top:0}.test-sub code,.test-runner code,.test-command code{color:var(--fg);font-family:var(--font-mono)}.test-runner{grid-template-columns:auto minmax(0,1fr);gap:6px;display:grid}.test-runner span{text-transform:uppercase}.test-runner code{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.test-command{grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:6px;display:grid}.test-command code{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.test-command button{border:1px solid var(--border);border-radius:var(--radius);color:var(--fg-muted);background:0 0;width:22px;height:18px}.test-message{border-top:1px solid var(--border);font-family:var(--font-mono);font-size:var(--t-sm);white-space:pre-wrap;margin:0;padding:3px 6px}.test-source,.test-crashes{border-top:1px solid var(--border);display:grid}.test-source-head{background:var(--bg-elev);color:var(--fg-subtle);font-size:var(--t-xxs);letter-spacing:.08em;text-transform:uppercase;padding:3px 6px;font-weight:600}.test-message.source{background:var(--bg-sunken);color:var(--fg-muted)}.test-message.crash{background:color-mix(in srgb, var(--danger) 8%, var(--bg));color:var(--fg)}.traffic-pane{background:var(--bg-side);border-left:1px solid var(--border);min-width:0;padding:8px;overflow:hidden}.traffic-head{gap:6px;margin-bottom:8px;display:grid}.traffic-head h2{color:var(--fg-muted);font-size:var(--t-xxs);letter-spacing:.08em;text-transform:uppercase;font-weight:600}.traffic-actions{grid-template-columns:repeat(3,1fr);gap:4px;display:grid}.traffic-actions button{background:var(--bg);border:1px solid var(--border-strong);border-radius:var(--radius);color:var(--fg);cursor:default;height:22px}.traffic-actions .record{background:var(--fg);color:var(--bg)}.traffic-actions button:disabled{cursor:not-allowed;opacity:.45}.traffic-list{gap:0;max-height:calc(100vh - 120px);display:grid;overflow:auto}.traffic-entry{background:var(--bg);border:1px solid var(--border);grid-template-columns:auto auto minmax(0,1fr) auto auto;align-items:center;gap:5px;min-height:22px;margin-top:-1px;padding:2px 5px;display:grid}.traffic-entry.failed{background:var(--error-bg);color:var(--error)}.traffic-entry>span{background:var(--success-bg);border:1px solid color-mix(in oklab, var(--success) 25%, transparent);color:var(--success);border-radius:999px;padding:0 5px;font-size:10px}.traffic-url,.traffic-entry strong,.traffic-entry small,.traffic-entry time{text-overflow:ellipsis;white-space:nowrap;font-size:10px;overflow:hidden}.traffic-url{color:inherit}.statusbar{background:var(--fg-muted);color:#fff;font-size:var(--t-sm);align-items:center;height:22px;display:flex}.sb-item{color:oklab(100% 0 5.96046e-8/.92);white-space:nowrap;align-items:center;gap:4px;height:100%;padding:0 9px;display:inline-flex}.sb-item:hover{color:#fff;background:#ffffff1f}.sb-item.muted{color:oklab(100% 0 5.96046e-8/.78)}.settings-popover{background:var(--bg-elev);border:1px solid var(--border-strong);z-index:20;min-width:190px;position:fixed;bottom:28px;left:36px;box-shadow:0 8px 22px #10182824}.settings-popover .section-head{border-bottom:1px solid var(--border);height:22px}.setting-row{align-items:center;gap:7px;height:26px;padding:0 8px;display:flex}.setting-row:hover{background:var(--bg-hover)}.setting-row input{accent-color:var(--fg-muted);width:13px;height:13px;margin:0}.setting-row span{color:var(--fg);font-size:var(--t-sm)}.configurator-view{height:100%;min-height:0;overflow:hidden}.pet-configurator{background:var(--bg);grid-template-columns:minmax(250px,.8fr) minmax(360px,1fr);gap:0;height:100%;min-height:0;display:grid;overflow:hidden}.pet-configurator .stage{background:linear-gradient(90deg, var(--border) 1px, transparent 1px), linear-gradient(0deg, var(--border) 1px, transparent 1px), var(--bg-sunken);border-right:1px solid var(--border);background-size:22px 22px;place-items:center;min-height:0;padding:30px;display:grid;overflow:hidden}.pet-configurator .panel{background:var(--bg-side);flex-direction:column;gap:8px;min-height:0;padding:10px;display:flex;overflow-y:auto}.pet-configurator h1{color:var(--fg);font-size:var(--t-lg);font-weight:600}.pet-configurator h2{color:var(--fg-muted);font-size:var(--t-xxs);letter-spacing:.08em;text-transform:uppercase;font-weight:600}.pet-configurator .meta{color:var(--fg-muted);font-size:var(--t-sm);margin-top:2px}.pet-configurator .box,.pet-configurator .usage{background:var(--bg);border:1px solid var(--border);border-radius:var(--radius);gap:8px;padding:8px;display:grid}.pet-configurator .grid,.pet-configurator .grid-3{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;display:grid}.pet-configurator .grid-3{grid-template-columns:repeat(3,minmax(0,1fr))}.pet-configurator label{color:var(--fg-muted);font-size:var(--t-sm);gap:4px;display:grid}.pet-configurator input[type=text],.pet-configurator select{background:var(--bg-sunken);border:1px solid var(--border-strong);border-radius:var(--radius);color:var(--fg);min-width:0;height:24px;padding:0 7px}.pet-configurator input[type=range]{accent-color:var(--fg-muted);width:100%}.pet-configurator .readout{color:var(--fg-subtle);font-family:var(--font-mono);font-size:var(--t-sm)}.pet-configurator .check{align-items:center;gap:7px;height:24px;display:flex}.pet-configurator .check input{accent-color:var(--fg-muted);margin:0}.pet-configurator button{background:var(--bg-sunken);border:1px solid var(--border-strong);border-radius:var(--radius);color:var(--fg);cursor:default;justify-content:center;align-items:center;gap:5px;height:24px;padding:0 8px;display:inline-flex}.pet-configurator button:hover{background:var(--bg-hover)}.pet-configurator button.primary{background:var(--fg-muted);border-color:color-mix(in oklab, var(--fg-muted) 70%, #000);color:#fff}.pet-configurator .usage-head{justify-content:space-between;align-items:center;display:flex}.pet-configurator pre{background:var(--bg-sunken);border:1px solid var(--border);border-radius:var(--radius);color:var(--fg);font-family:var(--font-mono);font-size:var(--t-sm);white-space:pre;margin:0;padding:8px;overflow:auto}.empty,.message-error{color:var(--fg-subtle);justify-content:center;align-items:center;min-height:72px;display:flex}.message-error{color:var(--error)}@media (width<=980px){.app{grid-template-columns:1fr;grid-template-areas:"main""status"}.activity{display:none}.main,.main.traffic-open{grid-template-columns:1fr}.sidebar,.traffic-pane{max-height:none}.batch-columns{grid-template-columns:1fr}.topbar{flex-wrap:wrap;height:auto}.pet-configurator{grid-template-columns:1fr}.pet-configurator .stage{min-height:260px}}
@@ -0,0 +1,13 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Runbot Console</title>
7
+ <script type="module" crossorigin src="/assets/index-BmHFpUnR.js"></script>
8
+ <link rel="stylesheet" crossorigin href="/assets/index-BwQLFKqv.css">
9
+ </head>
10
+ <body>
11
+ <div id="root"></div>
12
+ </body>
13
+ </html>