@pushpalsdev/cli 1.0.80 → 1.0.82

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.
@@ -1,6 +1,6 @@
1
1
  __d(function(g,r,i,a,m,e,d){'use strict';const t=r(d[0]),{hasOwnProperty:n}=Object.prototype,{propertyIsEnumerable:o}=Object,c=(t,n,o)=>Object.defineProperty(t,n,{value:o,writable:!0,enumerable:!0,configurable:!0}),s=this,f={concatArrays:!1,ignoreUndefined:!1},l=t=>{const c=[];for(const o in t)n.call(t,o)&&c.push(o);if(Object.getOwnPropertySymbols){const n=Object.getOwnPropertySymbols(t);for(const s of n)o.call(t,s)&&c.push(s)}return c};function u(n){return Array.isArray(n)?y(n):t(n)?p(n):n}function y(t){const n=t.slice(0,0);return l(t).forEach(o=>{c(n,o,u(t[o]))}),n}function p(t){const n=null===Object.getPrototypeOf(t)?Object.create(null):{};return l(t).forEach(o=>{c(n,o,u(t[o]))}),n}const b=(t,n,o,s)=>(o.forEach(o=>{void 0===n[o]&&s.ignoreUndefined||(o in t&&t[o]!==Object.getPrototypeOf(t)?c(t,o,h(t[o],n[o],s)):c(t,o,u(n[o])))}),t),O=(t,o,s)=>{let f=t.slice(0,0),y=0;return[t,o].forEach(o=>{const p=[];for(let s=0;s<o.length;s++)n.call(o,s)&&(p.push(String(s)),c(f,y++,o===t?o[s]:u(o[s])));f=b(f,o,l(o).filter(t=>!p.includes(t)),s)}),f};function h(n,o,c){return c.concatArrays&&Array.isArray(n)&&Array.isArray(o)?O(n,o,c):t(o)&&t(n)?b(n,o,l(o),c):u(o)}m.exports=function(...n){const o=h(u(f),this!==s&&this||{},f);let c={_:{}};for(const s of n)if(void 0!==s){if(!t(s))throw new TypeError('`'+s+'` is not an Option Object');c=h(c,{_:s},o)}return c._}},1109,[1110]);
2
2
  __d(function(g,r,i,a,m,e,d){'use strict';m.exports=t=>{if('[object Object]'!==Object.prototype.toString.call(t))return!1;const o=Object.getPrototypeOf(t);return null===o||o===Object.prototype}},1110,[]);
3
- __d(function(g,r,i,a,m,_e,d){"use strict";Object.defineProperty(_e,'__esModule',{value:!0}),Object.defineProperty(_e,"useAsyncStorage",{enumerable:!0,get:function(){return n.useAsyncStorage}}),Object.defineProperty(_e,"default",{enumerable:!0,get:function(){return o}});var e,t=r(d[0]),u=(e=t)&&e.__esModule?e:{default:e},n=r(d[1]),o=u.default},1201,[1202,1204]);
4
- __d(function(g,r,_i,a,m,_e,d){"use strict";Object.defineProperty(_e,'__esModule',{value:!0}),Object.defineProperty(_e,"default",{enumerable:!0,get:function(){return i}});var e,t=r(d[0]);const o=((e=t)&&e.__esModule?e:{default:e}).default.bind({concatArrays:!0,ignoreUndefined:!0});function n(e,t){const n=window.localStorage.getItem(e);if(n){const l=JSON.parse(n),c=JSON.parse(t),s=JSON.stringify(o(l,c));window.localStorage.setItem(e,s)}else window.localStorage.setItem(e,t)}function l(e,t){return new Promise((o,n)=>{try{const n=e();t?.(null,n),o(n)}catch(e){t?.(e),n(e)}})}function c(e,t,o){return Promise.all(e).then(e=>{const n=o?.(e)??null;return t?.(null,n),Promise.resolve(n)},e=>(t?.(e),Promise.reject(e)))}const s={getItem:(e,t)=>l(()=>window.localStorage.getItem(e),t),setItem:(e,t,o)=>l(()=>window.localStorage.setItem(e,t),o),removeItem:(e,t)=>l(()=>window.localStorage.removeItem(e),t),mergeItem:(e,t,o)=>l(()=>n(e,t),o),clear:e=>l(()=>window.localStorage.clear(),e),getAllKeys:e=>l(()=>{const e=window.localStorage.length,t=[];for(let o=0;o<e;o+=1){const e=window.localStorage.key(o)||"";t.push(e)}return t},e),flushGetRequests:()=>{},multiGet:(e,t)=>c(e.map(e=>s.getItem(e)),t,t=>t.map((t,o)=>[e[o],t])),multiSet:(e,t)=>c(e.map(e=>s.setItem(e[0],e[1])),t),multiRemove:(e,t)=>c(e.map(e=>s.removeItem(e)),t),multiMerge:(e,t)=>c(e.map(e=>s.mergeItem(e[0],e[1])),t)};var i=s},1202,[1203]);
5
- __d(function(g,r,i,a,m,_e,d){"use strict";Object.defineProperty(_e,'__esModule',{value:!0}),Object.defineProperty(_e,"default",{enumerable:!0,get:function(){return u}});var e,t=r(d[0]),u=((e=t)&&e.__esModule?e:{default:e}).default},1203,[1109]);
6
- __d(function(g,r,i,a,m,_e,d){"use strict";Object.defineProperty(_e,'__esModule',{value:!0}),_e.useAsyncStorage=function(e){return{getItem:(...t)=>u.default.getItem(e,...t),setItem:(...t)=>u.default.setItem(e,...t),mergeItem:(...t)=>u.default.mergeItem(e,...t),removeItem:(...t)=>u.default.removeItem(e,...t)}};var e,t=r(d[0]),u=(e=t)&&e.__esModule?e:{default:e}},1204,[1202]);
3
+ __d(function(g,r,i,a,m,_e,d){"use strict";Object.defineProperty(_e,'__esModule',{value:!0}),Object.defineProperty(_e,"useAsyncStorage",{enumerable:!0,get:function(){return n.useAsyncStorage}}),Object.defineProperty(_e,"default",{enumerable:!0,get:function(){return o}});var e,t=r(d[0]),u=(e=t)&&e.__esModule?e:{default:e},n=r(d[1]),o=u.default},1202,[1203,1205]);
4
+ __d(function(g,r,_i,a,m,_e,d){"use strict";Object.defineProperty(_e,'__esModule',{value:!0}),Object.defineProperty(_e,"default",{enumerable:!0,get:function(){return i}});var e,t=r(d[0]);const o=((e=t)&&e.__esModule?e:{default:e}).default.bind({concatArrays:!0,ignoreUndefined:!0});function n(e,t){const n=window.localStorage.getItem(e);if(n){const l=JSON.parse(n),c=JSON.parse(t),s=JSON.stringify(o(l,c));window.localStorage.setItem(e,s)}else window.localStorage.setItem(e,t)}function l(e,t){return new Promise((o,n)=>{try{const n=e();t?.(null,n),o(n)}catch(e){t?.(e),n(e)}})}function c(e,t,o){return Promise.all(e).then(e=>{const n=o?.(e)??null;return t?.(null,n),Promise.resolve(n)},e=>(t?.(e),Promise.reject(e)))}const s={getItem:(e,t)=>l(()=>window.localStorage.getItem(e),t),setItem:(e,t,o)=>l(()=>window.localStorage.setItem(e,t),o),removeItem:(e,t)=>l(()=>window.localStorage.removeItem(e),t),mergeItem:(e,t,o)=>l(()=>n(e,t),o),clear:e=>l(()=>window.localStorage.clear(),e),getAllKeys:e=>l(()=>{const e=window.localStorage.length,t=[];for(let o=0;o<e;o+=1){const e=window.localStorage.key(o)||"";t.push(e)}return t},e),flushGetRequests:()=>{},multiGet:(e,t)=>c(e.map(e=>s.getItem(e)),t,t=>t.map((t,o)=>[e[o],t])),multiSet:(e,t)=>c(e.map(e=>s.setItem(e[0],e[1])),t),multiRemove:(e,t)=>c(e.map(e=>s.removeItem(e)),t),multiMerge:(e,t)=>c(e.map(e=>s.mergeItem(e[0],e[1])),t)};var i=s},1203,[1204]);
5
+ __d(function(g,r,i,a,m,_e,d){"use strict";Object.defineProperty(_e,'__esModule',{value:!0}),Object.defineProperty(_e,"default",{enumerable:!0,get:function(){return u}});var e,t=r(d[0]),u=((e=t)&&e.__esModule?e:{default:e}).default},1204,[1109]);
6
+ __d(function(g,r,i,a,m,_e,d){"use strict";Object.defineProperty(_e,'__esModule',{value:!0}),_e.useAsyncStorage=function(e){return{getItem:(...t)=>u.default.getItem(e,...t),setItem:(...t)=>u.default.setItem(e,...t),mergeItem:(...t)=>u.default.mergeItem(e,...t),removeItem:(...t)=>u.default.removeItem(e,...t)}};var e,t=r(d[0]),u=(e=t)&&e.__esModule?e:{default:e}},1205,[1203]);
@@ -435,5 +435,5 @@ input::-webkit-search-cancel-button,input::-webkit-search-decoration,input::-web
435
435
  @keyframes r-1pzkwqh{0%{transform:translateY(100%);}100%{transform:translateY(0%);}}
