@stackone/cli 1.17.0 → 1.17.1

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.
@@ -0,0 +1 @@
1
+ import{s as e}from"./agentConfig-BljaB-6S.mjs";function t(){let t=e();if(t&&t.apiKey)return t.apiKey;let n=process.env.STACKONE_AGENT_TOKEN;if(!n)throw Error(`STACKONE_AGENT_TOKEN not found. Authentication required to use the agent.`);return n}export{t as getAgentApiKey};
@@ -1,2 +1 @@
1
- const e=require(`./agentConfig-CgKwpn5X.cjs`);function t(){let t=e.s();if(t&&t.apiKey)return t.apiKey;let n=process.env.STACKONE_AGENT_TOKEN;if(!n)throw Error(`STACKONE_AGENT_TOKEN not found. Please run "stackone agent setup" to authenticate.
2
- This will save your token to ~/.stackone/agent.json for use across all projects.`);return n}exports.getAgentApiKey=t;
1
+ const e=require(`./agentConfig-CgKwpn5X.cjs`);function t(){let t=e.s();if(t&&t.apiKey)return t.apiKey;let n=process.env.STACKONE_AGENT_TOKEN;if(!n)throw Error(`STACKONE_AGENT_TOKEN not found. Authentication required to use the agent.`);return n}exports.getAgentApiKey=t;
package/dist/cli.cjs CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- const e=require(`./agentConfig-CgKwpn5X.cjs`),t=require(`./cliCore-CxO1oXkm.cjs`);require(`./setupMigration-CGWweyuQ.cjs`);let n=require(`dotenv`);process.env.DOTENV_CONFIG_QUIET=`true`,(0,n.config)(),new t.t().run();
2
+ const e=require(`./agentConfig-CgKwpn5X.cjs`),t=require(`./cliCore-WYgOmkUG.cjs`);require(`./setupMigration-DAlx4sxl.cjs`);let n=require(`dotenv`);process.env.DOTENV_CONFIG_QUIET=`true`,(0,n.config)(),new t.t().run();
package/dist/cli.mjs CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import"./agentConfig-BljaB-6S.mjs";import{t as e}from"./cliCore-FXxtH79f.mjs";import"./setupMigration-9Qv_kZG0.mjs";import{config as t}from"dotenv";process.env.DOTENV_CONFIG_QUIET=`true`,t(),new e().run();export{};
2
+ import"./agentConfig-BljaB-6S.mjs";import{t as e}from"./cliCore-WsNlChLZ.mjs";import"./setupMigration-DdeVl8db.mjs";import{config as t}from"dotenv";process.env.DOTENV_CONFIG_QUIET=`true`,t(),new e().run();export{};
@@ -1,4 +1,4 @@
1
- const e=require(`./agentConfig-CgKwpn5X.cjs`),t=require(`./setupMigration-CGWweyuQ.cjs`);let n=require(`chalk`);n=e.y(n);let r=require(`commander`),i=require(`@stackone/agent-harness`),a=require(`node:fs`);a=e.y(a);let o=require(`node:os`);o=e.y(o);let s=require(`node:path`);s=e.y(s);let c=require(`ink`),l=require(`react`);l=e.y(l);let u=require(`ink-spinner`);u=e.y(u);let d=require(`fs`);d=e.y(d);let f=require(`path`);f=e.y(f);let p=require(`url`),m=require(`node:child_process`),h=require(`node:fs/promises`),g=require(`node:util`),_=require(`ora`);_=e.y(_);let v=require(`node:process`),y=require(`node:readline`),b=require(`inquirer`);b=e.y(b);let x=require(`@stackone/utils`),S=require(`@clack/prompts`),C=require(`@stackone/connect-sdk`),w=require(`diff`),T=require(`readline`),E=require(`@stackone/transport`),D=require(`semver`);D=e.y(D);let O=require(`fs/promises`);function k(e){return e.replace(/\*\*\*(.+?)\*\*\*/g,`$1`).replace(/\*\*(.+?)\*\*/g,`$1`).replace(/\*(.+?)\*/g,`$1`).replace(/__(.+?)__/g,`$1`).replace(/_(.+?)_/g,`$1`).replace(/^#{1,6}\s+(.+)$/gm,`$1`).replace(/```[\s\S]*?```/g,``).replace(/`(.+?)`/g,`$1`).replace(/\[([^\]]+)\]\([^\)]+\)/g,`$1`).replace(/!\[([^\]]*)\]\([^\)]+\)/g,`$1`).replace(/^[-*_]{3,}$/gm,``).replace(/^>\s+/gm,``).trim()}const ee=({title:e,mode:t,connector:n,action:r,onSubmit:i,onExit:a,onStop:o,messages:s,currentToolCalls:d=[],isThinking:f=!1,isComplete:p=!1,error:m,isInterrupted:h=!1,commandHistory:g=[],streamingText:_=``,usage:v,detailViewData:y=null,onCloseDetailView:b,onResumeConversation:x,onToggleSkill:S,onRewindTo:C,spawnedSubagentActive:w=!1,spawnedSubagentName:T=`Subagent`,spawnedSubagentComplete:E=!1,queuedMessages:D=[],isProcessingQueue:O=!1,enabledSkills:ee=[],initInfo:te})=>{let{exit:A}=(0,c.useApp)(),[j,M]=(0,l.useState)(``),[ne,re]=(0,l.useState)(!0),N=(0,l.useRef)(0),[P,F]=(0,l.useState)(0),ie=(0,l.useRef)(!1),[ae,oe]=(0,l.useState)(!1),I=(0,l.useRef)(s),[se,L]=(0,l.useState)(-1),R=(0,l.useRef)(g),z=(0,l.useRef)(``),[B,V]=(0,l.useState)([]),[H,U]=(0,l.useState)(0),[W,ce]=(0,l.useState)(0),[G,le]=(0,l.useState)(!1),[K,q]=(0,l.useState)(!1),[J,Y]=(0,l.useState)(!1),[X,Z]=(0,l.useState)(!1),ue=[`/commands`,`/skills`,`/tools`,`/mcp`,`/compact`,`/rewind`,`/resume`,`/exit`];(0,l.useEffect)(()=>{ie.current=ae},[ae]),(0,l.useEffect)(()=>{N.current=P},[P]),(0,l.useEffect)(()=>{I.current=s},[s]),(0,l.useEffect)(()=>{R.current=g},[g]),(0,l.useEffect)(()=>{z.current=j,j.startsWith(`/`)?(V(ue.filter(e=>e.startsWith(j.toLowerCase()))),U(0)):(V([]),U(0))},[j]),(0,l.useEffect)(()=>{ie.current||F(0)},[s]),(0,c.useInput)((0,l.useCallback)((e,t)=>{let n=z.current,r=se;if(t.escape&&(f||_||d.length>0)){o?.(),M(``),L(-1);return}if(t.escape&&w&&J){Y(!1);return}if(y){if(t.escape||t.ctrl&&e===`c`)if(G){le(!1);return}else{b?.(),ce(0);return}if(t.upArrow&&!G){ce(e=>e>0?e-1:y.items.length-1);return}if(t.downArrow&&!G){ce(e=>e<y.items.length-1?e+1:0);return}if(t.ctrl&&e===`o`&&y.type===`skills`){let e=y.items[W];S&&S(e.name);return}if(t.return){if(G)return;if(y.type===`resume`){let e=y.items[W];e.messages&&x&&(x(e.messages),b?.(),ce(0));return}if(y.type===`rewind`){let e=y.items[W];e.index!==void 0&&C&&(C(e.index),b?.(),ce(0));return}le(!0);return}return}if(t.ctrl&&e===`o`){w?Y(e=>!e):Z(e=>!e);return}if(t.ctrl&&e===`c`)if(n.trim()){M(``),L(-1),q(!1);return}else if(K){a(),A();return}else{q(!0);return}if(t.upArrow){if(B.length>0){U(e=>e>0?e-1:B.length-1);return}let e=R.current;if(e.length>0&&(n===``||r>=0)){L(t=>{let n=t<0?e.length-1:Math.max(0,t-1);return M(e[n]||``),n});return}let t=Math.max(0,I.current.length-5),i=Math.min(N.current+5,t);F(i),oe(i>0);return}if(t.downArrow){if(B.length>0){U(e=>e<B.length-1?e+1:0);return}let e=R.current;if(r>=0){L(t=>{let n=t>=e.length-1?-1:t+1;return M(n<0?``:e[n]||``),n});return}let t=Math.max(N.current-5,0);F(t),oe(t>0);return}if(t.return){if(B.length>0){let e=B[H];V([]),U(0),M(``),i(e);return}j.trim()&&(i(j.trim()),M(``),L(-1),F(0),oe(!1));return}if(t.backspace||t.delete){M(e=>e.slice(0,-1)),L(-1);return}if(t.tab&&n.startsWith(`/`)){let e=ue.filter(e=>e.startsWith(j.toLowerCase()));e.length===1&&M(e[0]);return}e&&(M(t=>t+e),L(-1),q(!1))},[i,a,A,j,se,ue,B,H,y,G,b,K,w,E,J,x,W])),(0,l.useEffect)(()=>{p&&re(!1)},[p]);let Q=`\x1B[38;2;0;175;102m`,$=`\x1B[0m`,de=`${Q} ╔═════════╗${$} ▄▖▗ ▌ ▄▖ ▄▖ ▗ ${Q}╔═════════╗${$}
1
+ const e=require(`./agentConfig-CgKwpn5X.cjs`),t=require(`./setupMigration-DAlx4sxl.cjs`);let n=require(`chalk`);n=e.y(n);let r=require(`commander`),i=require(`@stackone/agent-harness`),a=require(`node:fs`);a=e.y(a);let o=require(`node:os`);o=e.y(o);let s=require(`node:path`);s=e.y(s);let c=require(`ink`),l=require(`react`);l=e.y(l);let u=require(`ink-spinner`);u=e.y(u);let d=require(`fs`);d=e.y(d);let f=require(`path`);f=e.y(f);let p=require(`url`),m=require(`node:child_process`),h=require(`node:fs/promises`),g=require(`node:util`),_=require(`ora`);_=e.y(_);let v=require(`node:process`),y=require(`node:readline`),b=require(`inquirer`);b=e.y(b);let x=require(`@stackone/utils`),S=require(`@clack/prompts`),C=require(`@stackone/connect-sdk`),w=require(`diff`),T=require(`readline`),E=require(`@stackone/transport`),D=require(`semver`);D=e.y(D);let O=require(`fs/promises`);function k(e){return e.replace(/\*\*\*(.+?)\*\*\*/g,`$1`).replace(/\*\*(.+?)\*\*/g,`$1`).replace(/\*(.+?)\*/g,`$1`).replace(/__(.+?)__/g,`$1`).replace(/_(.+?)_/g,`$1`).replace(/^#{1,6}\s+(.+)$/gm,`$1`).replace(/```[\s\S]*?```/g,``).replace(/`(.+?)`/g,`$1`).replace(/\[([^\]]+)\]\([^\)]+\)/g,`$1`).replace(/!\[([^\]]*)\]\([^\)]+\)/g,`$1`).replace(/^[-*_]{3,}$/gm,``).replace(/^>\s+/gm,``).trim()}const ee=({title:e,mode:t,connector:n,action:r,onSubmit:i,onExit:a,onStop:o,messages:s,currentToolCalls:d=[],isThinking:f=!1,isComplete:p=!1,error:m,isInterrupted:h=!1,commandHistory:g=[],streamingText:_=``,usage:v,detailViewData:y=null,onCloseDetailView:b,onResumeConversation:x,onToggleSkill:S,onRewindTo:C,spawnedSubagentActive:w=!1,spawnedSubagentName:T=`Subagent`,spawnedSubagentComplete:E=!1,queuedMessages:D=[],isProcessingQueue:O=!1,enabledSkills:ee=[],initInfo:te})=>{let{exit:A}=(0,c.useApp)(),[j,M]=(0,l.useState)(``),[ne,re]=(0,l.useState)(!0),N=(0,l.useRef)(0),[P,F]=(0,l.useState)(0),ie=(0,l.useRef)(!1),[ae,oe]=(0,l.useState)(!1),I=(0,l.useRef)(s),[se,L]=(0,l.useState)(-1),R=(0,l.useRef)(g),z=(0,l.useRef)(``),[B,V]=(0,l.useState)([]),[H,U]=(0,l.useState)(0),[W,ce]=(0,l.useState)(0),[G,le]=(0,l.useState)(!1),[K,q]=(0,l.useState)(!1),[J,Y]=(0,l.useState)(!1),[X,Z]=(0,l.useState)(!1),ue=[`/commands`,`/skills`,`/tools`,`/mcp`,`/compact`,`/rewind`,`/resume`,`/exit`];(0,l.useEffect)(()=>{ie.current=ae},[ae]),(0,l.useEffect)(()=>{N.current=P},[P]),(0,l.useEffect)(()=>{I.current=s},[s]),(0,l.useEffect)(()=>{R.current=g},[g]),(0,l.useEffect)(()=>{z.current=j,j.startsWith(`/`)?(V(ue.filter(e=>e.startsWith(j.toLowerCase()))),U(0)):(V([]),U(0))},[j]),(0,l.useEffect)(()=>{ie.current||F(0)},[s]),(0,c.useInput)((0,l.useCallback)((e,t)=>{let n=z.current,r=se;if(t.escape&&(f||_||d.length>0)){o?.(),M(``),L(-1);return}if(t.escape&&w&&J){Y(!1);return}if(y){if(t.escape||t.ctrl&&e===`c`)if(G){le(!1);return}else{b?.(),ce(0);return}if(t.upArrow&&!G){ce(e=>e>0?e-1:y.items.length-1);return}if(t.downArrow&&!G){ce(e=>e<y.items.length-1?e+1:0);return}if(t.ctrl&&e===`o`&&y.type===`skills`){let e=y.items[W];S&&S(e.name);return}if(t.return){if(G)return;if(y.type===`resume`){let e=y.items[W];e.messages&&x&&(x(e.messages),b?.(),ce(0));return}if(y.type===`rewind`){let e=y.items[W];e.index!==void 0&&C&&(C(e.index),b?.(),ce(0));return}le(!0);return}return}if(t.ctrl&&e===`o`){w?Y(e=>!e):Z(e=>!e);return}if(t.ctrl&&e===`c`)if(n.trim()){M(``),L(-1),q(!1);return}else if(K){a(),A();return}else{q(!0);return}if(t.upArrow){if(B.length>0){U(e=>e>0?e-1:B.length-1);return}let e=R.current;if(e.length>0&&(n===``||r>=0)){L(t=>{let n=t<0?e.length-1:Math.max(0,t-1);return M(e[n]||``),n});return}let t=Math.max(0,I.current.length-5),i=Math.min(N.current+5,t);F(i),oe(i>0);return}if(t.downArrow){if(B.length>0){U(e=>e<B.length-1?e+1:0);return}let e=R.current;if(r>=0){L(t=>{let n=t>=e.length-1?-1:t+1;return M(n<0?``:e[n]||``),n});return}let t=Math.max(N.current-5,0);F(t),oe(t>0);return}if(t.return){if(B.length>0){let e=B[H];V([]),U(0),M(``),i(e);return}j.trim()&&(i(j.trim()),M(``),L(-1),F(0),oe(!1));return}if(t.backspace||t.delete){M(e=>e.slice(0,-1)),L(-1);return}if(t.tab&&n.startsWith(`/`)){let e=ue.filter(e=>e.startsWith(j.toLowerCase()));e.length===1&&M(e[0]);return}e&&(M(t=>t+e),L(-1),q(!1))},[i,a,A,j,se,ue,B,H,y,G,b,K,w,E,J,x,W])),(0,l.useEffect)(()=>{p&&re(!1)},[p]);let Q=`\x1B[38;2;0;175;102m`,$=`\x1B[0m`,de=`${Q} ╔═════════╗${$} ▄▖▗ ▌ ▄▖ ▄▖ ▗ ${Q}╔═════════╗${$}
2
2
  ${Q} ║ ┌────╚════╗${$} ▚ ▜▘▀▌▛▘▙▘▌▌▛▌█▌ ▌▌▛▌█▌▛▌▜▘ ${Q}║ ┌────╚════╗${$}
3
3
  ${Q} ╚════╗────┘ ║${$} ▄▌▐▖█▌▙▖▛▖▙▌▌▌▙▖ ▛▌▙▌▙▖▌▌▐▖ ${Q}╚════╗────┘ ║${$}
4
4
  ${Q} ╚═════════╝${$} ▄▌ ${Q}╚═════════╝${$}`;return l.default.createElement(c.Box,{flexDirection:`column`,padding:2},l.default.createElement(c.Box,{flexDirection:`column`,marginBottom:2,marginTop:1},l.default.createElement(c.Text,null,de,`
@@ -59,15 +59,20 @@ Original error: ${n}`):n.includes(`API key`)||n.includes(`Invalid API Key`)?(e._
59
59
 
60
60
  `);return G(!1),K(!1),X([]),Z.current&&=(clearTimeout(Z.current),null),setTimeout(()=>{de(n,!0)},100),[]})},me=(0,l.useCallback)(e=>{te(t=>t.includes(e)?t.filter(t=>t!==e):t.length>=8?t:[...t,e])},[]);(0,l.useEffect)(()=>{oe?.type===`skills`&&A.length>0&&I({type:`skills`,items:A.map(e=>({name:e.name,description:e.description,version:e.version,author:e.author,tags:e.tags,enabled:k.includes(e.name)}))})},[k,A,oe?.type]);let he=()=>{},ge=(0,l.useCallback)(()=>{J.current.shouldStop=!0,v(!1),K(!1),q.current=!1,N(``),g(new Map),X([]),W([]),G(!1),m(e=>e.length>0&&e[e.length-1].role===`user`?e.slice(0,-1):e),S(!0)},[]);return C?l.default.createElement(ee,{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:he,onStop:ge}):l.default.createElement(ee,{title:`Agent ${t.charAt(0).toUpperCase()+t.slice(1)} Mode`,mode:t,connector:n,action:r,messages:p,currentToolCalls:Array.from(h.values()),isThinking:_,isComplete:!1,error:y,isInterrupted:x,onSubmit:de,onExit:he,onStop:ge,commandHistory:M,streamingText:re,usage:P,detailViewData:oe,onCloseDetailView:()=>I(null),onToggleSkill:me,onRewindTo:e=>{try{let t=s.join(o.homedir(),`.stackone`,`agent_history`),n=a.readFileSync(t,`utf-8`).split(`
61
61
  `).filter(e=>e.trim()),r=n.slice(0,e+1);a.writeFileSync(t,r.join(`
62
- `),`utf-8`);let i={role:`system`,content:`⏮️ Rewound to command: "${n[e]}"`,timestamp:new Date};m(e=>[...e,i])}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:se,spawnedSubagentName:z,spawnedSubagentComplete:V,queuedMessages:U,isProcessingQueue:ce,enabledSkills:k,initInfo:ue})};var M=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}=await Promise.resolve().then(()=>require(`./agentApiKey-B1boY6Nf.cjs`)),{hasOldSetupFiles:r,migrateFromLocalSetup:i,displayMigrationMessage:u}=await Promise.resolve().then(()=>require(`./setupMigration-DrUrg7-c.cjs`));try{let d=process.cwd();r(d)&&u(await i(d));let f=n(),p=s.join(o.homedir(),`.stackone`,`trusted_directories`),m=[];try{a.existsSync(p)&&(m=a.readFileSync(p,`utf-8`).split(`
63
- `).filter(e=>e.trim()))}catch(t){e._.error(`[Trust] Failed to load trusted directories:`,t)}if(!m.includes(d)){let t=!1,{waitUntilExit:n}=(0,c.render)(l.default.createElement(te,{directory:d,onConfirm:()=>{t=!0;try{let e=s.dirname(p);a.existsSync(e)||a.mkdirSync(e,{recursive:!0}),m.push(d),a.writeFileSync(p,m.join(`
64
- `),`utf-8`)}catch(t){e._.error(`[Trust] Failed to save trusted directory:`,t)}},onCancel:()=>{t=!1}}));await n(),t||(e._.log(`
65
- Exiting...`),process.exit(0)),process.stdout.write(`\x1Bc`)}(0,c.render)(l.default.createElement(j,{...t,apiKey:f}))}catch(t){let n=t instanceof Error?t.message:String(t);n.includes(`STACKONE_AGENT_TOKEN`)?(e._.error(`
62
+ `),`utf-8`);let i={role:`system`,content:`⏮️ Rewound to command: "${n[e]}"`,timestamp:new Date};m(e=>[...e,i])}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:se,spawnedSubagentName:z,spawnedSubagentComplete:V,queuedMessages:U,isProcessingQueue:ce,enabledSkills:k,initInfo:ue})};var M=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:r}=await Promise.resolve().then(()=>require(`./agentApiKey-BULbfkYn.cjs`)),{hasOldSetupFiles:i,migrateFromLocalSetup:u,displayMigrationMessage:d}=await Promise.resolve().then(()=>require(`./setupMigration-DFIrvmxq.cjs`));try{let n=process.cwd();i(n)&&d(await u(n));let f=r();process.env.STACKONE_AGENT_TOKEN||(process.env.STACKONE_AGENT_TOKEN=f);let p=s.join(o.homedir(),`.stackone`,`trusted_directories`),m=[];try{a.existsSync(p)&&(m=a.readFileSync(p,`utf-8`).split(`
63
+ `).filter(e=>e.trim()))}catch(t){e._.error(`[Trust] Failed to load trusted directories:`,t)}if(!m.includes(n)){let t=!1,{waitUntilExit:r}=(0,c.render)(l.default.createElement(te,{directory:n,onConfirm:()=>{t=!0;try{let e=s.dirname(p);a.existsSync(e)||a.mkdirSync(e,{recursive:!0}),m.push(n),a.writeFileSync(p,m.join(`
64
+ `),`utf-8`)}catch(t){e._.error(`[Trust] Failed to save trusted directory:`,t)}},onCancel:()=>{t=!1}}));await r(),t||(e._.log(`
65
+ Exiting...`),process.exit(0)),process.stdout.write(`\x1Bc`)}(0,c.render)(l.default.createElement(j,{...t,apiKey:f}))}catch(t){let r=t instanceof Error?t.message:String(t);r.includes(`STACKONE_AGENT_TOKEN`)?(e._.error(`
66
66
  ❌ Authentication Required
67
- `),e._.log(`The StackOne Agent requires authentication via the StackOne proxy.`),e._.log(`
68
- Please run:
69
- `),e._.log(` stackone agent setup
70
- `),e._.log(`This will authenticate you and configure access to Claude and LangSmith.`)):e._.error(`ERROR:`,n),process.exit(1)}}};const ne=(0,g.promisify)(m.exec);async function re(e){try{let t=await(0,h.readFile)(e,`utf-8`),n=JSON.parse(t),r=!1;if(n.mcpServers&&typeof n.mcpServers==`object`){for(let[e,t]of Object.entries(n.mcpServers))if(t&&typeof t==`object`&&`transport`in t){let e=t.transport;if(e&&typeof e==`object`&&`headers`in e){let t=e.headers;if(t&&typeof t==`object`&&`Authorization`in t){let e=t.Authorization;typeof e==`string`&&e.startsWith(`Bearer `)&&!e.includes("${")&&(t.Authorization="Bearer ${STACKONE_AGENT_TOKEN}",r=!0)}}}}return r&&await(0,h.writeFile)(e,JSON.stringify(n,null,2)),r}catch{return!1}}var N=class{async execute(){e._.log(n.default.blue.bold(`🧹 StackOne Agent Cleanup
67
+ `),e._.log(n.default.white(`You need to authenticate before using the agent.
68
+ `)),e._.log(n.default.white(`To get started, run:
69
+ `)),e._.log(n.default.cyan(` stackone agent setup
70
+ `)),e._.log(n.default.dim(`This will:`)),e._.log(n.default.dim(` • Authenticate with your StackOne credentials`)),e._.log(n.default.dim(` Save your token securely to ~/.stackone/agent-config.json`)),e._.log(n.default.dim(` • Enable access to Claude AI and MCP tools
71
+ `)),e._.log(n.default.white(`If you already ran setup, your local configuration may be missing or unreadable.`)),e._.log(n.default.white(`Run setup again to create or repair your authentication configuration.
72
+ `))):(e._.error(`
73
+ ❌ Error:`,r),e._.log(n.default.dim(`
74
+ If you continue to see this error, try running:`)),e._.log(n.default.cyan(` stackone agent setup
75
+ `))),process.exit(1)}}};const ne=(0,g.promisify)(m.exec);async function re(e){try{let t=await(0,h.readFile)(e,`utf-8`),n=JSON.parse(t),r=!1;if(n.mcpServers&&typeof n.mcpServers==`object`){for(let[e,t]of Object.entries(n.mcpServers))if(t&&typeof t==`object`&&`transport`in t){let e=t.transport;if(e&&typeof e==`object`&&`headers`in e){let t=e.headers;if(t&&typeof t==`object`&&`Authorization`in t){let e=t.Authorization;typeof e==`string`&&e.startsWith(`Bearer `)&&!e.includes("${")&&(t.Authorization="Bearer ${STACKONE_AGENT_TOKEN}",r=!0)}}}}return r&&await(0,h.writeFile)(e,JSON.stringify(n,null,2)),r}catch{return!1}}var N=class{async execute(){e._.log(n.default.blue.bold(`🧹 StackOne Agent Cleanup
71
76
  `));let t={configsCleaned:0};try{let r=(0,_.default)(`Removing stored configuration...`).start();await e.t(),r.succeed(`Removed ~/.stackone/agent-config.json`);let i=(0,_.default)(`Removing MCP servers from Claude...`).start(),a=0;try{await ne(`claude mcp remove ${e.r()} 2>/dev/null`),a++}catch{}try{await ne(`claude mcp remove ${e.i()} 2>/dev/null`),a++}catch{}a>0?i.succeed(`Removed ${a} MCP server(s) from Claude`):i.warn(`No MCP servers found in Claude (already removed or not configured)`);let o=(0,_.default)(`Checking for .mcp.json file...`).start(),c=(0,s.join)(process.cwd(),`.mcp.json`);try{await re(c)?(t.configsCleaned=1,o.succeed(`Cleaned .mcp.json (replaced tokens with environment variables)`)):o.info(`.mcp.json already uses environment variables or not found`)}catch{o.info(`.mcp.json not found (already cleaned or not created)`)}e._.success(`Cleanup complete!`),e._.log(n.default.white(`
72
77
  What was removed:`)),e._.log(n.default.cyan(` • ~/.stackone/agent-config.json`)),e._.log(n.default.cyan(` • MCP server from Claude configuration`)),t.configsCleaned>0&&e._.log(n.default.cyan(` • Hardcoded credentials from .mcp.json`)),e._.log(n.default.dim(`
73
78
  To authenticate again:`)),e._.log(n.default.cyan(` stackone agent setup --global`),n.default.dim(`(for global setup)`)),e._.log(n.default.cyan(` stackone agent setup --local`),n.default.dim(`(for local project setup)`)),e._.log(``),process.exit(0)}catch(t){t instanceof Error?e._.error(t.message):e._.error(`Unknown error occurred`),process.exit(1)}}},P=class{constructor(e){this.baseUrl=e||process.env.AUTH_SERVER_URL||`https://idp-api.stackone.com`}async login(e,t){try{let n=`${this.baseUrl}/auth/sign-in/mcp`,r=await fetch(n,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({email:e,password:t})});if(!r.ok){let e=await r.text(),t={};try{t=JSON.parse(e)}catch{}return{success:!1,error:t.error||`HTTP ${r.status}: ${r.statusText}`}}let i=await r.text(),a=JSON.parse(i);return a.apiKey?{success:!0,apiKey:a.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=`${this.baseUrl}/api-key/verify`,n=await fetch(t,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({key:e})});if(!n.ok){let e=await n.text(),t={};try{t=JSON.parse(e)}catch{}return{valid:!1,error:t.error||`HTTP ${n.status}: ${n.statusText}`}}let r=await n.text();return JSON.parse(r)}catch(e){return{valid:!1,error:e instanceof Error?e.message:`Network error occurred`}}}};const F=new P,ie=(0,g.promisify)(m.exec);function ae(e){let t=new Date(e),n=new Date,r=t.getTime()-n.getTime(),i=Math.floor(r/(3600*1e3)),a=t.toLocaleTimeString(`en-US`,{hour:`numeric`,minute:`2-digit`,hour12:!0});return`${t.toDateString()===n.toDateString()?`Today`:t.toDateString()===new Date(n.getTime()+864e5).toDateString()?`Tomorrow`:t.toLocaleDateString(`en-US`,{month:`short`,day:`numeric`})} at ${a} (${i} hours from now)`}var oe=class{async execute(){e._.log(n.default.blue.bold(`🤖 StackOne Agent Setup - Global Configuration
@@ -80,7 +85,7 @@ To setup for a specific project, run:`),n.default.cyan(`stackone agent setup --l
80
85
  `));try{let r=process.cwd();t.n(r)&&t.t(await t.r(r));let i=await e.o();if(!i||!e.a(i)){e._.warn(`Not authenticated globally.`),e._.log(n.default.white(`Let's authenticate now...
81
86
  `));let t=(0,y.createInterface)({input:v.stdin,output:v.stdout}),r=await new Promise(e=>{t.question(n.default.white(`Email: `),t=>{e(t.trim())})});t.close(),r||(e._.error(`Email is required`),process.exit(1));let a=await b.default.prompt([{type:`password`,name:`password`,message:`Password:`,mask:`*`}]);a.password||(e._.error(`Password is required`),process.exit(1)),e._.log(``);let o=(0,_.default)(`Authenticating...`).start(),s=await F.login(r,a.password);(!s.success||!s.apiKey)&&(o.fail(`Authentication failed`),e._.error(`${s.error||`Invalid credentials`}`),e._.log(n.default.dim(`Please check your email and password and try again.
82
87
  `)),process.exit(1)),o.succeed(`Login successful!`);let c=new Date(Date.now()+1440*60*1e3).toISOString();await e.c({apiKey:s.apiKey,userId:r,email:r,expiresAt:c,serverUrl:e.n()}),i={apiKey:s.apiKey,userId:r,email:r,expiresAt:c,serverUrl:e.n()},e._.log(``)}e._.success(`Setup complete!`),e._.log(n.default.white(`
83
- Token saved to:`)),e._.log(n.default.cyan(` ~/.stackone/agent.json`)),e._.log(``),process.exit(0)}catch(t){t instanceof Error?e._.error(t.message):e._.error(`Unknown error occurred`),process.exit(1)}}};const se={profiles:{}},L=()=>{let t=e.l.readConfigFile(e.u);if(!t)return se;try{return JSON.parse(t)}catch{return se}},R=e=>L().profiles[e],z=e=>!!L().profiles[e],B=(t,n)=>{let r=L();r.profiles[t]=n,e.l.writeConfigFile(e.u,JSON.stringify(r,null,2))},V=()=>{let e=L();return Object.keys(e.profiles)},H=`https://api.stackone.com`;var U=class{async execute({profile:t,connector:r,apiUrl:i,apiKey:a}={}){if(!t&&!a&&(e._.error(`Profile or API key is required`),e._.log(`Please provide a profile using the ${e.g(`--profile`)} option or an API key using the ${e.g(`--api-key`)} option.`),e._.log(`To create a profile, run ${e.g(`stackone init`)}.`),process.exit(1)),t&&a&&(e._.error(`Please provide either a profile or an API key, not both`),process.exit(1)),t&&i&&e._.warn(`Specifying ${e.g(`--api-url`)} with a profile won't have any effect. Using API url from profile.`),t&&!z(t)){e._.error(`Configuration profile ${e.g(t)} not found`),e._.log(`Run ${e.g(`stackone init`)} to create a new configuration profile.\n`);let r=V();r.length>0&&(e._.info(`Available configuration profiles:`),r.forEach(t=>{e._.log(` - ${n.default.blue(t)}`)})),process.exit(1)}let o=t?R(t):{apiUrl:i??H,apiKey:a};o?.apiKey||(e._.error(`API key is missing`),e._.log(`Please provide a valid API key in the profile or via the ${e.g(`--api-key`)} option.`),process.exit(1)),r||(e._.error(`Connector identifier is required in the format provider_key@version.`),process.exit(1));let s=r.split(`@`);(s.length!==2||!s[0]||!s[1])&&(e._.error(`Invalid connector format ${e.h(r)}. Expected format: ${e.g(`provider_key@version`)}`),process.exit(1));let c=o.apiUrl??H,l=await this.dropConnector(r,c,o.apiKey);process.exit(l?0:1)}async dropConnector(t,n,r){let i=(0,_.default)(`🗑️ Dropping connector ${e.g(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._.success(`Successfully dropped connector ${e.g(t)} from the registry`),!0):o.status===404?(e._.error(`Connector ${e.g(t)} not found in the registry`),!1):o.status===401||o.status===403?(e._.error(`You do not have permission to drop this connector`),!1):o.status===409?(e._.error(`Connector ${e.g(t)} has associated configs and cannot be dropped`),e._.log(`Please delete all associated integration configurations before dropping the connector.`),!1):(o.ok||await e.m(o,`Failed to drop connector ${e.g(t)} from the registry`),!1)}catch(r){return i.stop(),e._.error(`Failed to drop connector ${e.g(t)} from registry: ${r.message}`),e._.log(`Please ensure that the API at ${e.v(n)} is reachable and the API key is valid`),!1}}};const W=`https://api.stackone.com`;var ce=class{async execute({profile:t,connector:r,accountId:i,format:a,outputFile:o,apiUrl:s,apiKey:c}={}){if(!t&&!c&&(e._.error(`Profile or API key is required`),e._.log(`Please provide a profile using the ${e.g(`--profile`)} option or an API key using the ${e.g(`--api-key`)} option.`),e._.log(`To create a profile, run ${e.g(`stackone init`)}.`),process.exit(1)),t&&c&&(e._.error(`Please provide either a profile or an API key, not both`),process.exit(1)),t&&s&&e._.warn(`Specifying ${e.g(`--api-url`)} with a profile won't have any effect. Using API url from profile.`),t&&!z(t)){e._.error(`Configuration profile ${e.g(t)} not found`),e._.log(`Run ${e.g(`stackone init`)} to create a new configuration profile.\n`);let r=V();r.length>0&&(e._.info(`Available configuration profiles:`),r.forEach(t=>{e._.log(` - ${n.default.blue(t)}`)})),process.exit(1)}let l=t?R(t):{apiUrl:s??W,apiKey:c};l?.apiKey||(e._.error(`API key is missing`),e._.log(`Please provide a valid API key in the profile or via the ${e.g(`--api-key`)} option.`),process.exit(1)),(0,x.isMissing)(r)&&(0,x.isMissing)(i)&&(e._.error(`Either ${e.g(`--connector`)} or ${e.g(`--account-id`)} must be provided`),process.exit(1)),(0,x.notMissing)(r)&&(0,x.notMissing)(i)&&(e._.error(`Please provide either ${e.g(`--connector`)} or ${e.g(`--account-id`)}, not both.`),process.exit(1)),(0,x.notMissing)(a)&&a!==`yaml`&&a!==`json`&&(e._.error(`Format must be either ${e.g(`yaml`)} or ${e.g(`json`)}.`),process.exit(1));let u=l.apiUrl??W,f;if((0,x.notMissing)(r)){this.#t(r)||(e._.error(`Invalid connector format ${e.h(r)}. Expected format: ${e.g(`provider_key@version`)} or ${e.g(`provider_key`)}`),process.exit(1));let t=this.#n(r);f=await this.#r(t,u,l.apiKey,a)}else (0,x.notMissing)(i)?f=await this.#i(i,u,l.apiKey,a):(e._.error(`Either ${e.g(`--connector`)} or ${e.g(`--account-id`)} must be provided`),process.exit(1));if((0,x.notMissing)(o))try{d.default.writeFileSync(o,f,`utf-8`),e._.success(`Connector written to file: ${e.g(o)}`)}catch(t){e._.error(`Failed to write connector to file ${e.g(o)}: ${t.message}`),process.exit(1)}else if(e._.log(`\n${n.default.blue.inverse(` CONNECTOR CONTENT `)}\n`),!a||a===`yaml`)e._.log(this.#e(f));else if(a===`json`)try{e.p(JSON.parse(f))}catch{e._.log(f)}else e._.log(f);process.exit(0)}#e(e){return e.split(`
88
+ Token saved to:`)),e._.log(n.default.cyan(` ~/.stackone/agent-config.json`)),e._.log(``),process.exit(0)}catch(t){t instanceof Error?e._.error(t.message):e._.error(`Unknown error occurred`),process.exit(1)}}};const se={profiles:{}},L=()=>{let t=e.l.readConfigFile(e.u);if(!t)return se;try{return JSON.parse(t)}catch{return se}},R=e=>L().profiles[e],z=e=>!!L().profiles[e],B=(t,n)=>{let r=L();r.profiles[t]=n,e.l.writeConfigFile(e.u,JSON.stringify(r,null,2))},V=()=>{let e=L();return Object.keys(e.profiles)},H=`https://api.stackone.com`;var U=class{async execute({profile:t,connector:r,apiUrl:i,apiKey:a}={}){if(!t&&!a&&(e._.error(`Profile or API key is required`),e._.log(`Please provide a profile using the ${e.g(`--profile`)} option or an API key using the ${e.g(`--api-key`)} option.`),e._.log(`To create a profile, run ${e.g(`stackone init`)}.`),process.exit(1)),t&&a&&(e._.error(`Please provide either a profile or an API key, not both`),process.exit(1)),t&&i&&e._.warn(`Specifying ${e.g(`--api-url`)} with a profile won't have any effect. Using API url from profile.`),t&&!z(t)){e._.error(`Configuration profile ${e.g(t)} not found`),e._.log(`Run ${e.g(`stackone init`)} to create a new configuration profile.\n`);let r=V();r.length>0&&(e._.info(`Available configuration profiles:`),r.forEach(t=>{e._.log(` - ${n.default.blue(t)}`)})),process.exit(1)}let o=t?R(t):{apiUrl:i??H,apiKey:a};o?.apiKey||(e._.error(`API key is missing`),e._.log(`Please provide a valid API key in the profile or via the ${e.g(`--api-key`)} option.`),process.exit(1)),r||(e._.error(`Connector identifier is required in the format provider_key@version.`),process.exit(1));let s=r.split(`@`);(s.length!==2||!s[0]||!s[1])&&(e._.error(`Invalid connector format ${e.h(r)}. Expected format: ${e.g(`provider_key@version`)}`),process.exit(1));let c=o.apiUrl??H,l=await this.dropConnector(r,c,o.apiKey);process.exit(l?0:1)}async dropConnector(t,n,r){let i=(0,_.default)(`🗑️ Dropping connector ${e.g(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._.success(`Successfully dropped connector ${e.g(t)} from the registry`),!0):o.status===404?(e._.error(`Connector ${e.g(t)} not found in the registry`),!1):o.status===401||o.status===403?(e._.error(`You do not have permission to drop this connector`),!1):o.status===409?(e._.error(`Connector ${e.g(t)} has associated configs and cannot be dropped`),e._.log(`Please delete all associated integration configurations before dropping the connector.`),!1):(o.ok||await e.m(o,`Failed to drop connector ${e.g(t)} from the registry`),!1)}catch(r){return i.stop(),e._.error(`Failed to drop connector ${e.g(t)} from registry: ${r.message}`),e._.log(`Please ensure that the API at ${e.v(n)} is reachable and the API key is valid`),!1}}};const W=`https://api.stackone.com`;var ce=class{async execute({profile:t,connector:r,accountId:i,format:a,outputFile:o,apiUrl:s,apiKey:c}={}){if(!t&&!c&&(e._.error(`Profile or API key is required`),e._.log(`Please provide a profile using the ${e.g(`--profile`)} option or an API key using the ${e.g(`--api-key`)} option.`),e._.log(`To create a profile, run ${e.g(`stackone init`)}.`),process.exit(1)),t&&c&&(e._.error(`Please provide either a profile or an API key, not both`),process.exit(1)),t&&s&&e._.warn(`Specifying ${e.g(`--api-url`)} with a profile won't have any effect. Using API url from profile.`),t&&!z(t)){e._.error(`Configuration profile ${e.g(t)} not found`),e._.log(`Run ${e.g(`stackone init`)} to create a new configuration profile.\n`);let r=V();r.length>0&&(e._.info(`Available configuration profiles:`),r.forEach(t=>{e._.log(` - ${n.default.blue(t)}`)})),process.exit(1)}let l=t?R(t):{apiUrl:s??W,apiKey:c};l?.apiKey||(e._.error(`API key is missing`),e._.log(`Please provide a valid API key in the profile or via the ${e.g(`--api-key`)} option.`),process.exit(1)),(0,x.isMissing)(r)&&(0,x.isMissing)(i)&&(e._.error(`Either ${e.g(`--connector`)} or ${e.g(`--account-id`)} must be provided`),process.exit(1)),(0,x.notMissing)(r)&&(0,x.notMissing)(i)&&(e._.error(`Please provide either ${e.g(`--connector`)} or ${e.g(`--account-id`)}, not both.`),process.exit(1)),(0,x.notMissing)(a)&&a!==`yaml`&&a!==`json`&&(e._.error(`Format must be either ${e.g(`yaml`)} or ${e.g(`json`)}.`),process.exit(1));let u=l.apiUrl??W,f;if((0,x.notMissing)(r)){this.#t(r)||(e._.error(`Invalid connector format ${e.h(r)}. Expected format: ${e.g(`provider_key@version`)} or ${e.g(`provider_key`)}`),process.exit(1));let t=this.#n(r);f=await this.#r(t,u,l.apiKey,a)}else (0,x.notMissing)(i)?f=await this.#i(i,u,l.apiKey,a):(e._.error(`Either ${e.g(`--connector`)} or ${e.g(`--account-id`)} must be provided`),process.exit(1));if((0,x.notMissing)(o))try{d.default.writeFileSync(o,f,`utf-8`),e._.success(`Connector written to file: ${e.g(o)}`)}catch(t){e._.error(`Failed to write connector to file ${e.g(o)}: ${t.message}`),process.exit(1)}else if(e._.log(`\n${n.default.blue.inverse(` CONNECTOR CONTENT `)}\n`),!a||a===`yaml`)e._.log(this.#e(f));else if(a===`json`)try{e.p(JSON.parse(f))}catch{e._.log(f)}else e._.log(f);process.exit(0)}#e(e){return e.split(`
84
89
  `).map(e=>{if(e.trim().startsWith(`#`))return n.default.gray(e);if(e.includes(`:`)){let t=e.indexOf(`:`),r=e.substring(0,t+1),i=e.substring(t+1),a=i,o=i.trim();return o===`true`||o===`false`?a=i.replace(o,n.default.cyan(o)):o===`null`||o===`~`?a=i.replace(o,n.default.gray(o)):/^-?\d+(\.\d+)?$/.test(o)?a=i.replace(o,n.default.green(o)):(o.startsWith(`"`)&&o.endsWith(`"`)||o.startsWith(`'`)&&o.endsWith(`'`)||o&&!o.startsWith(`-`))&&(a=i.replace(o,n.default.yellow(o))),n.default.red(r)+a}return e.trim().startsWith(`-`)?e.replace(`-`,n.default.gray(`-`)):e}).join(`
85
90
  `)}#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){let a=(0,_.default)(`Getting connector ${e.g(t)} from registry...`).start();try{let o=Buffer.from(r).toString(`base64`),s=i?`?format=${i}`:``,c=await fetch(`${n}/registry/connectors/${t}${s}`,{method:`GET`,headers:{Authorization:`Basic ${o}`}});return a.stop(),c.ok||(await e.m(c,`Failed to get connector ${e.g(t)} from the registry`),process.exit(1)),await c.text()}catch(r){a.stop(),e._.error(`Failed to get connector ${e.g(t)} from the registry: ${r.message}`),e._.log(`Please ensure that the API at ${e.v(n)} is reachable and the API key is valid`),process.exit(1)}}async#i(t,n,r,i){let a=(0,_.default)(`Getting connector from account ${e.g(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.m(c,`Failed to get connector from account ${e.g(t)}`),process.exit(1)),await c.text()}catch(r){a.stop(),e._.error(`Failed to get connector from account ${e.g(t)}: ${r.message}`),e._.log(`Please ensure that the API at ${e.v(n)} is reachable and the API key is valid`),process.exit(1)}}};const G=`https://api.stackone.com`,le=`https://api.stackone-dev.com`,K=`http://localhost:4000`;var q=class{async execute({environment:t}={}){let r=t?.toLowerCase()??`production`;try{(0,S.intro)(`${n.default.inverse(` Initialize profile `)}`);let t=await(0,S.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,S.isCancel)(t))return(0,S.cancel)(`Configuration profile initialization cancelled`),process.exit(0);if(z(t)){let n=await(0,S.confirm)({message:`Configuration profile with name ${e.g(t)} already exists. Do you want to overwrite it?`});if((0,S.isCancel)(n)||!n)return(0,S.cancel)(`Configuration profile initialization cancelled`),process.exit(0)}let i;if(r===`production`)i=`https://api.stackone.com`;else if(r===`staging`)i=`https://api.stackone-dev.com`;else{let e=await(0,S.text)({message:`API URL`,placeholder:K,initialValue:K,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,S.isCancel)(e))return(0,S.cancel)(`Configuration profile initialization cancelled`),process.exit(0);i=e}let a=await(0,S.password)({message:`API Key`,validate:e=>{if(!e||e.trim().length===0)return`API Key is required`}});if((0,S.isCancel)(a))return(0,S.cancel)(`Configuration profile initialization cancelled`),process.exit(0);B(t,{label:t,environment:r,apiUrl:i,apiKey:a}),(0,S.outro)(`${n.default.green(`✔`)} Configuration profile ${e.g(t)} initialized successfully!`),process.exit(0)}catch(t){t?.isTtyError?e._.error(`Prompt couldn't be rendered in the current environment`):e._.error(`Failed to initialize configuration profile: ${t}`),process.exit(1)}}};const J=20,Y={pending:`○`,acceptRemote:`●`,acceptLocal:`◐`,acceptBoth:`◑`,current:`◉`,arrow:`→`,check:`✓`,cross:`✗`,warning:`⚠`};var X=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,T.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`
86
91
  `: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.d();let t=process.stdout.columns||80;this.renderHeader(t),this.renderProgressBar(t),this.renderCurrentConflict(t),this.renderControls(t)}renderHeader(t){let r=this.connectorId,i=`${this.localVersion} ${Y.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._.log(``),e._.log(n.default.bgBlue.white.bold(c)),e._.log(n.default.gray(this.centerText(r,t))),e._.log(n.default.gray(this.centerText(i,t))),e._.log(``)}renderProgressBar(t){let r=this.conflicts.filter(e=>e.conflict.type===`conflict`),i=this.getCurrentConflictIndex(),a=r.map((e,t)=>{let r=t===i,a,o;switch(e.choice){case`remote`:a=r?Y.current:Y.acceptRemote,o=n.default.green;break;case`local`:a=r?Y.current:Y.acceptLocal,o=n.default.yellow;break;case`both`:a=r?Y.current:Y.acceptBoth,o=n.default.cyan;break;default:a=r?Y.current:Y.pending,o=r?n.default.white:n.default.gray}return o(a)}),o=r.filter(e=>e.choice!==`pending`).length,s=` Conflict ${i+1} of ${this.totalConflicts} • ${o}/${this.totalConflicts} resolved `;e._.log(n.default.gray(this.centerText(s,t))),e._.log(this.centerText(a.join(` `),t)),e._.log(``)}renderCurrentConflict(t){let r=this.conflicts[this.currentIndex];if(!r||r.conflict.type!==`conflict`)return;let i=r.conflict;if(e._.log(n.default.gray(`_`.repeat(t))),e._.log(`
@@ -1,4 +1,4 @@
1
- import{_ as e,a as t,c as n,d as r,f as i,g as a,h as o,i as s,l as c,m as l,n as u,o as d,p as f,r as p,t as m,u as h,v as g}from"./agentConfig-BljaB-6S.mjs";import{n as _,r as v,t as ee}from"./setupMigration-9Qv_kZG0.mjs";import y from"chalk";import{Argument as b,Command as x}from"commander";import{AgentRuntime as S,builtinSkills as C,customSkills as te,initLangSmith as ne,loadBundledSkills as re,skillLoader as w}from"@stackone/agent-harness";import*as T from"node:fs";import{existsSync as E,mkdirSync as ie,readFileSync as ae,writeFileSync as oe}from"node:fs";import*as D from"node:os";import{homedir as se}from"node:os";import*as O from"node:path";import{join as k}from"node:path";import{Box as A,Text as j,render as M,useApp as ce,useInput as le}from"ink";import N,{useCallback as ue,useEffect as P,useRef as F,useState as I}from"react";import de from"ink-spinner";import L,{readFileSync as R,readdirSync as z,statSync as fe}from"fs";import B,{basename as V,dirname as pe,join as me,resolve as he}from"path";import{fileURLToPath as H}from"url";import{exec as U,execSync as ge}from"node:child_process";import{access as _e,readFile as ve,writeFile as W}from"node:fs/promises";import{promisify as G}from"node:util";import K from"ora";import{stdin as ye,stdout as q}from"node:process";import{createInterface as J}from"node:readline";import Y from"inquirer";import{isMissing as X,isObject as be,notMissing as Z,z as Q}from"@stackone/utils";import{cancel as xe,confirm as Se,intro as Ce,isCancel as we,outro as Te,password as Ee,select as De,text as Oe}from"@clack/prompts";import{loadConnector as ke,runAction as Ae,validateYamlConnector as je}from"@stackone/connect-sdk";import{diffLines as Me}from"diff";import{createInterface as Ne}from"readline";import{HttpClient as Pe}from"@stackone/transport";import Fe from"semver";import{readdir as Ie,stat as Le}from"fs/promises";function Re(e){return e.replace(/\*\*\*(.+?)\*\*\*/g,`$1`).replace(/\*\*(.+?)\*\*/g,`$1`).replace(/\*(.+?)\*/g,`$1`).replace(/__(.+?)__/g,`$1`).replace(/_(.+?)_/g,`$1`).replace(/^#{1,6}\s+(.+)$/gm,`$1`).replace(/```[\s\S]*?```/g,``).replace(/`(.+?)`/g,`$1`).replace(/\[([^\]]+)\]\([^\)]+\)/g,`$1`).replace(/!\[([^\]]*)\]\([^\)]+\)/g,`$1`).replace(/^[-*_]{3,}$/gm,``).replace(/^>\s+/gm,``).trim()}const ze=({title:e,mode:t,connector:n,action:r,onSubmit:i,onExit:a,onStop:o,messages:s,currentToolCalls:c=[],isThinking:l=!1,isComplete:u=!1,error:d,isInterrupted:f=!1,commandHistory:p=[],streamingText:m=``,usage:h,detailViewData:g=null,onCloseDetailView:_,onResumeConversation:v,onToggleSkill:ee,onRewindTo:y,spawnedSubagentActive:b=!1,spawnedSubagentName:x=`Subagent`,spawnedSubagentComplete:S=!1,queuedMessages:C=[],isProcessingQueue:te=!1,enabledSkills:ne=[],initInfo:re})=>{let{exit:w}=ce(),[T,E]=I(``),[ie,ae]=I(!0),oe=F(0),[D,se]=I(0),O=F(!1),[k,M]=I(!1),L=F(s),[R,z]=I(-1),fe=F(p),B=F(``),[V,pe]=I([]),[me,he]=I(0),[H,U]=I(0),[ge,_e]=I(!1),[ve,W]=I(!1),[G,K]=I(!1),[ye,q]=I(!1),J=[`/commands`,`/skills`,`/tools`,`/mcp`,`/compact`,`/rewind`,`/resume`,`/exit`];P(()=>{O.current=k},[k]),P(()=>{oe.current=D},[D]),P(()=>{L.current=s},[s]),P(()=>{fe.current=p},[p]),P(()=>{B.current=T,T.startsWith(`/`)?(pe(J.filter(e=>e.startsWith(T.toLowerCase()))),he(0)):(pe([]),he(0))},[T]),P(()=>{O.current||se(0)},[s]),le(ue((e,t)=>{let n=B.current,r=R;if(t.escape&&(l||m||c.length>0)){o?.(),E(``),z(-1);return}if(t.escape&&b&&G){K(!1);return}if(g){if(t.escape||t.ctrl&&e===`c`)if(ge){_e(!1);return}else{_?.(),U(0);return}if(t.upArrow&&!ge){U(e=>e>0?e-1:g.items.length-1);return}if(t.downArrow&&!ge){U(e=>e<g.items.length-1?e+1:0);return}if(t.ctrl&&e===`o`&&g.type===`skills`){let e=g.items[H];ee&&ee(e.name);return}if(t.return){if(ge)return;if(g.type===`resume`){let e=g.items[H];e.messages&&v&&(v(e.messages),_?.(),U(0));return}if(g.type===`rewind`){let e=g.items[H];e.index!==void 0&&y&&(y(e.index),_?.(),U(0));return}_e(!0);return}return}if(t.ctrl&&e===`o`){b?K(e=>!e):q(e=>!e);return}if(t.ctrl&&e===`c`)if(n.trim()){E(``),z(-1),W(!1);return}else if(ve){a(),w();return}else{W(!0);return}if(t.upArrow){if(V.length>0){he(e=>e>0?e-1:V.length-1);return}let e=fe.current;if(e.length>0&&(n===``||r>=0)){z(t=>{let n=t<0?e.length-1:Math.max(0,t-1);return E(e[n]||``),n});return}let t=Math.max(0,L.current.length-5),i=Math.min(oe.current+5,t);se(i),M(i>0);return}if(t.downArrow){if(V.length>0){he(e=>e<V.length-1?e+1:0);return}let e=fe.current;if(r>=0){z(t=>{let n=t>=e.length-1?-1:t+1;return E(n<0?``:e[n]||``),n});return}let t=Math.max(oe.current-5,0);se(t),M(t>0);return}if(t.return){if(V.length>0){let e=V[me];pe([]),he(0),E(``),i(e);return}T.trim()&&(i(T.trim()),E(``),z(-1),se(0),M(!1));return}if(t.backspace||t.delete){E(e=>e.slice(0,-1)),z(-1);return}if(t.tab&&n.startsWith(`/`)){let e=J.filter(e=>e.startsWith(T.toLowerCase()));e.length===1&&E(e[0]);return}e&&(E(t=>t+e),z(-1),W(!1))},[i,a,w,T,R,J,V,me,g,ge,_,ve,b,S,G,v,H])),P(()=>{u&&ae(!1)},[u]);let Y=`\x1B[38;2;0;175;102m`,X=`\x1B[0m`,be=`${Y} ╔═════════╗${X} ▄▖▗ ▌ ▄▖ ▄▖ ▗ ${Y}╔═════════╗${X}
1
+ import{_ as e,a as t,c as n,d as r,f as i,g as a,h as o,i as s,l as c,m as l,n as u,o as d,p as f,r as p,t as m,u as h,v as g}from"./agentConfig-BljaB-6S.mjs";import{n as _,r as v,t as ee}from"./setupMigration-DdeVl8db.mjs";import y from"chalk";import{Argument as b,Command as x}from"commander";import{AgentRuntime as S,builtinSkills as C,customSkills as te,initLangSmith as ne,loadBundledSkills as re,skillLoader as w}from"@stackone/agent-harness";import*as T from"node:fs";import{existsSync as E,mkdirSync as ie,readFileSync as ae,writeFileSync as oe}from"node:fs";import*as D from"node:os";import{homedir as se}from"node:os";import*as O from"node:path";import{join as k}from"node:path";import{Box as A,Text as j,render as M,useApp as ce,useInput as le}from"ink";import N,{useCallback as ue,useEffect as P,useRef as F,useState as I}from"react";import de from"ink-spinner";import L,{readFileSync as R,readdirSync as z,statSync as fe}from"fs";import B,{basename as V,dirname as pe,join as me,resolve as he}from"path";import{fileURLToPath as H}from"url";import{exec as U,execSync as ge}from"node:child_process";import{access as _e,readFile as ve,writeFile as W}from"node:fs/promises";import{promisify as G}from"node:util";import K from"ora";import{stdin as ye,stdout as q}from"node:process";import{createInterface as J}from"node:readline";import Y from"inquirer";import{isMissing as X,isObject as be,notMissing as Z,z as Q}from"@stackone/utils";import{cancel as xe,confirm as Se,intro as Ce,isCancel as we,outro as Te,password as Ee,select as De,text as Oe}from"@clack/prompts";import{loadConnector as ke,runAction as Ae,validateYamlConnector as je}from"@stackone/connect-sdk";import{diffLines as Me}from"diff";import{createInterface as Ne}from"readline";import{HttpClient as Pe}from"@stackone/transport";import Fe from"semver";import{readdir as Ie,stat as Le}from"fs/promises";function Re(e){return e.replace(/\*\*\*(.+?)\*\*\*/g,`$1`).replace(/\*\*(.+?)\*\*/g,`$1`).replace(/\*(.+?)\*/g,`$1`).replace(/__(.+?)__/g,`$1`).replace(/_(.+?)_/g,`$1`).replace(/^#{1,6}\s+(.+)$/gm,`$1`).replace(/```[\s\S]*?```/g,``).replace(/`(.+?)`/g,`$1`).replace(/\[([^\]]+)\]\([^\)]+\)/g,`$1`).replace(/!\[([^\]]*)\]\([^\)]+\)/g,`$1`).replace(/^[-*_]{3,}$/gm,``).replace(/^>\s+/gm,``).trim()}const ze=({title:e,mode:t,connector:n,action:r,onSubmit:i,onExit:a,onStop:o,messages:s,currentToolCalls:c=[],isThinking:l=!1,isComplete:u=!1,error:d,isInterrupted:f=!1,commandHistory:p=[],streamingText:m=``,usage:h,detailViewData:g=null,onCloseDetailView:_,onResumeConversation:v,onToggleSkill:ee,onRewindTo:y,spawnedSubagentActive:b=!1,spawnedSubagentName:x=`Subagent`,spawnedSubagentComplete:S=!1,queuedMessages:C=[],isProcessingQueue:te=!1,enabledSkills:ne=[],initInfo:re})=>{let{exit:w}=ce(),[T,E]=I(``),[ie,ae]=I(!0),oe=F(0),[D,se]=I(0),O=F(!1),[k,M]=I(!1),L=F(s),[R,z]=I(-1),fe=F(p),B=F(``),[V,pe]=I([]),[me,he]=I(0),[H,U]=I(0),[ge,_e]=I(!1),[ve,W]=I(!1),[G,K]=I(!1),[ye,q]=I(!1),J=[`/commands`,`/skills`,`/tools`,`/mcp`,`/compact`,`/rewind`,`/resume`,`/exit`];P(()=>{O.current=k},[k]),P(()=>{oe.current=D},[D]),P(()=>{L.current=s},[s]),P(()=>{fe.current=p},[p]),P(()=>{B.current=T,T.startsWith(`/`)?(pe(J.filter(e=>e.startsWith(T.toLowerCase()))),he(0)):(pe([]),he(0))},[T]),P(()=>{O.current||se(0)},[s]),le(ue((e,t)=>{let n=B.current,r=R;if(t.escape&&(l||m||c.length>0)){o?.(),E(``),z(-1);return}if(t.escape&&b&&G){K(!1);return}if(g){if(t.escape||t.ctrl&&e===`c`)if(ge){_e(!1);return}else{_?.(),U(0);return}if(t.upArrow&&!ge){U(e=>e>0?e-1:g.items.length-1);return}if(t.downArrow&&!ge){U(e=>e<g.items.length-1?e+1:0);return}if(t.ctrl&&e===`o`&&g.type===`skills`){let e=g.items[H];ee&&ee(e.name);return}if(t.return){if(ge)return;if(g.type===`resume`){let e=g.items[H];e.messages&&v&&(v(e.messages),_?.(),U(0));return}if(g.type===`rewind`){let e=g.items[H];e.index!==void 0&&y&&(y(e.index),_?.(),U(0));return}_e(!0);return}return}if(t.ctrl&&e===`o`){b?K(e=>!e):q(e=>!e);return}if(t.ctrl&&e===`c`)if(n.trim()){E(``),z(-1),W(!1);return}else if(ve){a(),w();return}else{W(!0);return}if(t.upArrow){if(V.length>0){he(e=>e>0?e-1:V.length-1);return}let e=fe.current;if(e.length>0&&(n===``||r>=0)){z(t=>{let n=t<0?e.length-1:Math.max(0,t-1);return E(e[n]||``),n});return}let t=Math.max(0,L.current.length-5),i=Math.min(oe.current+5,t);se(i),M(i>0);return}if(t.downArrow){if(V.length>0){he(e=>e<V.length-1?e+1:0);return}let e=fe.current;if(r>=0){z(t=>{let n=t>=e.length-1?-1:t+1;return E(n<0?``:e[n]||``),n});return}let t=Math.max(oe.current-5,0);se(t),M(t>0);return}if(t.return){if(V.length>0){let e=V[me];pe([]),he(0),E(``),i(e);return}T.trim()&&(i(T.trim()),E(``),z(-1),se(0),M(!1));return}if(t.backspace||t.delete){E(e=>e.slice(0,-1)),z(-1);return}if(t.tab&&n.startsWith(`/`)){let e=J.filter(e=>e.startsWith(T.toLowerCase()));e.length===1&&E(e[0]);return}e&&(E(t=>t+e),z(-1),W(!1))},[i,a,w,T,R,J,V,me,g,ge,_,ve,b,S,G,v,H])),P(()=>{u&&ae(!1)},[u]);let Y=`\x1B[38;2;0;175;102m`,X=`\x1B[0m`,be=`${Y} ╔═════════╗${X} ▄▖▗ ▌ ▄▖ ▄▖ ▗ ${Y}╔═════════╗${X}
2
2
  ${Y} ║ ┌────╚════╗${X} ▚ ▜▘▀▌▛▘▙▘▌▌▛▌█▌ ▌▌▛▌█▌▛▌▜▘ ${Y}║ ┌────╚════╗${X}
3
3
  ${Y} ╚════╗────┘ ║${X} ▄▌▐▖█▌▙▖▛▖▙▌▌▌▙▖ ▛▌▙▌▙▖▌▌▐▖ ${Y}╚════╗────┘ ║${X}
4
4
  ${Y} ╚═════════╝${X} ▄▌ ${Y}╚═════════╝${X}`;return N.createElement(A,{flexDirection:`column`,padding:2},N.createElement(A,{flexDirection:`column`,marginBottom:2,marginTop:1},N.createElement(j,null,be,`
@@ -59,15 +59,20 @@ Original error: ${n}`):n.includes(`API key`)||n.includes(`Invalid API Key`)?(e.e
59
59
 
60
60
  `);return _e(!1),W(!1),q([]),J.current&&=(clearTimeout(J.current),null),setTimeout(()=>{Z(n,!0)},100),[]})},Se=ue(e=>{ie(t=>t.includes(e)?t.filter(t=>t!==e):t.length>=8?t:[...t,e])},[]);P(()=>{L?.type===`skills`&&ae.length>0&&R({type:`skills`,items:ae.map(e=>({name:e.name,description:e.description,version:e.version,author:e.author,tags:e.tags,enabled:E.includes(e.name)}))})},[E,ae,L?.type]);let Ce=()=>{},we=ue(()=>{K.current.shouldStop=!0,p(!1),W(!1),G.current=!1,j(``),d(new Map),q([]),U([]),_e(!1),l(e=>e.length>0&&e[e.length-1].role===`user`?e.slice(0,-1):e),_(!0)},[]);return v?N.createElement(ze,{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:Ce,onStop:we}):N.createElement(ze,{title:`Agent ${t.charAt(0).toUpperCase()+t.slice(1)} Mode`,mode:t,connector:n,action:r,messages:c,currentToolCalls:Array.from(u.values()),isThinking:f,isComplete:!1,error:m,isInterrupted:g,onSubmit:Z,onExit:Ce,onStop:we,commandHistory:se,streamingText:A,usage:M,detailViewData:L,onCloseDetailView:()=>R(null),onToggleSkill:Se,onRewindTo:e=>{try{let t=O.join(D.homedir(),`.stackone`,`agent_history`),n=T.readFileSync(t,`utf-8`).split(`
61
61
  `).filter(e=>e.trim()),r=n.slice(0,e+1);T.writeFileSync(t,r.join(`
62
- `),`utf-8`);let i={role:`system`,content:`⏮️ Rewound to command: "${n[e]}"`,timestamp:new Date};l(e=>[...e,i])}catch(e){let t={role:`system`,content:`❌ Error rewinding: ${e instanceof Error?e.message:String(e)}`,timestamp:new Date};l(e=>[...e,t])}},onResumeConversation:e=>{l(e.map(e=>({...e,timestamp:new Date(e.timestamp)})))},spawnedSubagentActive:z,spawnedSubagentName:V,spawnedSubagentComplete:me,queuedMessages:H,isProcessingQueue:ge,enabledSkills:E,initInfo:Y})};var Ue=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}=await import(`./agentApiKey-BnZKWL8z.mjs`),{hasOldSetupFiles:r,migrateFromLocalSetup:i,displayMigrationMessage:a}=await import(`./setupMigration-fBm8uSyK.mjs`);try{let o=process.cwd();r(o)&&a(await i(o));let s=n(),c=O.join(D.homedir(),`.stackone`,`trusted_directories`),l=[];try{T.existsSync(c)&&(l=T.readFileSync(c,`utf-8`).split(`
62
+ `),`utf-8`);let i={role:`system`,content:`⏮️ Rewound to command: "${n[e]}"`,timestamp:new Date};l(e=>[...e,i])}catch(e){let t={role:`system`,content:`❌ Error rewinding: ${e instanceof Error?e.message:String(e)}`,timestamp:new Date};l(e=>[...e,t])}},onResumeConversation:e=>{l(e.map(e=>({...e,timestamp:new Date(e.timestamp)})))},spawnedSubagentActive:z,spawnedSubagentName:V,spawnedSubagentComplete:me,queuedMessages:H,isProcessingQueue:ge,enabledSkills:E,initInfo:Y})};var Ue=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}=await import(`./agentApiKey-BEwv4ueA.mjs`),{hasOldSetupFiles:r,migrateFromLocalSetup:i,displayMigrationMessage:a}=await import(`./setupMigration-DWVcBa3h.mjs`);try{let o=process.cwd();r(o)&&a(await i(o));let s=n();process.env.STACKONE_AGENT_TOKEN||(process.env.STACKONE_AGENT_TOKEN=s);let c=O.join(D.homedir(),`.stackone`,`trusted_directories`),l=[];try{T.existsSync(c)&&(l=T.readFileSync(c,`utf-8`).split(`
63
63
  `).filter(e=>e.trim()))}catch(t){e.error(`[Trust] Failed to load trusted directories:`,t)}if(!l.includes(o)){let t=!1,{waitUntilExit:n}=M(N.createElement(Be,{directory:o,onConfirm:()=>{t=!0;try{let e=O.dirname(c);T.existsSync(e)||T.mkdirSync(e,{recursive:!0}),l.push(o),T.writeFileSync(c,l.join(`
64
64
  `),`utf-8`)}catch(t){e.error(`[Trust] Failed to save trusted directory:`,t)}},onCancel:()=>{t=!1}}));await n(),t||(e.log(`
65
65
  Exiting...`),process.exit(0)),process.stdout.write(`\x1Bc`)}M(N.createElement(He,{...t,apiKey:s}))}catch(t){let n=t instanceof Error?t.message:String(t);n.includes(`STACKONE_AGENT_TOKEN`)?(e.error(`
66
66
  ❌ Authentication Required
67
- `),e.log(`The StackOne Agent requires authentication via the StackOne proxy.`),e.log(`
68
- Please run:
69
- `),e.log(` stackone agent setup
70
- `),e.log(`This will authenticate you and configure access to Claude and LangSmith.`)):e.error(`ERROR:`,n),process.exit(1)}}};const We=G(U);async function Ge(e){try{let t=await ve(e,`utf-8`),n=JSON.parse(t),r=!1;if(n.mcpServers&&typeof n.mcpServers==`object`){for(let[e,t]of Object.entries(n.mcpServers))if(t&&typeof t==`object`&&`transport`in t){let e=t.transport;if(e&&typeof e==`object`&&`headers`in e){let t=e.headers;if(t&&typeof t==`object`&&`Authorization`in t){let e=t.Authorization;typeof e==`string`&&e.startsWith(`Bearer `)&&!e.includes("${")&&(t.Authorization="Bearer ${STACKONE_AGENT_TOKEN}",r=!0)}}}}return r&&await W(e,JSON.stringify(n,null,2)),r}catch{return!1}}var Ke=class{async execute(){e.log(y.blue.bold(`🧹 StackOne Agent Cleanup
67
+ `),e.log(y.white(`You need to authenticate before using the agent.
68
+ `)),e.log(y.white(`To get started, run:
69
+ `)),e.log(y.cyan(` stackone agent setup
70
+ `)),e.log(y.dim(`This will:`)),e.log(y.dim(` • Authenticate with your StackOne credentials`)),e.log(y.dim(` Save your token securely to ~/.stackone/agent-config.json`)),e.log(y.dim(` Enable access to Claude AI and MCP tools
71
+ `)),e.log(y.white(`If you already ran setup, your local configuration may be missing or unreadable.`)),e.log(y.white(`Run setup again to create or repair your authentication configuration.
72
+ `))):(e.error(`
73
+ ❌ Error:`,n),e.log(y.dim(`
74
+ If you continue to see this error, try running:`)),e.log(y.cyan(` stackone agent setup
75
+ `))),process.exit(1)}}};const We=G(U);async function Ge(e){try{let t=await ve(e,`utf-8`),n=JSON.parse(t),r=!1;if(n.mcpServers&&typeof n.mcpServers==`object`){for(let[e,t]of Object.entries(n.mcpServers))if(t&&typeof t==`object`&&`transport`in t){let e=t.transport;if(e&&typeof e==`object`&&`headers`in e){let t=e.headers;if(t&&typeof t==`object`&&`Authorization`in t){let e=t.Authorization;typeof e==`string`&&e.startsWith(`Bearer `)&&!e.includes("${")&&(t.Authorization="Bearer ${STACKONE_AGENT_TOKEN}",r=!0)}}}}return r&&await W(e,JSON.stringify(n,null,2)),r}catch{return!1}}var Ke=class{async execute(){e.log(y.blue.bold(`🧹 StackOne Agent Cleanup
71
76
  `));let t={configsCleaned:0};try{let n=K(`Removing stored configuration...`).start();await m(),n.succeed(`Removed ~/.stackone/agent-config.json`);let r=K(`Removing MCP servers from Claude...`).start(),i=0;try{await We(`claude mcp remove ${p()} 2>/dev/null`),i++}catch{}try{await We(`claude mcp remove ${s()} 2>/dev/null`),i++}catch{}i>0?r.succeed(`Removed ${i} MCP server(s) from Claude`):r.warn(`No MCP servers found in Claude (already removed or not configured)`);let a=K(`Checking for .mcp.json file...`).start(),o=k(process.cwd(),`.mcp.json`);try{await Ge(o)?(t.configsCleaned=1,a.succeed(`Cleaned .mcp.json (replaced tokens with environment variables)`)):a.info(`.mcp.json already uses environment variables or not found`)}catch{a.info(`.mcp.json not found (already cleaned or not created)`)}e.success(`Cleanup complete!`),e.log(y.white(`
72
77
  What was removed:`)),e.log(y.cyan(` • ~/.stackone/agent-config.json`)),e.log(y.cyan(` • MCP server from Claude configuration`)),t.configsCleaned>0&&e.log(y.cyan(` • Hardcoded credentials from .mcp.json`)),e.log(y.dim(`
73
78
  To authenticate again:`)),e.log(y.cyan(` stackone agent setup --global`),y.dim(`(for global setup)`)),e.log(y.cyan(` stackone agent setup --local`),y.dim(`(for local project setup)`)),e.log(``),process.exit(0)}catch(t){t instanceof Error?e.error(t.message):e.error(`Unknown error occurred`),process.exit(1)}}};const qe=new class{constructor(e){this.baseUrl=e||process.env.AUTH_SERVER_URL||`https://idp-api.stackone.com`}async login(e,t){try{let n=`${this.baseUrl}/auth/sign-in/mcp`,r=await fetch(n,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({email:e,password:t})});if(!r.ok){let e=await r.text(),t={};try{t=JSON.parse(e)}catch{}return{success:!1,error:t.error||`HTTP ${r.status}: ${r.statusText}`}}let i=await r.text(),a=JSON.parse(i);return a.apiKey?{success:!0,apiKey:a.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=`${this.baseUrl}/api-key/verify`,n=await fetch(t,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({key:e})});if(!n.ok){let e=await n.text(),t={};try{t=JSON.parse(e)}catch{}return{valid:!1,error:t.error||`HTTP ${n.status}: ${n.statusText}`}}let r=await n.text();return JSON.parse(r)}catch(e){return{valid:!1,error:e instanceof Error?e.message:`Network error occurred`}}}},Je=G(U);function Ye(e){let t=new Date(e),n=new Date,r=t.getTime()-n.getTime(),i=Math.floor(r/(3600*1e3)),a=t.toLocaleTimeString(`en-US`,{hour:`numeric`,minute:`2-digit`,hour12:!0});return`${t.toDateString()===n.toDateString()?`Today`:t.toDateString()===new Date(n.getTime()+864e5).toDateString()?`Tomorrow`:t.toLocaleDateString(`en-US`,{month:`short`,day:`numeric`})} at ${a} (${i} hours from now)`}var Xe=class{async execute(){e.log(y.blue.bold(`🤖 StackOne Agent Setup - Global Configuration
@@ -80,7 +85,7 @@ To setup for a specific project, run:`),y.cyan(`stackone agent setup --local`)),
80
85
  `));try{let r=process.cwd();_(r)&&ee(await v(r));let i=await d();if(!i||!t(i)){e.warn(`Not authenticated globally.`),e.log(y.white(`Let's authenticate now...
81
86
  `));let t=J({input:ye,output:q}),r=await new Promise(e=>{t.question(y.white(`Email: `),t=>{e(t.trim())})});t.close(),r||(e.error(`Email is required`),process.exit(1));let a=await Y.prompt([{type:`password`,name:`password`,message:`Password:`,mask:`*`}]);a.password||(e.error(`Password is required`),process.exit(1)),e.log(``);let o=K(`Authenticating...`).start(),s=await qe.login(r,a.password);(!s.success||!s.apiKey)&&(o.fail(`Authentication failed`),e.error(`${s.error||`Invalid credentials`}`),e.log(y.dim(`Please check your email and password and try again.
82
87
  `)),process.exit(1)),o.succeed(`Login successful!`);let c=new Date(Date.now()+1440*60*1e3).toISOString();await n({apiKey:s.apiKey,userId:r,email:r,expiresAt:c,serverUrl:u()}),i={apiKey:s.apiKey,userId:r,email:r,expiresAt:c,serverUrl:u()},e.log(``)}e.success(`Setup complete!`),e.log(y.white(`
83
- Token saved to:`)),e.log(y.cyan(` ~/.stackone/agent.json`)),e.log(``),process.exit(0)}catch(t){t instanceof Error?e.error(t.message):e.error(`Unknown error occurred`),process.exit(1)}}};const Qe={profiles:{}},$e=()=>{let e=c.readConfigFile(h);if(!e)return Qe;try{return JSON.parse(e)}catch{return Qe}},et=e=>$e().profiles[e],tt=e=>!!$e().profiles[e],nt=(e,t)=>{let n=$e();n.profiles[e]=t,c.writeConfigFile(h,JSON.stringify(n,null,2))},rt=()=>{let e=$e();return Object.keys(e.profiles)},it=`https://api.stackone.com`;var at=class{async execute({profile:t,connector:n,apiUrl:r,apiKey:i}={}){if(!t&&!i&&(e.error(`Profile or API key is required`),e.log(`Please provide a profile using the ${a(`--profile`)} option or an API key using the ${a(`--api-key`)} option.`),e.log(`To create a profile, run ${a(`stackone init`)}.`),process.exit(1)),t&&i&&(e.error(`Please provide either a profile or an API key, not both`),process.exit(1)),t&&r&&e.warn(`Specifying ${a(`--api-url`)} with a profile won't have any effect. Using API url from profile.`),t&&!tt(t)){e.error(`Configuration profile ${a(t)} not found`),e.log(`Run ${a(`stackone init`)} to create a new configuration profile.\n`);let n=rt();n.length>0&&(e.info(`Available configuration profiles:`),n.forEach(t=>{e.log(` - ${y.blue(t)}`)})),process.exit(1)}let s=t?et(t):{apiUrl:r??it,apiKey:i};s?.apiKey||(e.error(`API key is missing`),e.log(`Please provide a valid API key in the profile or via the ${a(`--api-key`)} option.`),process.exit(1)),n||(e.error(`Connector identifier is required in the format provider_key@version.`),process.exit(1));let c=n.split(`@`);(c.length!==2||!c[0]||!c[1])&&(e.error(`Invalid connector format ${o(n)}. Expected format: ${a(`provider_key@version`)}`),process.exit(1));let l=s.apiUrl??it,u=await this.dropConnector(n,l,s.apiKey);process.exit(u?0:1)}async dropConnector(t,n,r){let i=K(`🗑️ Dropping connector ${a(t)}...`).start();try{let o=Buffer.from(r).toString(`base64`),s=await fetch(`${n}/registry/connectors/${t}`,{method:`DELETE`,headers:{Authorization:`Basic ${o}`}});return i.stop(),s.status===204?(e.success(`Successfully dropped connector ${a(t)} from the registry`),!0):s.status===404?(e.error(`Connector ${a(t)} not found in the registry`),!1):s.status===401||s.status===403?(e.error(`You do not have permission to drop this connector`),!1):s.status===409?(e.error(`Connector ${a(t)} has associated configs and cannot be dropped`),e.log(`Please delete all associated integration configurations before dropping the connector.`),!1):(s.ok||await l(s,`Failed to drop connector ${a(t)} from the registry`),!1)}catch(r){return i.stop(),e.error(`Failed to drop connector ${a(t)} from registry: ${r.message}`),e.log(`Please ensure that the API at ${g(n)} is reachable and the API key is valid`),!1}}};const ot=`https://api.stackone.com`;var st=class{async execute({profile:t,connector:n,accountId:r,format:i,outputFile:s,apiUrl:c,apiKey:l}={}){if(!t&&!l&&(e.error(`Profile or API key is required`),e.log(`Please provide a profile using the ${a(`--profile`)} option or an API key using the ${a(`--api-key`)} option.`),e.log(`To create a profile, run ${a(`stackone init`)}.`),process.exit(1)),t&&l&&(e.error(`Please provide either a profile or an API key, not both`),process.exit(1)),t&&c&&e.warn(`Specifying ${a(`--api-url`)} with a profile won't have any effect. Using API url from profile.`),t&&!tt(t)){e.error(`Configuration profile ${a(t)} not found`),e.log(`Run ${a(`stackone init`)} to create a new configuration profile.\n`);let n=rt();n.length>0&&(e.info(`Available configuration profiles:`),n.forEach(t=>{e.log(` - ${y.blue(t)}`)})),process.exit(1)}let u=t?et(t):{apiUrl:c??ot,apiKey:l};u?.apiKey||(e.error(`API key is missing`),e.log(`Please provide a valid API key in the profile or via the ${a(`--api-key`)} option.`),process.exit(1)),X(n)&&X(r)&&(e.error(`Either ${a(`--connector`)} or ${a(`--account-id`)} must be provided`),process.exit(1)),Z(n)&&Z(r)&&(e.error(`Please provide either ${a(`--connector`)} or ${a(`--account-id`)}, not both.`),process.exit(1)),Z(i)&&i!==`yaml`&&i!==`json`&&(e.error(`Format must be either ${a(`yaml`)} or ${a(`json`)}.`),process.exit(1));let d=u.apiUrl??ot,p;if(Z(n)){this.#t(n)||(e.error(`Invalid connector format ${o(n)}. Expected format: ${a(`provider_key@version`)} or ${a(`provider_key`)}`),process.exit(1));let t=this.#n(n);p=await this.#r(t,d,u.apiKey,i)}else Z(r)?p=await this.#i(r,d,u.apiKey,i):(e.error(`Either ${a(`--connector`)} or ${a(`--account-id`)} must be provided`),process.exit(1));if(Z(s))try{L.writeFileSync(s,p,`utf-8`),e.success(`Connector written to file: ${a(s)}`)}catch(t){e.error(`Failed to write connector to file ${a(s)}: ${t.message}`),process.exit(1)}else if(e.log(`\n${y.blue.inverse(` CONNECTOR CONTENT `)}\n`),!i||i===`yaml`)e.log(this.#e(p));else if(i===`json`)try{f(JSON.parse(p))}catch{e.log(p)}else e.log(p);process.exit(0)}#e(e){return e.split(`
88
+ Token saved to:`)),e.log(y.cyan(` ~/.stackone/agent-config.json`)),e.log(``),process.exit(0)}catch(t){t instanceof Error?e.error(t.message):e.error(`Unknown error occurred`),process.exit(1)}}};const Qe={profiles:{}},$e=()=>{let e=c.readConfigFile(h);if(!e)return Qe;try{return JSON.parse(e)}catch{return Qe}},et=e=>$e().profiles[e],tt=e=>!!$e().profiles[e],nt=(e,t)=>{let n=$e();n.profiles[e]=t,c.writeConfigFile(h,JSON.stringify(n,null,2))},rt=()=>{let e=$e();return Object.keys(e.profiles)},it=`https://api.stackone.com`;var at=class{async execute({profile:t,connector:n,apiUrl:r,apiKey:i}={}){if(!t&&!i&&(e.error(`Profile or API key is required`),e.log(`Please provide a profile using the ${a(`--profile`)} option or an API key using the ${a(`--api-key`)} option.`),e.log(`To create a profile, run ${a(`stackone init`)}.`),process.exit(1)),t&&i&&(e.error(`Please provide either a profile or an API key, not both`),process.exit(1)),t&&r&&e.warn(`Specifying ${a(`--api-url`)} with a profile won't have any effect. Using API url from profile.`),t&&!tt(t)){e.error(`Configuration profile ${a(t)} not found`),e.log(`Run ${a(`stackone init`)} to create a new configuration profile.\n`);let n=rt();n.length>0&&(e.info(`Available configuration profiles:`),n.forEach(t=>{e.log(` - ${y.blue(t)}`)})),process.exit(1)}let s=t?et(t):{apiUrl:r??it,apiKey:i};s?.apiKey||(e.error(`API key is missing`),e.log(`Please provide a valid API key in the profile or via the ${a(`--api-key`)} option.`),process.exit(1)),n||(e.error(`Connector identifier is required in the format provider_key@version.`),process.exit(1));let c=n.split(`@`);(c.length!==2||!c[0]||!c[1])&&(e.error(`Invalid connector format ${o(n)}. Expected format: ${a(`provider_key@version`)}`),process.exit(1));let l=s.apiUrl??it,u=await this.dropConnector(n,l,s.apiKey);process.exit(u?0:1)}async dropConnector(t,n,r){let i=K(`🗑️ Dropping connector ${a(t)}...`).start();try{let o=Buffer.from(r).toString(`base64`),s=await fetch(`${n}/registry/connectors/${t}`,{method:`DELETE`,headers:{Authorization:`Basic ${o}`}});return i.stop(),s.status===204?(e.success(`Successfully dropped connector ${a(t)} from the registry`),!0):s.status===404?(e.error(`Connector ${a(t)} not found in the registry`),!1):s.status===401||s.status===403?(e.error(`You do not have permission to drop this connector`),!1):s.status===409?(e.error(`Connector ${a(t)} has associated configs and cannot be dropped`),e.log(`Please delete all associated integration configurations before dropping the connector.`),!1):(s.ok||await l(s,`Failed to drop connector ${a(t)} from the registry`),!1)}catch(r){return i.stop(),e.error(`Failed to drop connector ${a(t)} from registry: ${r.message}`),e.log(`Please ensure that the API at ${g(n)} is reachable and the API key is valid`),!1}}};const ot=`https://api.stackone.com`;var st=class{async execute({profile:t,connector:n,accountId:r,format:i,outputFile:s,apiUrl:c,apiKey:l}={}){if(!t&&!l&&(e.error(`Profile or API key is required`),e.log(`Please provide a profile using the ${a(`--profile`)} option or an API key using the ${a(`--api-key`)} option.`),e.log(`To create a profile, run ${a(`stackone init`)}.`),process.exit(1)),t&&l&&(e.error(`Please provide either a profile or an API key, not both`),process.exit(1)),t&&c&&e.warn(`Specifying ${a(`--api-url`)} with a profile won't have any effect. Using API url from profile.`),t&&!tt(t)){e.error(`Configuration profile ${a(t)} not found`),e.log(`Run ${a(`stackone init`)} to create a new configuration profile.\n`);let n=rt();n.length>0&&(e.info(`Available configuration profiles:`),n.forEach(t=>{e.log(` - ${y.blue(t)}`)})),process.exit(1)}let u=t?et(t):{apiUrl:c??ot,apiKey:l};u?.apiKey||(e.error(`API key is missing`),e.log(`Please provide a valid API key in the profile or via the ${a(`--api-key`)} option.`),process.exit(1)),X(n)&&X(r)&&(e.error(`Either ${a(`--connector`)} or ${a(`--account-id`)} must be provided`),process.exit(1)),Z(n)&&Z(r)&&(e.error(`Please provide either ${a(`--connector`)} or ${a(`--account-id`)}, not both.`),process.exit(1)),Z(i)&&i!==`yaml`&&i!==`json`&&(e.error(`Format must be either ${a(`yaml`)} or ${a(`json`)}.`),process.exit(1));let d=u.apiUrl??ot,p;if(Z(n)){this.#t(n)||(e.error(`Invalid connector format ${o(n)}. Expected format: ${a(`provider_key@version`)} or ${a(`provider_key`)}`),process.exit(1));let t=this.#n(n);p=await this.#r(t,d,u.apiKey,i)}else Z(r)?p=await this.#i(r,d,u.apiKey,i):(e.error(`Either ${a(`--connector`)} or ${a(`--account-id`)} must be provided`),process.exit(1));if(Z(s))try{L.writeFileSync(s,p,`utf-8`),e.success(`Connector written to file: ${a(s)}`)}catch(t){e.error(`Failed to write connector to file ${a(s)}: ${t.message}`),process.exit(1)}else if(e.log(`\n${y.blue.inverse(` CONNECTOR CONTENT `)}\n`),!i||i===`yaml`)e.log(this.#e(p));else if(i===`json`)try{f(JSON.parse(p))}catch{e.log(p)}else e.log(p);process.exit(0)}#e(e){return e.split(`
84
89
  `).map(e=>{if(e.trim().startsWith(`#`))return y.gray(e);if(e.includes(`:`)){let t=e.indexOf(`:`),n=e.substring(0,t+1),r=e.substring(t+1),i=r,a=r.trim();return a===`true`||a===`false`?i=r.replace(a,y.cyan(a)):a===`null`||a===`~`?i=r.replace(a,y.gray(a)):/^-?\d+(\.\d+)?$/.test(a)?i=r.replace(a,y.green(a)):(a.startsWith(`"`)&&a.endsWith(`"`)||a.startsWith(`'`)&&a.endsWith(`'`)||a&&!a.startsWith(`-`))&&(i=r.replace(a,y.yellow(a))),y.red(n)+i}return e.trim().startsWith(`-`)?e.replace(`-`,y.gray(`-`)):e}).join(`
85
90
  `)}#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){let o=K(`Getting connector ${a(t)} from registry...`).start();try{let e=Buffer.from(r).toString(`base64`),s=i?`?format=${i}`:``,c=await fetch(`${n}/registry/connectors/${t}${s}`,{method:`GET`,headers:{Authorization:`Basic ${e}`}});return o.stop(),c.ok||(await l(c,`Failed to get connector ${a(t)} from the registry`),process.exit(1)),await c.text()}catch(r){o.stop(),e.error(`Failed to get connector ${a(t)} from the registry: ${r.message}`),e.log(`Please ensure that the API at ${g(n)} is reachable and the API key is valid`),process.exit(1)}}async#i(t,n,r,i){let o=K(`Getting connector from account ${a(t)}...`).start();try{let e=Buffer.from(r).toString(`base64`),s=i?`?format=${i}`:``,c=await fetch(`${n}/accounts/${t}/connector${s}`,{method:`GET`,headers:{Authorization:`Basic ${e}`}});return o.stop(),c.ok||(await l(c,`Failed to get connector from account ${a(t)}`),process.exit(1)),await c.text()}catch(r){o.stop(),e.error(`Failed to get connector from account ${a(t)}: ${r.message}`),e.log(`Please ensure that the API at ${g(n)} is reachable and the API key is valid`),process.exit(1)}}};const ct=`http://localhost:4000`;var lt=class{async execute({environment:t}={}){let n=t?.toLowerCase()??`production`;try{Ce(`${y.inverse(` Initialize profile `)}`);let e=await Oe({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(we(e))return xe(`Configuration profile initialization cancelled`),process.exit(0);if(tt(e)){let t=await Se({message:`Configuration profile with name ${a(e)} already exists. Do you want to overwrite it?`});if(we(t)||!t)return xe(`Configuration profile initialization cancelled`),process.exit(0)}let t;if(n===`production`)t=`https://api.stackone.com`;else if(n===`staging`)t=`https://api.stackone-dev.com`;else{let e=await Oe({message:`API URL`,placeholder:ct,initialValue:ct,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(we(e))return xe(`Configuration profile initialization cancelled`),process.exit(0);t=e}let r=await Ee({message:`API Key`,validate:e=>{if(!e||e.trim().length===0)return`API Key is required`}});if(we(r))return xe(`Configuration profile initialization cancelled`),process.exit(0);nt(e,{label:e,environment:n,apiUrl:t,apiKey:r}),Te(`${y.green(`✔`)} Configuration profile ${a(e)} initialized successfully!`),process.exit(0)}catch(t){t?.isTtyError?e.error(`Prompt couldn't be rendered in the current environment`):e.error(`Failed to initialize configuration profile: ${t}`),process.exit(1)}}};const $={pending:`○`,acceptRemote:`●`,acceptLocal:`◐`,acceptBoth:`◑`,current:`◉`,arrow:`→`,check:`✓`,cross:`✗`,warning:`⚠`};var ut=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=Ne({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`
86
91
  `: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(){r();let e=process.stdout.columns||80;this.renderHeader(e),this.renderProgressBar(e),this.renderCurrentConflict(e),this.renderControls(e)}renderHeader(t){let n=this.connectorId,r=`${this.localVersion} ${$.arrow} ${this.remoteVersion}`,i=Math.max(0,t-17),a=Math.floor(i/2),o=i-a,s=` `.repeat(a)+`CONFLICT RESOLVER`+` `.repeat(o);e.log(``),e.log(y.bgBlue.white.bold(s)),e.log(y.gray(this.centerText(n,t))),e.log(y.gray(this.centerText(r,t))),e.log(``)}renderProgressBar(t){let n=this.conflicts.filter(e=>e.conflict.type===`conflict`),r=this.getCurrentConflictIndex(),i=n.map((e,t)=>{let n=t===r,i,a;switch(e.choice){case`remote`:i=n?$.current:$.acceptRemote,a=y.green;break;case`local`:i=n?$.current:$.acceptLocal,a=y.yellow;break;case`both`:i=n?$.current:$.acceptBoth,a=y.cyan;break;default:i=n?$.current:$.pending,a=n?y.white:y.gray}return a(i)}),a=n.filter(e=>e.choice!==`pending`).length,o=` Conflict ${r+1} of ${this.totalConflicts} • ${a}/${this.totalConflicts} resolved `;e.log(y.gray(this.centerText(o,t))),e.log(this.centerText(i.join(` `),t)),e.log(``)}renderCurrentConflict(t){let n=this.conflicts[this.currentIndex];if(!n||n.conflict.type!==`conflict`)return;let r=n.conflict;if(e.log(y.gray(`_`.repeat(t))),e.log(`
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- require(`./agentConfig-CgKwpn5X.cjs`);const e=require(`./cliCore-CxO1oXkm.cjs`);require(`./setupMigration-CGWweyuQ.cjs`),exports.CLI=e.t;
1
+ require(`./agentConfig-CgKwpn5X.cjs`);const e=require(`./cliCore-WYgOmkUG.cjs`);require(`./setupMigration-DAlx4sxl.cjs`),exports.CLI=e.t;
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import"./agentConfig-BljaB-6S.mjs";import{t as e}from"./cliCore-FXxtH79f.mjs";import"./setupMigration-9Qv_kZG0.mjs";export{e as CLI};
1
+ import"./agentConfig-BljaB-6S.mjs";import{t as e}from"./cliCore-WsNlChLZ.mjs";import"./setupMigration-DdeVl8db.mjs";export{e as CLI};
@@ -1 +1 @@
1
- const e=require(`./agentConfig-CgKwpn5X.cjs`);let t=require(`chalk`);t=e.y(t);let n=require(`node:fs`),r=require(`node:fs/promises`);function i(e){return[`${e}/.env`,`${e}/CLAUDE.md`,`${e}/.mcp.json`].some(e=>(0,n.existsSync)(e))}async function a(t){let i={migrated:!1,filesRemoved:[],tokenMigrated:!1},a=`${t}/.env`,o=`${t}/CLAUDE.md`,s=`${t}/.mcp.json`;if((0,n.existsSync)(a))try{let t=(await(0,r.readFile)(a,`utf-8`)).match(/STACKONE_AGENT_TOKEN=(.+)/);if(t&&t[1]){let n=t[1].trim(),r=await e.o();(!r||!r.apiKey)&&(await e.c({apiKey:n,userId:`migrated-user`,email:`migrated-user`,expiresAt:new Date(Date.now()+1440*60*1e3).toISOString(),serverUrl:process.env.STACKONE_AGENT_SERVER_URL||`https://mcp-internal-falcon.stackonehq.workers.dev/mcp`}),i.tokenMigrated=!0)}}catch(t){e._.warn(`Failed to read .env file: ${t instanceof Error?t.message:String(t)}`)}let c=[{path:a,name:`.env`},{path:o,name:`CLAUDE.md`},{path:s,name:`.mcp.json`}];for(let t of c)if((0,n.existsSync)(t.path))try{(0,n.unlinkSync)(t.path),i.filesRemoved.push(t.name)}catch(n){e._.warn(`Failed to remove ${t.name}: ${n instanceof Error?n.message:String(n)}`)}return i.migrated=i.filesRemoved.length>0||i.tokenMigrated,i}function o(n){n.migrated&&(e._.log(``),e._.log(t.default.blue.bold(`🔄 Migration Complete`)),e._.log(``),e._.log(t.default.white(`Transitioning to new global configuration system...`)),e._.log(``),n.tokenMigrated&&e._.log(t.default.green(`✓ Token migrated to ~/.stackone/agent.json`)),n.filesRemoved.length>0&&e._.log(t.default.green(`✓ Removed local files: ${n.filesRemoved.join(`, `)}`)),e._.log(``),e._.log(t.default.dim(`Benefits of global config:`)),e._.log(t.default.dim(` • One token works across all repos`)),e._.log(t.default.dim(` • No local files to manage or commit`)),e._.log(t.default.dim(` • Config files loaded from package (always up-to-date)`)),e._.log(``))}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return o}});
1
+ const e=require(`./agentConfig-CgKwpn5X.cjs`);let t=require(`chalk`);t=e.y(t);let n=require(`node:fs`),r=require(`node:fs/promises`);function i(e){return[`${e}/.env`,`${e}/CLAUDE.md`,`${e}/.mcp.json`].some(e=>(0,n.existsSync)(e))}async function a(t){let i={migrated:!1,filesRemoved:[],tokenMigrated:!1},a=`${t}/.env`,o=`${t}/CLAUDE.md`,s=`${t}/.mcp.json`;if((0,n.existsSync)(a))try{let t=(await(0,r.readFile)(a,`utf-8`)).match(/STACKONE_AGENT_TOKEN=(.+)/);if(t&&t[1]){let n=t[1].trim(),r=await e.o();(!r||!r.apiKey)&&(await e.c({apiKey:n,userId:`migrated-user`,email:`migrated-user`,expiresAt:new Date(Date.now()+1440*60*1e3).toISOString(),serverUrl:process.env.STACKONE_AGENT_SERVER_URL||`https://mcp-internal-falcon.stackonehq.workers.dev/mcp`}),i.tokenMigrated=!0)}}catch(t){e._.warn(`Failed to read .env file: ${t instanceof Error?t.message:String(t)}`)}let c=[{path:a,name:`.env`},{path:o,name:`CLAUDE.md`},{path:s,name:`.mcp.json`}];for(let t of c)if((0,n.existsSync)(t.path))try{(0,n.unlinkSync)(t.path),i.filesRemoved.push(t.name)}catch(n){e._.warn(`Failed to remove ${t.name}: ${n instanceof Error?n.message:String(n)}`)}return i.migrated=i.filesRemoved.length>0||i.tokenMigrated,i}function o(n){n.migrated&&(e._.log(``),e._.log(t.default.blue.bold(`🔄 Migration Complete`)),e._.log(``),e._.log(t.default.white(`Transitioning to new global configuration system...`)),e._.log(``),n.tokenMigrated&&e._.log(t.default.green(`✓ Token migrated to ~/.stackone/agent-config.json`)),n.filesRemoved.length>0&&e._.log(t.default.green(`✓ Removed local files: ${n.filesRemoved.join(`, `)}`)),e._.log(``),e._.log(t.default.dim(`Benefits of global config:`)),e._.log(t.default.dim(` • One token works across all repos`)),e._.log(t.default.dim(` • No local files to manage or commit`)),e._.log(t.default.dim(` • Config files loaded from package (always up-to-date)`)),e._.log(``))}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return o}});
@@ -0,0 +1 @@
1
+ require(`./agentConfig-CgKwpn5X.cjs`);const e=require(`./setupMigration-DAlx4sxl.cjs`);exports.displayMigrationMessage=e.t,exports.hasOldSetupFiles=e.n,exports.migrateFromLocalSetup=e.r;
@@ -0,0 +1 @@
1
+ import"./agentConfig-BljaB-6S.mjs";import{n as e,r as t,t as n}from"./setupMigration-DdeVl8db.mjs";export{n as displayMigrationMessage,e as hasOldSetupFiles,t as migrateFromLocalSetup};
@@ -1 +1 @@
1
- import{_ as e,c as t,o as n}from"./agentConfig-BljaB-6S.mjs";import r from"chalk";import{existsSync as i,unlinkSync as a}from"node:fs";import{readFile as o}from"node:fs/promises";function s(e){return[`${e}/.env`,`${e}/CLAUDE.md`,`${e}/.mcp.json`].some(e=>i(e))}async function c(r){let s={migrated:!1,filesRemoved:[],tokenMigrated:!1},c=`${r}/.env`,l=`${r}/CLAUDE.md`,u=`${r}/.mcp.json`;if(i(c))try{let e=(await o(c,`utf-8`)).match(/STACKONE_AGENT_TOKEN=(.+)/);if(e&&e[1]){let r=e[1].trim(),i=await n();(!i||!i.apiKey)&&(await t({apiKey:r,userId:`migrated-user`,email:`migrated-user`,expiresAt:new Date(Date.now()+1440*60*1e3).toISOString(),serverUrl:process.env.STACKONE_AGENT_SERVER_URL||`https://mcp-internal-falcon.stackonehq.workers.dev/mcp`}),s.tokenMigrated=!0)}}catch(t){e.warn(`Failed to read .env file: ${t instanceof Error?t.message:String(t)}`)}let d=[{path:c,name:`.env`},{path:l,name:`CLAUDE.md`},{path:u,name:`.mcp.json`}];for(let t of d)if(i(t.path))try{a(t.path),s.filesRemoved.push(t.name)}catch(n){e.warn(`Failed to remove ${t.name}: ${n instanceof Error?n.message:String(n)}`)}return s.migrated=s.filesRemoved.length>0||s.tokenMigrated,s}function l(t){t.migrated&&(e.log(``),e.log(r.blue.bold(`🔄 Migration Complete`)),e.log(``),e.log(r.white(`Transitioning to new global configuration system...`)),e.log(``),t.tokenMigrated&&e.log(r.green(`✓ Token migrated to ~/.stackone/agent.json`)),t.filesRemoved.length>0&&e.log(r.green(`✓ Removed local files: ${t.filesRemoved.join(`, `)}`)),e.log(``),e.log(r.dim(`Benefits of global config:`)),e.log(r.dim(` • One token works across all repos`)),e.log(r.dim(` • No local files to manage or commit`)),e.log(r.dim(` • Config files loaded from package (always up-to-date)`)),e.log(``))}export{s as n,c as r,l as t};
1
+ import{_ as e,c as t,o as n}from"./agentConfig-BljaB-6S.mjs";import r from"chalk";import{existsSync as i,unlinkSync as a}from"node:fs";import{readFile as o}from"node:fs/promises";function s(e){return[`${e}/.env`,`${e}/CLAUDE.md`,`${e}/.mcp.json`].some(e=>i(e))}async function c(r){let s={migrated:!1,filesRemoved:[],tokenMigrated:!1},c=`${r}/.env`,l=`${r}/CLAUDE.md`,u=`${r}/.mcp.json`;if(i(c))try{let e=(await o(c,`utf-8`)).match(/STACKONE_AGENT_TOKEN=(.+)/);if(e&&e[1]){let r=e[1].trim(),i=await n();(!i||!i.apiKey)&&(await t({apiKey:r,userId:`migrated-user`,email:`migrated-user`,expiresAt:new Date(Date.now()+1440*60*1e3).toISOString(),serverUrl:process.env.STACKONE_AGENT_SERVER_URL||`https://mcp-internal-falcon.stackonehq.workers.dev/mcp`}),s.tokenMigrated=!0)}}catch(t){e.warn(`Failed to read .env file: ${t instanceof Error?t.message:String(t)}`)}let d=[{path:c,name:`.env`},{path:l,name:`CLAUDE.md`},{path:u,name:`.mcp.json`}];for(let t of d)if(i(t.path))try{a(t.path),s.filesRemoved.push(t.name)}catch(n){e.warn(`Failed to remove ${t.name}: ${n instanceof Error?n.message:String(n)}`)}return s.migrated=s.filesRemoved.length>0||s.tokenMigrated,s}function l(t){t.migrated&&(e.log(``),e.log(r.blue.bold(`🔄 Migration Complete`)),e.log(``),e.log(r.white(`Transitioning to new global configuration system...`)),e.log(``),t.tokenMigrated&&e.log(r.green(`✓ Token migrated to ~/.stackone/agent-config.json`)),t.filesRemoved.length>0&&e.log(r.green(`✓ Removed local files: ${t.filesRemoved.join(`, `)}`)),e.log(``),e.log(r.dim(`Benefits of global config:`)),e.log(r.dim(` • One token works across all repos`)),e.log(r.dim(` • No local files to manage or commit`)),e.log(r.dim(` • Config files loaded from package (always up-to-date)`)),e.log(``))}export{s as n,c as r,l as t};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stackone/cli",
3
- "version": "1.17.0",
3
+ "version": "1.17.1",
4
4
  "description": "StackOne Connect CLI tool",
