@stackone/cli 1.38.1 → 1.39.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.
@@ -1,32 +1,33 @@
1
- const e=require(`./agentConfig-KBkYYmMr.cjs`),t=require(`./fileNames-Booqk8P6.cjs`),n=require(`./setupMigration-rqPZ8MV6.cjs`),r=require(`./agentApiKey-BDp7EFMI.cjs`);let i=require(`chalk`);i=e.E(i);let a=require(`commander`),o=require(`@stackone/agent-harness`),s=require(`node:fs`);s=e.E(s);let c=require(`node:os`);c=e.E(c);let l=require(`node:path`);l=e.E(l);let u=require(`ink`),d=require(`react`);d=e.E(d);let f=require(`node:child_process`),p=require(`ink-spinner`);p=e.E(p);let m=require(`fs`);m=e.E(m);let h=require(`path`);h=e.E(h);let g=require(`node:module`),_=require(`url`),v=require(`ora`);v=e.E(v);let y=require(`node:fs/promises`),b=require(`inquirer`);b=e.E(b);let x=require(`node:process`),S=require(`node:readline`),C=require(`@stackone/utils`),w=require(`@clack/prompts`),T=require(`@stackone/connect-sdk`),E=require(`diff`),ee=require(`readline`),D=require(`semver`);D=e.E(D);let O=require(`@stackone/transport`),k=require(`node:util`),A=require(`fs/promises`);const j={primary:`#00AF66`,success:`green`,warning:`yellow`,error:`red`,text:`white`,dim:`gray`},M={defaultTerminalWidth:80,boxWidth:44,maxToolNameWidth:64,maxInputSummaryWidth:60,maxSeparatorWidth:60,maxConversationTitleLength:36,maxExampleLength:38,maxCollapsedTools:5,maxToolOutputLines:15},N=e=>{let t=e.replace(/^claude-/,``).replace(/-\d{8,}$/,``),n=t.match(/^(\w+)-(\d+)(?:-(\d+))?$/);if(n){let e=n[3]?`.${n[3]}`:``;return`${n[1]}-${n[2]}${e}`}return t||e},P={cellsPerFrame:3,pixelFrameMs:18,holdFrames:25,fadeSteps:5,fadeStepMs:80,timerIntervalMs:1e3};function F(e){return e.replace(/\*\*\*(.+?)\*\*\*/g,`$1`).replace(/\*\*(.+?)\*\*/g,`$1`).replace(/\*(.+?)\*/g,`$1`).replace(/^#{1,6}\s+/gm,``).replace(/```([\s\S]*?)```/g,`$1`).replace(/`(.+?)`/g,`$1`).replace(/!\[([^\]]{0,500})\]\([^)]{1,2000}\)/g,`$1`).replace(/\[([^\]]{1,500})\]\([^)]{1,2000}\)/g,`$1`).replace(/^(?!_+$)[-*_]{3,}$/gm,``).replace(/^>\s+/gm,``).trim()}const te=e=>{let t=Math.round(e/1e3);return t<60?`${t}s`:`${Math.floor(t/60)}m${t%60}s`},ne=e=>{let t=(e.status===`complete`||e.status===`warning`||e.status===`error`)&&e.durationMs!=null?` ${te(e.durationMs)}`:``,n=e.model?d.default.createElement(u.Text,{dimColor:!0},` (`,N(e.model),`)`):null;switch(e.status){case`complete`:return d.default.createElement(u.Text,{color:`green`},e.name,n,` ✓`,t);case`warning`:return d.default.createElement(u.Text,{color:`yellow`},e.name,n,` ⚠`,t);case`running`:return d.default.createElement(u.Text,{color:`cyan`},e.name,n,` `,d.default.createElement(p.default,{type:`dots`}));case`error`:return d.default.createElement(u.Text,{color:`red`},e.name,n,` ✗`,t);case`skipped`:return d.default.createElement(u.Text,{dimColor:!0},e.name,` ⊘`);case`pending`:default:return d.default.createElement(u.Text,{dimColor:!0},e.name,` ○`)}},re=({phases:e})=>e.length===0?null:d.default.createElement(u.Box,{marginBottom:1},d.default.createElement(u.Text,{bold:!0},`Build: `),e.map((t,n)=>d.default.createElement(u.Box,{key:t.name},d.default.createElement(u.Text,null,`[`),ne(t),d.default.createElement(u.Text,null,`]`),n<e.length-1&&d.default.createElement(u.Text,null,` `)))),ie=[`\x1B[38;2;0;140;82m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;140;82m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;140;82m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;140;82m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;140;82m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;140;82m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;140;82m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;140;82m\x1B[48;2;14;147;94m▀\x1B[0m\x1B[38;2;8;125;77m\x1B[48;2;29;115;84m▀\x1B[0m\x1B[38;2;16;108;72m\x1B[48;2;23;128;88m▀\x1B[0m\x1B[38;2;14;112;73m\x1B[48;2;17;140;91m▀\x1B[0m\x1B[38;2;9;122;76m\x1B[48;2;11;152;95m▀\x1B[0m\x1B[38;2;4;132;79m\x1B[48;2;5;165;99m▀\x1B[0m\x1B[38;2;0;55;33m\x1B[48;2;0;69;41m▀\x1B[0m`,`\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;2;170;100m\x1B[48;2;11;153;95m▀\x1B[0m\x1B[38;2;34;106;81m\x1B[48;2;35;103;80m▀\x1B[0m\x1B[38;2;29;115;84m\x1B[48;2;29;115;84m▀\x1B[0m\x1B[38;2;23;127;88m\x1B[48;2;23;127;88m▀\x1B[0m\x1B[38;2;17;140;92m\x1B[48;2;17;140;92m▀\x1B[0m\x1B[38;2;11;152;95m\x1B[48;2;11;152;95m▀\x1B[0m\x1B[38;2;5;165;99m\x1B[48;2;5;165;99m▀\x1B[0m\x1B[38;2;0;69;41m\x1B[48;2;0;69;41m▀\x1B[0m`,`\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;1;125;74m\x1B[48;2;0;123;71m▀\x1B[0m \x1B[38;2;0;128;75m\x1B[48;2;0;123;71m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m`,`\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;123;71m\x1B[48;2;0;128;75m▀\x1B[0m \x1B[38;2;0;123;71m\x1B[48;2;1;125;74m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m`,` \x1B[38;2;0;69;41m\x1B[48;2;0;69;41m▀\x1B[0m\x1B[38;2;5;165;99m\x1B[48;2;5;165;99m▀\x1B[0m\x1B[38;2;11;152;95m\x1B[48;2;11;152;95m▀\x1B[0m\x1B[38;2;17;140;91m\x1B[48;2;17;140;91m▀\x1B[0m\x1B[38;2;23;127;88m\x1B[48;2;23;127;88m▀\x1B[0m\x1B[38;2;29;115;84m\x1B[48;2;29;115;84m▀\x1B[0m\x1B[38;2;35;102;80m\x1B[48;2;34;105;81m▀\x1B[0m\x1B[38;2;11;152;95m\x1B[48;2;3;169;100m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m`,` \x1B[38;2;0;69;40m\x1B[48;2;0;62;37m▀\x1B[0m\x1B[38;2;5;165;99m\x1B[48;2;5;148;89m▀\x1B[0m\x1B[38;2;11;152;95m\x1B[48;2;10;137;86m▀\x1B[0m\x1B[38;2;17;140;91m\x1B[48;2;15;126;82m▀\x1B[0m\x1B[38;2;23;127;88m\x1B[48;2;17;122;81m▀\x1B[0m\x1B[38;2;29;115;84m\x1B[48;2;9;139;86m▀\x1B[0m\x1B[38;2;16;143;92m\x1B[48;2;0;158;92m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;158;92m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;158;92m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;158;92m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;158;92m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;158;92m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;158;92m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;158;92m▀\x1B[0m`],ae=e=>{let t=[],n=0;for(;n<e.length;)if(e[n]===`\x1B`){let r=``;for(;n<e.length;)if(e[n]===`\x1B`){let t=e.indexOf(`m`,n);if(r+=e.substring(n,t+1),n=t+1,r.endsWith(`\x1B[0m`)&&/[▀▄█]/.test(r))break}else r+=e[n],n++;t.push(r)}else e[n]===` `&&t.push(null),n++;return t},I=ie.map(ae),L=[];for(let e=0;e<I.length;e++)for(let t=0;t<I[e].length;t++){let n=I[e][t];n&&L.push({row:e,col:t,cell:n})}const R=Math.max(...I.map(e=>e.length)),z=e=>{let t=[...e];for(let e=t.length-1;e>0;e--){let n=Math.floor(Math.random()*(e+1));[t[e],t[n]]=[t[n],t[e]]}return t},oe=({ready:e,onComplete:t})=>{let[n,r]=(0,d.useState)(0),i=(0,d.useRef)(z(L.map((e,t)=>t))),a=(0,d.useRef)(z(L.map((e,t)=>t))),o=(0,d.useRef)(!1),s=Math.ceil(L.length/P.cellsPerFrame),c=s;(0,d.useEffect)(()=>{let e=setInterval(()=>{r(e=>{let t=e+1;return t>=s+P.holdFrames+s+P.holdFrames?(i.current=z(L.map((e,t)=>t)),a.current=z(L.map((e,t)=>t)),0):t})},P.pixelFrameMs);return()=>clearInterval(e)},[s]),(0,d.useEffect)(()=>{e&&n>=c&&!o.current&&(o.current=!0,t?.())},[e,n,c,t]);let l=new Set;if(n<s){let e=Math.min((n+1)*P.cellsPerFrame,L.length);for(let t=0;t<e;t++)l.add(i.current[t])}else if(n<s+P.holdFrames)for(let e=0;e<L.length;e++)l.add(e);else if(e)for(let e=0;e<L.length;e++)l.add(e);else if(n<s*2+P.holdFrames){let e=n-s-P.holdFrames,t=Math.min((e+1)*P.cellsPerFrame,L.length);for(let e=0;e<L.length;e++)l.add(e);for(let e=0;e<t;e++)l.delete(a.current[e])}let f=new Map;for(let e of l){let t=L[e];f.set(`${t.row},${t.col}`,t.cell)}let p=[];for(let e=0;e<I.length;e++){let t=``;for(let n=0;n<R;n++){let r=f.get(`${e},${n}`);t+=r??` `}p.push(t)}return d.default.createElement(u.Text,null,p.join(`
2
- `))},se=(e,t)=>{if(t)return t;let n=M.maxToolNameWidth;return(e.length>n?`${e.slice(0,n-1)}…`:e).padEnd(n)},ce=(e,t)=>{let n=e.split(`
1
+ const e=require(`./agentConfig-KBkYYmMr.cjs`),t=require(`./fileNames-Booqk8P6.cjs`),n=require(`./setupMigration-rqPZ8MV6.cjs`),r=require(`./agentApiKey-BDp7EFMI.cjs`);let i=require(`chalk`);i=e.E(i);let a=require(`commander`),o=require(`@stackone/agent-harness`),s=require(`node:fs`);s=e.E(s);let c=require(`node:os`);c=e.E(c);let l=require(`node:path`);l=e.E(l);let u=require(`ink`),d=require(`react`);d=e.E(d);let f=require(`node:child_process`),p=require(`ink-spinner`);p=e.E(p);let m=require(`fs`);m=e.E(m);let h=require(`path`);h=e.E(h);let g=require(`node:module`),_=require(`url`),v=require(`ora`);v=e.E(v);let y=require(`node:fs/promises`),b=require(`inquirer`);b=e.E(b);let x=require(`node:process`),S=require(`node:readline`),C=require(`@stackone/utils`),w=require(`@clack/prompts`),T=require(`@stackone/connect-sdk`),E=require(`diff`),ee=require(`readline`),D=require(`semver`);D=e.E(D);let O=require(`@stackone/transport`),k=require(`node:util`),A=require(`fs/promises`);const j={primary:`#00AF66`,success:`green`,warning:`yellow`,error:`red`,text:`white`,dim:`gray`},M={defaultTerminalWidth:80,boxWidth:44,maxToolNameWidth:64,maxInputSummaryWidth:60,maxSeparatorWidth:60,maxConversationTitleLength:36,maxExampleLength:38,maxCollapsedTools:5,maxToolOutputLines:15},N=e=>{let t=e.replace(/^claude-/,``).replace(/-\d{8,}$/,``),n=t.match(/^(\w+)-(\d+)(?:-(\d+))?$/);if(n){let e=n[3]?`.${n[3]}`:``;return`${n[1]}-${n[2]}${e}`}return t||e},P={cellsPerFrame:3,pixelFrameMs:18,holdFrames:25,fadeSteps:5,fadeStepMs:80,timerIntervalMs:1e3};function F(e){return e.replace(/\*\*\*(.+?)\*\*\*/g,`$1`).replace(/\*\*(.+?)\*\*/g,`$1`).replace(/\*(.+?)\*/g,`$1`).replace(/^#{1,6}\s+/gm,``).replace(/```([\s\S]*?)```/g,`$1`).replace(/`(.+?)`/g,`$1`).replace(/!\[([^\]]{0,500})\]\([^)]{1,2000}\)/g,`$1`).replace(/\[([^\]]{1,500})\]\([^)]{1,2000}\)/g,`$1`).replace(/^(?!_+$)[-*_]{3,}$/gm,``).replace(/^>\s+/gm,``).trim()}const te=e=>{let t=Math.round(e/1e3);return t<60?`${t}s`:`${Math.floor(t/60)}m${t%60}s`},ne=e=>{let t=(e.status===`complete`||e.status===`warning`||e.status===`error`)&&e.durationMs!=null?` ${te(e.durationMs)}`:``,n=e.model?d.default.createElement(u.Text,{dimColor:!0},` (`,N(e.model),`)`):null;switch(e.status){case`complete`:return d.default.createElement(u.Text,{color:`green`},e.name,n,` ✓`,t);case`warning`:return d.default.createElement(u.Text,{color:`yellow`},e.name,n,` ⚠`,t);case`running`:return d.default.createElement(u.Text,{color:`cyan`},e.name,n,` `,d.default.createElement(p.default,{type:`dots`}));case`error`:return d.default.createElement(u.Text,{color:`red`},e.name,n,` ✗`,t);case`skipped`:return d.default.createElement(u.Text,{dimColor:!0},e.name,` ⊘`);case`pending`:default:return d.default.createElement(u.Text,{dimColor:!0},e.name,` ○`)}},re=({phases:e})=>e.length===0?null:d.default.createElement(u.Box,{marginBottom:1},d.default.createElement(u.Text,{bold:!0},`Build: `),e.map((t,n)=>d.default.createElement(u.Box,{key:t.name},d.default.createElement(u.Text,null,`[`),ne(t),d.default.createElement(u.Text,null,`]`),n<e.length-1&&d.default.createElement(u.Text,null,` `)))),ie=[`\x1B[38;2;0;140;82m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;140;82m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;140;82m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;140;82m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;140;82m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;140;82m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;140;82m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;140;82m\x1B[48;2;14;147;94m▀\x1B[0m\x1B[38;2;8;125;77m\x1B[48;2;29;115;84m▀\x1B[0m\x1B[38;2;16;108;72m\x1B[48;2;23;128;88m▀\x1B[0m\x1B[38;2;14;112;73m\x1B[48;2;17;140;91m▀\x1B[0m\x1B[38;2;9;122;76m\x1B[48;2;11;152;95m▀\x1B[0m\x1B[38;2;4;132;79m\x1B[48;2;5;165;99m▀\x1B[0m\x1B[38;2;0;55;33m\x1B[48;2;0;69;41m▀\x1B[0m`,`\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;2;170;100m\x1B[48;2;11;153;95m▀\x1B[0m\x1B[38;2;34;106;81m\x1B[48;2;35;103;80m▀\x1B[0m\x1B[38;2;29;115;84m\x1B[48;2;29;115;84m▀\x1B[0m\x1B[38;2;23;127;88m\x1B[48;2;23;127;88m▀\x1B[0m\x1B[38;2;17;140;92m\x1B[48;2;17;140;92m▀\x1B[0m\x1B[38;2;11;152;95m\x1B[48;2;11;152;95m▀\x1B[0m\x1B[38;2;5;165;99m\x1B[48;2;5;165;99m▀\x1B[0m\x1B[38;2;0;69;41m\x1B[48;2;0;69;41m▀\x1B[0m`,`\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;1;125;74m\x1B[48;2;0;123;71m▀\x1B[0m \x1B[38;2;0;128;75m\x1B[48;2;0;123;71m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m`,`\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;123;71m\x1B[48;2;0;128;75m▀\x1B[0m \x1B[38;2;0;123;71m\x1B[48;2;1;125;74m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m`,` \x1B[38;2;0;69;41m\x1B[48;2;0;69;41m▀\x1B[0m\x1B[38;2;5;165;99m\x1B[48;2;5;165;99m▀\x1B[0m\x1B[38;2;11;152;95m\x1B[48;2;11;152;95m▀\x1B[0m\x1B[38;2;17;140;91m\x1B[48;2;17;140;91m▀\x1B[0m\x1B[38;2;23;127;88m\x1B[48;2;23;127;88m▀\x1B[0m\x1B[38;2;29;115;84m\x1B[48;2;29;115;84m▀\x1B[0m\x1B[38;2;35;102;80m\x1B[48;2;34;105;81m▀\x1B[0m\x1B[38;2;11;152;95m\x1B[48;2;3;169;100m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m`,` \x1B[38;2;0;69;40m\x1B[48;2;0;62;37m▀\x1B[0m\x1B[38;2;5;165;99m\x1B[48;2;5;148;89m▀\x1B[0m\x1B[38;2;11;152;95m\x1B[48;2;10;137;86m▀\x1B[0m\x1B[38;2;17;140;91m\x1B[48;2;15;126;82m▀\x1B[0m\x1B[38;2;23;127;88m\x1B[48;2;17;122;81m▀\x1B[0m\x1B[38;2;29;115;84m\x1B[48;2;9;139;86m▀\x1B[0m\x1B[38;2;16;143;92m\x1B[48;2;0;158;92m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;158;92m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;158;92m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;158;92m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;158;92m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;158;92m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;158;92m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;158;92m▀\x1B[0m`],ae=[` ▄▖▗ ▌ ▄▖`,` ▚ ▜▘▀▌▛▘▙▘▌▌▛▌█▌`,` ▄▌▐▖█▌▙▖▛▖▙▌▌▌▙▖`,``,``,``],oe=ie.map((e,t)=>e+ae[t]),se=e=>{let t=[],n=0;for(;n<e.length;)if(e[n]===`\x1B`){let r=``;for(;n<e.length;)if(e[n]===`\x1B`){let t=e.indexOf(`m`,n);if(r+=e.substring(n,t+1),n=t+1,r.endsWith(`\x1B[0m`)&&/[▀▄█]/.test(r))break}else r+=e[n],n++;t.push(r)}else e[n]===` `&&t.push(null),n++;return t},I=ie.map(se),L=[];for(let e=0;e<I.length;e++)for(let t=0;t<I[e].length;t++){let n=I[e][t];n&&L.push({row:e,col:t,cell:n})}const R=Math.max(...I.map(e=>e.length)),z=({wordmark:e})=>d.default.createElement(u.Text,null,(e?oe:ie).join(`
2
+ `)),ce=e=>{let t=[...e];for(let e=t.length-1;e>0;e--){let n=Math.floor(Math.random()*(e+1));[t[e],t[n]]=[t[n],t[e]]}return t},le=({ready:e,onComplete:t})=>{let[n,r]=(0,d.useState)(0),i=(0,d.useRef)(ce(L.map((e,t)=>t))),a=(0,d.useRef)(ce(L.map((e,t)=>t))),o=(0,d.useRef)(!1),s=Math.ceil(L.length/P.cellsPerFrame),c=s;(0,d.useEffect)(()=>{let e=setInterval(()=>{r(e=>{let t=e+1;return t>=s+P.holdFrames+s+P.holdFrames?(i.current=ce(L.map((e,t)=>t)),a.current=ce(L.map((e,t)=>t)),0):t})},P.pixelFrameMs);return()=>clearInterval(e)},[s]),(0,d.useEffect)(()=>{e&&n>=c&&!o.current&&(o.current=!0,t?.())},[e,n,c,t]);let l=new Set;if(n<s){let e=Math.min((n+1)*P.cellsPerFrame,L.length);for(let t=0;t<e;t++)l.add(i.current[t])}else if(n<s+P.holdFrames)for(let e=0;e<L.length;e++)l.add(e);else if(e)for(let e=0;e<L.length;e++)l.add(e);else if(n<s*2+P.holdFrames){let e=n-s-P.holdFrames,t=Math.min((e+1)*P.cellsPerFrame,L.length);for(let e=0;e<L.length;e++)l.add(e);for(let e=0;e<t;e++)l.delete(a.current[e])}let f=new Map;for(let e of l){let t=L[e];f.set(`${t.row},${t.col}`,t.cell)}let p=[];for(let e=0;e<I.length;e++){let t=``;for(let n=0;n<R;n++){let r=f.get(`${e},${n}`);t+=r??` `}p.push(t)}return d.default.createElement(u.Text,null,p.join(`
3
+ `))},ue=(e,t)=>{if(t)return t;let n=M.maxToolNameWidth;return(e.length>n?`${e.slice(0,n-1)}…`:e).padEnd(n)},de=(e,t)=>{let n=e.split(`
3
4
  `);return n.length<=t?{text:e,truncated:!1}:{text:n.slice(0,t).join(`
4
- `),truncated:!0}},le=({tools:e,expanded:t=!1,maxCollapsed:n=M.maxCollapsedTools,title:r})=>{if(e.length===0)return null;let i=e.some(e=>e.status===`running`),a=r||(i?`Working...`:`Tools (${e.length})`),o=t?e:e.slice(0,n),s=e.length-o.length;return d.default.createElement(u.Box,{flexDirection:`column`,borderStyle:`round`,borderColor:j.primary,borderDimColor:!0,paddingX:1},d.default.createElement(u.Text,{dimColor:!0,bold:!0},a),o.map((e,n)=>d.default.createElement(u.Box,{key:`tool-${n}`,flexDirection:`column`},d.default.createElement(u.Box,null,e.status===`running`?d.default.createElement(u.Text,{color:j.primary},d.default.createElement(p.default,{type:`dots`})):e.status===`failed`?d.default.createElement(u.Text,{color:j.error},`✗`):d.default.createElement(u.Text,{color:j.primary},`✓`),d.default.createElement(u.Text,{bold:!0},` `,se(e.name,e.skillName)),e.inputSummary&&d.default.createElement(u.Text,{dimColor:!0,italic:!0},` `,e.inputSummary.length>M.maxInputSummaryWidth?`${e.inputSummary.slice(0,M.maxInputSummaryWidth-1)}…`:e.inputSummary)),t&&e.output&&d.default.createElement(u.Box,{paddingLeft:2,flexDirection:`column`},(()=>{let{text:t,truncated:n}=ce(e.output,M.maxToolOutputLines);return d.default.createElement(d.default.Fragment,null,d.default.createElement(u.Text,{dimColor:!0,italic:!0,wrap:`wrap`},t),n&&d.default.createElement(u.Text,{dimColor:!0,italic:!0},`... (truncated)`))})()))),s>0&&d.default.createElement(u.Text,{dimColor:!0},`... and `,s,` more (Ctrl+O to show all)`))};let ue=``;try{let e=require.resolve(`@stackone/agent-harness`),t=l.dirname(e);for(;t!==l.dirname(t);){let e=l.join(t,`package.json`);if(s.existsSync(e)){let t=JSON.parse(s.readFileSync(e,`utf-8`));if(t.name===`@stackone/agent-harness`){ue=t.version||``;break}}t=l.dirname(t)}}catch{}const de=({startTime:e})=>{let[,t]=(0,d.useState)(0);(0,d.useEffect)(()=>{let e=setInterval(()=>t(e=>e+1),1e3);return()=>clearInterval(e)},[]);let n=Date.now()-e.getTime(),r=Math.floor(n/1e3),i=r>=60?`${Math.floor(r/60)}m${r%60}s`:`${r}s`;return d.default.createElement(u.Text,{dimColor:!0},i)},fe=({children:e})=>{let[t,n]=(0,d.useState)(0);return(0,d.useEffect)(()=>{if(t>=P.fadeSteps)return;let e=setTimeout(()=>n(e=>e+1),P.fadeStepMs);return()=>clearTimeout(e)},[t]),d.default.createElement(d.default.Fragment,null,e(Math.min(t/P.fadeSteps,1)))},pe=e=>{try{return(0,f.execSync)(process.platform===`darwin`?`pbcopy`:process.platform===`win32`?`clip`:`xclip -selection clipboard`,{input:e,stdio:[`pipe`,`ignore`,`ignore`]}),!0}catch{return!1}};function B(e){return e===` `||e===` `||e===`
5
- `||e===`\r`}function me(e,t){let n=t-1;for(;n>=0&&B(e[n]);)n--;for(;n>=0&&!B(e[n]);)n--;return n+1}function he(e,t){let n=t;for(;n<e.length&&B(e[n]);)n++;for(;n<e.length&&!B(e[n]);)n++;return n}function ge(e){return e.filter(e=>!(e.role===`system`&&e.content.startsWith(`TOOL_START:`)))}const _e=e=>{let t=[],n={userMessage:null,toolMessages:[],assistantMessages:[],systemMessages:[]};for(let r of e)r.role===`user`?((n.userMessage||n.toolMessages.length>0||n.assistantMessages.length>0||n.systemMessages.length>0)&&t.push(n),n={userMessage:r,toolMessages:[],assistantMessages:[],systemMessages:[]}):r.role===`system`&&r.content.startsWith(`TOOL:`)?n.toolMessages.push(r):r.role===`assistant`?n.assistantMessages.push(r):n.systemMessages.push(r);return(n.userMessage||n.toolMessages.length>0||n.assistantMessages.length>0||n.systemMessages.length>0)&&t.push(n),t},ve=e=>{let t=e.split(`|||`);return{name:t[0].replace(`TOOL:`,``),inputSummary:t.length>=3&&t[1]||``,output:t.length>=3?t.slice(2).join(`|||`):t[1]||``}},ye=({title:e,mode:t,connector:n,action:r,onSubmit:i,onExit:a,onStop:o,messages:s,currentToolCalls:c=[],isThinking:l=!1,isComplete:f=!1,error:m,isInterrupted:h=!1,commandHistory:g=[],streamingText:_=``,usage:v,detailViewData:y=null,onCloseDetailView:b,onResumeConversation:x,onToggleTrust:S,onRewindTo:C,spawnedSubagentActive:w=!1,spawnedSubagentName:T=`Subagent`,spawnedSubagentComplete:E=!1,queuedMessages:ee=[],isProcessingQueue:D=!1,initInfo:O,pendingDeleteConfirmation:k=null,onConfirmDelete:A,slashCommands:M=[],welcomeContext:N,buildPhases:P,currentBuildPhase:te})=>{let{exit:ne}=(0,u.useApp)(),[ie,ae]=(0,d.useState)(null),[I,L]=(0,d.useState)(``),[,R]=(0,d.useState)(0),z=(0,d.useRef)(0),[se,ce]=(0,d.useState)(!0),B=(0,d.useRef)(s),[ye,V]=(0,d.useState)(-1),be=(0,d.useRef)(g),H=(0,d.useRef)(``),[U,xe]=(0,d.useState)([]),[W,G]=(0,d.useState)(0),[K,q]=(0,d.useState)(0),[Se,Ce]=(0,d.useState)(!1),[we,Te]=(0,d.useState)(!1),[Ee,De]=(0,d.useState)(!1),[Oe,ke]=(0,d.useState)(!1),Ae=(0,d.useRef)(``),[J,Y]=(0,d.useState)(1),[je,Me]=(0,d.useState)(null),[X,Ne]=(0,d.useState)(1),Pe=(0,d.useMemo)(()=>M.map(e=>`/${e.name}`),[M]);(0,d.useEffect)(()=>{B.current=s},[s]),(0,d.useEffect)(()=>{be.current=g},[g]),(0,d.useEffect)(()=>{I.startsWith(`/`)?(xe(Pe.filter(e=>e.startsWith(I.toLowerCase()))),G(0)):(xe([]),G(0))},[I]),(0,d.useEffect)(()=>{if(y?.items){let e=Math.max(0,y.items.length-1);q(t=>Math.min(t,e))}},[y?.items?.length]),(0,u.useInput)((0,d.useCallback)((e,t)=>{let n=H.current,r=ye;if(t.escape&&(l||_||c.length>0)&&!y){o?.(),L(``),H.current=``,z.current=0,R(0),V(-1);return}if(t.escape&&w&&we&&!y){Te(!1);return}if(t.escape&&Ee&&!w&&!y){De(!1);return}if(k&&A){if(t.escape||e.toLowerCase()===`n`){Y(1),A(!1);return}if(e.toLowerCase()===`y`){Y(0),A(!0);return}if(t.upArrow||t.downArrow){Y(e=>e===0?1:0);return}if(t.return){A(J===0);return}return}if(y){if(je){if(t.escape||t.ctrl&&e===`c`){Me(null);return}if(t.leftArrow||t.rightArrow){Ne(e=>e===0?1:0);return}if(e.toLowerCase()===`y`){S&&S(je.path),Me(null);return}if(e.toLowerCase()===`n`){Me(null);return}if(t.return){X===0&&S&&S(je.path),Me(null);return}return}if(t.escape||t.ctrl&&e===`c`)if(Se){Ce(!1);return}else{b?.(),q(0);return}if(t.upArrow&&!Se){q(e=>e>0?e-1:y.items.length-1);return}if(t.downArrow&&!Se){q(e=>e<y.items.length-1?e+1:0);return}if(t.ctrl&&e===`o`&&y.type===`trust`&&!je&&!Se){let e=y.items[K];e?.path&&(Me({path:e.path,name:e.name}),Ne(1));return}if(t.return){if(Se)return;if(y.type===`resume`){let e=y.items[K];e.messages&&x&&(x(e.messages),b?.(),q(0));return}if(y.type===`rewind`){let e=y.items[K];e.index!==void 0&&C&&(C(e.index),b?.(),q(0));return}Ce(!0);return}return}if(t.ctrl&&e===`o`){w?Te(e=>!e):De(e=>!e);return}if(t.ctrl&&e===`u`){L(``),H.current=``,z.current=0,R(0),V(-1);return}if(t.ctrl&&e===`y`){let e=[...s].reverse().find(e=>e.role===`assistant`);e&&pe(e.content)&&(ke(!0),setTimeout(()=>ke(!1),2e3));return}if(t.ctrl&&e===`c`||e===``)if(n.trim()){L(``),H.current=``,z.current=0,R(0),V(-1);return}else{a(),ne();return}if(t.shift&&t.return){let e=z.current,t=H.current,n=t.slice(0,e)+`
6
- `+t.slice(e);H.current=n,L(n);let r=e+1;z.current=r,R(r);return}if(t.ctrl&&e===`a`){z.current=0,R(0);return}if(t.ctrl&&e===`e`){z.current=n.length,R(n.length);return}let u=e===`\x1Bb`||e===`b`&&t.meta||e===`\x1B\x1B[D`||e===`\x1B[1;3D`||e===`\x1B[1;9D`||t.meta&&t.leftArrow&&!t.ctrl&&!t.shift,d=e===`\x1Bf`||e===`f`&&t.meta||e===`\x1B\x1B[C`||e===`\x1B[1;3C`||e===`\x1B[1;9C`||t.meta&&t.rightArrow&&!t.ctrl&&!t.shift;if(u){let e=me(n,z.current);z.current=e,R(e);return}if(d){let e=he(n,z.current);z.current=e,R(e);return}if(t.home||e===`\x1B[H`||e===`\x1BOH`){z.current=0,R(0);return}if(t.end||e===`\x1B[F`||e===`\x1BOF`){z.current=n.length,R(n.length);return}if(process.platform===`darwin`&&t.meta&&t.leftArrow){z.current=0,R(0);return}if(process.platform===`darwin`&&t.meta&&t.rightArrow){z.current=n.length,R(n.length);return}if(process.platform===`darwin`&&t.meta&&t.upArrow){z.current=0,R(0);return}if(process.platform===`darwin`&&t.meta&&t.downArrow){z.current=n.length,R(n.length);return}if(t.ctrl&&t.leftArrow&&process.platform!==`darwin`){let e=me(n,z.current);z.current=e,R(e);return}if(t.ctrl&&t.rightArrow&&process.platform!==`darwin`){let e=he(n,z.current);z.current=e,R(e);return}let f=()=>{let e=process.stdout?.columns||80,t=Math.max(20,e-6),r=[],i=0;n.split(`
7
- `).forEach((e,n)=>{let a=i,o=n===0?t-2:t;if(e.length===0)r.push({start:a,end:a});else{let n=0;for(;n<e.length;){let i=n===0?o:t;r.push({start:a+n,end:a+Math.min(n+i,e.length)}),n+=i}}i=a+e.length+1});let a=z.current,o=r.findIndex(e=>a>=e.start&&a<e.end);return o===-1&&r.length>0&&(o=r.findIndex(e=>a===e.end)),{rows:r,currentRow:Math.max(0,o)}};if(t.upArrow){if(U.length>0){G(e=>e>0?e-1:U.length-1);return}let e=be.current;if(r>=0&&e.length>0){V(t=>{let n=Math.max(0,t-1),r=e[n]||``;return L(r),H.current=r,z.current=r.length,R(r.length),n});return}let{rows:t,currentRow:n}=f();if(n>0){let e=z.current-t[n].start,r=t[n-1],i=r.start+Math.min(e,r.end-r.start);z.current=i,R(i);return}if(e.length>0){V(t=>{let n=t<0?e.length-1:Math.max(0,t-1),r=e[n]||``;return L(r),H.current=r,z.current=r.length,R(r.length),n});return}return}if(t.downArrow){if(U.length>0){G(e=>e<U.length-1?e+1:0);return}let e=be.current;if(r>=0&&e.length>0){V(t=>{let n=t>=e.length-1?-1:t+1,r=n<0?``:e[n]||``;return L(r),H.current=r,z.current=r.length,R(r.length),n});return}let{rows:t,currentRow:n}=f();if(n<t.length-1){let e=z.current-t[n].start,r=t[n+1],i=r.start+Math.min(e,r.end-r.start);z.current=i,R(i);return}return}if(t.return){if(U.length>0){let e=U[W];xe([]),G(0),L(``),H.current=``,z.current=0,R(0),Ae.current=e,i(e);return}if(n.trim()){let e=n.trim();Ae.current=e,i(e),L(``),H.current=``,z.current=0,R(0),V(-1)}return}if((t.backspace||t.delete)&&z.current>0){let e=z.current,t=H.current,n=t.slice(0,e-1)+t.slice(e);H.current=n,L(n);let r=Math.max(0,e-1);z.current=r,R(r),V(-1);return}if(t.leftArrow&&!t.meta&&!t.ctrl){let e=Math.max(0,z.current-1);z.current=e,R(e);return}if(t.rightArrow&&!t.meta&&!t.ctrl){let e=Math.min(n.length,z.current+1);z.current=e,R(e);return}if(t.tab&&n.startsWith(`/`)){let e=Pe.filter(e=>e.startsWith(n.toLowerCase()));if(e.length===1){let t=e[0].length;L(e[0]),H.current=e[0],z.current=t,R(t)}return}if(e){if(t.meta||t.ctrl||!e.split(``).every(e=>{let t=e.charCodeAt(0);return t>=32&&t!==127||t===10||t===9}))return;let n=z.current,r=H.current,i=r.slice(0,n)+e+r.slice(n);H.current=i,L(i);let a=n+e.length;z.current=a,R(a),V(-1)}},[i,a,ne,ye,Pe,U,W,y,Se,b,w,we,x,K,l,_,c,o,C,k,A,J,Ee,s])),(0,d.useEffect)(()=>{f&&ce(!1)},[f]);let Fe=l||_!==``||c.length>0;(0,d.useEffect)(()=>{Fe&&!ie?ae(new Date):!Fe&&ie&&ae(null)},[Fe,ie]);let Ie=`\x1B[2m`,Le=`\x1B[0m`,Z=[`\x1B[38;2;0;140;82m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;140;82m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;140;82m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;140;82m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;140;82m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;140;82m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;140;82m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;140;82m\x1B[48;2;14;147;94m▀\x1B[0m\x1B[38;2;8;125;77m\x1B[48;2;29;115;84m▀\x1B[0m\x1B[38;2;16;108;72m\x1B[48;2;23;128;88m▀\x1B[0m\x1B[38;2;14;112;73m\x1B[48;2;17;140;91m▀\x1B[0m\x1B[38;2;9;122;76m\x1B[48;2;11;152;95m▀\x1B[0m\x1B[38;2;4;132;79m\x1B[48;2;5;165;99m▀\x1B[0m\x1B[38;2;0;55;33m\x1B[48;2;0;69;41m▀\x1B[0m ▄▖▗ ▌ ▄▖`,`\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;2;170;100m\x1B[48;2;11;153;95m▀\x1B[0m\x1B[38;2;34;106;81m\x1B[48;2;35;103;80m▀\x1B[0m\x1B[38;2;29;115;84m\x1B[48;2;29;115;84m▀\x1B[0m\x1B[38;2;23;127;88m\x1B[48;2;23;127;88m▀\x1B[0m\x1B[38;2;17;140;92m\x1B[48;2;17;140;92m▀\x1B[0m\x1B[38;2;11;152;95m\x1B[48;2;11;152;95m▀\x1B[0m\x1B[38;2;5;165;99m\x1B[48;2;5;165;99m▀\x1B[0m\x1B[38;2;0;69;41m\x1B[48;2;0;69;41m▀\x1B[0m ▚ ▜▘▀▌▛▘▙▘▌▌▛▌█▌`,`\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;1;125;74m\x1B[48;2;0;123;71m▀\x1B[0m \x1B[38;2;0;128;75m\x1B[48;2;0;123;71m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m ▄▌▐▖█▌▙▖▛▖▙▌▌▌▙▖`,`\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;123;71m\x1B[48;2;0;128;75m▀\x1B[0m \x1B[38;2;0;123;71m\x1B[48;2;1;125;74m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m\x1B[38;2;0;175;102m\x1B[48;2;0;175;102m▀\x1B[0m`,` \x1b[38;2;0;69;41m\x1b[48;2;0;69;41m▀\x1b[0m\x1b[38;2;5;165;99m\x1b[48;2;5;165;99m▀\x1b[0m\x1b[38;2;11;152;95m\x1b[48;2;11;152;95m▀\x1b[0m\x1b[38;2;17;140;91m\x1b[48;2;17;140;91m▀\x1b[0m\x1b[38;2;23;127;88m\x1b[48;2;23;127;88m▀\x1b[0m\x1b[38;2;29;115;84m\x1b[48;2;29;115;84m▀\x1b[0m\x1b[38;2;35;102;80m\x1b[48;2;34;105;81m▀\x1b[0m\x1b[38;2;11;152;95m\x1b[48;2;3;169;100m▀\x1b[0m\x1b[38;2;0;175;102m\x1b[48;2;0;175;102m▀\x1b[0m\x1b[38;2;0;175;102m\x1b[48;2;0;175;102m▀\x1b[0m\x1b[38;2;0;175;102m\x1b[48;2;0;175;102m▀\x1b[0m\x1b[38;2;0;175;102m\x1b[48;2;0;175;102m▀\x1b[0m\x1b[38;2;0;175;102m\x1b[48;2;0;175;102m▀\x1b[0m\x1b[38;2;0;175;102m\x1b[48;2;0;175;102m▀\x1b[0m ${Ie}sessions monitored${Le}`,` \x1b[38;2;0;69;40m\x1b[48;2;0;62;37m▀\x1b[0m\x1b[38;2;5;165;99m\x1b[48;2;5;148;89m▀\x1b[0m\x1b[38;2;11;152;95m\x1b[48;2;10;137;86m▀\x1b[0m\x1b[38;2;17;140;91m\x1b[48;2;15;126;82m▀\x1b[0m\x1b[38;2;23;127;88m\x1b[48;2;17;122;81m▀\x1b[0m\x1b[38;2;29;115;84m\x1b[48;2;9;139;86m▀\x1b[0m\x1b[38;2;16;143;92m\x1b[48;2;0;158;92m▀\x1b[0m\x1b[38;2;0;175;102m\x1b[48;2;0;158;92m▀\x1b[0m\x1b[38;2;0;175;102m\x1b[48;2;0;158;92m▀\x1b[0m\x1b[38;2;0;175;102m\x1b[48;2;0;158;92m▀\x1b[0m\x1b[38;2;0;175;102m\x1b[48;2;0;158;92m▀\x1b[0m\x1b[38;2;0;175;102m\x1b[48;2;0;158;92m▀\x1b[0m\x1b[38;2;0;175;102m\x1b[48;2;0;158;92m▀\x1b[0m\x1b[38;2;0;175;102m\x1b[48;2;0;158;92m▀\x1b[0m ${Ie}preview${ue?` v${ue}`:``}${Le}`].join(`
8
- `),Re=ge(s),ze=(0,d.useMemo)(()=>_e(Re),[Re]),Be=!!O,Ve=(0,d.useMemo)(()=>{let e=[`${t.charAt(0).toUpperCase()+t.slice(1)} mode`];if(N?.credentialEmail){let t=N.credentialTimeRemaining?` (${N.credentialTimeRemaining.days}d ${N.credentialTimeRemaining.hours}h)`:``;e.push(`${N.credentialEmail}${t}`)}O&&O.mcpServers.length>0&&e.push(`${O.mcpServers.reduce((e,t)=>e+t.count,0)} tools`),O&&O.claudeSkills.count>0&&e.push(`${O.claudeSkills.count} skills`);let r=[{text:`✓ ${e.join(` · `)}`,color:j.primary}],i=n||N?.detectedConnector;if(i&&r.push({text:`📂 Detected connector: ${i}`}),O)for(let e of O.errors)r.push({text:`⚠ ${e}`,color:`yellow`});return r},[O,N,t,n]),He=(0,d.useMemo)(()=>{let e=[],t=N?.recentConversations;if(t&&t.length>0){e.push({text:`Recent sessions:`});for(let n of t){let t=n.trim(),r=t.length>36?`${t.slice(0,35)}…`:t;e.push({text:` "${r}"`})}e.push({text:``}),e.push({text:`/resume to continue`})}return e},[n,N]),Ue=(0,d.useMemo)(()=>{let e=n||N?.detectedConnector,r={build:[e?`"Add a new action to ${e}"`:`"Add a new action to Slack"`,e?`"Show current actions for ${e}"`:`"Show actions for Datadog"`,`"Create a connector for a new provider"`,`"Validate and fix connector issues"`,`"Add OAuth authentication support"`,`"Map response fields to StackOne schema"`,`"Add pagination to the list endpoint"`,`"Generate test credentials for sandbox"`,`"Add rate limiting configuration"`,`"Improve descriptions for all actions"`],test:[e?`"Test all actions for ${e}"`:`"Test all actions for Slack"`,`"Run a specific action and show response"`,`"Debug why list_users is returning errors"`,`"Test with a different account"`,`"Compare response against StackOne schema"`,`"Test pagination across all list actions"`,`"Validate error handling for 401 responses"`,`"Run actions with verbose output"`,`"Test the OAuth flow end to end"`,`"Check rate limiting behavior"`],research:[e?`"${e} API endpoints?"`:`"Workday API endpoints?"`,`"Compare pagination for Greenhouse vs Lever"`,`"Auth methods for this provider?"`,`"What versioning strategy does the API use?"`,`"Find the rate limits documentation"`,`"What webhook events are available?"`,`"How does the provider handle deleted records?"`,`"What scopes are needed for user data?"`,`"Does the API support filtering or search?"`,`"What date format does the API use?"`]},i=[...r[t]||r.build];for(let e=i.length-1;e>0;e--){let t=Math.floor(Math.random()*(e+1));[i[e],i[t]]=[i[t],i[e]]}let a=i.slice(0,3),o=[{text:`Try:`}];for(let e of a){let t=e.length>38?`${e.slice(0,36)}…"`:e;o.push({text:` ${t}`})}return o},[t,n]),[We,Ge]=(0,d.useState)(!1),Ke=(0,d.useCallback)(()=>Ge(!0),[]),qe=Be&&We,Je=(0,d.useCallback)((e,t)=>{if(!e||t>=1)return e;let n=e.match(/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i);if(!n)return e;let r=Math.round(Number.parseInt(n[1],16)*t),i=Math.round(Number.parseInt(n[2],16)*t),a=Math.round(Number.parseInt(n[3],16)*t);return`#${r.toString(16).padStart(2,`0`)}${i.toString(16).padStart(2,`0`)}${a.toString(16).padStart(2,`0`)}`},[]);return d.default.createElement(u.Box,{flexDirection:`column`,padding:1},!qe&&d.default.createElement(oe,{ready:!!Be,onComplete:Ke}),qe&&d.default.createElement(u.Box,{flexDirection:`row`,marginBottom:1},d.default.createElement(u.Box,{flexDirection:`column`,flexShrink:0},d.default.createElement(u.Text,null,Z)),d.default.createElement(u.Box,{flexDirection:`column`,marginLeft:3,marginTop:1},d.default.createElement(fe,null,e=>d.default.createElement(d.default.Fragment,null,Ve.map((t,n)=>d.default.createElement(u.Text,{key:`hero-${n}`,color:Je(t.color,e),dimColor:!t.color},t.text)),d.default.createElement(u.Box,{flexDirection:`row`,marginTop:1},He.length>0&&d.default.createElement(u.Box,{flexDirection:`column`,marginRight:2,borderStyle:`round`,borderColor:j.primary,borderDimColor:!0,paddingX:1,width:44},He.map((e,t)=>d.default.createElement(u.Text,{key:`ctx-${t}`,dimColor:!0},e.text))),d.default.createElement(u.Box,{flexDirection:`column`,borderStyle:`round`,borderColor:j.primary,borderDimColor:!0,paddingX:1,width:44},Ue.map((e,t)=>d.default.createElement(u.Text,{key:`ex-${t}`,dimColor:!0},e.text)))))))),d.default.createElement(u.Box,{flexDirection:`column`,marginBottom:1},ze.map((e,t)=>{let n=process.stdout?.columns||80,r=Math.max(0,Math.min(n-4,60)),i=[...e.assistantMessages,...e.toolMessages,...e.systemMessages],a=i.length>0?i.reduce((e,t)=>t.timestamp>e.timestamp?t:e):null,o=e.userMessage&&a?a.timestamp.getTime()-e.userMessage.timestamp.getTime():0,s=o>0?o>=6e4?`${Math.floor(o/6e4)}m${Math.round(o%6e4/1e3)}s`:`${Math.round(o/1e3)}s`:``,c=e.toolMessages.map(e=>{let t=ve(e.content);return{name:t.name,inputSummary:t.inputSummary,output:t.output,status:`completed`}});return d.default.createElement(u.Box,{key:`turn-${t}`,flexDirection:`column`},t>0&&d.default.createElement(u.Box,{marginBottom:1},d.default.createElement(u.Text,{dimColor:!0},`─`.repeat(r))),e.userMessage&&d.default.createElement(u.Box,{marginBottom:1,flexDirection:`column`},d.default.createElement(u.Text,{bold:!0,color:`white`},`❯ You`,d.default.createElement(u.Text,{color:`gray`},` `,`• `,e.userMessage.timestamp.toLocaleTimeString())),d.default.createElement(u.Box,{paddingLeft:2},d.default.createElement(u.Text,{color:`white`,wrap:`wrap`},e.userMessage.content))),(c.length>0||e.assistantMessages.length>0)&&d.default.createElement(u.Box,{flexDirection:`column`,marginBottom:1},d.default.createElement(u.Text,{bold:!0,color:j.primary},`◆ StackOne Agent`),c.length>0&&d.default.createElement(u.Box,{paddingLeft:2,marginTop:0,marginBottom:1},d.default.createElement(le,{tools:c,expanded:Ee})),e.assistantMessages.map((n,r)=>{let i=r===e.assistantMessages.length-1;return d.default.createElement(u.Box,{key:`asst-${t}-${r}`,paddingLeft:2,flexDirection:`column`,marginBottom:i?0:1},n.isSubagent&&d.default.createElement(u.Text,{color:j.primary,dimColor:!0},`⚡ Subagent`),d.default.createElement(u.Text,{wrap:`wrap`,dimColor:!i},F(n.content)))}),s&&d.default.createElement(u.Box,{paddingLeft:2,marginTop:1},d.default.createElement(u.Text,{dimColor:!0},`✓ `,s))),e.systemMessages.map((e,n)=>d.default.createElement(u.Box,{key:`sys-${t}-${n}`,marginBottom:1},d.default.createElement(u.Text,{color:`gray`},`ℹ System • `,e.timestamp.toLocaleTimeString()),d.default.createElement(u.Box,{paddingLeft:2},d.default.createElement(u.Text,{dimColor:!0,wrap:`wrap`},e.content)))))})),d.default.createElement(u.Box,{flexDirection:`column`,marginBottom:1},d.default.createElement(d.default.Fragment,null,(w||E)&&d.default.createElement(u.Box,{marginBottom:0,marginTop:0,borderStyle:`single`,borderColor:j.primary,paddingX:2,paddingY:1,flexDirection:`column`,height:we?`100%`:void 0},d.default.createElement(u.Text,{bold:!0,color:j.primary},E?`✓`:`⚡`,` Subprocess:`,` `,T,` `,E?`(Complete)`:``,` `,we?`(Expanded)`:``),d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{dimColor:!0},E?we?`Press Ctrl+O or ESC to collapse`:`Press Ctrl+O to expand`:we?`Running... Press Ctrl+O or ESC to collapse`:`Running... Press Ctrl+O to expand`)),we?d.default.createElement(d.default.Fragment,null,s.filter(e=>e.isSubagent&&!e.content.startsWith(`TOOL_START:`)).map((e,t)=>{let n=e.role===`system`&&e.content.startsWith(`TOOL:`),r=e.role===`assistant`?`⚡ Subagent`:`ℹ System`,i=e.content;if(n){let t=ve(e.content);r=`🔧 Tool • ${t.name}`,i=t.output.slice(0,500),t.output.length>500&&(i+=`
9
- ... (truncated)`)}return d.default.createElement(u.Box,{key:`${e.timestamp.getTime()}-${t}-${e.role}-subagent`,marginTop:1,flexDirection:`column`},d.default.createElement(u.Text,{bold:!0,color:j.primary},r,d.default.createElement(u.Text,{color:`gray`},` `,`•`,` `,e.timestamp.toLocaleTimeString())),d.default.createElement(u.Box,{paddingLeft:2},d.default.createElement(u.Text,{color:n?`gray`:j.primary,dimColor:n,wrap:`wrap`},F(i))))}),!E&&!h&&l&&c.length===0&&d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{color:j.primary},d.default.createElement(p.default,{type:`dots`})),d.default.createElement(u.Text,{dimColor:!0},` Thinking...`)),!E&&!h&&c.length>0&&d.default.createElement(u.Box,{flexDirection:`column`,marginTop:1},c.map((e,t)=>d.default.createElement(u.Box,{key:t,marginBottom:1},e.status===`running`&&d.default.createElement(u.Text,{color:j.primary},d.default.createElement(p.default,{type:`dots`})),d.default.createElement(u.Text,{color:j.primary},` `,e.skillName?d.default.createElement(d.default.Fragment,null,`✨ Skill •`,` `,e.skillName):d.default.createElement(d.default.Fragment,null,`🔧 `,e.name),e.status===`running`&&`...`,e.status===`completed`&&` ✓`)))),!E&&_&&!h&&d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{color:j.primary},F(_)))):d.default.createElement(d.default.Fragment,null,s.filter(e=>e.isSubagent&&!e.content.startsWith(`TOOL_START:`)&&e.role!==`system`||e.content.startsWith(`TOOL:`)).slice(-2).map((e,t)=>{let n=e.role===`system`&&e.content.startsWith(`TOOL:`),r=e.content;if(n){let t=ve(e.content);r=`🔧 ${t.name}: ${t.output.slice(0,100)}${t.output.length>100?`...`:``}`}let i=r.split(`
5
+ `),truncated:!0}},fe=({tools:e,expanded:t=!1,maxCollapsed:n=M.maxCollapsedTools,title:r})=>{if(e.length===0)return null;let i=e.some(e=>e.status===`running`),a=r||(i?`Working...`:`Tools (${e.length})`),o=t?e:e.slice(0,n),s=e.length-o.length;return d.default.createElement(u.Box,{flexDirection:`column`,borderStyle:`round`,borderColor:j.primary,borderDimColor:!0,paddingX:1},d.default.createElement(u.Text,{dimColor:!0,bold:!0},a),o.map((e,n)=>d.default.createElement(u.Box,{key:`tool-${n}`,flexDirection:`column`},d.default.createElement(u.Box,null,e.status===`running`?d.default.createElement(u.Text,{color:j.primary},d.default.createElement(p.default,{type:`dots`})):e.status===`failed`?d.default.createElement(u.Text,{color:j.error},`✗`):d.default.createElement(u.Text,{color:j.primary},`✓`),d.default.createElement(u.Text,{bold:!0},` `,ue(e.name,e.skillName)),e.inputSummary&&d.default.createElement(u.Text,{dimColor:!0,italic:!0},` `,e.inputSummary.length>M.maxInputSummaryWidth?`${e.inputSummary.slice(0,M.maxInputSummaryWidth-1)}…`:e.inputSummary)),t&&e.output&&d.default.createElement(u.Box,{paddingLeft:2,flexDirection:`column`},(()=>{let{text:t,truncated:n}=de(e.output,M.maxToolOutputLines);return d.default.createElement(d.default.Fragment,null,d.default.createElement(u.Text,{dimColor:!0,italic:!0,wrap:`wrap`},t),n&&d.default.createElement(u.Text,{dimColor:!0,italic:!0},`... (truncated)`))})()))),s>0&&d.default.createElement(u.Text,{dimColor:!0},`... and `,s,` more (Ctrl+O to show all)`))};let pe=``;try{let e=require.resolve(`@stackone/agent-harness`),t=l.dirname(e);for(;t!==l.dirname(t);){let e=l.join(t,`package.json`);if(s.existsSync(e)){let t=JSON.parse(s.readFileSync(e,`utf-8`));if(t.name===`@stackone/agent-harness`){pe=t.version||``;break}}t=l.dirname(t)}}catch{}const B=({startTime:e})=>{let[,t]=(0,d.useState)(0);(0,d.useEffect)(()=>{let e=setInterval(()=>t(e=>e+1),1e3);return()=>clearInterval(e)},[]);let n=Date.now()-e.getTime(),r=Math.floor(n/1e3),i=r>=60?`${Math.floor(r/60)}m${r%60}s`:`${r}s`;return d.default.createElement(u.Text,{dimColor:!0},i)},me=({children:e})=>{let[t,n]=(0,d.useState)(0);return(0,d.useEffect)(()=>{if(t>=P.fadeSteps)return;let e=setTimeout(()=>n(e=>e+1),P.fadeStepMs);return()=>clearTimeout(e)},[t]),d.default.createElement(d.default.Fragment,null,e(Math.min(t/P.fadeSteps,1)))},he=e=>{try{return(0,f.execSync)(process.platform===`darwin`?`pbcopy`:process.platform===`win32`?`clip`:`xclip -selection clipboard`,{input:e,stdio:[`pipe`,`ignore`,`ignore`]}),!0}catch{return!1}};function V(e){return e===` `||e===` `||e===`
6
+ `||e===`\r`}function ge(e,t){let n=t-1;for(;n>=0&&V(e[n]);)n--;for(;n>=0&&!V(e[n]);)n--;return n+1}function _e(e,t){let n=t;for(;n<e.length&&V(e[n]);)n++;for(;n<e.length&&!V(e[n]);)n++;return n}function ve(e){return e.filter(e=>!(e.role===`system`&&e.content.startsWith(`TOOL_START:`)))}const ye=e=>{let t=[],n={userMessage:null,toolMessages:[],assistantMessages:[],systemMessages:[]};for(let r of e)r.role===`user`?((n.userMessage||n.toolMessages.length>0||n.assistantMessages.length>0||n.systemMessages.length>0)&&t.push(n),n={userMessage:r,toolMessages:[],assistantMessages:[],systemMessages:[]}):r.role===`system`&&r.content.startsWith(`TOOL:`)?n.toolMessages.push(r):r.role===`assistant`?n.assistantMessages.push(r):n.systemMessages.push(r);return(n.userMessage||n.toolMessages.length>0||n.assistantMessages.length>0||n.systemMessages.length>0)&&t.push(n),t},be=e=>{let t=e.split(`|||`);return{name:t[0].replace(`TOOL:`,``),inputSummary:t.length>=3&&t[1]||``,output:t.length>=3?t.slice(2).join(`|||`):t[1]||``}},H=({title:e,mode:t,connector:n,action:r,onSubmit:i,onExit:a,onStop:o,messages:s,currentToolCalls:c=[],isThinking:l=!1,isComplete:f=!1,error:m,isInterrupted:h=!1,commandHistory:g=[],streamingText:_=``,usage:v,detailViewData:y=null,onCloseDetailView:b,onResumeConversation:x,onToggleTrust:S,onRewindTo:C,spawnedSubagentActive:w=!1,spawnedSubagentName:T=`Subagent`,spawnedSubagentComplete:E=!1,queuedMessages:ee=[],isProcessingQueue:D=!1,initInfo:O,pendingDeleteConfirmation:k=null,onConfirmDelete:A,slashCommands:M=[],welcomeContext:N,buildPhases:P,currentBuildPhase:te})=>{let{exit:ne}=(0,u.useApp)(),[ae,se]=(0,d.useState)(null),[I,L]=(0,d.useState)(``),[,R]=(0,d.useState)(0),z=(0,d.useRef)(0),[ce,ue]=(0,d.useState)(!0),de=(0,d.useRef)(s),[V,H]=(0,d.useState)(-1),U=(0,d.useRef)(g),W=(0,d.useRef)(``),[G,xe]=(0,d.useState)([]),[Se,K]=(0,d.useState)(0),[q,Ce]=(0,d.useState)(0),[J,we]=(0,d.useState)(!1),[Te,Ee]=(0,d.useState)(!1),[De,Oe]=(0,d.useState)(!1),[ke,Ae]=(0,d.useState)(!1),Y=(0,d.useRef)(``),[je,Me]=(0,d.useState)(1),[Ne,X]=(0,d.useState)(null),[Pe,Fe]=(0,d.useState)(1),Ie=(0,d.useMemo)(()=>M.map(e=>`/${e.name}`),[M]);(0,d.useEffect)(()=>{de.current=s},[s]),(0,d.useEffect)(()=>{U.current=g},[g]),(0,d.useEffect)(()=>{I.startsWith(`/`)?(xe(Ie.filter(e=>e.startsWith(I.toLowerCase()))),K(0)):(xe([]),K(0))},[I]),(0,d.useEffect)(()=>{if(y?.items){let e=Math.max(0,y.items.length-1);Ce(t=>Math.min(t,e))}},[y?.items?.length]),(0,u.useInput)((0,d.useCallback)((e,t)=>{let n=W.current,r=V;if(t.escape&&(l||_||c.length>0)&&!y){o?.(),L(``),W.current=``,z.current=0,R(0),H(-1);return}if(t.escape&&w&&Te&&!y){Ee(!1);return}if(t.escape&&De&&!w&&!y){Oe(!1);return}if(k&&A){if(t.escape||e.toLowerCase()===`n`){Me(1),A(!1);return}if(e.toLowerCase()===`y`){Me(0),A(!0);return}if(t.upArrow||t.downArrow){Me(e=>e===0?1:0);return}if(t.return){A(je===0);return}return}if(y){if(Ne){if(t.escape||t.ctrl&&e===`c`){X(null);return}if(t.leftArrow||t.rightArrow){Fe(e=>e===0?1:0);return}if(e.toLowerCase()===`y`){S&&S(Ne.path),X(null);return}if(e.toLowerCase()===`n`){X(null);return}if(t.return){Pe===0&&S&&S(Ne.path),X(null);return}return}if(t.escape||t.ctrl&&e===`c`)if(J){we(!1);return}else{b?.(),Ce(0);return}if(t.upArrow&&!J){Ce(e=>e>0?e-1:y.items.length-1);return}if(t.downArrow&&!J){Ce(e=>e<y.items.length-1?e+1:0);return}if(t.ctrl&&e===`o`&&y.type===`trust`&&!Ne&&!J){let e=y.items[q];e?.path&&(X({path:e.path,name:e.name}),Fe(1));return}if(t.return){if(J)return;if(y.type===`resume`){let e=y.items[q];e.messages&&x&&(x(e.messages),b?.(),Ce(0));return}if(y.type===`rewind`){let e=y.items[q];e.index!==void 0&&C&&(C(e.index),b?.(),Ce(0));return}we(!0);return}return}if(t.ctrl&&e===`o`){w?Ee(e=>!e):Oe(e=>!e);return}if(t.ctrl&&e===`u`){L(``),W.current=``,z.current=0,R(0),H(-1);return}if(t.ctrl&&e===`y`){let e=[...s].reverse().find(e=>e.role===`assistant`);e&&he(e.content)&&(Ae(!0),setTimeout(()=>Ae(!1),2e3));return}if(t.ctrl&&e===`c`||e===``)if(n.trim()){L(``),W.current=``,z.current=0,R(0),H(-1);return}else{a(),ne();return}if(t.shift&&t.return){let e=z.current,t=W.current,n=t.slice(0,e)+`
7
+ `+t.slice(e);W.current=n,L(n);let r=e+1;z.current=r,R(r);return}if(t.ctrl&&e===`a`){z.current=0,R(0);return}if(t.ctrl&&e===`e`){z.current=n.length,R(n.length);return}let u=e===`\x1Bb`||e===`b`&&t.meta||e===`\x1B\x1B[D`||e===`\x1B[1;3D`||e===`\x1B[1;9D`||t.meta&&t.leftArrow&&!t.ctrl&&!t.shift,d=e===`\x1Bf`||e===`f`&&t.meta||e===`\x1B\x1B[C`||e===`\x1B[1;3C`||e===`\x1B[1;9C`||t.meta&&t.rightArrow&&!t.ctrl&&!t.shift;if(u){let e=ge(n,z.current);z.current=e,R(e);return}if(d){let e=_e(n,z.current);z.current=e,R(e);return}if(t.home||e===`\x1B[H`||e===`\x1BOH`){z.current=0,R(0);return}if(t.end||e===`\x1B[F`||e===`\x1BOF`){z.current=n.length,R(n.length);return}if(process.platform===`darwin`&&t.meta&&t.leftArrow){z.current=0,R(0);return}if(process.platform===`darwin`&&t.meta&&t.rightArrow){z.current=n.length,R(n.length);return}if(process.platform===`darwin`&&t.meta&&t.upArrow){z.current=0,R(0);return}if(process.platform===`darwin`&&t.meta&&t.downArrow){z.current=n.length,R(n.length);return}if(t.ctrl&&t.leftArrow&&process.platform!==`darwin`){let e=ge(n,z.current);z.current=e,R(e);return}if(t.ctrl&&t.rightArrow&&process.platform!==`darwin`){let e=_e(n,z.current);z.current=e,R(e);return}let f=()=>{let e=process.stdout?.columns||80,t=Math.max(20,e-6),r=[],i=0;n.split(`
8
+ `).forEach((e,n)=>{let a=i,o=n===0?t-2:t;if(e.length===0)r.push({start:a,end:a});else{let n=0;for(;n<e.length;){let i=n===0?o:t;r.push({start:a+n,end:a+Math.min(n+i,e.length)}),n+=i}}i=a+e.length+1});let a=z.current,o=r.findIndex(e=>a>=e.start&&a<e.end);return o===-1&&r.length>0&&(o=r.findIndex(e=>a===e.end)),{rows:r,currentRow:Math.max(0,o)}};if(t.upArrow){if(G.length>0){K(e=>e>0?e-1:G.length-1);return}let e=U.current;if(r>=0&&e.length>0){H(t=>{let n=Math.max(0,t-1),r=e[n]||``;return L(r),W.current=r,z.current=r.length,R(r.length),n});return}let{rows:t,currentRow:n}=f();if(n>0){let e=z.current-t[n].start,r=t[n-1],i=r.start+Math.min(e,r.end-r.start);z.current=i,R(i);return}if(e.length>0){H(t=>{let n=t<0?e.length-1:Math.max(0,t-1),r=e[n]||``;return L(r),W.current=r,z.current=r.length,R(r.length),n});return}return}if(t.downArrow){if(G.length>0){K(e=>e<G.length-1?e+1:0);return}let e=U.current;if(r>=0&&e.length>0){H(t=>{let n=t>=e.length-1?-1:t+1,r=n<0?``:e[n]||``;return L(r),W.current=r,z.current=r.length,R(r.length),n});return}let{rows:t,currentRow:n}=f();if(n<t.length-1){let e=z.current-t[n].start,r=t[n+1],i=r.start+Math.min(e,r.end-r.start);z.current=i,R(i);return}return}if(t.return){if(G.length>0){let e=G[Se];xe([]),K(0),L(``),W.current=``,z.current=0,R(0),Y.current=e,i(e);return}if(n.trim()){let e=n.trim();Y.current=e,i(e),L(``),W.current=``,z.current=0,R(0),H(-1)}return}if((t.backspace||t.delete)&&z.current>0){let e=z.current,t=W.current,n=t.slice(0,e-1)+t.slice(e);W.current=n,L(n);let r=Math.max(0,e-1);z.current=r,R(r),H(-1);return}if(t.leftArrow&&!t.meta&&!t.ctrl){let e=Math.max(0,z.current-1);z.current=e,R(e);return}if(t.rightArrow&&!t.meta&&!t.ctrl){let e=Math.min(n.length,z.current+1);z.current=e,R(e);return}if(t.tab&&n.startsWith(`/`)){let e=Ie.filter(e=>e.startsWith(n.toLowerCase()));if(e.length===1){let t=e[0].length;L(e[0]),W.current=e[0],z.current=t,R(t)}return}if(e){if(t.meta||t.ctrl||!e.split(``).every(e=>{let t=e.charCodeAt(0);return t>=32&&t!==127||t===10||t===9}))return;let n=z.current,r=W.current,i=r.slice(0,n)+e+r.slice(n);W.current=i,L(i);let a=n+e.length;z.current=a,R(a),H(-1)}},[i,a,ne,V,Ie,G,Se,y,J,b,w,Te,x,q,l,_,c,o,C,k,A,je,De,s])),(0,d.useEffect)(()=>{f&&ue(!1)},[f]);let Le=l||_!==``||c.length>0;(0,d.useEffect)(()=>{Le&&!ae?se(new Date):!Le&&ae&&se(null)},[Le,ae]);let Z=`\x1B[2m`,Re=`\x1B[0m`,ze=[...oe.slice(0,4),`${ie[4]} ${Z}sessions monitored${Re}`,`${ie[5]} ${Z}preview${pe?` v${pe}`:``}${Re}`].join(`
9
+ `),Be=ve(s),Ve=(0,d.useMemo)(()=>ye(Be),[Be]),He=!!O,Ue=(0,d.useMemo)(()=>{let e=[`${t.charAt(0).toUpperCase()+t.slice(1)} mode`];if(N?.credentialEmail){let t=N.credentialTimeRemaining?` (${N.credentialTimeRemaining.days}d ${N.credentialTimeRemaining.hours}h)`:``;e.push(`${N.credentialEmail}${t}`)}O&&O.mcpServers.length>0&&e.push(`${O.mcpServers.reduce((e,t)=>e+t.count,0)} tools`),O&&O.claudeSkills.count>0&&e.push(`${O.claudeSkills.count} skills`);let r=[{text:`✓ ${e.join(` · `)}`,color:j.primary}],i=n||N?.detectedConnector;if(i&&r.push({text:`📂 Detected connector: ${i}`}),O)for(let e of O.errors)r.push({text:`⚠ ${e}`,color:`yellow`});return r},[O,N,t,n]),We=(0,d.useMemo)(()=>{let e=[],t=N?.recentConversations;if(t&&t.length>0){e.push({text:`Recent sessions:`});for(let n of t){let t=n.trim(),r=t.length>36?`${t.slice(0,35)}…`:t;e.push({text:` "${r}"`})}e.push({text:``}),e.push({text:`/resume to continue`})}return e},[n,N]),Ge=(0,d.useMemo)(()=>{let e=n||N?.detectedConnector,r={build:[e?`"Add a new action to ${e}"`:`"Add a new action to Slack"`,e?`"Show current actions for ${e}"`:`"Show actions for Datadog"`,`"Create a connector for a new provider"`,`"Validate and fix connector issues"`,`"Add OAuth authentication support"`,`"Map response fields to StackOne schema"`,`"Add pagination to the list endpoint"`,`"Generate test credentials for sandbox"`,`"Add rate limiting configuration"`,`"Improve descriptions for all actions"`],test:[e?`"Test all actions for ${e}"`:`"Test all actions for Slack"`,`"Run a specific action and show response"`,`"Debug why list_users is returning errors"`,`"Test with a different account"`,`"Compare response against StackOne schema"`,`"Test pagination across all list actions"`,`"Validate error handling for 401 responses"`,`"Run actions with verbose output"`,`"Test the OAuth flow end to end"`,`"Check rate limiting behavior"`],research:[e?`"${e} API endpoints?"`:`"Workday API endpoints?"`,`"Compare pagination for Greenhouse vs Lever"`,`"Auth methods for this provider?"`,`"What versioning strategy does the API use?"`,`"Find the rate limits documentation"`,`"What webhook events are available?"`,`"How does the provider handle deleted records?"`,`"What scopes are needed for user data?"`,`"Does the API support filtering or search?"`,`"What date format does the API use?"`]},i=[...r[t]||r.build];for(let e=i.length-1;e>0;e--){let t=Math.floor(Math.random()*(e+1));[i[e],i[t]]=[i[t],i[e]]}let a=i.slice(0,3),o=[{text:`Try:`}];for(let e of a){let t=e.length>38?`${e.slice(0,36)}…"`:e;o.push({text:` ${t}`})}return o},[t,n]),[Ke,qe]=(0,d.useState)(!1),Je=(0,d.useCallback)(()=>qe(!0),[]),Ye=He&&Ke,Xe=(0,d.useCallback)((e,t)=>{if(!e||t>=1)return e;let n=e.match(/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i);if(!n)return e;let r=Math.round(Number.parseInt(n[1],16)*t),i=Math.round(Number.parseInt(n[2],16)*t),a=Math.round(Number.parseInt(n[3],16)*t);return`#${r.toString(16).padStart(2,`0`)}${i.toString(16).padStart(2,`0`)}${a.toString(16).padStart(2,`0`)}`},[]);return d.default.createElement(u.Box,{flexDirection:`column`,padding:1},!Ye&&d.default.createElement(le,{ready:!!He,onComplete:Je}),Ye&&d.default.createElement(u.Box,{flexDirection:`row`,marginBottom:1},d.default.createElement(u.Box,{flexDirection:`column`,flexShrink:0},d.default.createElement(u.Text,null,ze)),d.default.createElement(u.Box,{flexDirection:`column`,marginLeft:3,marginTop:1},d.default.createElement(me,null,e=>d.default.createElement(d.default.Fragment,null,Ue.map((t,n)=>d.default.createElement(u.Text,{key:`hero-${n}`,color:Xe(t.color,e),dimColor:!t.color},t.text)),d.default.createElement(u.Box,{flexDirection:`row`,marginTop:1},We.length>0&&d.default.createElement(u.Box,{flexDirection:`column`,marginRight:2,borderStyle:`round`,borderColor:j.primary,borderDimColor:!0,paddingX:1,width:44},We.map((e,t)=>d.default.createElement(u.Text,{key:`ctx-${t}`,dimColor:!0},e.text))),d.default.createElement(u.Box,{flexDirection:`column`,borderStyle:`round`,borderColor:j.primary,borderDimColor:!0,paddingX:1,width:44},Ge.map((e,t)=>d.default.createElement(u.Text,{key:`ex-${t}`,dimColor:!0},e.text)))))))),d.default.createElement(u.Box,{flexDirection:`column`,marginBottom:1},Ve.map((e,t)=>{let n=process.stdout?.columns||80,r=Math.max(0,Math.min(n-4,60)),i=[...e.assistantMessages,...e.toolMessages,...e.systemMessages],a=i.length>0?i.reduce((e,t)=>t.timestamp>e.timestamp?t:e):null,o=e.userMessage&&a?a.timestamp.getTime()-e.userMessage.timestamp.getTime():0,s=o>0?o>=6e4?`${Math.floor(o/6e4)}m${Math.round(o%6e4/1e3)}s`:`${Math.round(o/1e3)}s`:``,c=e.toolMessages.map(e=>{let t=be(e.content);return{name:t.name,inputSummary:t.inputSummary,output:t.output,status:`completed`}});return d.default.createElement(u.Box,{key:`turn-${t}`,flexDirection:`column`},t>0&&d.default.createElement(u.Box,{marginBottom:1},d.default.createElement(u.Text,{dimColor:!0},`─`.repeat(r))),e.userMessage&&d.default.createElement(u.Box,{marginBottom:1,flexDirection:`column`},d.default.createElement(u.Text,{bold:!0,color:`white`},`❯ You`,d.default.createElement(u.Text,{color:`gray`},` `,`• `,e.userMessage.timestamp.toLocaleTimeString())),d.default.createElement(u.Box,{paddingLeft:2},d.default.createElement(u.Text,{color:`white`,wrap:`wrap`},e.userMessage.content))),(c.length>0||e.assistantMessages.length>0)&&d.default.createElement(u.Box,{flexDirection:`column`,marginBottom:1},d.default.createElement(u.Text,{bold:!0,color:j.primary},`◆ StackOne Agent`),c.length>0&&d.default.createElement(u.Box,{paddingLeft:2,marginTop:0,marginBottom:1},d.default.createElement(fe,{tools:c,expanded:De})),e.assistantMessages.map((n,r)=>{let i=r===e.assistantMessages.length-1;return d.default.createElement(u.Box,{key:`asst-${t}-${r}`,paddingLeft:2,flexDirection:`column`,marginBottom:i?0:1},n.isSubagent&&d.default.createElement(u.Text,{color:j.primary,dimColor:!0},`⚡ Subagent`),d.default.createElement(u.Text,{wrap:`wrap`,dimColor:!i},F(n.content)))}),s&&d.default.createElement(u.Box,{paddingLeft:2,marginTop:1},d.default.createElement(u.Text,{dimColor:!0},`✓ `,s))),e.systemMessages.map((e,n)=>d.default.createElement(u.Box,{key:`sys-${t}-${n}`,marginBottom:1},d.default.createElement(u.Text,{color:`gray`},`ℹ System • `,e.timestamp.toLocaleTimeString()),d.default.createElement(u.Box,{paddingLeft:2},d.default.createElement(u.Text,{dimColor:!0,wrap:`wrap`},e.content)))))})),d.default.createElement(u.Box,{flexDirection:`column`,marginBottom:1},d.default.createElement(d.default.Fragment,null,(w||E)&&d.default.createElement(u.Box,{marginBottom:0,marginTop:0,borderStyle:`single`,borderColor:j.primary,paddingX:2,paddingY:1,flexDirection:`column`,height:Te?`100%`:void 0},d.default.createElement(u.Text,{bold:!0,color:j.primary},E?`✓`:`⚡`,` Subprocess:`,` `,T,` `,E?`(Complete)`:``,` `,Te?`(Expanded)`:``),d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{dimColor:!0},E?Te?`Press Ctrl+O or ESC to collapse`:`Press Ctrl+O to expand`:Te?`Running... Press Ctrl+O or ESC to collapse`:`Running... Press Ctrl+O to expand`)),Te?d.default.createElement(d.default.Fragment,null,s.filter(e=>e.isSubagent&&!e.content.startsWith(`TOOL_START:`)).map((e,t)=>{let n=e.role===`system`&&e.content.startsWith(`TOOL:`),r=e.role===`assistant`?`⚡ Subagent`:`ℹ System`,i=e.content;if(n){let t=be(e.content);r=`🔧 Tool • ${t.name}`,i=t.output.slice(0,500),t.output.length>500&&(i+=`
10
+ ... (truncated)`)}return d.default.createElement(u.Box,{key:`${e.timestamp.getTime()}-${t}-${e.role}-subagent`,marginTop:1,flexDirection:`column`},d.default.createElement(u.Text,{bold:!0,color:j.primary},r,d.default.createElement(u.Text,{color:`gray`},` `,`•`,` `,e.timestamp.toLocaleTimeString())),d.default.createElement(u.Box,{paddingLeft:2},d.default.createElement(u.Text,{color:n?`gray`:j.primary,dimColor:n,wrap:`wrap`},F(i))))}),!E&&!h&&l&&c.length===0&&d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{color:j.primary},d.default.createElement(p.default,{type:`dots`})),d.default.createElement(u.Text,{dimColor:!0},` Thinking...`)),!E&&!h&&c.length>0&&d.default.createElement(u.Box,{flexDirection:`column`,marginTop:1},c.map((e,t)=>d.default.createElement(u.Box,{key:t,marginBottom:1},e.status===`running`&&d.default.createElement(u.Text,{color:j.primary},d.default.createElement(p.default,{type:`dots`})),d.default.createElement(u.Text,{color:j.primary},` `,e.skillName?d.default.createElement(d.default.Fragment,null,`✨ Skill •`,` `,e.skillName):d.default.createElement(d.default.Fragment,null,`🔧 `,e.name),e.status===`running`&&`...`,e.status===`completed`&&` ✓`)))),!E&&_&&!h&&d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{color:j.primary},F(_)))):d.default.createElement(d.default.Fragment,null,s.filter(e=>e.isSubagent&&!e.content.startsWith(`TOOL_START:`)&&e.role!==`system`||e.content.startsWith(`TOOL:`)).slice(-2).map((e,t)=>{let n=e.role===`system`&&e.content.startsWith(`TOOL:`),r=e.content;if(n){let t=be(e.content);r=`🔧 ${t.name}: ${t.output.slice(0,100)}${t.output.length>100?`...`:``}`}let i=r.split(`
10
11
  `).slice(0,2).join(`
11
12
  `);return d.default.createElement(u.Box,{key:t,marginTop:1},d.default.createElement(u.Text,{color:j.primary,dimColor:n},F(i),r.split(`
12
13
  `).length>2&&`...`))}),!E&&!h&&l&&c.length===0&&d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{color:j.primary},d.default.createElement(p.default,{type:`dots`})),d.default.createElement(u.Text,{dimColor:!0},` Thinking...`)),!E&&!h&&c.length>0&&d.default.createElement(u.Box,{flexDirection:`column`,marginTop:1},c.slice(-2).map((e,t)=>d.default.createElement(u.Box,{key:t,marginBottom:1},e.status===`running`&&d.default.createElement(u.Text,{color:j.primary},d.default.createElement(p.default,{type:`dots`})),d.default.createElement(u.Text,{color:j.primary},` `,e.skillName?d.default.createElement(d.default.Fragment,null,`✨ Skill •`,` `,e.skillName):d.default.createElement(d.default.Fragment,null,`🔧 `,e.name),e.status===`running`&&`...`,e.status===`completed`&&` ✓`))),c.length>2&&d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{dimColor:!0},`... and`,` `,c.length-2,` `,`more (Ctrl+O to expand)`))),!E&&_&&d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{color:j.primary},F(_).split(`
13
14
  `).slice(0,2).join(`
14
15
  `),F(_).split(`
15
16
  `).length>2&&`
16
- ...`))))),_&&!w&&!h&&d.default.createElement(u.Box,{marginBottom:1,flexDirection:`column`},d.default.createElement(u.Text,{bold:!0,color:j.primary},`◆ StackOne Agent`,d.default.createElement(u.Text,{color:`gray`},` • `,new Date().toLocaleTimeString())),d.default.createElement(u.Box,{paddingLeft:2},d.default.createElement(u.Text,{wrap:`wrap`},F(_)))),!w&&!h&&c.length>0&&d.default.createElement(u.Box,{marginBottom:1,paddingLeft:2},d.default.createElement(le,{tools:c.map(e=>({name:e.name,inputSummary:e.inputSummary||``,output:``,status:e.status===`failed`?`failed`:e.status,skillName:e.skillName}))}))),P&&P.length>0&&d.default.createElement(re,{phases:P,currentPhase:te}),!w&&!h&&l&&c.length===0&&d.default.createElement(u.Box,{marginBottom:1},d.default.createElement(u.Text,{color:j.primary},d.default.createElement(p.default,{type:`dots`})),d.default.createElement(u.Text,{dimColor:!0},` Thinking...`),ie&&d.default.createElement(u.Text,{dimColor:!0},` `,d.default.createElement(de,{startTime:ie}))),h&&d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{color:`red`},`⏺ Interrupted · What should the StackOne Agent do instead?`)),m&&d.default.createElement(u.Box,{marginBottom:1,borderStyle:`single`,borderColor:`red`,paddingX:2,paddingY:1,flexDirection:`column`},d.default.createElement(u.Text,{color:`red`},`✗ `,m),d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{dimColor:!0},`Press Enter to try again or Ctrl+C to exit`))),f&&d.default.createElement(u.Box,{marginBottom:1,borderStyle:`single`,borderColor:j.primary,paddingX:2},d.default.createElement(u.Text,{color:j.primary},`✓ Complete`)),y&&d.default.createElement(u.Box,{marginBottom:1,borderStyle:`single`,borderColor:j.primary,paddingX:2,paddingY:1,flexDirection:`column`},Se?d.default.createElement(d.default.Fragment,null,d.default.createElement(u.Text,{bold:!0,color:j.primary},y.items[K].name),y.type!==`trust`&&d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{dimColor:!0},y.items[K].description)),y.type===`skills`&&d.default.createElement(u.Box,{flexDirection:`column`},y.items[K].version?d.default.createElement(u.Text,{dimColor:!0},`Version:`,` `,String(y.items[K].version)):null,y.items[K].author?d.default.createElement(u.Text,{dimColor:!0},`Author:`,` `,String(y.items[K].author)):null,y.items[K].tags&&Array.isArray(y.items[K].tags)?d.default.createElement(u.Text,{dimColor:!0},`Tags:`,` `,y.items[K].tags.join(`, `)):null,y.items[K].content?d.default.createElement(u.Box,{marginTop:1,flexDirection:`column`},d.default.createElement(u.Text,{bold:!0},`Skill Content:`),d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{wrap:`wrap`},String(y.items[K].content).slice(0,2e3),String(y.items[K].content).length>2e3?`
17
+ ...`))))),_&&!w&&!h&&d.default.createElement(u.Box,{marginBottom:1,flexDirection:`column`},d.default.createElement(u.Text,{bold:!0,color:j.primary},`◆ StackOne Agent`,d.default.createElement(u.Text,{color:`gray`},` • `,new Date().toLocaleTimeString())),d.default.createElement(u.Box,{paddingLeft:2},d.default.createElement(u.Text,{wrap:`wrap`},F(_)))),!w&&!h&&c.length>0&&d.default.createElement(u.Box,{marginBottom:1,paddingLeft:2},d.default.createElement(fe,{tools:c.map(e=>({name:e.name,inputSummary:e.inputSummary||``,output:``,status:e.status===`failed`?`failed`:e.status,skillName:e.skillName}))}))),P&&P.length>0&&d.default.createElement(re,{phases:P,currentPhase:te}),!w&&!h&&l&&c.length===0&&d.default.createElement(u.Box,{marginBottom:1},d.default.createElement(u.Text,{color:j.primary},d.default.createElement(p.default,{type:`dots`})),d.default.createElement(u.Text,{dimColor:!0},` Thinking...`),ae&&d.default.createElement(u.Text,{dimColor:!0},` `,d.default.createElement(B,{startTime:ae}))),h&&d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{color:`red`},`⏺ Interrupted · What should the StackOne Agent do instead?`)),m&&d.default.createElement(u.Box,{marginBottom:1,borderStyle:`single`,borderColor:`red`,paddingX:2,paddingY:1,flexDirection:`column`},d.default.createElement(u.Text,{color:`red`},`✗ `,m),d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{dimColor:!0},`Press Enter to try again or Ctrl+C to exit`))),f&&d.default.createElement(u.Box,{marginBottom:1,borderStyle:`single`,borderColor:j.primary,paddingX:2},d.default.createElement(u.Text,{color:j.primary},`✓ Complete`)),y&&d.default.createElement(u.Box,{marginBottom:1,borderStyle:`single`,borderColor:j.primary,paddingX:2,paddingY:1,flexDirection:`column`},J?d.default.createElement(d.default.Fragment,null,d.default.createElement(u.Text,{bold:!0,color:j.primary},y.items[q].name),y.type!==`trust`&&d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{dimColor:!0},y.items[q].description)),y.type===`skills`&&d.default.createElement(u.Box,{flexDirection:`column`},y.items[q].version?d.default.createElement(u.Text,{dimColor:!0},`Version:`,` `,String(y.items[q].version)):null,y.items[q].author?d.default.createElement(u.Text,{dimColor:!0},`Author:`,` `,String(y.items[q].author)):null,y.items[q].tags&&Array.isArray(y.items[q].tags)?d.default.createElement(u.Text,{dimColor:!0},`Tags:`,` `,y.items[q].tags.join(`, `)):null,y.items[q].content?d.default.createElement(u.Box,{marginTop:1,flexDirection:`column`},d.default.createElement(u.Text,{bold:!0},`Skill Content:`),d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{wrap:`wrap`},String(y.items[q].content).slice(0,2e3),String(y.items[q].content).length>2e3?`
17
18
 
18
- ... (content truncated)`:``))):d.default.createElement(u.Text,{dimColor:!0},`No content available`)),y.type===`tools`&&d.default.createElement(u.Box,{flexDirection:`column`},d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{dimColor:!0},`Category:`,` `,String(y.items[K].category))),d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{bold:!0},`Input Parameters:`)),y.items[K].inputSchema?d.default.createElement(u.Box,{marginTop:1,paddingLeft:2,flexDirection:`column`},(()=>{let e=y.items[K].inputSchema,t=e.properties||{},n=e.required||[];return Object.entries(t).map(([e,t])=>d.default.createElement(u.Box,{key:e,flexDirection:`column`,marginBottom:1},d.default.createElement(u.Text,null,e,n.includes(e)?` *`:``,d.default.createElement(u.Text,{dimColor:!0},` `,`(`,t.type?String(t.type):`any`,`)`)),t.description?d.default.createElement(u.Box,{paddingLeft:2},d.default.createElement(u.Text,{dimColor:!0},String(t.description))):null))})(),d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{dimColor:!0},`* = required parameter`))):d.default.createElement(u.Box,{marginTop:1,paddingLeft:2},d.default.createElement(u.Text,{dimColor:!0},`No parameters`)),d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{bold:!0},`Output:`)),d.default.createElement(u.Box,{marginTop:1,paddingLeft:2},d.default.createElement(u.Text,{dimColor:!0},`Returns JSON with tool execution results`))),y.type===`trust`&&d.default.createElement(u.Box,{flexDirection:`column`,marginTop:1},d.default.createElement(u.Text,null,d.default.createElement(u.Text,{dimColor:!0},`Path: `),d.default.createElement(u.Text,null,String(y.items[K].path))),d.default.createElement(u.Text,null,d.default.createElement(u.Text,{dimColor:!0},`Trusted at: `),d.default.createElement(u.Text,null,y.items[K].trustedAt?new Date(y.items[K].trustedAt).toLocaleString():`N/A`))),d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{dimColor:!0},`Press Esc to go back`))):je?d.default.createElement(d.default.Fragment,null,d.default.createElement(u.Text,{bold:!0,color:`yellow`},`⚠️ Remove Trust`),d.default.createElement(u.Box,{flexDirection:`column`,marginTop:1},d.default.createElement(u.Text,{color:`white`},`Are you sure you want to remove trust from:`),d.default.createElement(u.Text,{color:`cyan`,bold:!0},je.path)),d.default.createElement(u.Box,{flexDirection:`column`,marginTop:1},d.default.createElement(u.Text,{color:`yellow`},`⚠️ This action is permanent. To trust this folder again,`),d.default.createElement(u.Text,{color:`yellow`},`you must open a new chat session in that directory.`)),d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{color:X===0?`green`:`gray`,bold:X===0},X===0?`❯ [Y]es`:` Yes`),d.default.createElement(u.Text,null,` `),d.default.createElement(u.Text,{color:X===1?`green`:`gray`,bold:X===1},X===1?`❯ [N]o`:` No`)),d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{dimColor:!0},`←→ to select • Enter to confirm • Esc to cancel`))):d.default.createElement(d.default.Fragment,null,d.default.createElement(u.Text,{bold:!0,color:j.primary},y.type===`skills`?`📚 Skills (${y.items.length})`:y.type===`tools`?`🔧 Tools (${y.items.length})`:y.type===`mcp`?`📡 MCP Servers (${y.items.filter(e=>e.connected).length}/${y.items.length} connected)`:y.type===`trust`?`📁 Trusted Folders (${y.items.length})`:y.type===`rewind`?`⏮️ Command History (${y.items.length})`:`💬 Recent Conversations (${y.items.length})`),d.default.createElement(u.Box,{flexDirection:`column`,marginTop:1},y.items.map((e,t)=>{let n=t===K?`❯ `:` `,r=process.stdout.columns||80,i=Math.min(r-10,120),a=(e.name||``).replace(/\n/g,` ⏎ `),o=``;if(y.type===`mcp`?o=e.connected?`● `:`○ `:y.type===`trust`&&(o=e.trusted?`● `:`○ `),y.type===`skills`)return d.default.createElement(u.Text,{key:t,color:t===K?j.primary:`gray`},n,a);let s=e.tokens?` (~${e.tokens.toLocaleString()} tokens)`:``,c=i-(n.length+o.length+a.length+s.length)-5,l=``;if(e.description&&c>10){let t=String(e.description).replace(/\n/g,` ⏎ `);l=t.length>c?` - ${t.slice(0,c)}...`:` - ${t}`}let f=`${n}${o}${a}${s}${l}`,p=f.slice(0,i);return d.default.createElement(u.Text,{key:t,color:t===K?j.primary:`gray`},p,f.length>i?`...`:``)})),d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{dimColor:!0},y.type===`skills`?`↑↓ Navigate • Enter for details • Esc to close`:y.type===`trust`?`↑↓ Navigate • Ctrl+O to remove trust • Enter for details • Esc to close`:y.type===`resume`?`↑↓ Navigate • Enter to resume • Esc to close`:y.type===`rewind`?`↑↓ Navigate • Enter to rewind to • Esc to close`:`↑↓ Navigate • Enter for details • Esc to close`)))),ee.length>0&&d.default.createElement(u.Box,{flexDirection:`column`,marginBottom:1},ee.map((e,t)=>d.default.createElement(u.Box,{key:t,marginBottom:t<ee.length-1?1:0},d.default.createElement(u.Text,{dimColor:!0},`📬 `),d.default.createElement(u.Text,null,e.content))),D&&d.default.createElement(u.Text,{dimColor:!0,italic:!0},`Processing...`)),k&&d.default.createElement(u.Box,{marginBottom:1},d.default.createElement(u.Text,{color:`yellow`},`Delete `),d.default.createElement(u.Text,{color:`red`},k.isDirectory&&k.directoryContents?`${k.files.map(e=>e.split(`/`).pop()).join(`, `)}/ (${k.directoryContents.length} files)`:k.files.map(e=>e.split(`/`).pop()).join(`, `)),d.default.createElement(u.Text,{color:`yellow`},`? `),d.default.createElement(u.Text,{color:J===0?`green`:`gray`},J===0?`[Y]es`:`y`),d.default.createElement(u.Text,null,`/`),d.default.createElement(u.Text,{color:J===1?`green`:`gray`},J===1?`[N]o`:`n`)),se&&!f&&!y&&!k&&d.default.createElement(d.default.Fragment,null,d.default.createElement(u.Box,{borderStyle:`round`,borderColor:j.primary,borderDimColor:!0,paddingX:2,flexDirection:`column`},(()=>{let e=process.stdout.columns||80,t=Math.max(20,e-6),n=H.current.split(`
19
- `),r=z.current,i=0,a=[];return n.forEach((e,o)=>{let s=i,c=s+e.length;i=c+1;let l=o===0,f=l?t-2:t,p=[];if(e.length===0)p.push(``);else{let n=e,r=!0;for(;n.length>0;){let e=r?f:t;p.push(n.slice(0,e)),n=n.slice(e),r=!1}}let m=0;p.forEach((e,t)=>{let i=s+m,f=i+e.length,h=l&&t===0,g=r>=i&&r<f,_=r===c&&o<n.length-1&&t===p.length-1,v=r===f&&t===p.length-1&&o===n.length-1,y=`${o}-${t}`;if(g||_||v){let t=r-i,n=e.slice(0,t),o=_?` `:e.charAt(t)||` `,s=_?``:e.slice(t+1);a.push(d.default.createElement(u.Box,{key:y},h&&d.default.createElement(u.Text,{color:j.primary},`❯ `),d.default.createElement(u.Text,{color:`white`},n),d.default.createElement(u.Text,{backgroundColor:`white`,color:`black`,bold:!0},o),d.default.createElement(u.Text,{color:`white`},s)))}else a.push(d.default.createElement(u.Box,{key:y},h&&d.default.createElement(u.Text,{color:j.primary},`❯ `),d.default.createElement(u.Text,{color:`white`},e||` `)));m+=e.length})}),a})()),U.length>0&&d.default.createElement(u.Box,{marginTop:1,paddingLeft:2,flexDirection:`column`},U.map((e,t)=>d.default.createElement(u.Box,{key:e},d.default.createElement(u.Text,{color:t===W?j.primary:`gray`},t===W?`❯ `:` `,e))))),v&&(()=>{let e=100-(v.input_tokens+v.output_tokens)/1e6*100,t=e>50?`green`:e>20?`yellow`:`red`,n=e<10;return d.default.createElement(u.Box,{marginTop:1,flexDirection:`column`},d.default.createElement(u.Text,{dimColor:!0},`📊 Model: Sonnet 4.5 • 🧠 Context left:`,` `,d.default.createElement(u.Text,{color:t},e.toFixed(1),`%`)),n&&d.default.createElement(u.Text,{color:`red`},`⚠️ Context low (`,e.toFixed(1),`% remaining)`))})(),d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{dimColor:!0},se?`Type message and press Enter • Shift+Enter for new line • `:``,(l||_||c.length>0)&&`ESC to stop • `,Oe?`Copied to clipboard! • `:`Ctrl+Y to copy last response • `,w?`Ctrl+O to expand subprocess • `:`Ctrl+O to show/hide full tool results • `,`Ctrl+C to clear/exit`)))},V=({timeRemaining:e,onRunSetup:t,onIgnore:n})=>{let{exit:r}=(0,u.useApp)(),[i,a]=(0,d.useState)(0);(0,u.useInput)((e,o)=>{if(e===`1`){t(),r();return}if(e===`2`){n(),r();return}o.upArrow?a(0):o.downArrow?a(1):o.return?i===0?(t(),r()):(n(),r()):o.escape&&(n(),r())});let o=`\x1B[38;2;0;175;102m`,{hours:s,minutes:c}=e,l=s>0?`${s} hour${s===1?``:`s`} and ${c} minute${c===1?``:`s`}`:`${c} minute${c===1?``:`s`}`;return d.default.createElement(u.Box,{flexDirection:`column`,padding:2},d.default.createElement(u.Box,{borderStyle:`round`,borderColor:`yellow`,flexDirection:`column`,paddingX:2,paddingY:1},d.default.createElement(u.Text,{bold:!0,color:`yellow`},`⚠️ Credential Warning`),d.default.createElement(u.Text,null),d.default.createElement(u.Text,null,`Your StackOne credentials expire in `,l,` (last day of 7-day validity).`),d.default.createElement(u.Text,null),d.default.createElement(u.Text,null,"To avoid interruption, run `stackone agent setup` to reauthenticate."),d.default.createElement(u.Text,null),d.default.createElement(u.Text,{color:i===0?o:`white`},i===0?`❯ `:` `,`1. Run stackone agent setup`),d.default.createElement(u.Text,{color:i===1?o:`white`},i===1?`❯ `:` `,`2. Ignore and continue`)),d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{dimColor:!0},`↑↓ to navigate • Enter to confirm • Esc to continue`)))},be=({directory:e,onConfirm:t,onCancel:n})=>{let{exit:r}=(0,u.useApp)(),[i,a]=(0,d.useState)(0);(0,u.useInput)((e,o)=>{o.upArrow?a(0):o.downArrow?a(1):o.return?i===0?(t(),r()):(n(),r()):o.escape&&(n(),r())});let o=`\x1B[38;2;0;175;102m`;return d.default.createElement(u.Box,{flexDirection:`column`,padding:2},d.default.createElement(u.Box,{borderStyle:`round`,borderColor:`#00AF66`,flexDirection:`column`,paddingX:2,paddingY:1},d.default.createElement(u.Text,{bold:!0},`Do you trust the files in this folder?`),d.default.createElement(u.Text,null),d.default.createElement(u.Text,{dimColor:!0},e),d.default.createElement(u.Text,null),d.default.createElement(u.Text,null,`StackOne Agent may read, write, or execute files contained in this directory.`),d.default.createElement(u.Text,null,`This can pose security risks, so only use files and commands from trusted sources.`),d.default.createElement(u.Text,null),d.default.createElement(u.Text,{color:i===0?o:`white`},i===0?`❯ `:` `,`1. Yes, proceed`),d.default.createElement(u.Text,{color:i===1?o:`white`},i===1?`❯ `:` `,`2. No, exit`)),d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{dimColor:!0},`↑↓ to navigate • Enter to confirm • Esc to exit`)))},H=`claude-sonnet-4-6`;async function*U(e){let{provider:t,category:n,apiKey:r,mcpServers:i,verbose:a,workDir:s=`./connectors/${t}`,abortSignal:c}=e,l=new o.BuildOrchestrator({provider:t,category:n,workDir:s,baseOptions:{mode:`build`,model:H,apiKey:r,mcpServers:i,verbose:a,origin:`cli`,abortSignal:c,mcpCache:{enabled:!0},contextPreservation:{enabled:!0,provider:t,workDir:s}}});for await(let e of l.run())yield e}const xe=()=>{try{let t=(0,l.join)((0,l.dirname)((0,g.createRequire)(require(`url`).pathToFileURL(__filename).href).resolve(`@stackone/agent-harness`)),`mcp-servers`),n=(0,s.readdirSync)(t).filter(e=>e.endsWith(`.json`)),r=[];for(let i of n){let n=(0,s.readFileSync)((0,l.join)(t,i),`utf-8`),a=JSON.parse(n);for(let[t,n]of Object.entries(a.mcpServers)){let i=`stdio`;if(n.type)i=n.type;else if(n.transport?.type){let r=n.transport.type;if(r!==`http`&&r!==`stdio`&&r!==`sse`){e.w.warn(`⚠️ Skipping MCP server "${t}": Invalid transport type "${r}". Must be "http", "stdio", or "sse"`);continue}i=r===`sse`?`http`:r}else n.url&&(i=`http`);let a={},o=n.transport?.headers||n.headers;if(o)for(let[n,r]of Object.entries(o))a[n]=r.replace(/\$\{([^}]+)\}/g,(r,i)=>{let a=process.env[i];return a===void 0?(e.w.warn(`[MCP] Warning: Environment variable '${i}' referenced in header '${n}' for server '${t}' is not set. Substituting empty string.`),``):a});if(n.auth?.type===`bearer`&&(a.Authorization=`Bearer ${n.auth.token.replace(/\$\{([^}]+)\}/g,(n,r)=>{let i=process.env[r];return i===void 0?(e.w.warn(`[MCP] Warning: Environment variable '${r}' for auth token in server '${t}' is not set`),``):i})}`),i===`http`&&!n.url){e.w.warn(`⚠️ Skipping MCP server "${t}": HTTP transport requires a URL`);continue}if(i===`stdio`){e.w.debug(`Skipping MCP server "${t}": stdio transport is not supported for bundled servers`);continue}r.push({name:t,transport:i,url:n?.url??``,headers:a})}}return r}catch(t){if(t.code===`ENOENT`)return e.w.log(`[MCP] No bundled MCP server configurations found in agent-harness package`),[];throw t}};let W;const G=()=>{if(W!==void 0)return W;try{let e=(0,h.join)((0,h.dirname)((0,_.fileURLToPath)(require(`url`).pathToFileURL(__filename).href)),`..`,`package.json`);W=JSON.parse((0,m.readFileSync)(e,`utf8`)).version}catch{W=`unknown`}return W??`unknown`},K=(e,t)=>{try{if(t.existed&&t.content!==null){let n=l.dirname(e);return s.existsSync(n)||s.mkdirSync(n,{recursive:!0}),s.writeFileSync(e,t.content,`utf-8`),{success:!0,action:`restored`}}else return s.existsSync(e)?(s.unlinkSync(e),{success:!0,action:`deleted`}):{success:!0,action:`restored`}}catch(e){return{success:!1,action:`error`,error:e instanceof Error?e.message:String(e)}}},q=/<![^>]*>[\s\S]*<\/HTML>/gi,Se=/API Error:\s*\d{3}.*?(?=API Error:|$)/gi,Ce=e=>e.replace(q,``).replace(Se,``).trim(),we=e=>{let t=/<TITLE>([^<]*)<\/TITLE>/i.exec(e),n=/<H1>\s*(\d{3}[^<]*)<\/H1>/i.exec(e);if(t||n)return`HTTP ${n?.[1]?.trim()||``} from ${/cloudfront/i.test(e)?`CloudFront`:/nginx/i.test(e)?`Nginx`:`upstream`}`.trim();let r=/API Error:\s*\d{3}.*?(?=API Error:|$)/i.exec(e);return r?r[0].trim():/Failed to authenticate/i.test(e)?`Authentication failed`:null},Te=(e,t,n)=>{let r=[...new Set(e)],i=t.length,a=n.length,o=[];i>0?o.push(`Build failed — ${i}/${a} phases errored\n`):o.push(`Build failed
19
+ ... (content truncated)`:``))):d.default.createElement(u.Text,{dimColor:!0},`No content available`)),y.type===`tools`&&d.default.createElement(u.Box,{flexDirection:`column`},d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{dimColor:!0},`Category:`,` `,String(y.items[q].category))),d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{bold:!0},`Input Parameters:`)),y.items[q].inputSchema?d.default.createElement(u.Box,{marginTop:1,paddingLeft:2,flexDirection:`column`},(()=>{let e=y.items[q].inputSchema,t=e.properties||{},n=e.required||[];return Object.entries(t).map(([e,t])=>d.default.createElement(u.Box,{key:e,flexDirection:`column`,marginBottom:1},d.default.createElement(u.Text,null,e,n.includes(e)?` *`:``,d.default.createElement(u.Text,{dimColor:!0},` `,`(`,t.type?String(t.type):`any`,`)`)),t.description?d.default.createElement(u.Box,{paddingLeft:2},d.default.createElement(u.Text,{dimColor:!0},String(t.description))):null))})(),d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{dimColor:!0},`* = required parameter`))):d.default.createElement(u.Box,{marginTop:1,paddingLeft:2},d.default.createElement(u.Text,{dimColor:!0},`No parameters`)),d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{bold:!0},`Output:`)),d.default.createElement(u.Box,{marginTop:1,paddingLeft:2},d.default.createElement(u.Text,{dimColor:!0},`Returns JSON with tool execution results`))),y.type===`trust`&&d.default.createElement(u.Box,{flexDirection:`column`,marginTop:1},d.default.createElement(u.Text,null,d.default.createElement(u.Text,{dimColor:!0},`Path: `),d.default.createElement(u.Text,null,String(y.items[q].path))),d.default.createElement(u.Text,null,d.default.createElement(u.Text,{dimColor:!0},`Trusted at: `),d.default.createElement(u.Text,null,y.items[q].trustedAt?new Date(y.items[q].trustedAt).toLocaleString():`N/A`))),d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{dimColor:!0},`Press Esc to go back`))):Ne?d.default.createElement(d.default.Fragment,null,d.default.createElement(u.Text,{bold:!0,color:`yellow`},`⚠️ Remove Trust`),d.default.createElement(u.Box,{flexDirection:`column`,marginTop:1},d.default.createElement(u.Text,{color:`white`},`Are you sure you want to remove trust from:`),d.default.createElement(u.Text,{color:`cyan`,bold:!0},Ne.path)),d.default.createElement(u.Box,{flexDirection:`column`,marginTop:1},d.default.createElement(u.Text,{color:`yellow`},`⚠️ This action is permanent. To trust this folder again,`),d.default.createElement(u.Text,{color:`yellow`},`you must open a new chat session in that directory.`)),d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{color:Pe===0?`green`:`gray`,bold:Pe===0},Pe===0?`❯ [Y]es`:` Yes`),d.default.createElement(u.Text,null,` `),d.default.createElement(u.Text,{color:Pe===1?`green`:`gray`,bold:Pe===1},Pe===1?`❯ [N]o`:` No`)),d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{dimColor:!0},`←→ to select • Enter to confirm • Esc to cancel`))):d.default.createElement(d.default.Fragment,null,d.default.createElement(u.Text,{bold:!0,color:j.primary},y.type===`skills`?`📚 Skills (${y.items.length})`:y.type===`tools`?`🔧 Tools (${y.items.length})`:y.type===`mcp`?`📡 MCP Servers (${y.items.filter(e=>e.connected).length}/${y.items.length} connected)`:y.type===`trust`?`📁 Trusted Folders (${y.items.length})`:y.type===`rewind`?`⏮️ Command History (${y.items.length})`:`💬 Recent Conversations (${y.items.length})`),d.default.createElement(u.Box,{flexDirection:`column`,marginTop:1},y.items.map((e,t)=>{let n=t===q?`❯ `:` `,r=process.stdout.columns||80,i=Math.min(r-10,120),a=(e.name||``).replace(/\n/g,` ⏎ `),o=``;if(y.type===`mcp`?o=e.connected?`● `:`○ `:y.type===`trust`&&(o=e.trusted?`● `:`○ `),y.type===`skills`)return d.default.createElement(u.Text,{key:t,color:t===q?j.primary:`gray`},n,a);let s=e.tokens?` (~${e.tokens.toLocaleString()} tokens)`:``,c=i-(n.length+o.length+a.length+s.length)-5,l=``;if(e.description&&c>10){let t=String(e.description).replace(/\n/g,` ⏎ `);l=t.length>c?` - ${t.slice(0,c)}...`:` - ${t}`}let f=`${n}${o}${a}${s}${l}`,p=f.slice(0,i);return d.default.createElement(u.Text,{key:t,color:t===q?j.primary:`gray`},p,f.length>i?`...`:``)})),d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{dimColor:!0},y.type===`skills`?`↑↓ Navigate • Enter for details • Esc to close`:y.type===`trust`?`↑↓ Navigate • Ctrl+O to remove trust • Enter for details • Esc to close`:y.type===`resume`?`↑↓ Navigate • Enter to resume • Esc to close`:y.type===`rewind`?`↑↓ Navigate • Enter to rewind to • Esc to close`:`↑↓ Navigate • Enter for details • Esc to close`)))),ee.length>0&&d.default.createElement(u.Box,{flexDirection:`column`,marginBottom:1},ee.map((e,t)=>d.default.createElement(u.Box,{key:t,marginBottom:t<ee.length-1?1:0},d.default.createElement(u.Text,{dimColor:!0},`📬 `),d.default.createElement(u.Text,null,e.content))),D&&d.default.createElement(u.Text,{dimColor:!0,italic:!0},`Processing...`)),k&&d.default.createElement(u.Box,{marginBottom:1},d.default.createElement(u.Text,{color:`yellow`},`Delete `),d.default.createElement(u.Text,{color:`red`},k.isDirectory&&k.directoryContents?`${k.files.map(e=>e.split(`/`).pop()).join(`, `)}/ (${k.directoryContents.length} files)`:k.files.map(e=>e.split(`/`).pop()).join(`, `)),d.default.createElement(u.Text,{color:`yellow`},`? `),d.default.createElement(u.Text,{color:je===0?`green`:`gray`},je===0?`[Y]es`:`y`),d.default.createElement(u.Text,null,`/`),d.default.createElement(u.Text,{color:je===1?`green`:`gray`},je===1?`[N]o`:`n`)),ce&&!f&&!y&&!k&&d.default.createElement(d.default.Fragment,null,d.default.createElement(u.Box,{borderStyle:`round`,borderColor:j.primary,borderDimColor:!0,paddingX:2,flexDirection:`column`},(()=>{let e=process.stdout.columns||80,t=Math.max(20,e-6),n=W.current.split(`
20
+ `),r=z.current,i=0,a=[];return n.forEach((e,o)=>{let s=i,c=s+e.length;i=c+1;let l=o===0,f=l?t-2:t,p=[];if(e.length===0)p.push(``);else{let n=e,r=!0;for(;n.length>0;){let e=r?f:t;p.push(n.slice(0,e)),n=n.slice(e),r=!1}}let m=0;p.forEach((e,t)=>{let i=s+m,f=i+e.length,h=l&&t===0,g=r>=i&&r<f,_=r===c&&o<n.length-1&&t===p.length-1,v=r===f&&t===p.length-1&&o===n.length-1,y=`${o}-${t}`;if(g||_||v){let t=r-i,n=e.slice(0,t),o=_?` `:e.charAt(t)||` `,s=_?``:e.slice(t+1);a.push(d.default.createElement(u.Box,{key:y},h&&d.default.createElement(u.Text,{color:j.primary},`❯ `),d.default.createElement(u.Text,{color:`white`},n),d.default.createElement(u.Text,{backgroundColor:`white`,color:`black`,bold:!0},o),d.default.createElement(u.Text,{color:`white`},s)))}else a.push(d.default.createElement(u.Box,{key:y},h&&d.default.createElement(u.Text,{color:j.primary},`❯ `),d.default.createElement(u.Text,{color:`white`},e||` `)));m+=e.length})}),a})()),G.length>0&&d.default.createElement(u.Box,{marginTop:1,paddingLeft:2,flexDirection:`column`},G.map((e,t)=>d.default.createElement(u.Box,{key:e},d.default.createElement(u.Text,{color:t===Se?j.primary:`gray`},t===Se?`❯ `:` `,e))))),v&&(()=>{let e=100-(v.input_tokens+v.output_tokens)/1e6*100,t=e>50?`green`:e>20?`yellow`:`red`,n=e<10;return d.default.createElement(u.Box,{marginTop:1,flexDirection:`column`},d.default.createElement(u.Text,{dimColor:!0},`📊 Model: Sonnet 4.5 • 🧠 Context left:`,` `,d.default.createElement(u.Text,{color:t},e.toFixed(1),`%`)),n&&d.default.createElement(u.Text,{color:`red`},`⚠️ Context low (`,e.toFixed(1),`% remaining)`))})(),d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{dimColor:!0},ce?`Type message and press Enter • Shift+Enter for new line • `:``,(l||_||c.length>0)&&`ESC to stop • `,ke?`Copied to clipboard! • `:`Ctrl+Y to copy last response • `,w?`Ctrl+O to expand subprocess • `:`Ctrl+O to show/hide full tool results • `,`Ctrl+C to clear/exit`)))},U=({timeRemaining:e,onRunSetup:t,onIgnore:n})=>{let{exit:r}=(0,u.useApp)(),[i,a]=(0,d.useState)(0);(0,u.useInput)((e,o)=>{if(e===`1`){t(),r();return}if(e===`2`){n(),r();return}o.upArrow?a(0):o.downArrow?a(1):o.return?i===0?(t(),r()):(n(),r()):o.escape&&(n(),r())});let o=`\x1B[38;2;0;175;102m`,{hours:s,minutes:c}=e,l=s>0?`${s} hour${s===1?``:`s`} and ${c} minute${c===1?``:`s`}`:`${c} minute${c===1?``:`s`}`;return d.default.createElement(u.Box,{flexDirection:`column`,padding:2},d.default.createElement(u.Box,{borderStyle:`round`,borderColor:`yellow`,flexDirection:`column`,paddingX:2,paddingY:1},d.default.createElement(u.Text,{bold:!0,color:`yellow`},`⚠️ Credential Warning`),d.default.createElement(u.Text,null),d.default.createElement(u.Text,null,`Your StackOne credentials expire in `,l,` (last day of 7-day validity).`),d.default.createElement(u.Text,null),d.default.createElement(u.Text,null,"To avoid interruption, run `stackone agent setup` to reauthenticate."),d.default.createElement(u.Text,null),d.default.createElement(u.Text,{color:i===0?o:`white`},i===0?`❯ `:` `,`1. Run stackone agent setup`),d.default.createElement(u.Text,{color:i===1?o:`white`},i===1?`❯ `:` `,`2. Ignore and continue`)),d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{dimColor:!0},`↑↓ to navigate • Enter to confirm • Esc to continue`)))},W=({directory:e,onConfirm:t,onCancel:n})=>{let{exit:r}=(0,u.useApp)(),[i,a]=(0,d.useState)(0);(0,u.useInput)((e,o)=>{o.upArrow?a(0):o.downArrow?a(1):o.return?i===0?(t(),r()):(n(),r()):o.escape&&(n(),r())});let o=`\x1B[38;2;0;175;102m`;return d.default.createElement(u.Box,{flexDirection:`column`,padding:2},d.default.createElement(u.Box,{borderStyle:`round`,borderColor:`#00AF66`,flexDirection:`column`,paddingX:2,paddingY:1},d.default.createElement(u.Text,{bold:!0},`Do you trust the files in this folder?`),d.default.createElement(u.Text,null),d.default.createElement(u.Text,{dimColor:!0},e),d.default.createElement(u.Text,null),d.default.createElement(u.Text,null,`StackOne Agent may read, write, or execute files contained in this directory.`),d.default.createElement(u.Text,null,`This can pose security risks, so only use files and commands from trusted sources.`),d.default.createElement(u.Text,null),d.default.createElement(u.Text,{color:i===0?o:`white`},i===0?`❯ `:` `,`1. Yes, proceed`),d.default.createElement(u.Text,{color:i===1?o:`white`},i===1?`❯ `:` `,`2. No, exit`)),d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{dimColor:!0},`↑↓ to navigate • Enter to confirm • Esc to exit`)))},G=`claude-sonnet-4-6`;async function*xe(e){let{provider:t,category:n,apiKey:r,mcpServers:i,verbose:a,workDir:s=`./connectors/${t}`,abortSignal:c}=e,l=new o.BuildOrchestrator({provider:t,category:n,workDir:s,baseOptions:{mode:`build`,model:G,apiKey:r,mcpServers:i,verbose:a,origin:`cli`,abortSignal:c,mcpCache:{enabled:!0},contextPreservation:{enabled:!0,provider:t,workDir:s}}});for await(let e of l.run())yield e}const Se=()=>{try{let t=(0,l.join)((0,l.dirname)((0,g.createRequire)(require(`url`).pathToFileURL(__filename).href).resolve(`@stackone/agent-harness`)),`mcp-servers`),n=(0,s.readdirSync)(t).filter(e=>e.endsWith(`.json`)),r=[];for(let i of n){let n=(0,s.readFileSync)((0,l.join)(t,i),`utf-8`),a=JSON.parse(n);for(let[t,n]of Object.entries(a.mcpServers)){let i=`stdio`;if(n.type)i=n.type;else if(n.transport?.type){let r=n.transport.type;if(r!==`http`&&r!==`stdio`&&r!==`sse`){e.w.warn(`⚠️ Skipping MCP server "${t}": Invalid transport type "${r}". Must be "http", "stdio", or "sse"`);continue}i=r===`sse`?`http`:r}else n.url&&(i=`http`);let a={},o=n.transport?.headers||n.headers;if(o)for(let[n,r]of Object.entries(o))a[n]=r.replace(/\$\{([^}]+)\}/g,(r,i)=>{let a=process.env[i];return a===void 0?(e.w.warn(`[MCP] Warning: Environment variable '${i}' referenced in header '${n}' for server '${t}' is not set. Substituting empty string.`),``):a});if(n.auth?.type===`bearer`&&(a.Authorization=`Bearer ${n.auth.token.replace(/\$\{([^}]+)\}/g,(n,r)=>{let i=process.env[r];return i===void 0?(e.w.warn(`[MCP] Warning: Environment variable '${r}' for auth token in server '${t}' is not set`),``):i})}`),i===`http`&&!n.url){e.w.warn(`⚠️ Skipping MCP server "${t}": HTTP transport requires a URL`);continue}if(i===`stdio`){e.w.debug(`Skipping MCP server "${t}": stdio transport is not supported for bundled servers`);continue}r.push({name:t,transport:i,url:n?.url??``,headers:a})}}return r}catch(t){if(t.code===`ENOENT`)return e.w.log(`[MCP] No bundled MCP server configurations found in agent-harness package`),[];throw t}};let K;const q=()=>{if(K!==void 0)return K;try{let e=(0,h.join)((0,h.dirname)((0,_.fileURLToPath)(require(`url`).pathToFileURL(__filename).href)),`..`,`package.json`);K=JSON.parse((0,m.readFileSync)(e,`utf8`)).version}catch{K=`unknown`}return K??`unknown`},Ce=(e,t)=>{try{if(t.existed&&t.content!==null){let n=l.dirname(e);return s.existsSync(n)||s.mkdirSync(n,{recursive:!0}),s.writeFileSync(e,t.content,`utf-8`),{success:!0,action:`restored`}}else return s.existsSync(e)?(s.unlinkSync(e),{success:!0,action:`deleted`}):{success:!0,action:`restored`}}catch(e){return{success:!1,action:`error`,error:e instanceof Error?e.message:String(e)}}},J=/<![^>]*>[\s\S]*<\/HTML>/gi,we=/API Error:\s*\d{3}.*?(?=API Error:|$)/gi,Te=e=>e.replace(J,``).replace(we,``).trim(),Ee=e=>{let t=/<TITLE>([^<]*)<\/TITLE>/i.exec(e),n=/<H1>\s*(\d{3}[^<]*)<\/H1>/i.exec(e);if(t||n)return`HTTP ${n?.[1]?.trim()||``} from ${/cloudfront/i.test(e)?`CloudFront`:/nginx/i.test(e)?`Nginx`:`upstream`}`.trim();let r=/API Error:\s*\d{3}.*?(?=API Error:|$)/i.exec(e);return r?r[0].trim():/Failed to authenticate/i.test(e)?`Authentication failed`:null},De=(e,t,n)=>{let r=[...new Set(e)],i=t.length,a=n.length,o=[];i>0?o.push(`Build failed — ${i}/${a} phases errored\n`):o.push(`Build failed
20
21
  `);for(let e of r)o.push(` ${e}`);let s=r.join(` `);return/400|Bad Request/i.test(s)?o.push(`
21
22
  This usually means the model is not supported or the request was malformed.`,`Check that your STACKONE_AGENT_TOKEN is valid and the model is available.`):/401|Unauthorized|403|Forbidden/i.test(s)?o.push(`
22
23
  Your API key may be invalid or expired.`,`Check your STACKONE_AGENT_TOKEN configuration.`):/429|rate limit/i.test(s)?o.push(`
23
24
  Rate limit hit. Wait a moment and try again.`):/5\d{2}|Internal Server Error|Service Unavailable/i.test(s)&&o.push(`
24
25
  The API is experiencing issues. Try again shortly.`),o.join(`
25
- `)},Ee=[{name:`commands`,description:`Show all available commands`,argumentHint:``,source:`cli`},{name:`skills`,description:`View and toggle skills (max 8)`,argumentHint:``,source:`cli`},{name:`tools`,description:`View available tools`,argumentHint:``,source:`cli`},{name:`mcp`,description:`List configured MCP servers`,argumentHint:``,source:`cli`},{name:`trust`,description:`View and manage trusted folders`,argumentHint:``,source:`cli`},{name:`compact`,description:`Summarize conversation to free up context`,argumentHint:``,source:`cli`},{name:`exit`,description:`Exit the agent (or use Ctrl+C)`,argumentHint:``,source:`cli`}],De=new Set([`heapdump`]);function Oe(e,t){let n=new Map(t.map(e=>[e.name,e]));for(let t of e)!n.has(t.name)&&!De.has(t.name)&&n.set(t.name,{...t,source:`harness`});return Array.from(n.values())}const ke=({mode:t,connector:n,action:r,goal:i,verbose:a,temperature:u,apiKey:f})=>{let[p,m]=(0,d.useState)([]),h=(0,d.useRef)([]);h.current=p;let[g,_]=(0,d.useState)(new Map),[v,y]=(0,d.useState)(!1),[b,x]=(0,d.useState)(),[S,C]=(0,d.useState)(!1),[w,T]=(0,d.useState)(!0),[E,ee]=(0,d.useState)([]),[D,O]=(0,d.useState)([]),[k,A]=(0,d.useState)(``),[j]=(0,d.useState)(),[M,N]=(0,d.useState)(!1),[P,F]=(0,d.useState)(null),te=(0,d.useRef)((0,o.createDefaultVisualizationRegistry)()),ne=(0,d.useRef)((0,o.createSkillTracker)()),[re]=(0,d.useState)(new Date),[ie,ae]=(0,d.useState)(0),[I,L]=(0,d.useState)(!1),R=(0,d.useRef)(!1),[z,oe]=(0,d.useState)(``),[se,ce]=(0,d.useState)(!1),[le,ue]=(0,d.useState)([]),[de,fe]=(0,d.useState)(!1),[pe,B]=(0,d.useState)(!1),me=(0,d.useRef)(!1),[he,ge]=(0,d.useState)(),[_e,ve]=(0,d.useState)(),V=(0,d.useRef)({shouldStop:!1,requestId:0,controller:null}),[be,W]=(0,d.useState)([]),q=(0,d.useRef)(null),[Se,De]=(0,d.useState)([]),ke=(0,d.useRef)(null),Ae=(0,d.useRef)([]),J=(0,d.useRef)(0),[Y,je]=(0,d.useState)({claudeSkills:{count:0,names:[],totalSize:0},mcpServers:[],toolCounts:{total:0,builtin:[],mcpByServer:{}},errors:[]}),[Me,X]=(0,d.useState)(Ee),Ne=(0,d.useRef)(new Map),Pe=(0,d.useRef)(-1),[Fe,Ie]=(0,d.useState)(null),Le=(0,d.useRef)(null),Z=(0,d.useRef)({operation:``,phase:`idle`}),Re=(e,t=!1)=>{let n=Z.current,r=e;n.operation&&(r=`${r}\n\nContext: ${n.operation}`);let i={idle:`Agent was idle`,thinking:`Agent was processing your request`,tool_execution:n.toolName?`Agent was executing tool: ${n.toolName}`:`Agent was executing a tool`,streaming:`Agent was generating a response`};if(n.phase!==`idle`&&(r=`${r}\nPhase: ${i[n.phase]}`),t&&n.toolName&&n.toolInput)try{let e=typeof n.toolInput==`string`?n.toolInput:JSON.stringify(n.toolInput,null,2),t=e.length>500?e.slice(0,500)+`...`:e;r=`${r}\nTool input: ${t}`}catch{}return r},ze=(0,d.useMemo)(()=>{let t={};try{let n=e.d();n?.email&&(t.credentialEmail=n.email);let r=e.i(n);r.status===`valid`&&(t.credentialTimeRemaining=r.timeRemaining)}catch{}if(!n)try{let e=process.cwd(),n=s.readdirSync(e).find(e=>e.endsWith(`.connector.s1.yaml`));if(n)t.detectedConnector=n.replace(`.connector.s1.yaml`,``);else{let n=l.join(e,`src`,`configs`);if(s.existsSync(n)&&s.statSync(n).isDirectory()){let e=s.readdirSync(n);if(e.length===1){let r=l.join(n,e[0],`${e[0]}.connector.s1.yaml`);s.existsSync(r)&&(t.detectedConnector=e[0])}}}}catch{}try{let e=l.join(c.homedir(),`.stackone`,`conversations`);if(s.existsSync(e)){let n=s.readdirSync(e).filter(e=>e.endsWith(`.json`)).sort().reverse(),r=[];for(let e of n.slice(0,3)){let t=e.match(/^\d+-(.+)\.json$/);t&&r.push(t[1].replace(/-/g,` `))}r.length>0&&(t.recentConversations=r)}}catch{}return t},[n]);(0,d.useEffect)(()=>{let t=l.join(c.homedir(),`.stackone`,`agent_history`);try{if(s.existsSync(t)){let e=s.readFileSync(t,`utf-8`),n;try{let t=JSON.parse(e);n=Array.isArray(t)?t.filter(e=>typeof e==`string`&&e.trim()):e.split(`
26
+ `)},Oe=[{name:`commands`,description:`Show all available commands`,argumentHint:``,source:`cli`},{name:`skills`,description:`View and toggle skills (max 8)`,argumentHint:``,source:`cli`},{name:`tools`,description:`View available tools`,argumentHint:``,source:`cli`},{name:`mcp`,description:`List configured MCP servers`,argumentHint:``,source:`cli`},{name:`trust`,description:`View and manage trusted folders`,argumentHint:``,source:`cli`},{name:`compact`,description:`Summarize conversation to free up context`,argumentHint:``,source:`cli`},{name:`exit`,description:`Exit the agent (or use Ctrl+C)`,argumentHint:``,source:`cli`}],ke=new Set([`heapdump`]);function Ae(e,t){let n=new Map(t.map(e=>[e.name,e]));for(let t of e)!n.has(t.name)&&!ke.has(t.name)&&n.set(t.name,{...t,source:`harness`});return Array.from(n.values())}const Y=({mode:t,connector:n,action:r,goal:i,verbose:a,temperature:u,apiKey:f})=>{let[p,m]=(0,d.useState)([]),h=(0,d.useRef)([]);h.current=p;let[g,_]=(0,d.useState)(new Map),[v,y]=(0,d.useState)(!1),[b,x]=(0,d.useState)(),[S,C]=(0,d.useState)(!1),[w,T]=(0,d.useState)(!0),[E,ee]=(0,d.useState)([]),[D,O]=(0,d.useState)([]),[k,A]=(0,d.useState)(``),[j]=(0,d.useState)(),[M,N]=(0,d.useState)(!1),[P,F]=(0,d.useState)(null),te=(0,d.useRef)((0,o.createDefaultVisualizationRegistry)()),ne=(0,d.useRef)((0,o.createSkillTracker)()),[re]=(0,d.useState)(new Date),[ie,ae]=(0,d.useState)(0),[oe,se]=(0,d.useState)(!1),I=(0,d.useRef)(!1),[L,R]=(0,d.useState)(``),[z,ce]=(0,d.useState)(!1),[le,ue]=(0,d.useState)([]),[de,fe]=(0,d.useState)(!1),[pe,B]=(0,d.useState)(!1),me=(0,d.useRef)(!1),[he,V]=(0,d.useState)(),[ge,_e]=(0,d.useState)(),ve=(0,d.useRef)({shouldStop:!1,requestId:0,controller:null}),[ye,be]=(0,d.useState)([]),U=(0,d.useRef)(null),[W,K]=(0,d.useState)([]),J=(0,d.useRef)(null),we=(0,d.useRef)([]),ke=(0,d.useRef)(0),[Y,je]=(0,d.useState)({claudeSkills:{count:0,names:[],totalSize:0},mcpServers:[],toolCounts:{total:0,builtin:[],mcpByServer:{}},errors:[]}),[Me,Ne]=(0,d.useState)(Oe),X=(0,d.useRef)(new Map),Pe=(0,d.useRef)(-1),[Fe,Ie]=(0,d.useState)(null),Le=(0,d.useRef)(null),Z=(0,d.useRef)({operation:``,phase:`idle`}),Re=(e,t=!1)=>{let n=Z.current,r=e;n.operation&&(r=`${r}\n\nContext: ${n.operation}`);let i={idle:`Agent was idle`,thinking:`Agent was processing your request`,tool_execution:n.toolName?`Agent was executing tool: ${n.toolName}`:`Agent was executing a tool`,streaming:`Agent was generating a response`};if(n.phase!==`idle`&&(r=`${r}\nPhase: ${i[n.phase]}`),t&&n.toolName&&n.toolInput)try{let e=typeof n.toolInput==`string`?n.toolInput:JSON.stringify(n.toolInput,null,2),t=e.length>500?e.slice(0,500)+`...`:e;r=`${r}\nTool input: ${t}`}catch{}return r},ze=(0,d.useMemo)(()=>{let t={};try{let n=e.d();n?.email&&(t.credentialEmail=n.email);let r=e.i(n);r.status===`valid`&&(t.credentialTimeRemaining=r.timeRemaining)}catch{}if(!n)try{let e=process.cwd(),n=s.readdirSync(e).find(e=>e.endsWith(`.connector.s1.yaml`));if(n)t.detectedConnector=n.replace(`.connector.s1.yaml`,``);else{let n=l.join(e,`src`,`configs`);if(s.existsSync(n)&&s.statSync(n).isDirectory()){let e=s.readdirSync(n);if(e.length===1){let r=l.join(n,e[0],`${e[0]}.connector.s1.yaml`);s.existsSync(r)&&(t.detectedConnector=e[0])}}}}catch{}try{let e=l.join(c.homedir(),`.stackone`,`conversations`);if(s.existsSync(e)){let n=s.readdirSync(e).filter(e=>e.endsWith(`.json`)).sort().reverse(),r=[];for(let e of n.slice(0,3)){let t=e.match(/^\d+-(.+)\.json$/);t&&r.push(t[1].replace(/-/g,` `))}r.length>0&&(t.recentConversations=r)}}catch{}return t},[n]);(0,d.useEffect)(()=>{let t=l.join(c.homedir(),`.stackone`,`agent_history`);try{if(s.existsSync(t)){let e=s.readFileSync(t,`utf-8`),n;try{let t=JSON.parse(e);n=Array.isArray(t)?t.filter(e=>typeof e==`string`&&e.trim()):e.split(`
26
27
  `).filter(e=>e.trim())}catch{n=e.split(`
27
28
  `).filter(e=>e.trim())}O(n)}}catch(t){a&&e.w.error(`[History] Failed to load command history:`,t)}},[a]);let Be=(0,d.useRef)([]);(0,d.useEffect)(()=>{(async()=>{let n={claudeSkills:{count:0,names:[],totalSize:0},mcpServers:[],toolCounts:{total:0,builtin:[],mcpByServer:{}},errors:[]};try{try{let e=(0,o.getAvailableSkillNames)(),t=(0,o.getBundledSkillsPath)();ee(e.map(e=>{let n=l.join(t,e,`SKILL.md`),r,i;try{if(s.existsSync(n)){let e=s.readFileSync(n,`utf-8`);i=e;let t=e.match(/^---\n([\s\S]*?)\n---/);if(t){let e=t[1].match(/description:\s*\|?\s*\n?([\s\S]*?)(?=\n\w+:|$)/);e&&(r=e[1].trim().split(`
28
- `)[0].trim())}}}catch{}return{name:e,description:r,content:i}})),n.claudeSkills={count:e.length,names:e,totalSize:0}}catch(t){e.w.error(`[Skills] Failed to load skills:`,t),n.errors.push(`Failed to load skills`)}try{let e=xe();Be.current=e;for(let t of e)n.mcpServers.push({name:t.name,count:0});let t=`fetch.extract_html_text.web_search.vector_search.get_external_integrations.analyze_external_integration.analyze_external_integrations.get_external_repos.scan_external_repo.search_external_repo.get_provider_coverage.get_providers.map_provider_key.get_stackone_actions.meta_feedback.get_stackone_categories.get_docs.get_stackone_expressions.extract_oas_actions.get_provider_actions.scramble_credentials.improve_descriptions.discover_actions.get_improve_descriptions_task_status.get_discover_actions_task_status.test_actions.get_test_actions_task_status.analyze_versioning.get_analyze_versioning_task_status.falcon_workflow.falcon_research.falcon_build.falcon_oauth.falcon_test.falcon_security`.split(`.`);n.mcpServers.push({name:`stackone`,count:t.length}),n.toolCounts.mcpByServer.stackone=t}catch(e){n.errors.push(`MCP: ${e instanceof Error?e.message:String(e)}`)}n.toolCounts.builtin=[`Read`,`Write`,`Edit`,`Glob`,`Grep`,`Bash`,`WebSearch`,`WebFetch`],n.toolCounts.total=n.toolCounts.builtin.length;try{X(Oe(await(await(0,o.createAgentSession)({prompt:``,mode:t,apiKey:f})).supportedCommands(),Ee))}catch(t){a&&e.w.warn(`[Commands] Failed to fetch harness commands:`,t)}je(n)}catch(t){e.w.error(`[Init] Failed to initialize runtime:`,t)}finally{T(!1)}})()},[f,t,a]),(0,d.useEffect)(()=>{me.current=pe},[pe]),(0,d.useEffect)(()=>{if(j&&!M){let e=j.input_tokens+j.output_tokens,t=(1e6-e)/1e6*100;if(t<10){let n={role:`system`,content:`⚠️ Context Warning\n\nYou have ${t.toFixed(1)}% context remaining (${(1e6-e).toLocaleString()} tokens).\n\nConsider using /compact to summarize the conversation and free up context.`,timestamp:new Date};m(e=>[...e,n]),N(!0)}}},[j,M]);let Ve=(0,d.useCallback)(async i=>{try{let e=h.current,a=e.filter(e=>e.role===`user`||e.role===`assistant`);if(a.length<2)return;let o=i.trim().slice(0,50)||a.find(e=>e.role===`user`)?.content?.slice(0,50)||`conversation`;await s.promises.mkdir(l.join(c.homedir(),`.stackone`,`conversations`),{recursive:!0});let u=Date.now(),d=`${u}-${o.replace(/[^a-zA-Z0-9]/g,`-`).toLowerCase().slice(0,50)}.json`,f=l.join(c.homedir(),`.stackone`,`conversations`,d);await s.promises.writeFile(f,JSON.stringify({title:o,timestamp:u,goal:i,messages:e.filter(e=>e.role!==`system`),mode:t,connector:n,action:r},null,2))}catch(t){e.w.error(`Failed to save conversation:`,t)}},[t,n,r]),He=async(e,t,n,r)=>{let i=[`research`,`discover-actions`,`build-and-validate`];ge(i.map(e=>({name:e,status:`pending`})));let o=new Map,u=l.join(c.homedir(),`.stackone`),d=l.join(u,`build-debug.log`);s.existsSync(u)||s.mkdirSync(u,{recursive:!0});let p=s.createWriteStream(d,{flags:`w`}),h=e=>{p.write(`${JSON.stringify({ts:new Date().toISOString(),...e})}\n`)};p.on(`error`,()=>{h=()=>{}}),h({event:`build_start`,provider:e,category:t,model:H,mcpServerCount:Be.current.length});let g=console.log,v=console.error;console.log=(...e)=>{h({event:`console_log`,args:e.map(String)})},console.error=(...e)=>{h({event:`console_error`,args:e.map(String)})};try{for await(let s of U({provider:e,category:t,apiKey:f,mcpServers:Be.current,verbose:a||!1,abortSignal:r})){if(!n())return;if(s.type===`agent_message`){let e=s.message;h({event:`agent_message`,phase:s.phase,msgType:e.type,...e.type===`text`&&{content:e.content},...e.type===`error`&&{error:e.error},...e.type===`tool_call`&&{toolName:e.toolName}})}else h({...s,timestamp:void 0});switch(s.type){case`phase_start`:ve(s.phase),ge(e=>(e||[]).map(e=>e.name===s.phase?{...e,status:`running`,model:s.model}:e));break;case`phase_complete`:{let e=s.result.warnings&&s.result.warnings.length>0,t=o.get(s.phase),n=t&&t.length>0,r=!s.result.success||n,a=r?`error`:e?`warning`:`complete`;ge(e=>(e||[]).map(e=>e.name===s.phase?{...e,status:a,durationMs:s.result.durationMs}:e)),r?x(Te(t&&t.length>0?t:[s.result.error||`Unknown error`],[s.phase],i)):e&&m(e=>[...e,{role:`system`,content:`⚠️ Phase "${s.phase}" completed with warnings:\n${s.result.warnings?.join(`
29
- `)}`,timestamp:new Date}]);break}case`phase_error`:ge(e=>(e||[]).map(e=>e.name===s.phase?{...e,status:`error`,durationMs:s.result?.durationMs}:e)),x(Te([s.error||`Unknown error`],[s.phase],i));break;case`phase_skipped`:ge(e=>(e||[]).map(e=>e.name===s.phase?{...e,status:`skipped`}:e));break;case`agent_message`:{let e=s.message;if(e.type===`text`){let t=e.content??``,n=we(t);if(n){let e=o.get(s.phase)??[];e.includes(n)||e.push(n),o.set(s.phase,e)}let r=Ce(t);A(e=>e+(r||``))}else if(e.type===`tool_call`){let t=`tc-${++J.current}`;Ae.current.push(t),A(e=>(e&&m(t=>[...t,{role:`assistant`,content:e,timestamp:new Date}]),``)),_(n=>{let r=new Map(n);return r.set(t,{name:e.toolName??``,status:`running`}),r})}else if(e.type===`tool_result`){let e=Ae.current.shift();e&&_(t=>{let n=new Map(t);return n.delete(e),n})}else e.type===`error`&&x(e.error??`Unknown error`);break}}}if(A(e=>{if(e){let t=we(e);if(t){let e=o.get(`_unattributed`)??[];e.includes(t)||e.push(t),o.set(`_unattributed`,e)}let n=Ce(e);n&&m(e=>[...e,{role:`assistant`,content:n,timestamp:new Date}])}return``}),o.size>0){let e=[...new Set([...o.values()].flat())],t=[...o.keys()].filter(e=>e!==`_unattributed`);ge(e=>(e||[]).map(e=>o.has(e.name)&&e.status===`complete`?{...e,status:`error`}:e)),x(Te(e,t,i))}ve(void 0)}catch(e){let t=e instanceof Error?e.message:String(e);h({event:`build_error`,error:t}),x(t)}finally{h({event:`build_end`,phaseErrors:Object.fromEntries(o)}),console.log=g,console.error=v,p.end(),ge(e=>(e||[]).map(e=>e.status===`pending`||e.status===`running`?{...e,status:`skipped`}:e)),y(!1),B(!1),me.current=!1,_(new Map)}},Ue=(0,d.useCallback)(async(i,u=!1)=>{if((w||me.current)&&!u){ue(e=>[...e,{content:i,timestamp:new Date}]),q.current&&clearTimeout(q.current),q.current=setTimeout(()=>{Ge()},3e4);return}if(x(void 0),C(!1),i===`/skills`){if(E.length===0){let e={role:`system`,content:`📚 No skills loaded. Skills will be loaded on startup.`,timestamp:new Date};m(t=>[...t,e]);return}F({type:`skills`,items:E.map(e=>({name:e.name,description:e.description,content:e.content}))});return}if(i===`/tools`){let e=[];for(let t of Y.mcpServers){let n=Y.toolCounts.mcpByServer[t.name]||[];for(let r of n)e.push({name:r,description:`MCP tool (${t.name})`,category:`MCP:${t.name}`})}let t=[...Y.toolCounts.builtin.map(e=>({name:e,description:`Built-in (from agent harness)`,category:`Built-in`})),...e,...Y.mcpServers.filter(e=>!Y.toolCounts.mcpByServer[e.name]?.length).map(e=>({name:e.name,description:e.name===`stackone`?`MCP server (${e.count} tools) - from agent harness`:`MCP server (${e.count} tools)`,category:`MCP`}))];F({type:`tools`,items:t.length>0?t:[{name:`—`,description:`Tools provided by harness (built-in + skills + MCP)`,category:``}]});return}if(i===`/commands`){let e=`📋 Available Commands:
29
+ `)[0].trim())}}}catch{}return{name:e,description:r,content:i}})),n.claudeSkills={count:e.length,names:e,totalSize:0}}catch(t){e.w.error(`[Skills] Failed to load skills:`,t),n.errors.push(`Failed to load skills`)}try{let e=Se();Be.current=e;for(let t of e)n.mcpServers.push({name:t.name,count:0});let t=`fetch.extract_html_text.web_search.vector_search.get_external_integrations.analyze_external_integration.analyze_external_integrations.get_external_repos.scan_external_repo.search_external_repo.get_provider_coverage.get_providers.map_provider_key.get_stackone_actions.meta_feedback.get_stackone_categories.get_docs.get_stackone_expressions.extract_oas_actions.get_provider_actions.scramble_credentials.improve_descriptions.discover_actions.get_improve_descriptions_task_status.get_discover_actions_task_status.test_actions.get_test_actions_task_status.analyze_versioning.get_analyze_versioning_task_status.falcon_workflow.falcon_research.falcon_build.falcon_oauth.falcon_test.falcon_security`.split(`.`);n.mcpServers.push({name:`stackone`,count:t.length}),n.toolCounts.mcpByServer.stackone=t}catch(e){n.errors.push(`MCP: ${e instanceof Error?e.message:String(e)}`)}n.toolCounts.builtin=[`Read`,`Write`,`Edit`,`Glob`,`Grep`,`Bash`,`WebSearch`,`WebFetch`],n.toolCounts.total=n.toolCounts.builtin.length;try{Ne(Ae(await(await(0,o.createAgentSession)({prompt:``,mode:t,apiKey:f})).supportedCommands(),Oe))}catch(t){a&&e.w.warn(`[Commands] Failed to fetch harness commands:`,t)}je(n)}catch(t){e.w.error(`[Init] Failed to initialize runtime:`,t)}finally{T(!1)}})()},[f,t,a]),(0,d.useEffect)(()=>{me.current=pe},[pe]),(0,d.useEffect)(()=>{if(j&&!M){let e=j.input_tokens+j.output_tokens,t=(1e6-e)/1e6*100;if(t<10){let n={role:`system`,content:`⚠️ Context Warning\n\nYou have ${t.toFixed(1)}% context remaining (${(1e6-e).toLocaleString()} tokens).\n\nConsider using /compact to summarize the conversation and free up context.`,timestamp:new Date};m(e=>[...e,n]),N(!0)}}},[j,M]);let Ve=(0,d.useCallback)(async i=>{try{let e=h.current,a=e.filter(e=>e.role===`user`||e.role===`assistant`);if(a.length<2)return;let o=i.trim().slice(0,50)||a.find(e=>e.role===`user`)?.content?.slice(0,50)||`conversation`;await s.promises.mkdir(l.join(c.homedir(),`.stackone`,`conversations`),{recursive:!0});let u=Date.now(),d=`${u}-${o.replace(/[^a-zA-Z0-9]/g,`-`).toLowerCase().slice(0,50)}.json`,f=l.join(c.homedir(),`.stackone`,`conversations`,d);await s.promises.writeFile(f,JSON.stringify({title:o,timestamp:u,goal:i,messages:e.filter(e=>e.role!==`system`),mode:t,connector:n,action:r},null,2))}catch(t){e.w.error(`Failed to save conversation:`,t)}},[t,n,r]),He=async(e,t,n,r)=>{let i=[`research`,`discover-actions`,`build-and-validate`];V(i.map(e=>({name:e,status:`pending`})));let o=new Map,u=l.join(c.homedir(),`.stackone`),d=l.join(u,`build-debug.log`);s.existsSync(u)||s.mkdirSync(u,{recursive:!0});let p=s.createWriteStream(d,{flags:`w`}),h=e=>{p.write(`${JSON.stringify({ts:new Date().toISOString(),...e})}\n`)};p.on(`error`,()=>{h=()=>{}}),h({event:`build_start`,provider:e,category:t,model:G,mcpServerCount:Be.current.length});let g=console.log,v=console.error;console.log=(...e)=>{h({event:`console_log`,args:e.map(String)})},console.error=(...e)=>{h({event:`console_error`,args:e.map(String)})};try{for await(let s of xe({provider:e,category:t,apiKey:f,mcpServers:Be.current,verbose:a||!1,abortSignal:r})){if(!n())return;if(s.type===`agent_message`){let e=s.message;h({event:`agent_message`,phase:s.phase,msgType:e.type,...e.type===`text`&&{content:e.content},...e.type===`error`&&{error:e.error},...e.type===`tool_call`&&{toolName:e.toolName}})}else h({...s,timestamp:void 0});switch(s.type){case`phase_start`:_e(s.phase),V(e=>(e||[]).map(e=>e.name===s.phase?{...e,status:`running`,model:s.model}:e));break;case`phase_complete`:{let e=s.result.warnings&&s.result.warnings.length>0,t=o.get(s.phase),n=t&&t.length>0,r=!s.result.success||n,a=r?`error`:e?`warning`:`complete`;V(e=>(e||[]).map(e=>e.name===s.phase?{...e,status:a,durationMs:s.result.durationMs}:e)),r?x(De(t&&t.length>0?t:[s.result.error||`Unknown error`],[s.phase],i)):e&&m(e=>[...e,{role:`system`,content:`⚠️ Phase "${s.phase}" completed with warnings:\n${s.result.warnings?.join(`
30
+ `)}`,timestamp:new Date}]);break}case`phase_error`:V(e=>(e||[]).map(e=>e.name===s.phase?{...e,status:`error`,durationMs:s.result?.durationMs}:e)),x(De([s.error||`Unknown error`],[s.phase],i));break;case`phase_skipped`:V(e=>(e||[]).map(e=>e.name===s.phase?{...e,status:`skipped`}:e));break;case`agent_message`:{let e=s.message;if(e.type===`text`){let t=e.content??``,n=Ee(t);if(n){let e=o.get(s.phase)??[];e.includes(n)||e.push(n),o.set(s.phase,e)}let r=Te(t);A(e=>e+(r||``))}else if(e.type===`tool_call`){let t=`tc-${++ke.current}`;we.current.push(t),A(e=>(e&&m(t=>[...t,{role:`assistant`,content:e,timestamp:new Date}]),``)),_(n=>{let r=new Map(n);return r.set(t,{name:e.toolName??``,status:`running`}),r})}else if(e.type===`tool_result`){let e=we.current.shift();e&&_(t=>{let n=new Map(t);return n.delete(e),n})}else e.type===`error`&&x(e.error??`Unknown error`);break}}}if(A(e=>{if(e){let t=Ee(e);if(t){let e=o.get(`_unattributed`)??[];e.includes(t)||e.push(t),o.set(`_unattributed`,e)}let n=Te(e);n&&m(e=>[...e,{role:`assistant`,content:n,timestamp:new Date}])}return``}),o.size>0){let e=[...new Set([...o.values()].flat())],t=[...o.keys()].filter(e=>e!==`_unattributed`);V(e=>(e||[]).map(e=>o.has(e.name)&&e.status===`complete`?{...e,status:`error`}:e)),x(De(e,t,i))}_e(void 0)}catch(e){let t=e instanceof Error?e.message:String(e);h({event:`build_error`,error:t}),x(t)}finally{h({event:`build_end`,phaseErrors:Object.fromEntries(o)}),console.log=g,console.error=v,p.end(),V(e=>(e||[]).map(e=>e.status===`pending`||e.status===`running`?{...e,status:`skipped`}:e)),y(!1),B(!1),me.current=!1,_(new Map)}},Ue=(0,d.useCallback)(async(i,u=!1)=>{if((w||me.current)&&!u){ue(e=>[...e,{content:i,timestamp:new Date}]),U.current&&clearTimeout(U.current),U.current=setTimeout(()=>{Ge()},3e4);return}if(x(void 0),C(!1),i===`/skills`){if(E.length===0){let e={role:`system`,content:`📚 No skills loaded. Skills will be loaded on startup.`,timestamp:new Date};m(t=>[...t,e]);return}F({type:`skills`,items:E.map(e=>({name:e.name,description:e.description,content:e.content}))});return}if(i===`/tools`){let e=[];for(let t of Y.mcpServers){let n=Y.toolCounts.mcpByServer[t.name]||[];for(let r of n)e.push({name:r,description:`MCP tool (${t.name})`,category:`MCP:${t.name}`})}let t=[...Y.toolCounts.builtin.map(e=>({name:e,description:`Built-in (from agent harness)`,category:`Built-in`})),...e,...Y.mcpServers.filter(e=>!Y.toolCounts.mcpByServer[e.name]?.length).map(e=>({name:e.name,description:e.name===`stackone`?`MCP server (${e.count} tools) - from agent harness`:`MCP server (${e.count} tools)`,category:`MCP`}))];F({type:`tools`,items:t.length>0?t:[{name:`—`,description:`Tools provided by harness (built-in + skills + MCP)`,category:``}]});return}if(i===`/commands`){let e=`📋 Available Commands:
30
31
 
31
32
  `;for(let t of Me){let n=t.argumentHint?` ${t.argumentHint}`:``;e+=` /${t.name}${n} - ${t.description}\n`}let t={role:`system`,content:e,timestamp:new Date};m(e=>[...e,t]);return}if(i===`/exit`&&process.exit(0),i===`/instructions`){let e=[`📜 Active Instructions
32
33
  `];if(E.length>0){e.push(`Skills Loaded (${E.length}):`);for(let t of E)e.push(` • ${t.name}${t.description?` - ${t.description}`:``}`);e.push(``)}e.push(`Session Context:`),e.push(` • Mode: ${t}`),n&&e.push(` • Connector: ${n}`),r&&e.push(` • Action: ${r}`),e.push(` • Turn Count: ${ie}`),e.push(``);let i={instructions:`Mode: ${t}\nSkills: ${E.map(e=>e.name).join(`, `)||`none`}\nConnector: ${n||`none`}`,skills:E.map(e=>({name:e.name,description:e.description,enabled:!0})),session:{id:`current`,startedAt:re,mode:t,turnCount:ie}},a=te.current.render(`instructions`,i);a?.content&&e.push(a.content);let o={role:`system`,content:e.join(`
@@ -46,10 +47,10 @@ Folders are automatically trusted when you open a chat session in them.`,timesta
46
47
 
47
48
  `),t=e.length>2e3?e.slice(0,2e3)+`
48
49
 
49
- [... truncated for context]`:e;y(!1);let n={role:`system`,content:`🗜️ Compact mode activated - recent context:\n\n${t}`,timestamp:new Date};m(e=>[e[e.length-1],n])}catch(e){y(!1),x(e instanceof Error?e.message:`Failed to summarize conversation`)}return}O(t=>{let n=i.trim();if(!n)return t;let r=[...t,n],o=r.length-1;Pe.current=o,Ne.current.has(o)||Ne.current.set(o,{commandIndex:o,command:n,timestamp:Date.now(),files:new Map});let u=l.join(c.homedir(),`.stackone`,`agent_history`);try{let e=l.dirname(u);s.existsSync(e)||s.mkdirSync(e,{recursive:!0});let t=r.slice(-1e3);s.writeFileSync(u,JSON.stringify(t),`utf-8`)}catch(t){a&&e.w.error(`[History] Failed to save command history:`,t)}return r});let g={role:`user`,content:i,timestamp:new Date};m(e=>[...e,g]),y(!0),B(!0),ae(e=>e+1),V.current.requestId+=1,V.current.shouldStop=!1,V.current.controller=new AbortController;let v=V.current.requestId,b=V.current.controller.signal;ke.current&&=(clearTimeout(ke.current),null),De([]);let S=()=>!V.current.shouldStop&&V.current.requestId===v;try{let s=p.filter(e=>(e.role===`user`||e.role===`assistant`)&&!e.isSubagent).map(e=>({role:e.role,content:e.content})).slice(-20).map(e=>`${e.role}: ${e.content.slice(0,500)}`).join(`
50
- `);Ae.current=[],J.current=0;let c=(0,o.extractBuildIntent)(i);if(t===`build`&&c.isConnectorBuild&&c.provider){await He(c.provider,c.category,S,b);return}try{a&&(e.w.log(`
50
+ [... truncated for context]`:e;y(!1);let n={role:`system`,content:`🗜️ Compact mode activated - recent context:\n\n${t}`,timestamp:new Date};m(e=>[e[e.length-1],n])}catch(e){y(!1),x(e instanceof Error?e.message:`Failed to summarize conversation`)}return}O(t=>{let n=i.trim();if(!n)return t;let r=[...t,n],o=r.length-1;Pe.current=o,X.current.has(o)||X.current.set(o,{commandIndex:o,command:n,timestamp:Date.now(),files:new Map});let u=l.join(c.homedir(),`.stackone`,`agent_history`);try{let e=l.dirname(u);s.existsSync(e)||s.mkdirSync(e,{recursive:!0});let t=r.slice(-1e3);s.writeFileSync(u,JSON.stringify(t),`utf-8`)}catch(t){a&&e.w.error(`[History] Failed to save command history:`,t)}return r});let g={role:`user`,content:i,timestamp:new Date};m(e=>[...e,g]),y(!0),B(!0),ae(e=>e+1),ve.current.requestId+=1,ve.current.shouldStop=!1,ve.current.controller=new AbortController;let v=ve.current.requestId,b=ve.current.controller.signal;J.current&&=(clearTimeout(J.current),null),K([]);let S=()=>!ve.current.shouldStop&&ve.current.requestId===v;try{let s=p.filter(e=>(e.role===`user`||e.role===`assistant`)&&!e.isSubagent).map(e=>({role:e.role,content:e.content})).slice(-20).map(e=>`${e.role}: ${e.content.slice(0,500)}`).join(`
51
+ `);we.current=[],ke.current=0;let c=(0,o.extractBuildIntent)(i);if(t===`build`&&c.isConnectorBuild&&c.provider){await He(c.provider,c.category,S,b);return}try{a&&(e.w.log(`
51
52
  [AGENT:CONFIG] ═══════════════════════════════════════`),e.w.log(`[AGENT:CONFIG] Prompt: "${i.slice(0,100)}..."`),e.w.log(`[AGENT:CONFIG] Mode: ${t}`),e.w.log(`[AGENT:CONFIG] MCP Servers: ${Be.current.map(e=>e.name).join(`, `)||`none`}`),e.w.log(`[AGENT:CONFIG] API Key: ${f?`${f.slice(0,15)}...`:`MISSING`}`),e.w.log(`[AGENT:CONFIG] Context keys: ${Object.keys({connector:n,action:r}).filter(e=>({connector:n,action:r})[e]).join(`, `)||`none`}`),e.w.log(`[AGENT:CONFIG] Max turns: 1000`),e.w.log(`[AGENT:CONFIG] ═══════════════════════════════════════
52
- `));let c=0,l=Date.now();for await(let u of(0,o.executeAgent)({prompt:i,mode:t,mcpServers:Be.current,apiKey:f,context:{connector:n,action:r,conversationSummary:s||void 0},maxTurns:1e3,verbose:a||!1,streaming:!1,origin:`cli`,abortSignal:b,cliVersion:G()})){c++;let t=Date.now()-l;if(a){let n=u.type===`text`?` content="${(u.content||``).slice(0,30)}..."`:u.type===`error`?` error="${u.error}"`:u.type===`tool_call`?` tool="${u.toolName}"`:``;e.w.log(`[AGENT:MSG #${c}] type=${u.type}${n} (${t}ms)`)}if(!S())return;if(u.type===`text`){Z.current.phase=`streaming`,A(e=>e+(u.content??``)),We();continue}if(u.type===`skill_invocation`){let e=`skill-${++J.current}`;_(t=>{let n=new Map(t);return n.set(e,{name:`Skill`,status:`running`,skillName:u.skillName,inputSummary:u.skillArgs}),n}),setTimeout(()=>{_(t=>{let n=new Map(t);return n.delete(e),n})},2e3);continue}if(u.type===`tool_call`){Z.current={operation:`Processing: "${i.slice(0,100)}${i.length>100?`...`:``}"`,phase:`tool_execution`,toolName:u.toolName,toolInput:u.toolInput};let e=`tc-${++J.current}`;if(Ae.current.push(e),W(t=>[...t,{id:e,name:u.toolName??``,input:u.toolInput,output:void 0}]),u.toolName===`spawn_subagent`&&u.toolInput){let e=u.toolInput,t=e.description??e.goal??e.name??`Subagent`;if(typeof t==`string`&&t.length>50){let e=String(t).split(/[.!?]/)[0];t=e.length>50?e.slice(0,47)+`...`:e}oe(String(t)),R.current=!0,setTimeout(()=>L(!0),10)}let t=u.toolInput,n=``;t&&typeof t==`object`&&(t.command?n=String(t.command).slice(0,100):t.file_path?n=String(t.file_path):t.pattern?n=String(t.pattern):t.url?n=String(t.url):t.query&&(n=String(t.query))),A(e=>(e&&m(t=>[...t,{role:`assistant`,content:e,timestamp:new Date,isSubagent:R.current}]),``)),_(t=>{let r=new Map(t);return r.set(e,{name:u.toolName??``,status:`running`,inputSummary:n}),r});continue}if(u.type===`tool_result`){Z.current={...Z.current,phase:`streaming`,toolName:void 0,toolInput:void 0};let e=Ae.current.shift();if(e){W(t=>t.map(t=>t.id===e?{...t,output:u.toolResult}:t));let t=``;_(n=>{let r=n.get(e);r?.inputSummary&&(t=r.inputSummary);let i=new Map(n);return i.delete(e),i});let n=typeof u.toolResult==`string`?u.toolResult:JSON.stringify(u.toolResult,null,2),r={role:`system`,content:`TOOL:${u.toolName}|||${t}|||${n}`,timestamp:new Date,isSubagent:R.current};m(e=>[...e,r])}continue}if(u.type===`tool_progress`){let e=u.progress;u.toolName&&_(t=>{let n=new Map(t);for(let[t,r]of n)if(r.name===u.toolName){n.set(t,{...r,inputSummary:e?.operation||r.inputSummary});break}return n});continue}if(u.type===`tool_error`){Z.current={...Z.current,phase:`streaming`,toolName:void 0,toolInput:void 0};let e=Ae.current.shift();e&&(W(t=>t.map(t=>t.id===e?{...t,output:`Error: ${u.error}`}:t)),_(t=>{let n=new Map(t);return n.delete(e),n}));continue}if(u.type===`error`){let t=u.error??`Unknown error`,n=t;if(a){e.w.log(`
53
+ `));let c=0,l=Date.now();for await(let u of(0,o.executeAgent)({prompt:i,mode:t,mcpServers:Be.current,apiKey:f,context:{connector:n,action:r,conversationSummary:s||void 0},maxTurns:1e3,verbose:a||!1,streaming:!1,origin:`cli`,abortSignal:b,cliVersion:q()})){c++;let t=Date.now()-l;if(a){let n=u.type===`text`?` content="${(u.content||``).slice(0,30)}..."`:u.type===`error`?` error="${u.error}"`:u.type===`tool_call`?` tool="${u.toolName}"`:``;e.w.log(`[AGENT:MSG #${c}] type=${u.type}${n} (${t}ms)`)}if(!S())return;if(u.type===`text`){Z.current.phase=`streaming`,A(e=>e+(u.content??``)),We();continue}if(u.type===`skill_invocation`){let e=`skill-${++ke.current}`;_(t=>{let n=new Map(t);return n.set(e,{name:`Skill`,status:`running`,skillName:u.skillName,inputSummary:u.skillArgs}),n}),setTimeout(()=>{_(t=>{let n=new Map(t);return n.delete(e),n})},2e3);continue}if(u.type===`tool_call`){Z.current={operation:`Processing: "${i.slice(0,100)}${i.length>100?`...`:``}"`,phase:`tool_execution`,toolName:u.toolName,toolInput:u.toolInput};let e=`tc-${++ke.current}`;if(we.current.push(e),be(t=>[...t,{id:e,name:u.toolName??``,input:u.toolInput,output:void 0}]),u.toolName===`spawn_subagent`&&u.toolInput){let e=u.toolInput,t=e.description??e.goal??e.name??`Subagent`;if(typeof t==`string`&&t.length>50){let e=String(t).split(/[.!?]/)[0];t=e.length>50?e.slice(0,47)+`...`:e}R(String(t)),I.current=!0,setTimeout(()=>se(!0),10)}let t=u.toolInput,n=``;t&&typeof t==`object`&&(t.command?n=String(t.command).slice(0,100):t.file_path?n=String(t.file_path):t.pattern?n=String(t.pattern):t.url?n=String(t.url):t.query&&(n=String(t.query))),A(e=>(e&&m(t=>[...t,{role:`assistant`,content:e,timestamp:new Date,isSubagent:I.current}]),``)),_(t=>{let r=new Map(t);return r.set(e,{name:u.toolName??``,status:`running`,inputSummary:n}),r});continue}if(u.type===`tool_result`){Z.current={...Z.current,phase:`streaming`,toolName:void 0,toolInput:void 0};let e=we.current.shift();if(e){be(t=>t.map(t=>t.id===e?{...t,output:u.toolResult}:t));let t=``;_(n=>{let r=n.get(e);r?.inputSummary&&(t=r.inputSummary);let i=new Map(n);return i.delete(e),i});let n=typeof u.toolResult==`string`?u.toolResult:JSON.stringify(u.toolResult,null,2),r={role:`system`,content:`TOOL:${u.toolName}|||${t}|||${n}`,timestamp:new Date,isSubagent:I.current};m(e=>[...e,r])}continue}if(u.type===`tool_progress`){let e=u.progress;u.toolName&&_(t=>{let n=new Map(t);for(let[t,r]of n)if(r.name===u.toolName){n.set(t,{...r,inputSummary:e?.operation||r.inputSummary});break}return n});continue}if(u.type===`tool_error`){Z.current={...Z.current,phase:`streaming`,toolName:void 0,toolInput:void 0};let e=we.current.shift();e&&(be(t=>t.map(t=>t.id===e?{...t,output:`Error: ${u.error}`}:t)),_(t=>{let n=new Map(t);return n.delete(e),n}));continue}if(u.type===`error`){let t=u.error??`Unknown error`,n=t;if(a){e.w.log(`
53
54
  [AGENT:ERROR] ═══════════════════════════════════════`),e.w.log(`[AGENT:ERROR] Message: ${t}`),e.w.log(`[AGENT:ERROR] Full message object:`);try{e.w.log(JSON.stringify(u,null,2))}catch{e.w.log(`[AGENT:ERROR] (could not stringify message)`)}e.w.log(`[AGENT:ERROR] Messages received before error: ${c}`),e.w.log(`[AGENT:ERROR] Time elapsed: ${Date.now()-l}ms`),e.w.log(`[AGENT:ERROR] ═══════════════════════════════════════
54
55
  `)}t.includes(`exited with code 1`)?n=`Agent subprocess failed (exit code 1).
55
56
 
@@ -72,9 +73,9 @@ Original error: ${t}`:(t.includes(`ENOTFOUND`)||t.includes(`ECONNREFUSED`)||t.in
72
73
 
73
74
  Original error: ${t}`),x(n),Z.current={operation:``,phase:`idle`};continue}if(u.type===`done`){if(a){let t=Date.now()-l;e.w.log(`
74
75
  [AGENT:DONE] ═══════════════════════════════════════`),e.w.log(`[AGENT:DONE] Total messages received: ${c}`),e.w.log(`[AGENT:DONE] Total time: ${t}ms`),e.w.log(`[AGENT:DONE] Status: ${u.status||`unknown`}`),c<=2&&e.w.log(`[AGENT:DONE] ⚠️ WARNING: Very few messages - agent may have failed early`),e.w.log(`[AGENT:DONE] ═══════════════════════════════════════
75
- `)}Z.current={operation:``,phase:`idle`},y(!1),_(new Map),W([]);let t=R.current;A(e=>(e&&m(n=>[...n,{role:`assistant`,content:e,timestamp:new Date,isSubagent:t}]),``)),t?(R.current=!1,setTimeout(()=>{m(t=>{let n=t.filter(e=>e.isSubagent&&e.role===`assistant`).map(e=>e.content).join(`
76
+ `)}Z.current={operation:``,phase:`idle`},y(!1),_(new Map),be([]);let t=I.current;A(e=>(e&&m(n=>[...n,{role:`assistant`,content:e,timestamp:new Date,isSubagent:t}]),``)),t?(I.current=!1,setTimeout(()=>{m(t=>{let n=t.filter(e=>e.isSubagent&&e.role===`assistant`).map(e=>e.content).join(`
76
77
 
77
- `);return n?.trim()?setTimeout(()=>{ce(!1),L(!1),setTimeout(()=>{try{Ue(n,!0)}catch(t){e.w.error(`[SUBAGENT] Error:`,t),B(!1)}},100)},300):(ce(!1),L(!1),B(!1)),t})},100)):B(!1),await Ve(i)}}}catch(e){if(!S())return;y(!1),_(new Map),x(Re(e instanceof Error?e.message:String(e),a||!1)),Z.current={operation:``,phase:`idle`}}S()&&(y(!1),_(new Map),B(!1),W([]),Z.current={operation:``,phase:`idle`})}catch(t){if(!S()){a&&e.w.log(`[STREAM] Ignoring error from interrupted request:`,t instanceof Error?t.message:String(t));return}y(!1),_(new Map),B(!1),W([]);let n=t instanceof Error?t.message:String(t);n.toLowerCase().includes(`cloudfront`)||n.includes(`403`)&&n.includes(`Request blocked`)?x(`⚠️ Request temporarily blocked by CloudFront
78
+ `);return n?.trim()?setTimeout(()=>{ce(!1),se(!1),setTimeout(()=>{try{Ue(n,!0)}catch(t){e.w.error(`[SUBAGENT] Error:`,t),B(!1)}},100)},300):(ce(!1),se(!1),B(!1)),t})},100)):B(!1),await Ve(i)}}}catch(e){if(!S())return;y(!1),_(new Map),x(Re(e instanceof Error?e.message:String(e),a||!1)),Z.current={operation:``,phase:`idle`}}S()&&(y(!1),_(new Map),B(!1),be([]),Z.current={operation:``,phase:`idle`})}catch(t){if(!S()){a&&e.w.log(`[STREAM] Ignoring error from interrupted request:`,t instanceof Error?t.message:String(t));return}y(!1),_(new Map),B(!1),be([]);let n=t instanceof Error?t.message:String(t);n.toLowerCase().includes(`cloudfront`)||n.includes(`403`)&&n.includes(`Request blocked`)?x(`⚠️ Request temporarily blocked by CloudFront
78
79
 
79
80
  The API server's firewall blocked this request. This usually happens due to:
80
81
  • Rate limiting (too many requests in a short time)
@@ -95,19 +96,19 @@ To fix this:
95
96
 
96
97
  Original error: ${n}`):n.includes(`API key`)||n.includes(`Invalid API Key`)?(e.w.error(`
97
98
  ❌ Critical error:`,n),e.w.error(`Please check your configuration and try again.
98
- `),process.exit(1)):x(Re(n,a||!1)),Z.current={operation:``,phase:`idle`},B(!1),y(!1),_(new Map)}},[w,p,i,t,n,r,j,M,f,I,Ve]);(0,d.useEffect)(()=>{w||i&&Ue(i)},[w,i,t,Y]);let We=()=>{ue(e=>(e.length===0||_(e=>(!(e.size>0)&&me.current&&(q.current&&=(clearTimeout(q.current),null),setTimeout(()=>Ge(),100)),e)),e))},Ge=()=>{ue(e=>{if(e.length===0)return e;fe(!0),A(e=>{if(e){let t={role:`assistant`,content:e,timestamp:new Date,isSubagent:R.current};m(e=>[...e,t])}return``});let t=e.map(e=>({role:`user`,content:e.content,timestamp:new Date}));m(e=>[...e,...t]);let n=e.map(e=>e.content).join(`
99
+ `),process.exit(1)):x(Re(n,a||!1)),Z.current={operation:``,phase:`idle`},B(!1),y(!1),_(new Map)}},[w,p,i,t,n,r,j,M,f,oe,Ve]);(0,d.useEffect)(()=>{w||i&&Ue(i)},[w,i,t,Y]);let We=()=>{ue(e=>(e.length===0||_(e=>(!(e.size>0)&&me.current&&(U.current&&=(clearTimeout(U.current),null),setTimeout(()=>Ge(),100)),e)),e))},Ge=()=>{ue(e=>{if(e.length===0)return e;fe(!0),A(e=>{if(e){let t={role:`assistant`,content:e,timestamp:new Date,isSubagent:I.current};m(e=>[...e,t])}return``});let t=e.map(e=>({role:`user`,content:e.content,timestamp:new Date}));m(e=>[...e,...t]);let n=e.map(e=>e.content).join(`
99
100
 
100
101
  ---
101
102
 
102
- `);return fe(!1),B(!1),W([]),q.current&&=(clearTimeout(q.current),null),setTimeout(()=>{Ue(n,!0)},100),[]})},Ke=(0,d.useCallback)(async e=>{let{removeTrustedFolder:t,getTrustedFoldersForDisplay:n}=await Promise.resolve().then(()=>require(`./trustedFolders-C3hB4Qg3.cjs`));t(e);let r=n();r.length===0?F(null):F({type:`trust`,items:r.map(e=>({name:e.name,description:e.path,path:e.path,trusted:e.trusted,trustedAt:e.trustedAt}))})},[F]);(0,d.useEffect)(()=>{let e=E.map(e=>e.name);ne.current.setActiveSkills(e)},[E]),(0,d.useEffect)(()=>{if(!w&&le.length>0){let e=setTimeout(()=>{We()},100);return()=>clearTimeout(e)}},[w,le.length]);let qe=()=>{},Je=(0,d.useCallback)(()=>{V.current.shouldStop=!0,V.current.controller?.abort(),C(!0),A(e=>{if(e){let t=R.current,n={role:`assistant`,content:e,timestamp:new Date,isSubagent:t};m(e=>[...e,n])}return``}),y(!1),B(!1),me.current=!1,_(new Map),W([]),m(e=>e.map(e=>{if(e.content.startsWith(`TOOL_START:`)){let t=e.content.split(`|||`)[1]||`unknown`;return{...e,content:`TOOL:${t}|||[Interrupted]|||`}}return e})),ue([]),De([]),fe(!1),ke.current&&=(clearTimeout(ke.current),null)},[]),Ye=(0,d.useCallback)(e=>{Le.current&&=(Le.current.resolve(e),null),Ie(null)},[]);return w?d.default.createElement(ye,{title:`Agent ${t.charAt(0).toUpperCase()+t.slice(1)} Mode`,mode:t,connector:n,action:r,messages:[],currentToolCalls:[],isThinking:!1,isComplete:!1,error:void 0,isInterrupted:!1,onSubmit:()=>{},onExit:qe,onStop:Je,slashCommands:Me,welcomeContext:ze}):d.default.createElement(ye,{title:`Agent ${t.charAt(0).toUpperCase()+t.slice(1)} Mode`,mode:t,connector:n,action:r,messages:p,currentToolCalls:Array.from(g.values()),isThinking:v,isComplete:!1,error:b,isInterrupted:S,onSubmit:Ue,onExit:qe,onStop:Je,commandHistory:D,streamingText:k,usage:j,detailViewData:P,onCloseDetailView:()=>F(null),onToggleTrust:Ke,slashCommands:Me,buildPhases:he,currentBuildPhase:_e,onRewindTo:e=>{try{let t=l.join(c.homedir(),`.stackone`,`agent_history`),n=s.readFileSync(t,`utf-8`),r;try{let e=JSON.parse(n);r=Array.isArray(e)?e.filter(e=>typeof e==`string`&&e.trim()):n.split(`
103
+ `);return fe(!1),B(!1),be([]),U.current&&=(clearTimeout(U.current),null),setTimeout(()=>{Ue(n,!0)},100),[]})},Ke=(0,d.useCallback)(async e=>{let{removeTrustedFolder:t,getTrustedFoldersForDisplay:n}=await Promise.resolve().then(()=>require(`./trustedFolders-C3hB4Qg3.cjs`));t(e);let r=n();r.length===0?F(null):F({type:`trust`,items:r.map(e=>({name:e.name,description:e.path,path:e.path,trusted:e.trusted,trustedAt:e.trustedAt}))})},[F]);(0,d.useEffect)(()=>{let e=E.map(e=>e.name);ne.current.setActiveSkills(e)},[E]),(0,d.useEffect)(()=>{if(!w&&le.length>0){let e=setTimeout(()=>{We()},100);return()=>clearTimeout(e)}},[w,le.length]);let qe=()=>{},Je=(0,d.useCallback)(()=>{ve.current.shouldStop=!0,ve.current.controller?.abort(),C(!0),A(e=>{if(e){let t=I.current,n={role:`assistant`,content:e,timestamp:new Date,isSubagent:t};m(e=>[...e,n])}return``}),y(!1),B(!1),me.current=!1,_(new Map),be([]),m(e=>e.map(e=>{if(e.content.startsWith(`TOOL_START:`)){let t=e.content.split(`|||`)[1]||`unknown`;return{...e,content:`TOOL:${t}|||[Interrupted]|||`}}return e})),ue([]),K([]),fe(!1),J.current&&=(clearTimeout(J.current),null)},[]),Ye=(0,d.useCallback)(e=>{Le.current&&=(Le.current.resolve(e),null),Ie(null)},[]);return w?d.default.createElement(H,{title:`Agent ${t.charAt(0).toUpperCase()+t.slice(1)} Mode`,mode:t,connector:n,action:r,messages:[],currentToolCalls:[],isThinking:!1,isComplete:!1,error:void 0,isInterrupted:!1,onSubmit:()=>{},onExit:qe,onStop:Je,slashCommands:Me,welcomeContext:ze}):d.default.createElement(H,{title:`Agent ${t.charAt(0).toUpperCase()+t.slice(1)} Mode`,mode:t,connector:n,action:r,messages:p,currentToolCalls:Array.from(g.values()),isThinking:v,isComplete:!1,error:b,isInterrupted:S,onSubmit:Ue,onExit:qe,onStop:Je,commandHistory:D,streamingText:k,usage:j,detailViewData:P,onCloseDetailView:()=>F(null),onToggleTrust:Ke,slashCommands:Me,buildPhases:he,currentBuildPhase:ge,onRewindTo:e=>{try{let t=l.join(c.homedir(),`.stackone`,`agent_history`),n=s.readFileSync(t,`utf-8`),r;try{let e=JSON.parse(n);r=Array.isArray(e)?e.filter(e=>typeof e==`string`&&e.trim()):n.split(`
103
104
  `).filter(e=>e.trim())}catch{r=n.split(`
104
- `).filter(e=>e.trim())}let i=new Map,a=[],o=[],u=[],d=Array.from(Ne.current.keys()).filter(t=>t>e).sort((e,t)=>e-t);for(let e of d){let t=Ne.current.get(e);if(t)for(let[e,n]of t.files)i.has(e)||i.set(e,n)}for(let[e,t]of i){let n=K(e,t);n.success?n.action===`deleted`?o.push(e):a.push(e):u.push(`${e}: ${n.error}`)}for(let e of d)Ne.current.delete(e);Pe.current=e;let f=r.slice(0,e+1);s.writeFileSync(t,JSON.stringify(f),`utf-8`);let p=`⏮️ Rewound to command: "${r[e]}"`;if(a.length>0||o.length>0){if(p+=`
105
+ `).filter(e=>e.trim())}let i=new Map,a=[],o=[],u=[],d=Array.from(X.current.keys()).filter(t=>t>e).sort((e,t)=>e-t);for(let e of d){let t=X.current.get(e);if(t)for(let[e,n]of t.files)i.has(e)||i.set(e,n)}for(let[e,t]of i){let n=Ce(e,t);n.success?n.action===`deleted`?o.push(e):a.push(e):u.push(`${e}: ${n.error}`)}for(let e of d)X.current.delete(e);Pe.current=e;let f=r.slice(0,e+1);s.writeFileSync(t,JSON.stringify(f),`utf-8`);let p=`⏮️ Rewound to command: "${r[e]}"`;if(a.length>0||o.length>0){if(p+=`
105
106
 
106
107
  📁 File changes:`,a.length>0){p+=`\n Restored (${a.length}):`;for(let e of a.slice(0,10))p+=`\n • ${l.basename(e)}`;a.length>10&&(p+=`\n ... and ${a.length-10} more`)}if(o.length>0){p+=`\n Deleted (${o.length}):`;for(let e of o.slice(0,10))p+=`\n • ${l.basename(e)}`;o.length>10&&(p+=`\n ... and ${o.length-10} more`)}}else p+=`
107
108
 
108
- 📁 No file changes to restore.`;if(u.length>0){p+=`\n\n⚠️ Errors (${u.length}):`;for(let e of u.slice(0,5))p+=`\n • ${e}`}let h={role:`system`,content:p,timestamp:new Date};m(e=>[...e,h]),O(f)}catch(e){let t={role:`system`,content:`❌ Error rewinding: ${e instanceof Error?e.message:String(e)}`,timestamp:new Date};m(e=>[...e,t])}},onResumeConversation:e=>{m(e.map(e=>({...e,timestamp:new Date(e.timestamp)})))},spawnedSubagentActive:I,spawnedSubagentName:z,spawnedSubagentComplete:se,queuedMessages:le,isProcessingQueue:de,initInfo:Y,welcomeContext:ze,pendingDeleteConfirmation:Fe,onConfirmDelete:Ye})};var Ae=class{async execute(t){if(!process.execArgv.some(e=>e.startsWith(`--max-old-space-size`))){let{spawn:e}=await import(`child_process`);e(process.execPath,[`--max-old-space-size=8192`,...process.argv.slice(1)],{stdio:`inherit`,env:process.env}).on(`exit`,e=>{process.exit(e||0)});return}process.stdout.write(`\x1Bc`);let{getAgentApiKey:n,getAgentCredentialStatus:r,CredentialExpiredError:a,CredentialMissingError:o}=await Promise.resolve().then(()=>require(`./agentApiKey-BhO6uR40.cjs`)),{hasOldSetupFiles:f,migrateFromLocalSetup:p,displayMigrationMessage:m}=await Promise.resolve().then(()=>require(`./setupMigration-BAPr-YQq.cjs`));try{let i=process.cwd(),a=n();f(i)&&m(await p(i,a));let o=r(),h=o.status===`expiring_soon`?o.timeRemaining:void 0;process.env.STACKONE_AGENT_TOKEN||(process.env.STACKONE_AGENT_TOKEN=a);let g=l.join(c.homedir(),`.stackone`,`trusted_directories`),_=[];try{s.existsSync(g)&&(_=s.readFileSync(g,`utf-8`).split(`
109
- `).filter(e=>e.trim()))}catch(t){e.w.error(`[Trust] Failed to load trusted directories:`,t)}if(!_.includes(i)){let t=!1,{addTrustedFolder:n}=await Promise.resolve().then(()=>require(`./trustedFolders-C3hB4Qg3.cjs`)),{waitUntilExit:r}=(0,u.render)(d.default.createElement(be,{directory:i,onConfirm:()=>{t=!0,n(i)},onCancel:()=>{t=!1}}));await r(),t||(e.w.log(`
110
- Exiting...`),process.exit(0)),process.stdout.write(`\x1Bc`)}let v=a;if(h){let e={current:`ignore`},{waitUntilExit:t}=(0,u.render)(d.default.createElement(V,{timeRemaining:h,onRunSetup:()=>{e.current=`setup`},onIgnore:()=>{e.current=`ignore`}}));if(await t(),e.current===`setup`){process.stdout.write(`\x1Bc`);let{spawnSync:e}=await import(`node:child_process`),t=e(process.execPath,[process.argv[1],`agent`,`setup`],{stdio:`inherit`});t.status!==0&&process.exit(t.status??1);let r=n();process.env.STACKONE_AGENT_TOKEN=r,v=r}process.stdout.write(`\x1Bc`)}let{waitUntilExit:y}=(0,u.render)(d.default.createElement(ke,{...t,apiKey:v}),{exitOnCtrlC:!1});await y()}catch(t){t instanceof a&&(e.w.error(`
109
+ 📁 No file changes to restore.`;if(u.length>0){p+=`\n\n⚠️ Errors (${u.length}):`;for(let e of u.slice(0,5))p+=`\n • ${e}`}let h={role:`system`,content:p,timestamp:new Date};m(e=>[...e,h]),O(f)}catch(e){let t={role:`system`,content:`❌ Error rewinding: ${e instanceof Error?e.message:String(e)}`,timestamp:new Date};m(e=>[...e,t])}},onResumeConversation:e=>{m(e.map(e=>({...e,timestamp:new Date(e.timestamp)})))},spawnedSubagentActive:oe,spawnedSubagentName:L,spawnedSubagentComplete:z,queuedMessages:le,isProcessingQueue:de,initInfo:Y,welcomeContext:ze,pendingDeleteConfirmation:Fe,onConfirmDelete:Ye})};var je=class{async execute(t){if(!process.execArgv.some(e=>e.startsWith(`--max-old-space-size`))){let{spawn:e}=await import(`child_process`);e(process.execPath,[`--max-old-space-size=8192`,...process.argv.slice(1)],{stdio:`inherit`,env:process.env}).on(`exit`,e=>{process.exit(e||0)});return}process.stdout.write(`\x1Bc`);let{getAgentApiKey:n,getAgentCredentialStatus:r,CredentialExpiredError:a,CredentialMissingError:o}=await Promise.resolve().then(()=>require(`./agentApiKey-BhO6uR40.cjs`)),{hasOldSetupFiles:f,migrateFromLocalSetup:p,displayMigrationMessage:m}=await Promise.resolve().then(()=>require(`./setupMigration-BAPr-YQq.cjs`));try{let i=process.cwd(),a=n();f(i)&&m(await p(i,a));let o=r(),h=o.status===`expiring_soon`?o.timeRemaining:void 0;process.env.STACKONE_AGENT_TOKEN||(process.env.STACKONE_AGENT_TOKEN=a);let g=l.join(c.homedir(),`.stackone`,`trusted_directories`),_=[];try{s.existsSync(g)&&(_=s.readFileSync(g,`utf-8`).split(`
110
+ `).filter(e=>e.trim()))}catch(t){e.w.error(`[Trust] Failed to load trusted directories:`,t)}if(!_.includes(i)){let t=!1,{addTrustedFolder:n}=await Promise.resolve().then(()=>require(`./trustedFolders-C3hB4Qg3.cjs`)),{waitUntilExit:r}=(0,u.render)(d.default.createElement(W,{directory:i,onConfirm:()=>{t=!0,n(i)},onCancel:()=>{t=!1}}));await r(),t||(e.w.log(`
111
+ Exiting...`),process.exit(0)),process.stdout.write(`\x1Bc`)}let v=a;if(h){let e={current:`ignore`},{waitUntilExit:t}=(0,u.render)(d.default.createElement(U,{timeRemaining:h,onRunSetup:()=>{e.current=`setup`},onIgnore:()=>{e.current=`ignore`}}));if(await t(),e.current===`setup`){process.stdout.write(`\x1Bc`);let{spawnSync:e}=await import(`node:child_process`),t=e(process.execPath,[process.argv[1],`agent`,`setup`],{stdio:`inherit`});t.status!==0&&process.exit(t.status??1);let r=n();process.env.STACKONE_AGENT_TOKEN=r,v=r}process.stdout.write(`\x1Bc`)}let{waitUntilExit:y}=(0,u.render)(d.default.createElement(Y,{...t,apiKey:v}),{exitOnCtrlC:!1});await y()}catch(t){t instanceof a&&(e.w.error(`
111
112
  ❌ Credentials Expired
112
113
  `),e.w.log(i.default.white(`Your StackOne credentials have expired.
113
114
  `)),e.w.log(i.default.white("To continue using the agent, run `stackone agent setup` to reauthenticate.\n")),e.w.log(i.default.dim(`Credentials are valid for 7 days after authentication.
@@ -119,39 +120,40 @@ Exiting...`),process.exit(0)),process.stdout.write(`\x1Bc`)}let v=a;if(h){let e=
119
120
  `)),process.exit(1));let n=t instanceof Error?t.message:String(t);e.w.error(`
120
121
  ❌ Error:`,n),e.w.log(i.default.dim(`
121
122
  If you continue to see this error, try running:`)),e.w.log(i.default.cyan(` stackone agent setup
122
- `)),process.exit(1)}}},J=class{async execute(){e.w.log(i.default.blue.bold(`🧹 StackOne Agent Cleanup
123
+ `)),process.exit(1)}}},Me=class{async execute(){e.w.log(i.default.blue.bold(`🧹 StackOne Agent Cleanup
123
124
  `));try{let t=(0,v.default)(`Removing stored configuration...`).start();await e.n(),t.succeed(`Removed ~/.stackone/agent-config.json`);let n=(0,v.default)(`Removing MCP servers from Claude...`).start(),r=0;e.p(e.a(),e.s())&&r++,e.p(e.o(process.cwd()),e.c())&&r++,r>0?n.succeed(`Removed ${r} MCP server(s) from Claude`):n.warn(`No MCP servers found in Claude (already removed or not configured)`),e.w.success(`Cleanup complete!`),e.w.log(i.default.white(`
124
125
  What was removed:`)),e.w.log(i.default.cyan(` • ~/.stackone/agent-config.json`)),r>0&&e.w.log(i.default.cyan(` • MCP server entries from Claude configuration`)),e.w.log(i.default.dim(`
125
- To authenticate again:`)),e.w.log(i.default.cyan(` stackone agent setup`),i.default.dim(`(for global setup)`)),e.w.log(i.default.cyan(` stackone agent setup --local`),i.default.dim(`(for local project setup)`)),e.w.log(``),process.exit(0)}catch(t){t instanceof Error?e.w.error(t.message):e.w.error(`Unknown error occurred`),process.exit(1)}}};const Y=(e,t)=>e?!!(t?.email||t?.password||t?.passwordFromStdin||process.env.STACKONE_EMAIL?.trim()||process.env.STACKONE_PASSWORD?.trim()):!1,je=`stackone-cli`,Me=`urn:ietf:params:oauth:grant-type:device_code`,X=async e=>{let t=`HTTP ${e.status}: ${e.statusText}`;try{let n=await e.text(),r=JSON.parse(n);return r.error_description||r.error||t}catch{return t}};var Ne=class{constructor(e){this.baseUrl=e||process.env.AUTH_SERVER_URL||`https://idp-api.stackone.com`}async login(e,t){try{let n=await fetch(`${this.baseUrl}/auth/sign-in/mcp`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({email:e,password:t})});if(!n.ok)return{success:!1,error:await X(n)};let r=await n.json();return r.apiKey?{success:!0,apiKey:r.apiKey}:{success:!1,error:`Invalid response format`}}catch(e){return{success:!1,error:e instanceof Error?e.message:`Network error occurred`}}}async validateKey(e){try{let t=await fetch(`${this.baseUrl}/api-key/verify`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({key:e})});return t.ok?await t.json():{valid:!1,error:await X(t)}}catch(e){return{valid:!1,error:e instanceof Error?e.message:`Network error occurred`}}}async requestDeviceCode(){let e=await fetch(`${this.baseUrl}/api/auth/device/code`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({client_id:je})});if(!e.ok)throw Error(await X(e));return await e.json()}async pollDeviceToken(e){try{let t=await fetch(`${this.baseUrl}/api/auth/device/token`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({grant_type:`urn:ietf:params:oauth:grant-type:device_code`,device_code:e,client_id:je})});if(t.ok)return{token:await t.json()};try{let e=await t.json();if(e.error)return{error:e}}catch{}return{error:{error:`server_error`,error_description:`HTTP ${t.status}: ${t.statusText}`}}}catch(e){return{error:{error:`network_error`,error_description:e instanceof Error?e.message:`Network error`}}}}async createApiKey(e){let t=10080*60,n=await fetch(`${this.baseUrl}/api/auth/api-key/create`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${e}`},body:JSON.stringify({prefix:`falcon_key_`,expiresIn:t,name:`CLI Auth Key`})});if(!n.ok)throw Error(await X(n));let r=await n.json(),i=new Date(Date.now()+t*1e3).toISOString();return{key:r.key,expiresAt:i}}};const Pe=e=>new Promise(t=>{let n=(0,c.platform)(),r,i;n===`darwin`?(r=`open`,i=[e]):n===`win32`?(r=`rundll32`,i=[`url.dll,FileProtocolHandler`,e]):(r=`xdg-open`,i=[e]),(0,f.execFile)(r,i,e=>{t(!e)})}),Fe=5,Ie=async(e,t)=>{let n=await e.requestDeviceCode(),r=await Pe(n.verification_uri_complete),i=`Confirmation code: ${n.user_code}`;t(r?`Browser opened. ${i}\nWaiting for authentication...`:`Could not open browser. Please visit:\n ${n.verification_uri_complete}\n\n${i}`);let a=n.interval*1e3,o=0,s=Date.now()+n.expires_in*1e3;for(;Date.now()<s;){await new Promise(e=>setTimeout(e,a));let r=await e.pollDeviceToken(n.device_code);if(`token`in r){t(`Authenticated. Creating API key...`);let n=await e.createApiKey(r.token.access_token),i=await e.validateKey(n.key);return{success:!0,apiKey:n.key,email:i.email,userId:i.userId,expiresAt:n.expiresAt}}let i=r.error.error;if(i===`authorization_pending`){o=0;continue}if(i===`slow_down`){o=0,await new Promise(e=>setTimeout(e,a));continue}if(i===`expired_token`)return{success:!1,error:`Authentication session expired`};if(i===`access_denied`)return{success:!1,error:`Access denied by user`};if(o++,o>=5)return{success:!1,error:`Polling failed: ${r.error.error_description??`unknown error`}`}}return{success:!1,error:`Authentication timed out`}},Le=new Ne,Z=async()=>{let t=(0,S.createInterface)({input:x.stdin,output:x.stdout}),n=await new Promise(e=>{t.question(i.default.white(`Email: `),t=>{e(t.trim())})});return t.close(),n||(e.w.error(`Email is required`),process.exit(1)),n},Re=async()=>{process.stdin.isTTY&&(e.w.error(`--password-stdin was set but no input was piped to stdin`),process.exit(1));let t=[];for await(let e of process.stdin)t.push(e);return Buffer.concat(t).toString(`utf8`).replace(/[\r\n]+$/,``)},ze=async e=>{let t=e.email?.trim()||process.env.STACKONE_EMAIL?.trim()||void 0,n;return e.passwordFromStdin?n=await Re():e.password?n=e.password:process.env.STACKONE_PASSWORD&&(n=process.env.STACKONE_PASSWORD),{email:t,password:n||void 0}},Be=async t=>{let n=await ze(t),r=n.email;if(!r){let t=await e.u();if(t?.email){e.w.log(i.default.dim(`Last used email: ${t.email}\n`));let{useExisting:n}=await b.default.prompt([{type:`confirm`,name:`useExisting`,message:`Sign in with this email?`,default:!0}]);r=n?t.email:await Z()}else r=await Z()}let a=n.password;a||=(t.passwordFromStdin&&(e.w.error(`Password is required`),process.exit(1)),(await b.default.prompt([{type:`password`,name:`password`,message:`Password:`,mask:`*`}])).password),a||(e.w.error(`Password is required`),process.exit(1)),e.w.log(``);let o=(0,v.default)(`Authenticating...`).start(),s=await Le.login(r,a);(!s.success||!s.apiKey)&&(o.fail(`Authentication failed`),e.w.error(`${s.error||`Invalid credentials`}`),e.w.log(i.default.dim(`Please check your email and password and try again.
126
- `)),process.exit(1)),o.succeed(`Login successful!`);let c=new Date(Date.now()+10080*60*1e3).toISOString();return{apiKey:s.apiKey,email:r,expiresAt:c}},Ve=async()=>{let t=(0,v.default)(`Starting browser authentication...`).start(),n;try{n=await Ie(Le,e=>{t.text=e})}catch(n){t.fail(`Authentication failed`),e.w.error(n instanceof Error?n.message:`Unknown error`),process.exit(1)}(!n.success||!n.apiKey)&&(t.fail(`Authentication failed`),e.w.error(n.error||`Unknown error`),process.exit(1)),t.succeed(`Login successful!`);let r=n.expiresAt||new Date(Date.now()+10080*60*1e3).toISOString();return{apiKey:n.apiKey,email:n.email??``,userId:n.userId,expiresAt:r}},He=async(t,n={})=>{let{apiKey:r,email:i,userId:a,expiresAt:o}=t?await Be(n):await Ve(),s={apiKey:r,userId:a??i,email:i,expiresAt:o,serverUrl:e.r()};return await e.m(s),s},Ue=e=>{let t=new Date(e),n=new Date,r=t.getTime()-n.getTime(),i=Math.floor(r/(1440*60*1e3)),a=Math.floor(r%(1440*60*1e3)/(3600*1e3)),o=t.toLocaleTimeString(`en-US`,{hour:`numeric`,minute:`2-digit`,hour12:!0});return`${t.toLocaleDateString(`en-US`,{weekday:`short`,month:`short`,day:`numeric`})} at ${o} (${i>0?`${i} days, ${a} hours`:`${a} hours`} from now)`};var We=class{async execute(t){e.w.log(i.default.blue.bold(`🤖 StackOne Agent Setup - Global Configuration
127
- `));try{let r=process.cwd(),a=await(0,y.access)(`${r}/CLAUDE.md`).then(()=>!0).catch(()=>!1),o=await(0,y.access)(`${r}/.mcp.json`).then(()=>!0).catch(()=>!1);if(a||o)if(e.w.warn(`Existing local setup detected:`),a&&e.w.log(i.default.dim(` • CLAUDE.md found in current directory`)),o&&e.w.log(i.default.dim(` • .mcp.json found in current directory`)),e.w.log(``),Y(!!t?.legacy,t?.credentials))e.w.log(i.default.dim(`Non-interactive credentials detected; proceeding without confirmation.
126
+ To authenticate again:`)),e.w.log(i.default.cyan(` stackone agent setup`),i.default.dim(`(for global setup)`)),e.w.log(i.default.cyan(` stackone agent setup --local`),i.default.dim(`(for local project setup)`)),e.w.log(``),process.exit(0)}catch(t){t instanceof Error?e.w.error(t.message):e.w.error(`Unknown error occurred`),process.exit(1)}}};const Ne=(e,t)=>e?!!(t?.email||t?.password||t?.passwordFromStdin||process.env.STACKONE_EMAIL?.trim()||process.env.STACKONE_PASSWORD?.trim()):!1,X=`stackone-cli`,Pe=`urn:ietf:params:oauth:grant-type:device_code`,Fe=async e=>{let t=`HTTP ${e.status}: ${e.statusText}`;try{let n=await e.text(),r=JSON.parse(n);return r.error_description||r.error||t}catch{return t}};var Ie=class{constructor(e){this.baseUrl=e||process.env.AUTH_SERVER_URL||`https://idp-api.stackone.com`}async login(e,t){try{let n=await fetch(`${this.baseUrl}/auth/sign-in/mcp`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({email:e,password:t})});if(!n.ok)return{success:!1,error:await Fe(n)};let r=await n.json();return r.apiKey?{success:!0,apiKey:r.apiKey}:{success:!1,error:`Invalid response format`}}catch(e){return{success:!1,error:e instanceof Error?e.message:`Network error occurred`}}}async validateKey(e){try{let t=await fetch(`${this.baseUrl}/api-key/verify`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({key:e})});return t.ok?await t.json():{valid:!1,error:await Fe(t)}}catch(e){return{valid:!1,error:e instanceof Error?e.message:`Network error occurred`}}}async requestDeviceCode(){let e=await fetch(`${this.baseUrl}/api/auth/device/code`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({client_id:X})});if(!e.ok)throw Error(await Fe(e));return await e.json()}async pollDeviceToken(e){try{let t=await fetch(`${this.baseUrl}/api/auth/device/token`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({grant_type:`urn:ietf:params:oauth:grant-type:device_code`,device_code:e,client_id:X})});if(t.ok)return{token:await t.json()};try{let e=await t.json();if(e.error)return{error:e}}catch{}return{error:{error:`server_error`,error_description:`HTTP ${t.status}: ${t.statusText}`}}}catch(e){return{error:{error:`network_error`,error_description:e instanceof Error?e.message:`Network error`}}}}async createApiKey(e){let t=10080*60,n=await fetch(`${this.baseUrl}/api/auth/api-key/create`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${e}`},body:JSON.stringify({prefix:`falcon_key_`,expiresIn:t,name:`CLI Auth Key`})});if(!n.ok)throw Error(await Fe(n));let r=await n.json(),i=new Date(Date.now()+t*1e3).toISOString();return{key:r.key,expiresAt:i}}};const Le=e=>new Promise(t=>{let n=(0,c.platform)(),r,i;n===`darwin`?(r=`open`,i=[e]):n===`win32`?(r=`rundll32`,i=[`url.dll,FileProtocolHandler`,e]):(r=`xdg-open`,i=[e]),(0,f.execFile)(r,i,e=>{t(!e)})}),Z=5,Re=async(e,t)=>{let n=await e.requestDeviceCode(),r=await Le(n.verification_uri_complete),i=`Confirmation code: ${n.user_code}`;t(r?`Browser opened. ${i}\nWaiting for authentication...`:`Could not open browser. Please visit:\n ${n.verification_uri_complete}\n\n${i}`);let a=n.interval*1e3,o=0,s=Date.now()+n.expires_in*1e3;for(;Date.now()<s;){await new Promise(e=>setTimeout(e,a));let r=await e.pollDeviceToken(n.device_code);if(`token`in r){t(`Authenticated. Creating API key...`);let n=await e.createApiKey(r.token.access_token),i=await e.validateKey(n.key);return{success:!0,apiKey:n.key,email:i.email,userId:i.userId,expiresAt:n.expiresAt}}let i=r.error.error;if(i===`authorization_pending`){o=0;continue}if(i===`slow_down`){o=0,await new Promise(e=>setTimeout(e,a));continue}if(i===`expired_token`)return{success:!1,error:`Authentication session expired`};if(i===`access_denied`)return{success:!1,error:`Access denied by user`};if(o++,o>=5)return{success:!1,error:`Polling failed: ${r.error.error_description??`unknown error`}`}}return{success:!1,error:`Authentication timed out`}},ze=new Ie,Be=async()=>{let t=(0,S.createInterface)({input:x.stdin,output:x.stdout}),n=await new Promise(e=>{t.question(i.default.white(`Email: `),t=>{e(t.trim())})});return t.close(),n||(e.w.error(`Email is required`),process.exit(1)),n},Ve=async()=>{process.stdin.isTTY&&(e.w.error(`--password-stdin was set but no input was piped to stdin`),process.exit(1));let t=[];for await(let e of process.stdin)t.push(e);return Buffer.concat(t).toString(`utf8`).replace(/[\r\n]+$/,``)},He=async e=>{let t=e.email?.trim()||process.env.STACKONE_EMAIL?.trim()||void 0,n;return e.passwordFromStdin?n=await Ve():e.password?n=e.password:process.env.STACKONE_PASSWORD&&(n=process.env.STACKONE_PASSWORD),{email:t,password:n||void 0}},Ue=async t=>{let n=await He(t),r=n.email;if(!r){let t=await e.u();if(t?.email){e.w.log(i.default.dim(`Last used email: ${t.email}\n`));let{useExisting:n}=await b.default.prompt([{type:`confirm`,name:`useExisting`,message:`Sign in with this email?`,default:!0}]);r=n?t.email:await Be()}else r=await Be()}let a=n.password;a||=(t.passwordFromStdin&&(e.w.error(`Password is required`),process.exit(1)),(await b.default.prompt([{type:`password`,name:`password`,message:`Password:`,mask:`*`}])).password),a||(e.w.error(`Password is required`),process.exit(1)),e.w.log(``);let o=(0,v.default)(`Authenticating...`).start(),s=await ze.login(r,a);(!s.success||!s.apiKey)&&(o.fail(`Authentication failed`),e.w.error(`${s.error||`Invalid credentials`}`),e.w.log(i.default.dim(`Please check your email and password and try again.
127
+ `)),process.exit(1)),o.succeed(`Login successful!`);let c=new Date(Date.now()+10080*60*1e3).toISOString();return{apiKey:s.apiKey,email:r,expiresAt:c}},We=async()=>{let t=(0,v.default)(`Starting browser authentication...`).start(),n;try{n=await Re(ze,e=>{t.text=e})}catch(n){t.fail(`Authentication failed`),e.w.error(n instanceof Error?n.message:`Unknown error`),process.exit(1)}(!n.success||!n.apiKey)&&(t.fail(`Authentication failed`),e.w.error(n.error||`Unknown error`),process.exit(1)),t.succeed(`Login successful!`);let r=n.expiresAt||new Date(Date.now()+10080*60*1e3).toISOString();return{apiKey:n.apiKey,email:n.email??``,userId:n.userId,expiresAt:r}},Ge=async t=>{let n=await Re(ze,t);if(!n.success||!n.apiKey)throw Error(n.error||`Authentication failed`);let r=n.expiresAt||new Date(Date.now()+10080*60*1e3).toISOString(),i={apiKey:n.apiKey,userId:n.userId??n.email??``,email:n.email??``,expiresAt:r,serverUrl:e.r()};return await e.m(i),i},Ke=async(t,n={})=>{let{apiKey:r,email:i,userId:a,expiresAt:o}=t?await Ue(n):await We(),s={apiKey:r,userId:a??i,email:i,expiresAt:o,serverUrl:e.r()};return await e.m(s),s},qe=e=>{let t=new Date(e),n=new Date,r=t.getTime()-n.getTime(),i=Math.floor(r/(1440*60*1e3)),a=Math.floor(r%(1440*60*1e3)/(3600*1e3)),o=t.toLocaleTimeString(`en-US`,{hour:`numeric`,minute:`2-digit`,hour12:!0});return`${t.toLocaleDateString(`en-US`,{weekday:`short`,month:`short`,day:`numeric`})} at ${o} (${i>0?`${i} days, ${a} hours`:`${a} hours`} from now)`};var Je=class{async execute(t){e.w.log(i.default.blue.bold(`🤖 StackOne Agent Setup - Global Configuration
128
+ `));try{let r=process.cwd(),a=await(0,y.access)(`${r}/CLAUDE.md`).then(()=>!0).catch(()=>!1),o=await(0,y.access)(`${r}/.mcp.json`).then(()=>!0).catch(()=>!1);if(a||o)if(e.w.warn(`Existing local setup detected:`),a&&e.w.log(i.default.dim(` • CLAUDE.md found in current directory`)),o&&e.w.log(i.default.dim(` • .mcp.json found in current directory`)),e.w.log(``),Ne(!!t?.legacy,t?.credentials))e.w.log(i.default.dim(`Non-interactive credentials detected; proceeding without confirmation.
128
129
  `));else{let{proceed:t}=await b.default.prompt([{type:`confirm`,name:`proceed`,message:`Re-authenticate globally despite existing local setup?`,default:!0}]);t||(e.w.log(i.default.dim(`
129
- Setup cancelled.`)),process.exit(0)),e.w.log(``)}let s=await He(!!t?.legacy,t?.credentials);e.w.success(`API key saved to ~/.stackone/agent-config.json`),e.w.log(i.default.white(`✓ Key expires at`),i.default.cyan(Ue(s.expiresAt))),n.t(await n.r(process.cwd(),s.apiKey));let c=(0,v.default)(`Setting up global MCP configuration...`).start();try{e.h(e.a(),e.s(),s.apiKey),c.succeed(`Installed to Claude (global)`),e.w.success(`Global setup complete!`),e.w.log(i.default.white(`Config location:`),i.default.cyan(`~/.claude.json`)),e.w.log(i.default.dim(`Token stored securely in Claude MCP server config.`)),e.w.log(i.default.blue(`
130
+ Setup cancelled.`)),process.exit(0)),e.w.log(``)}let s=await Ke(!!t?.legacy,t?.credentials);e.w.success(`API key saved to ~/.stackone/agent-config.json`),e.w.log(i.default.white(`✓ Key expires at`),i.default.cyan(qe(s.expiresAt))),n.t(await n.r(process.cwd(),s.apiKey));let c=(0,v.default)(`Setting up global MCP configuration...`).start();try{e.h(e.a(),e.s(),s.apiKey),c.succeed(`Installed to Claude (global)`),e.w.success(`Global setup complete!`),e.w.log(i.default.white(`Config location:`),i.default.cyan(`~/.claude.json`)),e.w.log(i.default.dim(`Token stored securely in Claude MCP server config.`)),e.w.log(i.default.blue(`
130
131
  Verify:`),i.default.cyan(`claude mcp list`)),e.w.log(i.default.dim(`
131
132
  💡 Tip: Run Claude without permission prompts:`),i.default.cyan(`claude --dangerously-skip-permissions`)),e.w.log(i.default.dim(`
132
- To setup for a specific project, run:`),i.default.cyan(`stackone agent setup --local`)),e.w.log(``)}catch(t){c.fail(`Installation to Claude failed`),t instanceof Error&&e.w.error(t.message)}process.exit(0)}catch(t){t instanceof Error?e.w.error(t.message):e.w.error(`Unknown error occurred`),process.exit(1)}}};const Ge={research:`Researching API...`,"discover-actions":`Discovering available actions...`,"build-and-validate":`Building and validating connector...`};var Ke=class{async execute(t){let{prompt:n,mode:a=`build`,maxTurns:s=25,verbose:c=!1}=t;n.trim()||(e.w.error(`A prompt is required.`),process.exit(1));let l;try{l=r.r()}catch(t){t instanceof Error&&t.name===`CredentialMissingError`?(e.w.error(`
133
+ To setup for a specific project, run:`),i.default.cyan(`stackone agent setup --local`)),e.w.log(``)}catch(t){c.fail(`Installation to Claude failed`),t instanceof Error&&e.w.error(t.message)}process.exit(0)}catch(t){t instanceof Error?e.w.error(t.message):e.w.error(`Unknown error occurred`),process.exit(1)}}};const Ye={research:`Researching API...`,"discover-actions":`Discovering available actions...`,"build-and-validate":`Building and validating connector...`};var Xe=class{async execute(t){let{prompt:n,mode:a=`build`,maxTurns:s=25,verbose:c=!1}=t;n.trim()||(e.w.error(`A prompt is required.`),process.exit(1));let l;try{l=r.r()}catch(t){t instanceof Error&&t.name===`CredentialMissingError`?(e.w.error(`
133
134
  ❌ Authentication Required
134
- `),e.w.log(i.default.white("Run `stackone agent setup` to authenticate, then try again.\n"))):e.w.error(t instanceof Error?t.message:String(t)),process.exit(1)}let u=xe(),d=(0,o.extractBuildIntent)(n.trim());if(a===`build`&&d.isConnectorBuild&&d.provider)return this.executeOrchestratedBuild({provider:d.provider,category:d.category,apiKey:l,mcpServers:u,verbose:c});c&&(e.w.log(i.default.dim(`Mode: ${a}\n`)),u.length>0&&e.w.log(i.default.dim(`MCP Servers: ${u.map(e=>e.name).join(`, `)}\n`)));let f=null;try{for await(let e of(0,o.executeAgent)({prompt:n.trim(),mode:a,apiKey:l,maxTurns:s,verbose:c,mcpServers:u,origin:`cli`,cliVersion:G()}))Je(e,e=>{f&&f.stop(),f=e})}catch(t){f?.fail(),e.w.error(i.default.red(`
135
+ `),e.w.log(i.default.white("Run `stackone agent setup` to authenticate, then try again.\n"))):e.w.error(t instanceof Error?t.message:String(t)),process.exit(1)}let u=Se(),d=(0,o.extractBuildIntent)(n.trim());if(a===`build`&&d.isConnectorBuild&&d.provider)return this.executeOrchestratedBuild({provider:d.provider,category:d.category,apiKey:l,mcpServers:u,verbose:c});c&&(e.w.log(i.default.dim(`Mode: ${a}\n`)),u.length>0&&e.w.log(i.default.dim(`MCP Servers: ${u.map(e=>e.name).join(`, `)}\n`)));let f=null;try{for await(let e of(0,o.executeAgent)({prompt:n.trim(),mode:a,apiKey:l,maxTurns:s,verbose:c,mcpServers:u,origin:`cli`,cliVersion:q()}))Qe(e,e=>{f&&f.stop(),f=e})}catch(t){f?.fail(),e.w.error(i.default.red(`
135
136
  Error: `+(t instanceof Error?t.message:String(t)))),process.exit(1)}f?.stop(),e.w.log(i.default.green(`
136
137
  ✓ Done
137
- `))}async executeOrchestratedBuild(t){let{provider:n,category:r,verbose:a}=t,o=r?` (${r})`:``;e.w.log(i.default.bold(`\nOrchestrated build: ${n}${o}\n`));let s=null,c=new Map;try{for await(let e of U(t))switch(e.type){case`phase_start`:{let t=Ge[e.phase]||`${e.phase}...`,n=e.model?i.default.dim(` (${N(e.model)})`):``;s?.stop(),s=(0,v.default)(i.default.cyan(`[${e.phase}]${n} ${t}`)).start(),c.set(e.phase,Date.now());break}case`phase_complete`:{let t=c.get(e.phase),n=t===void 0?0:Math.round((Date.now()-t)/1e3);s?.succeed(i.default.green(`[${e.phase}] Done (${n}s)`)),s=null;break}case`phase_error`:s?.fail(i.default.red(`[${e.phase}] ${e.error}`)),s=null;break;case`agent_message`:qe(e,s,a);break}}catch(t){s?.fail(),e.w.error(i.default.red(`
138
+ `))}async executeOrchestratedBuild(t){let{provider:n,category:r,verbose:a}=t,o=r?` (${r})`:``;e.w.log(i.default.bold(`\nOrchestrated build: ${n}${o}\n`));let s=null,c=new Map;try{for await(let e of xe(t))switch(e.type){case`phase_start`:{let t=Ye[e.phase]||`${e.phase}...`,n=e.model?i.default.dim(` (${N(e.model)})`):``;s?.stop(),s=(0,v.default)(i.default.cyan(`[${e.phase}]${n} ${t}`)).start(),c.set(e.phase,Date.now());break}case`phase_complete`:{let t=c.get(e.phase),n=t===void 0?0:Math.round((Date.now()-t)/1e3);s?.succeed(i.default.green(`[${e.phase}] Done (${n}s)`)),s=null;break}case`phase_error`:s?.fail(i.default.red(`[${e.phase}] ${e.error}`)),s=null;break;case`agent_message`:Ze(e,s,a);break}}catch(t){s?.fail(),e.w.error(i.default.red(`
138
139
  Error: `+(t instanceof Error?t.message:String(t)))),process.exit(1)}s?.stop(),e.w.log(i.default.green(`
139
140
  ✓ Build complete
140
- `))}};const qe=(t,n,r)=>{let a=t.message;switch(a.type){case`text`:r&&process.stdout.write(a.content??``);break;case`tool_call`:{let e=a.toolName??`unknown tool`;n&&(n.text=i.default.cyan(`[${t.phase}] Tool: ${e}`));break}case`tool_error`:e.w.error(i.default.red(`\n[${t.phase}] Tool error (${a.toolName}): ${a.error??`Unknown error`}`));break;case`error`:e.w.error(i.default.red(`\n[${t.phase}] ${a.error??`Unknown error`}`));break;default:break}};function Je(t,n){switch(t.type){case`text`:n(null),process.stdout.write(t.content??``);break;case`tool_call`:{let e=t.toolName??`unknown tool`;n((0,v.default)(i.default.cyan(`Tool: ${e}`)).start());break}case`tool_result`:n(null);break;case`tool_progress`:{let e=t.progress?.operation||t.toolName||`Working...`;n((0,v.default)(i.default.cyan(`Tool: ${e}`)).start());break}case`tool_error`:n(null),e.w.error(i.default.red(`\nTool error (${t.toolName}): ${t.error??`Unknown error`}`));break;case`error`:n(null),e.w.error(i.default.red(`\n${t.error??`Unknown error`}`));break;case`done`:n(null);break;default:process.env.VERBOSE&&console.warn(`[AgentRun] Unknown message type:`,t.type);break}}const Ye=`connector-guide.md`,Xe=`<!-- BEGIN stackone-connector-guide -->`,Ze=`<!-- END stackone-connector-guide -->`,Qe=`.stackone-connector-env.json`,$e=/^[a-z0-9][a-z0-9_-]*$/,et=e=>e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`),tt=e=>`<!-- Generated by \`stackone agent sync\` from @stackone/agent-harness@${e}. Edit upstream, not here. -->`,nt=e=>{if(e.includes(`..`)||!$e.test(e))throw Error(`Refusing unsafe path segment: ${JSON.stringify(e)}`)},Q=(e,...t)=>{let n=(0,l.resolve)(e),r=(0,l.resolve)(n,...t);if(r!==n&&!r.startsWith(n+l.sep))throw Error(`Refusing path outside ${n}: ${r}`);return r},rt=(e,...t)=>(0,s.readFileSync)(Q(e,...t),`utf-8`),it=(e,...t)=>(0,s.readFileSync)(Q(e,...t)),at=`@stackone/agent-harness`,ot=()=>{let e=(0,g.createRequire)(require(`url`).pathToFileURL(__filename).href).resolve(`@stackone/agent-harness`),t=(0,l.dirname)(e);for(let e=0;e<6;e++){if((0,s.existsSync)((0,l.join)(t,`package.json`))&&(0,s.existsSync)((0,l.join)(t,`plugin`)))return t;let e=(0,l.dirname)(t);if(e===t)break;t=e}return(0,l.dirname)((0,l.dirname)(e))},st=()=>(0,l.join)(ot(),`plugin`),ct=e=>{try{let t=e?(0,l.resolve)(e,`..`):ot();return JSON.parse(rt(t,`package.json`)).version??`unknown`}catch{return`unknown`}},lt=e=>{let t=e.charCodeAt(0)===65279?e.slice(1):e,n=t.match(/^---\n[\s\S]*?\n---\n?/);return n&&(t=t.slice(n[0].length)),t=t.replace(/^\s*<!--[\s\S]*?-->\s*/,``),t.trim()},ut=(e,t,n)=>{let r=[Xe,tt(n),``,t,``,Ze].join(`
141
- `);if(e.includes(Xe)&&e.includes(Ze)){let t=RegExp(`${et(Xe)}[\\s\\S]*?${et(Ze)}`);return e.replace(t,r)}let i=e.replace(/\s*$/,``);return i.length>0?`${i}\n\n${r}\n`:`${r}\n`},dt=e=>{let t=[];for(let n of(0,s.readdirSync)(e,{withFileTypes:!0}))if(n.isDirectory()){let r=dt(Q(e,n.name));t.push(...r.map(e=>(0,l.join)(n.name,e)))}else t.push(n.name);return t},ft=(e,t)=>{if(!(0,s.existsSync)(t))return!1;let n=dt(e).sort(),r=dt(t).sort();return n.length!==r.length||n.some((e,t)=>e!==r[t])?!1:n.every(n=>it(e,n).equals(it(t,n)))},pt=(e,t)=>{(0,s.rmSync)(t,{recursive:!0,force:!0}),(0,s.mkdirSync)((0,l.dirname)(t),{recursive:!0}),(0,s.cpSync)(e,t,{recursive:!0})},mt=e=>(0,s.existsSync)(e)?(0,s.readdirSync)(e,{withFileTypes:!0}).filter(e=>e.isDirectory()&&$e.test(e.name)).filter(t=>(0,s.existsSync)(Q(e,t.name,`SKILL.md`))).map(e=>e.name).sort():[],ht=()=>({changed:[],unchanged:[],missing:[]}),gt=(e,t,n,r)=>{let i=ht();for(let a of e){nt(a);let e=Q(t,a);if(!(0,s.existsSync)(e)||!(0,s.statSync)(e).isDirectory()){i.missing.push(a);continue}let o=Q(n,a);if(ft(e,o)){i.unchanged.push(a);continue}i.changed.push(a),r||pt(e,o)}return i},_t=(e,t,n,r)=>{if(!(0,s.existsSync)(Q(e,Ye)))return`missing-source`;let i=lt(rt(e,Ye)),a=Q(t,`CLAUDE.md`),o=(0,s.existsSync)(a)?rt(t,`CLAUDE.md`):``,c=ut(o,i,n);return c===o?`unchanged`:(r||(0,s.writeFileSync)(a,c),`changed`)},vt=e=>{let t=(0,l.resolve)(e.pluginDir??st()),n=(0,l.resolve)(e.cwd),r=e.version??ct(t),i=e.check??!1,a=Q(n,`.claude`),o=Q(t,`skills`),c=gt(mt(o),o,Q(a,`skills`),i),u=_t(t,n,r,i),d=c.changed.length>0||u===`changed`,f=u!==`missing-source`||c.changed.length+c.unchanged.length>0;if(!i&&f){(0,s.mkdirSync)(a,{recursive:!0});let e={harnessVersion:r,skills:c.changed.concat(c.unchanged).sort(),guide:u!==`missing-source`};(0,s.writeFileSync)(Q(a,`.stackone-connector-env.json`),`${JSON.stringify(e,null,2)}\n`)}return{skills:c,guide:u,hasChanges:d}},yt=e=>{try{let t=e??st();return(0,s.statSync)(t).isDirectory()?e?JSON.parse(rt((0,l.resolve)(t,`..`),`package.json`)).name===`@stackone/agent-harness`:!0:!1}catch{return!1}};var bt=class{async execute(t){e.w.log(i.default.blue.bold(`🤖 StackOne Agent Setup - Local Project
142
- `));try{let r=process.cwd(),a=await(0,y.access)(`${r}/CLAUDE.md`).then(()=>!0).catch(()=>!1),o=await(0,y.access)(`${r}/.mcp.json`).then(()=>!0).catch(()=>!1);if(a||o)if(e.w.warn(`Existing local setup detected:`),a&&e.w.log(i.default.dim(` • CLAUDE.md found`)),o&&e.w.log(i.default.dim(` • .mcp.json found`)),e.w.log(``),Y(!!t?.legacy,t?.credentials))e.w.log(i.default.dim(`Non-interactive credentials detected; proceeding without confirmation.
143
- `));else{let{proceed:t}=await b.default.prompt([{type:`confirm`,name:`proceed`,message:`Overwrite existing local configuration?`,default:!1}]);t||(e.w.log(i.default.dim(`
144
- Setup cancelled.`)),process.exit(0)),e.w.log(``)}let s=await e.u();(!s||!e.l(s))&&(e.w.warn(`Not authenticated globally.`),e.w.log(i.default.white(`Let's authenticate now...
145
- `)),s=await He(!!t?.legacy,t?.credentials),e.w.log(``)),n.t(await n.r(r,s.apiKey));let c=(0,v.default)(`Creating .mcp.json...`).start();try{e.h(e.o(r),e.c(),s.apiKey),c.succeed(`Created .mcp.json`),e.w.success(`Local setup complete!`),e.w.log(i.default.white(`Files created:`)),e.w.log(i.default.cyan(` • .mcp.json`)),e.w.log(i.default.dim(`Token stored securely in Claude MCP server config.`)),e.w.log(i.default.dim(`
141
+ `))}};const Ze=(t,n,r)=>{let a=t.message;switch(a.type){case`text`:r&&process.stdout.write(a.content??``);break;case`tool_call`:{let e=a.toolName??`unknown tool`;n&&(n.text=i.default.cyan(`[${t.phase}] Tool: ${e}`));break}case`tool_error`:e.w.error(i.default.red(`\n[${t.phase}] Tool error (${a.toolName}): ${a.error??`Unknown error`}`));break;case`error`:e.w.error(i.default.red(`\n[${t.phase}] ${a.error??`Unknown error`}`));break;default:break}};function Qe(t,n){switch(t.type){case`text`:n(null),process.stdout.write(t.content??``);break;case`tool_call`:{let e=t.toolName??`unknown tool`;n((0,v.default)(i.default.cyan(`Tool: ${e}`)).start());break}case`tool_result`:n(null);break;case`tool_progress`:{let e=t.progress?.operation||t.toolName||`Working...`;n((0,v.default)(i.default.cyan(`Tool: ${e}`)).start());break}case`tool_error`:n(null),e.w.error(i.default.red(`\nTool error (${t.toolName}): ${t.error??`Unknown error`}`));break;case`error`:n(null),e.w.error(i.default.red(`\n${t.error??`Unknown error`}`));break;case`done`:n(null);break;default:process.env.VERBOSE&&console.warn(`[AgentRun] Unknown message type:`,t.type);break}}const $e=e=>{let t=e.trim();return t===`~`?(0,c.homedir)():t.startsWith(`~/`)?(0,l.join)((0,c.homedir)(),t.slice(2)):t},et=(e,t,n)=>e?`global`:t?`local`:n?null:`global`,tt=(e,t)=>e?.trim()||(t?null:process.cwd()),nt=e=>e.existingConfig?`overwrite`:rt(e),rt=e=>e.mode===`local`&&e.alreadyAuthed?`work`:`auth`,it=(e,t)=>{switch(e){case`mode`:return t.mode===`local`?t.hasGit?`repo-confirm`:`path-input`:nt(t);case`repo-confirm`:return t.repoAccepted?nt(t):`path-input`;case`path-input`:return nt(t);case`overwrite`:return rt(t);case`auth`:return`work`;default:return`done`}},at=(e,t)=>(0,f.execFileSync)(`git`,[`-C`,e,...t],{encoding:`utf-8`,stdio:[`ignore`,`pipe`,`ignore`]}).trim(),ot=e=>{try{let t=at(e,[`rev-parse`,`--show-toplevel`]);if(!t)return null;let n;try{n=at(e,[`remote`,`get-url`,`origin`])||void 0}catch{}return{root:t,remoteUrl:n}}catch{return null}},st=`connector-guide.md`,ct=`<!-- BEGIN stackone-connector-guide -->`,lt=`<!-- END stackone-connector-guide -->`,ut=`.stackone-connector-env.json`,dt=/^[a-z0-9][a-z0-9_-]*$/,ft=e=>e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`),pt=e=>`<!-- Generated by \`stackone agent sync\` from @stackone/agent-harness@${e}. Edit upstream, not here. -->`,mt=e=>{if(e.includes(`..`)||!dt.test(e))throw Error(`Refusing unsafe path segment: ${JSON.stringify(e)}`)},Q=(e,...t)=>{let n=(0,l.resolve)(e),r=(0,l.resolve)(n,...t);if(r!==n&&!r.startsWith(n+l.sep))throw Error(`Refusing path outside ${n}: ${r}`);return r},ht=(e,...t)=>(0,s.readFileSync)(Q(e,...t),`utf-8`),gt=(e,...t)=>(0,s.readFileSync)(Q(e,...t)),_t=`@stackone/agent-harness`,vt=()=>{let e=(0,g.createRequire)(require(`url`).pathToFileURL(__filename).href).resolve(`@stackone/agent-harness`),t=(0,l.dirname)(e);for(let e=0;e<6;e++){if((0,s.existsSync)((0,l.join)(t,`package.json`))&&(0,s.existsSync)((0,l.join)(t,`plugin`)))return t;let e=(0,l.dirname)(t);if(e===t)break;t=e}return(0,l.dirname)((0,l.dirname)(e))},yt=()=>(0,l.join)(vt(),`plugin`),bt=e=>{try{let t=e?(0,l.resolve)(e,`..`):vt();return JSON.parse(ht(t,`package.json`)).version??`unknown`}catch{return`unknown`}},xt=e=>{let t=e.charCodeAt(0)===65279?e.slice(1):e,n=t.match(/^---\n[\s\S]*?\n---\n?/);return n&&(t=t.slice(n[0].length)),t=t.replace(/^\s*<!--[\s\S]*?-->\s*/,``),t.trim()},St=(e,t,n)=>{let r=[ct,pt(n),``,t,``,lt].join(`
142
+ `);if(e.includes(ct)&&e.includes(lt)){let t=RegExp(`${ft(ct)}[\\s\\S]*?${ft(lt)}`);return e.replace(t,r)}let i=e.replace(/\s*$/,``);return i.length>0?`${i}\n\n${r}\n`:`${r}\n`},Ct=e=>{let t=[];for(let n of(0,s.readdirSync)(e,{withFileTypes:!0}))if(n.isDirectory()){let r=Ct(Q(e,n.name));t.push(...r.map(e=>(0,l.join)(n.name,e)))}else t.push(n.name);return t},wt=(e,t)=>{if(!(0,s.existsSync)(t))return!1;let n=Ct(e).sort(),r=Ct(t).sort();return n.length!==r.length||n.some((e,t)=>e!==r[t])?!1:n.every(n=>gt(e,n).equals(gt(t,n)))},Tt=(e,t)=>{(0,s.rmSync)(t,{recursive:!0,force:!0}),(0,s.mkdirSync)((0,l.dirname)(t),{recursive:!0}),(0,s.cpSync)(e,t,{recursive:!0})},Et=e=>(0,s.existsSync)(e)?(0,s.readdirSync)(e,{withFileTypes:!0}).filter(e=>e.isDirectory()&&dt.test(e.name)).filter(t=>(0,s.existsSync)(Q(e,t.name,`SKILL.md`))).map(e=>e.name).sort():[],Dt=()=>({changed:[],unchanged:[],missing:[]}),Ot=(e,t,n,r)=>{let i=Dt();for(let a of e){mt(a);let e=Q(t,a);if(!(0,s.existsSync)(e)||!(0,s.statSync)(e).isDirectory()){i.missing.push(a);continue}let o=Q(n,a);if(wt(e,o)){i.unchanged.push(a);continue}i.changed.push(a),r||Tt(e,o)}return i},kt=(e,t,n,r)=>{if(!(0,s.existsSync)(Q(e,st)))return`missing-source`;let i=xt(ht(e,st)),a=Q(t,`CLAUDE.md`),o=(0,s.existsSync)(a)?ht(t,`CLAUDE.md`):``,c=St(o,i,n);return c===o?`unchanged`:(r||(0,s.writeFileSync)(a,c),`changed`)},At=e=>{let t=(0,l.resolve)(e.pluginDir??yt()),n=(0,l.resolve)(e.cwd),r=e.version??bt(t),i=e.check??!1,a=Q(n,`.claude`),o=Q(t,`skills`),c=Ot(Et(o),o,Q(a,`skills`),i),u=kt(t,n,r,i),d=c.changed.length>0||u===`changed`,f=u!==`missing-source`||c.changed.length+c.unchanged.length>0;if(!i&&f){(0,s.mkdirSync)(a,{recursive:!0});let e={harnessVersion:r,skills:c.changed.concat(c.unchanged).sort(),guide:u!==`missing-source`};(0,s.writeFileSync)(Q(a,`.stackone-connector-env.json`),`${JSON.stringify(e,null,2)}\n`)}return{skills:c,guide:u,hasChanges:d}},jt=e=>{try{let t=e??yt();return(0,s.statSync)(t).isDirectory()?e?JSON.parse(ht((0,l.resolve)(t,`..`),`package.json`)).name===`@stackone/agent-harness`:!0:!1}catch{return!1}},Mt=`#00af66`,Nt=({message:e,choices:t,initialIndex:n=0,onSelect:r,onCancel:i})=>{let[a,o]=(0,d.useState)(()=>t.length?Math.min(Math.max(n,0),t.length-1):0);return(0,u.useInput)((e,n)=>{if(t.length===0){n.escape&&i?.();return}n.upArrow?o(e=>(e-1+t.length)%t.length):n.downArrow?o(e=>(e+1)%t.length):n.return?r(t[a].value):n.escape&&i?.()}),t.length===0?null:d.default.createElement(u.Box,{flexDirection:`column`,paddingY:1},d.default.createElement(u.Box,{borderStyle:`round`,borderColor:`cyan`,flexDirection:`column`,paddingX:2,paddingY:1},d.default.createElement(u.Text,{bold:!0},e),d.default.createElement(u.Box,{flexDirection:`column`,marginTop:1},t.map((e,t)=>d.default.createElement(u.Text,{key:e.value,color:t===a?`#00af66`:`white`},t===a?`❯ `:` `,e.label)))),d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{dimColor:!0},`↑↓ to navigate • Enter to select`)))},Pt=({message:e,initialValue:t=``,validate:n,onSubmit:r,onCancel:i})=>{let[a,o]=(0,d.useState)(t),[s,c]=(0,d.useState)(null);return(0,u.useInput)((e,t)=>{if(t.return){let e=n?n(a):!0;e===!0?r(a):c(e);return}if(t.escape){i?.();return}if(t.backspace||t.delete){o(e=>e.slice(0,-1)),c(null);return}e&&!t.ctrl&&!t.meta&&!t.tab&&!t.upArrow&&!t.downArrow&&(o(t=>t+e),c(null))}),d.default.createElement(u.Box,{flexDirection:`column`,paddingY:1},d.default.createElement(u.Text,{bold:!0},e),d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,null,`> `),d.default.createElement(u.Text,null,a),d.default.createElement(u.Text,{inverse:!0},` `)),s&&d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{color:`red`},s)),d.default.createElement(u.Box,{marginTop:1},d.default.createElement(u.Text,{dimColor:!0},`Enter to submit • Esc to cancel`)))},Ft=e=>(0,s.existsSync)(`${e}/CLAUDE.md`)||(0,s.existsSync)(`${e}/.mcp.json`),It=e=>{try{return(0,s.statSync)(e).isDirectory()}catch{return!1}},Lt=({initialMode:t,pathFlag:r,startDir:i,onExit:a})=>{let[o,c]=(0,d.useState)(`mode`),[f,m]=(0,d.useState)(null),[h,g]=(0,d.useState)(!1),[_,v]=(0,d.useState)([]),[y,b]=(0,d.useState)(``),[x,S]=(0,d.useState)(t),[C,w]=(0,d.useState)(``),[T,E]=(0,d.useState)(``),[ee,D]=(0,d.useState)(!1),[O,k]=(0,d.useState)(null),A=(0,d.useRef)(0),M=(0,d.useCallback)(e=>{A.current+=1;let t=A.current;v(n=>[...n,{...e,id:t}])},[]),N=(0,d.useCallback)(e=>{m(e)},[]),P=(0,d.useCallback)(async t=>{let n=(0,l.resolve)($e(t));if(!It(n)){N({status:`error`,message:(0,s.existsSync)(n)?`Target path is not a directory: ${n}`:`Target path does not exist: ${n}`});return}w(n);let r=Ft(n),i=e.l(await e.u());D(i),c(it(`path-input`,{mode:`local`,hasGit:!1,repoAccepted:!1,existingConfig:r,alreadyAuthed:i}))},[N]),F=(0,d.useCallback)(e=>{if(S(e),e===`local`){let e=r?.trim();if(e){P(e);return}let t=ot(i);t&&(E(`Install the connector setup into this repo? ${t.remoteUrl?`${t.remoteUrl} (${t.root})`:t.root}`),w(t.root)),c(it(`mode`,{mode:`local`,hasGit:!!t,repoAccepted:!1,existingConfig:!1,alreadyAuthed:!1}));return}c(it(`mode`,{mode:`global`,hasGit:!1,repoAccepted:!1,existingConfig:Ft(i),alreadyAuthed:!1}))},[r,i,P]);(0,d.useEffect)(()=>{t&&F(t)},[]);let te=(0,d.useCallback)(e=>{e?P(C):c(`path-input`)},[P,C]),ne=(0,d.useCallback)(e=>{if(!e){N({status:`cancelled`});return}c(it(`overwrite`,{mode:x??`global`,hasGit:!1,repoAccepted:!1,existingConfig:!0,alreadyAuthed:ee}))},[x,ee,N]);return(0,d.useEffect)(()=>{if(o!==`auth`)return;let e=!1;return b(`Starting browser authentication…`),Ge(t=>{e||b(t)}).then(t=>{e||(k(t),M({icon:`✓`,text:t.email?`Authenticated as ${t.email}`:`Authenticated`,color:j.success}),c(`work`))}).catch(t=>{e||N({status:`error`,message:t instanceof Error?t.message:`Authentication failed`})}),()=>{e=!0}},[o,M,N]),(0,d.useEffect)(()=>{if(o!==`work`)return;let t=!1;return(async()=>{try{let r=O??await e.u();if(!r)throw Error(`Not authenticated — no API key found`);let a=await n.r(x===`local`?C:i,r.apiKey);if(a.migrated&&M({icon:`✓`,text:`Migrated ${a.actions.length} item(s) from a previous setup`,color:j.success}),x===`local`){b(`Creating .mcp.json…`),e.h(e.o(C),e.c(),r.apiKey),M({icon:`✓`,text:`Created .mcp.json`,color:j.success}),b(`Syncing connector-building skills + guide…`);let t=At({cwd:C});M({icon:`✓`,text:`Connector environment ready (${t.skills.changed.length+t.skills.unchanged.length} skills in .claude/, ${t.guide===`missing-source`?`guide unavailable in this version`:`guide in CLAUDE.md`})`,color:j.success})}else b(`Installing global MCP configuration…`),e.h(e.a(),e.s(),r.apiKey),M({icon:`✓`,text:`Installed to Claude (global)`,color:j.success});if(t)return;b(``),N({status:`done`})}catch(e){if(t)return;N({status:`error`,message:e instanceof Error?e.message:`Setup failed`})}})(),()=>{t=!0}},[o,O,x,C,i,M,N]),(0,d.useEffect)(()=>{if(!f)return;let e=setTimeout(()=>a(f),60);return()=>clearTimeout(e)},[f,a]),d.default.createElement(u.Box,{flexDirection:`column`,padding:1},h?d.default.createElement(z,{wordmark:!0}):d.default.createElement(le,{ready:!0,onComplete:()=>g(!0)}),_.length>0&&d.default.createElement(u.Box,{flexDirection:`column`,marginTop:1},_.map(e=>d.default.createElement(u.Text,{key:e.id,color:e.color},e.icon?`${e.icon} `:``,e.text))),d.default.createElement(u.Box,{marginTop:1},(()=>{if(f)return f.status===`error`?d.default.createElement(u.Text,{color:j.error},`✗ `,f.message??`Setup failed`):f.status===`cancelled`?d.default.createElement(u.Text,{color:j.dim},`Setup cancelled.`):d.default.createElement(u.Box,{flexDirection:`column`},d.default.createElement(u.Text,{color:j.success},`✓ Setup complete!`),d.default.createElement(u.Box,{marginTop:1,flexDirection:`column`},d.default.createElement(u.Text,{color:j.dim},`Verify with `,d.default.createElement(u.Text,{color:j.primary},`claude mcp list`)),d.default.createElement(u.Text,{color:j.dim},`Tip: run`,` `,d.default.createElement(u.Text,{color:j.primary},`claude --dangerously-skip-permissions`),` `,`to skip permission prompts`),x===`local`&&d.default.createElement(u.Text,{color:j.dim},`Refresh skills anytime with`,` `,d.default.createElement(u.Text,{color:j.primary},`stackone agent sync`))));switch(o){case`mode`:return t?null:d.default.createElement(Nt,{message:`How do you want to set up the StackOne agent?`,initialIndex:0,choices:[{label:`Local — this project: auth + .mcp.json + connector skills (.claude/) + guide (CLAUDE.md)`,value:`local`},{label:`Global — any repo: auth + global MCP only (no connector skills/guide)`,value:`global`}],onSelect:e=>F(e),onCancel:()=>N({status:`cancelled`})});case`repo-confirm`:return d.default.createElement(Nt,{message:T,initialIndex:0,choices:[{label:`Yes`,value:`yes`},{label:`No, let me choose a path`,value:`no`}],onSelect:e=>te(e===`yes`),onCancel:()=>N({status:`cancelled`})});case`path-input`:return d.default.createElement(Pt,{message:`Path to install the connector setup into:`,initialValue:i,validate:e=>{let t=$e(e)||i;return(0,s.existsSync)(t)?It(t)?!0:`Path is not a directory: ${t}`:`Path does not exist: ${t}`},onSubmit:e=>void P(e.trim()||i),onCancel:()=>N({status:`cancelled`})});case`overwrite`:{let e=x===`local`;return d.default.createElement(Nt,{message:e?`Existing setup found in ${C}. Overwrite it?`:`Local setup detected in ${i} (it won't be modified). Set up the agent globally anyway?`,initialIndex:e?1:0,choices:[{label:e?`Yes, overwrite`:`Yes, set up globally`,value:`yes`},{label:`No, cancel`,value:`no`}],onSelect:e=>ne(e===`yes`),onCancel:()=>N({status:`cancelled`})})}case`auth`:case`work`:return d.default.createElement(u.Text,null,d.default.createElement(u.Text,{color:j.primary},d.default.createElement(p.default,{type:`dots`})),` `,y);default:return null}})()))},Rt=e=>new Promise(t=>{let{unmount:n}=(0,u.render)(e(e=>{n(),t(e)}))}),zt=()=>Rt(e=>d.default.createElement(Nt,{message:`How do you want to set up the StackOne agent?`,initialIndex:0,choices:[{label:`Local — this project: auth + .mcp.json + connector skills (.claude/) + guide (CLAUDE.md)`,value:`local`},{label:`Global — any repo: auth + global MCP only (no connector skills/guide)`,value:`global`}],onSelect:t=>e(t)})),Bt=(e,t=!0)=>Rt(n=>d.default.createElement(Nt,{message:e,initialIndex:t?0:1,choices:[{label:`Yes`,value:`yes`},{label:`No`,value:`no`}],onSelect:e=>n(e===`yes`),onCancel:()=>n(!1)})),Vt=async e=>{let t=ot(e);return t&&await Bt(`Install the connector setup into this repo? ${t.remoteUrl?`${t.remoteUrl} (${t.root})`:t.root}`,!0)?t.root:Rt(n=>d.default.createElement(Pt,{message:t?`Path to install into:`:`Current directory is not a git repo. Path to install into:`,initialValue:e,validate:t=>{let n=$e(t)||e;return(0,s.existsSync)(n)?!0:`Path does not exist: ${n}`},onSubmit:t=>n($e(t)||e)}))},Ht=e=>new Promise(t=>{let{unmount:n}=(0,u.render)(d.default.createElement(Lt,{initialMode:e.initialMode,pathFlag:e.pathFlag,startDir:e.startDir??process.cwd(),onExit:e=>{n(),t(e)}}))});var Ut=class{async execute(t){e.w.log(i.default.blue.bold(`🤖 StackOne Agent Setup - Local Project
143
+ `));try{let r=(0,l.resolve)($e(t?.targetPath??process.cwd()));await(0,y.access)(r).then(()=>!0).catch(()=>!1)||(e.w.error(`Target path does not exist: ${r}`),process.exit(1)),t?.targetPath&&e.w.log(i.default.dim(`Installing into ${r}\n`));let a=await(0,y.access)(`${r}/CLAUDE.md`).then(()=>!0).catch(()=>!1),o=await(0,y.access)(`${r}/.mcp.json`).then(()=>!0).catch(()=>!1);if(a||o){e.w.warn(`Existing local setup detected:`),a&&e.w.log(i.default.dim(` • CLAUDE.md found`)),o&&e.w.log(i.default.dim(` • .mcp.json found`)),e.w.log(``);let n=Ne(!!t?.legacy,t?.credentials),r=!!process.stdin.isTTY;n||!r?e.w.log(i.default.dim(n?`Non-interactive credentials detected; proceeding without confirmation.
144
+ `:`No interactive terminal detected; proceeding without overwrite confirmation.
145
+ `)):(await Bt(`Overwrite existing local configuration?`,!1)||(e.w.log(i.default.dim(`
146
+ Setup cancelled.`)),process.exit(0)),e.w.log(``))}let s=await e.u();(!s||!e.l(s))&&(e.w.warn(`Not authenticated globally.`),e.w.log(i.default.white(`Let's authenticate now...
147
+ `)),s=await Ke(!!t?.legacy,t?.credentials),e.w.log(``)),n.t(await n.r(r,s.apiKey));let c=(0,v.default)(`Creating .mcp.json...`).start();try{e.h(e.o(r),e.c(),s.apiKey),c.succeed(`Created .mcp.json`),e.w.success(`Local setup complete!`),e.w.log(i.default.white(`Files created:`)),e.w.log(i.default.cyan(` • .mcp.json`)),e.w.log(i.default.dim(`Token stored securely in Claude MCP server config.`)),e.w.log(i.default.dim(`
146
148
  💡 The stackone-agent-local MCP server is now available in this project`)),e.w.log(i.default.dim(`
147
149
  💡 Tip: Run Claude without permission prompts:`),i.default.cyan(`claude --dangerously-skip-permissions`)),e.w.log(i.default.blue(`
148
- Verify:`),i.default.cyan(`claude mcp list`)),e.w.log(``)}catch(t){c.fail(`Failed to create .mcp.json`),t instanceof Error&&e.w.error(t.message)}let l=(0,v.default)(`Syncing connector-building skills + guide...`).start();try{let t=vt({cwd:r}),n=t.skills.changed.length+t.skills.unchanged.length,a=t.guide===`missing-source`?`unavailable in this version`:`in CLAUDE.md`;l.succeed(`Connector-building environment ready (${n} skills in .claude/, guide ${a})`),e.w.log(i.default.dim(` Refresh anytime with`),i.default.cyan(`stackone agent sync`))}catch(t){l.fail(`Failed to sync connector-building environment`),t instanceof Error&&e.w.error(t.message)}process.exit(0)}catch(t){t instanceof Error?e.w.error(t.message):e.w.error(`Unknown error occurred`),process.exit(1)}}},xt=class{async execute(t){let n=(0,o.getAvailableSkillNames)(),r=t?.mode;if(e.w.log(i.default.bold(`
150
+ Verify:`),i.default.cyan(`claude mcp list`)),e.w.log(``)}catch(t){c.fail(`Failed to create .mcp.json`),t instanceof Error&&e.w.error(t.message)}let u=(0,v.default)(`Syncing connector-building skills + guide...`).start();try{let t=At({cwd:r}),n=t.skills.changed.length+t.skills.unchanged.length,a=t.guide===`missing-source`?`unavailable in this version`:`in CLAUDE.md`;u.succeed(`Connector-building environment ready (${n} skills in .claude/, guide ${a})`),e.w.log(i.default.dim(` Refresh anytime with`),i.default.cyan(`stackone agent sync`))}catch(t){u.fail(`Failed to sync connector-building environment`),t instanceof Error&&e.w.error(t.message)}process.exit(0)}catch(t){t instanceof Error?e.w.error(t.message):e.w.error(`Unknown error occurred`),process.exit(1)}}},Wt=class{async execute(t){let n=(0,o.getAvailableSkillNames)(),r=t?.mode;if(e.w.log(i.default.bold(`
149
151
  Available skills
150
152
  `)),n.length===0){e.w.log(i.default.dim(` No bundled skills found.
151
- `));return}for(let t of n)e.w.log(` • ${t}`);if(r){let t=(0,o.getSkillsForMode)(r);if(t.length>0){e.w.log(i.default.bold(`\nRecommended for mode "${r}":\n`));for(let r of t){let t=n.includes(r);e.w.log(` • ${r}${t?``:i.default.dim(` (not found)`)}`)}}}e.w.log(``)}};const St=(t,n,r)=>{let a=r?`stale`:`synced`;n.changed.length>0&&e.w.log(i.default.cyan(` • ${t} ${a}: ${n.changed.join(`, `)}`)),n.missing.length>0&&e.w.log(i.default.dim(` • ${t} not in this harness version: ${n.missing.join(`, `)}`))},Ct=(t,n)=>{t===`missing-source`?e.w.log(i.default.dim(` • connector-guide.md not in this harness version — skipped CLAUDE.md`)):t===`changed`&&e.w.log(i.default.cyan(` • CLAUDE.md guide block ${n?`stale`:`updated`}`))};var wt=class{async execute(t){let n=!!t?.check,r=t?.pluginDir;yt(r)||(e.w.error(r?`--plugin-dir is not a valid @stackone/agent-harness plugin dir: ${r}`:`Could not locate the bundled @stackone/agent-harness plugin. Reinstall the CLI and try again.`),process.exit(1));let a=ct(r);e.w.log(i.default.blue.bold(`🧩 ${n?`Checking`:`Syncing`} connector-building environment`)+i.default.dim(` (agent-harness@${a}${r?` [--plugin-dir]`:``})\n`));try{let t=vt({cwd:process.cwd(),check:n,pluginDir:r});St(`skills`,t.skills,n),Ct(t.guide,n),n&&(t.hasChanges&&(e.w.log(``),e.w.error("Connector-building environment is out of date. Run `stackone agent sync` to update."),process.exit(1)),e.w.success(`Connector-building environment is up to date.`),process.exit(0)),t.hasChanges?(e.w.success(`Connector-building environment synced into .claude/ and CLAUDE.md.`),e.w.log(i.default.dim(`
152
- 💡 Skills and the connector guide are managed by the CLI — `),i.default.dim("re-run `stackone agent sync` after a CLI update."))):e.w.success(`Already up to date — nothing to sync.`),process.exit(0)}catch(t){e.w.error(t instanceof Error?t.message:`Unknown error during sync`),process.exit(1)}}};const Tt={profiles:{}},Et=()=>{let n=e._.readConfigFile(t.n);if(!n)return Tt;try{return JSON.parse(n)}catch{return Tt}},Dt=e=>Et().profiles[e],Ot=e=>!!Et().profiles[e],kt=(n,r)=>{let i=Et();i.profiles[n]=r,e._.writeConfigFile(t.n,JSON.stringify(i,null,2))},At=()=>{let e=Et();return Object.keys(e.profiles)},jt=`https://api.stackone.com`;var Mt=class{async execute({profile:t,connector:n,apiUrl:r,apiKey:a}={}){if(!t&&!a&&(e.w.error(`Profile or API key is required`),e.w.log(`Please provide a profile using the ${e.C(`--profile`)} option or an API key using the ${e.C(`--api-key`)} option.`),e.w.log(`To create a profile, run ${e.C(`stackone init`)}.`),process.exit(1)),t&&a&&(e.w.error(`Please provide either a profile or an API key, not both`),process.exit(1)),t&&r&&e.w.warn(`Specifying ${e.C(`--api-url`)} with a profile won't have any effect. Using API url from profile.`),t&&!Ot(t)){e.w.error(`Configuration profile ${e.C(t)} not found`),e.w.log(`Run ${e.C(`stackone init`)} to create a new configuration profile.\n`);let n=At();n.length>0&&(e.w.info(`Available configuration profiles:`),n.forEach(t=>{e.w.log(` - ${i.default.blue(t)}`)})),process.exit(1)}let o=t?Dt(t):{apiUrl:r??jt,apiKey:a};o?.apiKey||(e.w.error(`API key is missing`),e.w.log(`Please provide a valid API key in the profile or via the ${e.C(`--api-key`)} option.`),process.exit(1)),n||(e.w.error(`Connector identifier is required in the format provider_key@version.`),process.exit(1));let s=n.split(`@`);(s.length!==2||!s[0]||!s[1])&&(e.w.error(`Invalid connector format ${e.S(n)}. Expected format: ${e.C(`provider_key@version`)}`),process.exit(1));let c=o.apiUrl??jt,l=await this.dropConnector(n,c,o.apiKey);process.exit(l?0:1)}async dropConnector(t,n,r){let i=(0,v.default)(`🗑️ Dropping connector ${e.C(t)}...`).start();try{let a=Buffer.from(r).toString(`base64`),o=await fetch(`${n}/registry/connectors/${t}`,{method:`DELETE`,headers:{Authorization:`Basic ${a}`}});return i.stop(),o.status===204?(e.w.success(`Successfully dropped connector ${e.C(t)} from the registry`),!0):o.status===404?(e.w.error(`Connector ${e.C(t)} not found in the registry`),!1):o.status===401||o.status===403?(e.w.error(`You do not have permission to drop this connector`),!1):o.status===409?(e.w.error(`Connector ${e.C(t)} has associated configs and cannot be dropped`),e.w.log(`Please delete all associated integration configurations before dropping the connector.`),!1):(o.ok||await e.x(o,`Failed to drop connector ${e.C(t)} from the registry`),!1)}catch(r){return i.stop(),e.w.error(`Failed to drop connector ${e.C(t)} from registry: ${r.message}`),e.w.log(`Please ensure that the API at ${e.T(n)} is reachable and the API key is valid`),!1}}};const Nt=`stackone`;async function Pt(t,n){n.length===0&&(e.w.error(`Multiple versions of connector ${e.C(t)} were found but no owner information was returned`),process.exit(1));let r=n.map(e=>({value:e,label:e===Nt?`StackOne`:`Custom`,hint:e===Nt?`Official StackOne connector`:`Custom connector version created by your organization`}));e.w.warn(`Multiple versions of connector ${e.C(t)} were found. Please select which version to use.`);let i=await(0,w.select)({message:`Which version would you like to use?`,options:r});return(0,w.isCancel)(i)&&(e.w.error(`Operation cancelled.`),process.exit(1)),i}const Ft=`https://api.stackone.com`;var It=class{async execute({profile:t,connector:n,accountId:r,format:a,outputFile:o,apiUrl:s,apiKey:c,owner:l}={}){if(!t&&!c&&(e.w.error(`Profile or API key is required`),e.w.log(`Please provide a profile using the ${e.C(`--profile`)} option or an API key using the ${e.C(`--api-key`)} option.`),e.w.log(`To create a profile, run ${e.C(`stackone init`)}.`),process.exit(1)),t&&c&&(e.w.error(`Please provide either a profile or an API key, not both`),process.exit(1)),t&&s&&e.w.warn(`Specifying ${e.C(`--api-url`)} with a profile won't have any effect. Using API url from profile.`),t&&!Ot(t)){e.w.error(`Configuration profile ${e.C(t)} not found`),e.w.log(`Run ${e.C(`stackone init`)} to create a new configuration profile.\n`);let n=At();n.length>0&&(e.w.info(`Available configuration profiles:`),n.forEach(t=>{e.w.log(` - ${i.default.blue(t)}`)})),process.exit(1)}let u=t?Dt(t):{apiUrl:s??Ft,apiKey:c};u?.apiKey||(e.w.error(`API key is missing`),e.w.log(`Please provide a valid API key in the profile or via the ${e.C(`--api-key`)} option.`),process.exit(1)),(0,C.isMissing)(n)&&(0,C.isMissing)(r)&&(e.w.error(`Either ${e.C(`--connector`)} or ${e.C(`--account-id`)} must be provided`),process.exit(1)),(0,C.notMissing)(n)&&(0,C.notMissing)(r)&&(e.w.error(`Please provide either ${e.C(`--connector`)} or ${e.C(`--account-id`)}, not both.`),process.exit(1)),(0,C.notMissing)(a)&&a!==`yaml`&&a!==`json`&&(e.w.error(`Format must be either ${e.C(`yaml`)} or ${e.C(`json`)}.`),process.exit(1));let d=u.apiUrl??Ft,f;if((0,C.notMissing)(n)){this.#t(n)||(e.w.error(`Invalid connector format ${e.S(n)}. Expected format: ${e.C(`provider_key@version`)} or ${e.C(`provider_key`)}`),process.exit(1));let t=this.#n(n);f=await this.#r(t,d,u.apiKey,a,l)}else (0,C.notMissing)(r)?f=await this.#i(r,d,u.apiKey,a):(e.w.error(`Either ${e.C(`--connector`)} or ${e.C(`--account-id`)} must be provided`),process.exit(1));if((0,C.notMissing)(o))try{m.default.writeFileSync(o,f,`utf-8`),e.w.success(`Connector written to file: ${e.C(o)}`)}catch(t){e.w.error(`Failed to write connector to file ${e.C(o)}: ${t.message}`),process.exit(1)}else if(e.w.log(`\n${i.default.blue.inverse(` CONNECTOR CONTENT `)}\n`),!a||a===`yaml`)e.w.log(this.#e(f));else if(a===`json`)try{e.b(JSON.parse(f))}catch{e.w.log(f)}else e.w.log(f);process.exit(0)}#e(e){return e.split(`
153
+ `));return}for(let t of n)e.w.log(` • ${t}`);if(r){let t=(0,o.getSkillsForMode)(r);if(t.length>0){e.w.log(i.default.bold(`\nRecommended for mode "${r}":\n`));for(let r of t){let t=n.includes(r);e.w.log(` • ${r}${t?``:i.default.dim(` (not found)`)}`)}}}e.w.log(``)}};const Gt=(t,n,r)=>{let a=r?`stale`:`synced`;n.changed.length>0&&e.w.log(i.default.cyan(` • ${t} ${a}: ${n.changed.join(`, `)}`)),n.missing.length>0&&e.w.log(i.default.dim(` • ${t} not in this harness version: ${n.missing.join(`, `)}`))},Kt=(t,n)=>{t===`missing-source`?e.w.log(i.default.dim(` • connector-guide.md not in this harness version — skipped CLAUDE.md`)):t===`changed`&&e.w.log(i.default.cyan(` • CLAUDE.md guide block ${n?`stale`:`updated`}`))};var qt=class{async execute(t){let n=!!t?.check,r=t?.pluginDir;jt(r)||(e.w.error(r?`--plugin-dir is not a valid @stackone/agent-harness plugin dir: ${r}`:`Could not locate the bundled @stackone/agent-harness plugin. Reinstall the CLI and try again.`),process.exit(1));let a=bt(r);e.w.log(i.default.blue.bold(`🧩 ${n?`Checking`:`Syncing`} connector-building environment`)+i.default.dim(` (agent-harness@${a}${r?` [--plugin-dir]`:``})\n`));try{let t=At({cwd:process.cwd(),check:n,pluginDir:r});Gt(`skills`,t.skills,n),Kt(t.guide,n),n&&(t.hasChanges&&(e.w.log(``),e.w.error("Connector-building environment is out of date. Run `stackone agent sync` to update."),process.exit(1)),e.w.success(`Connector-building environment is up to date.`),process.exit(0)),t.hasChanges?(e.w.success(`Connector-building environment synced into .claude/ and CLAUDE.md.`),e.w.log(i.default.dim(`
154
+ 💡 Skills and the connector guide are managed by the CLI — `),i.default.dim("re-run `stackone agent sync` after a CLI update."))):e.w.success(`Already up to date — nothing to sync.`),process.exit(0)}catch(t){e.w.error(t instanceof Error?t.message:`Unknown error during sync`),process.exit(1)}}};const Jt={profiles:{}},Yt=()=>{let n=e._.readConfigFile(t.n);if(!n)return Jt;try{return JSON.parse(n)}catch{return Jt}},Xt=e=>Yt().profiles[e],Zt=e=>!!Yt().profiles[e],Qt=(n,r)=>{let i=Yt();i.profiles[n]=r,e._.writeConfigFile(t.n,JSON.stringify(i,null,2))},$t=()=>{let e=Yt();return Object.keys(e.profiles)},en=`https://api.stackone.com`;var tn=class{async execute({profile:t,connector:n,apiUrl:r,apiKey:a}={}){if(!t&&!a&&(e.w.error(`Profile or API key is required`),e.w.log(`Please provide a profile using the ${e.C(`--profile`)} option or an API key using the ${e.C(`--api-key`)} option.`),e.w.log(`To create a profile, run ${e.C(`stackone init`)}.`),process.exit(1)),t&&a&&(e.w.error(`Please provide either a profile or an API key, not both`),process.exit(1)),t&&r&&e.w.warn(`Specifying ${e.C(`--api-url`)} with a profile won't have any effect. Using API url from profile.`),t&&!Zt(t)){e.w.error(`Configuration profile ${e.C(t)} not found`),e.w.log(`Run ${e.C(`stackone init`)} to create a new configuration profile.\n`);let n=$t();n.length>0&&(e.w.info(`Available configuration profiles:`),n.forEach(t=>{e.w.log(` - ${i.default.blue(t)}`)})),process.exit(1)}let o=t?Xt(t):{apiUrl:r??en,apiKey:a};o?.apiKey||(e.w.error(`API key is missing`),e.w.log(`Please provide a valid API key in the profile or via the ${e.C(`--api-key`)} option.`),process.exit(1)),n||(e.w.error(`Connector identifier is required in the format provider_key@version.`),process.exit(1));let s=n.split(`@`);(s.length!==2||!s[0]||!s[1])&&(e.w.error(`Invalid connector format ${e.S(n)}. Expected format: ${e.C(`provider_key@version`)}`),process.exit(1));let c=o.apiUrl??en,l=await this.dropConnector(n,c,o.apiKey);process.exit(l?0:1)}async dropConnector(t,n,r){let i=(0,v.default)(`🗑️ Dropping connector ${e.C(t)}...`).start();try{let a=Buffer.from(r).toString(`base64`),o=await fetch(`${n}/registry/connectors/${t}`,{method:`DELETE`,headers:{Authorization:`Basic ${a}`}});return i.stop(),o.status===204?(e.w.success(`Successfully dropped connector ${e.C(t)} from the registry`),!0):o.status===404?(e.w.error(`Connector ${e.C(t)} not found in the registry`),!1):o.status===401||o.status===403?(e.w.error(`You do not have permission to drop this connector`),!1):o.status===409?(e.w.error(`Connector ${e.C(t)} has associated configs and cannot be dropped`),e.w.log(`Please delete all associated integration configurations before dropping the connector.`),!1):(o.ok||await e.x(o,`Failed to drop connector ${e.C(t)} from the registry`),!1)}catch(r){return i.stop(),e.w.error(`Failed to drop connector ${e.C(t)} from registry: ${r.message}`),e.w.log(`Please ensure that the API at ${e.T(n)} is reachable and the API key is valid`),!1}}};const nn=`stackone`;async function rn(t,n){n.length===0&&(e.w.error(`Multiple versions of connector ${e.C(t)} were found but no owner information was returned`),process.exit(1));let r=n.map(e=>({value:e,label:e===nn?`StackOne`:`Custom`,hint:e===nn?`Official StackOne connector`:`Custom connector version created by your organization`}));e.w.warn(`Multiple versions of connector ${e.C(t)} were found. Please select which version to use.`);let i=await(0,w.select)({message:`Which version would you like to use?`,options:r});return(0,w.isCancel)(i)&&(e.w.error(`Operation cancelled.`),process.exit(1)),i}const an=`https://api.stackone.com`;var on=class{async execute({profile:t,connector:n,accountId:r,format:a,outputFile:o,apiUrl:s,apiKey:c,owner:l}={}){if(!t&&!c&&(e.w.error(`Profile or API key is required`),e.w.log(`Please provide a profile using the ${e.C(`--profile`)} option or an API key using the ${e.C(`--api-key`)} option.`),e.w.log(`To create a profile, run ${e.C(`stackone init`)}.`),process.exit(1)),t&&c&&(e.w.error(`Please provide either a profile or an API key, not both`),process.exit(1)),t&&s&&e.w.warn(`Specifying ${e.C(`--api-url`)} with a profile won't have any effect. Using API url from profile.`),t&&!Zt(t)){e.w.error(`Configuration profile ${e.C(t)} not found`),e.w.log(`Run ${e.C(`stackone init`)} to create a new configuration profile.\n`);let n=$t();n.length>0&&(e.w.info(`Available configuration profiles:`),n.forEach(t=>{e.w.log(` - ${i.default.blue(t)}`)})),process.exit(1)}let u=t?Xt(t):{apiUrl:s??an,apiKey:c};u?.apiKey||(e.w.error(`API key is missing`),e.w.log(`Please provide a valid API key in the profile or via the ${e.C(`--api-key`)} option.`),process.exit(1)),(0,C.isMissing)(n)&&(0,C.isMissing)(r)&&(e.w.error(`Either ${e.C(`--connector`)} or ${e.C(`--account-id`)} must be provided`),process.exit(1)),(0,C.notMissing)(n)&&(0,C.notMissing)(r)&&(e.w.error(`Please provide either ${e.C(`--connector`)} or ${e.C(`--account-id`)}, not both.`),process.exit(1)),(0,C.notMissing)(a)&&a!==`yaml`&&a!==`json`&&(e.w.error(`Format must be either ${e.C(`yaml`)} or ${e.C(`json`)}.`),process.exit(1));let d=u.apiUrl??an,f;if((0,C.notMissing)(n)){this.#t(n)||(e.w.error(`Invalid connector format ${e.S(n)}. Expected format: ${e.C(`provider_key@version`)} or ${e.C(`provider_key`)}`),process.exit(1));let t=this.#n(n);f=await this.#r(t,d,u.apiKey,a,l)}else (0,C.notMissing)(r)?f=await this.#i(r,d,u.apiKey,a):(e.w.error(`Either ${e.C(`--connector`)} or ${e.C(`--account-id`)} must be provided`),process.exit(1));if((0,C.notMissing)(o))try{m.default.writeFileSync(o,f,`utf-8`),e.w.success(`Connector written to file: ${e.C(o)}`)}catch(t){e.w.error(`Failed to write connector to file ${e.C(o)}: ${t.message}`),process.exit(1)}else if(e.w.log(`\n${i.default.blue.inverse(` CONNECTOR CONTENT `)}\n`),!a||a===`yaml`)e.w.log(this.#e(f));else if(a===`json`)try{e.b(JSON.parse(f))}catch{e.w.log(f)}else e.w.log(f);process.exit(0)}#e(e){return e.split(`
153
155
  `).map(e=>{if(e.trim().startsWith(`#`))return i.default.gray(e);if(e.includes(`:`)){let t=e.indexOf(`:`),n=e.substring(0,t+1),r=e.substring(t+1),a=r,o=r.trim();return o===`true`||o===`false`?a=r.replace(o,i.default.cyan(o)):o===`null`||o===`~`?a=r.replace(o,i.default.gray(o)):/^-?\d+(\.\d+)?$/.test(o)?a=r.replace(o,i.default.green(o)):(o.startsWith(`"`)&&o.endsWith(`"`)||o.startsWith(`'`)&&o.endsWith(`'`)||o&&!o.startsWith(`-`))&&(a=r.replace(o,i.default.yellow(o))),i.default.red(n)+a}return e.trim().startsWith(`-`)?e.replace(`-`,i.default.gray(`-`)):e}).join(`
154
- `)}#t=e=>!e.includes(`/`)&&!e.includes(`\\`)&&!e.endsWith(`.yaml`)&&!e.endsWith(`.yml`)?e.includes(`@`)?e.split(`@`).length===2:!0:!1;#n=e=>e.includes(`@`)?e:`${e}@latest`;async#r(t,n,r,i,a){let o=(0,v.default)(`Getting connector ${e.C(t)} from registry...`).start();try{let s=Buffer.from(r).toString(`base64`),c=i?`?format=${i}`:``,l=a?`${c?`&`:`?`}owner=${encodeURIComponent(a)}`:``,u=await fetch(`${n}/registry/connectors/${t}${c}${l}`,{method:`GET`,headers:{Authorization:`Basic ${s}`}});if(o.stop(),u.status===409){a&&(await e.x(u,`Failed to get connector ${e.C(t)} from the registry`),process.exit(1));let r=await Pt(t,(await u.json()).availableOwners??[]),i=`${n}/registry/connectors/${t}${c}${c?`&`:`?`}owner=${encodeURIComponent(r)}`;o.text=`Getting connector ${e.C(t)} from registry...`,o.start();let l=await fetch(i,{method:`GET`,headers:{Authorization:`Basic ${s}`}});return o.stop(),l.ok||(await e.x(l,`Failed to get connector ${e.C(t)} from the registry`),process.exit(1)),await l.text()}return u.ok||(await e.x(u,`Failed to get connector ${e.C(t)} from the registry`),process.exit(1)),await u.text()}catch(r){o.stop(),e.w.error(`Failed to get connector ${e.C(t)} from the registry: ${r.message}`),e.w.log(`Please ensure that the API at ${e.T(n)} is reachable and the API key is valid`),process.exit(1)}}async#i(t,n,r,i){let a=(0,v.default)(`Getting connector from account ${e.C(t)}...`).start();try{let o=Buffer.from(r).toString(`base64`),s=i?`?format=${i}`:``,c=await fetch(`${n}/accounts/${t}/connector${s}`,{method:`GET`,headers:{Authorization:`Basic ${o}`}});return a.stop(),c.ok||(await e.x(c,`Failed to get connector from account ${e.C(t)}`),process.exit(1)),await c.text()}catch(r){a.stop(),e.w.error(`Failed to get connector from account ${e.C(t)}: ${r.message}`),e.w.log(`Please ensure that the API at ${e.T(n)} is reachable and the API key is valid`),process.exit(1)}}};const Lt=`https://api.stackone.com`,Rt=`https://api.stackone-dev.com`,zt=`http://localhost:4000`;var Bt=class{async execute({environment:t}={}){let n=t?.toLowerCase()??`production`;try{(0,w.intro)(`${i.default.inverse(` Initialize profile `)}`);let t=await(0,w.text)({message:`Profile label`,validate:e=>{if(!e||e.trim().length===0)return`The profile label is required`;if(e.includes(` `))return`The profile label cannot contain spaces`}});if((0,w.isCancel)(t))return(0,w.cancel)(`Configuration profile initialization cancelled`),process.exit(0);if(Ot(t)){let n=await(0,w.confirm)({message:`Configuration profile with name ${e.C(t)} already exists. Do you want to overwrite it?`});if((0,w.isCancel)(n)||!n)return(0,w.cancel)(`Configuration profile initialization cancelled`),process.exit(0)}let r;if(n===`production`)r=`https://api.stackone.com`;else if(n===`staging`)r=`https://api.stackone-dev.com`;else{let e=await(0,w.text)({message:`API URL`,placeholder:zt,initialValue:zt,validate:e=>{if(!e||e.trim().length===0)return`API URL is required`;try{new URL(e)}catch{return`Please enter a valid URL`}}});if((0,w.isCancel)(e))return(0,w.cancel)(`Configuration profile initialization cancelled`),process.exit(0);r=e}let a=await(0,w.password)({message:`API Key`,validate:e=>{if(!e||e.trim().length===0)return`API Key is required`}});if((0,w.isCancel)(a))return(0,w.cancel)(`Configuration profile initialization cancelled`),process.exit(0);kt(t,{label:t,environment:n,apiUrl:r,apiKey:a}),(0,w.outro)(`${i.default.green(`✔`)} Configuration profile ${e.C(t)} initialized successfully!`),process.exit(0)}catch(t){t?.isTtyError?e.w.error(`Prompt couldn't be rendered in the current environment`):e.w.error(`Failed to initialize configuration profile: ${t}`),process.exit(1)}}};const Vt=20,$={pending:`○`,acceptRemote:`●`,acceptLocal:`◐`,acceptBoth:`◑`,current:`◉`,arrow:`→`,check:`✓`,cross:`✗`,warning:`⚠`};var Ht=class{constructor(e,t,n,r){this.conflicts=[],this.currentIndex=0,this.totalConflicts=0,this.currentCleanup=null,this.connectorId=t,this.localVersion=n,this.remoteVersion=r,this.conflicts=e.map(e=>({conflict:e,choice:e.type===`unchanged`?`remote`:`pending`})),this.totalConflicts=e.filter(e=>e.type===`conflict`).length}resetForReResolution(){this.currentIndex=0}async resolve(){return this.totalConflicts===0?{cancelled:!1,states:this.conflicts}:(this.moveToNextConflict(),new Promise(e=>{let t=(0,ee.createInterface)({input:process.stdin,output:process.stdout});process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.resume(),this.render();let n=n=>{let r=n.toString();if(r===``){this.cleanup(t),this.renderCancelled(),e({cancelled:!0,states:this.conflicts});return}if(r===`\x1B`&&n.length===1){this.cleanup(t),this.renderCancelled(),e({cancelled:!0,states:this.conflicts});return}if(r.startsWith(`\x1B[`)){switch(r.slice(2)){case`D`:this.moveToPrevConflict(),this.render();break;case`C`:this.moveToNextConflict(),this.render();break}return}switch(r){case`r`:case`R`:this.setCurrentChoice(`remote`),this.advanceAfterChoice(t);break;case`l`:case`L`:this.setCurrentChoice(`local`),this.advanceAfterChoice(t);break;case`b`:case`B`:this.setCurrentChoice(`both`),this.advanceAfterChoice(t);break;case`\r`:case`
156
+ `)}#t=e=>!e.includes(`/`)&&!e.includes(`\\`)&&!e.endsWith(`.yaml`)&&!e.endsWith(`.yml`)?e.includes(`@`)?e.split(`@`).length===2:!0:!1;#n=e=>e.includes(`@`)?e:`${e}@latest`;async#r(t,n,r,i,a){let o=(0,v.default)(`Getting connector ${e.C(t)} from registry...`).start();try{let s=Buffer.from(r).toString(`base64`),c=i?`?format=${i}`:``,l=a?`${c?`&`:`?`}owner=${encodeURIComponent(a)}`:``,u=await fetch(`${n}/registry/connectors/${t}${c}${l}`,{method:`GET`,headers:{Authorization:`Basic ${s}`}});if(o.stop(),u.status===409){a&&(await e.x(u,`Failed to get connector ${e.C(t)} from the registry`),process.exit(1));let r=await rn(t,(await u.json()).availableOwners??[]),i=`${n}/registry/connectors/${t}${c}${c?`&`:`?`}owner=${encodeURIComponent(r)}`;o.text=`Getting connector ${e.C(t)} from registry...`,o.start();let l=await fetch(i,{method:`GET`,headers:{Authorization:`Basic ${s}`}});return o.stop(),l.ok||(await e.x(l,`Failed to get connector ${e.C(t)} from the registry`),process.exit(1)),await l.text()}return u.ok||(await e.x(u,`Failed to get connector ${e.C(t)} from the registry`),process.exit(1)),await u.text()}catch(r){o.stop(),e.w.error(`Failed to get connector ${e.C(t)} from the registry: ${r.message}`),e.w.log(`Please ensure that the API at ${e.T(n)} is reachable and the API key is valid`),process.exit(1)}}async#i(t,n,r,i){let a=(0,v.default)(`Getting connector from account ${e.C(t)}...`).start();try{let o=Buffer.from(r).toString(`base64`),s=i?`?format=${i}`:``,c=await fetch(`${n}/accounts/${t}/connector${s}`,{method:`GET`,headers:{Authorization:`Basic ${o}`}});return a.stop(),c.ok||(await e.x(c,`Failed to get connector from account ${e.C(t)}`),process.exit(1)),await c.text()}catch(r){a.stop(),e.w.error(`Failed to get connector from account ${e.C(t)}: ${r.message}`),e.w.log(`Please ensure that the API at ${e.T(n)} is reachable and the API key is valid`),process.exit(1)}}};const sn=`https://api.stackone.com`,cn=`https://api.stackone-dev.com`,ln=`http://localhost:4000`;var un=class{async execute({environment:t}={}){let n=t?.toLowerCase()??`production`;try{(0,w.intro)(`${i.default.inverse(` Initialize profile `)}`);let t=await(0,w.text)({message:`Profile label`,validate:e=>{if(!e||e.trim().length===0)return`The profile label is required`;if(e.includes(` `))return`The profile label cannot contain spaces`}});if((0,w.isCancel)(t))return(0,w.cancel)(`Configuration profile initialization cancelled`),process.exit(0);if(Zt(t)){let n=await(0,w.confirm)({message:`Configuration profile with name ${e.C(t)} already exists. Do you want to overwrite it?`});if((0,w.isCancel)(n)||!n)return(0,w.cancel)(`Configuration profile initialization cancelled`),process.exit(0)}let r;if(n===`production`)r=`https://api.stackone.com`;else if(n===`staging`)r=`https://api.stackone-dev.com`;else{let e=await(0,w.text)({message:`API URL`,placeholder:ln,initialValue:ln,validate:e=>{if(!e||e.trim().length===0)return`API URL is required`;try{new URL(e)}catch{return`Please enter a valid URL`}}});if((0,w.isCancel)(e))return(0,w.cancel)(`Configuration profile initialization cancelled`),process.exit(0);r=e}let a=await(0,w.password)({message:`API Key`,validate:e=>{if(!e||e.trim().length===0)return`API Key is required`}});if((0,w.isCancel)(a))return(0,w.cancel)(`Configuration profile initialization cancelled`),process.exit(0);Qt(t,{label:t,environment:n,apiUrl:r,apiKey:a}),(0,w.outro)(`${i.default.green(`✔`)} Configuration profile ${e.C(t)} initialized successfully!`),process.exit(0)}catch(t){t?.isTtyError?e.w.error(`Prompt couldn't be rendered in the current environment`):e.w.error(`Failed to initialize configuration profile: ${t}`),process.exit(1)}}};const dn=20,$={pending:`○`,acceptRemote:`●`,acceptLocal:`◐`,acceptBoth:`◑`,current:`◉`,arrow:`→`,check:`✓`,cross:`✗`,warning:`⚠`};var fn=class{constructor(e,t,n,r){this.conflicts=[],this.currentIndex=0,this.totalConflicts=0,this.currentCleanup=null,this.connectorId=t,this.localVersion=n,this.remoteVersion=r,this.conflicts=e.map(e=>({conflict:e,choice:e.type===`unchanged`?`remote`:`pending`})),this.totalConflicts=e.filter(e=>e.type===`conflict`).length}resetForReResolution(){this.currentIndex=0}async resolve(){return this.totalConflicts===0?{cancelled:!1,states:this.conflicts}:(this.moveToNextConflict(),new Promise(e=>{let t=(0,ee.createInterface)({input:process.stdin,output:process.stdout});process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.resume(),this.render();let n=n=>{let r=n.toString();if(r===``){this.cleanup(t),this.renderCancelled(),e({cancelled:!0,states:this.conflicts});return}if(r===`\x1B`&&n.length===1){this.cleanup(t),this.renderCancelled(),e({cancelled:!0,states:this.conflicts});return}if(r.startsWith(`\x1B[`)){switch(r.slice(2)){case`D`:this.moveToPrevConflict(),this.render();break;case`C`:this.moveToNextConflict(),this.render();break}return}switch(r){case`r`:case`R`:this.setCurrentChoice(`remote`),this.advanceAfterChoice(t);break;case`l`:case`L`:this.setCurrentChoice(`local`),this.advanceAfterChoice(t);break;case`b`:case`B`:this.setCurrentChoice(`both`),this.advanceAfterChoice(t);break;case`\r`:case`
155
157
  `:this.allResolved()?(this.cleanup(t),e({cancelled:!1,states:this.conflicts})):(this.moveToNextUnresolved(),this.render());break;case`q`:case`Q`:this.cleanup(t),this.renderCancelled(),e({cancelled:!0,states:this.conflicts});break;case`a`:case`A`:this.acceptAllRemaining(`remote`),this.render();break;case`u`:case`U`:this.setCurrentChoice(`pending`),this.render();break}};process.stdin.on(`data`,n),this.currentCleanup=()=>{process.stdin.removeListener(`data`,n),process.stdin.isTTY&&process.stdin.setRawMode(!1),t.close()}}))}cleanup(e){this.currentCleanup?(this.currentCleanup(),this.currentCleanup=null):(process.stdin.isTTY&&process.stdin.setRawMode(!1),e.close())}advanceAfterChoice(e){this.allResolved()||this.moveToNextUnresolved(),this.render()}render(){e.v();let t=process.stdout.columns||80;this.renderHeader(t),this.renderProgressBar(t),this.renderCurrentConflict(t),this.renderControls(t)}renderHeader(t){let n=this.connectorId,r=`${this.localVersion} ${$.arrow} ${this.remoteVersion}`,a=Math.max(0,t-17),o=Math.floor(a/2),s=a-o,c=` `.repeat(o)+`CONFLICT RESOLVER`+` `.repeat(s);e.w.log(``),e.w.log(i.default.bgBlue.white.bold(c)),e.w.log(i.default.gray(this.centerText(n,t))),e.w.log(i.default.gray(this.centerText(r,t))),e.w.log(``)}renderProgressBar(t){let n=this.conflicts.filter(e=>e.conflict.type===`conflict`),r=this.getCurrentConflictIndex(),a=n.map((e,t)=>{let n=t===r,a,o;switch(e.choice){case`remote`:a=n?$.current:$.acceptRemote,o=i.default.green;break;case`local`:a=n?$.current:$.acceptLocal,o=i.default.yellow;break;case`both`:a=n?$.current:$.acceptBoth,o=i.default.cyan;break;default:a=n?$.current:$.pending,o=n?i.default.white:i.default.gray}return o(a)}),o=n.filter(e=>e.choice!==`pending`).length,s=` Conflict ${r+1} of ${this.totalConflicts} • ${o}/${this.totalConflicts} resolved `;e.w.log(i.default.gray(this.centerText(s,t))),e.w.log(this.centerText(a.join(` `),t)),e.w.log(``)}renderCurrentConflict(t){let n=this.conflicts[this.currentIndex];if(!n||n.conflict.type!==`conflict`)return;let r=n.conflict;if(e.w.log(i.default.gray(`_`.repeat(t))),e.w.log(`
156
158
 
157
159
  `),r.local){let t=n.choice===`local`||n.choice===`both`?i.default.yellow.bold(`${$.check} LOCAL (keeping)`):i.default.red.bold(`${$.cross} LOCAL (removing)`),a=r.local.split(`
@@ -165,9 +167,9 @@ Available skills
165
167
  `),l=a.length>20?`\n${i.default.gray(`... and ${a.length-20} more lines`)}`:``;e.w.log(`${t}\n\n${c}${l}`)}e.w.log(`
166
168
 
167
169
  `),e.w.log(i.default.gray(`_`.repeat(t))),e.w.log(``)}renderControls(t){let n=[i.default.green(`[R] Accept Remote`),i.default.yellow(`[L] Keep Local`),i.default.cyan(`[B] Keep Both`),i.default.gray(`[U] Undo`)],r=[i.default.gray(`[←/→] Navigate`),i.default.gray(`[A] Accept all remaining`)],a=this.allResolved()?[i.default.green.bold(`[Enter] Apply Changes`),i.default.gray(`[Esc] Cancel`)]:[i.default.gray(`[Enter] Next Unresolved`),i.default.gray(`[Esc] Cancel`)];e.w.log(this.centerText(n.join(` `),t)),e.w.log(``),e.w.log(this.centerText(r.join(` `),t)),e.w.log(``),e.w.log(this.centerText(a.join(` `),t)),this.allResolved()&&(e.w.log(``),e.w.log(i.default.green.bold(this.centerText(`✓ All conflicts resolved!`,t))))}renderFinalSummary(){e.v();let t=this.conflicts.filter(e=>e.conflict.type===`conflict`),n=0,r=0,a=0;for(let e of t)switch(e.choice){case`remote`:n++;break;case`local`:r++;break;case`both`:a++;break}let o=[i.default.green.bold(`Conflict resolution complete`),``,`${i.default.bold(this.totalConflicts)} conflicts resolved:`,``,`${i.default.green($.acceptRemote)} Accepted remote: ${n}`,`${i.default.yellow($.acceptLocal)} Kept local: ${r}`,`${i.default.cyan($.acceptBoth)} Kept both: ${a}`];e.w.box(o.join(`
168
- `))}renderCancelled(){e.v(),e.w.log(i.default.yellow(`Conflict resolution cancelled`)),e.w.log(``),e.w.log(`No changes were made to your local connector file.`)}getCurrentConflictIndex(){let e=-1;for(let t=0;t<=this.currentIndex&&t<this.conflicts.length;t++)this.conflicts[t].conflict.type===`conflict`&&e++;return e}moveToNextConflict(){for(let e=this.currentIndex+1;e<this.conflicts.length;e++)if(this.conflicts[e].conflict.type===`conflict`){this.currentIndex=e;return}for(let e=0;e<this.currentIndex;e++)if(this.conflicts[e].conflict.type===`conflict`){this.currentIndex=e;return}}moveToPrevConflict(){for(let e=this.currentIndex-1;e>=0;e--)if(this.conflicts[e].conflict.type===`conflict`){this.currentIndex=e;return}for(let e=this.conflicts.length-1;e>this.currentIndex;e--)if(this.conflicts[e].conflict.type===`conflict`){this.currentIndex=e;return}}moveToNextUnresolved(){for(let e=this.currentIndex+1;e<this.conflicts.length;e++)if(this.conflicts[e].conflict.type===`conflict`&&this.conflicts[e].choice===`pending`){this.currentIndex=e;return}for(let e=0;e<this.currentIndex;e++)if(this.conflicts[e].conflict.type===`conflict`&&this.conflicts[e].choice===`pending`){this.currentIndex=e;return}}setCurrentChoice(e){this.conflicts[this.currentIndex]?.conflict.type===`conflict`&&(this.conflicts[this.currentIndex].choice=e)}allResolved(){return this.conflicts.filter(e=>e.conflict.type===`conflict`).every(e=>e.choice!==`pending`)}acceptAllRemaining(e){for(let t of this.conflicts)t.conflict.type===`conflict`&&t.choice===`pending`&&(t.choice=e)}centerText(e,t){let n=this.stripAnsi(e),r=Math.max(0,Math.floor((t-n.length)/2));return` `.repeat(r)+e}stripAnsi(e){return e.replace(/\x1b\[[0-9;]*m/g,``)}getResolvedContent(){let e=[];for(let t of this.conflicts)if(t.conflict.type===`unchanged`)e.push(t.conflict.content||``);else if(t.conflict.type===`conflict`)switch(t.choice){case`remote`:t.conflict.remote&&e.push(t.conflict.remote);break;case`local`:t.conflict.local&&e.push(t.conflict.local);break;case`both`:t.conflict.local&&e.push(t.conflict.local),t.conflict.remote&&e.push(t.conflict.remote);break;case`pending`:t.conflict.remote&&e.push(t.conflict.remote);break}return e.join(``)}};const Ut=`https://api.stackone.com`,Wt=3;var Gt=class{async execute({profile:t,connector:n,outputPath:r,apiUrl:a,apiKey:o,owner:s}={}){if((0,C.isMissing)(n)&&(e.w.error(`Connector identifier is required`),e.w.log(`Please provide a connector identifier using the ${e.C(`--connector`)} option in the format: ${e.C(`provider_key@version`)} or ${e.C(`provider_key`)}`),e.w.log(`If no version is specified, the latest version will be pulled.`),process.exit(1)),!t&&!o&&(e.w.error(`Profile or API key is required`),e.w.log(`Please provide a profile using the ${e.C(`--profile`)} option or an API key using the ${e.C(`--api-key`)} option.`),e.w.log(`To create a profile, run ${e.C(`stackone init`)}.`),process.exit(1)),t&&o&&(e.w.error(`Please provide either a profile or an API key, not both`),process.exit(1)),t&&a&&e.w.warn(`Specifying ${e.C(`--api-url`)} with a profile won't have any effect. Using API url from profile.`),t&&!Ot(t)){e.w.error(`Configuration profile ${e.C(t)} not found`),e.w.log(`Run ${e.C(`stackone init`)} to create a new configuration profile.\n`);let n=At();n.length>0&&(e.w.info(`Available configuration profiles:`),n.forEach(t=>{e.w.log(` - ${i.default.blue(t)}`)})),process.exit(1)}let c=t?Dt(t):{apiUrl:a??Ut,apiKey:o};c?.apiKey||(e.w.error(`API key is missing`),e.w.log(`Please provide a valid API key in the profile or via the ${e.C(`--api-key`)} option.`),process.exit(1));let l=c.apiUrl??Ut,[u,d]=n.split(`@`),f=await this.#f(u,l,c.apiKey,d??`latest`,s),p=this.#e(f),m=p.version??`unknown`,h=this.#t(r,p.key,m),g=this.#r(h),_=g===null,v=f;if(!_){let t=this.#i(g,h);t&&(e.w.warn(t.message),t.errors.length>0&&e.y(t.errors,!1),e.w.log(``));let r=t?void 0:this.#e(g);if(this.#o(g,f)){this.#a(g,f,h);let t=r?.version??`unknown`,i=await this.#s(g,f,n,t,m);i.action===`cancel`&&((0,w.cancel)(`Pull cancelled`),process.exit(0)),i.action===`keep-local`&&(e.w.log(``),e.w.info(`Keeping local version. No changes made.`),process.exit(0)),i.action===`interactive-cancel`&&process.exit(0),i.action===`interactive`&&(v=i.resolvedContent)}else e.w.info(`No changes detected in connector configuration.`),process.exit(0)}let y=(0,T.validateYamlConnector)(v).connector,b=y?.key??p.key,x=y?.version??m,S=this.#t(r,b,x),E=S;if(S!==h){let t=await this.#n(S);e.w.log(``),t!==void 0&&(E=t)}await this.#d(E,v),_?e.w.success(`Connector ${e.C(b)}@${e.C(x)} pulled successfully (new connector)`):e.w.success(`Connector ${e.C(b)}@${e.C(x)} updated successfully`);let ee=b===p.key?e.C(b):`${e.C(p.key)} ${i.default.whiteBright(`→`)} ${e.C(b)}`,D=x===m?e.C(x):`${e.C(m)} ${i.default.whiteBright(`→`)} ${e.C(x)}`,O=E===h?e.C(E):`${e.C(h)}\n ${i.default.whiteBright(`→`)} ${e.C(E)}`;e.w.log(`\n${i.default.blue.inverse(` CONNECTOR DETAILS `)}\n`),e.w.log(` Provider: ${ee}`),e.w.log(` Version: ${D}`),e.w.log(` Output file: ${O}`),process.exit(0)}#e(t){let n=(0,T.validateYamlConnector)(t),r=n?.errors??[];if(n.success)return n.connector;e.w.error(`Connector pulled from the registry is not valid`),e.w.log(`Please make sure you are using the latest version of the StackOne CLI by running ${e.C(`stackone update`)}`),r.length>0&&e.y(r,!0),process.exit(1)}#t(t,n,r){let i=`${n}_v${r.replaceAll(`.`,`-`)}.s1.yaml`;return t?(m.default.existsSync(t)&&(m.default.statSync(t).isDirectory()||(e.w.error(`Output path ${e.C(t)} is not a directory`),e.w.log(`Please provide a valid directory path to store connectors or use the default path.`),process.exit(1))),h.default.resolve(t,n,i)):h.default.resolve(process.cwd(),`connectors`,n,i)}async#n(t){if(!m.default.existsSync(t))return;let n=h.default.basename(t),r=h.default.dirname(t);e.w.warn(`File ${e.C(n)} already exists at ${e.C(r)}`);let i=await(0,w.select)({message:`How would you like to proceed?`,options:[{value:`override`,label:`Override existing file`,hint:`Replace the existing file with the new content`},{value:`rename`,label:`Save with a different name`,hint:`Provide a new filename for the connector`},{value:`cancel`,label:`Cancel`,hint:`Abort the pull operation`}]});if(((0,w.isCancel)(i)||i===`cancel`)&&((0,w.cancel)(`Operation cancelled. No local changes were made.`),process.exit(0)),i===`override`)return;let a=await(0,w.text)({message:`Enter the new filename:`,placeholder:n,validate:e=>{if(!e||e.trim()===``)return`Filename cannot be empty`;if(!e.endsWith(`.s1.yaml`))return`Filename must end with .s1.yaml`;let t=h.default.join(r,e.trim());if(m.default.existsSync(t))return`File ${e} already exists`}});return(0,w.isCancel)(a)&&((0,w.cancel)(`Operation cancelled. No local changes were made.`),process.exit(0)),h.default.join(r,a.trim())}#r(e){if(!m.default.existsSync(e))return null;try{return m.default.readFileSync(e,`utf-8`)}catch{return null}}#i(t,n){try{let r=(0,T.validateYamlConnector)(t);if(!r.success){let t=r.errors??[];return{message:`Local connector ${e.C(h.default.basename(n))} has validation errors:`,errors:t}}}catch(t){return{message:`Local connector ${e.C(h.default.basename(n))} could not be validated: ${t.message}`,errors:[]}}return null}#a(t,n,r){let a=(0,E.diffLines)(t,n);if(!a.some(e=>e.added||e.removed)){e.w.info(`No changes detected in connector configuration.`);return}e.w.log(`${i.default.blue.inverse(` CHANGES `)}\n`),e.w.log(i.default.gray(`--- local: ${r}`)),e.w.log(i.default.gray(`+++ remote: StackOne Registry`)),e.w.log(``);let o=0,s=0;for(let t of a){let n=t.value.split(`
169
- `).filter(e=>e!==``);if(t.added){o+=n.length;for(let t of n)e.w.log(i.default.green(`+ ${t}`))}else if(t.removed){s+=n.length;for(let t of n)e.w.log(i.default.red(`- ${t}`))}else if(n.length<=6)for(let t of n)e.w.log(i.default.gray(` ${t}`));else{for(let t=0;t<3;t++)e.w.log(i.default.gray(` ${n[t]}`));e.w.log(i.default.gray(` ... (${n.length-6} unchanged lines)`));for(let t=n.length-3;t<n.length;t++)e.w.log(i.default.gray(` ${n[t]}`))}}e.w.log(``),e.w.log(i.default.gray(`Summary: ${i.default.green(`+${o}`)} additions, ${i.default.red(`-${s}`)} deletions`))}#o(e,t){return(0,E.diffLines)(e,t).some(e=>e.added||e.removed)}async#s(t,n,r,i,a){e.w.log(``);let o=await(0,w.select)({message:`How would you like to resolve the differences?`,options:[{value:`override`,label:`Override local with remote`,hint:`Replace your local file with the StackOne version`},{value:`keep-local`,label:`Keep local version`,hint:`Cancel the pull and keep your current file`},{value:`interactive`,label:`Resolve conflicts interactively`,hint:`Choose which changes to accept one by one`},{value:`cancel`,label:`Cancel`,hint:`Abort the pull operation`}]});if((0,w.isCancel)(o))return{action:`cancel`};if(o===`override`)return{action:`override`};if(o===`keep-local`)return{action:`keep-local`};if(o===`interactive`){let e=await this.#c(t,n,r,i,a);return e===null?{action:`interactive-cancel`}:{action:`interactive`,resolvedContent:e}}return{action:`cancel`}}async#c(t,n,r,i,a){let o=(0,E.diffLines)(t,n),s=this.#u(o);if(s.length===0)return e.w.info(`No conflicts to resolve.`),n;let c=new Ht(s,r,i,a);for(;;){if((await c.resolve()).cancelled)return null;let t=c.getResolvedContent(),n=(0,T.validateYamlConnector)(t);if(n.success)return c.renderFinalSummary(),t;let r=await this.#l(n.errors);if(r===`cancel`)return e.v(),e.w.info(`Operation cancelled. No changes were made to the local connector.`),null;if(r===`save`)return e.v(),e.w.warn(`The connector was saved but it is invalid`),t;c.resetForReResolution()}}async#l(t){let{createInterface:n}=await import(`readline`);return new Promise(r=>{e.v();let a=(t||[{message:`Unknown validation error`}]).map(e=>` • ${e.message}`).join(`
170
- `);e.w.box({title:`⚠️ Validation Failed`,message:`The resolved connector configuration is invalid:\n\n${a}`,style:{borderColor:`yellow`,padding:1}}),e.w.log(``),e.w.log(i.default.bold(` Choose an action:`)),e.w.log(``),e.w.log(i.default.cyan(` [B]`)+` ← Go back to conflict resolution`),e.w.log(i.default.dim(` Modify your choices to fix the validation errors`)),e.w.log(``),e.w.log(i.default.yellow(` [S]`)+` 💾 Save anyway`),e.w.log(i.default.dim(` Save the invalid configuration (not recommended)`)),e.w.log(``),e.w.log(i.default.red(` [C]`)+` ✖ Cancel`),e.w.log(i.default.dim(` Discard all changes`)),e.w.log(``);let o=n({input:process.stdin,output:process.stdout});process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.resume();let s=e=>{let t=e.toString().toLowerCase(),n=()=>{process.stdin.removeListener(`data`,s),process.stdin.isTTY&&process.stdin.setRawMode(!1),o.close()};if(t===``||t===`\x1B`){n(),r(`cancel`);return}switch(t){case`b`:n(),r(`back`);break;case`s`:n(),r(`save`);break;case`c`:case`q`:n(),r(`cancel`);break}};process.stdin.on(`data`,s)})}#u(e){let t=[],n=0;for(;n<e.length;){let r=e[n];if(!r.added&&!r.removed)t.push({type:`unchanged`,content:r.value}),n++;else if(r.removed){let i=e[n+1];i?.added?(t.push({type:`conflict`,local:r.value,remote:i.value}),n+=2):(t.push({type:`conflict`,local:r.value,remote:void 0}),n++)}else r.added&&t.push({type:`conflict`,local:void 0,remote:r.value}),n++}return t}async#d(t,n){let r=h.default.dirname(t);m.default.existsSync(r)||m.default.mkdirSync(r,{recursive:!0});try{m.default.writeFileSync(t,n,`utf-8`)}catch(n){e.w.error(`Failed to write connector to file ${e.C(t)}: ${n.message}`),process.exit(1)}}async#f(t,n,r,i,a){let o=(0,v.default)(`Pulling connector ${e.C(t)}@${e.C(i)} from registry...`).start();try{let s=Buffer.from(r).toString(`base64`),c=`${n}/registry/connectors/${t}@${i}${a?`?owner=${encodeURIComponent(a)}`:``}`,l=await fetch(c,{method:`GET`,headers:{Authorization:`Basic ${s}`}});if(o.stop(),l.status===409){a&&(await this.#p(l,t,i),process.exit(1));let r=(await l.json()).availableOwners??[],c=await Pt(`${t}@${i}`,r);o.text=`Pulling connector ${e.C(t)}@${e.C(i)} from registry...`,o.start();let u=`${n}/registry/connectors/${t}@${i}`,d=await fetch(`${u}?owner=${encodeURIComponent(c)}`,{method:`GET`,headers:{Authorization:`Basic ${s}`}});return o.stop(),d.ok||(await this.#p(d,t,i),process.exit(1)),await d.text()}return l.ok||(await this.#p(l,t,i),process.exit(1)),await l.text()}catch(r){o.stop(),e.w.error(`Failed to pull connector ${e.C(t)}@${e.C(i)} from the registry: ${r.message}`),e.w.log(`Please ensure that the API at ${e.T(n)} is reachable and the API key is valid.`),process.exit(1)}}async#p(t,n,r){switch(t.status){case 401:case 403:e.w.error(`Access denied`),e.w.log(`Please ensure that your API key is valid and has the ${e.C(`connectors:read`)} scope required to pull connectors.`);break;case 404:e.w.error(`Connector ${e.C(n)}@${e.C(r)} was not found in the registry`),await this.#m(n);break;case 429:e.w.error(`Rate limit exceeded`),e.w.log(`Too many requests. Please wait a moment before trying again.`);break;default:await e.x(t,`Failed to pull connector ${e.C(n)}`)}}async#m(t){e.w.info(`To see available versions, check the connector documentation or contact support.`)}};const Kt=`https://api.stackone.com`;var qt=class{async execute({profile:t,fileOrDir:n,apiUrl:r,apiKey:a,force:o}={}){if(!t&&!a&&(e.w.error(`Profile or API key is required`),e.w.log(`Please provide a profile using the ${e.C(`--profile`)} option or an API key using the ${e.C(`--api-key`)} option.`),e.w.log(`To create a profile, run ${e.C(`stackone init`)}.`),process.exit(1)),t&&a&&(e.w.error(`Please provide either a profile or an API key, not both`),process.exit(1)),t&&r&&e.w.warn(`Specifying ${e.C(`--api-url`)} with a profile won't have any effect. Using API url from profile.`),t&&!Ot(t)){e.w.error(`Configuration profile ${e.C(t)} not found`),e.w.log(`Run ${e.C(`stackone init`)} to create a new configuration profile.\n`);let n=At();n.length>0&&(e.w.info(`Available configuration profiles:`),n.forEach(t=>{e.w.log(` - ${i.default.blue(t)}`)})),process.exit(1)}let s=t?Dt(t):{apiUrl:r??Kt,apiKey:a};s?.apiKey||(e.w.error(`API key is missing`),e.w.log(`Please provide a valid API key in the profile or via the ${e.C(`--api-key`)} option.`),process.exit(1)),n||(e.w.error(`File or directory is required.`),process.exit(1));try{(0,m.statSync)(n)}catch{e.w.error(`File or directory not found: ${i.default.red(n)}`),process.exit(1)}let c=(0,m.statSync)(n),l=s.apiUrl??Kt;if(c.isDirectory()){let t=Zt(n),r=0;t.length===0?(e.w.error(`No .s1.yaml connector files found in the directory: ${n}.`),process.exit(1)):(e.w.start(`Found ${t.length} connector(s) file(s). Pushing to registry...`),e.w.log(``));for(let e of t)await this.uploadFile(e,l,s.apiKey,o)&&r++;r===0?e.w.error(`Error while pushing connectors: no files were uploaded`):(e.w.log(``),e.w.info(`Upload completed: ${i.default.green(r)} of ${i.default.blue(t.length)} file(s) uploaded successfully.`)),process.exit(r>0?0:1)}else n.endsWith(`.s1.yaml`)||(e.w.error(`Only ${e.C(`.s1.yaml`)} files are supported for upload`),process.exit(1));let u=await this.uploadFile(n,l,s.apiKey,o);process.exit(u?0:1)}async uploadFile(t,n,r,i){let a=(0,v.default)(`📤 Pushing connector in ${(0,h.basename)(t)}...`).start();try{let o=Xt(t);if(!o)return!1;let s=(0,h.basename)(t),c=new FormData,l=new Blob([o],{type:`application/x-yaml`});c.append(`file`,l,s),i&&c.append(`force`,`true`);let u=Buffer.from(r).toString(`base64`),d=await fetch(`${n}/registry/connectors`,{method:`POST`,headers:{Authorization:`Basic ${u}`},body:c});if(a.stop(),!d.ok)return d.status===409||d.status===422?await this.handleVersionConflict(d,t,n,r,i):(await e.x(d,`Failed to push connector in ${e.C(s)} to the registry`),!1);let f=await d.json();return e.w.success(`Successfully uploaded ${e.C(s)} with connector ${e.C(f.provider)}@${e.C(f.version)}`),!0}catch(r){return a.stop(),e.w.error(`Failed to upload file ${e.C(t)}: ${r}`),e.w.log(`Please ensure that the API at ${e.T(n)} is reachable and the API key is valid`),!1}}async handleVersionConflict(t,n,r,i,a){let o=await t.text(),s;try{s=JSON.parse(o)}catch{}let c=D.default.valid(s?.latestVersion);if(!c)return await e.x(new Response(o,{status:t.status,statusText:t.statusText}),`Failed to push connector in ${e.C((0,h.basename)(n))} to the registry`),!1;let l=(0,m.readFileSync)(n,`utf-8`),u=Jt(l),d=u?`${e.C(u)}`:``,f=t.status===409?`Version ${d} already exists in the registry. Latest version: ${e.C(c)}`:`Version ${d} is lower than the latest version in the registry. Latest version: ${e.C(c)}`;e.w.error(f);let p=D.default.inc(c,`patch`)??c,g=D.default.inc(c,`minor`)??c,_=D.default.inc(c,`major`)??c,v=await(0,w.select)({message:`How would you like to proceed?`,options:[{value:p,label:`Bump patch version (${p})`},{value:g,label:`Bump minor version (${g})`},{value:_,label:`Bump major version (${_})`},{value:`cancel`,label:`Cancel push`}]});return(0,w.isCancel)(v)||v===`cancel`?((0,w.cancel)(`Push cancelled`),!1):((0,m.writeFileSync)(n,Yt(l,v),`utf-8`),e.w.info(`Updated version to ${e.C(v)} in ${(0,h.basename)(n)}`),this.uploadFile(n,r,i,a))}};const Jt=e=>e.match(/^\s*version: (\S+)/m)?.[1],Yt=(e,t)=>e.replace(/^(\s*version: )\S+/m,`$1${t}`),Xt=t=>{let n=(0,T.loadConnector)(t),r=(0,T.validateYamlConnector)(n),i=r?.errors??[];if(r.success)return n;i.length>0?(e.w.error(`Connector in ${e.S(t)} is not valid`),e.y(i,!0)):e.w.error(`Connector in ${e.S(t)} is not valid. Please check the file for errors.`)},Zt=e=>{let t=[],n=(0,m.readdirSync)(e,{withFileTypes:!0});for(let r of n){let n=(0,h.join)(e,r.name);r.isDirectory()?t.push(...Zt(n)):r.name.endsWith(`.s1.yaml`)&&t.push(n)}return t},Qt=C.z.object({provider_key:C.z.string().optional(),provider_version:C.z.string().optional(),auth_config_key:C.z.string(),environment:C.z.string().default(`production`),organization_id:C.z.string().default(`cli-organization-id`),account_id:C.z.string().default(`cli-account-secure-id`),project_id:C.z.string().default(`cli-project-secure-id`),credentials:C.z.record(C.z.string(),C.z.any()).default({})}),$t=C.z.record(C.z.string(),C.z.any()),en=C.z.object({path:C.z.record(C.z.string(),C.z.any()).default({}),queryParams:C.z.record(C.z.string(),C.z.any()).default({}),header:C.z.record(C.z.string(),C.z.any()).default({}),body:C.z.record(C.z.string(),C.z.any()).default({})}),tn=`https://api.stackone.com`;var nn=class{async execute({connector:t,action:n,actionId:r,account:a,accountId:o,params:s,credentials:c,profile:l,outputFile:u,debug:d,apiUrl:f,apiKey:p,owner:h}={}){if(!l&&!p&&o&&(e.w.error(`Profile or API key is required when providing an account ID`),e.w.log(`Please provide a profile using the ${e.C(`--profile`)} option or an API key using the ${e.C(`--api-key`)} option.`),e.w.log(`To create a profile, run ${e.C(`stackone init`)}.`),process.exit(1)),l&&p&&(e.w.error(`Please provide either a profile or an API key, not both`),process.exit(1)),l&&f&&e.w.warn(`Specifying --api-url with a profile won't have any effect. Using API url from profile.`),l&&!Ot(l)){e.w.error(`Configuration profile ${e.C(l)} not found`),e.w.log(`Run ${e.C(`stackone init`)} to create a new configuration profile.\n`);let t=At();t.length>0&&(e.w.info(`Available configuration profiles:`),t.forEach(t=>{e.w.log(` - ${i.default.blue(t)}`)})),process.exit(1)}let g=l?Dt(l):{apiUrl:f??tn,apiKey:p};(0,C.isMissing)(a)&&(0,C.isMissing)(o)&&(e.w.error(`A valid account or account ID is required to run an action`),process.exit(1));let _;if((0,C.notMissing)(t))if(this.#a(t)){!l&&!p&&(e.w.error(`Profile or API key is required when using a connector identifier`),e.w.log(`Please provide a profile using the ${e.C(`--profile`)} option or an API key using the ${e.C(`--api-key`)} option.`),e.w.log(`Run ${e.C(`stackone init`)} to create a new configuration profile.`),process.exit(1));let n=this.#o(t);_=await this.#s(n,g?.apiUrl??tn,g?.apiKey,h)}else _=this.#e(t);else (0,C.notMissing)(o)&&(_=await this.#c(o,g?.apiUrl??tn,g?.apiKey));let v=(0,C.notMissing)(n)?this.#r(n,t):_;(0,C.isMissing)(v)&&(e.w.error(`A valid connector is required to run an action.`),process.exit(1));let y=(0,C.notMissing)(v?.actions)?Object.keys(v?.actions).length:0,b=(0,C.notMissing)(v?.actions)?Object.keys(v.actions)[y-1]:void 0,x=(0,C.notMissing)(b)?v?.actions?.[b]?.id:void 0,S=((0,C.notMissing)(r)&&!r?.startsWith(`${v.key}_`)?`${v.key}_${r}`:r)??x;(0,C.isMissing)(S)&&(e.w.error(`A valid action ID is required to run an action`),process.exit(1));let w=(0,C.notMissing)(o)?await this.#l(o,g?.apiUrl??tn,g?.apiKey):{},T=(0,C.notMissing)(a)?this.#i(a,v.key??`unknown`,v.version??`unknown`):void 0,E=(0,C.notMissing)(c)?this.#u(c):{},ee={...w,...T,credentials:{...w.credentials??{},...E}};(0,C.isMissing)(ee)&&(e.w.error(`A valid account data is required to run an action.`),process.exit(1));let D=v.actions?.[S];(0,C.isMissing)(D)&&(e.w.error(`Action ID ${e.C(S)} not found in the connector ${e.C(v.key)}@${e.C(v.version)}.`),process.exit(1));let O=(0,C.notMissing)(s)?this.#d(s,S):{path:{},queryParams:{},header:{},body:{}},k=Date.now(),A=await this.#f({connector:v,actionId:S,account:ee,queryParams:{...O.queryParams,...d?{debug:`true`}:{}},pathParams:O.path,body:O.body,headers:O.header}),j=Date.now()-k;if((0,C.notMissing)(u))try{m.default.writeFileSync(u,JSON.stringify(A.output,null,2),`utf-8`),e.w.info(`Output written to file: ${u}`)}catch(t){e.w.error(`Failed to write output to file ${u}: ${t.message}`),process.exit(1)}else e.w.log(`\n${i.default.blue.inverse(` ACTION OUTPUT `)}`),e.b(A.output);e.w.log(``),e.w.info(`Action ${e.C(S)} from connector ${e.C(v?.key)}@${e.C(v?.version)} finished in ${i.default.yellowBright((j/1e3).toFixed(2))} seconds.`),process.exit(0)}#e=e=>{let t=e;try{t=(0,T.loadConnector)(e)}catch{}return t?this.#n(t):void 0};#t=t=>{try{return(0,T.loadConnector)(t)}catch(n){e.w.error(`Failed to load connector file from ${e.C(t)}: ${n.message}`),process.exit(1)}};#n=t=>{let n=(0,T.validateYamlConnector)(t),r=n?.errors??[];if(n.success)return n.connector||(e.w.error(`Failed to load connector.`),process.exit(1)),n.connector;r.length>0?(e.w.error(`Connector is not valid`),e.y(r,!0),process.exit(1)):(e.w.error(`Connector is not valid. Please check the file for errors.`),process.exit(1))};#r=(t,n)=>{let r=t;try{r=m.default.readFileSync(t,`utf-8`)}catch{}(0,C.isMissing)(n)&&(e.w.error(`A valid connector is required to load an action.`),process.exit(1));let i=`${this.#t(n)} - ${r.split(`
170
+ `))}renderCancelled(){e.v(),e.w.log(i.default.yellow(`Conflict resolution cancelled`)),e.w.log(``),e.w.log(`No changes were made to your local connector file.`)}getCurrentConflictIndex(){let e=-1;for(let t=0;t<=this.currentIndex&&t<this.conflicts.length;t++)this.conflicts[t].conflict.type===`conflict`&&e++;return e}moveToNextConflict(){for(let e=this.currentIndex+1;e<this.conflicts.length;e++)if(this.conflicts[e].conflict.type===`conflict`){this.currentIndex=e;return}for(let e=0;e<this.currentIndex;e++)if(this.conflicts[e].conflict.type===`conflict`){this.currentIndex=e;return}}moveToPrevConflict(){for(let e=this.currentIndex-1;e>=0;e--)if(this.conflicts[e].conflict.type===`conflict`){this.currentIndex=e;return}for(let e=this.conflicts.length-1;e>this.currentIndex;e--)if(this.conflicts[e].conflict.type===`conflict`){this.currentIndex=e;return}}moveToNextUnresolved(){for(let e=this.currentIndex+1;e<this.conflicts.length;e++)if(this.conflicts[e].conflict.type===`conflict`&&this.conflicts[e].choice===`pending`){this.currentIndex=e;return}for(let e=0;e<this.currentIndex;e++)if(this.conflicts[e].conflict.type===`conflict`&&this.conflicts[e].choice===`pending`){this.currentIndex=e;return}}setCurrentChoice(e){this.conflicts[this.currentIndex]?.conflict.type===`conflict`&&(this.conflicts[this.currentIndex].choice=e)}allResolved(){return this.conflicts.filter(e=>e.conflict.type===`conflict`).every(e=>e.choice!==`pending`)}acceptAllRemaining(e){for(let t of this.conflicts)t.conflict.type===`conflict`&&t.choice===`pending`&&(t.choice=e)}centerText(e,t){let n=this.stripAnsi(e),r=Math.max(0,Math.floor((t-n.length)/2));return` `.repeat(r)+e}stripAnsi(e){return e.replace(/\x1b\[[0-9;]*m/g,``)}getResolvedContent(){let e=[];for(let t of this.conflicts)if(t.conflict.type===`unchanged`)e.push(t.conflict.content||``);else if(t.conflict.type===`conflict`)switch(t.choice){case`remote`:t.conflict.remote&&e.push(t.conflict.remote);break;case`local`:t.conflict.local&&e.push(t.conflict.local);break;case`both`:t.conflict.local&&e.push(t.conflict.local),t.conflict.remote&&e.push(t.conflict.remote);break;case`pending`:t.conflict.remote&&e.push(t.conflict.remote);break}return e.join(``)}};const pn=`https://api.stackone.com`,mn=3;var hn=class{async execute({profile:t,connector:n,outputPath:r,apiUrl:a,apiKey:o,owner:s}={}){if((0,C.isMissing)(n)&&(e.w.error(`Connector identifier is required`),e.w.log(`Please provide a connector identifier using the ${e.C(`--connector`)} option in the format: ${e.C(`provider_key@version`)} or ${e.C(`provider_key`)}`),e.w.log(`If no version is specified, the latest version will be pulled.`),process.exit(1)),!t&&!o&&(e.w.error(`Profile or API key is required`),e.w.log(`Please provide a profile using the ${e.C(`--profile`)} option or an API key using the ${e.C(`--api-key`)} option.`),e.w.log(`To create a profile, run ${e.C(`stackone init`)}.`),process.exit(1)),t&&o&&(e.w.error(`Please provide either a profile or an API key, not both`),process.exit(1)),t&&a&&e.w.warn(`Specifying ${e.C(`--api-url`)} with a profile won't have any effect. Using API url from profile.`),t&&!Zt(t)){e.w.error(`Configuration profile ${e.C(t)} not found`),e.w.log(`Run ${e.C(`stackone init`)} to create a new configuration profile.\n`);let n=$t();n.length>0&&(e.w.info(`Available configuration profiles:`),n.forEach(t=>{e.w.log(` - ${i.default.blue(t)}`)})),process.exit(1)}let c=t?Xt(t):{apiUrl:a??pn,apiKey:o};c?.apiKey||(e.w.error(`API key is missing`),e.w.log(`Please provide a valid API key in the profile or via the ${e.C(`--api-key`)} option.`),process.exit(1));let l=c.apiUrl??pn,[u,d]=n.split(`@`),f=await this.#f(u,l,c.apiKey,d??`latest`,s),p=this.#e(f),m=p.version??`unknown`,h=this.#t(r,p.key,m),g=this.#r(h),_=g===null,v=f;if(!_){let t=this.#i(g,h);t&&(e.w.warn(t.message),t.errors.length>0&&e.y(t.errors,!1),e.w.log(``));let r=t?void 0:this.#e(g);if(this.#o(g,f)){this.#a(g,f,h);let t=r?.version??`unknown`,i=await this.#s(g,f,n,t,m);i.action===`cancel`&&((0,w.cancel)(`Pull cancelled`),process.exit(0)),i.action===`keep-local`&&(e.w.log(``),e.w.info(`Keeping local version. No changes made.`),process.exit(0)),i.action===`interactive-cancel`&&process.exit(0),i.action===`interactive`&&(v=i.resolvedContent)}else e.w.info(`No changes detected in connector configuration.`),process.exit(0)}let y=(0,T.validateYamlConnector)(v).connector,b=y?.key??p.key,x=y?.version??m,S=this.#t(r,b,x),E=S;if(S!==h){let t=await this.#n(S);e.w.log(``),t!==void 0&&(E=t)}await this.#d(E,v),_?e.w.success(`Connector ${e.C(b)}@${e.C(x)} pulled successfully (new connector)`):e.w.success(`Connector ${e.C(b)}@${e.C(x)} updated successfully`);let ee=b===p.key?e.C(b):`${e.C(p.key)} ${i.default.whiteBright(`→`)} ${e.C(b)}`,D=x===m?e.C(x):`${e.C(m)} ${i.default.whiteBright(`→`)} ${e.C(x)}`,O=E===h?e.C(E):`${e.C(h)}\n ${i.default.whiteBright(`→`)} ${e.C(E)}`;e.w.log(`\n${i.default.blue.inverse(` CONNECTOR DETAILS `)}\n`),e.w.log(` Provider: ${ee}`),e.w.log(` Version: ${D}`),e.w.log(` Output file: ${O}`),process.exit(0)}#e(t){let n=(0,T.validateYamlConnector)(t),r=n?.errors??[];if(n.success)return n.connector;e.w.error(`Connector pulled from the registry is not valid`),e.w.log(`Please make sure you are using the latest version of the StackOne CLI by running ${e.C(`stackone update`)}`),r.length>0&&e.y(r,!0),process.exit(1)}#t(t,n,r){let i=`${n}_v${r.replaceAll(`.`,`-`)}.s1.yaml`;return t?(m.default.existsSync(t)&&(m.default.statSync(t).isDirectory()||(e.w.error(`Output path ${e.C(t)} is not a directory`),e.w.log(`Please provide a valid directory path to store connectors or use the default path.`),process.exit(1))),h.default.resolve(t,n,i)):h.default.resolve(process.cwd(),`connectors`,n,i)}async#n(t){if(!m.default.existsSync(t))return;let n=h.default.basename(t),r=h.default.dirname(t);e.w.warn(`File ${e.C(n)} already exists at ${e.C(r)}`);let i=await(0,w.select)({message:`How would you like to proceed?`,options:[{value:`override`,label:`Override existing file`,hint:`Replace the existing file with the new content`},{value:`rename`,label:`Save with a different name`,hint:`Provide a new filename for the connector`},{value:`cancel`,label:`Cancel`,hint:`Abort the pull operation`}]});if(((0,w.isCancel)(i)||i===`cancel`)&&((0,w.cancel)(`Operation cancelled. No local changes were made.`),process.exit(0)),i===`override`)return;let a=await(0,w.text)({message:`Enter the new filename:`,placeholder:n,validate:e=>{if(!e||e.trim()===``)return`Filename cannot be empty`;if(!e.endsWith(`.s1.yaml`))return`Filename must end with .s1.yaml`;let t=h.default.join(r,e.trim());if(m.default.existsSync(t))return`File ${e} already exists`}});return(0,w.isCancel)(a)&&((0,w.cancel)(`Operation cancelled. No local changes were made.`),process.exit(0)),h.default.join(r,a.trim())}#r(e){if(!m.default.existsSync(e))return null;try{return m.default.readFileSync(e,`utf-8`)}catch{return null}}#i(t,n){try{let r=(0,T.validateYamlConnector)(t);if(!r.success){let t=r.errors??[];return{message:`Local connector ${e.C(h.default.basename(n))} has validation errors:`,errors:t}}}catch(t){return{message:`Local connector ${e.C(h.default.basename(n))} could not be validated: ${t.message}`,errors:[]}}return null}#a(t,n,r){let a=(0,E.diffLines)(t,n);if(!a.some(e=>e.added||e.removed)){e.w.info(`No changes detected in connector configuration.`);return}e.w.log(`${i.default.blue.inverse(` CHANGES `)}\n`),e.w.log(i.default.gray(`--- local: ${r}`)),e.w.log(i.default.gray(`+++ remote: StackOne Registry`)),e.w.log(``);let o=0,s=0;for(let t of a){let n=t.value.split(`
171
+ `).filter(e=>e!==``);if(t.added){o+=n.length;for(let t of n)e.w.log(i.default.green(`+ ${t}`))}else if(t.removed){s+=n.length;for(let t of n)e.w.log(i.default.red(`- ${t}`))}else if(n.length<=6)for(let t of n)e.w.log(i.default.gray(` ${t}`));else{for(let t=0;t<3;t++)e.w.log(i.default.gray(` ${n[t]}`));e.w.log(i.default.gray(` ... (${n.length-6} unchanged lines)`));for(let t=n.length-3;t<n.length;t++)e.w.log(i.default.gray(` ${n[t]}`))}}e.w.log(``),e.w.log(i.default.gray(`Summary: ${i.default.green(`+${o}`)} additions, ${i.default.red(`-${s}`)} deletions`))}#o(e,t){return(0,E.diffLines)(e,t).some(e=>e.added||e.removed)}async#s(t,n,r,i,a){e.w.log(``);let o=await(0,w.select)({message:`How would you like to resolve the differences?`,options:[{value:`override`,label:`Override local with remote`,hint:`Replace your local file with the StackOne version`},{value:`keep-local`,label:`Keep local version`,hint:`Cancel the pull and keep your current file`},{value:`interactive`,label:`Resolve conflicts interactively`,hint:`Choose which changes to accept one by one`},{value:`cancel`,label:`Cancel`,hint:`Abort the pull operation`}]});if((0,w.isCancel)(o))return{action:`cancel`};if(o===`override`)return{action:`override`};if(o===`keep-local`)return{action:`keep-local`};if(o===`interactive`){let e=await this.#c(t,n,r,i,a);return e===null?{action:`interactive-cancel`}:{action:`interactive`,resolvedContent:e}}return{action:`cancel`}}async#c(t,n,r,i,a){let o=(0,E.diffLines)(t,n),s=this.#u(o);if(s.length===0)return e.w.info(`No conflicts to resolve.`),n;let c=new fn(s,r,i,a);for(;;){if((await c.resolve()).cancelled)return null;let t=c.getResolvedContent(),n=(0,T.validateYamlConnector)(t);if(n.success)return c.renderFinalSummary(),t;let r=await this.#l(n.errors);if(r===`cancel`)return e.v(),e.w.info(`Operation cancelled. No changes were made to the local connector.`),null;if(r===`save`)return e.v(),e.w.warn(`The connector was saved but it is invalid`),t;c.resetForReResolution()}}async#l(t){let{createInterface:n}=await import(`readline`);return new Promise(r=>{e.v();let a=(t||[{message:`Unknown validation error`}]).map(e=>` • ${e.message}`).join(`
172
+ `);e.w.box({title:`⚠️ Validation Failed`,message:`The resolved connector configuration is invalid:\n\n${a}`,style:{borderColor:`yellow`,padding:1}}),e.w.log(``),e.w.log(i.default.bold(` Choose an action:`)),e.w.log(``),e.w.log(i.default.cyan(` [B]`)+` ← Go back to conflict resolution`),e.w.log(i.default.dim(` Modify your choices to fix the validation errors`)),e.w.log(``),e.w.log(i.default.yellow(` [S]`)+` 💾 Save anyway`),e.w.log(i.default.dim(` Save the invalid configuration (not recommended)`)),e.w.log(``),e.w.log(i.default.red(` [C]`)+` ✖ Cancel`),e.w.log(i.default.dim(` Discard all changes`)),e.w.log(``);let o=n({input:process.stdin,output:process.stdout});process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.resume();let s=e=>{let t=e.toString().toLowerCase(),n=()=>{process.stdin.removeListener(`data`,s),process.stdin.isTTY&&process.stdin.setRawMode(!1),o.close()};if(t===``||t===`\x1B`){n(),r(`cancel`);return}switch(t){case`b`:n(),r(`back`);break;case`s`:n(),r(`save`);break;case`c`:case`q`:n(),r(`cancel`);break}};process.stdin.on(`data`,s)})}#u(e){let t=[],n=0;for(;n<e.length;){let r=e[n];if(!r.added&&!r.removed)t.push({type:`unchanged`,content:r.value}),n++;else if(r.removed){let i=e[n+1];i?.added?(t.push({type:`conflict`,local:r.value,remote:i.value}),n+=2):(t.push({type:`conflict`,local:r.value,remote:void 0}),n++)}else r.added&&t.push({type:`conflict`,local:void 0,remote:r.value}),n++}return t}async#d(t,n){let r=h.default.dirname(t);m.default.existsSync(r)||m.default.mkdirSync(r,{recursive:!0});try{m.default.writeFileSync(t,n,`utf-8`)}catch(n){e.w.error(`Failed to write connector to file ${e.C(t)}: ${n.message}`),process.exit(1)}}async#f(t,n,r,i,a){let o=(0,v.default)(`Pulling connector ${e.C(t)}@${e.C(i)} from registry...`).start();try{let s=Buffer.from(r).toString(`base64`),c=`${n}/registry/connectors/${t}@${i}${a?`?owner=${encodeURIComponent(a)}`:``}`,l=await fetch(c,{method:`GET`,headers:{Authorization:`Basic ${s}`}});if(o.stop(),l.status===409){a&&(await this.#p(l,t,i),process.exit(1));let r=(await l.json()).availableOwners??[],c=await rn(`${t}@${i}`,r);o.text=`Pulling connector ${e.C(t)}@${e.C(i)} from registry...`,o.start();let u=`${n}/registry/connectors/${t}@${i}`,d=await fetch(`${u}?owner=${encodeURIComponent(c)}`,{method:`GET`,headers:{Authorization:`Basic ${s}`}});return o.stop(),d.ok||(await this.#p(d,t,i),process.exit(1)),await d.text()}return l.ok||(await this.#p(l,t,i),process.exit(1)),await l.text()}catch(r){o.stop(),e.w.error(`Failed to pull connector ${e.C(t)}@${e.C(i)} from the registry: ${r.message}`),e.w.log(`Please ensure that the API at ${e.T(n)} is reachable and the API key is valid.`),process.exit(1)}}async#p(t,n,r){switch(t.status){case 401:case 403:e.w.error(`Access denied`),e.w.log(`Please ensure that your API key is valid and has the ${e.C(`connectors:read`)} scope required to pull connectors.`);break;case 404:e.w.error(`Connector ${e.C(n)}@${e.C(r)} was not found in the registry`),await this.#m(n);break;case 429:e.w.error(`Rate limit exceeded`),e.w.log(`Too many requests. Please wait a moment before trying again.`);break;default:await e.x(t,`Failed to pull connector ${e.C(n)}`)}}async#m(t){e.w.info(`To see available versions, check the connector documentation or contact support.`)}};const gn=`https://api.stackone.com`;var _n=class{async execute({profile:t,fileOrDir:n,apiUrl:r,apiKey:a,force:o}={}){if(!t&&!a&&(e.w.error(`Profile or API key is required`),e.w.log(`Please provide a profile using the ${e.C(`--profile`)} option or an API key using the ${e.C(`--api-key`)} option.`),e.w.log(`To create a profile, run ${e.C(`stackone init`)}.`),process.exit(1)),t&&a&&(e.w.error(`Please provide either a profile or an API key, not both`),process.exit(1)),t&&r&&e.w.warn(`Specifying ${e.C(`--api-url`)} with a profile won't have any effect. Using API url from profile.`),t&&!Zt(t)){e.w.error(`Configuration profile ${e.C(t)} not found`),e.w.log(`Run ${e.C(`stackone init`)} to create a new configuration profile.\n`);let n=$t();n.length>0&&(e.w.info(`Available configuration profiles:`),n.forEach(t=>{e.w.log(` - ${i.default.blue(t)}`)})),process.exit(1)}let s=t?Xt(t):{apiUrl:r??gn,apiKey:a};s?.apiKey||(e.w.error(`API key is missing`),e.w.log(`Please provide a valid API key in the profile or via the ${e.C(`--api-key`)} option.`),process.exit(1)),n||(e.w.error(`File or directory is required.`),process.exit(1));try{(0,m.statSync)(n)}catch{e.w.error(`File or directory not found: ${i.default.red(n)}`),process.exit(1)}let c=(0,m.statSync)(n),l=s.apiUrl??gn;if(c.isDirectory()){let t=xn(n),r=0;t.length===0?(e.w.error(`No .s1.yaml connector files found in the directory: ${n}.`),process.exit(1)):(e.w.start(`Found ${t.length} connector(s) file(s). Pushing to registry...`),e.w.log(``));for(let e of t)await this.uploadFile(e,l,s.apiKey,o)&&r++;r===0?e.w.error(`Error while pushing connectors: no files were uploaded`):(e.w.log(``),e.w.info(`Upload completed: ${i.default.green(r)} of ${i.default.blue(t.length)} file(s) uploaded successfully.`)),process.exit(r>0?0:1)}else n.endsWith(`.s1.yaml`)||(e.w.error(`Only ${e.C(`.s1.yaml`)} files are supported for upload`),process.exit(1));let u=await this.uploadFile(n,l,s.apiKey,o);process.exit(u?0:1)}async uploadFile(t,n,r,i){let a=(0,v.default)(`📤 Pushing connector in ${(0,h.basename)(t)}...`).start();try{let o=bn(t);if(!o)return!1;let s=(0,h.basename)(t),c=new FormData,l=new Blob([o],{type:`application/x-yaml`});c.append(`file`,l,s),i&&c.append(`force`,`true`);let u=Buffer.from(r).toString(`base64`),d=await fetch(`${n}/registry/connectors`,{method:`POST`,headers:{Authorization:`Basic ${u}`},body:c});if(a.stop(),!d.ok)return d.status===409||d.status===422?await this.handleVersionConflict(d,t,n,r,i):(await e.x(d,`Failed to push connector in ${e.C(s)} to the registry`),!1);let f=await d.json();return e.w.success(`Successfully uploaded ${e.C(s)} with connector ${e.C(f.provider)}@${e.C(f.version)}`),!0}catch(r){return a.stop(),e.w.error(`Failed to upload file ${e.C(t)}: ${r}`),e.w.log(`Please ensure that the API at ${e.T(n)} is reachable and the API key is valid`),!1}}async handleVersionConflict(t,n,r,i,a){let o=await t.text(),s;try{s=JSON.parse(o)}catch{}let c=D.default.valid(s?.latestVersion);if(!c)return await e.x(new Response(o,{status:t.status,statusText:t.statusText}),`Failed to push connector in ${e.C((0,h.basename)(n))} to the registry`),!1;let l=(0,m.readFileSync)(n,`utf-8`),u=vn(l),d=u?`${e.C(u)}`:``,f=t.status===409?`Version ${d} already exists in the registry. Latest version: ${e.C(c)}`:`Version ${d} is lower than the latest version in the registry. Latest version: ${e.C(c)}`;e.w.error(f);let p=D.default.inc(c,`patch`)??c,g=D.default.inc(c,`minor`)??c,_=D.default.inc(c,`major`)??c,v=await(0,w.select)({message:`How would you like to proceed?`,options:[{value:p,label:`Bump patch version (${p})`},{value:g,label:`Bump minor version (${g})`},{value:_,label:`Bump major version (${_})`},{value:`cancel`,label:`Cancel push`}]});return(0,w.isCancel)(v)||v===`cancel`?((0,w.cancel)(`Push cancelled`),!1):((0,m.writeFileSync)(n,yn(l,v),`utf-8`),e.w.info(`Updated version to ${e.C(v)} in ${(0,h.basename)(n)}`),this.uploadFile(n,r,i,a))}};const vn=e=>e.match(/^\s*version: (\S+)/m)?.[1],yn=(e,t)=>e.replace(/^(\s*version: )\S+/m,`$1${t}`),bn=t=>{let n=(0,T.loadConnector)(t),r=(0,T.validateYamlConnector)(n),i=r?.errors??[];if(r.success)return n;i.length>0?(e.w.error(`Connector in ${e.S(t)} is not valid`),e.y(i,!0)):e.w.error(`Connector in ${e.S(t)} is not valid. Please check the file for errors.`)},xn=e=>{let t=[],n=(0,m.readdirSync)(e,{withFileTypes:!0});for(let r of n){let n=(0,h.join)(e,r.name);r.isDirectory()?t.push(...xn(n)):r.name.endsWith(`.s1.yaml`)&&t.push(n)}return t},Sn=C.z.object({provider_key:C.z.string().optional(),provider_version:C.z.string().optional(),auth_config_key:C.z.string(),environment:C.z.string().default(`production`),organization_id:C.z.string().default(`cli-organization-id`),account_id:C.z.string().default(`cli-account-secure-id`),project_id:C.z.string().default(`cli-project-secure-id`),credentials:C.z.record(C.z.string(),C.z.any()).default({})}),Cn=C.z.record(C.z.string(),C.z.any()),wn=C.z.object({path:C.z.record(C.z.string(),C.z.any()).default({}),queryParams:C.z.record(C.z.string(),C.z.any()).default({}),header:C.z.record(C.z.string(),C.z.any()).default({}),body:C.z.record(C.z.string(),C.z.any()).default({})}),Tn=`https://api.stackone.com`;var En=class{async execute({connector:t,action:n,actionId:r,account:a,accountId:o,params:s,credentials:c,profile:l,outputFile:u,debug:d,apiUrl:f,apiKey:p,owner:h}={}){if(!l&&!p&&o&&(e.w.error(`Profile or API key is required when providing an account ID`),e.w.log(`Please provide a profile using the ${e.C(`--profile`)} option or an API key using the ${e.C(`--api-key`)} option.`),e.w.log(`To create a profile, run ${e.C(`stackone init`)}.`),process.exit(1)),l&&p&&(e.w.error(`Please provide either a profile or an API key, not both`),process.exit(1)),l&&f&&e.w.warn(`Specifying --api-url with a profile won't have any effect. Using API url from profile.`),l&&!Zt(l)){e.w.error(`Configuration profile ${e.C(l)} not found`),e.w.log(`Run ${e.C(`stackone init`)} to create a new configuration profile.\n`);let t=$t();t.length>0&&(e.w.info(`Available configuration profiles:`),t.forEach(t=>{e.w.log(` - ${i.default.blue(t)}`)})),process.exit(1)}let g=l?Xt(l):{apiUrl:f??Tn,apiKey:p};(0,C.isMissing)(a)&&(0,C.isMissing)(o)&&(e.w.error(`A valid account or account ID is required to run an action`),process.exit(1));let _;if((0,C.notMissing)(t))if(this.#a(t)){!l&&!p&&(e.w.error(`Profile or API key is required when using a connector identifier`),e.w.log(`Please provide a profile using the ${e.C(`--profile`)} option or an API key using the ${e.C(`--api-key`)} option.`),e.w.log(`Run ${e.C(`stackone init`)} to create a new configuration profile.`),process.exit(1));let n=this.#o(t);_=await this.#s(n,g?.apiUrl??Tn,g?.apiKey,h)}else _=this.#e(t);else (0,C.notMissing)(o)&&(_=await this.#c(o,g?.apiUrl??Tn,g?.apiKey));let v=(0,C.notMissing)(n)?this.#r(n,t):_;(0,C.isMissing)(v)&&(e.w.error(`A valid connector is required to run an action.`),process.exit(1));let y=(0,C.notMissing)(v?.actions)?Object.keys(v?.actions).length:0,b=(0,C.notMissing)(v?.actions)?Object.keys(v.actions)[y-1]:void 0,x=(0,C.notMissing)(b)?v?.actions?.[b]?.id:void 0,S=((0,C.notMissing)(r)&&!r?.startsWith(`${v.key}_`)?`${v.key}_${r}`:r)??x;(0,C.isMissing)(S)&&(e.w.error(`A valid action ID is required to run an action`),process.exit(1));let w=(0,C.notMissing)(o)?await this.#l(o,g?.apiUrl??Tn,g?.apiKey):{},T=(0,C.notMissing)(a)?this.#i(a,v.key??`unknown`,v.version??`unknown`):void 0,E=(0,C.notMissing)(c)?this.#u(c):{},ee={...w,...T,credentials:{...w.credentials??{},...E}};(0,C.isMissing)(ee)&&(e.w.error(`A valid account data is required to run an action.`),process.exit(1));let D=v.actions?.[S];(0,C.isMissing)(D)&&(e.w.error(`Action ID ${e.C(S)} not found in the connector ${e.C(v.key)}@${e.C(v.version)}.`),process.exit(1));let O=(0,C.notMissing)(s)?this.#d(s,S):{path:{},queryParams:{},header:{},body:{}},k=Date.now(),A=await this.#f({connector:v,actionId:S,account:ee,queryParams:{...O.queryParams,...d?{debug:`true`}:{}},pathParams:O.path,body:O.body,headers:O.header}),j=Date.now()-k;if((0,C.notMissing)(u))try{m.default.writeFileSync(u,JSON.stringify(A.output,null,2),`utf-8`),e.w.info(`Output written to file: ${u}`)}catch(t){e.w.error(`Failed to write output to file ${u}: ${t.message}`),process.exit(1)}else e.w.log(`\n${i.default.blue.inverse(` ACTION OUTPUT `)}`),e.b(A.output);e.w.log(``),e.w.info(`Action ${e.C(S)} from connector ${e.C(v?.key)}@${e.C(v?.version)} finished in ${i.default.yellowBright((j/1e3).toFixed(2))} seconds.`),process.exit(0)}#e=e=>{let t=e;try{t=(0,T.loadConnector)(e)}catch{}return t?this.#n(t):void 0};#t=t=>{try{return(0,T.loadConnector)(t)}catch(n){e.w.error(`Failed to load connector file from ${e.C(t)}: ${n.message}`),process.exit(1)}};#n=t=>{let n=(0,T.validateYamlConnector)(t),r=n?.errors??[];if(n.success)return n.connector||(e.w.error(`Failed to load connector.`),process.exit(1)),n.connector;r.length>0?(e.w.error(`Connector is not valid`),e.y(r,!0),process.exit(1)):(e.w.error(`Connector is not valid. Please check the file for errors.`),process.exit(1))};#r=(t,n)=>{let r=t;try{r=m.default.readFileSync(t,`utf-8`)}catch{}(0,C.isMissing)(n)&&(e.w.error(`A valid connector is required to load an action.`),process.exit(1));let i=`${this.#t(n)} - ${r.split(`
171
173
  `).map((e,t)=>t===0?e:` ${e}`).join(`
172
- `)}`;return this.#n(i)};#i=(t,n,r)=>{let i=t;try{i=m.default.readFileSync(t,`utf-8`)}catch{}try{let e=Qt.parse(JSON.parse(i));return{providerKey:n,providerVersion:r,authConfigKey:e.auth_config_key,environment:e.environment,organizationId:e.organization_id,secureId:e.account_id,projectSecureId:e.project_id}}catch(t){let n=[];try{n=JSON.parse(t.message)}catch{}e.w.error(`Failed to parse account information`),e.y(n,!1),n.length===0&&e.w.log(t.message),process.exit(1)}};#a=e=>!e.includes(`/`)&&!e.includes(`\\`)&&!e.endsWith(`.yaml`)&&!e.endsWith(`.yml`)?e.includes(`@`)?e.split(`@`).length===2:!0:!1;#o=e=>e.includes(`@`)?e:`${e}@latest`;#s=async(t,n,r,i)=>{((0,C.isMissing)(t)||(0,C.isMissing)(n)||(0,C.isMissing)(r))&&(e.w.error(`Connector identifier, API URL, and API key are required to fetch connector from registry.`),process.exit(1));let a=(0,v.default)();try{a.text=`Fetching connector ${e.C(t)} from registry...`,a.start();let o=Buffer.from(r).toString(`base64`),s=i?`?owner=${encodeURIComponent(i)}`:``,c=await fetch(`${n}/registry/connectors/${t}${s}`,{method:`GET`,headers:{Authorization:`Basic ${o}`}});if(a.stop(),c.status===409){i&&(await e.x(c,`Failed to fetch connector ${e.C(t)} from registry`),process.exit(1));let r=await Pt(t,(await c.json()).availableOwners??[]);a.text=`Fetching connector ${e.C(t)} from registry...`,a.start();let s=await fetch(`${n}/registry/connectors/${t}?owner=${encodeURIComponent(r)}`,{method:`GET`,headers:{Authorization:`Basic ${o}`}});a.stop(),s.ok||(await e.x(s,`Failed to fetch connector ${e.C(t)} from registry`),process.exit(1));let l=await s.text(),u=this.#n(l);return e.w.success(`Fetched connector ${e.C(u.key)}@${e.C(u.version)} from registry`),u}c.ok||(await e.x(c,`Failed to fetch connector ${e.C(t)} from registry`),process.exit(1));let l=await c.text(),u=this.#n(l);return e.w.success(`Fetched connector ${e.C(u.key)}@${e.C(u.version)} from registry`),u}catch(r){a.stop(),e.w.error(`Failed to fetch connector ${e.C(t)} from registry: ${r.message}`),e.w.log(`Please ensure that the API at ${e.T(n)} is reachable and the API key is valid`),process.exit(1)}};#c=async(t,n,r)=>{((0,C.isMissing)(t)||(0,C.isMissing)(n)||(0,C.isMissing)(r))&&(e.w.error(`Account ID, API URL, and API key are required to fetch connector`),process.exit(1));let i=(0,v.default)();try{i.text=`Fetching connector for account ${e.C(t)} from API...`,i.start();let a=Buffer.from(r).toString(`base64`),o=await fetch(`${n}/accounts/${t}/connector`,{method:`GET`,headers:{Authorization:`Basic ${a}`}});i.stop(),o.ok||(await e.x(o,`Failed to fetch connector`),process.exit(1));let s=await o.text(),c=this.#n(s);return e.w.success(`Fetched connector ${e.C(c.key)}@${e.C(c.version)} for account ${e.C(t)}`),c}catch(t){i.stop(),e.w.error(`Failed to fetch connector: ${t.message}`),e.w.log(`Please ensure that the API at ${e.T(n)} is reachable and the API key is valid`),process.exit(1)}};#l=async(t,n,r)=>{((0,C.isMissing)(t)||(0,C.isMissing)(n)||(0,C.isMissing)(r))&&(e.w.error(`Account ID, API URL, and API key are required to fetch account information.`),process.exit(1));let i=(0,v.default)();try{i.text=`Fetching account ${e.C(t)} information from API...`,i.start();let a=Buffer.from(r).toString(`base64`),o=await fetch(`${n}/accounts/${t}/credentials`,{method:`GET`,headers:{Authorization:`Basic ${a}`}});i.stop(),o.ok||(await e.x(o,`Failed to fetch account ${e.C(t)} information`),process.exit(1));let s=await o.json();return e.w.success(`Fetched account ${e.C(t)} information from project ${e.C(s.project_id)}`),{providerKey:s.provider_key,providerVersion:s.provider_version,authConfigKey:s.auth_config_key,environment:s.environment,organizationId:s.organization_id,secureId:s.account_id,projectSecureId:s.project_id,credentials:s.credentials}}catch(r){i.stop(),e.w.error(`Failed to fetch account ${e.C(t)} information: ${r.message}`),e.w.log(`Please ensure that the API at ${e.T(n)} is reachable and the API key is valid`),process.exit(1)}};#u=t=>{let n=t;try{n=m.default.readFileSync(t,`utf-8`)}catch{}try{return $t.parse(JSON.parse(n))}catch(t){let n=[];try{n=JSON.parse(t.message)}catch{}e.w.error(`Failed to parse credentials`),e.y(n,!1),n.length===0&&e.w.log(t.message),process.exit(1)}};#d=(t,n)=>{let r=t;try{r=m.default.readFileSync(t,`utf-8`)}catch{}try{return en.parse(JSON.parse(r))}catch(t){let r=[];try{r=JSON.parse(t.message)}catch{}e.w.error(`Invalid parameters for action ${e.C(n)}.`),e.y(r,!1),r.length===0&&e.w.log(t.message),process.exit(1)}};async#f({connector:t,actionId:n,account:r,pathParams:a={},queryParams:o={},body:s={},headers:c={}}){try{let l=await(0,T.runAction)({mode:`action_id`,actionId:n,account:r,connector:t,pathParams:a,queryParams:o,body:s,headers:c,getHttpClient:async()=>new O.HttpClient});if(l.response?.successful){let e={...this.#p(o,l.steps),...(0,C.isObject)(l.outputs)?l.outputs:{data:l.outputs}};return{statusCode:l.response?.statusCode,output:e}}else{let r=l.response?.message??`An error occurred while processing the request`;e.w.error(`Action ID ${e.C(n)} from connector ${e.C(t.key)}@${e.C(t.version)} failed with status ${l.response?.statusCode}: ${r}`);let a={...this.#p(o,l.steps)};Object.keys(a).length>0&&(e.w.log(`${i.default.yellow.inverse(` EXECUTION DETAILS `)}`),e.b(a)),process.exit(1)}}catch(e){this.#m(e)}}#p(e,t){return e?.debug===`true`?{debug:{steps:t}}:{}}#m(t){let n=t;switch((0,C.isMissing)(n.errorType)&&(e.w.error(`An unknown error occurred`),e.w.log(`${t instanceof Error?t.message:String(t)}`),process.exit(1)),n.errorType){case`MISSING_ACTION_ERROR`:e.w.error(`The specified action was not found: ${n.message}`);break;case`INVALID_ACTION_INPUTS_ERROR`:let t=n;e.w.error(`Invalid action inputs`),e.y(t.validationErrors,!1);break;case`INVALID_CURSOR_ERROR`:e.w.error(`Invalid cursor: ${n.message}`);break;default:e.w.error(`An error occurred: ${n.message}`)}process.exit(1)}};const rn=(0,k.promisify)(f.exec);var an=class{constructor(){this.packageName=`@stackone/cli`,this.spinner=(0,v.default)(),this.currentVersion=G()}async execute(t={}){this.spinner.text=`Checking for updates...`,this.spinner.start();try{let n=await this.getLatestVersion();this.spinner.stop(),n||(e.w.error(`Failed to check for updates`),process.exit(1)),this.isNewerVersion(n,this.currentVersion)?(e.w.box(`New version available: ${i.default.yellow(this.currentVersion)} → ${i.default.green(n)}`),await this.performUpdate(n)):t.force?(e.w.warn(`No updates available, but forcing reinstall...`),await this.performUpdate(n)):e.w.success(`You are already on the latest version (${this.currentVersion})`),process.exit(0)}catch(t){this.spinner.stop(),e.w.error(`Error while trying to update StackOne CLI: ${t?.message??`Unknown error`}`),process.exit(1)}}async getLatestVersion(){try{let{stdout:e}=await rn(`npm view ${this.packageName} version`,{encoding:`utf-8`});return e.trim()}catch{return null}}isNewerVersion(e,t){return D.default.gt(e,t)}async performUpdate(t){this.spinner.text=`Updating to latest version (${e.C(t)})...`,this.spinner.start();let n=`npm install -g ${this.packageName}@latest`;try{await rn(n,{encoding:`utf-8`}),this.spinner.stop(),e.w.success(`StackOne CLI updated successfully to latest version (${e.C(t)})`)}catch{throw this.spinner.stop(),Error(`Failed to install update. Please try manually: ${n}`)}}};const on=()=>{e.w.log(`${i.default.gray.inverse(` CONNECTORS VALIDATION `)} ${i.default.yellow.inverse(` WATCH MODE `)}\n`)};var sn=class{async execute(t){let{watchMode:n,fileOrDir:r}=t,a=(0,v.default)(`Watching for file changes... ${i.default.gray(`(press "q" to quit)`)}`);if(!r)return;let o=(0,h.resolve)(r);try{await(0,A.stat)(o)}catch{e.w.error(`The specified path does not exist: ${o}\n`),process.exit(1)}if(n){e.v();let t={},{watch:n}=await import(`chokidar`),r=(await import(`readline`)).createInterface({input:process.stdin,output:process.stdout});process.stdin.setRawMode(!0),process.stdin.resume(),process.stdin.setEncoding(`utf8`);let s=()=>{l.close(),a.stop(),r.close(),e.w.log(i.default.grey(`
173
- Exiting watch mode...`)),process.exit(0)};on(),e.w.start(`Validating connectors...`);let c=await dn(o);t=cn(t,c||{}),ln(t,o),a.start();let l=n(o,{persistent:!0,ignoreInitial:!0}),u=async n=>{if(!n.endsWith(`.s1.yaml`)&&!n.endsWith(`s1.partial.yaml`))return;let r=n.endsWith(`s1.partial.yaml`)?await pn(n):[n];if(!(!r||r.length===0)){e.v(),a.stop(),on(),e.w.log(i.default.gray(`File change detected: ${n}`)),e.w.start(`Validating connectors...`);for(let e of r){let n=await dn(e);t=cn(t,n||{})}ln(t,o),a.start()}};l.on(`change`,async e=>await u(e)),process.stdin.on(`data`,e=>{e.toString()===`q`&&s()}),process.on(`SIGINT`,()=>{s()})}else await dn(o,e.w),process.exit(0)}};const cn=(e,t)=>{for(let[n,r]of Object.entries(t))e[n]=r;return e},ln=(t,n)=>{e.v(),on();let r=0,a=0;for(let[n,i]of Object.entries(t))i===null?r++:(e.w?.error(`Connector ${e.C(n)} is not valid`),e.y(i,!0),a++);e.w.log(``),e.w.log(i.default.blue.inverse(` Validation Summary `)),e.w.log(`Connectors path: ${e.C(n)}`),e.w.log(`${r===0?i.default.red(`0`):i.default.green(r)} valid, ${a===0?i.default.green(`0`):i.default.red(a)} invalid connectors\n`)},un=async e=>{let t=[],n=await(0,A.readdir)(e);for(let r of n){let n=(0,h.join)(e,r),i=await(0,A.stat)(n);i.isDirectory()?t.push(...await un(n)):i.isFile()&&r.endsWith(`.s1.yaml`)&&t.push(n)}return t},dn=async(t,n)=>{let r=await(0,A.stat)(t),a={};if(r.isDirectory()){let r=await un(t);if(r.length===0)return n?.error(`No StackOne connector found in ${e.S(t)}`),n?.log(`Connector files need to have the extension ${e.C(`*.s1.yaml`)}`),null;let o=0,s=0;for(let e of r){let t=await fn(e,n);t===null?o++:(n?.log(``),s++),a[e]=t}return n?.log(``),n?.log(i.default.blue.inverse(` Validation Summary `)),n?.log(`${o===0?i.default.red(`0`):i.default.green(o)} valid, ${s===0?i.default.green(`0`):i.default.red(s)} invalid connectors`),a}else if(r.isFile()&&t.endsWith(`s1.yaml`))return a[t]=await fn(t,n),a;else if(r.isFile()&&t.endsWith(`partial.yaml`)){n?.error(`Partial connector files cannot be validated directly`),n?.log(`The file ${e.S(t)} is a partial connector file.`);let r=await pn(t);return r&&r?.length>0&&n?.log(`Did you mean ${e.C(r[0])}?`),null}else return n?.error(`No StackOne connector found in ${e.S(t)}`),n?.log(`Connector files need to have the extension ${e.C(`*.s1.yaml`)}`),null},fn=async(t,n)=>{let r=(0,T.validateYamlConnector)((0,T.loadConnector)(t)),i=r?.errors??[];if(r.success){let r=t.split(`/`).pop()||t;return n?.success(`Connector ${e.C(r)} is valid!`),null}else if(i.length>0)return n?.error(`Connector ${e.C(t)} is not valid`),n&&e.y(i,!0),i;else return n?.error(`Connector ${e.C(t)} is not valid. Please check the file for errors`),[]},pn=async e=>{let t=(0,h.dirname)(e);try{return(await(0,A.readdir)(t)).filter(e=>e.endsWith(`.s1.yaml`))?.map(e=>(0,h.join)(t,e))}catch{}},mn=`https://ai-telemetry.stackone.com`,hn=`https://ai-telemetry.stackone-dev.com`;function gn(e){if(!e)return!1;try{let{hostname:t}=new URL(e);return t===`stackone-dev.com`||t.endsWith(`.stackone-dev.com`)}catch{return!1}}function _n(){return process.env.AI_TELEMETRY_URL?process.env.AI_TELEMETRY_URL:[process.env.AUTH_SERVER_URL,process.env.STACKONE_API_URL].some(gn)?`https://ai-telemetry.stackone-dev.com`:`https://ai-telemetry.stackone.com`}function vn(){let e=process.env.STACKONE_AGENT_TOKEN,t=process.env.LANGSMITH_PROJECT||`stackone-agent-cli`;if(process.env.AI_TELEMETRY_URL=_n(),e)try{(0,o.initAgentTelemetry)({apiKey:e,projectName:t}),process.env.VERBOSE&&console.log(`[Telemetry] Initialized for project:`,t)}catch(e){process.env.VERBOSE&&console.error(`[Telemetry] Failed to initialize:`,e)}}const yn=`@stackone/cli`,bn=2880*60*1e3,xn=(0,l.join)((0,c.homedir)(),`.stackone`),Sn=(0,l.join)(xn,`version-check.json`),Cn=(e=!1)=>{let t=Dn(),n=Date.now();if(e||!t||n-t.lastCheckTime>1728e5){let e=wn();e&&Tn(e)&&En(e),On({lastCheckTime:n})}},wn=()=>{try{return(0,f.execSync)(`npm view @stackone/cli version`,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:15e3}).trim()}catch{return null}},Tn=e=>{try{let t=G();return D.default.gt(e,t)}catch{return!1}},En=t=>{let n=G(),r=`Update available: ${i.default.dim(n)} → ${i.default.green(t)}`,a=`\n\nRun ${i.default.cyan(`stackone update`)} to update`;e.w.box(r,a)},Dn=()=>{try{if(!(0,s.existsSync)(Sn))return null;let e=(0,s.readFileSync)(Sn,`utf-8`);return JSON.parse(e)}catch{return null}},On=e=>{try{(0,s.existsSync)(xn)||(0,s.mkdirSync)(xn,{recursive:!0}),(0,s.writeFileSync)(Sn,JSON.stringify(e,null,2),`utf-8`)}catch{}};var kn=class{constructor(e=new a.Command,t=G()){this.program=e,this.version=t,vn(),this.setupProgram(),this.registerCommands()}setupProgram(){this.program.name(`stackone`).description(`StackOne CLI`).version(this.version,`-v, --version`)}registerCommands(){let t=new Bt,n=new qt,r=new Gt,o=new Mt,s=new It,c=new sn,l=new We,u=new bt,d=new J,f=new Ae,p=new Ke,m=new xt,h=new wt,g=new nn,_=new an;this.program.configureOutput({writeOut:e=>process.stdout.write(e),writeErr:e=>process.stderr.write(e),outputError:(e,t)=>{t(i.default.red(e))}}),this.program.command(`init`).option(`-e, --env <environment>`,`Specify the environment for the configuration profile`).description(`Initialize & create a StackOne CLI configuration profile`).action(e=>{t.execute({environment:e.env})}),this.program.command(`push`).option(`-p, --profile <label>`,`Configuration profile to use`).option(`--api-url <api url>`,`API URL`).option(`--api-key <api key>`,`API Key`).option(`--force`,`Force push the connector, bypassing version conflict checks`).addArgument(new a.Argument(`<path>`,`Connector file or directory to push`)).description(`Push a connector to the StackOne registry`).action((e,t)=>{n.execute({profile:t.profile,fileOrDir:e,apiUrl:t.apiUrl,apiKey:t.apiKey,force:t.force})}),this.program.command(`drop`).option(`-p, --profile <label>`,`Configuration profile to use`).option(`--api-url <api url>`,`API URL`).option(`--api-key <api key>`,`API Key`).addArgument(new a.Argument(`<connector>`,`Connector identifier in format provider_key@version`)).description(`Drop a connector from the StackOne registry`).action((e,t)=>{o.execute({profile:t.profile,connector:e,apiUrl:t.apiUrl,apiKey:t.apiKey})}),this.program.command(`get`).option(`-p, --profile <label>`,`Configuration profile to use`).option(`--api-url <api url>`,`API URL`).option(`--api-key <api key>`,`API Key`).option(`-c, --connector <connector>`,`Connector identifier in format provider_key@version or provider_key (defaults to latest)`).option(`--account-id <account-id>`,`Account ID to fetch connector from`).option(`-f, --format <format>`,`Output format: yaml or json (default: yaml)`,`yaml`).option(`-o, --output-file <output-file>`,`File to write the output to`).option(`--builtin`,`Use the builtin (StackOne) version of the connector`).option(`--custom`,`Use the custom (organization) version of the connector`).option(`--owner <owner>`,`Owner to use for disambiguating connector versions`).description(`Get a connector from the StackOne registry`).action(t=>{[t.builtin,t.custom,t.owner].filter(Boolean).length>1&&(e.w.error(`--builtin, --custom, and --owner are mutually exclusive. Please provide only one.`),process.exit(1)),s.execute({profile:t.profile,connector:t.connector,accountId:t.accountId,format:t.format,outputFile:t.outputFile,apiUrl:t.apiUrl,apiKey:t.apiKey,owner:t.builtin?`builtin`:t.custom?`custom`:t.owner})}),this.program.command(`pull`).option(`-c, --connector <connector>`,`Connector identifier in format provider_key@version or provider_key`).option(`-p, --profile <label>`,`Configuration profile to use`).option(`--api-url <api url>`,`API URL`).option(`--api-key <api key>`,`API Key`).option(`-o, --output <path>`,`Output directory for the connectors files (default: ./connectors)`).option(`--builtin`,`Use the builtin (StackOne) version of the connector`).option(`--custom`,`Use the custom (organization) version of the connector`).option(`--owner <owner>`,`Owner to use for disambiguating connector versions`).description(`Pull a connector configuration from StackOne registry to local filesystem`).action(t=>{[t.builtin,t.custom,t.owner].filter(Boolean).length>1&&(e.w.error(`--builtin, --custom, and --owner are mutually exclusive. Please provide only one.`),process.exit(1)),r.execute({profile:t.profile,connector:t.connector,outputPath:t.output,apiUrl:t.apiUrl,apiKey:t.apiKey,owner:t.builtin?`builtin`:t.custom?`custom`:t.owner})}),this.program.command(`validate`).option(`-w, --watch`,`Run in watch mode`).addArgument(new a.Argument(`<path>`,`Connector file or directory with connectors to validate`)).description(`Validate a StackOne connector`).action((e,t)=>{c.execute({watchMode:t.watch,fileOrDir:e})}),this.program.command(`run`).option(`--connector <connector>`,`Connector file, inline YAML, or identifier (provider_key@version or provider_key for latest)`).option(`--action <action>`,`Action to execute on the connector (path to file or inline string action code)`).option(`--action-id <action-id>`,`Action ID to execute on the connector`).option(`--account <account>`,`Account details to use for running the connector (path to file or inline string account data)`).option(`--account-id <account-id>`,`Account ID to use for running the connector against (fetches connector from API if --connector not provided)`).option(`--params <params>`,`Action parameters (path to file or inline string with JSON parameters)`).option(`--credentials <credentials>`,`Credentials to use (path to file or inline string with JSON credentials)`).option(`-p, --profile <label>`,`Configuration profile to use`).option(`--api-url <api url>`,`API URL`).option(`--api-key <api key>`,`API Key`).option(`-o, --output-file <output-file>`,`File to write the output to`).option(`-d, --debug`,`Enables debug mode to include more details in the action execution output`).option(`--builtin`,`Use the builtin (StackOne) version of the connector`).option(`--custom`,`Use the custom (organization) version of the connector`).option(`--owner <owner>`,`Owner to use for disambiguating connector versions`).description(`Run a connector action`).action(t=>{[t.builtin,t.custom,t.owner].filter(Boolean).length>1&&(e.w.error(`--builtin, --custom, and --owner are mutually exclusive. Please provide only one.`),process.exit(1)),g.execute({connector:t.connector,action:t.action,actionId:t.actionId,account:t.account,accountId:t.accountId,params:t.params,credentials:t.credentials,profile:t.profile,outputFile:t.outputFile,debug:t.debug,apiUrl:t.apiUrl,apiKey:t.apiKey,owner:t.builtin?`builtin`:t.custom?`custom`:t.owner})});let v=this.program.command(`agent`).description(`StackOne agent commands`);v.command(`setup`).option(`-g, --global`,`Setup global configuration (default)`).option(`-l, --local`,`Setup local project configuration`).option(`--legacy`,`Use email/password login instead of browser-based auth`).option(`--email <email>`,`Email for legacy login (or set STACKONE_EMAIL); requires --legacy`).option(`--password <password>`,`Password for legacy login (or set STACKONE_PASSWORD); requires --legacy. Prefer --password-stdin`).option(`--password-stdin`,`Read password for legacy login from stdin; requires --legacy`).description(`Setup StackOne agent (global or local)`).action(t=>{t.global&&t.local&&(e.w.error(`--global and --local are mutually exclusive. Please provide only one.`),process.exit(1));let n=t.email!==void 0,r=t.password!==void 0,i=t.passwordStdin===!0;r&&i&&(e.w.error(`--password and --password-stdin are mutually exclusive. Please provide only one.`),process.exit(1)),(n||r||i)&&!t.legacy&&(e.w.error(`--email, --password, and --password-stdin require --legacy.`),process.exit(1)),n&&t.email.trim()===``&&(e.w.error(`--email cannot be empty.`),process.exit(1)),r&&t.password===``&&(e.w.error(`--password cannot be empty.`),process.exit(1)),i&&(n||process.env.STACKONE_EMAIL?.trim()||(e.w.error(`--password-stdin requires --email or STACKONE_EMAIL (stdin is consumed for the password, so email cannot be prompted).`),process.exit(1)));let a={email:t.email,password:t.password,passwordFromStdin:i};t.local?u.execute({legacy:!!t.legacy,credentials:a}):l.execute({legacy:!!t.legacy,credentials:a})}),v.command(`cleanup`).description(`Remove all API keys and credentials from configurations`).action(()=>{d.execute()}),v.command(`run`).description(`Run the agent once with a prompt (non-interactive)`).argument(`<prompt>`,`What to do`).option(`-m, --mode <mode>`,`Mode: build, test, or research`,`build`).option(`--max-turns <n>`,`Max agent turns`,`25`).option(`-v, --verbose`,`Verbose output`).action(async(t,n)=>{let r=[`build`,`test`,`research`],a=n.mode??`build`;r.includes(a)||(e.w.error(`${i.default.red(`Invalid mode:`)} ${i.default.white(a)}. Valid modes are: ${r.join(`, `)}.`),process.exit(1));let o=n.maxTurns?parseInt(String(n.maxTurns),10):void 0;await p.execute({prompt:String(t),mode:a,maxTurns:o!==void 0&&!isNaN(o)?o:void 0,verbose:n.verbose})}),v.command(`skills`).description(`List available agent skills and optional recommendations by mode`).option(`-m, --mode <mode>`,`Show skills recommended for this mode`).action(async e=>{await m.execute({mode:e.mode})}),v.command(`sync`).description(`Sync the connector-building skills + guide into this project (.claude/ + CLAUDE.md)`).option(`--check`,`Report drift and exit non-zero instead of writing (CI guard)`).option(`--plugin-dir <path>`,`Override the agent-harness plugin dir (e.g. point at a checkout in CI/benchmarks)`).action(async e=>{await h.execute({check:!!e.check,pluginDir:e.pluginDir})}),v.command(`chat`).option(`-m, --mode <mode>`,`Mode: build, test, or research`,`build`).option(`-c, --connector <name>`,`Connector name`).option(`-a, --action <name>`,`Action name`).option(`-g, --goal <goal>`,`Initial goal/message`).option(`-t, --temperature <number>`,`Temperature (0-1, default: 0.5)`,parseFloat).option(`-v, --verbose`,`Enable verbose logging`).description(`Start an interactive chat session with the agent (use /commands in chat)`).action(async t=>{let n=[`build`,`test`,`research`];t.mode&&!n.includes(t.mode)&&(e.w.error(`❌ Error: Invalid mode "${t.mode}". Must be one of: ${n.join(`, `)}`),process.exit(1)),t.temperature!==void 0&&(isNaN(t.temperature)&&(e.w.error(`❌ Error: Temperature must be a valid number`),process.exit(1)),(t.temperature<0||t.temperature>1)&&(e.w.error(`❌ Error: Temperature must be between 0 and 1`),process.exit(1))),f.execute({mode:t.mode,connector:t.connector,action:t.action,goal:t.goal,temperature:t.temperature,verbose:t.verbose})}),this.program.command(`update`).option(`-f, --force`,`Force reinstall even if already on latest version`).description(`Update the CLI to the latest version`).action(e=>{_.execute({force:e.force})}),this.program.command(`version`).description(`Show version information`).action(async()=>{e.w.log(`${i.default.inverse.greenBright(`StackOne`)} ${i.default.grey(`CLI`)} ${i.default.whiteBright(this.version)}`),Cn(!0),process.exit(0)})}run(){process.argv.includes(`version`)||Cn(),this.program.parse(process.argv)}};Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return kn}});
174
+ `)}`;return this.#n(i)};#i=(t,n,r)=>{let i=t;try{i=m.default.readFileSync(t,`utf-8`)}catch{}try{let e=Sn.parse(JSON.parse(i));return{providerKey:n,providerVersion:r,authConfigKey:e.auth_config_key,environment:e.environment,organizationId:e.organization_id,secureId:e.account_id,projectSecureId:e.project_id}}catch(t){let n=[];try{n=JSON.parse(t.message)}catch{}e.w.error(`Failed to parse account information`),e.y(n,!1),n.length===0&&e.w.log(t.message),process.exit(1)}};#a=e=>!e.includes(`/`)&&!e.includes(`\\`)&&!e.endsWith(`.yaml`)&&!e.endsWith(`.yml`)?e.includes(`@`)?e.split(`@`).length===2:!0:!1;#o=e=>e.includes(`@`)?e:`${e}@latest`;#s=async(t,n,r,i)=>{((0,C.isMissing)(t)||(0,C.isMissing)(n)||(0,C.isMissing)(r))&&(e.w.error(`Connector identifier, API URL, and API key are required to fetch connector from registry.`),process.exit(1));let a=(0,v.default)();try{a.text=`Fetching connector ${e.C(t)} from registry...`,a.start();let o=Buffer.from(r).toString(`base64`),s=i?`?owner=${encodeURIComponent(i)}`:``,c=await fetch(`${n}/registry/connectors/${t}${s}`,{method:`GET`,headers:{Authorization:`Basic ${o}`}});if(a.stop(),c.status===409){i&&(await e.x(c,`Failed to fetch connector ${e.C(t)} from registry`),process.exit(1));let r=await rn(t,(await c.json()).availableOwners??[]);a.text=`Fetching connector ${e.C(t)} from registry...`,a.start();let s=await fetch(`${n}/registry/connectors/${t}?owner=${encodeURIComponent(r)}`,{method:`GET`,headers:{Authorization:`Basic ${o}`}});a.stop(),s.ok||(await e.x(s,`Failed to fetch connector ${e.C(t)} from registry`),process.exit(1));let l=await s.text(),u=this.#n(l);return e.w.success(`Fetched connector ${e.C(u.key)}@${e.C(u.version)} from registry`),u}c.ok||(await e.x(c,`Failed to fetch connector ${e.C(t)} from registry`),process.exit(1));let l=await c.text(),u=this.#n(l);return e.w.success(`Fetched connector ${e.C(u.key)}@${e.C(u.version)} from registry`),u}catch(r){a.stop(),e.w.error(`Failed to fetch connector ${e.C(t)} from registry: ${r.message}`),e.w.log(`Please ensure that the API at ${e.T(n)} is reachable and the API key is valid`),process.exit(1)}};#c=async(t,n,r)=>{((0,C.isMissing)(t)||(0,C.isMissing)(n)||(0,C.isMissing)(r))&&(e.w.error(`Account ID, API URL, and API key are required to fetch connector`),process.exit(1));let i=(0,v.default)();try{i.text=`Fetching connector for account ${e.C(t)} from API...`,i.start();let a=Buffer.from(r).toString(`base64`),o=await fetch(`${n}/accounts/${t}/connector`,{method:`GET`,headers:{Authorization:`Basic ${a}`}});i.stop(),o.ok||(await e.x(o,`Failed to fetch connector`),process.exit(1));let s=await o.text(),c=this.#n(s);return e.w.success(`Fetched connector ${e.C(c.key)}@${e.C(c.version)} for account ${e.C(t)}`),c}catch(t){i.stop(),e.w.error(`Failed to fetch connector: ${t.message}`),e.w.log(`Please ensure that the API at ${e.T(n)} is reachable and the API key is valid`),process.exit(1)}};#l=async(t,n,r)=>{((0,C.isMissing)(t)||(0,C.isMissing)(n)||(0,C.isMissing)(r))&&(e.w.error(`Account ID, API URL, and API key are required to fetch account information.`),process.exit(1));let i=(0,v.default)();try{i.text=`Fetching account ${e.C(t)} information from API...`,i.start();let a=Buffer.from(r).toString(`base64`),o=await fetch(`${n}/accounts/${t}/credentials`,{method:`GET`,headers:{Authorization:`Basic ${a}`}});i.stop(),o.ok||(await e.x(o,`Failed to fetch account ${e.C(t)} information`),process.exit(1));let s=await o.json();return e.w.success(`Fetched account ${e.C(t)} information from project ${e.C(s.project_id)}`),{providerKey:s.provider_key,providerVersion:s.provider_version,authConfigKey:s.auth_config_key,environment:s.environment,organizationId:s.organization_id,secureId:s.account_id,projectSecureId:s.project_id,credentials:s.credentials}}catch(r){i.stop(),e.w.error(`Failed to fetch account ${e.C(t)} information: ${r.message}`),e.w.log(`Please ensure that the API at ${e.T(n)} is reachable and the API key is valid`),process.exit(1)}};#u=t=>{let n=t;try{n=m.default.readFileSync(t,`utf-8`)}catch{}try{return Cn.parse(JSON.parse(n))}catch(t){let n=[];try{n=JSON.parse(t.message)}catch{}e.w.error(`Failed to parse credentials`),e.y(n,!1),n.length===0&&e.w.log(t.message),process.exit(1)}};#d=(t,n)=>{let r=t;try{r=m.default.readFileSync(t,`utf-8`)}catch{}try{return wn.parse(JSON.parse(r))}catch(t){let r=[];try{r=JSON.parse(t.message)}catch{}e.w.error(`Invalid parameters for action ${e.C(n)}.`),e.y(r,!1),r.length===0&&e.w.log(t.message),process.exit(1)}};async#f({connector:t,actionId:n,account:r,pathParams:a={},queryParams:o={},body:s={},headers:c={}}){try{let l=await(0,T.runAction)({mode:`action_id`,actionId:n,account:r,connector:t,pathParams:a,queryParams:o,body:s,headers:c,getHttpClient:async()=>new O.HttpClient});if(l.response?.successful){let e={...this.#p(o,l.steps),...(0,C.isObject)(l.outputs)?l.outputs:{data:l.outputs}};return{statusCode:l.response?.statusCode,output:e}}else{let r=l.response?.message??`An error occurred while processing the request`;e.w.error(`Action ID ${e.C(n)} from connector ${e.C(t.key)}@${e.C(t.version)} failed with status ${l.response?.statusCode}: ${r}`);let a={...this.#p(o,l.steps)};Object.keys(a).length>0&&(e.w.log(`${i.default.yellow.inverse(` EXECUTION DETAILS `)}`),e.b(a)),process.exit(1)}}catch(e){this.#m(e)}}#p(e,t){return e?.debug===`true`?{debug:{steps:t}}:{}}#m(t){let n=t;switch((0,C.isMissing)(n.errorType)&&(e.w.error(`An unknown error occurred`),e.w.log(`${t instanceof Error?t.message:String(t)}`),process.exit(1)),n.errorType){case`MISSING_ACTION_ERROR`:e.w.error(`The specified action was not found: ${n.message}`);break;case`INVALID_ACTION_INPUTS_ERROR`:let t=n;e.w.error(`Invalid action inputs`),e.y(t.validationErrors,!1);break;case`INVALID_CURSOR_ERROR`:e.w.error(`Invalid cursor: ${n.message}`);break;default:e.w.error(`An error occurred: ${n.message}`)}process.exit(1)}};const Dn=(0,k.promisify)(f.exec);var On=class{constructor(){this.packageName=`@stackone/cli`,this.spinner=(0,v.default)(),this.currentVersion=q()}async execute(t={}){this.spinner.text=`Checking for updates...`,this.spinner.start();try{let n=await this.getLatestVersion();this.spinner.stop(),n||(e.w.error(`Failed to check for updates`),process.exit(1)),this.isNewerVersion(n,this.currentVersion)?(e.w.box(`New version available: ${i.default.yellow(this.currentVersion)} → ${i.default.green(n)}`),await this.performUpdate(n)):t.force?(e.w.warn(`No updates available, but forcing reinstall...`),await this.performUpdate(n)):e.w.success(`You are already on the latest version (${this.currentVersion})`),process.exit(0)}catch(t){this.spinner.stop(),e.w.error(`Error while trying to update StackOne CLI: ${t?.message??`Unknown error`}`),process.exit(1)}}async getLatestVersion(){try{let{stdout:e}=await Dn(`npm view ${this.packageName} version`,{encoding:`utf-8`});return e.trim()}catch{return null}}isNewerVersion(e,t){return D.default.gt(e,t)}async performUpdate(t){this.spinner.text=`Updating to latest version (${e.C(t)})...`,this.spinner.start();let n=`npm install -g ${this.packageName}@latest`;try{await Dn(n,{encoding:`utf-8`}),this.spinner.stop(),e.w.success(`StackOne CLI updated successfully to latest version (${e.C(t)})`)}catch{throw this.spinner.stop(),Error(`Failed to install update. Please try manually: ${n}`)}}};const kn=()=>{e.w.log(`${i.default.gray.inverse(` CONNECTORS VALIDATION `)} ${i.default.yellow.inverse(` WATCH MODE `)}\n`)};var An=class{async execute(t){let{watchMode:n,fileOrDir:r}=t,a=(0,v.default)(`Watching for file changes... ${i.default.gray(`(press "q" to quit)`)}`);if(!r)return;let o=(0,h.resolve)(r);try{await(0,A.stat)(o)}catch{e.w.error(`The specified path does not exist: ${o}\n`),process.exit(1)}if(n){e.v();let t={},{watch:n}=await import(`chokidar`),r=(await import(`readline`)).createInterface({input:process.stdin,output:process.stdout});process.stdin.setRawMode(!0),process.stdin.resume(),process.stdin.setEncoding(`utf8`);let s=()=>{l.close(),a.stop(),r.close(),e.w.log(i.default.grey(`
175
+ Exiting watch mode...`)),process.exit(0)};kn(),e.w.start(`Validating connectors...`);let c=await Pn(o);t=jn(t,c||{}),Mn(t,o),a.start();let l=n(o,{persistent:!0,ignoreInitial:!0}),u=async n=>{if(!n.endsWith(`.s1.yaml`)&&!n.endsWith(`s1.partial.yaml`))return;let r=n.endsWith(`s1.partial.yaml`)?await In(n):[n];if(!(!r||r.length===0)){e.v(),a.stop(),kn(),e.w.log(i.default.gray(`File change detected: ${n}`)),e.w.start(`Validating connectors...`);for(let e of r){let n=await Pn(e);t=jn(t,n||{})}Mn(t,o),a.start()}};l.on(`change`,async e=>await u(e)),process.stdin.on(`data`,e=>{e.toString()===`q`&&s()}),process.on(`SIGINT`,()=>{s()})}else await Pn(o,e.w),process.exit(0)}};const jn=(e,t)=>{for(let[n,r]of Object.entries(t))e[n]=r;return e},Mn=(t,n)=>{e.v(),kn();let r=0,a=0;for(let[n,i]of Object.entries(t))i===null?r++:(e.w?.error(`Connector ${e.C(n)} is not valid`),e.y(i,!0),a++);e.w.log(``),e.w.log(i.default.blue.inverse(` Validation Summary `)),e.w.log(`Connectors path: ${e.C(n)}`),e.w.log(`${r===0?i.default.red(`0`):i.default.green(r)} valid, ${a===0?i.default.green(`0`):i.default.red(a)} invalid connectors\n`)},Nn=async e=>{let t=[],n=await(0,A.readdir)(e);for(let r of n){let n=(0,h.join)(e,r),i=await(0,A.stat)(n);i.isDirectory()?t.push(...await Nn(n)):i.isFile()&&r.endsWith(`.s1.yaml`)&&t.push(n)}return t},Pn=async(t,n)=>{let r=await(0,A.stat)(t),a={};if(r.isDirectory()){let r=await Nn(t);if(r.length===0)return n?.error(`No StackOne connector found in ${e.S(t)}`),n?.log(`Connector files need to have the extension ${e.C(`*.s1.yaml`)}`),null;let o=0,s=0;for(let e of r){let t=await Fn(e,n);t===null?o++:(n?.log(``),s++),a[e]=t}return n?.log(``),n?.log(i.default.blue.inverse(` Validation Summary `)),n?.log(`${o===0?i.default.red(`0`):i.default.green(o)} valid, ${s===0?i.default.green(`0`):i.default.red(s)} invalid connectors`),a}else if(r.isFile()&&t.endsWith(`s1.yaml`))return a[t]=await Fn(t,n),a;else if(r.isFile()&&t.endsWith(`partial.yaml`)){n?.error(`Partial connector files cannot be validated directly`),n?.log(`The file ${e.S(t)} is a partial connector file.`);let r=await In(t);return r&&r?.length>0&&n?.log(`Did you mean ${e.C(r[0])}?`),null}else return n?.error(`No StackOne connector found in ${e.S(t)}`),n?.log(`Connector files need to have the extension ${e.C(`*.s1.yaml`)}`),null},Fn=async(t,n)=>{let r=(0,T.validateYamlConnector)((0,T.loadConnector)(t)),i=r?.errors??[];if(r.success){let r=t.split(`/`).pop()||t;return n?.success(`Connector ${e.C(r)} is valid!`),null}else if(i.length>0)return n?.error(`Connector ${e.C(t)} is not valid`),n&&e.y(i,!0),i;else return n?.error(`Connector ${e.C(t)} is not valid. Please check the file for errors`),[]},In=async e=>{let t=(0,h.dirname)(e);try{return(await(0,A.readdir)(t)).filter(e=>e.endsWith(`.s1.yaml`))?.map(e=>(0,h.join)(t,e))}catch{}},Ln=`https://ai-telemetry.stackone.com`,Rn=`https://ai-telemetry.stackone-dev.com`;function zn(e){if(!e)return!1;try{let{hostname:t}=new URL(e);return t===`stackone-dev.com`||t.endsWith(`.stackone-dev.com`)}catch{return!1}}function Bn(){return process.env.AI_TELEMETRY_URL?process.env.AI_TELEMETRY_URL:[process.env.AUTH_SERVER_URL,process.env.STACKONE_API_URL].some(zn)?`https://ai-telemetry.stackone-dev.com`:`https://ai-telemetry.stackone.com`}function Vn(){let e=process.env.STACKONE_AGENT_TOKEN,t=process.env.LANGSMITH_PROJECT||`stackone-agent-cli`;if(process.env.AI_TELEMETRY_URL=Bn(),e)try{(0,o.initAgentTelemetry)({apiKey:e,projectName:t}),process.env.VERBOSE&&console.log(`[Telemetry] Initialized for project:`,t)}catch(e){process.env.VERBOSE&&console.error(`[Telemetry] Failed to initialize:`,e)}}const Hn=`@stackone/cli`,Un=2880*60*1e3,Wn=(0,l.join)((0,c.homedir)(),`.stackone`),Gn=(0,l.join)(Wn,`version-check.json`),Kn=(e=!1)=>{let t=Xn(),n=Date.now();if(e||!t||n-t.lastCheckTime>1728e5){let e=qn();e&&Jn(e)&&Yn(e),Zn({lastCheckTime:n})}},qn=()=>{try{return(0,f.execSync)(`npm view @stackone/cli version`,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:15e3}).trim()}catch{return null}},Jn=e=>{try{let t=q();return D.default.gt(e,t)}catch{return!1}},Yn=t=>{let n=q(),r=`Update available: ${i.default.dim(n)} → ${i.default.green(t)}`,a=`\n\nRun ${i.default.cyan(`stackone update`)} to update`;e.w.box(r,a)},Xn=()=>{try{if(!(0,s.existsSync)(Gn))return null;let e=(0,s.readFileSync)(Gn,`utf-8`);return JSON.parse(e)}catch{return null}},Zn=e=>{try{(0,s.existsSync)(Wn)||(0,s.mkdirSync)(Wn,{recursive:!0}),(0,s.writeFileSync)(Gn,JSON.stringify(e,null,2),`utf-8`)}catch{}};var Qn=class{constructor(e=new a.Command,t=q()){this.program=e,this.version=t,Vn(),this.setupProgram(),this.registerCommands()}setupProgram(){this.program.name(`stackone`).description(`StackOne CLI`).version(this.version,`-v, --version`)}registerCommands(){let t=new un,n=new _n,r=new hn,o=new tn,s=new on,c=new An,l=new Je,u=new Ut,d=new Me,f=new je,p=new Xe,m=new Wt,h=new qt,g=new En,_=new On;this.program.configureOutput({writeOut:e=>process.stdout.write(e),writeErr:e=>process.stderr.write(e),outputError:(e,t)=>{t(i.default.red(e))}}),this.program.command(`init`).option(`-e, --env <environment>`,`Specify the environment for the configuration profile`).description(`Initialize & create a StackOne CLI configuration profile`).action(e=>{t.execute({environment:e.env})}),this.program.command(`push`).option(`-p, --profile <label>`,`Configuration profile to use`).option(`--api-url <api url>`,`API URL`).option(`--api-key <api key>`,`API Key`).option(`--force`,`Force push the connector, bypassing version conflict checks`).addArgument(new a.Argument(`<path>`,`Connector file or directory to push`)).description(`Push a connector to the StackOne registry`).action((e,t)=>{n.execute({profile:t.profile,fileOrDir:e,apiUrl:t.apiUrl,apiKey:t.apiKey,force:t.force})}),this.program.command(`drop`).option(`-p, --profile <label>`,`Configuration profile to use`).option(`--api-url <api url>`,`API URL`).option(`--api-key <api key>`,`API Key`).addArgument(new a.Argument(`<connector>`,`Connector identifier in format provider_key@version`)).description(`Drop a connector from the StackOne registry`).action((e,t)=>{o.execute({profile:t.profile,connector:e,apiUrl:t.apiUrl,apiKey:t.apiKey})}),this.program.command(`get`).option(`-p, --profile <label>`,`Configuration profile to use`).option(`--api-url <api url>`,`API URL`).option(`--api-key <api key>`,`API Key`).option(`-c, --connector <connector>`,`Connector identifier in format provider_key@version or provider_key (defaults to latest)`).option(`--account-id <account-id>`,`Account ID to fetch connector from`).option(`-f, --format <format>`,`Output format: yaml or json (default: yaml)`,`yaml`).option(`-o, --output-file <output-file>`,`File to write the output to`).option(`--builtin`,`Use the builtin (StackOne) version of the connector`).option(`--custom`,`Use the custom (organization) version of the connector`).option(`--owner <owner>`,`Owner to use for disambiguating connector versions`).description(`Get a connector from the StackOne registry`).action(t=>{[t.builtin,t.custom,t.owner].filter(Boolean).length>1&&(e.w.error(`--builtin, --custom, and --owner are mutually exclusive. Please provide only one.`),process.exit(1)),s.execute({profile:t.profile,connector:t.connector,accountId:t.accountId,format:t.format,outputFile:t.outputFile,apiUrl:t.apiUrl,apiKey:t.apiKey,owner:t.builtin?`builtin`:t.custom?`custom`:t.owner})}),this.program.command(`pull`).option(`-c, --connector <connector>`,`Connector identifier in format provider_key@version or provider_key`).option(`-p, --profile <label>`,`Configuration profile to use`).option(`--api-url <api url>`,`API URL`).option(`--api-key <api key>`,`API Key`).option(`-o, --output <path>`,`Output directory for the connectors files (default: ./connectors)`).option(`--builtin`,`Use the builtin (StackOne) version of the connector`).option(`--custom`,`Use the custom (organization) version of the connector`).option(`--owner <owner>`,`Owner to use for disambiguating connector versions`).description(`Pull a connector configuration from StackOne registry to local filesystem`).action(t=>{[t.builtin,t.custom,t.owner].filter(Boolean).length>1&&(e.w.error(`--builtin, --custom, and --owner are mutually exclusive. Please provide only one.`),process.exit(1)),r.execute({profile:t.profile,connector:t.connector,outputPath:t.output,apiUrl:t.apiUrl,apiKey:t.apiKey,owner:t.builtin?`builtin`:t.custom?`custom`:t.owner})}),this.program.command(`validate`).option(`-w, --watch`,`Run in watch mode`).addArgument(new a.Argument(`<path>`,`Connector file or directory with connectors to validate`)).description(`Validate a StackOne connector`).action((e,t)=>{c.execute({watchMode:t.watch,fileOrDir:e})}),this.program.command(`run`).option(`--connector <connector>`,`Connector file, inline YAML, or identifier (provider_key@version or provider_key for latest)`).option(`--action <action>`,`Action to execute on the connector (path to file or inline string action code)`).option(`--action-id <action-id>`,`Action ID to execute on the connector`).option(`--account <account>`,`Account details to use for running the connector (path to file or inline string account data)`).option(`--account-id <account-id>`,`Account ID to use for running the connector against (fetches connector from API if --connector not provided)`).option(`--params <params>`,`Action parameters (path to file or inline string with JSON parameters)`).option(`--credentials <credentials>`,`Credentials to use (path to file or inline string with JSON credentials)`).option(`-p, --profile <label>`,`Configuration profile to use`).option(`--api-url <api url>`,`API URL`).option(`--api-key <api key>`,`API Key`).option(`-o, --output-file <output-file>`,`File to write the output to`).option(`-d, --debug`,`Enables debug mode to include more details in the action execution output`).option(`--builtin`,`Use the builtin (StackOne) version of the connector`).option(`--custom`,`Use the custom (organization) version of the connector`).option(`--owner <owner>`,`Owner to use for disambiguating connector versions`).description(`Run a connector action`).action(t=>{[t.builtin,t.custom,t.owner].filter(Boolean).length>1&&(e.w.error(`--builtin, --custom, and --owner are mutually exclusive. Please provide only one.`),process.exit(1)),g.execute({connector:t.connector,action:t.action,actionId:t.actionId,account:t.account,accountId:t.accountId,params:t.params,credentials:t.credentials,profile:t.profile,outputFile:t.outputFile,debug:t.debug,apiUrl:t.apiUrl,apiKey:t.apiKey,owner:t.builtin?`builtin`:t.custom?`custom`:t.owner})});let v=this.program.command(`agent`).description(`StackOne agent commands`);v.command(`setup`).option(`-g, --global`,`Global only: auth + MCP server (no connector skills/guide)`).option(`-l, --local`,`Local: auth + .mcp.json + connector skills (.claude/) and guide (CLAUDE.md)`).option(`--path <dir>`,`Target project path for local setup (defaults to the current directory)`).option(`--legacy`,`Use email/password login instead of browser-based auth`).option(`--email <email>`,`Email for legacy login (or set STACKONE_EMAIL); requires --legacy`).option(`--password <password>`,`Password for legacy login (or set STACKONE_PASSWORD); requires --legacy. Prefer --password-stdin`).option(`--password-stdin`,`Read password for legacy login from stdin; requires --legacy`).description(`Set up the StackOne agent — prompts for global vs local when neither flag is given`).action(async t=>{t.global&&t.local&&(e.w.error(`--global and --local are mutually exclusive. Please provide only one.`),process.exit(1));let n=t.email!==void 0,r=t.password!==void 0,a=t.passwordStdin===!0;r&&a&&(e.w.error(`--password and --password-stdin are mutually exclusive. Please provide only one.`),process.exit(1));let o=n||r||a;o&&!t.legacy&&(e.w.error(`--email, --password, and --password-stdin require --legacy.`),process.exit(1)),n&&t.email.trim()===``&&(e.w.error(`--email cannot be empty.`),process.exit(1)),r&&t.password===``&&(e.w.error(`--password cannot be empty.`),process.exit(1)),a&&(n||process.env.STACKONE_EMAIL?.trim()||(e.w.error(`--password-stdin requires --email or STACKONE_EMAIL (stdin is consumed for the password, so email cannot be prompted).`),process.exit(1)));let s={email:t.email,password:t.password,passwordFromStdin:a},c=!!process.stdin.isTTY;if(c&&!t.legacy&&!o){let e=await Ht({initialMode:t.global?`global`:t.local?`local`:null,pathFlag:t.path});process.exit(e.status===`error`?1:0)}let d=c&&!o;!t.global&&!t.local&&!d&&e.w.log(i.default.dim(`No interactive terminal detected — defaulting to global setup. Run in a terminal for the prompt, or pass --local (with --path) / --global.`));let f=et(t.global,t.local,d);if(f===null&&(f=await zt()),f===`local`){let e=tt(t.path,d);e===null&&(e=await Vt(process.cwd())),await u.execute({legacy:!!t.legacy,credentials:s,targetPath:e})}else await l.execute({legacy:!!t.legacy,credentials:s})}),v.command(`cleanup`).description(`Remove all API keys and credentials from configurations`).action(()=>{d.execute()}),v.command(`run`).description(`Run the agent once with a prompt (non-interactive)`).argument(`<prompt>`,`What to do`).option(`-m, --mode <mode>`,`Mode: build, test, or research`,`build`).option(`--max-turns <n>`,`Max agent turns`,`25`).option(`-v, --verbose`,`Verbose output`).action(async(t,n)=>{let r=[`build`,`test`,`research`],a=n.mode??`build`;r.includes(a)||(e.w.error(`${i.default.red(`Invalid mode:`)} ${i.default.white(a)}. Valid modes are: ${r.join(`, `)}.`),process.exit(1));let o=n.maxTurns?parseInt(String(n.maxTurns),10):void 0;await p.execute({prompt:String(t),mode:a,maxTurns:o!==void 0&&!isNaN(o)?o:void 0,verbose:n.verbose})}),v.command(`skills`).description(`List available agent skills and optional recommendations by mode`).option(`-m, --mode <mode>`,`Show skills recommended for this mode`).action(async e=>{await m.execute({mode:e.mode})}),v.command(`sync`).description(`Sync the connector-building skills + guide into this project (.claude/ + CLAUDE.md)`).option(`--check`,`Report drift and exit non-zero instead of writing (CI guard)`).option(`--plugin-dir <path>`,`Override the agent-harness plugin dir (e.g. point at a checkout in CI/benchmarks)`).action(async e=>{await h.execute({check:!!e.check,pluginDir:e.pluginDir})}),v.command(`chat`).option(`-m, --mode <mode>`,`Mode: build, test, or research`,`build`).option(`-c, --connector <name>`,`Connector name`).option(`-a, --action <name>`,`Action name`).option(`-g, --goal <goal>`,`Initial goal/message`).option(`-t, --temperature <number>`,`Temperature (0-1, default: 0.5)`,parseFloat).option(`-v, --verbose`,`Enable verbose logging`).description(`Start an interactive chat session with the agent (use /commands in chat)`).action(async t=>{let n=[`build`,`test`,`research`];t.mode&&!n.includes(t.mode)&&(e.w.error(`❌ Error: Invalid mode "${t.mode}". Must be one of: ${n.join(`, `)}`),process.exit(1)),t.temperature!==void 0&&(isNaN(t.temperature)&&(e.w.error(`❌ Error: Temperature must be a valid number`),process.exit(1)),(t.temperature<0||t.temperature>1)&&(e.w.error(`❌ Error: Temperature must be between 0 and 1`),process.exit(1))),f.execute({mode:t.mode,connector:t.connector,action:t.action,goal:t.goal,temperature:t.temperature,verbose:t.verbose})}),this.program.command(`update`).option(`-f, --force`,`Force reinstall even if already on latest version`).description(`Update the CLI to the latest version`).action(e=>{_.execute({force:e.force})}),this.program.command(`version`).description(`Show version information`).action(async()=>{e.w.log(`${i.default.inverse.greenBright(`StackOne`)} ${i.default.grey(`CLI`)} ${i.default.whiteBright(this.version)}`),Kn(!0),process.exit(0)})}run(){process.argv.includes(`version`)||Kn(),this.program.parse(process.argv)}};Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return Qn}});