436
436
  @keyframes r-imtty0{0%{opacity:0;}100%{opacity:1;}}
437
437
  @keyframes r-q67da2{0%{transform:translateX(-100%);}100%{transform:translateX(400%);}}
438
- @keyframes r-t2lo5v{0%{opacity:1;}100%{opacity:0;}}</style><script type="module">globalThis.__EXPO_ROUTER_HYDRATE__=true;</script><link rel="icon" href="/favicon.ico" /></head><body><div id="root"><div class="css-g5y9jx r-13awgt0"></div></div><script src="/_expo/static/js/web/entry-c6862f701ea52ccf8692a6c9e749af5c.js" defer></script>
438
+ @keyframes r-t2lo5v{0%{opacity:1;}100%{opacity:0;}}</style><script type="module">globalThis.__EXPO_ROUTER_HYDRATE__=true;</script><link rel="icon" href="/favicon.ico" /></head><body><div id="root"><div class="css-g5y9jx r-13awgt0"></div></div><script src="/_expo/static/js/web/entry-e66b4de45f75e702ac16916082bcc9a5.js" defer></script>
439
439
  </body></html>
@@ -435,5 +435,5 @@ input::-webkit-search-cancel-button,input::-webkit-search-decoration,input::-web
435
435
  @keyframes r-1pzkwqh{0%{transform:translateY(100%);}100%{transform:translateY(0%);}}
436
436
  @keyframes r-imtty0{0%{opacity:0;}100%{opacity:1;}}
437
437
  @keyframes r-q67da2{0%{transform:translateX(-100%);}100%{transform:translateX(400%);}}