5
5
  "type": "module",
6
6
  "main": "dist/index.mjs",
@@ -46,7 +46,7 @@
46
46
  "@anthropic-ai/sdk": "^0.32.1",
47
47
  "@clack/prompts": "0.11.0",
48
48
  "@stackone/agent-config": "1.4.0",
49
- "@stackone/agent-harness": "0.4.2",
49
+ "@stackone/agent-harness": "0.4.3",
50
50
  "@stackone/connect-sdk": "2.21.0",
51
51
  "@stackone/core": "2.13.0",
52
52
  "@stackone/transport": "2.7.1",
@@ -1,2 +0,0 @@
1
- import{s as e}from"./agentConfig-BljaB-6S.mjs";function t(){let t=e();if(t&&t.apiKey)return t.apiKey;let n=process.env.STACKONE_AGENT_TOKEN;if(!n)throw Error(`STACKONE_AGENT_TOKEN not found. Please run "stackone agent setup" to authenticate.
2
- This will save your token to ~/.stackone/agent.json for use across all projects.`);return n}export{t as getAgentApiKey};
@@ -1 +0,0 @@
1
- require(`./agentConfig-CgKwpn5X.cjs`);const e=require(`./setupMigration-CGWweyuQ.cjs`);exports.displayMigrationMessage=e.t,exports.hasOldSetupFiles=e.n,exports.migrateFromLocalSetup=e.r;
@@ -1 +0,0 @@
1
- import"./agentConfig-BljaB-6S.mjs";import{n as e,r as t,t as n}from"./setupMigration-9Qv_kZG0.mjs";export{n as displayMigrationMessage,e as hasOldSetupFiles,t as migrateFromLocalSetup};