438
- @keyframes r-t2lo5v{0%{opacity:1;}100%{opacity:0;}}</style><script type="module">globalThis.__EXPO_ROUTER_HYDRATE__=true;</script><link rel="icon" href="/favicon.ico" /></head><body><div id="root"><div class="css-g5y9jx r-13awgt0"><!--$--><div style="position:absolute;left:0;right:0;top:0;bottom:0;pointer-events:none;visibility:hidden"></div><div class="css-g5y9jx r-13awgt0"><div class="css-g5y9jx r-13awgt0 r-1p0dtai r-1d2f490 r-u8s1d r-zchlnj r-ipm5af" style="background-color:rgba(242,242,242,1.00);display:flex"><div class="css-g5y9jx r-13awgt0"><div class="css-g5y9jx r-13awgt0"><!--$--><div class="css-g5y9jx r-13awgt0" style="background-color:rgba(236,242,245,1.00)"><div class="css-g5y9jx r-13awgt0"><div class="css-g5y9jx r-cpet4d r-u8s1d r-g7s1ez r-15zx4ds r-a4e7m4 r-j33s3c r-1ovo9ad" style="background-color:rgba(0,126,119,0.13)"></div><div class="css-g5y9jx r-cpet4d r-u8s1d r-g7s1ez r-5fjp4n r-9s5a0n r-1hy2ut r-9dcw1g" style="background-color:rgba(199,133,30,0.09)"></div><div class="css-g5y9jx r-cpet4d r-u8s1d r-g7s1ez r-1iuttuq r-pbsvq8 r-1b0pg27 r-1sxiqef" style="background-color:rgba(22,154,88,0.09)"></div><div class="css-g5y9jx r-150rngu r-eqz5dr r-16y2uox r-1wbh5a2 r-11yh6sk r-1rnoaur r-agouwx r-13awgt0"><div class="css-g5y9jx r-16y2uox r-2llsf r-kzbkwu"><div class="css-g5y9jx r-16uyjmq r-rs99b7 r-13awgt0 r-hv52eu r-ifefl9 r-1udh08x" style="background-color:rgba(247,250,252,1.00);border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);opacity:0;transform:translateY(18px)"><div class="css-g5y9jx r-1habvwh r-18u37iz r-1wtj0ep r-kzbkwu r-u9wvl5 r-131miar"><div class="css-g5y9jx r-13awgt0 r-j2kj52"><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1q67n59 r-15zivkp r-tsynxw" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">pushpals operations console</div><div dir="auto" class="css-146c3p1 r-1ra0lkn r-b88u0q r-zl2h9q" style="color:rgba(17,34,48,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Mission Control</div><div dir="auto" class="css-146c3p1 r-n6v787 r-hjklzo r-1cmskyw" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Coordinate your edits with autonomous buddy execution across planning, jobs, and integration in one live board.</div><div dir="auto" class="css-146c3p1 r-1enofrn r-5fcqz0 r-kc8jnq" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Current repo:<!-- --> <span class="css-1jxf684 r-1enofrn" style="color:rgba(84,112,134,1.00);font-family:&#x27;IBM Plex Mono&#x27;, &#x27;JetBrains Mono&#x27;, monospace">unavailable</span></div><div dir="auto" class="css-146c3p1 r-1enofrn r-5fcqz0 r-14gqq1x" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Snapshot:<!-- --> <span class="css-1jxf684 r-1enofrn" style="color:rgba(17,34,48,1.00);font-family:&#x27;IBM Plex Mono&#x27;, &#x27;JetBrains Mono&#x27;, monospace">waiting for /system/status</span></div></div><div class="css-g5y9jx r-k200y r-1q9bdsx r-rs99b7 r-18u37iz r-1udh08x" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(244,248,251,1.00)"><button aria-label="Set theme mode to auto" role="button" tabindex="0" class="css-g5y9jx r-1loqt21 r-1otgn73 r-1yd117h r-1ubuhtd" style="background-color:rgba(217,244,241,1.00)" type="button"><div dir="auto" class="css-146c3p1 r-1enofrn r-1kfrs79 r-1ozqkpa" style="color:rgba(2,92,86,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">auto</div></button><button aria-label="Set theme mode to light" role="button" tabindex="0" class="css-g5y9jx r-1loqt21 r-1otgn73 r-1yd117h r-1ubuhtd" type="button"><div dir="auto" class="css-146c3p1 r-1enofrn r-1kfrs79 r-1ozqkpa" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">light</div></button><button aria-label="Set theme mode to dark" role="button" tabindex="0" class="css-g5y9jx r-1loqt21 r-1otgn73 r-1yd117h r-1ubuhtd" type="button"><div dir="auto" class="css-146c3p1 r-1enofrn r-1kfrs79 r-1ozqkpa" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">dark</div></button></div></div><div class="css-g5y9jx r-t23y2h r-rs99b7 r-15d164r r-bhtmuz r-ytbthy r-1ubuhtd" style="background-color:rgba(244,248,251,1.00);border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00)"><div class="css-g5y9jx r-150rngu r-18u37iz r-16y2uox r-1wbh5a2 r-lltvgl r-buy8e9 r-agouwx r-2eszeu"><div class="css-g5y9jx r-18u37iz"><div class="css-g5y9jx r-1awozwy r-18u37iz"><div class="css-g5y9jx r-1q9bdsx r-rs99b7 r-1s5swlz r-1ubuhtd r-13i4ljo" style="border-top-color:rgba(199,133,30,0.40);border-right-color:rgba(199,133,30,0.40);border-bottom-color:rgba(199,133,30,0.40);border-left-color:rgba(199,133,30,0.40);background-color:rgba(199,133,30,0.09)"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1gkfh8e r-b88u0q r-1dpkw9 r-tsynxw" style="color:rgba(199,133,30,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">1. You</div><div dir="auto" class="css-146c3p1 r-8akbws r-krxsd3 r-dnmrzs r-1qsk4np r-1udbk01 r-1enofrn r-1cwl3u0 r-14gqq1x" style="-webkit-line-clamp:2;color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Awaiting input</div></div><div class="css-g5y9jx r-109y4c4 r-8dgmk1 r-12ym1je" style="background-color:rgba(207,218,226,0.80)"></div></div><div class="css-g5y9jx r-1awozwy r-18u37iz"><div class="css-g5y9jx r-1q9bdsx r-rs99b7 r-1s5swlz r-1ubuhtd r-13i4ljo" style="border-top-color:rgba(0,126,119,0.40);border-right-color:rgba(0,126,119,0.40);border-bottom-color:rgba(0,126,119,0.40);border-left-color:rgba(0,126,119,0.40);background-color:rgba(0,126,119,0.09)"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1gkfh8e r-b88u0q r-1dpkw9 r-tsynxw" style="color:rgba(0,126,119,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">2. Session</div><div dir="auto" class="css-146c3p1 r-8akbws r-krxsd3 r-dnmrzs r-1qsk4np r-1udbk01 r-1enofrn r-1cwl3u0 r-14gqq1x" style="-webkit-line-clamp:2;color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Ready</div></div><div class="css-g5y9jx r-109y4c4 r-8dgmk1 r-12ym1je" style="background-color:rgba(207,218,226,0.80)"></div></div><div class="css-g5y9jx r-1awozwy r-18u37iz"><div class="css-g5y9jx r-1q9bdsx r-rs99b7 r-1s5swlz r-1ubuhtd r-13i4ljo" style="border-top-color:rgba(22,154,88,0.40);border-right-color:rgba(22,154,88,0.40);border-bottom-color:rgba(22,154,88,0.40);border-left-color:rgba(22,154,88,0.40);background-color:rgba(22,154,88,0.09)"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1gkfh8e r-b88u0q r-1dpkw9 r-tsynxw" style="color:rgba(22,154,88,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">3. RemoteBuddy</div><div dir="auto" class="css-146c3p1 r-8akbws r-krxsd3 r-dnmrzs r-1qsk4np r-1udbk01 r-1enofrn r-1cwl3u0 r-14gqq1x" style="-webkit-line-clamp:2;color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">0 pending, 0 claimed</div></div><div class="css-g5y9jx r-109y4c4 r-8dgmk1 r-12ym1je" style="background-color:rgba(207,218,226,0.80)"></div></div><div class="css-g5y9jx r-1awozwy r-18u37iz"><div class="css-g5y9jx r-1q9bdsx r-rs99b7 r-1s5swlz r-1ubuhtd r-13i4ljo" style="border-top-color:rgba(22,154,88,0.40);border-right-color:rgba(22,154,88,0.40);border-bottom-color:rgba(22,154,88,0.40);border-left-color:rgba(22,154,88,0.40);background-color:rgba(22,154,88,0.09)"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1gkfh8e r-b88u0q r-1dpkw9 r-tsynxw" style="color:rgba(22,154,88,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">4. WorkerPals</div><div dir="auto" class="css-146c3p1 r-8akbws r-krxsd3 r-dnmrzs r-1qsk4np r-1udbk01 r-1enofrn r-1cwl3u0 r-14gqq1x" style="-webkit-line-clamp:2;color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">0 online, 0 busy, 0 queued</div></div><div class="css-g5y9jx r-109y4c4 r-8dgmk1 r-12ym1je" style="background-color:rgba(207,218,226,0.80)"></div></div><div class="css-g5y9jx r-1awozwy r-18u37iz"><div class="css-g5y9jx r-1q9bdsx r-rs99b7 r-1s5swlz r-1ubuhtd r-13i4ljo" style="border-top-color:rgba(0,126,119,0.40);border-right-color:rgba(0,126,119,0.40);border-bottom-color:rgba(0,126,119,0.40);border-left-color:rgba(0,126,119,0.40);background-color:rgba(0,126,119,0.09)"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1gkfh8e r-b88u0q r-1dpkw9 r-tsynxw" style="color:rgba(0,126,119,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">5. SCM</div><div dir="auto" class="css-146c3p1 r-8akbws r-krxsd3 r-dnmrzs r-1qsk4np r-1udbk01 r-1enofrn r-1cwl3u0 r-14gqq1x" style="-webkit-line-clamp:2;color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">0 ready, 0 pending</div></div></div></div></div></div><div class="css-g5y9jx r-18u37iz r-1w6e6rj r-1mi0q7o r-u9wvl5"><div class="css-g5y9jx r-t23y2h r-rs99b7 r-16y2uox r-5oul0u r-1kb76zh r-bgnin r-ytbthy r-3o4zer" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(244,248,251,1.00)"><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1cm7zt9 r-tsynxw" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Connection</div><div dir="auto" class="css-146c3p1 r-evnaw r-b88u0q r-19qrga8" style="color:rgba(214,69,83,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Disconnected</div><div dir="auto" class="css-146c3p1 r-1enofrn r-19qrga8" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">0 events</div></div><div class="css-g5y9jx r-t23y2h r-rs99b7 r-16y2uox r-5oul0u r-1kb76zh r-bgnin r-ytbthy r-3o4zer" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(244,248,251,1.00)"><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1cm7zt9 r-tsynxw" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Pending Work</div><div dir="auto" class="css-146c3p1 r-evnaw r-b88u0q r-19qrga8" style="color:rgba(22,154,88,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">0</div><div dir="auto" class="css-146c3p1 r-1enofrn r-19qrga8" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">0 requests | 0 jobs</div></div><div class="css-g5y9jx r-t23y2h r-rs99b7 r-16y2uox r-5oul0u r-1kb76zh r-bgnin r-ytbthy r-3o4zer" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(244,248,251,1.00)"><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1cm7zt9 r-tsynxw" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Active Workers</div><div dir="auto" class="css-146c3p1 r-evnaw r-b88u0q r-19qrga8" style="color:rgba(0,126,119,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">0</div><div dir="auto" class="css-146c3p1 r-1enofrn r-19qrga8" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">0 busy</div></div><div class="css-g5y9jx r-t23y2h r-rs99b7 r-16y2uox r-5oul0u r-1kb76zh r-bgnin r-ytbthy r-3o4zer" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(244,248,251,1.00)"><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1cm7zt9 r-tsynxw" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Last Sync</div><div dir="auto" class="css-146c3p1 r-evnaw r-b88u0q r-19qrga8" style="color:rgba(0,126,119,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">--</div><div dir="auto" class="css-146c3p1 r-1enofrn r-19qrga8" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">waiting</div></div></div><div class="css-g5y9jx r-t23y2h r-rs99b7 r-18u37iz r-15d164r r-bhtmuz r-146eth8" style="background-color:rgba(244,248,251,1.00);border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00)"><button aria-label="Coordination tab" role="button" tabindex="0" class="css-g5y9jx r-1loqt21 r-1otgn73 r-1awozwy r-1dzdj1l r-rs99b7 r-13awgt0 r-1777fci r-11f147o r-1ubuhtd" style="background-color:rgba(0,126,119,1.00);border-top-color:rgba(0,126,119,1.00);border-right-color:rgba(0,126,119,1.00);border-bottom-color:rgba(0,126,119,1.00);border-left-color:rgba(0,126,119,1.00)" type="button"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1enofrn r-b88u0q" style="color:rgba(255,255,255,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Coordination<!-- --> (0)</div></button><button aria-label="Chat tab" role="button" tabindex="0" class="css-g5y9jx r-1loqt21 r-1otgn73 r-1awozwy r-42olwf r-1dzdj1l r-rs99b7 r-13awgt0 r-1777fci r-11f147o r-1ubuhtd" type="button"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1enofrn r-b88u0q" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Chat<!-- --> (0)</div></button><button aria-label="Requests tab" role="button" tabindex="0" class="css-g5y9jx r-1loqt21 r-1otgn73 r-1awozwy r-42olwf r-1dzdj1l r-rs99b7 r-13awgt0 r-1777fci r-11f147o r-1ubuhtd" type="button"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1enofrn r-b88u0q" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Requests<!-- --> (0)</div></button><button aria-label="Jobs &amp; Traces tab" role="button" tabindex="0" class="css-g5y9jx r-1loqt21 r-1otgn73 r-1awozwy r-42olwf r-1dzdj1l r-rs99b7 r-13awgt0 r-1777fci r-11f147o r-1ubuhtd" type="button"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1enofrn r-b88u0q" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Jobs &amp; Traces<!-- --> (0)</div></button><button aria-label="System tab" role="button" tabindex="0" class="css-g5y9jx r-1loqt21 r-1otgn73 r-1awozwy r-42olwf r-1dzdj1l r-rs99b7 r-13awgt0 r-1777fci r-11f147o r-1ubuhtd" type="button"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1enofrn r-b88u0q" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">System<!-- --> (0)</div></button><button aria-label="Config tab" role="button" tabindex="0" class="css-g5y9jx r-1loqt21 r-1otgn73 r-1awozwy r-42olwf r-1dzdj1l r-rs99b7 r-13awgt0 r-1777fci r-11f147o r-1ubuhtd" type="button"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1enofrn r-b88u0q" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Config</div></button></div><div class="css-g5y9jx r-13awgt0 r-ifefl9" style="opacity:1;transform:translateY(0px)"><div class="css-g5y9jx r-150rngu r-eqz5dr r-16y2uox r-1wbh5a2 r-11yh6sk r-1rnoaur r-agouwx r-13awgt0"><div class="css-g5y9jx r-1t2hasf r-u9wvl5"><div class="css-g5y9jx r-18u37iz r-1w6e6rj r-1mi0q7o"><div class="css-g5y9jx r-t23y2h r-rs99b7 r-16y2uox r-5oul0u r-1kb76zh r-bgnin r-ytbthy r-3o4zer" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(244,248,251,1.00)"><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1cm7zt9 r-tsynxw" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Ready For Review</div><div dir="auto" class="css-146c3p1 r-evnaw r-b88u0q r-19qrga8" style="color:rgba(0,126,119,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">0</div><div dir="auto" class="css-146c3p1 r-1enofrn r-19qrga8" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">0 processed completions</div></div><div class="css-g5y9jx r-t23y2h r-rs99b7 r-16y2uox r-5oul0u r-1kb76zh r-bgnin r-ytbthy r-3o4zer" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(244,248,251,1.00)"><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1cm7zt9 r-tsynxw" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Active Handoffs</div><div dir="auto" class="css-146c3p1 r-evnaw r-b88u0q r-19qrga8" style="color:rgba(0,126,119,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">0</div><div dir="auto" class="css-146c3p1 r-1enofrn r-19qrga8" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">0 running jobs</div></div><div class="css-g5y9jx r-t23y2h r-rs99b7 r-16y2uox r-5oul0u r-1kb76zh r-bgnin r-ytbthy r-3o4zer" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(244,248,251,1.00)"><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1cm7zt9 r-tsynxw" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Awaiting Remote</div><div dir="auto" class="css-146c3p1 r-evnaw r-b88u0q r-19qrga8" style="color:rgba(22,154,88,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">0</div><div dir="auto" class="css-146c3p1 r-1enofrn r-19qrga8" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">0 pending requests</div></div><div class="css-g5y9jx r-t23y2h r-rs99b7 r-16y2uox r-5oul0u r-1kb76zh r-bgnin r-ytbthy r-3o4zer" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(244,248,251,1.00)"><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1cm7zt9 r-tsynxw" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Blocked</div><div dir="auto" class="css-146c3p1 r-evnaw r-b88u0q r-19qrga8" style="color:rgba(22,154,88,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">0</div><div dir="auto" class="css-146c3p1 r-1enofrn r-19qrga8" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">0 failed jobs</div></div></div><div class="css-g5y9jx r-eqz5dr"><div class="css-g5y9jx r-1867qdf r-rs99b7 r-k3250r r-15d164r r-xyw6el" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(255,255,255,1.00)"><div class="css-g5y9jx r-1awozwy r-18u37iz r-1wtj0ep"><div dir="auto" class="css-146c3p1 r-ubezar r-b88u0q r-5oul0u" style="color:rgba(17,34,48,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Change Coordination Board</div><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1g94qm0" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">0<!-- --> latest requests</div></div><div class="css-g5y9jx r-1habvwh r-1867qdf r-nsbfu8"><div dir="auto" class="css-146c3p1 r-1i10wst r-b88u0q r-15zivkp" style="color:rgba(17,34,48,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Nothing to coordinate yet</div><div dir="auto" class="css-146c3p1 r-n6v787 r-hjklzo" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Send a task from chat and this board will trace the full handoff from request to integration.</div></div></div><div class="css-g5y9jx r-1867qdf r-rs99b7 r-jprt8p r-15d164r r-11wrixw r-xyw6el" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(255,255,255,1.00)"><div dir="auto" class="css-146c3p1 r-ubezar r-b88u0q r-5oul0u" style="color:rgba(17,34,48,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Review Queue</div><div dir="auto" class="css-146c3p1 r-n6v787 r-hjklzo" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">No processed completions yet.</div><div dir="auto" class="css-146c3p1 r-ubezar r-b88u0q r-5oul0u" style="color:rgba(17,34,48,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif;margin-top:14px">Needs Attention</div><div dir="auto" class="css-146c3p1 r-n6v787 r-hjklzo" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">No failed coordination chains.</div></div></div></div></div></div></div></div></div></div></div><!--/$--></div></div></div></div><!--/$--></div></div><script src="/_expo/static/js/web/entry-c6862f701ea52ccf8692a6c9e749af5c.js" defer></script>
438
+ @keyframes r-t2lo5v{0%{opacity:1;}100%{opacity:0;}}</style><script type="module">globalThis.__EXPO_ROUTER_HYDRATE__=true;</script><link rel="icon" href="/favicon.ico" /></head><body><div id="root"><div class="css-g5y9jx r-13awgt0"><!--$--><div style="position:absolute;left:0;right:0;top:0;bottom:0;pointer-events:none;visibility:hidden"></div><div class="css-g5y9jx r-13awgt0"><div class="css-g5y9jx r-13awgt0 r-1p0dtai r-1d2f490 r-u8s1d r-zchlnj r-ipm5af" style="background-color:rgba(242,242,242,1.00);display:flex"><div class="css-g5y9jx r-13awgt0"><div class="css-g5y9jx r-13awgt0"><!--$--><div class="css-g5y9jx r-13awgt0" style="background-color:rgba(236,242,245,1.00)"><div class="css-g5y9jx r-13awgt0"><div class="css-g5y9jx r-cpet4d r-u8s1d r-g7s1ez r-15zx4ds r-a4e7m4 r-j33s3c r-1ovo9ad" style="background-color:rgba(0,126,119,0.13)"></div><div class="css-g5y9jx r-cpet4d r-u8s1d r-g7s1ez r-5fjp4n r-9s5a0n r-1hy2ut r-9dcw1g" style="background-color:rgba(199,133,30,0.09)"></div><div class="css-g5y9jx r-cpet4d r-u8s1d r-g7s1ez r-1iuttuq r-pbsvq8 r-1b0pg27 r-1sxiqef" style="background-color:rgba(22,154,88,0.09)"></div><div class="css-g5y9jx r-150rngu r-eqz5dr r-16y2uox r-1wbh5a2 r-11yh6sk r-1rnoaur r-agouwx r-13awgt0"><div class="css-g5y9jx r-16y2uox r-2llsf r-kzbkwu"><div class="css-g5y9jx r-16uyjmq r-rs99b7 r-13awgt0 r-hv52eu r-ifefl9 r-1udh08x" style="background-color:rgba(247,250,252,1.00);border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);opacity:0;transform:translateY(18px)"><div class="css-g5y9jx r-1habvwh r-18u37iz r-1wtj0ep r-kzbkwu r-u9wvl5 r-131miar"><div class="css-g5y9jx r-13awgt0 r-j2kj52"><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1q67n59 r-15zivkp r-tsynxw" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">pushpals operations console</div><div dir="auto" class="css-146c3p1 r-1ra0lkn r-b88u0q r-zl2h9q" style="color:rgba(17,34,48,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Mission Control</div><div dir="auto" class="css-146c3p1 r-n6v787 r-hjklzo r-1cmskyw" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Coordinate your edits with autonomous buddy execution across planning, jobs, and integration in one live board.</div><div dir="auto" class="css-146c3p1 r-1enofrn r-5fcqz0 r-kc8jnq" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Current repo:<!-- --> <span class="css-1jxf684 r-1enofrn" style="color:rgba(84,112,134,1.00);font-family:&#x27;IBM Plex Mono&#x27;, &#x27;JetBrains Mono&#x27;, monospace">unavailable</span></div><div dir="auto" class="css-146c3p1 r-1enofrn r-5fcqz0 r-14gqq1x" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Snapshot:<!-- --> <span class="css-1jxf684 r-1enofrn" style="color:rgba(17,34,48,1.00);font-family:&#x27;IBM Plex Mono&#x27;, &#x27;JetBrains Mono&#x27;, monospace">waiting for /system/status</span></div></div><div class="css-g5y9jx r-k200y r-1q9bdsx r-rs99b7 r-18u37iz r-1udh08x" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(244,248,251,1.00)"><button aria-label="Set theme mode to auto" role="button" tabindex="0" class="css-g5y9jx r-1loqt21 r-1otgn73 r-1yd117h r-1ubuhtd" style="background-color:rgba(217,244,241,1.00)" type="button"><div dir="auto" class="css-146c3p1 r-1enofrn r-1kfrs79 r-1ozqkpa" style="color:rgba(2,92,86,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">auto</div></button><button aria-label="Set theme mode to light" role="button" tabindex="0" class="css-g5y9jx r-1loqt21 r-1otgn73 r-1yd117h r-1ubuhtd" type="button"><div dir="auto" class="css-146c3p1 r-1enofrn r-1kfrs79 r-1ozqkpa" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">light</div></button><button aria-label="Set theme mode to dark" role="button" tabindex="0" class="css-g5y9jx r-1loqt21 r-1otgn73 r-1yd117h r-1ubuhtd" type="button"><div dir="auto" class="css-146c3p1 r-1enofrn r-1kfrs79 r-1ozqkpa" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">dark</div></button></div></div><div class="css-g5y9jx r-t23y2h r-rs99b7 r-15d164r r-bhtmuz r-ytbthy r-1ubuhtd" style="background-color:rgba(244,248,251,1.00);border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00)"><div class="css-g5y9jx r-150rngu r-18u37iz r-16y2uox r-1wbh5a2 r-lltvgl r-buy8e9 r-agouwx r-2eszeu"><div class="css-g5y9jx r-18u37iz"><div class="css-g5y9jx r-1awozwy r-18u37iz"><div class="css-g5y9jx r-1q9bdsx r-rs99b7 r-1s5swlz r-1ubuhtd r-13i4ljo" style="border-top-color:rgba(199,133,30,0.40);border-right-color:rgba(199,133,30,0.40);border-bottom-color:rgba(199,133,30,0.40);border-left-color:rgba(199,133,30,0.40);background-color:rgba(199,133,30,0.09)"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1gkfh8e r-b88u0q r-1dpkw9 r-tsynxw" style="color:rgba(199,133,30,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">1. You</div><div dir="auto" class="css-146c3p1 r-8akbws r-krxsd3 r-dnmrzs r-1qsk4np r-1udbk01 r-1enofrn r-1cwl3u0 r-14gqq1x" style="-webkit-line-clamp:2;color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Awaiting input</div></div><div class="css-g5y9jx r-109y4c4 r-8dgmk1 r-12ym1je" style="background-color:rgba(207,218,226,0.80)"></div></div><div class="css-g5y9jx r-1awozwy r-18u37iz"><div class="css-g5y9jx r-1q9bdsx r-rs99b7 r-1s5swlz r-1ubuhtd r-13i4ljo" style="border-top-color:rgba(0,126,119,0.40);border-right-color:rgba(0,126,119,0.40);border-bottom-color:rgba(0,126,119,0.40);border-left-color:rgba(0,126,119,0.40);background-color:rgba(0,126,119,0.09)"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1gkfh8e r-b88u0q r-1dpkw9 r-tsynxw" style="color:rgba(0,126,119,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">2. Session</div><div dir="auto" class="css-146c3p1 r-8akbws r-krxsd3 r-dnmrzs r-1qsk4np r-1udbk01 r-1enofrn r-1cwl3u0 r-14gqq1x" style="-webkit-line-clamp:2;color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Ready</div></div><div class="css-g5y9jx r-109y4c4 r-8dgmk1 r-12ym1je" style="background-color:rgba(207,218,226,0.80)"></div></div><div class="css-g5y9jx r-1awozwy r-18u37iz"><div class="css-g5y9jx r-1q9bdsx r-rs99b7 r-1s5swlz r-1ubuhtd r-13i4ljo" style="border-top-color:rgba(22,154,88,0.40);border-right-color:rgba(22,154,88,0.40);border-bottom-color:rgba(22,154,88,0.40);border-left-color:rgba(22,154,88,0.40);background-color:rgba(22,154,88,0.09)"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1gkfh8e r-b88u0q r-1dpkw9 r-tsynxw" style="color:rgba(22,154,88,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">3. RemoteBuddy</div><div dir="auto" class="css-146c3p1 r-8akbws r-krxsd3 r-dnmrzs r-1qsk4np r-1udbk01 r-1enofrn r-1cwl3u0 r-14gqq1x" style="-webkit-line-clamp:2;color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">0 pending, 0 claimed</div></div><div class="css-g5y9jx r-109y4c4 r-8dgmk1 r-12ym1je" style="background-color:rgba(207,218,226,0.80)"></div></div><div class="css-g5y9jx r-1awozwy r-18u37iz"><div class="css-g5y9jx r-1q9bdsx r-rs99b7 r-1s5swlz r-1ubuhtd r-13i4ljo" style="border-top-color:rgba(22,154,88,0.40);border-right-color:rgba(22,154,88,0.40);border-bottom-color:rgba(22,154,88,0.40);border-left-color:rgba(22,154,88,0.40);background-color:rgba(22,154,88,0.09)"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1gkfh8e r-b88u0q r-1dpkw9 r-tsynxw" style="color:rgba(22,154,88,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">4. WorkerPals</div><div dir="auto" class="css-146c3p1 r-8akbws r-krxsd3 r-dnmrzs r-1qsk4np r-1udbk01 r-1enofrn r-1cwl3u0 r-14gqq1x" style="-webkit-line-clamp:2;color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">0 online, 0 busy, 0 queued</div></div><div class="css-g5y9jx r-109y4c4 r-8dgmk1 r-12ym1je" style="background-color:rgba(207,218,226,0.80)"></div></div><div class="css-g5y9jx r-1awozwy r-18u37iz"><div class="css-g5y9jx r-1q9bdsx r-rs99b7 r-1s5swlz r-1ubuhtd r-13i4ljo" style="border-top-color:rgba(0,126,119,0.40);border-right-color:rgba(0,126,119,0.40);border-bottom-color:rgba(0,126,119,0.40);border-left-color:rgba(0,126,119,0.40);background-color:rgba(0,126,119,0.09)"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1gkfh8e r-b88u0q r-1dpkw9 r-tsynxw" style="color:rgba(0,126,119,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">5. SCM</div><div dir="auto" class="css-146c3p1 r-8akbws r-krxsd3 r-dnmrzs r-1qsk4np r-1udbk01 r-1enofrn r-1cwl3u0 r-14gqq1x" style="-webkit-line-clamp:2;color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">0 ready, 0 pending</div></div></div></div></div></div><div class="css-g5y9jx r-18u37iz r-1w6e6rj r-1mi0q7o r-u9wvl5"><div class="css-g5y9jx r-t23y2h r-rs99b7 r-16y2uox r-5oul0u r-1kb76zh r-bgnin r-ytbthy r-3o4zer" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(244,248,251,1.00)"><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1cm7zt9 r-tsynxw" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Connection</div><div dir="auto" class="css-146c3p1 r-evnaw r-b88u0q r-19qrga8" style="color:rgba(214,69,83,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Disconnected</div><div dir="auto" class="css-146c3p1 r-1enofrn r-19qrga8" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">0 events</div></div><div class="css-g5y9jx r-t23y2h r-rs99b7 r-16y2uox r-5oul0u r-1kb76zh r-bgnin r-ytbthy r-3o4zer" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(244,248,251,1.00)"><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1cm7zt9 r-tsynxw" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Pending Work</div><div dir="auto" class="css-146c3p1 r-evnaw r-b88u0q r-19qrga8" style="color:rgba(22,154,88,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">0</div><div dir="auto" class="css-146c3p1 r-1enofrn r-19qrga8" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">0 requests | 0 jobs</div></div><div class="css-g5y9jx r-t23y2h r-rs99b7 r-16y2uox r-5oul0u r-1kb76zh r-bgnin r-ytbthy r-3o4zer" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(244,248,251,1.00)"><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1cm7zt9 r-tsynxw" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Active Workers</div><div dir="auto" class="css-146c3p1 r-evnaw r-b88u0q r-19qrga8" style="color:rgba(0,126,119,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">0</div><div dir="auto" class="css-146c3p1 r-1enofrn r-19qrga8" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">0 busy</div></div><div class="css-g5y9jx r-t23y2h r-rs99b7 r-16y2uox r-5oul0u r-1kb76zh r-bgnin r-ytbthy r-3o4zer" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(244,248,251,1.00)"><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1cm7zt9 r-tsynxw" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Last Sync</div><div dir="auto" class="css-146c3p1 r-evnaw r-b88u0q r-19qrga8" style="color:rgba(0,126,119,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">--</div><div dir="auto" class="css-146c3p1 r-1enofrn r-19qrga8" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">waiting</div></div></div><div class="css-g5y9jx r-t23y2h r-rs99b7 r-18u37iz r-15d164r r-bhtmuz r-146eth8" style="background-color:rgba(244,248,251,1.00);border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00)"><button aria-label="Coordination tab" role="button" tabindex="0" class="css-g5y9jx r-1loqt21 r-1otgn73 r-1awozwy r-1dzdj1l r-rs99b7 r-13awgt0 r-1777fci r-11f147o r-1ubuhtd" style="background-color:rgba(0,126,119,1.00);border-top-color:rgba(0,126,119,1.00);border-right-color:rgba(0,126,119,1.00);border-bottom-color:rgba(0,126,119,1.00);border-left-color:rgba(0,126,119,1.00)" type="button"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1enofrn r-b88u0q" style="color:rgba(255,255,255,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Coordination<!-- --> (0)</div></button><button aria-label="Chat tab" role="button" tabindex="0" class="css-g5y9jx r-1loqt21 r-1otgn73 r-1awozwy r-42olwf r-1dzdj1l r-rs99b7 r-13awgt0 r-1777fci r-11f147o r-1ubuhtd" type="button"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1enofrn r-b88u0q" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Chat<!-- --> (0)</div></button><button aria-label="Requests tab" role="button" tabindex="0" class="css-g5y9jx r-1loqt21 r-1otgn73 r-1awozwy r-42olwf r-1dzdj1l r-rs99b7 r-13awgt0 r-1777fci r-11f147o r-1ubuhtd" type="button"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1enofrn r-b88u0q" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Requests<!-- --> (0)</div></button><button aria-label="Jobs &amp; Traces tab" role="button" tabindex="0" class="css-g5y9jx r-1loqt21 r-1otgn73 r-1awozwy r-42olwf r-1dzdj1l r-rs99b7 r-13awgt0 r-1777fci r-11f147o r-1ubuhtd" type="button"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1enofrn r-b88u0q" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Jobs &amp; Traces<!-- --> (0)</div></button><button aria-label="System tab" role="button" tabindex="0" class="css-g5y9jx r-1loqt21 r-1otgn73 r-1awozwy r-42olwf r-1dzdj1l r-rs99b7 r-13awgt0 r-1777fci r-11f147o r-1ubuhtd" type="button"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1enofrn r-b88u0q" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">System<!-- --> (0)</div></button><button aria-label="Config tab" role="button" tabindex="0" class="css-g5y9jx r-1loqt21 r-1otgn73 r-1awozwy r-42olwf r-1dzdj1l r-rs99b7 r-13awgt0 r-1777fci r-11f147o r-1ubuhtd" type="button"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1enofrn r-b88u0q" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Config</div></button></div><div class="css-g5y9jx r-13awgt0 r-ifefl9" style="opacity:1;transform:translateY(0px)"><div class="css-g5y9jx r-150rngu r-eqz5dr r-16y2uox r-1wbh5a2 r-11yh6sk r-1rnoaur r-agouwx r-13awgt0"><div class="css-g5y9jx r-1t2hasf r-u9wvl5"><div class="css-g5y9jx r-18u37iz r-1w6e6rj r-1mi0q7o"><div class="css-g5y9jx r-t23y2h r-rs99b7 r-16y2uox r-5oul0u r-1kb76zh r-bgnin r-ytbthy r-3o4zer" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(244,248,251,1.00)"><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1cm7zt9 r-tsynxw" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Ready For Review</div><div dir="auto" class="css-146c3p1 r-evnaw r-b88u0q r-19qrga8" style="color:rgba(0,126,119,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">0</div><div dir="auto" class="css-146c3p1 r-1enofrn r-19qrga8" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">0 processed completions</div></div><div class="css-g5y9jx r-t23y2h r-rs99b7 r-16y2uox r-5oul0u r-1kb76zh r-bgnin r-ytbthy r-3o4zer" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(244,248,251,1.00)"><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1cm7zt9 r-tsynxw" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Active Handoffs</div><div dir="auto" class="css-146c3p1 r-evnaw r-b88u0q r-19qrga8" style="color:rgba(0,126,119,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">0</div><div dir="auto" class="css-146c3p1 r-1enofrn r-19qrga8" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">0 running jobs</div></div><div class="css-g5y9jx r-t23y2h r-rs99b7 r-16y2uox r-5oul0u r-1kb76zh r-bgnin r-ytbthy r-3o4zer" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(244,248,251,1.00)"><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1cm7zt9 r-tsynxw" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Awaiting Remote</div><div dir="auto" class="css-146c3p1 r-evnaw r-b88u0q r-19qrga8" style="color:rgba(22,154,88,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">0</div><div dir="auto" class="css-146c3p1 r-1enofrn r-19qrga8" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">0 pending requests</div></div><div class="css-g5y9jx r-t23y2h r-rs99b7 r-16y2uox r-5oul0u r-1kb76zh r-bgnin r-ytbthy r-3o4zer" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(244,248,251,1.00)"><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1cm7zt9 r-tsynxw" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Blocked</div><div dir="auto" class="css-146c3p1 r-evnaw r-b88u0q r-19qrga8" style="color:rgba(22,154,88,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">0</div><div dir="auto" class="css-146c3p1 r-1enofrn r-19qrga8" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">0 failed jobs</div></div></div><div class="css-g5y9jx r-eqz5dr"><div class="css-g5y9jx r-1867qdf r-rs99b7 r-k3250r r-15d164r r-xyw6el" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(255,255,255,1.00)"><div class="css-g5y9jx r-1awozwy r-18u37iz r-1wtj0ep"><div dir="auto" class="css-146c3p1 r-ubezar r-b88u0q r-5oul0u" style="color:rgba(17,34,48,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Change Coordination Board</div><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1g94qm0" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">0<!-- --> latest requests</div></div><div class="css-g5y9jx r-1habvwh r-1867qdf r-nsbfu8"><div dir="auto" class="css-146c3p1 r-1i10wst r-b88u0q r-15zivkp" style="color:rgba(17,34,48,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Nothing to coordinate yet</div><div dir="auto" class="css-146c3p1 r-n6v787 r-hjklzo" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Send a task from chat and this board will trace the full handoff from request to integration.</div></div></div><div class="css-g5y9jx r-1867qdf r-rs99b7 r-jprt8p r-15d164r r-11wrixw r-xyw6el" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(255,255,255,1.00)"><div dir="auto" class="css-146c3p1 r-ubezar r-b88u0q r-5oul0u" style="color:rgba(17,34,48,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">Review Queue</div><div dir="auto" class="css-146c3p1 r-n6v787 r-hjklzo" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">No processed completions yet.</div><div dir="auto" class="css-146c3p1 r-ubezar r-b88u0q r-5oul0u" style="color:rgba(17,34,48,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif;margin-top:14px">Needs Attention</div><div dir="auto" class="css-146c3p1 r-n6v787 r-hjklzo" style="color:rgba(84,112,134,1.00);font-family:&#x27;Space Grotesk&#x27;, &#x27;Avenir Next&#x27;, &#x27;Trebuchet MS&#x27;, sans-serif">No failed coordination chains.</div></div></div></div></div></div></div></div></div></div></div><!--/$--></div></div></div></div><!--/$--></div></div><script src="/_expo/static/js/web/entry-e66b4de45f75e702ac16916082bcc9a5.js" defer></script>
439
439
  </body></html>
@@ -435,5 +435,5 @@ input::-webkit-search-cancel-button,input::-webkit-search-decoration,input::-web
435
435
  @keyframes r-1pzkwqh{0%{transform:translateY(100%);}100%{transform:translateY(0%);}}
436
436
  @keyframes r-imtty0{0%{opacity:0;}100%{opacity:1;}}
437
437
  @keyframes r-q67da2{0%{transform:translateX(-100%);}100%{transform:translateX(400%);}}
438
- @keyframes r-t2lo5v{0%{opacity:1;}100%{opacity:0;}}</style><script type="module">globalThis.__EXPO_ROUTER_HYDRATE__=true;</script><link rel="icon" href="/favicon.ico" /></head><body><div id="root"><div class="css-g5y9jx r-13awgt0"><!--$--><div style="position:absolute;left:0;right:0;top:0;bottom:0;pointer-events:none;visibility:hidden"></div><div class="css-g5y9jx r-13awgt0"><div class="css-g5y9jx r-13awgt0 r-1p0dtai r-1d2f490 r-u8s1d r-zchlnj r-ipm5af" style="background-color:rgba(242,242,242,1.00);display:flex"><div class="css-g5y9jx r-184en5c r-12vffkv"><div class="css-g5y9jx r-12vffkv" style="height:64px"><div class="css-g5y9jx r-1p0dtai r-1d2f490 r-u8s1d r-zchlnj r-ipm5af r-12vffkv"><div class="css-g5y9jx r-qklmqi r-13awgt0 r-105ug2t" style="background-color:rgba(255,255,255,1.00);border-bottom-color:rgba(216,216,216,1.00)"></div></div><div class="css-g5y9jx r-633pao" style="height:0px"></div><div class="css-g5y9jx r-1oszu61 r-13awgt0 r-18u37iz r-12vffkv"><div class="css-g5y9jx r-1awozwy r-18u37iz r-1h0z5md r-12vffkv" style="margin-left:0px"></div><div class="css-g5y9jx r-1777fci r-12vffkv" style="max-width:-32px;margin-right:16px;margin-left:16px"><h1 dir="auto" aria-level="1" role="heading" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1i10wst" style="color:rgba(28,28,30,1.00);font-family:system-ui, &quot;Segoe UI&quot;, Roboto, Helvetica, Arial, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;;font-weight:500">Modal</h1></div><div class="css-g5y9jx r-1awozwy r-18u37iz r-17s6mgv r-1iusvr4 r-16y2uox r-12vffkv" style="margin-right:0px"></div></div></div></div><div class="css-g5y9jx r-13awgt0"><div class="css-g5y9jx r-13awgt0"><!--$--><div class="css-g5y9jx r-1awozwy r-13awgt0 r-1777fci r-1pcd2l5" style="background-color:rgba(255,255,255,1.00)"><div dir="auto" class="css-146c3p1 r-1ui5ee8 r-vw2c0b r-37tt59" style="color:rgba(17,24,28,1.00)">This is a modal</div><a href="/" dir="auto" role="link" class="css-146c3p1 r-19h5ruw r-1d7mnkm r-1loqt21"><span class="css-1jxf684 r-1v78gzs r-ubezar r-17rnw9f">Go to home screen</span></a></div><!--/$--></div></div></div></div><!--/$--></div></div><script src="/_expo/static/js/web/entry-c6862f701ea52ccf8692a6c9e749af5c.js" defer></script>
438
+ @keyframes r-t2lo5v{0%{opacity:1;}100%{opacity:0;}}</style><script type="module">globalThis.__EXPO_ROUTER_HYDRATE__=true;</script><link rel="icon" href="/favicon.ico" /></head><body><div id="root"><div class="css-g5y9jx r-13awgt0"><!--$--><div style="position:absolute;left:0;right:0;top:0;bottom:0;pointer-events:none;visibility:hidden"></div><div class="css-g5y9jx r-13awgt0"><div class="css-g5y9jx r-13awgt0 r-1p0dtai r-1d2f490 r-u8s1d r-zchlnj r-ipm5af" style="background-color:rgba(242,242,242,1.00);display:flex"><div class="css-g5y9jx r-184en5c r-12vffkv"><div class="css-g5y9jx r-12vffkv" style="height:64px"><div class="css-g5y9jx r-1p0dtai r-1d2f490 r-u8s1d r-zchlnj r-ipm5af r-12vffkv"><div class="css-g5y9jx r-qklmqi r-13awgt0 r-105ug2t" style="background-color:rgba(255,255,255,1.00);border-bottom-color:rgba(216,216,216,1.00)"></div></div><div class="css-g5y9jx r-633pao" style="height:0px"></div><div class="css-g5y9jx r-1oszu61 r-13awgt0 r-18u37iz r-12vffkv"><div class="css-g5y9jx r-1awozwy r-18u37iz r-1h0z5md r-12vffkv" style="margin-left:0px"></div><div class="css-g5y9jx r-1777fci r-12vffkv" style="max-width:-32px;margin-right:16px;margin-left:16px"><h1 dir="auto" aria-level="1" role="heading" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1i10wst" style="color:rgba(28,28,30,1.00);font-family:system-ui, &quot;Segoe UI&quot;, Roboto, Helvetica, Arial, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;;font-weight:500">Modal</h1></div><div class="css-g5y9jx r-1awozwy r-18u37iz r-17s6mgv r-1iusvr4 r-16y2uox r-12vffkv" style="margin-right:0px"></div></div></div></div><div class="css-g5y9jx r-13awgt0"><div class="css-g5y9jx r-13awgt0"><!--$--><div class="css-g5y9jx r-1awozwy r-13awgt0 r-1777fci r-1pcd2l5" style="background-color:rgba(255,255,255,1.00)"><div dir="auto" class="css-146c3p1 r-1ui5ee8 r-vw2c0b r-37tt59" style="color:rgba(17,24,28,1.00)">This is a modal</div><a href="/" dir="auto" role="link" class="css-146c3p1 r-19h5ruw r-1d7mnkm r-1loqt21"><span class="css-1jxf684 r-1v78gzs r-ubezar r-17rnw9f">Go to home screen</span></a></div><!--/$--></div></div></div></div><!--/$--></div></div><script src="/_expo/static/js/web/entry-e66b4de45f75e702ac16916082bcc9a5.js" defer></script>
439
439
  </body></html>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pushpalsdev/cli",
3
- "version": "1.0.80",
3
+ "version": "1.0.82",
4
4
  "description": "PushPals terminal CLI for LocalBuddy -> RemoteBuddy orchestration",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -2,7 +2,7 @@
2
2
  // @bun
3
3
 
4
4
  // apps/remotebuddy/src/remotebuddy_main.ts
5
- import { randomUUID as randomUUID2 } from "crypto";
5
+ import { randomUUID as randomUUID3 } from "crypto";
6
6
  import { Database as Database3 } from "bun:sqlite";
7
7
 
8
8
  // apps/remotebuddy/src/llm.ts
@@ -1742,6 +1742,27 @@ var KNOWN_TOOL_NAMES = new Set([
1742
1742
  "python",
1743
1743
  "shell"
1744
1744
  ]);
1745
+ // packages/shared/src/toolchain.ts
1746
+ var SHELL_CONTROL_TOKENS = new Set(["|", "||", "&", "&&", ";", ">", ">>", "<", "<<"]);
1747
+ var NODE_BACKED_CLI_NAMES = new Set([
1748
+ "astro",
1749
+ "babel",
1750
+ "cypress",
1751
+ "eslint",
1752
+ "expo",
1753
+ "jest",
1754
+ "metro",
1755
+ "next",
1756
+ "nuxt",
1757
+ "playwright",
1758
+ "react-native",
1759
+ "rollup",
1760
+ "tsc",
1761
+ "tsx",
1762
+ "vite",
1763
+ "vitest",
1764
+ "webpack"
1765
+ ]);
1745
1766
  // packages/shared/src/session_event_visibility.ts
1746
1767
  var ALWAYS_VISIBLE_EVENT_TYPES = new Set(["question_asked"]);
1747
1768
  // packages/shared/src/localbuddy_runtime.ts
@@ -7920,6 +7941,14 @@ Scope:
7920
7941
  }
7921
7942
 
7922
7943
  // apps/remotebuddy/src/worker_spawn.ts
7944
+ import { randomUUID as randomUUID2 } from "crypto";
7945
+ function createWorkerPalId(options = {}) {
7946
+ const randomPart = String(options.randomId ?? randomUUID2()).replace(/[^a-z0-9]/gi, "");
7947
+ const timePart = Math.max(0, Math.floor(options.nowMs ?? Date.now())).toString(36);
7948
+ const pidPart = Math.max(0, Math.floor(options.processId ?? process.pid)).toString(36);
7949
+ const suffix = `${timePart}${pidPart}${randomPart}`.toLowerCase().slice(0, 12);
7950
+ return `workerpal-${suffix || "worker"}`;
7951
+ }
7923
7952
  function resolveWorkerStartupTimeoutMs(options) {
7924
7953
  const configuredMs = Math.max(1000, Math.floor(options.configuredMs || 0));
7925
7954
  if (!options.docker) {
@@ -8537,6 +8566,7 @@ class RemoteBuddyOrchestrator {
8537
8566
  autonomyConfigPollTimer = null;
8538
8567
  managedWorkers = new Map;
8539
8568
  workerSpawnInFlight = null;
8569
+ workerStartupPrewarmInFlight = null;
8540
8570
  workerSpawnCooldownUntil = 0;
8541
8571
  workerSpawnBackoffMs;
8542
8572
  workerAutoscalePollMs;
@@ -9539,7 +9569,7 @@ Please reply with the missing details and I will enqueue a follow-up request.` :
9539
9569
  }
9540
9570
  const spawnPromise = (async () => {
9541
9571
  this.workerpalsUnavailableReason = null;
9542
- const workerId = `workerpal-${randomUUID2().substring(0, 8)}`;
9572
+ const workerId = createWorkerPalId();
9543
9573
  const cmd = this.buildWorkerSpawnCommand(workerId);
9544
9574
  console.log(`[RemoteBuddy] Spawning WorkerPal ${workerId} (${this.managedWorkers.size + 1}/${this.maxWorkers})`);
9545
9575
  try {
@@ -9625,6 +9655,16 @@ Please reply with the missing details and I will enqueue a follow-up request.` :
9625
9655
  }
9626
9656
  console.warn(`[RemoteBuddy] ${this.currentWorkerUnavailableReason()}`);
9627
9657
  }
9658
+ startWorkerCapacityPrewarmOnStartup() {
9659
+ if (this.workerStartupPrewarmInFlight || this.disposed)
9660
+ return;
9661
+ this.workerStartupPrewarmInFlight = this.ensureWorkerCapacityOnStartup().catch((err) => {
9662
+ this.workerpalsUnavailableReason = `WorkerPal startup prewarm failed: ${String(err)}`;
9663
+ console.warn(`[RemoteBuddy] ${this.workerpalsUnavailableReason}`);
9664
+ }).finally(() => {
9665
+ this.workerStartupPrewarmInFlight = null;
9666
+ });
9667
+ }
9628
9668
  async selectTargetWorkerForJob() {
9629
9669
  const workers = await this.fetchWorkers();
9630
9670
  const idleNow = this.pickIdleWorker(workers);
@@ -9673,7 +9713,7 @@ Please reply with the missing details and I will enqueue a follow-up request.` :
9673
9713
  }
9674
9714
  const priority = normalizeRequestPriority(request.priority);
9675
9715
  const queueWaitBudgetMs = Math.max(5000, Number.isFinite(Number(request.queueWaitBudgetMs)) ? Number(request.queueWaitBudgetMs) : priority === "interactive" ? 20000 : priority === "background" ? 240000 : 90000);
9676
- const turnId = randomUUID2();
9716
+ const turnId = randomUUID3();
9677
9717
  const eventFrom = autonomyMetadata ? `agent:${this.agentId}/autonomy` : undefined;
9678
9718
  const planningContext = this.buildPlanningContext(priority, requestSessionId);
9679
9719
  this.rememberPersistentMemory("request", `priority=${priority} prompt=${toSingleLine(prompt, 520)}`, requestId, requestSessionId);
@@ -9802,7 +9842,7 @@ Please reply with the missing details and I will enqueue a follow-up request.` :
9802
9842
  this.rememberPersistentMemory("decision", `completed_without_worker intent=${plan.intent} lane=deterministic`, requestId, requestSessionId);
9803
9843
  return;
9804
9844
  }
9805
- const taskId = randomUUID2();
9845
+ const taskId = randomUUID3();
9806
9846
  const targetWorkerId = await this.selectTargetWorkerForJob();
9807
9847
  if (!targetWorkerId) {
9808
9848
  const onlineWorkers = this.onlineWorkers(await this.fetchWorkers());
@@ -10179,7 +10219,7 @@ async function main() {
10179
10219
  await orchestrator.emitStartupStatus();
10180
10220
  orchestrator.startStatusHeartbeat();
10181
10221
  orchestrator.startSessionEventMonitor();
10182
- await orchestrator.ensureWorkerCapacityOnStartup();
10222
+ orchestrator.startWorkerCapacityPrewarmOnStartup();
10183
10223
  orchestrator.startAutonomy();
10184
10224
  orchestrator.startAutonomyRuntimeConfigPolling();
10185
10225
  const pollMs = CONFIG.remotebuddy.pollMs;
@@ -9,6 +9,11 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
9
9
  git \
10
10
  curl \
11
11
  ca-certificates \
12
+ build-essential \
13
+ cmake \
14
+ pkg-config \
15
+ nodejs \
16
+ npm \
12
17
  openssh-client \
13
18
  grep \
14
19
  jq \
@@ -11,14 +11,18 @@ import {
11
11
  explicitSourceControlCommitIdentityFromEnv,
12
12
  loadPromptTemplate,
13
13
  loadPushPalsConfig,
14
+ buildToolchainPlan,
14
15
  extractVisionKeyItems,
16
+ formatToolRequirement,
15
17
  matchesGlob,
16
18
  normalizeAutonomyComponentArea,
17
19
  normalizeTargetPath,
20
+ requirementsForValidationCommand,
18
21
  sanitizeSourceControlIdentityField,
19
22
  validateScopeInvariants,
20
23
  type AutonomyComponentArea,
21
24
  type SourceControlCommitIdentity,
25
+ type ToolRequirement,
22
26
  } from "shared";
23
27
  import { resolveExecutor, type WorkerpalsRuntimeConfig } from "./common/executor_backend.js";
24
28
  import type { JobPublishBlockedInfo, JobResult } from "./common/types.js";
@@ -586,6 +590,99 @@ async function runValidationCommand(
586
590
  };
587
591
  }
588
592
 
593
+ interface ToolAvailabilityResult {
594
+ requirement: ToolRequirement;
595
+ ok: boolean;
596
+ candidate: string | null;
597
+ detail: string;
598
+ }
599
+
600
+ function toolProbeArgv(candidate: string): string[] {
601
+ const normalized = candidate.toLowerCase();
602
+ if (normalized === "sh") {
603
+ return [candidate, "-c", "exit 0"];
604
+ }
605
+ if (normalized === "cmd") {
606
+ return [candidate, "/c", "exit 0"];
607
+ }
608
+ if (normalized === "bash") {
609
+ return [candidate, "-lc", "exit 0"];
610
+ }
611
+ if (normalized === "powershell" || normalized === "pwsh") {
612
+ return [candidate, "-NoProfile", "-Command", "exit 0"];
613
+ }
614
+ return [candidate, "--version"];
615
+ }
616
+
617
+ async function checkToolCandidate(candidate: string, timeoutMs = 5_000): Promise<boolean> {
618
+ try {
619
+ const proc = Bun.spawn(toolProbeArgv(candidate), {
620
+ stdout: "pipe",
621
+ stderr: "pipe",
622
+ });
623
+ let timedOut = false;
624
+ const timer = setTimeout(() => {
625
+ timedOut = true;
626
+ try {
627
+ proc.kill();
628
+ } catch {
629
+ // ignore
630
+ }
631
+ }, Math.max(1_000, timeoutMs));
632
+ try {
633
+ const [exitCode] = await Promise.all([
634
+ proc.exited,
635
+ new Response(proc.stdout).text().catch(() => ""),
636
+ new Response(proc.stderr).text().catch(() => ""),
637
+ ]);
638
+ return !timedOut && exitCode === 0;
639
+ } finally {
640
+ clearTimeout(timer);
641
+ }
642
+ } catch {
643
+ return false;
644
+ }
645
+ }
646
+
647
+ async function checkToolAvailability(
648
+ requirements: ToolRequirement[],
649
+ ): Promise<ToolAvailabilityResult[]> {
650
+ const cache = new Map<string, Promise<boolean>>();
651
+ const check = (candidate: string) => {
652
+ const key = candidate.toLowerCase();
653
+ let cached = cache.get(key);
654
+ if (!cached) {
655
+ cached = checkToolCandidate(candidate);
656
+ cache.set(key, cached);
657
+ }
658
+ return cached;
659
+ };
660
+
661
+ const out: ToolAvailabilityResult[] = [];
662
+ for (const requirement of requirements) {
663
+ let availableCandidate: string | null = null;
664
+ for (const candidate of requirement.candidates) {
665
+ if (await check(candidate)) {
666
+ availableCandidate = candidate;
667
+ break;
668
+ }
669
+ }
670
+ out.push({
671
+ requirement,
672
+ ok: Boolean(availableCandidate),
673
+ candidate: availableCandidate,
674
+ detail: availableCandidate
675
+ ? `${availableCandidate} is available`
676
+ : `missing ${formatToolRequirement(requirement)}`,
677
+ });
678
+ }
679
+ return out;
680
+ }
681
+
682
+ function formatMissingToolRequirements(requirements: ToolRequirement[]): string {
683
+ return requirements.map(formatToolRequirement).join(", ");
684
+ }
685
+
589
686
  function extractPreparedMergeConflictPaths(params: Record<string, unknown>): string[] {
590
687
  const reviewAgent =
591
688
  params.reviewAgent && typeof params.reviewAgent === "object" && !Array.isArray(params.reviewAgent)
@@ -607,6 +704,20 @@ function detectValidationBlocker(runs: ValidationExecutionResult[]): ValidationB
607
704
  .toLowerCase();
608
705
  if (!combined) return null;
609
706
 
707
+ if (
708
+ combined.includes("validation skipped before execution because required tool") ||
709
+ combined.includes("missing required tool") ||
710
+ combined.includes("command not found") ||
711
+ combined.includes("executable not found") ||
712
+ combined.includes("not recognized as an internal or external command")
713
+ ) {
714
+ return {
715
+ category: "environment",
716
+ detail:
717
+ "Validation is blocked by missing required toolchain executables in the worker environment. Install/provision the missing tools or declare a supported repo toolchain before retrying this job.",
718
+ };
719
+ }
720
+
610
721
  if (
611
722
  combined.includes("cannot find module") ||
612
723
  combined.includes("module not found") ||
@@ -1086,7 +1197,54 @@ async function runDeterministicQualityGate(
1086
1197
  `[QualityGate] No runnable planning.validationSteps found; using fallback validation command(s): ${commandsToRun.join(" | ")}`,
1087
1198
  );
1088
1199
  }
1200
+ const toolchainPlan = buildToolchainPlan({
1201
+ repoRoot: repo,
1202
+ validationCommands: commandsToRun,
1203
+ });
1204
+ if (toolchainPlan.requirements.length > 0) {
1205
+ onLog?.(
1206
+ "stdout",
1207
+ `[QualityGate] Toolchain preflight: source=${toolchainPlan.environmentSource}, required=${toolchainPlan.requirements
1208
+ .map((requirement) => requirement.tool)
1209
+ .join(", ")}`,
1210
+ );
1211
+ }
1212
+ const toolAvailability = await checkToolAvailability(toolchainPlan.requirements);
1213
+ const missingToolRequirements = toolAvailability
1214
+ .filter((entry) => !entry.ok)
1215
+ .map((entry) => entry.requirement);
1216
+ if (missingToolRequirements.length > 0) {
1217
+ onLog?.(
1218
+ "stderr",
1219
+ `[QualityGate] Toolchain preflight blocked dependent validation command(s): ${formatMissingToolRequirements(
1220
+ missingToolRequirements,
1221
+ )}`,
1222
+ );
1223
+ }
1089
1224
  for (const command of commandsToRun) {
1225
+ const commandMissingTools = requirementsForValidationCommand(toolchainPlan, command).filter(
1226
+ (requirement) =>
1227
+ missingToolRequirements.some((missing) => missing.tool === requirement.tool),
1228
+ );
1229
+ if (commandMissingTools.length > 0) {
1230
+ const stderr = `Validation skipped before execution because required tool(s) are missing: ${formatMissingToolRequirements(
1231
+ commandMissingTools,
1232
+ )}.`;
1233
+ validationRuns.push({
1234
+ step: command,
1235
+ command,
1236
+ ok: false,
1237
+ exitCode: 127,
1238
+ stdout: "",
1239
+ stderr,
1240
+ elapsedMs: 1,
1241
+ });
1242
+ onLog?.(
1243
+ "stderr",
1244
+ `[QualityGate] Quality gate validation skipped (missing toolchain): ${command}`,
1245
+ );
1246
+ continue;
1247
+ }
1090
1248
  onLog?.("stdout", `[QualityGate] Quality gate validation: running "${command}"`);
1091
1249
  const run = await runValidationCommand(
1092
1250
  repo,
@@ -73,6 +73,17 @@ export {
73
73
  type ToolRegistry,
74
74
  type ToolRunRecord,
75
75
  } from "./tooling.js";
76
+ export {
77
+ buildToolchainPlan,
78
+ formatToolRequirement,
79
+ inferToolRequirementsForValidationCommand,
80
+ requirementsForValidationCommand,
81
+ tokenizeToolchainCommand,
82
+ type BuildToolchainPlanOptions,
83
+ type ToolRequirement,
84
+ type ToolchainEnvironmentSource,
85
+ type ToolchainPlan,
86
+ } from "./toolchain.js";
76
87
  export {
77
88
  DEFAULT_WORKERPALS_EXECUTOR,
78
89
  invalidatePushPalsConfigCache,