stably 4.4.2 → 4.4.3

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.
Files changed (2) hide show
  1. package/dist/index.js +1 -1
  2. package/package.json +3 -2
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var e=require("commander"),t=require("buffer"),r=require("path"),n=require("child_process"),o=require("process"),s=require("fs"),i=require("url"),a=require("os");require("timers/promises");var c=require("stream"),l=require("util"),u=require("@anthropic-ai/claude-agent-sdk"),d=require("dotenv"),p=require("picocolors"),f=require("simple-git"),h=require("crypto"),m=require("fs/promises"),g=require("@clack/prompts"),y=require("readline/promises"),_=require("zod"),b=require("open"),E=require("http"),I=require("pino"),w=require("sonic-boom"),v=require("zod/v3"),T=require("react"),S=require("react/jsx-runtime"),R=require("@stablyhq/runner-sdk");function x(e){return e&&e.__esModule?e:{default:e}}var C=x(r),A=x(n),U=x(o),P=x(s),L=x(a),O=x(c),B=x(p),N=x(h),D=x(m),k=x(_),j=x(b),$=x(E),M=x(I),H=x(w),G={detect:({env:e})=>Boolean(e.APPVEYOR),configuration({env:e}){const t=e.APPVEYOR_PULL_REQUEST_NUMBER,r=Boolean(t);return{name:"Appveyor",service:"appveyor",commit:e.APPVEYOR_REPO_COMMIT,tag:e.APPVEYOR_REPO_TAG_NAME,build:e.APPVEYOR_BUILD_NUMBER,buildUrl:`https://ci.appveyor.com/project/${e.APPVEYOR_PROJECT_SLUG}/build/${e.APPVEYOR_BUILD_VERSION}`,branch:e.APPVEYOR_REPO_BRANCH,job:e.APPVEYOR_JOB_NUMBER,jobUrl:`https://ci.appveyor.com/project/${e.APPVEYOR_PROJECT_SLUG}/build/job/${e.APPVEYOR_JOB_ID}`,pr:t,isPr:r,prBranch:e.APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH,slug:e.APPVEYOR_REPO_NAME,root:e.APPVEYOR_BUILD_FOLDER}}};function F(e){return(/\d+(?!.*\d+)/.exec(e)||[])[0]}function Y(e){return e?/^(?:refs\/heads\/)?(?<branch>.+)$/i.exec(e)[1]:void 0}var z={detect:({env:e})=>Boolean(e.BUILD_BUILDURI),configuration({env:e}){const t=e.SYSTEM_PULLREQUEST_PULLREQUESTID,r=Boolean(t);return{name:"Azure Pipelines",service:"azurePipelines",commit:e.BUILD_SOURCEVERSION,build:e.BUILD_BUILDNUMBER,branch:Y(r?e.SYSTEM_PULLREQUEST_TARGETBRANCH:e.BUILD_SOURCEBRANCH),pr:t,isPr:r,prBranch:Y(r?e.SYSTEM_PULLREQUEST_SOURCEBRANCH:void 0),root:e.BUILD_REPOSITORY_LOCALPATH}}},K={detect:({env:e})=>Boolean(e.bamboo_agentId),configuration:({env:e})=>({name:"Bamboo",service:"bamboo",commit:e.bamboo_planRepository_1_revision,build:e.bamboo_buildNumber,buildUrl:e.bamboo_buildResultsUrl,branch:e.bamboo_planRepository_1_branchName,job:e.bamboo_buildKey,root:e.bamboo_build_working_directory})},W={detect:({env:e})=>Boolean(e.BITBUCKET_BUILD_NUMBER),configuration:({env:e})=>({name:"Bitbucket Pipelines",service:"bitbucket",commit:e.BITBUCKET_COMMIT,tag:e.BITBUCKET_TAG,build:e.BITBUCKET_BUILD_NUMBER,buildUrl:`https://bitbucket.org/${e.BITBUCKET_REPO_FULL_NAME}/addon/pipelines/home#!/results/${e.BITBUCKET_BUILD_NUMBER}`,branch:e.BITBUCKET_BRANCH,slug:e.BITBUCKET_REPO_FULL_NAME,root:e.BITBUCKET_CLONE_DIR})},V={detect:({env:e})=>Boolean(e.BITRISE_IO),configuration({env:e}){const t="false"===e.BITRISE_PULL_REQUEST?void 0:e.BITRISE_PULL_REQUEST,r=Boolean(t);return{name:"Bitrise",service:"bitrise",commit:e.BITRISE_GIT_COMMIT,tag:e.BITRISE_GIT_TAG,build:e.BITRISE_BUILD_NUMBER,buildUrl:e.BITRISE_BUILD_URL,branch:r?e.BITRISEIO_GIT_BRANCH_DEST:e.BITRISE_GIT_BRANCH,pr:t,isPr:r,prBranch:r?e.BITRISE_GIT_BRANCH:void 0,slug:e.BITRISE_APP_SLUG}}},q={detect:({env:e})=>Boolean(e.BUDDY_WORKSPACE_ID),configuration({env:e}){const t=F(e.BUDDY_EXECUTION_PULL_REQUEST_ID),r=Boolean(t);return{name:"Buddy",service:"buddy",commit:e.BUDDY_EXECUTION_REVISION,tag:e.BUDDY_EXECUTION_TAG,build:e.BUDDY_EXECUTION_ID,buildUrl:e.BUDDY_EXECUTION_URL,branch:r?e.BUDDY_EXECUTION_PULL_REQUEST_HEAD_BRANCH:e.BUDDY_EXECUTION_BRANCH,pr:t,isPr:r,slug:e.BUDDY_REPO_SLUG}}},J="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function X(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var Q,Z,ee,te,re,ne,oe,se,ie={exports:{}};var ae,ce,le,ue,de,pe,fe,he,me,ge,ye,_e,be,Ee,Ie,we={exports:{}},ve={};function Te(){if(_e)return ye;_e=1;const e=C.default,t=function(){if(le)return ce;le=1;const e=C.default,t=function(){if(se)return oe;se=1;const e="win32"===process.platform||"cygwin"===process.env.OSTYPE||"msys"===process.env.OSTYPE,t=C.default,r=e?";":":",n=function(){if(ne)return re;var e;function t(r,n,o){if("function"==typeof n&&(o=n,n={}),!o){if("function"!=typeof Promise)throw new TypeError("callback not provided");return new Promise(function(e,o){t(r,n||{},function(t,r){t?o(t):e(r)})})}e(r,n||{},function(e,t){e&&("EACCES"===e.code||n&&n.ignoreErrors)&&(e=null,t=!1),o(e,t)})}return ne=1,e="win32"===process.platform||J.TESTING_WINDOWS?function(){if(Z)return Q;Z=1,Q=r,r.sync=function(r,n){return t(e.statSync(r),r,n)};var e=P.default;function t(e,t,r){return!(!e.isSymbolicLink()&&!e.isFile())&&function(e,t){var r=void 0!==t.pathExt?t.pathExt:process.env.PATHEXT;if(!r)return!0;if(-1!==(r=r.split(";")).indexOf(""))return!0;for(var n=0;n<r.length;n++){var o=r[n].toLowerCase();if(o&&e.substr(-o.length).toLowerCase()===o)return!0}return!1}(t,r)}function r(r,n,o){e.stat(r,function(e,s){o(e,!e&&t(s,r,n))})}return Q}():function(){if(te)return ee;te=1,ee=t,t.sync=function(t,n){return r(e.statSync(t),n)};var e=P.default;function t(t,n,o){e.stat(t,function(e,t){o(e,!e&&r(t,n))})}function r(e,t){return e.isFile()&&function(e,t){var r=e.mode,n=e.uid,o=e.gid,s=void 0!==t.uid?t.uid:process.getuid&&process.getuid(),i=void 0!==t.gid?t.gid:process.getgid&&process.getgid(),a=parseInt("100",8),c=parseInt("010",8);return r&parseInt("001",8)||r&c&&o===i||r&a&&n===s||r&(a|c)&&0===s}(e,t)}return ee}(),re=t,t.sync=function(t,r){try{return e.sync(t,r||{})}catch(e){if(r&&r.ignoreErrors||"EACCES"===e.code)return!1;throw e}},re}(),o=e=>Object.assign(new Error(`not found: ${e}`),{code:"ENOENT"}),s=(t,n)=>{const o=n.colon||r,s=t.match(/\//)||e&&t.match(/\\/)?[""]:[...e?[process.cwd()]:[],...(n.path||process.env.PATH||"").split(o)],i=e?n.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",a=e?i.split(o):[""];return e&&-1!==t.indexOf(".")&&""!==a[0]&&a.unshift(""),{pathEnv:s,pathExt:a,pathExtExe:i}},i=(e,r,i)=>{"function"==typeof r&&(i=r,r={}),r||(r={});const{pathEnv:a,pathExt:c,pathExtExe:l}=s(e,r),u=[],d=n=>new Promise((s,i)=>{if(n===a.length)return r.all&&u.length?s(u):i(o(e));const c=a[n],l=/^".*"$/.test(c)?c.slice(1,-1):c,d=t.join(l,e),f=!l&&/^\.[\\\/]/.test(e)?e.slice(0,2)+d:d;s(p(f,n,0))}),p=(e,t,o)=>new Promise((s,i)=>{if(o===c.length)return s(d(t+1));const a=c[o];n(e+a,{pathExt:l},(n,i)=>{if(!n&&i){if(!r.all)return s(e+a);u.push(e+a)}return s(p(e,t,o+1))})});return i?d(0).then(e=>i(null,e),i):d(0)};return oe=i,i.sync=(e,r)=>{r=r||{};const{pathEnv:i,pathExt:a,pathExtExe:c}=s(e,r),l=[];for(let o=0;o<i.length;o++){const s=i[o],u=/^".*"$/.test(s)?s.slice(1,-1):s,d=t.join(u,e),p=!u&&/^\.[\\\/]/.test(e)?e.slice(0,2)+d:d;for(let e=0;e<a.length;e++){const t=p+a[e];try{if(n.sync(t,{pathExt:c})){if(!r.all)return t;l.push(t)}}catch(e){}}}if(r.all&&l.length)return l;if(r.nothrow)return null;throw o(e)},oe}(),r=function(){if(ae)return we.exports;ae=1;const e=(e={})=>{const t=e.env||process.env;return"win32"!==(e.platform||process.platform)?"PATH":Object.keys(t).reverse().find(e=>"PATH"===e.toUpperCase())||"Path"};return we.exports=e,we.exports.default=e,we.exports}();function n(n,o){const s=n.options.env||process.env,i=process.cwd(),a=null!=n.options.cwd,c=a&&void 0!==process.chdir&&!process.chdir.disabled;if(c)try{process.chdir(n.options.cwd)}catch(e){}let l;try{l=t.sync(n.command,{path:s[r({env:s})],pathExt:o?e.delimiter:void 0})}catch(e){}finally{c&&process.chdir(i)}return l&&(l=e.resolve(a?n.options.cwd:"",l)),l}return ce=function(e){return n(e)||n(e,!0)}}(),r=function(){if(ue)return ve;ue=1;const e=/([()\][%!^"`<>&|;, *?])/g;return ve.command=function(t){return t.replace(e,"^$1")},ve.argument=function(t,r){return t=(t=`"${t=(t=(t=`${t}`).replace(/(?=(\\+?)?)\1"/g,'$1$1\\"')).replace(/(?=(\\+?)?)\1$/,"$1$1")}"`).replace(e,"^$1"),r&&(t=t.replace(e,"^$1")),t},ve}(),n=function(){if(ge)return me;ge=1;const e=P.default,t=function(){if(he)return fe;he=1;const e=pe?de:(pe=1,de=/^#!(.*)/);return fe=(t="")=>{const r=t.match(e);if(!r)return null;const[n,o]=r[0].replace(/#! ?/,"").split(" "),s=n.split("/").pop();return"env"===s?o:o?`${s} ${o}`:s}}();return me=function(r){const n=Buffer.alloc(150);let o;try{o=e.openSync(r,"r"),e.readSync(o,n,0,150,0),e.closeSync(o)}catch(e){}return t(n.toString())},me}(),o="win32"===process.platform,s=/\.(?:com|exe)$/i,i=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;return ye=function(a,c,l){c&&!Array.isArray(c)&&(l=c,c=null);const u={command:a,args:c=c?c.slice(0):[],options:l=Object.assign({},l),file:void 0,original:{command:a,args:c}};return l.shell?u:function(a){if(!o)return a;const c=function(e){e.file=t(e);const r=e.file&&n(e.file);return r?(e.args.unshift(e.file),e.command=r,t(e)):e.file}(a),l=!s.test(c);if(a.options.forceShell||l){const t=i.test(c);a.command=e.normalize(a.command),a.command=r.command(a.command),a.args=a.args.map(e=>r.argument(e,t));const n=[a.command].concat(a.args).join(" ");a.args=["/d","/s","/c",`"${n}"`],a.command=process.env.comspec||"cmd.exe",a.options.windowsVerbatimArguments=!0}return a}(u)}}var Se=X(function(){if(Ie)return ie.exports;Ie=1;const e=A.default,t=Te(),r=function(){if(Ee)return be;Ee=1;const e="win32"===process.platform;function t(e,t){return Object.assign(new Error(`${t} ${e.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${t} ${e.command}`,path:e.command,spawnargs:e.args})}function r(r,n){return e&&1===r&&!n.file?t(n.original,"spawn"):null}return be={hookChildProcess:function(t,n){if(!e)return;const o=t.emit;t.emit=function(e,s){if("exit"===e){const e=r(s,n);if(e)return o.call(t,"error",e)}return o.apply(t,arguments)}},verifyENOENT:r,verifyENOENTSync:function(r,n){return e&&1===r&&!n.file?t(n.original,"spawnSync"):null},notFoundError:t},be}();function n(n,o,s){const i=t(n,o,s),a=e.spawn(i.command,i.args,i.options);return r.hookChildProcess(a,i),a}return ie.exports=n,ie.exports.spawn=n,ie.exports.sync=function(n,o,s){const i=t(n,o,s),a=e.spawnSync(i.command,i.args,i.options);return a.error=a.error||r.verifyENOENTSync(a.status,i),a},ie.exports._parse=t,ie.exports._enoent=r,ie.exports}());function Re(e={}){const{env:t=process.env,platform:r=process.platform}=e;return"win32"!==r?"PATH":Object.keys(t).reverse().find(e=>"PATH"===e.toUpperCase())||"Path"}var xe=(e,t)=>({name:`SIGRT${t+1}`,number:Ce+t,action:"terminate",description:"Application-specific signal (realtime)",standard:"posix"}),Ce=34,Ae=[{name:"SIGHUP",number:1,action:"terminate",description:"Terminal closed",standard:"posix"},{name:"SIGINT",number:2,action:"terminate",description:"User interruption with CTRL-C",standard:"ansi"},{name:"SIGQUIT",number:3,action:"core",description:"User interruption with CTRL-\\",standard:"posix"},{name:"SIGILL",number:4,action:"core",description:"Invalid machine instruction",standard:"ansi"},{name:"SIGTRAP",number:5,action:"core",description:"Debugger breakpoint",standard:"posix"},{name:"SIGABRT",number:6,action:"core",description:"Aborted",standard:"ansi"},{name:"SIGIOT",number:6,action:"core",description:"Aborted",standard:"bsd"},{name:"SIGBUS",number:7,action:"core",description:"Bus error due to misaligned, non-existing address or paging error",standard:"bsd"},{name:"SIGEMT",number:7,action:"terminate",description:"Command should be emulated but is not implemented",standard:"other"},{name:"SIGFPE",number:8,action:"core",description:"Floating point arithmetic error",standard:"ansi"},{name:"SIGKILL",number:9,action:"terminate",description:"Forced termination",standard:"posix",forced:!0},{name:"SIGUSR1",number:10,action:"terminate",description:"Application-specific signal",standard:"posix"},{name:"SIGSEGV",number:11,action:"core",description:"Segmentation fault",standard:"ansi"},{name:"SIGUSR2",number:12,action:"terminate",description:"Application-specific signal",standard:"posix"},{name:"SIGPIPE",number:13,action:"terminate",description:"Broken pipe or socket",standard:"posix"},{name:"SIGALRM",number:14,action:"terminate",description:"Timeout or timer",standard:"posix"},{name:"SIGTERM",number:15,action:"terminate",description:"Termination",standard:"ansi"},{name:"SIGSTKFLT",number:16,action:"terminate",description:"Stack is empty or overflowed",standard:"other"},{name:"SIGCHLD",number:17,action:"ignore",description:"Child process terminated, paused or unpaused",standard:"posix"},{name:"SIGCLD",number:17,action:"ignore",description:"Child process terminated, paused or unpaused",standard:"other"},{name:"SIGCONT",number:18,action:"unpause",description:"Unpaused",standard:"posix",forced:!0},{name:"SIGSTOP",number:19,action:"pause",description:"Paused",standard:"posix",forced:!0},{name:"SIGTSTP",number:20,action:"pause",description:'Paused using CTRL-Z or "suspend"',standard:"posix"},{name:"SIGTTIN",number:21,action:"pause",description:"Background process cannot read terminal input",standard:"posix"},{name:"SIGBREAK",number:21,action:"terminate",description:"User interruption with CTRL-BREAK",standard:"other"},{name:"SIGTTOU",number:22,action:"pause",description:"Background process cannot write to terminal output",standard:"posix"},{name:"SIGURG",number:23,action:"ignore",description:"Socket received out-of-band data",standard:"bsd"},{name:"SIGXCPU",number:24,action:"core",description:"Process timed out",standard:"bsd"},{name:"SIGXFSZ",number:25,action:"core",description:"File too big",standard:"bsd"},{name:"SIGVTALRM",number:26,action:"terminate",description:"Timeout or timer",standard:"bsd"},{name:"SIGPROF",number:27,action:"terminate",description:"Timeout or timer",standard:"bsd"},{name:"SIGWINCH",number:28,action:"ignore",description:"Terminal window size changed",standard:"bsd"},{name:"SIGIO",number:29,action:"terminate",description:"I/O is available",standard:"other"},{name:"SIGPOLL",number:29,action:"terminate",description:"Watched event",standard:"other"},{name:"SIGINFO",number:29,action:"ignore",description:"Request for process information",standard:"other"},{name:"SIGPWR",number:30,action:"terminate",description:"Device running out of power",standard:"systemv"},{name:"SIGSYS",number:31,action:"core",description:"Invalid system call",standard:"other"},{name:"SIGUNUSED",number:31,action:"terminate",description:"Invalid system call",standard:"other"}],Ue=()=>{const e=(()=>{const e=64-Ce+1;return Array.from({length:e},xe)})();return[...Ae,...e].map(Pe)},Pe=({name:e,number:t,description:r,action:n,forced:o=!1,standard:s})=>{const{signals:{[e]:i}}=a.constants,c=void 0!==i;return{name:e,number:c?i:t,description:r,supported:c,action:n,forced:o,standard:s}},Le=({name:e,number:t,description:r,supported:n,action:o,forced:s,standard:i})=>[e,{name:e,number:t,description:r,supported:n,action:o,forced:s,standard:i}],Oe=(()=>{const e=Ue();return Object.fromEntries(e.map(Le))})();(()=>{const e=Ue(),t=Array.from({length:65},(t,r)=>((e,t)=>{const r=((e,t)=>{const r=t.find(({name:t})=>a.constants.signals[t]===e);return void 0!==r?r:t.find(t=>t.number===e)})(e,t);if(void 0===r)return{};const{name:n,description:o,supported:s,action:i,forced:c,standard:l}=r;return{[e]:{name:n,number:e,description:o,supported:s,action:i,forced:c,standard:l}}})(r,e));Object.assign({},...t)})();var Be=({stdout:e,stderr:t,all:r,error:n,signal:o,exitCode:s,command:i,escapedCommand:a,timedOut:c,isCanceled:l,killed:u,parsed:{options:{timeout:d,cwd:p=U.default.cwd()}}})=>{s=null===s?void 0:s;const f=void 0===(o=null===o?void 0:o)?void 0:Oe[o].description,h=(({timedOut:e,timeout:t,errorCode:r,signal:n,signalDescription:o,exitCode:s,isCanceled:i})=>e?`timed out after ${t} milliseconds`:void 0!==r?`failed with ${r}`:void 0!==n?`was killed with ${n} (${o})`:void 0!==s?`failed with exit code ${s}`:"failed")({timedOut:c,timeout:d,errorCode:n&&n.code,signal:o,signalDescription:f,exitCode:s,isCanceled:l}),m=`Command ${h}: ${i}`,g="[object Error]"===Object.prototype.toString.call(n),y=g?`${m}\n${n.message}`:m,_=[y,t,e].filter(Boolean).join("\n");return g?(n.originalMessage=n.message,n.message=_):n=new Error(_),n.shortMessage=y,n.command=i,n.escapedCommand=a,n.exitCode=s,n.signal=o,n.signalDescription=f,n.stdout=e,n.stderr=t,n.cwd=p,void 0!==r&&(n.all=r),"bufferedData"in n&&delete n.bufferedData,n.failed=!0,n.timedOut=Boolean(c),n.isCanceled=l,n.killed=u&&!c,n},Ne=["stdin","stdout","stderr"],De=[];De.push("SIGHUP","SIGINT","SIGTERM"),"win32"!==process.platform&&De.push("SIGALRM","SIGABRT","SIGVTALRM","SIGXCPU","SIGXFSZ","SIGUSR2","SIGTRAP","SIGSYS","SIGQUIT","SIGIOT"),"linux"===process.platform&&De.push("SIGIO","SIGPOLL","SIGPWR","SIGSTKFLT");var ke,je,$e=e=>!!e&&"object"==typeof e&&"function"==typeof e.removeListener&&"function"==typeof e.emit&&"function"==typeof e.reallyExit&&"function"==typeof e.listeners&&"function"==typeof e.kill&&"number"==typeof e.pid&&"function"==typeof e.on,Me=Symbol.for("signal-exit emitter"),He=globalThis,Ge=Object.defineProperty.bind(Object),Fe=class{emitted={afterExit:!1,exit:!1};listeners={afterExit:[],exit:[]};count=0;id=Math.random();constructor(){if(He[Me])return He[Me];Ge(He,Me,{value:this,writable:!1,enumerable:!1,configurable:!1})}on(e,t){this.listeners[e].push(t)}removeListener(e,t){const r=this.listeners[e],n=r.indexOf(t);-1!==n&&(0===n&&1===r.length?r.length=0:r.splice(n,1))}emit(e,t,r){if(this.emitted[e])return!1;this.emitted[e]=!0;let n=!1;for(const o of this.listeners[e])n=!0===o(t,r)||n;return"exit"===e&&(n=this.emit("afterExit",t,r)||n),n}},Ye=class{},ze=globalThis.process;$e(ze)?new class extends Ye{#e="win32"===ze.platform?"SIGINT":"SIGHUP";#t=new Fe;#r;#n;#o;#s={};#i=!1;constructor(e){super(),this.#r=e,this.#s={};for(const t of De)this.#s[t]=()=>{const r=this.#r.listeners(t);let{count:n}=this.#t;const o=e;if("object"==typeof o.__signal_exit_emitter__&&"number"==typeof o.__signal_exit_emitter__.count&&(n+=o.__signal_exit_emitter__.count),r.length===n){this.unload();const r=this.#t.emit("exit",null,t),n="SIGHUP"===t?this.#e:t;r||e.kill(e.pid,n)}};this.#o=e.reallyExit,this.#n=e.emit}onExit(e,t){if(!$e(this.#r))return()=>{};!1===this.#i&&this.load();const r=t?.alwaysLast?"afterExit":"exit";return this.#t.on(r,e),()=>{this.#t.removeListener(r,e),0===this.#t.listeners.exit.length&&0===this.#t.listeners.afterExit.length&&this.unload()}}load(){if(!this.#i){this.#i=!0,this.#t.count+=1;for(const e of De)try{const t=this.#s[e];t&&this.#r.on(e,t)}catch(e){}this.#r.emit=(e,...t)=>this.#a(e,...t),this.#r.reallyExit=e=>this.#c(e)}}unload(){this.#i&&(this.#i=!1,De.forEach(e=>{const t=this.#s[e];if(!t)throw new Error("Listener not defined for signal: "+e);try{this.#r.removeListener(e,t)}catch(e){}}),this.#r.emit=this.#n,this.#r.reallyExit=this.#o,this.#t.count-=1)}#c(e){return $e(this.#r)?(this.#r.exitCode=e||0,this.#t.emit("exit",this.#r.exitCode,null),this.#o.call(this.#r,this.#r.exitCode)):0}#a(e,...t){const r=this.#n;if("exit"===e&&$e(this.#r)){"number"==typeof t[0]&&(this.#r.exitCode=t[0]);const n=r.call(this.#r,e,...t);return this.#t.emit("exit",this.#r.exitCode,null),n}return r.call(this.#r,e,...t)}}(ze):new class extends Ye{onExit(){return()=>{}}load(){}unload(){}},new TextEncoder,function(){if(je)return ke;je=1;const{PassThrough:e}=O.default;ke=function(){var t=[],r=new e({objectMode:!0});return r.setMaxListeners(0),r.add=n,r.isEmpty=function(){return 0==t.length},r.on("unpipe",o),Array.prototype.slice.call(arguments).forEach(n),r;function n(e){return Array.isArray(e)?(e.forEach(n),this):(t.push(e),e.once("end",o.bind(null,e)),e.once("error",r.emit.bind(r,"error")),e.pipe(r,{end:!1}),this)}function o(e){!(t=t.filter(function(t){return t!==e})).length&&r.readable&&r.end()}}}();var Ke=(async()=>{})().constructor.prototype;["then","catch","finally"].map(e=>[e,Reflect.getOwnPropertyDescriptor(Ke,e)]);var We=(e,t=[])=>Array.isArray(t)?[e,...t]:[e],Ve=/^[\w.-]+$/,qe=l.debuglog("execa").enabled,Je=(e,t)=>String(e).padStart(t,"0"),Xe=(e,t,r={})=>{const n=Se._parse(e,t,r);return e=n.command,t=n.args,(r={maxBuffer:1e8,buffer:!0,stripFinalNewline:!0,extendEnv:!0,preferLocal:!1,localDir:(r=n.options).cwd||U.default.cwd(),execPath:U.default.execPath,encoding:"utf8",reject:!0,cleanup:!0,all:!1,windowsHide:!0,verbose:qe,...r}).env=(({env:e,extendEnv:t,preferLocal:r,localDir:n,execPath:o})=>{const s=t?{...U.default.env,...e}:e;return r?(({env:e=U.default.env,...t}={})=>{const r=Re({env:e={...e}});return t.path=e[r],e[r]=(({cwd:e=U.default.cwd(),path:t=U.default.env[Re()],preferLocal:r=!0,execPath:n=U.default.execPath,addExecPath:o=!0}={})=>{const s=e instanceof URL?i.fileURLToPath(e):e,a=C.default.resolve(s),c=[];return r&&((e,t)=>{let r;for(;r!==t;)e.push(C.default.join(t,"node_modules/.bin")),r=t,t=C.default.resolve(t,"..")})(c,a),o&&((e,t,r)=>{const n=t instanceof URL?i.fileURLToPath(t):t;e.push(C.default.resolve(r,n,".."))})(c,n,a),[...c,t].join(C.default.delimiter)})(t),e})({env:s,cwd:n,execPath:o}):s})(r),r.stdio=(e=>{if(!e)return;const{stdio:t}=e;if(void 0===t)return Ne.map(t=>e[t]);if((e=>Ne.some(t=>void 0!==e[t]))(e))throw new Error(`It's not possible to provide \`stdio\` in combination with one of ${Ne.map(e=>`\`${e}\``).join(", ")}`);if("string"==typeof t)return t;if(!Array.isArray(t))throw new TypeError(`Expected \`stdio\` to be of type \`string\` or \`Array\`, got \`${typeof t}\``);const r=Math.max(t.length,Ne.length);return Array.from({length:r},(e,r)=>t[r])})(r),"win32"===U.default.platform&&"cmd"===C.default.basename(e,".exe")&&t.unshift("/q"),{file:e,args:t,options:r,parsed:n}},Qe=(e,r,n)=>"string"==typeof r||t.Buffer.isBuffer(r)?e.stripFinalNewline?function(e){const t="string"==typeof e?"\n":"\n".charCodeAt(),r="string"==typeof e?"\r":"\r".charCodeAt();return e[e.length-1]===t&&(e=e.slice(0,-1)),e[e.length-1]===r&&(e=e.slice(0,-1)),e}(r):r:void 0===n?void 0:"";function Ze(e,t,r){const n=Xe(e,t,r),o=((e,t)=>We(e,t).join(" "))(e,t),i=((e,t)=>We(e,t).map(e=>(e=>"string"!=typeof e||Ve.test(e)?e:`"${e.replaceAll('"','\\"')}"`)(e)).join(" "))(e,t);((e,{verbose:t})=>{t&&U.default.stderr.write(`[${(()=>{const e=new Date;return`${Je(e.getHours(),2)}:${Je(e.getMinutes(),2)}:${Je(e.getSeconds(),2)}.${Je(e.getMilliseconds(),3)}`})()}] ${e}\n`)})(i,n.options);const a=(e=>{const t=(({input:e,inputFile:t})=>"string"!=typeof t?e:((e=>{if(void 0!==e)throw new TypeError("The `input` and `inputFile` options cannot be both set.")})(e),s.readFileSync(t)))(e);if(null!==(r=t)&&"object"==typeof r&&"function"==typeof r.pipe)throw new TypeError("The `input` option cannot be a stream in sync mode");var r;return t})(n.options);let c;try{c=A.default.spawnSync(n.file,n.args,{...n.options,input:a})}catch(e){throw Be({error:e,stdout:"",stderr:"",all:"",command:o,escapedCommand:i,parsed:n,timedOut:!1,isCanceled:!1,killed:!1})}const l=Qe(n.options,c.stdout,c.error),u=Qe(n.options,c.stderr,c.error);if(c.error||0!==c.status||null!==c.signal){const e=Be({stdout:l,stderr:u,error:c.error,signal:c.signal,exitCode:c.status,command:o,escapedCommand:i,parsed:n,timedOut:c.error&&"ETIMEDOUT"===c.error.code,isCanceled:!1,killed:null!==c.signal});if(!n.options.reject)return e;throw e}return{command:o,escapedCommand:i,exitCode:0,stdout:l,stderr:u,failed:!1,timedOut:!1,isCanceled:!1,killed:!1}}function et(e){try{return Ze("git",["rev-parse","HEAD"],e).stdout}catch{return}}function tt(e){try{const t=Ze("git",["rev-parse","--abbrev-ref","HEAD"],e).stdout;if("HEAD"===t){const t=Ze("git",["show","-s","--pretty=%d","HEAD"],e).stdout.replace(/^\(|\)$/g,"").split(", ").find(e=>e.startsWith("origin/"));return t?t.match(/^origin\/(?<branch>.+)/)[1]:void 0}return t}catch{return}}var rt=/^(?:.*)@(?:.*):(?:\d+\/)?(.*)\.git$/,nt=/^\/(.*)\.git$/;function ot(e){if(e){if(e.match(rt))return e.replace(rt,"$1");try{return new URL(e).pathname.replace(nt,"$1")}catch{return}}}var st,it={detect:({env:e})=>Boolean(e.BUILDKITE),configuration({env:e}){const t="false"===e.BUILDKITE_PULL_REQUEST?void 0:e.BUILDKITE_PULL_REQUEST,r=Boolean(t);return{name:"Buildkite",service:"buildkite",build:e.BUILDKITE_BUILD_NUMBER,buildUrl:e.BUILDKITE_BUILD_URL,commit:e.BUILDKITE_COMMIT,tag:e.BUILDKITE_TAG,branch:r?e.BUILDKITE_PULL_REQUEST_BASE_BRANCH:e.BUILDKITE_BRANCH,slug:ot(e.BUILDKITE_REPO),pr:t,isPr:r,prBranch:r?e.BUILDKITE_BRANCH:void 0,root:e.BUILDKITE_BUILD_CHECKOUT_PATH}}},at={detect:({env:e})=>Boolean(e.CIRCLECI),configuration({env:e}){const t=e.CIRCLE_PR_NUMBER||F(e.CIRCLE_PULL_REQUEST||e.CI_PULL_REQUEST),r=Boolean(t);return{name:"CircleCI",service:"circleci",build:e.CIRCLE_BUILD_NUM,buildUrl:e.CIRCLE_BUILD_URL,job:`${e.CIRCLE_BUILD_NUM}.${e.CIRCLE_NODE_INDEX}`,commit:e.CIRCLE_SHA1,tag:e.CIRCLE_TAG,branch:r?void 0:e.CIRCLE_BRANCH,pr:t,isPr:r,prBranch:r?e.CIRCLE_BRANCH:void 0,slug:`${e.CIRCLE_PROJECT_USERNAME}/${e.CIRCLE_PROJECT_REPONAME}`}}},ct="https://cirrus-ci.com",lt={detect:({env:e})=>Boolean(e.CIRRUS_CI),configuration({env:e}){const t=e.CIRRUS_PR,r=Boolean(t);return{name:"Cirrus CI",service:"cirrus",commit:e.CIRRUS_CHANGE_IN_REPO,tag:e.CIRRUS_TAG,build:e.CIRRUS_BUILD_ID,buildUrl:`${ct}/build/${e.CIRRUS_BUILD_ID}`,job:e.CIRRUS_TASK_ID,jobUrl:`${ct}/task/${e.CIRRUS_TASK_ID}`,branch:r?e.CIRRUS_BASE_BRANCH:e.CIRRUS_BRANCH,pr:t,isPr:r,prBranch:r?e.CIRRUS_BRANCH:void 0,slug:e.CIRRUS_REPO_FULL_NAME,root:e.CIRRUS_WORKING_DIR}}},ut={detect:({env:e})=>Boolean(e.CODEBUILD_BUILD_ID),configuration:({env:e,cwd:t})=>({name:"AWS CodeBuild",service:"codebuild",commit:et({env:e,cwd:t}),build:e.CODEBUILD_BUILD_ID,branch:tt({env:e,cwd:t}),buildUrl:`https://console.aws.amazon.com/codebuild/home?region=${e.AWS_REGION}#/builds/${e.CODEBUILD_BUILD_ID}/view/new`,root:e.PWD})},dt={detect:({env:e})=>Boolean(e.CF_BUILD_ID),configuration({env:e}){const t=e.CF_PULL_REQUEST_NUMBER,r=Boolean(t);return{name:"Codefresh",service:"codefresh",commit:e.CF_REVISION,build:e.CF_BUILD_ID,buildUrl:e.CF_BUILD_URL,branch:r?e.CF_PULL_REQUEST_TARGET:e.CF_BRANCH,pr:t,isPr:r,prBranch:r?e.CF_BRANCH:void 0,slug:`${e.CF_REPO_OWNER}/${e.CF_REPO_NAME}`,root:e.CF_VOLUME_PATH}}},pt={detect:({env:e})=>Boolean(e.DRONE),configuration({env:e}){const t="pull_request"===e.DRONE_BUILD_EVENT;return{name:"Drone",service:"drone",commit:e.DRONE_COMMIT_SHA,tag:e.DRONE_TAG,build:e.DRONE_BUILD_NUMBER,buildUrl:e.DRONE_BUILD_LINK,branch:t?e.DRONE_TARGET_BRANCH:e.DRONE_BRANCH,job:e.DRONE_JOB_NUMBER,jobUrl:e.DRONE_BUILD_LINK,pr:e.DRONE_PULL_REQUEST,isPr:t,prBranch:t?e.DRONE_SOURCE_BRANCH:void 0,slug:`${e.DRONE_REPO_OWNER}/${e.DRONE_REPO_NAME}`,root:e.DRONE_WORKSPACE}}},ft=({env:e})=>{try{const t=e.GITHUB_EVENT_PATH?JSON.parse(s.readFileSync(e.GITHUB_EVENT_PATH,"utf-8")):void 0;if(t&&t.pull_request)return{branch:t.pull_request.base?Y(t.pull_request.base.ref):void 0,pr:t.pull_request.number}}catch{}return{pr:void 0,branch:void 0}},ht={detect:({env:e})=>Boolean(e.GITHUB_ACTIONS),configuration({env:e,cwd:t}){const r="pull_request"===e.GITHUB_EVENT_NAME||"pull_request_target"===e.GITHUB_EVENT_NAME,n=Y("pull_request_target"===e.GITHUB_EVENT_NAME?`refs/pull/${(e=>{const t=e.GITHUB_EVENT_PATH?JSON.parse(s.readFileSync(e.GITHUB_EVENT_PATH,"utf-8")):void 0;return t&&t.pull_request?t.pull_request.number:void 0})(e)}/merge`:e.GITHUB_REF);return{name:"GitHub Actions",service:"github",commit:e.GITHUB_SHA,build:e.GITHUB_RUN_ID,buildUrl:`${e.GITHUB_SERVER_URL}/${e.GITHUB_REPOSITORY}/actions/runs/${e.GITHUB_RUN_ID}`,isPr:r,branch:n,prBranch:r?n:void 0,slug:e.GITHUB_REPOSITORY,root:e.GITHUB_WORKSPACE,...r?ft({env:e}):void 0}}},mt={detect:({env:e})=>Boolean(e.GITLAB_CI),configuration({env:e}){const t=e.CI_MERGE_REQUEST_ID,r=Boolean(t);return{name:"GitLab CI/CD",service:"gitlab",commit:e.CI_COMMIT_SHA,tag:e.CI_COMMIT_TAG,build:e.CI_PIPELINE_ID,buildUrl:`${e.CI_PROJECT_URL}/pipelines/${e.CI_PIPELINE_ID}`,job:e.CI_JOB_ID,jobUrl:`${e.CI_PROJECT_URL}/-/jobs/${e.CI_JOB_ID}`,branch:r?e.CI_MERGE_REQUEST_TARGET_BRANCH_NAME:e.CI_COMMIT_REF_NAME,pr:t,isPr:r,prBranch:e.CI_MERGE_REQUEST_SOURCE_BRANCH_NAME,slug:e.CI_PROJECT_PATH,root:e.CI_PROJECT_DIR}}},gt={detect:({env:e})=>Boolean(e.JENKINS_URL),configuration({env:e,cwd:t}){const r=e.ghprbPullId||e.gitlabMergeRequestId||e.CHANGE_ID,n=Boolean(r),o=e.GIT_LOCAL_BRANCH||e.GIT_BRANCH||e.gitlabBranch||e.BRANCH_NAME;return{name:"Jenkins",service:"jenkins",commit:e.ghprbActualCommit||e.GIT_COMMIT||et({env:e,cwd:t}),branch:n?e.ghprbTargetBranch||e.gitlabTargetBranch:o,build:e.BUILD_NUMBER,buildUrl:e.BUILD_URL,root:e.WORKSPACE,pr:r,isPr:n,prBranch:n?e.ghprbSourceBranch||e.gitlabSourceBranch||o:void 0}}},yt={detect:({env:e})=>"true"===e.NETLIFY,configuration({env:e}){const t="true"===e.PULL_REQUEST;return{name:"Netlify",service:"netlify",commit:e.COMMIT_REF,build:e.DEPLOY_ID,buildUrl:`https://app.netlify.com/sites/${e.SITE_NAME}/deploys/${e.DEPLOY_ID}`,branch:t?void 0:e.HEAD,pr:e.REVIEW_ID,isPr:t,prBranch:t?e.HEAD:void 0,slug:e.REPOSITORY_URL.match(/[^/:]+\/[^/]+?$/)[0],root:e.PWD}}},_t={detect:({env:e})=>Boolean(e.DISTELLI_APPNAME),configuration:({env:e})=>({name:"Puppet",service:"puppet",build:e.DISTELLI_BUILDNUM,buildUrl:e.DISTELLI_RELEASE,commit:e.DISTELLI_RELREVISION,branch:e.DISTELLI_RELBRANCH,root:e.DISTELLI_INSTALLHOME})},bt={detect:({env:e})=>Boolean(e.SAILCI),configuration({env:e}){const t=e.SAIL_PULL_REQUEST_NUMBER,r=Boolean(t);return{name:"Sail CI",service:"sail",commit:e.SAIL_COMMIT_SHA,branch:r?void 0:e.SAIL_COMMIT_BRANCH,pr:t,isPr:r,slug:`${e.SAIL_REPO_OWNER}/${e.SAIL_REPO_NAME}`,root:e.SAIL_CLONE_DIR}}},Et={detect:({env:e})=>Boolean(e.SCREWDRIVER),configuration({env:e}){const t=e.SD_PULL_REQUEST,r=Boolean(t);return{name:"Screwdriver.cd",service:"screwdriver",branch:r?e.PR_BASE_BRANCH_NAME:e.GIT_BRANCH,prBranch:r?e.PR_BRANCH_NAME:void 0,commit:e.SD_BUILD_SHA,build:e.SD_BUILD_ID,buildUrl:e.SD_UI_BUILD_URL,job:e.SD_JOB_ID,pr:t,isPr:r,slug:e.SD_PIPELINE_NAME,root:e.SD_ROOT_DIR}}},It={detect:({env:e})=>Boolean(e.SCRUTINIZER),configuration({env:e}){const t=e.SCRUTINIZER_PR_NUMBER,r=Boolean(t);return{name:"Scrutinizer",service:"scrutinizer",commit:e.SCRUTINIZER_SHA1,build:e.SCRUTINIZER_INSPECTION_UUID,branch:e.SCRUTINIZER_BRANCH,pr:t,isPr:r,prBranch:e.SCRUTINIZER_PR_SOURCE_BRANCH}}},wt={detect:({env:e})=>Boolean(e.SEMAPHORE),configuration({env:e,cwd:t}){const r=e.SEMAPHORE_GIT_PR_NUMBER||e.PULL_REQUEST_NUMBER,n=Boolean(r);return{name:"Semaphore",service:"semaphore",commit:e.SEMAPHORE_GIT_SHA||et({env:e,cwd:t}),tag:e.SEMAPHORE_GIT_TAG_NAME,build:e.SEMAPHORE_JOB_ID||e.SEMAPHORE_BUILD_NUMBER,branch:e.SEMAPHORE_GIT_BRANCH||(n?void 0:e.BRANCH_NAME),pr:r,isPr:n,prBranch:e.SEMAPHORE_GIT_PR_BRANCH||(n?e.BRANCH_NAME:void 0),slug:e.SEMAPHORE_GIT_REPO_SLUG||e.SEMAPHORE_REPO_SLUG,root:e.SEMAPHORE_GIT_DIR||e.SEMAPHORE_PROJECT_DIR}}},vt={detect:({env:e})=>Boolean(e.SHIPPABLE),configuration({env:e}){const t="true"===e.IS_PULL_REQUEST?e.PULL_REQUEST:void 0,r=Boolean(t);return{name:"Shippable",service:"shippable",commit:e.COMMIT,tag:e.GIT_TAG_NAME,build:e.BUILD_NUMBER,buildUrl:e.BUILD_URL,branch:r?e.BASE_BRANCH:e.BRANCH,job:e.JOB_NUMBER,pr:t,isPr:r,prBranch:r?e.HEAD_BRANCH:void 0,slug:e.SHIPPABLE_REPO_SLUG,root:e.SHIPPABLE_BUILD_DIR}}},Tt={};function St(){if(st)return Tt;st=1,Object.defineProperty(Tt,"__esModule",{value:!0}),Tt.of=Tt.PropertiesFile=void 0;var e,t=(e=P.default)&&e.__esModule?e:{default:e};class r{constructor(...e){this.objs={},e.length&&this.of.apply(this,e)}makeKeys(e){if(e&&0!==e.indexOf("#")){let t=["=",":"].map(t=>e.indexOf(t)).filter(e=>e>-1),r=Math.min(...t),n=e.substring(0,r).trim(),o=e.substring(r+1).trim();if(this.objs.hasOwnProperty(n))if(Array.isArray(this.objs[n]))this.objs[n].push(o);else{let e=this.objs[n];this.objs[n]=[e,o]}else{const e=o.replace(/"/g,'\\"').replace(/\\:/g,":").replace(/\\=/g,"=");this.objs[n]=unescape(JSON.parse('"'+e+'"'))}}}addFile(e){let r=t.default.readFileSync(e,"utf-8").split(/\r?\n/),n=this;for(let e=0;e<r.length;e++){let t=r[e];for(;"\\"===t.substring(t.length-1);)t=t.slice(0,-1),t+=r[e+1].trim(),e++;n.makeKeys(t)}}of(...e){for(let t=0;t<e.length;t++)this.addFile(e[t])}get(e,t){if(this.objs.hasOwnProperty(e)){if(Array.isArray(this.objs[e])){let t=[];for(let r=0;r<this.objs[e].length;r++)t[r]=this.interpolate(this.objs[e][r]);return t}return void 0===this.objs[e]?"":this.interpolate(this.objs[e])}return t}getLast(e,t){if(this.objs.hasOwnProperty(e)){if(Array.isArray(this.objs[e])){var r=this.objs[e].length;return this.interpolate(this.objs[e][r-1])}return void 0===this.objs[e]?"":this.interpolate(this.objs[e])}return t}getFirst(e,t){return this.objs.hasOwnProperty(e)?Array.isArray(this.objs[e])?this.interpolate(this.objs[e][0]):void 0===this.objs[e]?"":this.interpolate(this.objs[e]):t}getInt(e,t){let r=this.getLast(e);return r?parseInt(r,10):t}getFloat(e,t){let r=this.getLast(e);return r?parseFloat(r):t}getBoolean(e,t){let r=this.getLast(e);return r?!/^(false|0)$/i.test(n=r)&&!!n:t||!1;var n}set(e,t){this.objs[e]=t}interpolate(e){let t=this;return e.replace(/\\\\/g,"\\").replace(/\$\{([A-Za-z0-9\.\-\_]*)\}/g,function(e){return t.getLast(e.substring(2,e.length-1))})}getKeys(){let e=[];for(let t in this.objs)e.push(t);return e}getMatchingKeys(e){let t=[];for(let r in this.objs)-1!==r.search(e)&&t.push(r);return t}reset(){this.objs={}}}return Tt.PropertiesFile=r,Tt.of=function(...e){let t=new r;return t.of.apply(t,e),t},Tt}var Rt=X(St()),xt={root:"teamcity.build.workingDir",branch:"teamcity.build.branch"},Ct=e=>{try{return Rt.of(e)}catch{return}},At=({env:e,cwd:t})=>{const r=e.TEAMCITY_BUILD_PROPERTIES_FILE?Ct(e.TEAMCITY_BUILD_PROPERTIES_FILE):void 0,n=r?r.get("teamcity.configuration.properties.file"):void 0,o=n?Ct(n):n;return Object.fromEntries(Object.keys(xt).map(n=>[n,(r?r.get(xt[n]):void 0)||(o?o.get(xt[n]):void 0)||("branch"===n?tt({env:e,cwd:t}):void 0)]))},Ut={appveyor:G,azurePipelines:z,bamboo:K,bitbucket:W,bitrise:V,buddy:q,buildkite:it,circleci:at,cirrus:lt,cloudflarePages:{detect:({env:e})=>"1"===e.CF_PAGES,configuration:({env:e})=>({name:"Cloudflare Pages",service:"cloudflarePages",commit:e.CF_PAGES_COMMIT_SHA,branch:e.CF_PAGES_BRANCH,root:e.PWD})},codebuild:ut,codefresh:dt,codeship:{detect:({env:e})=>e.CI_NAME&&"codeship"===e.CI_NAME,configuration:({env:e})=>({name:"Codeship",service:"codeship",build:e.CI_BUILD_NUMBER,buildUrl:e.CI_BUILD_URL,commit:e.CI_COMMIT_ID,branch:e.CI_BRANCH,slug:e.CI_REPO_NAME})},drone:pt,github:ht,gitlab:mt,jenkins:gt,netlify:yt,puppet:_t,sail:bt,screwdriver:Et,scrutinizer:It,semaphore:wt,shippable:vt,teamcity:{detect:({env:e})=>Boolean(e.TEAMCITY_VERSION),configuration:({env:e,cwd:t})=>({name:"TeamCity",service:"teamcity",commit:e.BUILD_VCS_NUMBER,build:e.BUILD_NUMBER,slug:e.TEAMCITY_BUILDCONF_NAME,...At({env:e,cwd:t})})},travis:{detect:({env:e})=>Boolean(e.TRAVIS),configuration({env:e}){const t="false"===e.TRAVIS_PULL_REQUEST?void 0:e.TRAVIS_PULL_REQUEST,r=Boolean(t);return{name:"Travis CI",service:"travis",commit:e.TRAVIS_COMMIT,tag:e.TRAVIS_TAG,build:e.TRAVIS_BUILD_NUMBER,buildUrl:e.TRAVIS_BUILD_WEB_URL,branch:e.TRAVIS_BRANCH,job:e.TRAVIS_JOB_NUMBER,jobUrl:e.TRAVIS_JOB_WEB_URL,pr:t,isPr:r,prBranch:e.TRAVIS_PULL_REQUEST_BRANCH,slug:e.TRAVIS_REPO_SLUG,root:e.TRAVIS_BUILD_DIR}}},vela:{detect:({env:e})=>Boolean(e.VELA),configuration({env:e}){const t="pull_request"===e.VELA_BUILD_EVENT;return{name:"Vela",service:"vela",branch:t?e.VELA_PULL_REQUEST_TARGET:e.VELA_BUILD_BRANCH,commit:e.VELA_BUILD_COMMIT,tag:e.VELA_BUILD_TAG,build:e.VELA_BUILD_NUMBER,buildUrl:e.VELA_BUILD_LINK,job:void 0,jobUrl:void 0,isPr:t,pr:e.VELA_BUILD_PULL_REQUEST,prBranch:e.VELA_PULL_REQUEST_SOURCE,slug:e.VELA_REPO_FULL_NAME,root:e.VELA_BUILD_WORKSPACE}}},vercel:{detect:({env:e})=>Boolean(e.VERCEL)||Boolean(e.NOW_GITHUB_DEPLOYMENT),configuration({env:e}){const t="Vercel",r="vercel";return e.VERCEL?{name:t,service:r,commit:e.VERCEL_GIT_COMMIT_SHA,branch:e.VERCEL_GIT_COMMIT_REF,slug:`${e.VERCEL_GIT_REPO_OWNER}/${e.VERCEL_GIT_REPO_SLUG}`}:{name:t,service:r,commit:e.NOW_GITHUB_COMMIT_SHA,branch:e.NOW_GITHUB_COMMIT_REF,slug:`${e.NOW_GITHUB_ORG}/${e.NOW_GITHUB_REPO}`}}},wercker:{detect:({env:e})=>Boolean(e.WERCKER_MAIN_PIPELINE_STARTED),configuration:({env:e})=>({name:"Wercker",service:"wercker",commit:e.WERCKER_GIT_COMMIT,build:e.WERCKER_MAIN_PIPELINE_STARTED,buildUrl:e.WERCKER_RUN_URL,branch:e.WERCKER_GIT_BRANCH,slug:`${e.WERCKER_GIT_OWNER}/${e.WERCKER_GIT_REPOSITORY}`,root:e.WERCKER_ROOT})},woodpecker:{detect:({env:e})=>e.CI&&"woodpecker"===e.CI,configuration({env:e}){const t="pull_request"===e.CI_PIPELINE_EVENT;return{name:"Woodpecker CI",service:"woodpecker",commit:e.CI_COMMIT_SHA,tag:e.CI_COMMIT_TAG,build:e.CI_PIPELINE_NUMBER,buildUrl:e.CI_PIPELINE_URL,branch:t?e.CI_COMMIT_TARGET_BRANCH:e.CI_COMMIT_BRANCH,job:e.CI_STEP_NUMBER,jobUrl:e.CI_STEP_URL,pr:e.CI_COMMIT_PULL_REQUEST,isPr:t,prBranch:t?e.CI_COMMIT_SOURCE_BRANCH:void 0,slug:`${e.CI_REPO_OWNER}/${e.CI_REPO_NAME}`,root:e.CI_WORKSPACE}}},jetbrainsSpace:{detect:({env:e})=>Boolean(e.JB_SPACE_EXECUTION_NUMBER),configuration({env:e}){const t=e.JB_SPACE_PROJECT_KEY,r=e.JB_SPACE_GIT_REPOSITORY_NAME;return{name:"JetBrains Space",service:"jetbrainsSpace",commit:e.JB_SPACE_GIT_REVISION,build:e.JB_SPACE_EXECUTION_NUMBER,branch:Y(e.JB_SPACE_GIT_BRANCH),slug:t&&r?`${t.toLowerCase()}/${r}`:void 0}}}},Pt=class e{git;config;snapshotTreeHash;snapshotIndexPath;constructor(e){this.config=e,this.git=f.simpleGit({baseDir:e.workingDir,maxConcurrentProcesses:1})}static createLocal({workingDir:t}){return new e({mode:"local",workingDir:t})}static createCloud({workingDir:t,baseBranch:r}){return new e({mode:"cloud",workingDir:t,baseBranch:r})}async captureSnapshot(){if("local"!==this.config.mode)return;this.snapshotIndexPath=r.join(a.tmpdir(),`git-diff-tracker-${h.randomUUID()}.index`),await this.git.env("GIT_INDEX_FILE",this.snapshotIndexPath).add(["-A"]);const e=await this.git.env("GIT_INDEX_FILE",this.snapshotIndexPath).raw(["write-tree"]);this.snapshotTreeHash=e.trim()}async computeDiff(){return"local"===this.config.mode?this.computeLocalDiff():this.computeCloudDiff()}async computeLocalDiff(){if(!this.snapshotTreeHash)throw new Error("No snapshot captured. Call captureSnapshot() first.");const e=r.join(a.tmpdir(),`git-diff-tracker-${h.randomUUID()}.index`);try{await this.git.env("GIT_INDEX_FILE",e).add(["-A"]);const t=(await this.git.env("GIT_INDEX_FILE",e).raw(["write-tree"])).trim();return await this.git.raw(["diff-tree","-p","--no-color",this.snapshotTreeHash,t])}finally{await Lt(e)}}async computeCloudDiff(){if("cloud"!==this.config.mode)throw new Error("computeCloudDiff called but mode is not cloud");const{baseBranch:e}=this.config;return await this.git.revparse([`origin/${e}`]).then(()=>!0).catch(()=>!1)||await this.git.fetch(["origin",`${e}:refs/remotes/origin/${e}`,"--depth","1","--quiet"]).catch(e=>{console.error("[git-diff-tracker] Failed to fetch base branch:",e)}),await this.git.diff([`origin/${e}`])}async cleanup(){this.snapshotIndexPath&&(await Lt(this.snapshotIndexPath),this.snapshotIndexPath=void 0),this.snapshotTreeHash=void 0}};async function Lt(e){try{await m.unlink(e)}catch{}}var Ot="x-stably-org-id",Bt={bodySerializer:e=>JSON.stringify(e,(e,t)=>"bigint"==typeof t?t.toString():t)},Nt=({allowReserved:e,explode:t,name:r,style:n,value:o})=>{if(!t){const t=(e?o:o.map(e=>encodeURIComponent(e))).join((e=>{switch(e){case"form":default:return",";case"pipeDelimited":return"|";case"spaceDelimited":return"%20"}})(n));switch(n){case"label":return`.${t}`;case"matrix":return`;${r}=${t}`;case"simple":return t;default:return`${r}=${t}`}}const s=(e=>{switch(e){case"label":return".";case"matrix":return";";case"simple":return",";default:return"&"}})(n),i=o.map(t=>"label"===n||"simple"===n?e?t:encodeURIComponent(t):Dt({allowReserved:e,name:r,value:t})).join(s);return"label"===n||"matrix"===n?s+i:i},Dt=({allowReserved:e,name:t,value:r})=>{if(null==r)return"";if("object"==typeof r)throw new Error("Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.");return`${t}=${e?r:encodeURIComponent(r)}`},kt=({allowReserved:e,explode:t,name:r,style:n,value:o,valueOnly:s})=>{if(o instanceof Date)return s?o.toISOString():`${r}=${o.toISOString()}`;if("deepObject"!==n&&!t){let t=[];Object.entries(o).forEach(([r,n])=>{t=[...t,r,e?n:encodeURIComponent(n)]});const s=t.join(",");switch(n){case"form":return`${r}=${s}`;case"label":return`.${s}`;case"matrix":return`;${r}=${s}`;default:return s}}const i=(e=>{switch(e){case"label":return".";case"matrix":return";";case"simple":return",";default:return"&"}})(n),a=Object.entries(o).map(([t,o])=>Dt({allowReserved:e,name:"deepObject"===n?`${r}[${t}]`:t,value:o})).join(i);return"label"===n||"matrix"===n?i+a:a},jt=/\{[^{}]+\}/g;function $t(e){const t=void 0!==e.body;return t&&e.bodySerializer?"serializedBody"in e?void 0!==e.serializedBody&&""!==e.serializedBody?e.serializedBody:null:""!==e.body?e.body:null:t?e.body:void 0}var Mt,Ht=async(e,t)=>{const r="function"==typeof t?await t(e):t;if(r)return"bearer"===e.scheme?`Bearer ${r}`:"basic"===e.scheme?`Basic ${btoa(r)}`:r},Gt=({parameters:e={},...t}={})=>r=>{const n=[];if(r&&"object"==typeof r)for(const o in r){const s=r[o];if(null==s)continue;const i=e[o]||t;if(Array.isArray(s)){const e=Nt({allowReserved:i.allowReserved,explode:!0,name:o,style:"form",value:s,...i.array});e&&n.push(e)}else if("object"==typeof s){const e=kt({allowReserved:i.allowReserved,explode:!0,name:o,style:"deepObject",value:s,...i.object});e&&n.push(e)}else{const e=Dt({allowReserved:i.allowReserved,name:o,value:s});e&&n.push(e)}}return n.join("&")},Ft=(e,t)=>!!t&&!!(e.headers.has(t)||e.query?.[t]||e.headers.get("Cookie")?.includes(`${t}=`)),Yt=e=>(({baseUrl:e,path:t,query:r,querySerializer:n,url:o})=>{let s=(e??"")+(o.startsWith("/")?o:`/${o}`);t&&(s=(({path:e,url:t})=>{let r=t;const n=t.match(jt);if(n)for(const t of n){let n=!1,o=t.substring(1,t.length-1),s="simple";o.endsWith("*")&&(n=!0,o=o.substring(0,o.length-1)),o.startsWith(".")?(o=o.substring(1),s="label"):o.startsWith(";")&&(o=o.substring(1),s="matrix");const i=e[o];if(null==i)continue;if(Array.isArray(i)){r=r.replace(t,Nt({explode:n,name:o,style:s,value:i}));continue}if("object"==typeof i){r=r.replace(t,kt({explode:n,name:o,style:s,value:i,valueOnly:!0}));continue}if("matrix"===s){r=r.replace(t,`;${Dt({name:o,value:i})}`);continue}const a=encodeURIComponent("label"===s?`.${i}`:i);r=r.replace(t,a)}return r})({path:t,url:s}));let i=r?n(r):"";return i.startsWith("?")&&(i=i.substring(1)),i&&(s+=`?${i}`),s})({baseUrl:e.baseUrl,path:e.path,query:e.query,querySerializer:"function"==typeof e.querySerializer?e.querySerializer:Gt(e.querySerializer),url:e.url}),zt=(e,t)=>{const r={...e,...t};return r.baseUrl?.endsWith("/")&&(r.baseUrl=r.baseUrl.substring(0,r.baseUrl.length-1)),r.headers=Wt(e.headers,t.headers),r},Kt=e=>{const t=[];return e.forEach((e,r)=>{t.push([r,e])}),t},Wt=(...e)=>{const t=new Headers;for(const r of e){if(!r)continue;const e=r instanceof Headers?Kt(r):Object.entries(r);for(const[r,n]of e)if(null===n)t.delete(r);else if(Array.isArray(n))for(const e of n)t.append(r,e);else void 0!==n&&t.set(r,"object"==typeof n?JSON.stringify(n):n)}return t},Vt=class{fns=[];clear(){this.fns=[]}eject(e){const t=this.getInterceptorIndex(e);this.fns[t]&&(this.fns[t]=null)}exists(e){const t=this.getInterceptorIndex(e);return Boolean(this.fns[t])}getInterceptorIndex(e){return"number"==typeof e?this.fns[e]?e:-1:this.fns.indexOf(e)}update(e,t){const r=this.getInterceptorIndex(e);return!!this.fns[r]&&(this.fns[r]=t,e)}use(e){return this.fns.push(e),this.fns.length-1}},qt=Gt({allowReserved:!1,array:{explode:!0,style:"form"},object:{explode:!0,style:"deepObject"}}),Jt={"Content-Type":"application/json"},Xt=(e={})=>({...Bt,headers:Jt,parseAs:"auto",querySerializer:qt,...e}),Qt=(e={})=>{let t=zt(Xt(),e);const r=()=>({...t}),n={error:new Vt,request:new Vt,response:new Vt},o=async e=>{const r={...t,...e,fetch:e.fetch??t.fetch??globalThis.fetch,headers:Wt(t.headers,e.headers),serializedBody:void 0};return r.security&&await(async({security:e,...t})=>{for(const r of e){if(Ft(t,r.name))continue;const e=await Ht(r,t.auth);if(!e)continue;const n=r.name??"Authorization";switch(r.in){case"query":t.query||(t.query={}),t.query[n]=e;break;case"cookie":t.headers.append("Cookie",`${n}=${e}`);break;default:t.headers.set(n,e)}}})({...r,security:r.security}),r.requestValidator&&await r.requestValidator(r),void 0!==r.body&&r.bodySerializer&&(r.serializedBody=r.bodySerializer(r.body)),void 0!==r.body&&""!==r.serializedBody||r.headers.delete("Content-Type"),{opts:r,url:Yt(r)}},s=async e=>{const{opts:t,url:r}=await o(e),s={redirect:"follow",...t,body:$t(t)};let i=new Request(r,s);for(const e of n.request.fns)e&&(i=await e(i,t));const a=t.fetch;let c;try{c=await a(i)}catch(e){let r=e;for(const o of n.error.fns)o&&(r=await o(e,void 0,i,t));if(r=r||{},t.throwOnError)throw r;return"data"===t.responseStyle?void 0:{error:r,request:i,response:void 0}}for(const e of n.response.fns)e&&(c=await e(c,i,t));const l={request:i,response:c};if(c.ok){const e=("auto"===t.parseAs?(e=>{if(!e)return"stream";const t=e.split(";")[0]?.trim();return t?t.startsWith("application/json")||t.endsWith("+json")?"json":"multipart/form-data"===t?"formData":["application/","audio/","image/","video/"].some(e=>t.startsWith(e))?"blob":t.startsWith("text/")?"text":void 0:void 0})(c.headers.get("Content-Type")):t.parseAs)??"json";if(204===c.status||"0"===c.headers.get("Content-Length")){let r;switch(e){case"arrayBuffer":case"blob":case"text":r=await c[e]();break;case"formData":r=new FormData;break;case"stream":r=c.body;break;default:r={}}return"data"===t.responseStyle?r:{data:r,...l}}let r;switch(e){case"arrayBuffer":case"blob":case"formData":case"json":case"text":r=await c[e]();break;case"stream":return"data"===t.responseStyle?c.body:{data:c.body,...l}}return"json"===e&&(t.responseValidator&&await t.responseValidator(r),t.responseTransformer&&(r=await t.responseTransformer(r))),"data"===t.responseStyle?r:{data:r,...l}}const u=await c.text();let d;try{d=JSON.parse(u)}catch{}const p=d??u;let f=p;for(const e of n.error.fns)e&&(f=await e(p,c,i,t));if(f=f||{},t.throwOnError)throw f;return"data"===t.responseStyle?void 0:{error:f,...l}},i=e=>t=>s({...t,method:e}),a=e=>async t=>{const{opts:r,url:s}=await o(t);return(({onRequest:e,onSseError:t,onSseEvent:r,responseTransformer:n,responseValidator:o,sseDefaultRetryDelay:s,sseMaxRetryAttempts:i,sseMaxRetryDelay:a,sseSleepFn:c,url:l,...u})=>{let d;const p=c??(e=>new Promise(t=>setTimeout(t,e))),f=async function*(){let c=s??3e3,f=0;const h=u.signal??(new AbortController).signal;for(;!h.aborted;){f++;const s=u.headers instanceof Headers?u.headers:new Headers(u.headers);void 0!==d&&s.set("Last-Event-ID",d);try{const t={redirect:"follow",...u,body:u.serializedBody,headers:s,signal:h};let i=new Request(l,t);e&&(i=await e(l,t));const a=u.fetch??globalThis.fetch,p=await a(i);if(!p.ok)throw new Error(`SSE failed: ${p.status} ${p.statusText}`);if(!p.body)throw new Error("No body in SSE response");const f=p.body.pipeThrough(new TextDecoderStream).getReader();let m="";const g=()=>{try{f.cancel()}catch{}};h.addEventListener("abort",g);try{for(;;){const{done:e,value:t}=await f.read();if(e)break;m+=t;const s=m.split("\n\n");m=s.pop()??"";for(const e of s){const t=e.split("\n"),s=[];let i,a;for(const e of t)if(e.startsWith("data:"))s.push(e.replace(/^data:\s*/,""));else if(e.startsWith("event:"))i=e.replace(/^event:\s*/,"");else if(e.startsWith("id:"))d=e.replace(/^id:\s*/,"");else if(e.startsWith("retry:")){const t=Number.parseInt(e.replace(/^retry:\s*/,""),10);Number.isNaN(t)||(c=t)}let l=!1;if(s.length){const e=s.join("\n");try{a=JSON.parse(e),l=!0}catch{a=e}}l&&(o&&await o(a),n&&(a=await n(a))),r?.({data:a,event:i,id:d,retry:c}),s.length&&(yield a)}}}finally{h.removeEventListener("abort",g),f.releaseLock()}break}catch(e){if(t?.(e),void 0!==i&&f>=i)break;const r=Math.min(c*2**(f-1),a??3e4);await p(r)}}}();return{stream:f}})({...r,body:r.body,headers:r.headers,method:e,onRequest:async(e,t)=>{let o=new Request(e,t);for(const e of n.request.fns)e&&(o=await e(o,r));return o},url:s})};return{buildUrl:Yt,connect:i("CONNECT"),delete:i("DELETE"),get:i("GET"),getConfig:r,head:i("HEAD"),interceptors:n,options:i("OPTIONS"),patch:i("PATCH"),post:i("POST"),put:i("PUT"),request:s,setConfig:e=>(t=zt(t,e),r()),sse:{connect:a("CONNECT"),delete:a("DELETE"),get:a("GET"),head:a("HEAD"),options:a("OPTIONS"),patch:a("PATCH"),post:a("POST"),put:a("PUT"),trace:a("TRACE")},trace:i("TRACE")}},Zt=Qt(Xt({baseUrl:"https://api.stably.ai"})),er="4.4.2",tr=process.env.STABLY_API_URL||"https://api.stably.ai",rr=process.env.AUTH_URL||"https://auth.stably.ai",nr=process.env.AUTH_CLIENT_ID||"288007877071cce81f269428ea78653a",or=process.env.AI_PROXY_URL||"https://ai-proxy.stably.ai",sr="http://localhost:9876/auth/callback",ir=()=>Mt||(Mt=Qt(Xt({baseUrl:tr,headers:{"X-STABLY-CLI-VERSION":er,"X-STABLY-SOURCE":"cli"}}))),ar=async(e,t)=>{const r=await(n={body:{accessToken:e,orgId:t},client:ir()},(n.client??Zt).post({url:"/internal/v1/cli/exchange-token",...n,headers:{"Content-Type":"application/json",...n.headers}}));var n;if(401===r.response.status)throw new Error("Invalid or expired access token");if(403===r.response.status)throw new Error("You do not have access to this organization");if(r.error)throw new Error(`Failed to exchange token: ${r.response.status}`);return r.data},cr=_.z.object({org_id:_.z.string(),org_name:_.z.string()}),lr=_.z.object({email:_.z.string(),org_id_to_org_member_info:_.z.record(_.z.string(),cr).optional(),org_member_info:cr.optional(),user_id:_.z.string()});_.z.object({email:_.z.string(),firstName:_.z.string().optional(),lastName:_.z.string().optional(),organizations:_.z.array(_.z.object({id:_.z.string(),name:_.z.string()})),userId:_.z.string()});var ur=e=>{const t=e.split(".");if(3!==t.length)throw new Error("Invalid JWT format");const r=t[1].replace(/-/g,"+").replace(/_/g,"/"),n=Buffer.from(r,"base64").toString("utf-8");return JSON.parse(n)},dr=e=>{try{const t=lr.parse(ur(e)),r=t.org_id_to_org_member_info?Object.entries(t.org_id_to_org_member_info).map(([e,t])=>({id:e,name:t.org_name})):t.org_member_info?[{id:t.org_member_info.org_id,name:t.org_member_info.org_name}]:[];return{email:t.email,organizations:r,userId:t.user_id}}catch(e){throw new Error(`Failed to decode token: ${e instanceof Error?e.message:"Unknown error"}`)}},pr=C.default.join(L.default.homedir(),".stably"),fr=C.default.join(pr,"auth.json"),hr=".stably",mr="project.json",gr=k.default.object({accessToken:k.default.string(),expiresAt:k.default.number(),idToken:k.default.string().optional(),refreshToken:k.default.string()}),yr=k.default.object({orgId:k.default.string(),orgName:k.default.string(),projectId:k.default.string(),projectName:k.default.string()}),_r=async()=>{try{const e=await m.readFile(fr,"utf-8");return gr.parse(JSON.parse(e))}catch{return}},br=async e=>{await m.mkdir(pr,{recursive:!0}),await m.writeFile(fr,JSON.stringify(e,null,2),{mode:384})},Er=async()=>{try{await m.unlink(fr)}catch{}},Ir=async e=>{let t=e;const{root:r}=C.default.parse(t);for(;t!==r;){const e=C.default.join(t,hr);try{return await m.access(e),e}catch{t=C.default.dirname(t)}}},wr=async()=>{try{const e=await Ir(process.cwd());if(!e)return;const t=C.default.join(e,mr),r=await m.readFile(t,"utf-8");return yr.parse(JSON.parse(r))}catch{return}},vr=async()=>{try{const e=await Ir(process.cwd());e&&await m.unlink(C.default.join(e,mr))}catch{}},Tr=e=>Date.now()>=e.expiresAt-3e5,Sr=async e=>{const t=new URLSearchParams({client_id:nr,grant_type:"refresh_token",refresh_token:e}),r=await fetch(`${rr}/propelauth/oauth/token`,{body:t.toString(),headers:{"Content-Type":"application/x-www-form-urlencoded"},method:"POST"});if(!r.ok)throw new Error(`Token refresh failed: ${r.status}`);const n=await r.json();return{accessToken:n.access_token,expiresAt:Date.now()+1e3*n.expires_in,refreshToken:n.refresh_token}},Rr=e=>`\n<!DOCTYPE html>\n<html>\n<head>\n <title>Authentication Failed Stably CLI</title>\n <style>\n * { box-sizing: border-box; }\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 100vh;\n margin: 0;\n background: #000;\n color: #fafafa;\n }\n .container {\n text-align: center;\n padding: 48px;\n max-width: 400px;\n }\n .icon {\n width: 48px;\n height: 48px;\n border-radius: 50%;\n background: #ef4444;\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0 auto 24px;\n }\n .icon svg { width: 24px; height: 24px; }\n .title {\n font-size: 24px;\n font-weight: 600;\n margin: 0 0 8px;\n letter-spacing: -0.5px;\n }\n .subtitle {\n color: #888;\n font-size: 14px;\n margin: 0 0 32px;\n line-height: 1.5;\n }\n .error-box {\n background: rgba(239, 68, 68, 0.1);\n border: 1px solid rgba(239, 68, 68, 0.3);\n border-radius: 8px;\n padding: 16px;\n margin-bottom: 24px;\n }\n .error-label {\n font-size: 11px;\n font-weight: 600;\n color: #ef4444;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 8px;\n }\n .error-message {\n font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;\n font-size: 13px;\n color: #fafafa;\n word-break: break-word;\n }\n .hint {\n color: #666;\n font-size: 13px;\n }\n .hint code {\n background: #111;\n border: 1px solid #333;\n border-radius: 4px;\n padding: 2px 6px;\n font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;\n font-size: 12px;\n color: #888;\n }\n .brand {\n margin-top: 32px;\n font-size: 12px;\n color: #444;\n letter-spacing: 0.5px;\n }\n </style>\n</head>\n<body>\n <div class="container">\n <div class="icon">\n <svg fill="none" stroke="#000" stroke-width="3" viewBox="0 0 24 24">\n <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/>\n </svg>\n </div>\n <h1 class="title">Authentication Failed</h1>\n <p class="subtitle">Something went wrong during login.</p>\n <div class="error-box">\n <div class="error-label">Error</div>\n <div class="error-message">${e}</div>\n </div>\n <p class="hint">Run <code>stably login</code> to try again.</p>\n <div class="brand">STABLY</div>\n </div>\n</body>\n</html>\n`,xr=(e,t,r)=>{e.writeHead(t,{"Content-Type":"text/html"}),e.end(r)},Cr=(e,t)=>{const r=new URLSearchParams({client_id:nr,code_challenge:e,code_challenge_method:"S256",redirect_uri:sr,response_type:"code",state:t});return`${rr}/propelauth/oauth/authorize?${r.toString()}`},Ar=async e=>{const t=g.spinner();let r;t.start("Loading user info...");try{r=dr(e.accessToken),t.stop(B.default.green(`✓ Logged in as ${B.default.cyan(r.email)}`))}catch(e){t.stop(B.default.red("✗ Failed to load user info"));const r=e instanceof Error?e.message:"Unknown error";return g.log.error(r),{success:!1}}const n=await(async e=>{if(0===e.length)return void g.log.error("You don't belong to any organizations.");if(1===e.length)return g.log.info(`Using organization: ${B.default.cyan(e[0].name)}`),e[0];if(!process.stdin.isTTY)return g.log.info(`Auto-selecting organization: ${B.default.cyan(e[0].name)}`),e[0];const t=await g.select({message:"Select an organization",options:[...e].sort((e,t)=>e.name.localeCompare(t.name)).map(e=>({label:e.name,value:e.id}))});return g.isCancel(t)?void 0:e.find(e=>e.id===t)})(r.organizations);if(!n)return g.log.warn("Organization selection cancelled."),{success:!1};let o;t.start("Getting org credentials...");try{const r=await ar(e.accessToken,n.id);o={accessToken:r.accessToken,expiresAt:Date.now()+1e3*r.expiresInSeconds,idToken:e.idToken,refreshToken:e.refreshToken},t.stop(B.default.green("✓ Credentials obtained"))}catch(e){t.stop(B.default.red("✗ Failed to get org credentials"));const r=e instanceof Error?e.message:"Unknown error";return g.log.error(r),{success:!1}}const s=await(async(e,t)=>{const r=g.spinner();let n;r.start("Loading projects...");try{n=await(async({accessToken:e,orgId:t})=>{const r=await(n={auth:e,client:ir(),path:{orgId:t}},(n.client??Zt).get({security:[{scheme:"bearer",type:"http"}],url:"/internal/v1/cli/orgs/{orgId}/projects",...n}));var n;if(401===r.response.status)throw new Error("Invalid or expired access token");if(403===r.response.status)throw new Error("You do not have access to this organization");if(r.error)throw new Error(`Failed to list projects: ${r.response.status}`);return r.data.projects})({accessToken:e,orgId:t}),r.stop(B.default.green("✓ Projects loaded"))}catch(e){r.stop(B.default.red("✗ Failed to load projects"));const t=e instanceof Error?e.message:"Unknown error";return void g.log.error(t)}if(0===n.length)return g.log.error("No projects found in this organization."),void g.log.info(`Create a project at ${B.default.underline(B.default.cyan("https://app.stably.ai"))}`);if(1===n.length)return g.log.info(`Using project: ${B.default.cyan(n[0].name)}`),n[0];if(!process.stdin.isTTY)return g.log.info(`Auto-selecting project: ${B.default.cyan(n[0].name)}`),n[0];const o=await g.select({message:"Select a project",options:n.map(e=>({label:e.name,value:e.id}))});return g.isCancel(o)?void 0:n.find(e=>e.id===o)})(o.accessToken,n.id);return s?(await(async e=>{const t=C.default.join(process.cwd(),hr),r=C.default.join(t,mr);await m.mkdir(t,{recursive:!0}),await m.writeFile(r,JSON.stringify(e,null,2)),await(async e=>{const t=C.default.join(e,".gitignore"),r="# Stably CLI (only docs/ are tracked)\n.stably/*\n!.stably/docs/";try{const e=await m.readFile(t,"utf-8"),n=e.split("\n").map(e=>e.trim());if(n.includes(".stably/*")&&n.includes("!.stably/docs/"))return;const o=/^# Stably CLI\n\.stably\/?$/m,s=/^\.stably\/?$/m;if(o.test(e)){const n=e.replace(o,`\n${r}\n`);await m.writeFile(t,n)}else if(s.test(e)){const n=e.replace(s,`\n${r}\n`);await m.writeFile(t,n)}else await m.appendFile(t,`\n${r}\n`)}catch{await m.writeFile(t,`${r}\n`)}})(process.cwd())})({orgId:n.id,orgName:n.name,projectId:s.id,projectName:s.name}),g.log.info(B.default.dim("Linked this directory to your Stably project.")),{scopedTokens:o,success:!0}):(g.log.warn("Project selection cancelled."),{success:!1})},Ur=async()=>{if(Jr())return g.log.warn(`Environment variables ${B.default.cyan("STABLY_API_KEY")} and ${B.default.cyan("STABLY_PROJECT_ID")} are set.`),g.log.warn("These will be used for authentication instead of OAuth login."),g.log.warn("To use OAuth login, unset these environment variables first."),void g.outro(B.default.yellow("Login skipped - using environment variable authentication."));const e=await _r();if(e){if(!Tr(e)){if(await wr())return void g.outro(B.default.yellow("You are already logged in. Run `stably logout` first to log out."));g.log.info("You are logged in but haven't selected a project yet.");const t=await Ar(e);return void(t.success?(await br(t.scopedTokens),g.outro(B.default.green("Setup complete! You can now use Stably CLI."))):g.outro(B.default.yellow("Setup incomplete. Run `stably login` to try again.")))}const t=g.spinner();t.start("Refreshing session...");try{const r=await Sr(e.refreshToken);t.stop(B.default.green("✓ Session refreshed"));const n=await wr();if(n){t.start("Getting org credentials...");try{const e=await ar(r.accessToken,n.orgId),o={accessToken:e.accessToken,expiresAt:Date.now()+1e3*e.expiresInSeconds,idToken:r.idToken,refreshToken:r.refreshToken};await br(o),t.stop(B.default.green("✓ Credentials obtained")),g.outro(B.default.green("Login successful"))}catch{await br(r),t.stop(B.default.yellow("Using full credentials")),g.outro(B.default.green("Login successful"))}}else{const e=await Ar(r);e.success?(await br(e.scopedTokens),g.outro(B.default.green("Setup complete! You can now use Stably CLI."))):g.outro(B.default.yellow("Setup incomplete. Run `stably login` to try again."))}return}catch{t.stop(B.default.yellow("Session expired, proceeding with fresh login...")),await Er(),await vr()}}const{authorizeUrl:t,waitForCallback:r}=(()=>{const{authorizeUrl:e,codeVerifier:t,state:r}=(()=>{const e=N.default.randomBytes(32).toString("base64url"),t=(r=e,N.default.createHash("sha256").update(r).digest("base64url"));var r;const n=N.default.randomBytes(16).toString("base64url");return{authorizeUrl:Cr(t,n),codeVerifier:e,state:n}})();return{authorizeUrl:e,waitForCallback:async()=>(async(e,t)=>{const r=await(n=e,new Promise((e,t)=>{const r=setTimeout(()=>{s.close(),e({error:"Login timed out",success:!1})},3e5),o=()=>{clearTimeout(r)},s=$.default.createServer((t,r)=>{const a=new i.URL(t.url||"","http://localhost:9876");if("/auth/callback"!==a.pathname)return r.writeHead(404),void r.end("Not found");const c=a.searchParams.get("code"),l=a.searchParams.get("state"),u=a.searchParams.get("error");return u?(xr(r,400,Rr(u)),o(),s.close(),void e({error:u,success:!1})):c&&l?l!==n?(xr(r,400,Rr("Invalid state parameter (possible CSRF attack)")),o(),s.close(),void e({error:"State mismatch",success:!1})):(xr(r,200,'\n<!DOCTYPE html>\n<html>\n<head>\n <title>Authenticated Stably CLI</title>\n <style>\n * { box-sizing: border-box; }\n body {\n font-family: -apple-system, BlinkMacSystemFont, \'Segoe UI\', Roboto, sans-serif;\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 100vh;\n margin: 0;\n background: #000;\n color: #fafafa;\n }\n .container {\n text-align: center;\n padding: 48px;\n max-width: 400px;\n }\n .icon {\n width: 48px;\n height: 48px;\n border-radius: 50%;\n background: #22c55e;\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0 auto 24px;\n }\n .icon svg { width: 24px; height: 24px; }\n .title {\n font-size: 24px;\n font-weight: 600;\n margin: 0 0 8px;\n letter-spacing: -0.5px;\n }\n .subtitle {\n color: #888;\n font-size: 14px;\n margin: 0 0 32px;\n line-height: 1.5;\n }\n .terminal {\n background: #111;\n border: 1px solid #333;\n border-radius: 8px;\n padding: 16px;\n text-align: left;\n font-family: \'SF Mono\', \'Fira Code\', \'Consolas\', monospace;\n font-size: 13px;\n }\n .terminal-header {\n display: flex;\n gap: 6px;\n margin-bottom: 12px;\n }\n .terminal-dot {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n background: #333;\n }\n .terminal-line {\n color: #888;\n }\n .terminal-line .prompt { color: #888; }\n .terminal-line .cmd { color: #fafafa; }\n .terminal-line.success { color: #22c55e; }\n .brand {\n margin-top: 32px;\n font-size: 12px;\n color: #444;\n letter-spacing: 0.5px;\n }\n </style>\n</head>\n<body>\n <div class="container">\n <div class="icon">\n <svg fill="none" stroke="#000" stroke-width="3" viewBox="0 0 24 24">\n <path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7"/>\n </svg>\n </div>\n <h1 class="title">Authenticated</h1>\n <p class="subtitle">You can close this tab and return to your terminal.</p>\n <div class="terminal">\n <div class="terminal-header">\n <div class="terminal-dot"></div>\n <div class="terminal-dot"></div>\n <div class="terminal-dot"></div>\n </div>\n <div class="terminal-line"><span class="prompt">$</span> <span class="cmd">stably login</span></div>\n <div class="terminal-line success">Logged in successfully</div>\n </div>\n <div class="brand">STABLY</div>\n </div>\n</body>\n</html>\n'),o(),s.close(),void e({code:c,state:l,success:!0})):(xr(r,400,Rr("Missing code or state parameter")),o(),s.close(),void e({error:"Missing code or state parameter",success:!1}))});s.on("error",e=>{o(),"EADDRINUSE"!==e.code?t(new Error(`Failed to start callback server: ${e.message}`)):t(new Error("Port 9876 is already in use. Please close the application using it and try again."))}),s.listen(9876)}));var n;if(!r.success)throw new Error(r.error);return(async(e,t)=>{const r=new URLSearchParams({client_id:nr,code:e,code_verifier:t,grant_type:"authorization_code",redirect_uri:sr}),n=await fetch(`${rr}/propelauth/oauth/token`,{body:r.toString(),headers:{"Content-Type":"application/x-www-form-urlencoded"},method:"POST"});if(!n.ok){const e=await n.text();throw new Error(`Token exchange failed: ${n.status} ${e}`)}const o=await n.json();return{accessToken:o.access_token,expiresAt:Date.now()+1e3*o.expires_in,idToken:o.id_token,refreshToken:o.refresh_token}})(r.code,t)})(r,t)}})();g.log.info("Opening browser for authentication..."),g.log.info(B.default.dim("If browser doesn't open, visit:")),g.log.info(B.default.underline(B.default.cyan(t)));try{await j.default(t)}catch{g.log.warn("Could not open browser automatically. Please open the URL above manually.")}const n=g.spinner();let o;n.start("Waiting for authentication...");try{o=await r(),n.stop(B.default.green("✓ Authentication successful"))}catch(e){n.stop(B.default.red("✗ Authentication failed"));const t=e instanceof Error?e.message:"Unknown error";g.outro(B.default.red(`Login failed: ${t}`)),process.exit(1)}const s=await Ar(o);s.success?(await br(s.scopedTokens),g.outro(B.default.green("Setup complete! You can now use Stably CLI."))):(g.outro(B.default.yellow("Setup incomplete. Run `stably login` to try again.")),process.exit(1))},Pr={fatal:60,error:50,warn:40,info:30,debug:20,trace:10},Lr=new Set(["help","login","logout","whoami","tunnel","create","fix","init","upgrade","test","show-report","codegen"]),Or=(new Date).toISOString().split("T")[0],Br=C.default.join(L.default.tmpdir(),"stably-logs",Or);P.default.mkdirSync(Br,{recursive:!0});var Nr,Dr=process.argv.includes("--verbose")||process.argv.includes("-v"),kr=process.env.STABLY_LOG_LEVEL?.toLowerCase(),jr=Dr?"debug":void 0!==(Nr=kr)&&Nr in Pr?kr:"warn",$r=Pr[jr],Mr=null,Hr=null,Gr=null,Fr=[],Yr=!1,zr=e=>{if(!Yr){Mr=(e=>{const t=(()=>{const e=new Date;return[e.getHours().toString().padStart(2,"0"),e.getMinutes().toString().padStart(2,"0"),e.getSeconds().toString().padStart(2,"0")].join("-")})(),r=((e,t=100)=>e.replace(/[/\\:*?"<>|]/g,"-").replace(/\s+/g,"-").replace(/[^a-zA-Z0-9\-_]/g,"").replace(/-+/g,"-").replace(/^-+|-+$/g,"").slice(0,t).toLowerCase()||"session")(e);return C.default.join(Br,`${t}-${r}.log`)})(e),(e=>{const t=["","=".repeat(60),"Stably CLI Debug Log",`Version: ${er}`,`Generated: ${(new Date).toISOString()}`,`Node: ${process.version}`,`Platform: ${process.platform} ${L.default.release()}`,`CWD: ${process.cwd()}`,`Args: ${process.argv.slice(2).join(" ")}`,`Log Level (console): ${jr}`,"=".repeat(60),""].join("\n");e.write(t)})(Hr=new H.default({dest:Mr,minLength:4096,sync:!1,append:!0})),Gr=M.default({level:"debug",timestamp:M.default.stdTimeFunctions.isoTime,base:{version:er}},Hr);for(const{level:e,msg:t,context:r}of Fr)r?Gr[e](r,t):Gr[e](t);Fr=[],Yr=!0,Dr&&process.stderr.write(`${B.default.dim(`Debug log: ${Mr}`)}\n\n`)}},Kr=(()=>{const e=process.argv.slice(2).find(e=>!e.startsWith("-"));return e&&Lr.has(e)?e:null})();Kr&&zr(Kr);var Wr=e=>(t,r)=>{if(Gr?r?Gr[e](r,t):Gr[e](t):Fr.push({level:e,msg:t,context:r}),(e=>Pr[e]>=$r)(e)){const r=((e,t)=>`${{fatal:B.default.bgRed(B.default.white(" FATAL ")),error:B.default.red("error"),warn:B.default.yellow("warn"),info:B.default.cyan("info"),debug:B.default.dim("debug"),trace:B.default.dim("trace")}[e]} ${t}`)(e,t);process.stderr.write(`${r}\n`)}},Vr={fatal:Wr("fatal"),error:Wr("error"),warn:Wr("warn"),info:Wr("info"),debug:Wr("debug"),trace:Wr("trace"),initSession:e=>{Yr||zr(e)},getLogFilePath:()=>Mr,flush:()=>{if(Hr)try{Hr.flushSync()}catch{}},printLogFileInfo:()=>{Mr&&(process.stderr.write(`\n${B.default.dim("Debug log written to:")}\n`),process.stderr.write(` ${B.default.cyan(Mr)}\n`),process.stderr.write(`${B.default.dim("Share this file with support for assistance.")}\n`))},getPinoLogger:()=>Gr};setInterval(()=>{Vr.flush()},3e4).unref(),process.on("beforeExit",()=>{Vr.flush()});var qr=e=>{const t=()=>{Vr.flush(),Dr&&Vr.printLogFileInfo(),process.removeListener(e,t),process.kill(process.pid,e)};return t};process.on("SIGINT",qr("SIGINT")),process.on("SIGTERM",qr("SIGTERM"));var Jr=()=>{const e=process.env.STABLY_API_KEY?.trim(),t=process.env.STABLY_PROJECT_ID?.trim();if(e&&t)return Vr.debug("Environment auth detected",{hasApiKey:!0,hasProjectId:!0}),{apiKey:e,projectId:t};Vr.debug("Environment auth not set",{hasApiKey:!!e,hasProjectId:!!t})},Xr=!1,Qr=()=>{Xr||(Xr=!0,g.log.warn("Both environment variable auth and stored OAuth login were detected."),g.log.warn(`Honoring environment variables (${B.default.cyan("STABLY_API_KEY")} + ${B.default.cyan("STABLY_PROJECT_ID")}).`),g.log.warn("To use OAuth login instead, unset those environment variables."))},Zr=async()=>{Vr.debug("Checking for stored auth tokens");const e=await _r();if(!e)return void Vr.debug("No stored auth tokens found");const t=Tr(e);if(Vr.debug("Auth tokens status",{expired:t}),!t){const t=await wr(),r=(e=>{try{const t=lr.parse(ur(e));if(t.org_id_to_org_member_info)return"full";if(t.org_member_info)return"org"}catch{return"unknown"}return"unknown"})(e.accessToken);if(Vr.debug("Token scope check",{scope:r,hasContext:!!t}),t&&"full"===r)try{Vr.debug("Exchanging full token for org-scoped token",{orgId:t.orgId});const r=await ar(e.accessToken,t.orgId),n={accessToken:r.accessToken,expiresAt:Date.now()+1e3*r.expiresInSeconds,idToken:e.idToken,refreshToken:e.refreshToken};return await br(n),Vr.debug("Token exchange successful"),n}catch(t){return Vr.debug("Token exchange failed, using existing token",{error:t instanceof Error?t.message:String(t)}),e}return e}try{Vr.debug("Attempting token refresh");const t=await Sr(e.refreshToken);Vr.debug("Token refresh successful");const r=await wr();if(r)try{Vr.debug("Exchanging refreshed token for org-scoped token");const e=await ar(t.accessToken,r.orgId),n={accessToken:e.accessToken,expiresAt:Date.now()+1e3*e.expiresInSeconds,idToken:t.idToken,refreshToken:t.refreshToken};return await br(n),n}catch{return await br(t),t}return await br(t),t}catch(e){return void Vr.warn("Token refresh failed",{error:e instanceof Error?e.message:String(e)})}},en=async(e={})=>{Vr.debug("Requiring authentication",{autoLogin:e.autoLogin});const t=Jr();if(t){Vr.info("Using environment variable authentication");try{await _r()&&Qr()}catch{}return{auth:t,type:"env"}}let r=await Zr(),n=r?await wr():void 0;const o=process.stdin.isTTY&&process.stdout.isTTY;if(Vr.debug("OAuth auth check",{hasTokens:!!r,hasContext:!!n,canPrompt:o}),(!r||!n)&&e.autoLogin&&o){Vr.info("Prompting user to login"),r?g.log.info("You are logged in but need to select an organization and project."):g.log.info("You are not logged in."),g.log.info("Press Enter to log in."),process.stdout.write(`${B.default.dim("Alternatively, set environment variables for an org API key:")}\n${B.default.dim(" STABLY_API_KEY=... STABLY_PROJECT_ID=... stably")}\n`),process.stdout.write("\n");const e=y.createInterface({input:process.stdin,output:process.stdout});try{await e.question(B.default.dim("Press Enter to continue... "))}finally{e.close()}await Ur(),r=await Zr(),n=r?await wr():void 0}return r||(Vr.warn("Authentication required but no tokens available"),g.outro(B.default.red("You are not logged in. Run `stably login` to authenticate.")),process.exit(1)),n||(Vr.warn("Authentication succeeded but no project context selected"),g.outro(B.default.red("You haven't selected an organization and project. Run `stably login` to complete setup.")),process.exit(1)),Vr.info("OAuth authentication successful",{orgId:n.orgId,projectId:n.projectId}),{auth:{accessToken:r.accessToken,context:n},type:"oauth"}},tn=e=>e?{...process.env,...e}:process.env,rn=async()=>{const e=Jr();if(e)return{STABLY_API_KEY:e.apiKey,STABLY_PROJECT_ID:e.projectId};const t=await(async()=>{const e=Jr();if(e){try{await _r()&&Qr()}catch{}return{auth:e,type:"env"}}const t=await Zr(),r=t?await wr():void 0;if(t&&r)return{auth:{accessToken:t.accessToken,context:r},type:"oauth"}})();if(!t||"env"===t.type)return;const r=process.env.STABLY_PROJECT_ID?.trim(),n=r||(e=>"env"===e.type?e.auth.projectId:e.auth.context.projectId)(t);if(!n)return;const o=await(async(e,t)=>{try{return(await(async({accessToken:e,projectId:t})=>{const r=await(n={auth:e,client:ir(),path:{projectId:t}},(n.client??Zt).post({security:[{scheme:"bearer",type:"http"}],url:"/internal/v1/cli/projects/{projectId}/api-key",...n}));var n;if(401===r.response.status)throw new Error("Invalid or expired access token");if(403===r.response.status)throw new Error("You do not have access to this project");if(r.error)throw new Error(`Failed to get API key: ${r.response.status}`);return r.data})({accessToken:e,projectId:t})).apiKey}catch{return e}})(t.auth.accessToken,n);return o?{STABLY_API_KEY:o,STABLY_PROJECT_ID:n}:void 0},nn=e=>e?{[Ot]:e}:void 0,on=_.z.object({context:_.z.string().min(1),autohealReportUrl:_.z.string()}),sn=v.z.object({bucket:v.z.string(),key:v.z.string()}),an=v.z.object({diffBucketPath:sn,expiresInSeconds:v.z.number(),key:v.z.string(),uploadUrl:v.z.string()}),cn=e=>{if(!e||"object"!=typeof e)return!1;const t=e;return"text"===t.type&&"string"==typeof t.text},ln=e=>null!=e&&"object"==typeof e&&"tool_response"in e,un=e=>{if(!e||"object"!=typeof e)return;const t=e;return Array.isArray(t.tool_response)?t.tool_response:void 0},dn=e=>{const t=un(e);if(t)return t.filter(cn).map(e=>e.text).join("\n")||void 0},pn=/\u001b\[[0-9;]*m/g,fn=e=>e.replace(pn,""),hn=/\$\{process\.env\.([A-Z_][A-Z0-9_]*)\}/g;function mn({envVars:e}){return async t=>{if(!function(e){return Boolean(e&&"object"==typeof e&&"tool_input"in e&&e.tool_input&&"object"==typeof e.tool_input)}(t))return{decision:"approve"};const r=t.tool_input,n="string"==typeof r.text?r.text:void 0;if(!n)return{decision:"approve"};const o=n.replace(hn,(t,r)=>{const n=e[r];return null!=n?n:t});return o===n?{decision:"approve"}:{decision:"approve",hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"allow",reason:"Evaluated environment variable placeholders in browser text input.",updatedInput:{...r,text:o}}}}}function gn({onResult:e}){return async t=>{if(!ln(t))return{decision:"approve"};const r=dn(t);if(!r)return{decision:"approve"};const n=function(e){const t=fn(e),r=t.split(/Running \d+ tests? using \d+ workers?/).at(-1)??t,n=parseInt(r.match(/(\d+)\s+passed/g)?.at(-1)?.match(/(\d+)/)?.[1]??"0"),o=parseInt(r.match(/(\d+)\s+failed/g)?.at(-1)?.match(/(\d+)/)?.[1]??"0");if(0===n&&0===o)return;const s=[n>0?`${n} test${1===n?"":"s"} passed ✓`:void 0,o>0?`${o} test${1===o?"":"s"} failed ✗`:void 0].filter(e=>void 0!==e).join(", ");if(0===o)return s;const i=r.split(/\n\s+\d+\)\s+\[id=/).slice(1).map(e=>e.match(/\n\s{4}((?:TimeoutError|Error|AssertionError):\s*[^\n]+)/)?.[1]?.trim()).filter(e=>void 0!==e);return 0===i.length?s:`${s}\n${i.map(e=>` - ${e}`).join("\n")}`}(r);return n&&e(n),{decision:"approve"}}}function yn({onResult:e}){return async t=>{if(!ln(t))return{decision:"approve"};const r=dn(t);if(!r)return{decision:"approve"};const n=function(e){const t=fn(e);if(t.match(/### Paused on error:/)){const e=t.match(/### Paused on error:\s*\n((?:TimeoutError|Error|AssertionError):\s*[^\n]+)/);return e?`Test paused on error - ${e[1].trim()}`:"Test paused on error"}const r=t.match(/(\d+)\s+passed/);if(r){const e=parseInt(r[1]);return`${e} test${1===e?"":"s"} passed ✓`}}(r);return n&&e(n),{decision:"approve"}}}var _n=/\.(spec|test)\.(ts|tsx|js|jsx|mts|mjs)$/;function bn({onFileCreated:e}){return async t=>{const r=(e=>{if(!e||"object"!=typeof e)return;const t=e;return t.tool_input&&"object"==typeof t.tool_input&&!Array.isArray(t.tool_input)?t.tool_input:void 0})(t),n=r?.file_path;return"string"==typeof n&&_n.test(n)&&e(n),{decision:"approve"}}}var En=l.promisify(n.exec);async function In(){try{const{stdout:e}=await En('pgrep -f "playwright run-test-mcp-server" 2>/dev/null || true'),t=e.trim();if(!t)return;const r=t.split("\n").filter(Boolean);await Promise.allSettled(r.map(async e=>{await En(`pkill -KILL -P ${e} '.*' 2>/dev/null || true`)}))}catch{}}var wn=null;function vn(){return e=>(wn&&clearTimeout(wn),wn=setTimeout(async()=>{await In(),wn=null},6e5),Promise.resolve({decision:"approve"}))}function Tn(){return e=>(wn&&(clearTimeout(wn),wn=null),Promise.resolve({decision:"approve"}))}function Sn(){wn&&(clearTimeout(wn),wn=null)}var Rn=class{queue=[];pendingResolve=void 0;done=!1;canSend=!0;[Symbol.asyncIterator](){return this}pushText(e){const t=e.trim();t&&!this.done&&(this.queue.push(t),this.maybeFlush())}allowNextTurn(){this.done||(this.canSend=!0,this.maybeFlush())}finish(){this.done=!0,this.pendingResolve&&(this.pendingResolve({done:!0,value:void 0}),this.pendingResolve=void 0)}maybeFlush(){if(!this.pendingResolve)return;if(!this.canSend)return;const e=this.queue.shift();if(void 0===e)return;const t={message:{content:[{text:e,type:"text"}],role:"user"},parent_tool_use_id:null,type:"user",session_id:""};this.canSend=!1,this.pendingResolve({done:!1,value:t}),this.pendingResolve=void 0}next(){return this.done?Promise.resolve({done:!0,value:void 0}):new Promise(e=>{this.pendingResolve=e,this.maybeFlush()})}},xn=[".ts",".js",".mts",".mjs",".cts",".cjs"],Cn=10240,An=async({defaultContent:e,fileName:t,filePath:r})=>{try{const e=(await m.stat(r)).size,n=await m.readFile(r,"utf-8"),o=Buffer.byteLength(n,"utf-8");if(o<=Cn)return n;const s=(e=>{const t=e.split("\n"),r=[];let n=!1,o=!1,s=0,i=!1;for(let e=0;e<t.length;e++){const a=t[e],c=a.trim();c.startsWith("/*")&&(n=!0),c.includes("*/")?n=!1:n||c.startsWith("//")&&!c.startsWith("///")||(c.startsWith("import ")||c.startsWith("export ")?(r.push(a),i=!0):i&&""===c?(r.push(a),i=!1):(i=!1,c.startsWith("type ")||c.startsWith("interface ")?r.push(a):c.startsWith("function ")||c.startsWith("const ")||c.startsWith("async function ")||c.startsWith("export function ")||c.startsWith("export const ")||c.startsWith("test.describe(")||c.startsWith("test(")?(r.push(a),o=!0,s=(a.match(/{/g)||[]).length-(a.match(/}/g)||[]).length,0===s&&(c.endsWith(";")||c.endsWith(","))&&(o=!1)):o?(s+=(a.match(/{/g)||[]).length,s-=(a.match(/}/g)||[]).length,0===s&&c.includes("}")?(r.push(a),o=!1):s>0&&" // ... implementation omitted ..."!==r.at(-1)&&r.push(" // ... implementation omitted ...")):c.match(/^[a-zA-Z_]+:/)&&r.push(a)))}return r.join("\n")})(n),i=Buffer.byteLength(s,"utf-8");return i<=Cn?s:s.slice(0,Cn)+`\n\n... [TRUNCATED: File "${t}" at ${r} was ${e} bytes (${o} bytes as UTF-8), reduced to ~${i} bytes of essential content, then truncated to 10240 bytes] ...`}catch(r){let n;if(r&&"object"==typeof r&&"code"in r){const e=r.code;"string"==typeof e&&(n=e)}return"ENOENT"!==n&&console.warn(`Failed to read ${t}: ${r}`),e}},Un=async({defaultContent:e,dirName:t,dirPath:r})=>{try{const e=await m.readdir(r);return e.length>0?e.join("\n"):"(empty)"}catch(r){let n;if(r&&"object"==typeof r&&"code"in r){const e=r.code;"string"==typeof e&&(n=e)}return"ENOENT"!==n&&console.warn(`Failed to read ${t}: ${r}`),e}},Pn=async({allowedEnvVars:e,mode:t,workspaceInfo:r,authHeader:o,customHeader:s})=>{const i=ir(),a=function(e){try{const t=n.execSync("git branch --show-current",{cwd:e,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();if(!t)return;return{branch:t}}catch{return}}(r.absolutePath);Vr.debug("Requesting system prompt from API",{mode:t,hasGitContext:!!a,envVarCount:e.length});const c=await(l={client:i,auth:o,body:{mode:t,workspaceInfo:r,allowedEnvVars:e,gitContext:a}},(l.client??Zt).post({security:[{scheme:"bearer",type:"http"}],url:"/internal/v1/cli/prompts/system",...l,headers:{"Content-Type":"application/json",...l.headers}}));var l;if(401===c.response.status)throw Vr.warn("System prompt fetch failed: unauthorized (401)"),await Er(),new Error("Your session has expired or been revoked. Credentials have been cleared. Please run `stably login` to re-authenticate.");if(403===c.response.status)throw Vr.warn("System prompt fetch failed: forbidden (403)"),await Er(),new Error("You no longer have access to this organization. Credentials have been cleared. Please run `stably login` to re-authenticate.");if(c.error)throw Vr.warn("System prompt fetch failed",{error:c.error}),new Error(`Failed to fetch system prompt: ${JSON.stringify(c.error)}`);const u=function({customHeader:e,systemPrompt:t}){return e?`${t}\n\nWhen writing or updating the generated test file, prepend this exact header at the top of the file without modification:\n\`\`\`ts\n${e}\n\`\`\``:t}({systemPrompt:c.data.systemPrompt,customHeader:s});return Vr.debug("System prompt received",{size:u.length,appendedCustomHeader:!!s}),u},Ln=".stably-playwright-wrapper.config.*",On=[".ts",".js",".mts",".mjs",".cts",".cjs"];function Bn(e){const t=r.resolve(e);if(s.existsSync(t))for(const e of On){const n=r.join(t,`playwright.config${e}`);if(s.existsSync(n))return n}}var Nn=["tests","e2e","__tests__","test"];function Dn(e){try{return s.existsSync(e)&&s.statSync(e).isDirectory()}catch{return!1}}function kn(e,t){const r="output-flag"===t?"--output flag":"playwright.config.ts"===t?"playwright.config.ts":"auto-detected"===t?"auto-detected":"cwd fallback";console.error(B.default.dim(`Using output directory: ${e} (from ${r})`))}var jn=["mcp__playwright-test__","mcp__auto-heal-report__","mcp__test-doc-sync__","mcp__stably-agent-control__"],$n=["planner_","generator_"],Mn={"mcp__stably-agent-control__restart_mcp_servers":"Restarting Browser Tools"},Hn=(e,t)=>{const r=t.find(t=>e.startsWith(t));return r?e.slice(r.length):e},Gn=e=>{const t=Mn[e];if(t)return t;const r=Hn(e,jn);return Hn(r,$n).split("_").map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join(" ")},Fn=(e,t)=>{if(!t||"object"!=typeof t)return;const r=t,n="string"==typeof r.intent?r.intent:void 0;if("Read"!==e&&"Write"!==e&&"Edit"!==e){if("Glob"===e||"Grep"===e)return"string"==typeof r.pattern?r.pattern:void 0;if("mcp__playwright-test__test_run"!==e&&"test_run"!==e){if("mcp__playwright-test__test_debug"===e||"test_debug"===e){const e=r.test;return"string"==typeof e?.title?e.title:void 0}return"mcp__playwright-test__generator_setup_page"===e||"generator_setup_page"===e?"string"==typeof r.seedFile?r.seedFile:"tests/seed.spec.ts":"mcp__playwright-test__generator_write_test"===e||"generator_write_test"===e?"string"==typeof r.fileName?r.fileName:void 0:"Bash"===e?"string"==typeof r.command?r.command.length>50?`${r.command.slice(0,50)}...`:r.command:void 0:e.includes("browser_navigate")&&!e.includes("back")?"string"==typeof r.url?r.url:n:e.includes("browser_type")?("string"==typeof r.text?`"${r.text}"`:void 0)??n:e.includes("browser_click")?"string"==typeof r.element?r.element:n:e.includes("browser_wait_for")?"string"==typeof r.text?`text: "${r.text}"`:"number"==typeof r.time?`${r.time}ms`:n:e.includes("verify_text")?"string"==typeof r.text?`"${r.text}"`:n:e.includes("verify_element")?"string"==typeof r.accessibleName?r.accessibleName:n:e.includes("screenshot")&&"string"==typeof r.filename?r.filename:n}if(Array.isArray(r.locations)){const e=r.locations.filter(e=>"string"==typeof e);return e.length>0?e.join(", "):void 0}}else if("string"==typeof r.file_path)return r.file_path.split("/").at(-1)??void 0},Yn=["test","bug","other"],zn={bug:"Application code defect; behavior diverges from expected requirements.",other:"External dependencies, environment, or infra issues outside test/app code.",test:"Test code is incorrect, out-of-date, or missing necessary setup."},Kn=e=>zn[e],{zSuiteAutoHealReport:Wn}=function(e){const t=e.enum(Yn),r=["Classification of the root cause:","",`- test: ${Kn("test")}`,`- bug: ${Kn("bug")}`,`- other: ${Kn("other")}`].join("\n"),n=e.object({erroredUrl:e.string().optional(),issueType:t.describe(r),relatedTestCaseIds:e.array(e.string()).min(1).describe("List of ALL test case IDs impacted by this root cause and fix (must be existing IDs only)."),rootCause:e.string().describe("Brief explanation of what happened (1-2 sentences).")}),o=e.discriminatedUnion("result",[n.extend({fixApplied:e.string().describe("What fix was applied (brief, specific)."),result:e.literal("fixed")}),n.extend({followUpActions:e.string().optional().describe("Optional list of follow-up actions for any unfixed issues or missing data."),reasonNotFixed:e.string().describe("Why it could not be auto-fixed (brief)."),result:e.literal("unfixed")})]);return{zAutoHealReport:o,zIssueCategory:t,zSuiteAutoHealReport:e.object({issues:e.array(o).min(1).describe("List of all auto-heal issues/outcomes for this suite."),summary:e.string().min(3).describe("High-level summary (2-3 sentences) of the suite auto-heal results.")})}}(v.z),Vn=({authHeader:e,diffTracker:t,orgId:r,runId:n})=>u.createSdkMcpServer({name:"auto-heal-report",tools:[u.tool("generate-report",["After attempting to fix all broken tests (skip only those truly infeasible), generate and return a suite auto-heal report in the required schema.","","Ensure the payload matches zSuiteAutoHealReport exactly; include every issue discovered."].join("\n"),{report:Wn},async({report:o})=>{const s=await t.computeDiff(),i=Wn.parse(o);try{await(async({authHeader:e,orgId:t,report:r,runId:n})=>{const o=await(s={auth:e,body:{report:JSON.stringify(r)},client:ir(),headers:nn(t),path:{runId:n}},(s.client??Zt).post({security:[{scheme:"bearer",type:"http"}],url:"/internal/v1/cli/runs/{runId}/autoheal-report",...s,headers:{"Content-Type":"application/json",...s.headers}}));var s;if(o.error)throw new Error(`Failed to upload auto-heal report (${o.response.status})`)})({authHeader:e,orgId:r,report:i,runId:n});const{uploadUrl:t}=await(async({authHeader:e,contentType:t="text/plain",orgId:r,runId:n})=>{const o=await(s={auth:e,body:{contentType:t},client:ir(),headers:nn(r),path:{runId:n}},(s.client??Zt).post({security:[{scheme:"bearer",type:"http"}],url:"/internal/v1/cli/runs/{runId}/autoheal-diff/upload-url",...s,headers:{"Content-Type":"application/json",...s.headers}}));var s;if(o.error)throw new Error(`Failed to presign diff upload (${o.response.status})`);const i=an.parse(o.data);return{diffBucketPath:i.diffBucketPath,expiresInSeconds:i.expiresInSeconds,key:i.key,uploadUrl:i.uploadUrl}})({authHeader:e,contentType:"text/plain",orgId:r,runId:n});await(async({contentType:e="text/plain",diff:t,uploadUrl:r})=>{const n=await fetch(r,{body:t,headers:{"Content-Type":e},method:"PUT"});if(!n.ok)throw new Error(`Failed to upload diff (${n.status})`)})({contentType:"text/plain",diff:s,uploadUrl:t})}catch(e){return console.error("[auto-heal-report] Failed to upload report or diff:",e),{content:[{text:"Error: Failed to upload auto-heal report or diff. Please surface this to the user, and terminate the session.",type:"text"}]}}return{content:[{text:"Auto-heal report generated. You may terminate this session now.",type:"text"}]}})],version:"0.0.1"}),qn=({onComplete:e})=>u.createSdkMcpServer({name:"session-control",tools:[u.tool("complete_session",["Call this tool when you have completed your task and the session should end.","Use this instead of waiting for the user to manually terminate.","Only call this when you are confident the task is fully complete."].join("\n"),{summary:v.z.string().describe("A brief summary of what was accomplished")},async({summary:t})=>{const r=t;return e(),`Session complete: ${r}`})]}),Jn=e=>e.replace(/Bearer\s+[A-Za-z0-9._-]+/gi,"Bearer [redacted]").replace(/\bsk-[A-Za-z0-9_-]{16,}\b/g,"[redacted]").replace(/\bstably_[A-Za-z0-9_-]{16,}\b/g,"[redacted]"),Xn=(e,t)=>({message:Jn(e),status:t?.status,statusText:t?.statusText}),Qn=new Set(["ANTHROPIC_API_KEY","ANTHROPIC_AUTH_TOKEN","ANTHROPIC_CUSTOM_HEADERS","ANTHROPIC_DEFAULT_HAIKU_MODEL","ANTHROPIC_DEFAULT_OPUS_MODEL","ANTHROPIC_DEFAULT_SONNET_MODEL","ANTHROPIC_FOUNDRY_API_KEY","ANTHROPIC_MODEL","ANTHROPIC_SMALL_FAST_MODEL","ANTHROPIC_SMALL_FAST_MODEL_AWS_REGION","AWS_BEARER_TOKEN_BEDROCK","BASH_DEFAULT_TIMEOUT_MS","BASH_MAX_OUTPUT_LENGTH","BASH_MAX_TIMEOUT_MS","CLAUDE_BASH_MAINTAIN_PROJECT_WORKING_DIR","CLAUDE_CODE_API_KEY_HELPER_TTL_MS","CLAUDE_CODE_CLIENT_CERT","CLAUDE_CODE_CLIENT_KEY_PASSPHRASE","CLAUDE_CODE_CLIENT_KEY","CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS","CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC","CLAUDE_CODE_DISABLE_TERMINAL_TITLE","CLAUDE_CODE_IDE_SKIP_AUTO_INSTALL","CLAUDE_CODE_MAX_OUTPUT_TOKENS","CLAUDE_CODE_SHELL_PREFIX","CLAUDE_CODE_SKIP_BEDROCK_AUTH","CLAUDE_CODE_SKIP_FOUNDRY_AUTH","CLAUDE_CODE_SKIP_VERTEX_AUTH","CLAUDE_CODE_SUBAGENT_MODEL","CLAUDE_CODE_USE_BEDROCK","CLAUDE_CODE_USE_FOUNDRY","CLAUDE_CODE_USE_VERTEX","CLAUDE_CONFIG_DIR","DISABLE_AUTOUPDATER","DISABLE_BUG_COMMAND","DISABLE_COST_WARNINGS","DISABLE_ERROR_REPORTING","DISABLE_NON_ESSENTIAL_MODEL_CALLS","DISABLE_PROMPT_CACHING","DISABLE_PROMPT_CACHING_HAIKU","DISABLE_PROMPT_CACHING_OPUS","DISABLE_PROMPT_CACHING_SONNET","DISABLE_TELEMETRY","HTTP_PROXY","HTTPS_PROXY","MAX_MCP_OUTPUT_TOKENS","MAX_THINKING_TOKENS","MCP_TIMEOUT","MCP_TOOL_TIMEOUT","NO_PROXY","SLASH_COMMAND_TOOL_CHAR_BUDGET","USE_BUILTIN_RIPGREP","VERTEX_REGION_CLAUDE_3_5_HAIKU","VERTEX_REGION_CLAUDE_3_7_SONNET","VERTEX_REGION_CLAUDE_4_0_OPUS","VERTEX_REGION_CLAUDE_4_0_SONNET","VERTEX_REGION_CLAUDE_4_1_OPUS"]),Zn=async({authHeader:e,mode:t,maxTurnsOverride:r})=>{const n=ir();Vr.debug("Requesting subagent definitions from API",{mode:t,maxTurnsOverride:r});const o=await(s={client:n,auth:e,body:{mode:t,maxTurnsOverride:r}},(s.client??Zt).post({security:[{scheme:"bearer",type:"http"}],url:"/internal/v1/cli/prompts/subagents",...s,headers:{"Content-Type":"application/json",...s.headers}}));var s;if(401===o.response.status)throw Vr.warn("Subagent definitions fetch failed: unauthorized (401)"),await Er(),new Error("Your session has expired or been revoked. Credentials have been cleared. Please run `stably login` to re-authenticate.");if(403===o.response.status)throw Vr.warn("Subagent definitions fetch failed: forbidden (403)"),await Er(),new Error("You no longer have access to this organization. Credentials have been cleared. Please run `stably login` to re-authenticate.");if(o.error)throw Vr.warn("Subagent definitions fetch failed",{error:o.error}),new Error(`Failed to fetch subagent definitions: ${JSON.stringify(o.error)}`);const{subagents:i}=o.data;return Vr.debug("Subagent definitions received",{count:Object.keys(i).length}),i},eo=["Bash","Read","Write","Edit","Glob","Grep","Task"],to=["Task","mcp__playwright-test"],ro=["Bash","Read","Write","Edit","Glob","Grep","mcp__session-control"],no=e=>{if("EPIPE"!==e.code)throw e},oo=async e=>{if("single"===e.mode||"build"===e.mode){const t=Array.isArray(e.prompt)?e.prompt.join(" "):e.prompt;Vr.initSession(t||"create-from-diff")}else"fix"===e.mode&&Vr.initSession(`fix-${e.runId}`);Vr.info("Agent session starting",{mode:e.mode}),process.stdout.on("error",no),process.stderr.on("error",no);const t=e=>{if("EPIPE"!==e.code)throw e};process.on("uncaughtException",t),Vr.debug("Checking authentication");const n=await en({autoLogin:"chat"===e.mode||"init"===e.mode}),o=(e=>"env"===e.type?e.auth.apiKey:e.auth.accessToken)(n);Vr.debug("Authentication resolved",{authType:n.type});const i="oauth"===n.type?n.auth.context.orgId:void 0,a=C.default.resolve(process.cwd()),c=C.default.join(a,".env"),l=P.default.existsSync(c)&&P.default.statSync(c).isFile(),p=l?d.parse(P.default.readFileSync(c,"utf8")):{};Vr.debug("Environment file",{path:c,exists:l,variableCount:Object.keys(p).length});const f="chat"!==e.mode&&"init"!==e.mode,h="chat"===e.mode||"init"===e.mode?new Rn:void 0,g="chat"===e.mode?e.getHelpText:void 0,y={log:[],promptDisplay:"chat"===e.mode?"Ask Stably to build tests for you":"init"===e.mode?"Setting up Playwright and Stably SDK":"fix"===e.mode?"Fixing broken tests":(Array.isArray(e.prompt)?e.prompt.join(" "):e.prompt)?.trim()||"Creating tests from PR/branch changes",status:"running"};let _,b=f,E=!1;const I=new Map;let w=null,v=!1,R=!1;const x=async t=>{if("fix"===e.mode){if("STARTED"===t){if(v)return;v=!0}else{if(R)return;R=!0}try{await(async({authHeader:e,orgId:t,runId:r,status:n})=>{const o=await(s={auth:e,body:{status:n},client:ir(),headers:nn(t),path:{runId:r}},(s.client??Zt).post({security:[{scheme:"bearer",type:"http"}],url:"/internal/v1/cli/runs/{runId}/autoheal-status",...s,headers:{"Content-Type":"application/json",...s.headers}}));var s;if(o.error)throw new Error(`Failed to update autoheal status (${o.response.status})`)})({authHeader:o,orgId:i,runId:e.runId,status:t})}catch{}}},A={current:e=>{}},U={current:async()=>{}},{addSubagentActivity:L,addSubagentStart:O,addTool:N,addToolResult:D,appendText:k,appendUserMessage:j,cleanup:$,setExiting:M,setStatus:H,setSubagentStatus:G}=await(async(e,t)=>{const{Box:r,Static:n,Text:o,render:s,useInput:i}=await import("ink"),a=!!process.stdin.isTTY,c=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],l=()=>S.jsx(o,{inverse:!0,children:" "}),u=(({Box:e,Text:t,useInput:r},n,o)=>function({onChoice:s,prompt:i}){const[a,c]=T.useState(0),[l,u]=T.useState(!1),[d,p]=T.useState(""),f=[{label:"Yes, allow this once",value:"allow"},{label:"Yes, always allow for this session",value:"always"},{label:"No, tell AI what to do differently",value:"deny_with_message"}];r((e,t)=>{if(l)return t.return?void s("deny_with_message",d||"User denied this action"):t.escape?(u(!1),void p("")):t.backspace||t.delete?void p(e=>e.slice(0,-1)):void(t.ctrl||t.meta||p(t=>`${t}${e}`));if(t.upArrow)return void c(e=>e>0?e-1:f.length-1);if(t.downArrow)return void c(e=>e<f.length-1?e+1:0);if(t.return){const e=f[a];return"deny_with_message"===e.value?void u(!0):void s(e.value)}const r=parseInt(e,10);if(r>=1&&r<=f.length){const e=f[r-1];if("deny_with_message"===e.value)return void u(!0);s(e.value)}},{isActive:o});const h=Gn(i.toolName),m=Fn(i.toolName,i.input);return S.jsxs(e,{borderColor:"yellow",borderStyle:"round",flexDirection:"column",marginTop:1,paddingX:1,paddingY:0,children:[S.jsx(t,{bold:!0,color:"yellow",children:"Permission Required"}),S.jsxs(e,{flexDirection:"column",marginTop:1,children:[S.jsx(t,{color:"magenta",children:h}),null!=m&&S.jsxs(t,{color:"gray",children:[" ",m]})]}),null!=i.decisionReason&&S.jsx(e,{marginTop:1,children:S.jsxs(t,{color:"gray",children:["Reason: ",i.decisionReason]})}),l?S.jsxs(e,{flexDirection:"column",marginTop:1,children:[S.jsx(t,{color:"gray",children:"Enter message for AI (press Enter to submit, Esc to cancel):"}),S.jsxs(t,{children:[S.jsx(t,{color:"yellow",children:">"})," ",d,S.jsx(n,{})]})]}):S.jsxs(e,{flexDirection:"column",marginTop:1,children:[S.jsx(t,{color:"gray",children:"Use ↑↓ arrows or number keys to select:"}),f.map((e,r)=>S.jsx(t,{children:S.jsxs(t,{color:r===a?"cyan":void 0,children:[r===a?"❯":" "," ",r+1,". ",e.label]})},e.value))]})]})})({Box:r,Text:o,useInput:i},l,a),d=(({Cursor:e,inkComponents:{Box:t,Static:r,Text:n,useInput:o},isRawModeSupported:s,PermissionPrompt:i,Spinner:a})=>{const c=e=>{if("subagent"===e.kind&&e.subagent){const{subagent:r}=e,o="complete"===r.status?"green":"error"===r.status?"red":"yellow";return S.jsxs(t,{flexDirection:"column",marginTop:1,children:[S.jsxs(n,{children:[S.jsx(n,{color:o,bold:!0,children:"Agent"}),r.description?S.jsxs(n,{color:"gray",children:[" (",r.description,")"]}):null]}),r.activities.length>0&&S.jsx(t,{flexDirection:"column",marginLeft:2,children:r.activities.map(e=>(e=>"tool"===e.kind?S.jsxs(n,{color:"magenta",children:["• ",e.content]},e.id):"tool_result"===e.kind?S.jsx(n,{color:"gray",children:e.content},e.id):null)(e))})]},e.id)}return"tool"===e.kind?S.jsxs(n,{color:"magenta",children:["• ",e.content]},e.id):"tool_result"===e.kind?S.jsx(n,{color:"gray",children:e.content},e.id):"user"===e.kind?S.jsxs(n,{color:"cyan",children:["You: ",e.content]},e.id):S.jsx(n,{children:e.content},e.id)},l="vscode"===process.env.TERM_PROGRAM,u=(e,t)=>{if(t<=0)return 0;let r=t-1;for(;r>0&&/\s/.test(e[r]);)r--;for(;r>0&&!/\s/.test(e[r-1]);)r--;return r},d=(e,t)=>{if(t>=e.length)return e.length;let r=t;for(;r<e.length&&!/\s/.test(e[r]);)r++;for(;r<e.length&&/\s/.test(e[r]);)r++;return r},p=(e,t)=>{if(t<=0)return 0;const r=e.lastIndexOf("\n",t-1);return-1===r?0:r+1},f=(e,t)=>{const r=e.indexOf("\n",t);return-1===r?e.length:r};return function({onExit:h,onPermissionChoice:m,onSend:g,showSpinnerImmediately:y,state:_}){const[b,E]=T.useState({value:"",cursor:0}),I=b.value,w=b.cursor,v=T.useRef(!1),R=T.useRef(void 0),[x,C]=T.useState(!1),A=T.useRef(0),U=_.log.at(-1),P="text"===U?.kind&&"running"===_.status,L=_.log.findIndex(e=>"subagent"===e.kind&&"running"===e.subagent?.status),O=l?0:-1!==L?L:P?_.log.length-1:_.log.length;T.useEffect(()=>{_.log.length<A.current&&(A.current=0),O>A.current&&(A.current=O)},[_.log.length,O]);const B=_.log.slice(0,A.current),N=_.log.slice(A.current),D=!!_.permissionPrompt,k=T.useCallback(async()=>{v.current?(R.current&&clearTimeout(R.current),await(h?.()),process.exit(0)):(v.current=!0,C(!0),R.current=setTimeout(()=>{v.current=!1,C(!1)},2e3))},[h]);o((e,t)=>{t.ctrl&&"c"===e&&k().catch(()=>process.exit(1))},{isActive:s}),T.useEffect(()=>{if(D||!g)return;const e=e=>{const t=e.toString();""!==t&&"[1;5~"!==t?""!==t&&"[4;5~"!==t?""!==t&&"[1~"!==t&&"OH"!==t&&"[7~"!==t?""!==t&&"[4~"!==t&&"OF"!==t&&"[8~"!==t||E(e=>({...e,cursor:f(e.value,e.cursor)})):E(e=>({...e,cursor:p(e.value,e.cursor)})):E(e=>({...e,cursor:e.value.length})):E(e=>({...e,cursor:0}))};return process.stdin.on("data",e),()=>{process.stdin.off("data",e)}},[D,g,I]),o((e,t)=>{if(!t.ctrl||"c"!==e){if(t.return){const e=I.trim();return e&&g?.(e),void E({value:"",cursor:0})}t.ctrl&&"w"===e||t.ctrl&&t.backspace?E(e=>{const t=u(e.value,e.cursor);return{value:e.value.slice(0,t)+e.value.slice(e.cursor),cursor:t}}):!t.backspace&&!t.delete||t.ctrl?t.ctrl&&t.leftArrow||t.meta&&"b"===e?E(e=>({...e,cursor:u(e.value,e.cursor)})):t.ctrl&&t.rightArrow||t.meta&&"f"===e?E(e=>({...e,cursor:d(e.value,e.cursor)})):t.leftArrow?E(e=>({...e,cursor:Math.max(0,e.cursor-1)})):t.rightArrow?E(e=>({...e,cursor:Math.min(e.value.length,e.cursor+1)})):t.ctrl&&"a"===e?E(e=>({...e,cursor:0})):t.ctrl&&"e"===e?E(e=>({...e,cursor:e.value.length})):!e||t.ctrl||t.meta||t.escape||e.includes("")||/^\[./.test(e)||/^O[A-D]$/.test(e)||E(t=>({value:t.value.slice(0,t.cursor)+e+t.value.slice(t.cursor),cursor:t.cursor+e.length})):E(e=>e.cursor>0?{value:e.value.slice(0,e.cursor-1)+e.value.slice(e.cursor),cursor:e.cursor-1}:e)}},{isActive:s&&!!g&&!D});const j=T.useMemo(()=>"running"===_.status?S.jsx(a,{label:"Working"}):"success"!==_.status?S.jsx(n,{color:"red",children:"✖ Failed"}):void 0,[_.status]),$=!(y||!g||"running"!==_.status||0!==_.log.length||_.resultText||_.errorText),M="running"===_.status&&!$||_.log.length>0||_.resultText||_.errorText||"running"!==_.status;return S.jsxs(t,{flexDirection:"column",children:[S.jsx(r,{items:["header"],children:()=>S.jsxs(t,{flexDirection:"column",flexShrink:0,children:[S.jsx(n,{color:"cyan",bold:!0,children:"Stably Agent"}),S.jsx(t,{flexDirection:"column",marginTop:1,children:S.jsx(n,{color:"gray",children:_.promptDisplay})})]},"header")}),B.length>0&&S.jsx(r,{items:B,children:e=>c(e)}),N.length>0&&S.jsx(t,{flexDirection:"column",children:N.map(e=>c(e))}),"error"===_.status&&_.errorText&&S.jsx(t,{marginTop:1,children:S.jsx(n,{color:"red",children:_.errorText})}),"success"===_.status&&_.resultText&&S.jsx(t,{marginTop:1,children:S.jsx(n,{children:_.resultText})}),M&&S.jsx(t,{flexDirection:"column",flexShrink:0,marginTop:1,children:j}),null!=_.permissionPrompt&&null!=m&&S.jsx(i,{onChoice:m,prompt:_.permissionPrompt}),null!=g&&null==_.permissionPrompt&&!_.isExiting&&S.jsxs(t,{borderColor:"gray",borderStyle:"round",flexDirection:"column",flexShrink:0,marginTop:1,paddingX:1,paddingY:0,children:[S.jsx(n,{color:"gray",children:"Type a message and press Enter. Press Ctrl+C to exit."}),S.jsxs(n,{children:[S.jsx(n,{color:"yellow",children:">"})," ",I.slice(0,w),S.jsx(e,{}),I.slice(w)]})]}),x&&S.jsxs(t,{marginTop:1,flexDirection:"column",children:[S.jsx(n,{color:"yellow",children:"Press Ctrl+C again to exit"}),Dr&&S.jsxs(n,{color:"gray",children:["Debug log: ",Mr]})]})]})}})({Cursor:l,inkComponents:{Box:r,Static:n,Text:o,useInput:i},isRawModeSupported:a,PermissionPrompt:u,Spinner:({label:e})=>{const[t,r]=T.useState(0);return T.useEffect(()=>{const e=setInterval(()=>r(e=>(e+1)%c.length),80);return()=>clearInterval(e)},[]),S.jsxs(o,{color:"yellow",children:[c[t]," ",e]})}});let p=e;const f={current:(e,t)=>{}},h=s(S.jsx(d,{onExit:t?.onExit,onPermissionChoice:(e,t)=>f.current(e,t),onSend:t?.onSend,showSpinnerImmediately:t?.showSpinnerImmediately,state:p}),{exitOnCtrlC:!1}),m=()=>{p={...p},h.rerender(S.jsx(d,{onExit:t?.onExit,onPermissionChoice:(e,t)=>f.current(e,t),onSend:t?.onSend,showSpinnerImmediately:t?.showSpinnerImmediately,state:p}))},g=({text:e})=>{e&&(p.log=[...p.log,{content:e,id:p.log.length,kind:"user"}],m())},y=new Map;return{addSubagentActivity:({toolUseId:e,kind:t,content:r})=>{const n=y.get(e);if(void 0===n)return void console.error("[addSubagentActivity] No entry index for toolUseId:",e);const o=p.log[n];if(o&&"subagent"===o.kind&&o.subagent){if("text"===t){const e=o.subagent.activities.at(-1);e&&"text"===e.kind?e.content+=r:o.subagent.activities.push({id:o.subagent.activities.length,kind:"text",content:r.replace(/^\s*\n+/,"")})}else o.subagent.activities.push({id:o.subagent.activities.length,kind:t,content:r});p.log=[...p.log],m()}else console.error("[addSubagentActivity] Entry not found or not subagent:",{entryIndex:n,entryKind:o?.kind})},addSubagentStart:({toolUseId:e,subagentType:t,description:r})=>{const n=p.log.length;y.set(e,n),p.log=[...p.log,{content:"",id:n,kind:"subagent",subagent:{toolUseId:e,subagentType:t,description:r,status:"running",activities:[]}}],m()},addTool:({rawName:e,toolInput:t})=>{const r=Gn(e),n=Fn(e,t),o=n?`${r} (${n})`:r;p.log=[...p.log,{content:o,id:p.log.length,kind:"tool"}],m()},addToolResult:({message:e})=>{p.log=[...p.log,{content:e,id:p.log.length,kind:"tool_result"}],m()},appendText:({text:e})=>{if(!e)return;const t=p.log.at(-1),r=t&&"text"===t.kind?e:e.replace(/^\s*\n+/,"");t&&"text"===t.kind?p.log=[...p.log.slice(0,-1),{...t,content:`${t.content}${r}`}]:p.log=[...p.log,{content:r,id:p.log.length,kind:"text"}],m()},appendUserMessage:g,cleanup:async()=>{const e=h.waitUntilExit();h.unmount(),await e},setExiting:()=>{p.isExiting=!0,m()},setStatus:({error:e,result:t,status:r})=>{p.errorText=e,p.resultText=t,p.status=r,m()},setSubagentStatus:({toolUseId:e,status:t})=>{const r=y.get(e);if(void 0===r)return;const n=p.log[r];n&&"subagent"===n.kind&&n.subagent&&(n.subagent.status=t,p.log=[...p.log],m(),"complete"!==t&&"error"!==t||y.delete(e))},showPermissionPrompt:e=>new Promise(t=>{f.current=(r,n)=>{if(p.permissionPrompt=void 0,m(),"allow"===r)t({behavior:"allow",updatedInput:e.input});else if("always"===r)t({behavior:"allow",updatedInput:e.input,updatedPermissions:e.suggestions});else{const e=n??"User denied this action";g({text:e}),t({behavior:"deny",message:e,interrupt:!1})}},p.permissionPrompt={...e,resolve:t},m()})}})(y,"chat"===e.mode||"init"===e.mode?{onExit:()=>U.current(),onSend:e=>A.current(e),showSpinnerImmediately:"init"===e.mode}:"fix"===e.mode?{onExit:()=>U.current()}:void 0);let F=y.status;const Y=({error:e,result:t,status:r})=>{F=r,H({error:e,result:t,status:r})};let z;A.current=t=>{const r=t.trim();if("chat"!==e.mode||Vr.getLogFilePath()||Vr.initSession(r||"chat"),Vr.debug("User message",{text:r}),"/help"===r){b&&h&&(E=!0,_?.interrupt?.(),h.allowNextTurn(),b=!1),"running"===F&&Y({status:"success"}),j({text:t});const e=g?.();return void k({text:e??"Help is not available in this session."})}h&&(b&&(E=!0,_?.interrupt?.(),h.allowNextTurn(),b=!1),Y({status:"running"}),j({text:t}),h.pushText(t),b=!0)};const K=[];let W;const V=await(async()=>{if("single"===e.mode||"build"===e.mode){const n=await async function(e,t){const n=r.resolve(e);if(t){const e=r.resolve(n,t);return kn(e,"output-flag"),{path:e,source:"output-flag"}}const o=Bn(n);if(o){const e=await async function(e){try{const t=(await m.readFile(e,"utf-8")).match(/testDir:\s*['"]([^'"]+)['"]/);return t?.[1]}catch{return}}(o);if(e){const t=r.resolve(r.dirname(o),e);if(Dn(t))return kn(t,"playwright.config.ts"),{path:t,source:"playwright.config.ts"}}}for(const e of Nn){const t=r.join(n,e);if(Dn(t))return kn(t,"auto-detected"),{path:t,source:"auto-detected"}}return kn(n,"cwd-fallback"),{path:n,source:"cwd-fallback"}}(a,e.outputDir);return W=n.path,t=e.prompt,`${(Array.isArray(t)?t.join(" "):t).trim()||"Create tests based on the changes in the current PR or branch. Use the Pull Request Context or Git Branch Context section of the system prompt to understand what code was changed, then create appropriate tests for the new or modified functionality. After generating the tests, run them locally (e.g. `pnpm playwright test` or the repo's Playwright test command) and iterate until the new tests pass."}\n\n[Output directory: ${W}]`}var t;if("fix"===e.mode)try{const{context:t,autohealReportUrl:r}=await(async({authHeader:e,orgId:t,runId:r})=>{Vr.debug("Fetching autoheal context",{runId:r});const n=await(o={auth:e,client:ir(),headers:nn(t),path:{runId:r}},(o.client??Zt).get({security:[{scheme:"bearer",type:"http"}],url:"/internal/v1/cli/runs/{runId}/autoheal-context",...o}));var o;if(404===n.response.status)throw Vr.warn("Autoheal context not found",{runId:r,status:404}),new Error(`Run ID "${r}" was not found.`);if(401===n.response.status)throw Vr.warn("Autoheal context fetch unauthorized",{runId:r,status:401}),new Error("Unauthorized: failed to fetch autoheal context (401).");if(422===n.response.status)throw Vr.warn("Autoheal context fetch invalid request",{runId:r,status:422,error:n.error?.error}),new Error(n.error?.error??"Failed to fetch autoheal context (422).");if(!n.error){const e=on.safeParse(n.data);if(e.success)return Vr.debug("Autoheal context fetched successfully",{runId:r,contextSize:e.data.context.length}),{context:e.data.context,autohealReportUrl:e.data.autohealReportUrl};throw Vr.warn("Autoheal context response invalid",{runId:r}),new Error("Autoheal context response missing or invalid context.")}throw Vr.warn("Autoheal context fetch failed",{runId:r,error:n.error}),new Error("Failed to fetch autoheal context")})({authHeader:o,orgId:i,runId:e.runId});return z=r,x("STARTED"),t}catch(e){const t=e instanceof Error?e.message:"Failed to fetch autoheal context.";Y({error:t,status:"error"}),await $(),process.exit(1)}return"init"===e.mode?"Please analyze this project and set up Playwright with the Stably SDK. Check for existing configurations and install the necessary dependencies.":""})(),q=await async function(e){const t=C.default.resolve(e),r=C.default.join(t,"tests"),n=C.default.join(r,"helpers"),o=C.default.join(r,"assets"),i=function(e){const t=C.default.resolve(e);if(s.existsSync(t))for(const e of xn){const r=C.default.join(t,`playwright.config${e}`);if(s.existsSync(r))return r}}(t)??C.default.join(t,"playwright.config.ts"),a=C.default.basename(i),c=C.default.join(r,"seed.spec.ts"),[l,u,d,p,f,h]=await Promise.all([Un({defaultContent:"Unable to read directory",dirName:"working directory",dirPath:t}),Un({defaultContent:"Unable to read directory",dirName:"tests directory",dirPath:r}),Un({defaultContent:"Directory does not exist yet",dirName:"helpers directory",dirPath:n}),Un({defaultContent:"Directory does not exist yet",dirName:"assets directory",dirPath:o}),An({defaultContent:"File does not exist or could not be read",fileName:a,filePath:i}),An({defaultContent:"File does not exist or could not be read",fileName:"seed.spec.ts",filePath:c})]);return{absolutePath:t,directories:{assets:p,helpers:d,root:l,tests:u},files:{playwrightConfig:f,playwrightConfigFilename:a,seedSpec:h}}}(a),J=process.env.STABLY_FIX_MAX_TURNS_PER_ISSUE,X=J?parseInt(J,10):NaN,Q=Number.isNaN(X)?void 0:X;Vr.debug("Fetching system prompt and subagents",{mode:e.mode,maxTurnsOverride:Q});const[Z,ee]=await Promise.all([Pn({allowedEnvVars:Object.keys(p),mode:e.mode,workspaceInfo:q,authHeader:o,customHeader:"single"===e.mode||"build"===e.mode?e.customHeader:void 0}),"fix"===e.mode?Zn({authHeader:o,mode:e.mode,maxTurnsOverride:Q}):Promise.resolve({})]);Vr.debug("System prompt and subagents fetched",{systemPromptSize:Z.length,subagentCount:Object.keys(ee).length,maxTurnsOverride:Q??"default"});const te={...p,...process.env},re={};for(const[e,t]of Object.entries(te))Qn.has(e)||void 0===t||(re[e]=t);Vr.debug("AI proxy configuration",{useStablyAiProxy:!0,wantsBypassProxy:!1,wantsUseOllama:!1});const ne=await async function({auth:e,client:t,source:r,metadata:n,duration:o}){try{const i=await(s={auth:e,client:t,body:{source:r,metadata:n??{},duration:o}},(s.client??Zt).post({security:[{scheme:"bearer",type:"http"}],url:"/v1/proxy/api-key",...s,headers:{"Content-Type":"application/json",...s.headers}})),a=i.response;if(i.error){const e="object"==typeof i.error&&"error"in i.error?i.error.error:"Unknown error";return{error:Xn(e,a)}}return i.data?{key:i.data.key}:{error:Xn("No data in response",a)}}catch(e){const t=e instanceof Error?e.message:"Unknown error";return{error:Xn(t)}}var s}({auth:o,client:ir(),source:"cli"}),oe=ne?.key;if(!oe){const e=ne?.error?.message?`Unable to make AI calls: ${ne.error.message}`:"Unable to make AI calls. Check if you are authenticated.";Vr.warn("Failed to get proxy API key",{error:ne?.error?.message}),Y({error:e,status:"error"}),await $(),Vr.flush(),Vr.printLogFileInfo(),process.exit(1)}Vr.debug("Proxy API key acquired",{success:!!oe});const se=await rn(),ie=se?Object.fromEntries(Object.entries(tn(se)).filter(e=>null!=e[1])):void 0,ae="init"===e.mode,ce="fix"===e.mode,le=ce?Pt.createLocal({workingDir:a}):void 0;le&&await le.captureSnapshot();const ue=ae?ro:[...eo,...ce?["mcp__auto-heal-report"]:[]],de=ae?ro:to,pe=ae?{"session-control":qn({onComplete:()=>{Y({status:"success"}),M(),h?.finish(),process.exit(0)}})}:ce&&le?{"playwright-test":{args:["playwright","run-test-mcp-server"],command:"npx",env:ie},"auto-heal-report":Vn({authHeader:o,diffTracker:le,orgId:i,runId:e.runId})}:{"playwright-test":{args:["playwright","run-test-mcp-server"],command:"npx",env:ie}},fe="single"===e.mode||"build"===e.mode,he=ae?[]:[{hooks:[async e=>{const t=un(e);if(!t)return{decision:"approve"};let r=!1;const n=t.map(e=>cn(e)?e.text.length<=4e4?e:(r=!0,{...e,text:`${e.text.slice(0,4e4)}...[truncated to 40000 characters]`}):e);return r?{decision:"approve",hookSpecificOutput:{hookEventName:"PostToolUse",updatedMCPToolOutput:n}}:{decision:"approve"}}],matcher:"mcp__playwright-test__.*"},{matcher:"mcp__playwright-test__test_run",hooks:[gn({onResult:e=>D({message:e})})]},{matcher:"mcp__playwright-test__test_debug",hooks:[yn({onResult:e=>D({message:e})})]},...fe?[{matcher:"Write",hooks:[bn({onFileCreated:e=>K.push(e)})]}]:[],{matcher:"mcp__playwright-test__generator_setup_page",hooks:[Tn()]},{matcher:"mcp__playwright-test__planner_setup_page",hooks:[Tn()]}],me=ae?[]:[{matcher:"mcp__playwright-test__browser_type",hooks:[mn({envVars:p})]},{matcher:"mcp__playwright-test__generator_setup_page",hooks:[vn()]},{matcher:"mcp__playwright-test__planner_setup_page",hooks:[vn()]}],ge=Object.keys(ee).length>0?ee:void 0,ye={...re};oe&&(ye.ANTHROPIC_API_KEY=oe,ye.ANTHROPIC_BASE_URL=or,ye.CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS="1");const _e=process.env.STABLY_AGENT_MODEL??"claude-opus-4-5-20251101";Vr.info("Starting agent query",{model:_e,tools:ue,mcpServers:Object.keys(pe),subagentsEnabled:!!ge,subagentCount:Object.keys(ee).length}),_=u.query({options:{tools:ue,allowedTools:de,betas:[],canUseTool:(e,t)=>Promise.resolve({behavior:"allow",updatedInput:t}),cwd:a,env:ye,hooks:{PostToolUse:he,PreToolUse:me},includePartialMessages:!0,agents:ge,mcpServers:pe,model:_e,permissionMode:"default",systemPrompt:Z},prompt:h??V}),"init"===e.mode&&h&&h.pushText(V),U.current=async()=>{w="CANCELED",await x("CANCELED"),Vr.flush(),M();try{await(_?.interrupt?.())}catch{}ae||(Sn(),In()),h?.finish(),$()};try{for await(const e of _){if("stream_event"===e.type){const{event:t}=e,r=t&&"object"==typeof t&&"parent_tool_use_id"in t&&"string"==typeof t.parent_tool_use_id?t.parent_tool_use_id:void 0;if("content_block_delta"===t?.type){const{delta:e}=t;"text_delta"===e?.type&&e.text&&(r&&I.has(r)?L({toolUseId:r,kind:"text",content:e.text}):k({text:e.text}))}"message_stop"===t?.type&&h&&h.allowNextTurn();continue}if("assistant"===e.type){const t="parent_tool_use_id"in e&&"string"==typeof e.parent_tool_use_id?e.parent_tool_use_id:void 0,{content:r}=e.message??{};if(Array.isArray(r)&&!t){const e=r.filter(e=>e&&"object"==typeof e&&"type"in e&&"text"===e.type).map(e=>e&&"object"==typeof e&&"text"in e&&"string"==typeof e.text?e.text:void 0).filter(Boolean).join("");e&&Vr.debug("Assistant message",{text:e})}if(I.size>0){const n=Array.isArray(r)?r.filter(e=>e&&"object"==typeof e&&"type"in e&&"tool_use"===e.type).map(e=>e&&"object"==typeof e&&"name"in e&&"string"==typeof e.name?e.name:void 0):[];Vr.debug("Assistant message with active subagents",{hasParentToolUseId:!!t,parentToolUseId:t,activeSubagentIds:Array.from(I.keys()),toolNames:n,fullMessageKeys:Object.keys(e),rawMessage:JSON.stringify(e).slice(0,500)})}if(Array.isArray(r))for(const e of r){if("tool_use"===e?.type){if(e.name.startsWith("mcp__session-control__"))continue;if(I.size>0&&Vr.debug("Tool use detected with active subagents",{toolName:e.name,hasParentToolUseId:!!t,parentToolUseId:t,wouldRouteToSubagent:!!t&&I.has(t),activeSubagentIds:Array.from(I.keys())}),"Task"===e.name){const t=e.input,r=t&&"object"==typeof t?t:void 0,n=r&&"subagent_type"in r&&"string"==typeof r.subagent_type?r.subagent_type:"subagent",o=r&&"description"in r&&"string"==typeof r.description?r.description:"";Vr.debug("Subagent started",{subagentType:n,description:o,toolUseId:e.id}),I.set(e.id,{subagentType:n,description:o}),O({toolUseId:e.id,subagentType:n,description:o});continue}if(t&&I.has(t)){const r=Gn(e.name),n=Fn(e.name,e.input),o=n?`${r} (${n})`:r;Vr.debug("Subagent tool called",{tool:e.name,parentToolUseId:t}),L({toolUseId:t,kind:"tool",content:o});continue}t&&Vr.debug("Tool with parent_tool_use_id but no matching subagent",{tool:e.name,parentToolUseId:t,activeSubagentIds:Array.from(I.keys())}),Vr.debug("Tool called",{tool:e.name,input:e.input}),N({rawName:e.name,toolInput:e.input})}if("text"===e?.type&&t&&I.has(t)){const r="string"==typeof e.text?e.text:"";r&&L({toolUseId:t,kind:"text",content:r})}}continue}if("user"===e.type){const t="message"in e&&e.message&&"object"==typeof e.message&&"content"in e.message?e.message.content:void 0;if(Array.isArray(t))for(const e of t)if(e&&"object"==typeof e&&"type"in e&&"tool_result"===e.type&&"tool_use_id"in e){const t="string"==typeof e.tool_use_id?e.tool_use_id:void 0,r="is_error"in e&&!0===e.is_error,n="content"in e&&"string"==typeof e.content?e.content:void 0;Vr.debug("Tool result",{toolUseId:t,isError:r,output:n?.slice(0,500)}),t&&I.has(t)&&(Vr.debug("Subagent completed",{toolUseId:t,isError:r}),G({toolUseId:t,status:r?"error":"complete"}),I.delete(t))}continue}if("result"!==e.type);else{if(Vr.debug("Agent result",{subtype:e.subtype}),f){if("success"===e.subtype){if(fe&&K.length>0){B.default.green("Created files:");for(const e of K)B.default.green(`- ${e}`)}const e=z?B.default.cyan(`📊 View Autoheal Report:\n ${B.default.cyan(B.default.bold(B.default.underline(z)))}`):void 0;Y({status:"success",result:e}),w="COMPLETED"}else E?w="CANCELED":(Y({error:"Run failed.",status:"error"}),process.exitCode=1,w="FAILED");E=!1;break}"success"!==e.subtype?E||(Y({error:"Run failed.",status:"error"}),process.exitCode=1):Y({status:"success"}),b=!1,E=!1,h?.allowNextTurn()}}}catch(e){E?w="CANCELED":(Vr.error("Agent encountered an error",{error:e instanceof Error?e.message:String(e),stack:e instanceof Error?e.stack:void 0}),Y({error:`Agent encountered an error: ${e}`,status:"error"}),process.exitCode=1,w="FAILED",Vr.flush(),Vr.printLogFileInfo())}finally{Vr.info("Agent session ending"),b=!1,E=!1,process.off("uncaughtException",t),h?.finish(),w&&await x(w),ae||(Sn(),await In()),await(le?.cleanup()),await $()}},so=k.default.object({runId:k.default.string(),timestamp:k.default.number()}),io="sha256",ao=/^\/\*\*\r?\n \* @generated by stably build[\s\S]*?\*\/(?:\r?\n)*/;function co(e){return!!e&&"object"==typeof e&&"code"in e}async function lo({errorMessage:e,filePath:t}){try{return await D.default.readFile(t,"utf8")}catch(t){if(co(t)&&"ENOENT"===t.code)throw new Error(e);throw t}}function uo(e){return e.split(C.default.sep).join("/")}function po(e=process.cwd()){let t=r.resolve(e);for(;;){const e=fo(t);if(e){const n={...e.dependencies,...e.devDependencies},o="@playwright/test"in n?"@playwright/test":"playwright"in n?"playwright":void 0;if(o){const e=ho(t);let n=!1,i=t;for(;;){const e=r.join(i,"node_modules"),t=r.join(e,o);if(s.existsSync(t)){n=!0;break}const a=r.dirname(i);if(a===i)break;i=a}return{inNodeModules:n,installed:!0,packageManager:e,packageName:o}}}const n=r.dirname(t);if(n===t)return{inNodeModules:!1,installed:!1,packageManager:void 0};t=n}}function fo(e){const t=r.join(e,"package.json");let n;try{n=s.readFileSync(t,"utf-8")}catch{return}try{return JSON.parse(n)}catch{return}}function ho(e){const t=[["npm","package-lock.json"],["pnpm","pnpm-lock.yaml"],["yarn","yarn.lock"]];let n=e;for(;;){for(const[e,o]of t)if(s.existsSync(r.join(n,o)))return e;const e=r.dirname(n);if(e===n)return;n=e}}function mo(e){if("npm"===e)return["npx","playwright"];if("pnpm"===e)return["pnpm","exec","playwright"];if("yarn"===e)return["yarn","playwright"];throw new Error("Package manager not supported")}var go=[{args:["--trace=on"],description:"Run Playwright tests",name:"test"},{args:[],description:"Install browser dependencies",name:"install"}];function yo(e){const[t,...r]=mo(e),n=[t,...r.slice(0,-1)].join(" ");return(t,r)=>{let o=t.toString();for(const e of go)o=o.replaceAll(`${n} playwright ${e.name}`,`${n} stably ${e.name}`).replaceAll(`npx playwright ${e.name}`,`npx stably ${e.name}`);if("yarn"===e){const e=o.split("\n");return e.length>0&&e[0].includes("/.bin/playwright")&&e.shift(),void r.write(e.join("\n"))}r.write(o)}}function _o(e=""){process.stdout.write(`${e}\n`)}function bo(...e){process.stderr.write(`${e.join(" ")}\n`)}var Eo="stably",Io=`https://registry.npmjs.org/${Eo}/latest`,wo=_.z.object({version:_.z.string()});function vo(e){const t=e.match(/^(\d+)\.(\d+)\.(\d+)/);return t?{major:parseInt(t[1],10),minor:parseInt(t[2],10),patch:parseInt(t[3],10)}:null}function To(e,t){const r=vo(e),n=vo(t);return!(!r||!n)&&(n.major>r.major||!(n.major<r.major)&&(n.minor>r.minor||!(n.minor<r.minor)&&n.patch>r.patch))}var So=C.default.join(L.default.homedir(),".stably"),Ro=C.default.join(So,"update-check.json"),xo=`https://registry.npmjs.org/${Eo}/latest`,Co=_.z.object({lastCheck:_.z.number(),latestVersion:_.z.string()}),Ao=!1,Uo=!1,Po=async()=>{if(Uo)try{const{shutdown:e}=await import("@hyperdx/node-opentelemetry"),t=console.log;console.log=(...e)=>{e[0]?.toString().includes("OpenTelemetry")||t(...e)};try{await e()}finally{console.log=t}}catch{}};!function(){const e=function(){try{const e=P.default.readFileSync(Ro,"utf-8");return Co.parse(JSON.parse(e))}catch{return null}}(),t=Date.now();if((null==e||t-e.lastCheck>=18e5)&&function(){const e=`\n const https = require('https');\n const fs = require('fs');\n const url = '${xo}';\n const cacheFile = ${JSON.stringify(Ro)};\n const cacheDir = ${JSON.stringify(So)};\n\n const req = https.get(url, { timeout: 5000 }, (res) => {\n if (res.statusCode !== 200) process.exit(1);\n let data = '';\n res.on('data', (chunk) => data += chunk);\n res.on('end', () => {\n try {\n const version = JSON.parse(data).version;\n if (!fs.existsSync(cacheDir)) fs.mkdirSync(cacheDir, { recursive: true });\n fs.writeFileSync(cacheFile, JSON.stringify({ lastCheck: Date.now(), latestVersion: version }));\n } catch {}\n process.exit(0);\n });\n });\n req.on('error', () => process.exit(1));\n req.on('timeout', () => { req.destroy(); process.exit(1); });\n `;try{n.spawn(process.execPath,["-e",e],{detached:!0,stdio:"ignore",windowsHide:!0}).unref()}catch{}}(),null!=e&&To(er,e.latestVersion)){if(Ao)return;Ao=!0;let t=!1;const r=()=>{if(t)return;t=!0;const r=`${B.default.yellow(`update available (${er} → ${e.latestVersion})`)} - run \`${Eo} upgrade\` to get the latest version\n`;try{P.default.writeSync(2,r)}catch{}};process.once("beforeExit",r),process.once("exit",r)}}();var Lo=process.argv.findIndex(e=>"-C"===e||"--cwd"===e);if(-1!==Lo&&process.argv[Lo+1]){const e=process.argv[Lo+1];process.chdir(e),Vr.debug("Changed working directory",{cwd:e}),process.argv.splice(Lo,2)}var Oo=process.argv.findIndex(e=>"-v"===e||"--verbose"===e);-1!==Oo&&process.argv.splice(Oo,1);var Bo=process.argv.findIndex(e=>"--no-telemetry"===e);-1!==Bo&&process.argv.splice(Bo,1),Vr.info("CLI starting",{version:er,args:process.argv.slice(2),cwd:process.cwd()}),process.on("unhandledRejection",(e,t)=>{Vr.error("Unhandled promise rejection",{reason:e instanceof Error?{message:e.message,stack:e.stack}:e,promise:String(t)}),Vr.flush(),Vr.printLogFileInfo()}),process.on("uncaughtException",(e,t)=>{"EPIPE"!==e.code&&(Vr.error("Uncaught exception",{error:{message:e.message,stack:e.stack,name:e.name},origin:t}),Vr.flush(),Vr.printLogFileInfo())});var No=new e.Command;No.name("stably").description("AI-assisted Playwright testing CLI").version(er),No.enablePositionalOptions(),No.showHelpAfterError(),No.exitOverride(),No.configureHelp({subcommandTerm:e=>{const t=e.registeredArguments.map(e=>e.required?`<${e.name()}>`:`[${e.name()}]`).join(" ");return t?`${e.name()} ${t}`:e.name()}});var Do=[];No.configureOutput({writeOut:e=>process.stdout.write(e),writeErr:e=>{Do.push(e)}});var ko=()=>{const e=No.helpInformation().trimEnd();return e?`${e}\n`:""},jo=(e,t)=>{let r=e;for(const e of t){const t=r.commands.find(t=>t.name()===e||t.aliases().includes(e));if(!t)return;r=t}return r},$o=()=>{process.stdout.write(ko())};No.command("help [command...]").description("Show help for a command (e.g. stably help create)").action(e=>{if(!e||0===e.length)return void $o();const t=jo(No,e);if(!t)return process.stderr.write(`Unknown command: ${e.join(" ")}\n`),$o(),void(process.exitCode=1);var r;r=t,process.stdout.write((e=>{const t=e.helpInformation().trimEnd();return t?`${t}\n`:""})(r))}),No.action(()=>oo({mode:"chat",getHelpText:ko})),No.command("login").description("Authenticate with Stably in your browser").action(Ur),No.command("logout").description("Clear stored Stably credentials").action(async()=>{const e=Jr();e&&(g.log.warn(`Environment variables ${B.default.cyan("STABLY_API_KEY")} and ${B.default.cyan("STABLY_PROJECT_ID")} are set.`),g.log.warn("They will continue to be used for authentication even after logout."),g.log.warn("Unset them if you want to fully de-authenticate this shell/session."));const t=await _r();if(!t)return void g.outro(e?B.default.yellow("No stored OAuth login found to clear."):B.default.yellow("You are not logged in."));const r=g.spinner();r.start("Logging out..."),await(async e=>{try{await fetch(`${rr}/api/backend/v1/logout`,{body:JSON.stringify({refresh_token:e}),headers:{"Content-Type":"application/json"},method:"POST"})}catch{}})(t.refreshToken),await Er(),await vr(),r.stop(B.default.green("✓ Logged out")),g.outro(B.default.green("You have been logged out successfully."))}),No.command("whoami").description("Show auth status and current project").action(async()=>{g.log.info(`${B.default.bold("CLI Version:")} ${B.default.cyan(er)}`);const e=Jr();if(e){g.log.info(B.default.dim("Authentication: Environment variables")),g.log.info(` ${B.default.bold("API Key:")} ${B.default.cyan(e.apiKey.slice(0,8))}...`),g.log.info(` ${B.default.bold("Project ID:")} ${B.default.cyan(e.projectId)}`);const t=await _r();if(t){let e;try{e=dr(t.accessToken).email}catch{e=void 0}g.log.warn("Stored OAuth login detected but will be ignored (env auth takes precedence)."),e&&g.log.info(` ${B.default.bold("OAuth Email:")} ${B.default.cyan(e)}`),g.log.info(` ${B.default.bold("Tip:")} Unset env vars to use OAuth`)}return void g.outro(B.default.green("Authenticated via environment variables"))}const t=await _r();if(!t)return void g.outro(B.default.yellow("Not logged in. Run `stably login` to authenticate."));let r;try{r=dr(t.accessToken).email}catch{r=void 0}const n=await wr();if(!n)return g.log.info(B.default.dim("Authentication: OAuth (not linked to a project)")),r&&g.log.info(` ${B.default.bold("Email:")} ${B.default.cyan(r)}`),void g.outro(B.default.yellow("Logged in but this directory is not linked to a project. Run `stably login` to link."));const o=await(async()=>Ir(process.cwd()))(),s=o?C.default.dirname(o):process.cwd(),i=C.default.relative(process.cwd(),s)||".";g.log.info(B.default.dim("Authentication: OAuth")),r&&g.log.info(` ${B.default.bold("Email:")} ${B.default.cyan(r)}`),g.log.info(` ${B.default.bold("Organization:")} ${B.default.cyan(n.orgName)}`),g.log.info(` ${B.default.bold("Project:")} ${B.default.cyan(n.projectName)}`),g.log.info(` ${B.default.bold("Linked at:")} ${B.default.dim(i)}`),g.outro(B.default.green("Authenticated"))}),No.command("build <input>").description("Compile a prompt file into a Playwright test").requiredOption("-o, --output <file>","Output file (required)").option("--no-cache","Skip cache, always regenerate").action(async(e,t)=>{try{await async function({cache:e,input:t,output:r}){const n=process.cwd(),o=C.default.resolve(n,t);if(!o.endsWith(".prompt.md"))throw new Error(`Input must be a .prompt.md file: ${t}`);const s=await async function({inputFilePath:e,output:t}){const r=t.trim();if(!r)throw new Error("Output file is required. Example: -o tests/example.spec.ts");const n=C.default.resolve(process.cwd(),r),o=[C.default.sep,"/"],s=function(e){return`${C.default.basename(e,".prompt.md")}.spec.ts`}(e);if(o.some(e=>r.endsWith(e)))return C.default.join(n,s);try{return(await D.default.stat(n)).isDirectory()?C.default.join(n,s):n}catch(e){if(co(e)&&"ENOENT"===e.code)return n;throw e}}({inputFilePath:o,output:r}),i=await lo({filePath:o,errorMessage:`Prompt file not found: ${t}`});if(!i.trim())throw new Error(`Prompt file is empty: ${t}`);const a=function(e){const t=N.default.createHash(io).update(e,"utf8").digest("hex");return`${io}:${t}`}(i);if(e&&await async function({outputFilePath:e,promptHash:t}){try{const r=function(e){const t=e.match(/^\/\*\*[\s\S]*?@prompt-hash\s+(sha256:[a-f0-9]{64})[\s\S]*?\*\//);return t?.[1]}(await D.default.readFile(e,"utf8"));return r===t}catch(e){if(co(e)&&"ENOENT"===e.code)return!1;throw e}}({outputFilePath:s,promptHash:a}))return B.default.green("Skipped build: test code is up to date (hash unchanged)"),"skipped";await D.default.mkdir(C.default.dirname(s),{recursive:!0});const c=uo(C.default.relative(n,o)),l=uo(C.default.relative(n,s)||r),u=function({builtAt:e=new Date,promptFile:t,promptHash:r}){return["/**"," * @generated by stably build",` * @prompt-hash ${r}`,` * @prompt-file ${t}`,` * @built-at ${e.toISOString()}`," *",` * DO NOT EDIT MANUALLY - regenerate with: stably build ${t} --no-cache`," */"].join("\n")}({promptFile:c,promptHash:a}),d=function({outputFile:e,promptContent:t}){return["Compile this test specification into a Playwright test file.",`Primary output file: ${e}`,"","File creation rules:","- Always create/update the primary output file specified above.","- You MAY create shared helper files (e.g., lib/auth.ts) if the prompt explicitly requests reusable components.","- Prefer single-file output unless shared helpers would significantly improve maintainability.","- Never modify unrelated existing files.","","Sync workflow for existing files:",`1. Check whether ${e} already exists.`,"2. If it exists, read it first and compare it against the prompt specification.","3. Apply sync rules:"," - If file does not exist: CREATE from scratch."," - If file exists and already satisfies the prompt: KEEP behavior and make minimal edits only when needed."," - If file exists but only partially matches: UPDATE only changed scenarios so code aligns with prompt."," - If file structure conflicts heavily with prompt: REGENERATE the file content completely.","4. Prompt specification is the source of truth for final test behavior.","","Test verification:","After generating the test file, run the tests locally to verify they work correctly.","Use the appropriate Playwright test command (e.g., `pnpm playwright test` or the repository's test command).","If tests fail, analyze the errors and iterate on the test code until all tests pass.","","Prompt specification:",t].join("\n")}({outputFile:l,promptContent:i});await oo({mode:"build",prompt:d,outputDir:C.default.dirname(s),customHeader:u});const p=process.exitCode;if("number"==typeof p&&0!==p)throw new Error(`Build generation failed for: ${l}`);const f=await lo({filePath:s,errorMessage:`Build finished but output file was not created: ${r}`}),h=function(e){return e.replace(ao,"")}(f),m=f.startsWith(u)?f:`${u}\n\n${h}`;return m!==f&&await D.default.writeFile(s,m,"utf8"),B.default.green(`Built: ${l}`),"built"}({cache:t.cache,input:e,output:t.output})}catch(e){const t=e instanceof Error?e.message:String(e);process.stderr.write(`${t}\n`),process.exitCode=1}}),No.command("tunnel",{hidden:!0}).description("Expose a local server with a secure tunnel URL").option("-p, --port <number>","Local port to expose","3000").action(async e=>{g.intro(`Starting development server for port ${e.port}...`);const t=await en(),r="oauth"===t.type?`${t.auth.context.orgName}-${t.auth.context.projectName}`.toLowerCase().replace(/[^a-z0-9-]/g,""):`project-${t.auth.projectId}`.toLowerCase(),n=g.spinner();n.start("Starting development server...");const o=await R.startTunnel(`http://localhost:${e.port}`,{subdomain:r});n.stop(`Your local environment is available at: ${B.default.underline(B.default.cyan(o.url))}`)}),No.command("create [prompt...]").description("Generate a test from prompt (omit prompt to infer from branch diff)").option("-o, --output <dir>","Output directory for generated test files").action((e,t)=>{const r=e.length>0&&"test"===e[0]?e.slice(1):e;return oo({mode:"single",prompt:r,outputDir:t.output})}).command("test",{hidden:!0}).description("Generate a Playwright test from a prompt (deprecated: use `stably create <prompt>` directly)").argument("<prompt...>","Prompt describing the test to generate").option("-o, --output <dir>","Output directory for generated test files").action((e,t)=>oo({mode:"single",prompt:e,outputDir:t.output})),No.command("fix [runId]").description("Fix failing tests from a run (auto-detects from last test run or CI)").action(async e=>{const t=await(async e=>{const t=e=>e.replace(/\//g,"_");if(e)return Vr.debug("Run ID provided explicitly",{runId:e}),t(e);const r=function(){if(process.env.CI_BUILD_ID)return process.env.CI_BUILD_ID;const e=(({env:e=process.env,cwd:t=process.cwd()}={})=>{for(const r of Object.keys(Ut))if(Ut[r].detect({env:e,cwd:t}))return{isCi:!0,...Ut[r].configuration({env:e,cwd:t})};return{isCi:Boolean(e.CI),...(r={env:e,cwd:t},{commit:et(r),branch:tt(r)})};var r})();if(!e.isCi)return;const t=function(e){switch(e){case"github":return process.env.GITHUB_RUN_ATTEMPT;case"azure-devops":return process.env.SYSTEM_JOBATTEMPT;case"bitbucket":return process.env.BITBUCKET_STEP_RUN_NUMBER;default:return}}(e.service),r=[e.service,"slug"in e?e.slug?.replace(/\//g,"_"):void 0,"build"in e?String(e.build):void 0,"job"in e?String(e.job):void 0,t&&String(t)].filter(Boolean);return r.length>0?r.join("-"):void 0}();if(r)return Vr.debug("Run ID detected from CI environment",{runId:r}),t(r);Vr.debug("No explicit run ID or CI environment detected, checking last-run.json");const n=await(async()=>{try{const e=await(async()=>{let e=process.cwd();const{root:t}=C.default.parse(e);for(;e!==t;){const t=C.default.join(e,".stably/last-run.json");try{return await m.access(t),t}catch{e=C.default.dirname(e)}}})();if(!e)return;const t=await m.readFile(e,"utf-8");return{...so.parse(JSON.parse(t)),filePath:e}}catch{return}})();if(n){const e=(Date.now()-n.timestamp)/36e5;return Vr.debug("Run ID found in last-run.json",{runId:n.runId,timestamp:n.timestamp,filePath:n.filePath,ageHours:Math.round(e)}),e>24&&Vr.warn(`Using run ID from ${Math.round(e)} hours ago (${n.filePath}). Provide an explicit run ID if this is not the run you want to fix.`),t(n.runId)}Vr.debug("No run ID found in last-run.json")})(e);return t||(process.stderr.write('Run ID is required. Either:\n 1. Run "stably test" first (run ID will be auto-detected)\n 2. Provide a run ID: stably fix <runId>\n 3. Run in CI (auto-detected from environment)\n'),process.exit(1)),oo({mode:"fix",runId:t})}),No.command("init").description("Initialize Playwright and Stably SDK in your project").action(()=>oo({mode:"init"})),No.command("upgrade").description("Upgrade to latest version (use --check to only check)").option("-c, --check","Only check for updates without upgrading").action(e=>async function(e){const{check:t=!1}=e;let r;_o(B.default.cyan("Checking for updates...\n"));try{r=await async function(){const e=await async function(){const e=new AbortController,t=setTimeout(()=>e.abort(),1e4);t.unref();try{const t=await fetch(Io,{signal:e.signal});if(!t.ok)throw new Error(`Failed to fetch latest version: ${t.statusText}`);return wo.parse(await t.json()).version}finally{clearTimeout(t)}}();return{current:er,latest:e,isOutdated:To(er,e)}}()}catch(e){return bo(B.default.red("Failed to check for updates:"),e instanceof Error?e.message:e),void(process.exitCode=1)}if(_o(`Current version: ${B.default.yellow(r.current)}`),_o(`Latest version: ${B.default.green(r.latest)}`),_o(),!r.isOutdated)return void _o(B.default.green("✓ You are already on the latest version!"));if(_o(B.default.yellow(`⚠ A new version is available: ${r.current} → ${r.latest}`)),_o(),t)return _o(B.default.dim("Exiting with code 1 to indicate update available (useful for CI).")),void(process.exitCode=1);const o=function(){const e=process.argv[1]||"";if(e.includes("_npx")||e.includes(".npm/_cacache"))return"npx";try{const t=n.execSync("npm root -g",{encoding:"utf-8"}).trim();if(e.includes(t))return"global-npm"}catch{}if(e.includes("node_modules/stably"))return"global-npm";try{const t=n.execSync("pnpm root -g",{encoding:"utf-8"}).trim();if(e.includes(t))return"global-pnpm"}catch{}try{const t=n.execSync("yarn global dir",{encoding:"utf-8"}).trim();if(e.includes(t))return"global-yarn-classic"}catch{}try{const t=n.execSync("yarn config get globalFolder",{encoding:"utf-8"}).trim();if(e.includes(t))return"global-yarn-berry"}catch{}return"unknown"}(),s=function(e){switch(e){case"global-npm":case"global-yarn-berry":case"unknown":return{command:"npm",args:["install","-g",`${Eo}@latest`],description:`npm install -g ${Eo}@latest`};case"global-pnpm":return{command:"pnpm",args:["add","-g",`${Eo}@latest`],description:`pnpm add -g ${Eo}@latest`};case"global-yarn-classic":return{command:"yarn",args:["global","add",`${Eo}@latest`],description:`yarn global add ${Eo}@latest`};case"npx":return{command:"npx",args:[`${Eo}@latest`],description:`npx ${Eo}@latest (always uses latest)`}}}(o);if("npx"===o)return _o(B.default.dim("You are running via npx, which always fetches the latest version.")),void _o(B.default.dim(`Simply run: ${B.default.white("npx stably")} to use the latest version.`));"unknown"===o?(_o(B.default.yellow("Could not detect installation method. Falling back to npm.")),_o()):"global-yarn-berry"===o&&(_o(B.default.yellow("Yarn Berry does not support global packages. Falling back to npm.")),_o()),_o(`Upgrade command: ${B.default.cyan(s.description)}`),_o(),_o(B.default.cyan("Upgrading...")),_o();try{await(i=s.command,a=s.args,new Promise((e,t)=>{const r=n.spawn(i,a,{stdio:"inherit",shell:"win32"===process.platform});r.on("close",r=>{0===r?e():t(new Error(`Upgrade command exited with code ${r}`))}),r.on("error",e=>{t(e)})})),_o(),_o(B.default.green("✓ Upgrade complete!")),_o(B.default.dim(`Run ${B.default.white("stably --version")} to verify.`))}catch(e){bo(B.default.red("Upgrade failed:"),e instanceof Error?e.message:e),_o(),_o(B.default.dim("You can try manually running:")),_o(B.default.cyan(` ${s.description}`)),process.exitCode=1}var i,a}(e)),go.forEach(({args:e,description:t,name:o})=>{No.command(o).description(t).helpOption(!1).helpCommand(!1).allowUnknownOption(!0).allowExcessArguments(!0).passThroughOptions().action(()=>async function({overrideArgs:e,subcommand:t}){const o=process.argv,i=o.findIndex((e,r)=>r>1&&e===t),a=-1===i?[]:o.slice(i+1),c="--"===a[0],l=c?a.slice(1):a;if(!c&&("--help"===l[0]||"-h"===l[0]))return async function({subcommand:e}){const t=go.find(t=>t.name===e),r=e=>process.stdout.write(`${e}\n`);r(`stably ${e} - ${t?.description??""}`),r(""),"test"===e&&(r('IMPORTANT: Always use "stably" commands instead of "playwright" directly.'),r(""),r("Stably commands:"),r(" stably test [file] Run tests (auto-enables tracing and analytics)"),r(" stably fix [file] Auto-fix failing tests using AI"),r(" stably create <url> Generate new tests from a URL using AI"),r(""),r("Why use Stably?"),r(' - "stably fix" automatically repairs broken tests'),r(' - "stably test" enables --trace=on and test analytics'),r(' - "stably create" generates tests from prompt'),r(""));const o=po();if(!o.installed||!o.inNodeModules)return void r('No Playwright project found in this directory or its parents.\nMake sure you\'re in a directory within your Playwright project, or run "stably init" to create a new playwright directory.');const{packageManager:s}=o;if(!s)return void r("Could not determine package manager.");r("Playwright options:"),r("");const[i,...a]=mo(s),c=yo(s);return new Promise(t=>{const r=n.spawn(i,[...a,e,"--help"],{stdio:["inherit","pipe","pipe"],env:{...process.env,...process.env.CI?{}:{FORCE_COLOR:"1"}}});r.stdout?.on("data",e=>{c(e,process.stdout)}),r.stderr?.on("data",e=>{c(e,process.stderr)}),r.on("close",()=>{t()})})}({subcommand:t});const u=e??[],d=new Set(u.map(e=>{const[t]=e.split("=");return t})),p=[];for(let e=0;e<l.length;e++){const t=l[e],[r]=t.split("=");d.has(r)?!t.includes("=")&&e+1<l.length&&!l[e+1].startsWith("-")&&e++:p.push(t)}const f=[t,...u,...p],h="test"===t?await rn():void 0,m="test"===t?function({forwardedArgs:e,hasCredentials:t}){if(!t)return console.warn("⚠️ Stably credentials not found. Test results will not be reported to Stably."),console.warn(" To enable reporting, either:"),console.warn(" • Run `npx stably login` to authenticate"),void console.warn(" • Or set STABLY_API_KEY and STABLY_PROJECT_ID environment variables\n");const o=process.cwd(),i=e=>{const t=function(e){let t=r.resolve(e);for(;;){if([r.join(t,"node_modules","@stablyai","playwright-test"),r.join(t,"node_modules",".pnpm","@stablyai+playwright-test")].some(e=>s.existsSync(e)))return!0;const e=r.dirname(t);if(e===t)return!1;t=e}}(e);return t||(console.warn("⚠️ @stablyai/playwright-test is not installed. Stably reporter will not be injected."),console.warn(" Install it with: npm install @stablyai/playwright-test"),console.warn(" Reference: https://docs.stably.ai/getting-started/sdk-setup-guide\n")),t},a=(e,t)=>{try{return function({baseConfigPath:e,projectDir:t}){const o=function(e){try{const t=n.execSync("npm pkg get type",{cwd:e,encoding:"utf-8",stdio:["pipe","pipe","pipe"]});return"module"===JSON.parse(t.trim())}catch{return!1}}(t),i=o?"mts":"ts",a=r.dirname(r.resolve(e)),c=r.basename(e),l=r.join(a,`.stably-playwright-wrapper.config.${i}`),u=`\n// Auto-generated wrapper config by Stably CLI\n// This file injects the Stably reporter and ensures trace is enabled\nimport baseConfig from './${c}';\nimport { defineConfig, stablyReporter } from '@stablyai/playwright-test';\n\n// Inline type definitions to avoid import failures when @stablyai/playwright-test is not installed\ntype StablyNotificationConfig = {\n email?: { to: string[]; notifyOnStart?: boolean; notifyOnResult?: 'all' | 'failures-only' | null } | null;\n slack?: { channelName: string; notifyOnStart?: boolean; notifyOnResult?: 'all' | 'failures-only' } | null;\n};\n\ntype ProjectNotificationConfig = {\n projectName: string;\n notifications: StablyNotificationConfig;\n};\n\n// Extract notification configs from projects that have stably.notifications defined\n// This runs at config-load time before Playwright strips custom properties\nconst extractNotificationConfigs = (): ProjectNotificationConfig[] | undefined => {\n const projects = baseConfig.projects;\n if (!projects || !Array.isArray(projects)) return undefined;\n\n const configs = projects\n .map((p: { name?: string; stably?: { notifications?: StablyNotificationConfig } }) => {\n const notifications = p.stably?.notifications;\n return notifications ? { projectName: p.name ?? '', notifications } : undefined;\n })\n .filter((config): config is ProjectNotificationConfig => config != null);\n\n return configs.length > 0 ? configs : undefined;\n};\n\nconst isStablyReporter = (reporter: unknown): boolean => {\n // Only match @stablyai npm scope to avoid false positives on unrelated reporters\n // that might contain "stably" substring (e.g., "unstably-runner")\n if (typeof reporter === 'string') {\n return reporter.includes('@stablyai');\n }\n if (Array.isArray(reporter) && typeof reporter[0] === 'string') {\n return reporter[0].includes('@stablyai');\n }\n return false;\n};\n\nconst filterOutStablyReporter = (reporters: unknown[]): unknown[] => {\n return reporters.filter((reporter) => !isStablyReporter(reporter));\n};\n\nconst buildReporterList = () => {\n const existingReporters = baseConfig.reporter;\n\n // Create the stably reporter entry with notification configs\n // This replaces any existing stably reporter to ensure notificationConfigs are included\n const stablyReporterEntry = stablyReporter({\n apiKey: process.env.STABLY_API_KEY,\n projectId: process.env.STABLY_PROJECT_ID,\n notificationConfigs: extractNotificationConfigs(),\n });\n\n // No existing reporters - just return our reporter\n if (!existingReporters) {\n return [stablyReporterEntry];\n }\n\n // Array of reporters - filter out any existing stably reporter and add ours\n if (Array.isArray(existingReporters)) {\n const filtered = filterOutStablyReporter(existingReporters);\n return [...filtered, stablyReporterEntry];\n }\n\n // Single reporter as string - check if it's a stably reporter\n if (typeof existingReporters === 'string') {\n if (isStablyReporter(existingReporters)) {\n return [stablyReporterEntry];\n }\n return [[existingReporters, {}], stablyReporterEntry];\n }\n\n // For any other type (class, object, etc.), wrap it and add our reporter\n return [[existingReporters, {}], stablyReporterEntry];\n};\n\nexport default defineConfig({\n ...baseConfig,\n use: {\n ...baseConfig.use,\n trace: 'on',\n },\n reporter: buildReporterList(),\n});\n`.trim();return s.existsSync(a)||s.mkdirSync(a,{recursive:!0}),s.writeFileSync(l,u,"utf-8"),function(e){const t=r.join(e,".gitignore");try{if(s.existsSync(t)){const e=s.readFileSync(t,"utf-8");if(e.split("\n").map(e=>e.trim()).includes(Ln))return;const r=e.length>0&&!e.endsWith("\n");s.appendFileSync(t,`${r?"\n":""}${Ln}\n`)}else s.writeFileSync(t,`${Ln}\n`)}catch{}}(a),l}({baseConfigPath:e,projectDir:t})}catch{return void console.warn("⚠️ Could not create Stably wrapper config. Reporter injection skipped.")}};if(e.some(e=>"--config"===e||"-c"===e||e.startsWith("--config=")||e.startsWith("-c="))){const t=e.findIndex(e=>"--config"===e||"-c"===e);if(-1!==t&&e[t+1]){const n=r.resolve(o,e[t+1]),s=r.dirname(n);if(!i(s))return;const c=a(n,s);if(!c)return;return e[t+1]=c,c}const n=e.findIndex(e=>e.startsWith("--config=")||e.startsWith("-c="));if(-1!==n){const t=r.resolve(o,e[n].split("=")[1]),s=r.dirname(t);if(!i(s))return;const c=a(t,s);if(!c)return;const l=e[n].startsWith("--config=")?"--config=":"-c=";return e[n]=`${l}${c}`,c}}const c=Bn(o);if(!c)return;const l=r.dirname(c);if(!i(l))return;const u=a(c,l);return u?(e.push("--config",u),u):void 0}({forwardedArgs:f,hasCredentials:null!=h}):void 0;!function(e,t={}){const r=po();r.installed||(console.error('Playwright is not installed. Please run "stably init" to install it.'),process.exit(1)),r.inNodeModules||(console.error("Playwright is present in your project, but not in node_modules. Please install your dependencies before proceeding."),process.exit(1));const{packageManager:o}=r;o||(console.error("Playwright installation not found. Could not determine your package manager (tried pnpm, yarn, and npm)."),process.exit(1));const[s,...i]=mo(o),a=tn(t.env),c=n.spawn(s,[...i,...e],{stdio:["inherit","pipe","pipe"],env:{...a,...process.env.CI?{}:{FORCE_COLOR:"1"}}}),l=yo(o);c.stdout?.on("data",e=>{l(e,process.stdout)}),c.stderr?.on("data",e=>{l(e,process.stderr)});let u=!1;const d=()=>{u||(u=!0,t.onClose?.())};c.on("close",e=>{d(),process.exit(e??0)});const p=e=>{d(),c.kill(e);const t="SIGINT"===e?130:143;process.exit(t)};process.on("SIGINT",p),process.on("SIGTERM",p)}(f,{env:h,onClose:()=>{var e;(e=m)&&s.existsSync(e)&&s.rmSync(e)}})}({overrideArgs:e,subcommand:o}))});var Mo=()=>{0!==Do.length&&(process.stderr.write(Do.join("")),Do=[])};(async()=>{await(async()=>{if(!Uo&&"1"!==process.env.STABLY_DISABLE_TELEMETRY&&"1"!==process.env.DO_NOT_TRACK&&!process.argv.includes("--no-telemetry"))try{const{init:e}=await import("@hyperdx/node-opentelemetry");e({apiKey:"61d10b50-9534-47be-a732-95bfe461adb7",service:"stably-cli",consoleCapture:!0,disableTracing:!0,disableMetrics:!0,disableStartupLogs:!0,additionalResourceAttributes:{"cli.version":er,"node.version":process.version,"os.platform":process.platform}}),Uo=!0}catch{}})();try{await No.parseAsync(process.argv),Vr.info("CLI completed successfully")}catch(e){if(!(e=>!!e&&"object"==typeof e&&"code"in e)(e))throw Vr.error("Unexpected CLI error",{error:e instanceof Error?e.message:String(e),stack:e instanceof Error?e.stack:void 0}),Mo(),Vr.flush(),Vr.printLogFileInfo(),await Po(),e;const t="number"==typeof e.exitCode?e.exitCode:1,r=process.argv.slice(2).find(e=>!e.startsWith("-")),n=!!r&&!!jo(No,[r]);if(("commander.excessArguments"===e.code||"commander.unknownCommand"===e.code)&&r&&!n)return Do=[],Vr.warn("Unknown command",{command:r}),process.stderr.write(`command '${r}' not found\n`),$o(),void(process.exitCode=t);Vr.debug("Commander error",{code:e.code,exitCode:t}),Mo(),process.exitCode=t}finally{Vr.flush(),await Po()}})();
2
+ "use strict";var e=require("commander"),t=require("buffer"),r=require("path"),n=require("child_process"),o=require("process"),s=require("fs"),i=require("url"),a=require("os");require("timers/promises");var c=require("stream"),l=require("util"),d=require("@anthropic-ai/claude-agent-sdk"),u=require("dotenv"),p=require("picocolors"),f=require("simple-git"),h=require("crypto"),g=require("fs/promises"),m=require("@clack/prompts"),y=require("readline/promises"),_=require("zod"),b=require("open"),E=require("http"),I=require("pino"),w=require("sonic-boom"),v=require("zod/v3"),T=require("react"),x=require("react/jsx-runtime"),S=require("yaml"),R=require("@stablyhq/runner-sdk");function C(e){return e&&e.__esModule?e:{default:e}}var A=C(r),P=C(n),U=C(o),L=C(s),O=C(a),B=C(c),D=C(p),N=C(h),j=C(g),k=C(_),$=C(b),M=C(E),H=C(I),G=C(w),F={detect:({env:e})=>Boolean(e.APPVEYOR),configuration({env:e}){const t=e.APPVEYOR_PULL_REQUEST_NUMBER,r=Boolean(t);return{name:"Appveyor",service:"appveyor",commit:e.APPVEYOR_REPO_COMMIT,tag:e.APPVEYOR_REPO_TAG_NAME,build:e.APPVEYOR_BUILD_NUMBER,buildUrl:`https://ci.appveyor.com/project/${e.APPVEYOR_PROJECT_SLUG}/build/${e.APPVEYOR_BUILD_VERSION}`,branch:e.APPVEYOR_REPO_BRANCH,job:e.APPVEYOR_JOB_NUMBER,jobUrl:`https://ci.appveyor.com/project/${e.APPVEYOR_PROJECT_SLUG}/build/job/${e.APPVEYOR_JOB_ID}`,pr:t,isPr:r,prBranch:e.APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH,slug:e.APPVEYOR_REPO_NAME,root:e.APPVEYOR_BUILD_FOLDER}}};function Y(e){return(/\d+(?!.*\d+)/.exec(e)||[])[0]}function z(e){return e?/^(?:refs\/heads\/)?(?<branch>.+)$/i.exec(e)[1]:void 0}var W={detect:({env:e})=>Boolean(e.BUILD_BUILDURI),configuration({env:e}){const t=e.SYSTEM_PULLREQUEST_PULLREQUESTID,r=Boolean(t);return{name:"Azure Pipelines",service:"azurePipelines",commit:e.BUILD_SOURCEVERSION,build:e.BUILD_BUILDNUMBER,branch:z(r?e.SYSTEM_PULLREQUEST_TARGETBRANCH:e.BUILD_SOURCEBRANCH),pr:t,isPr:r,prBranch:z(r?e.SYSTEM_PULLREQUEST_SOURCEBRANCH:void 0),root:e.BUILD_REPOSITORY_LOCALPATH}}},K={detect:({env:e})=>Boolean(e.bamboo_agentId),configuration:({env:e})=>({name:"Bamboo",service:"bamboo",commit:e.bamboo_planRepository_1_revision,build:e.bamboo_buildNumber,buildUrl:e.bamboo_buildResultsUrl,branch:e.bamboo_planRepository_1_branchName,job:e.bamboo_buildKey,root:e.bamboo_build_working_directory})},V={detect:({env:e})=>Boolean(e.BITBUCKET_BUILD_NUMBER),configuration:({env:e})=>({name:"Bitbucket Pipelines",service:"bitbucket",commit:e.BITBUCKET_COMMIT,tag:e.BITBUCKET_TAG,build:e.BITBUCKET_BUILD_NUMBER,buildUrl:`https://bitbucket.org/${e.BITBUCKET_REPO_FULL_NAME}/addon/pipelines/home#!/results/${e.BITBUCKET_BUILD_NUMBER}`,branch:e.BITBUCKET_BRANCH,slug:e.BITBUCKET_REPO_FULL_NAME,root:e.BITBUCKET_CLONE_DIR})},q={detect:({env:e})=>Boolean(e.BITRISE_IO),configuration({env:e}){const t="false"===e.BITRISE_PULL_REQUEST?void 0:e.BITRISE_PULL_REQUEST,r=Boolean(t);return{name:"Bitrise",service:"bitrise",commit:e.BITRISE_GIT_COMMIT,tag:e.BITRISE_GIT_TAG,build:e.BITRISE_BUILD_NUMBER,buildUrl:e.BITRISE_BUILD_URL,branch:r?e.BITRISEIO_GIT_BRANCH_DEST:e.BITRISE_GIT_BRANCH,pr:t,isPr:r,prBranch:r?e.BITRISE_GIT_BRANCH:void 0,slug:e.BITRISE_APP_SLUG}}},J={detect:({env:e})=>Boolean(e.BUDDY_WORKSPACE_ID),configuration({env:e}){const t=Y(e.BUDDY_EXECUTION_PULL_REQUEST_ID),r=Boolean(t);return{name:"Buddy",service:"buddy",commit:e.BUDDY_EXECUTION_REVISION,tag:e.BUDDY_EXECUTION_TAG,build:e.BUDDY_EXECUTION_ID,buildUrl:e.BUDDY_EXECUTION_URL,branch:r?e.BUDDY_EXECUTION_PULL_REQUEST_HEAD_BRANCH:e.BUDDY_EXECUTION_BRANCH,pr:t,isPr:r,slug:e.BUDDY_REPO_SLUG}}},X="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function Q(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var Z,ee,te,re,ne,oe,se,ie,ae={exports:{}};var ce,le,de,ue,pe,fe,he,ge,me,ye,_e,be,Ee,Ie,we,ve={exports:{}},Te={};function xe(){if(be)return _e;be=1;const e=A.default,t=function(){if(de)return le;de=1;const e=A.default,t=function(){if(ie)return se;ie=1;const e="win32"===process.platform||"cygwin"===process.env.OSTYPE||"msys"===process.env.OSTYPE,t=A.default,r=e?";":":",n=function(){if(oe)return ne;var e;function t(r,n,o){if("function"==typeof n&&(o=n,n={}),!o){if("function"!=typeof Promise)throw new TypeError("callback not provided");return new Promise(function(e,o){t(r,n||{},function(t,r){t?o(t):e(r)})})}e(r,n||{},function(e,t){e&&("EACCES"===e.code||n&&n.ignoreErrors)&&(e=null,t=!1),o(e,t)})}return oe=1,e="win32"===process.platform||X.TESTING_WINDOWS?function(){if(ee)return Z;ee=1,Z=r,r.sync=function(r,n){return t(e.statSync(r),r,n)};var e=L.default;function t(e,t,r){return!(!e.isSymbolicLink()&&!e.isFile())&&function(e,t){var r=void 0!==t.pathExt?t.pathExt:process.env.PATHEXT;if(!r)return!0;if(-1!==(r=r.split(";")).indexOf(""))return!0;for(var n=0;n<r.length;n++){var o=r[n].toLowerCase();if(o&&e.substr(-o.length).toLowerCase()===o)return!0}return!1}(t,r)}function r(r,n,o){e.stat(r,function(e,s){o(e,!e&&t(s,r,n))})}return Z}():function(){if(re)return te;re=1,te=t,t.sync=function(t,n){return r(e.statSync(t),n)};var e=L.default;function t(t,n,o){e.stat(t,function(e,t){o(e,!e&&r(t,n))})}function r(e,t){return e.isFile()&&function(e,t){var r=e.mode,n=e.uid,o=e.gid,s=void 0!==t.uid?t.uid:process.getuid&&process.getuid(),i=void 0!==t.gid?t.gid:process.getgid&&process.getgid(),a=parseInt("100",8),c=parseInt("010",8);return r&parseInt("001",8)||r&c&&o===i||r&a&&n===s||r&(a|c)&&0===s}(e,t)}return te}(),ne=t,t.sync=function(t,r){try{return e.sync(t,r||{})}catch(e){if(r&&r.ignoreErrors||"EACCES"===e.code)return!1;throw e}},ne}(),o=e=>Object.assign(new Error(`not found: ${e}`),{code:"ENOENT"}),s=(t,n)=>{const o=n.colon||r,s=t.match(/\//)||e&&t.match(/\\/)?[""]:[...e?[process.cwd()]:[],...(n.path||process.env.PATH||"").split(o)],i=e?n.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",a=e?i.split(o):[""];return e&&-1!==t.indexOf(".")&&""!==a[0]&&a.unshift(""),{pathEnv:s,pathExt:a,pathExtExe:i}},i=(e,r,i)=>{"function"==typeof r&&(i=r,r={}),r||(r={});const{pathEnv:a,pathExt:c,pathExtExe:l}=s(e,r),d=[],u=n=>new Promise((s,i)=>{if(n===a.length)return r.all&&d.length?s(d):i(o(e));const c=a[n],l=/^".*"$/.test(c)?c.slice(1,-1):c,u=t.join(l,e),f=!l&&/^\.[\\\/]/.test(e)?e.slice(0,2)+u:u;s(p(f,n,0))}),p=(e,t,o)=>new Promise((s,i)=>{if(o===c.length)return s(u(t+1));const a=c[o];n(e+a,{pathExt:l},(n,i)=>{if(!n&&i){if(!r.all)return s(e+a);d.push(e+a)}return s(p(e,t,o+1))})});return i?u(0).then(e=>i(null,e),i):u(0)};return se=i,i.sync=(e,r)=>{r=r||{};const{pathEnv:i,pathExt:a,pathExtExe:c}=s(e,r),l=[];for(let o=0;o<i.length;o++){const s=i[o],d=/^".*"$/.test(s)?s.slice(1,-1):s,u=t.join(d,e),p=!d&&/^\.[\\\/]/.test(e)?e.slice(0,2)+u:u;for(let e=0;e<a.length;e++){const t=p+a[e];try{if(n.sync(t,{pathExt:c})){if(!r.all)return t;l.push(t)}}catch(e){}}}if(r.all&&l.length)return l;if(r.nothrow)return null;throw o(e)},se}(),r=function(){if(ce)return ve.exports;ce=1;const e=(e={})=>{const t=e.env||process.env;return"win32"!==(e.platform||process.platform)?"PATH":Object.keys(t).reverse().find(e=>"PATH"===e.toUpperCase())||"Path"};return ve.exports=e,ve.exports.default=e,ve.exports}();function n(n,o){const s=n.options.env||process.env,i=process.cwd(),a=null!=n.options.cwd,c=a&&void 0!==process.chdir&&!process.chdir.disabled;if(c)try{process.chdir(n.options.cwd)}catch(e){}let l;try{l=t.sync(n.command,{path:s[r({env:s})],pathExt:o?e.delimiter:void 0})}catch(e){}finally{c&&process.chdir(i)}return l&&(l=e.resolve(a?n.options.cwd:"",l)),l}return le=function(e){return n(e)||n(e,!0)}}(),r=function(){if(ue)return Te;ue=1;const e=/([()\][%!^"`<>&|;, *?])/g;return Te.command=function(t){return t.replace(e,"^$1")},Te.argument=function(t,r){return t=(t=`"${t=(t=(t=`${t}`).replace(/(?=(\\+?)?)\1"/g,'$1$1\\"')).replace(/(?=(\\+?)?)\1$/,"$1$1")}"`).replace(e,"^$1"),r&&(t=t.replace(e,"^$1")),t},Te}(),n=function(){if(ye)return me;ye=1;const e=L.default,t=function(){if(ge)return he;ge=1;const e=fe?pe:(fe=1,pe=/^#!(.*)/);return he=(t="")=>{const r=t.match(e);if(!r)return null;const[n,o]=r[0].replace(/#! ?/,"").split(" "),s=n.split("/").pop();return"env"===s?o:o?`${s} ${o}`:s}}();return me=function(r){const n=Buffer.alloc(150);let o;try{o=e.openSync(r,"r"),e.readSync(o,n,0,150,0),e.closeSync(o)}catch(e){}return t(n.toString())},me}(),o="win32"===process.platform,s=/\.(?:com|exe)$/i,i=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;return _e=function(a,c,l){c&&!Array.isArray(c)&&(l=c,c=null);const d={command:a,args:c=c?c.slice(0):[],options:l=Object.assign({},l),file:void 0,original:{command:a,args:c}};return l.shell?d:function(a){if(!o)return a;const c=function(e){e.file=t(e);const r=e.file&&n(e.file);return r?(e.args.unshift(e.file),e.command=r,t(e)):e.file}(a),l=!s.test(c);if(a.options.forceShell||l){const t=i.test(c);a.command=e.normalize(a.command),a.command=r.command(a.command),a.args=a.args.map(e=>r.argument(e,t));const n=[a.command].concat(a.args).join(" ");a.args=["/d","/s","/c",`"${n}"`],a.command=process.env.comspec||"cmd.exe",a.options.windowsVerbatimArguments=!0}return a}(d)}}var Se=Q(function(){if(we)return ae.exports;we=1;const e=P.default,t=xe(),r=function(){if(Ie)return Ee;Ie=1;const e="win32"===process.platform;function t(e,t){return Object.assign(new Error(`${t} ${e.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${t} ${e.command}`,path:e.command,spawnargs:e.args})}function r(r,n){return e&&1===r&&!n.file?t(n.original,"spawn"):null}return Ee={hookChildProcess:function(t,n){if(!e)return;const o=t.emit;t.emit=function(e,s){if("exit"===e){const e=r(s,n);if(e)return o.call(t,"error",e)}return o.apply(t,arguments)}},verifyENOENT:r,verifyENOENTSync:function(r,n){return e&&1===r&&!n.file?t(n.original,"spawnSync"):null},notFoundError:t},Ee}();function n(n,o,s){const i=t(n,o,s),a=e.spawn(i.command,i.args,i.options);return r.hookChildProcess(a,i),a}return ae.exports=n,ae.exports.spawn=n,ae.exports.sync=function(n,o,s){const i=t(n,o,s),a=e.spawnSync(i.command,i.args,i.options);return a.error=a.error||r.verifyENOENTSync(a.status,i),a},ae.exports._parse=t,ae.exports._enoent=r,ae.exports}());function Re(e={}){const{env:t=process.env,platform:r=process.platform}=e;return"win32"!==r?"PATH":Object.keys(t).reverse().find(e=>"PATH"===e.toUpperCase())||"Path"}var Ce=(e,t)=>({name:`SIGRT${t+1}`,number:Ae+t,action:"terminate",description:"Application-specific signal (realtime)",standard:"posix"}),Ae=34,Pe=[{name:"SIGHUP",number:1,action:"terminate",description:"Terminal closed",standard:"posix"},{name:"SIGINT",number:2,action:"terminate",description:"User interruption with CTRL-C",standard:"ansi"},{name:"SIGQUIT",number:3,action:"core",description:"User interruption with CTRL-\\",standard:"posix"},{name:"SIGILL",number:4,action:"core",description:"Invalid machine instruction",standard:"ansi"},{name:"SIGTRAP",number:5,action:"core",description:"Debugger breakpoint",standard:"posix"},{name:"SIGABRT",number:6,action:"core",description:"Aborted",standard:"ansi"},{name:"SIGIOT",number:6,action:"core",description:"Aborted",standard:"bsd"},{name:"SIGBUS",number:7,action:"core",description:"Bus error due to misaligned, non-existing address or paging error",standard:"bsd"},{name:"SIGEMT",number:7,action:"terminate",description:"Command should be emulated but is not implemented",standard:"other"},{name:"SIGFPE",number:8,action:"core",description:"Floating point arithmetic error",standard:"ansi"},{name:"SIGKILL",number:9,action:"terminate",description:"Forced termination",standard:"posix",forced:!0},{name:"SIGUSR1",number:10,action:"terminate",description:"Application-specific signal",standard:"posix"},{name:"SIGSEGV",number:11,action:"core",description:"Segmentation fault",standard:"ansi"},{name:"SIGUSR2",number:12,action:"terminate",description:"Application-specific signal",standard:"posix"},{name:"SIGPIPE",number:13,action:"terminate",description:"Broken pipe or socket",standard:"posix"},{name:"SIGALRM",number:14,action:"terminate",description:"Timeout or timer",standard:"posix"},{name:"SIGTERM",number:15,action:"terminate",description:"Termination",standard:"ansi"},{name:"SIGSTKFLT",number:16,action:"terminate",description:"Stack is empty or overflowed",standard:"other"},{name:"SIGCHLD",number:17,action:"ignore",description:"Child process terminated, paused or unpaused",standard:"posix"},{name:"SIGCLD",number:17,action:"ignore",description:"Child process terminated, paused or unpaused",standard:"other"},{name:"SIGCONT",number:18,action:"unpause",description:"Unpaused",standard:"posix",forced:!0},{name:"SIGSTOP",number:19,action:"pause",description:"Paused",standard:"posix",forced:!0},{name:"SIGTSTP",number:20,action:"pause",description:'Paused using CTRL-Z or "suspend"',standard:"posix"},{name:"SIGTTIN",number:21,action:"pause",description:"Background process cannot read terminal input",standard:"posix"},{name:"SIGBREAK",number:21,action:"terminate",description:"User interruption with CTRL-BREAK",standard:"other"},{name:"SIGTTOU",number:22,action:"pause",description:"Background process cannot write to terminal output",standard:"posix"},{name:"SIGURG",number:23,action:"ignore",description:"Socket received out-of-band data",standard:"bsd"},{name:"SIGXCPU",number:24,action:"core",description:"Process timed out",standard:"bsd"},{name:"SIGXFSZ",number:25,action:"core",description:"File too big",standard:"bsd"},{name:"SIGVTALRM",number:26,action:"terminate",description:"Timeout or timer",standard:"bsd"},{name:"SIGPROF",number:27,action:"terminate",description:"Timeout or timer",standard:"bsd"},{name:"SIGWINCH",number:28,action:"ignore",description:"Terminal window size changed",standard:"bsd"},{name:"SIGIO",number:29,action:"terminate",description:"I/O is available",standard:"other"},{name:"SIGPOLL",number:29,action:"terminate",description:"Watched event",standard:"other"},{name:"SIGINFO",number:29,action:"ignore",description:"Request for process information",standard:"other"},{name:"SIGPWR",number:30,action:"terminate",description:"Device running out of power",standard:"systemv"},{name:"SIGSYS",number:31,action:"core",description:"Invalid system call",standard:"other"},{name:"SIGUNUSED",number:31,action:"terminate",description:"Invalid system call",standard:"other"}],Ue=()=>{const e=(()=>{const e=64-Ae+1;return Array.from({length:e},Ce)})();return[...Pe,...e].map(Le)},Le=({name:e,number:t,description:r,action:n,forced:o=!1,standard:s})=>{const{signals:{[e]:i}}=a.constants,c=void 0!==i;return{name:e,number:c?i:t,description:r,supported:c,action:n,forced:o,standard:s}},Oe=({name:e,number:t,description:r,supported:n,action:o,forced:s,standard:i})=>[e,{name:e,number:t,description:r,supported:n,action:o,forced:s,standard:i}],Be=(()=>{const e=Ue();return Object.fromEntries(e.map(Oe))})();(()=>{const e=Ue(),t=Array.from({length:65},(t,r)=>((e,t)=>{const r=((e,t)=>{const r=t.find(({name:t})=>a.constants.signals[t]===e);return void 0!==r?r:t.find(t=>t.number===e)})(e,t);if(void 0===r)return{};const{name:n,description:o,supported:s,action:i,forced:c,standard:l}=r;return{[e]:{name:n,number:e,description:o,supported:s,action:i,forced:c,standard:l}}})(r,e));Object.assign({},...t)})();var De=({stdout:e,stderr:t,all:r,error:n,signal:o,exitCode:s,command:i,escapedCommand:a,timedOut:c,isCanceled:l,killed:d,parsed:{options:{timeout:u,cwd:p=U.default.cwd()}}})=>{s=null===s?void 0:s;const f=void 0===(o=null===o?void 0:o)?void 0:Be[o].description,h=(({timedOut:e,timeout:t,errorCode:r,signal:n,signalDescription:o,exitCode:s,isCanceled:i})=>e?`timed out after ${t} milliseconds`:void 0!==r?`failed with ${r}`:void 0!==n?`was killed with ${n} (${o})`:void 0!==s?`failed with exit code ${s}`:"failed")({timedOut:c,timeout:u,errorCode:n&&n.code,signal:o,signalDescription:f,exitCode:s,isCanceled:l}),g=`Command ${h}: ${i}`,m="[object Error]"===Object.prototype.toString.call(n),y=m?`${g}\n${n.message}`:g,_=[y,t,e].filter(Boolean).join("\n");return m?(n.originalMessage=n.message,n.message=_):n=new Error(_),n.shortMessage=y,n.command=i,n.escapedCommand=a,n.exitCode=s,n.signal=o,n.signalDescription=f,n.stdout=e,n.stderr=t,n.cwd=p,void 0!==r&&(n.all=r),"bufferedData"in n&&delete n.bufferedData,n.failed=!0,n.timedOut=Boolean(c),n.isCanceled=l,n.killed=d&&!c,n},Ne=["stdin","stdout","stderr"],je=[];je.push("SIGHUP","SIGINT","SIGTERM"),"win32"!==process.platform&&je.push("SIGALRM","SIGABRT","SIGVTALRM","SIGXCPU","SIGXFSZ","SIGUSR2","SIGTRAP","SIGSYS","SIGQUIT","SIGIOT"),"linux"===process.platform&&je.push("SIGIO","SIGPOLL","SIGPWR","SIGSTKFLT");var ke,$e,Me=e=>!!e&&"object"==typeof e&&"function"==typeof e.removeListener&&"function"==typeof e.emit&&"function"==typeof e.reallyExit&&"function"==typeof e.listeners&&"function"==typeof e.kill&&"number"==typeof e.pid&&"function"==typeof e.on,He=Symbol.for("signal-exit emitter"),Ge=globalThis,Fe=Object.defineProperty.bind(Object),Ye=class{emitted={afterExit:!1,exit:!1};listeners={afterExit:[],exit:[]};count=0;id=Math.random();constructor(){if(Ge[He])return Ge[He];Fe(Ge,He,{value:this,writable:!1,enumerable:!1,configurable:!1})}on(e,t){this.listeners[e].push(t)}removeListener(e,t){const r=this.listeners[e],n=r.indexOf(t);-1!==n&&(0===n&&1===r.length?r.length=0:r.splice(n,1))}emit(e,t,r){if(this.emitted[e])return!1;this.emitted[e]=!0;let n=!1;for(const o of this.listeners[e])n=!0===o(t,r)||n;return"exit"===e&&(n=this.emit("afterExit",t,r)||n),n}},ze=class{},We=globalThis.process;Me(We)?new class extends ze{#e="win32"===We.platform?"SIGINT":"SIGHUP";#t=new Ye;#r;#n;#o;#s={};#i=!1;constructor(e){super(),this.#r=e,this.#s={};for(const t of je)this.#s[t]=()=>{const r=this.#r.listeners(t);let{count:n}=this.#t;const o=e;if("object"==typeof o.__signal_exit_emitter__&&"number"==typeof o.__signal_exit_emitter__.count&&(n+=o.__signal_exit_emitter__.count),r.length===n){this.unload();const r=this.#t.emit("exit",null,t),n="SIGHUP"===t?this.#e:t;r||e.kill(e.pid,n)}};this.#o=e.reallyExit,this.#n=e.emit}onExit(e,t){if(!Me(this.#r))return()=>{};!1===this.#i&&this.load();const r=t?.alwaysLast?"afterExit":"exit";return this.#t.on(r,e),()=>{this.#t.removeListener(r,e),0===this.#t.listeners.exit.length&&0===this.#t.listeners.afterExit.length&&this.unload()}}load(){if(!this.#i){this.#i=!0,this.#t.count+=1;for(const e of je)try{const t=this.#s[e];t&&this.#r.on(e,t)}catch(e){}this.#r.emit=(e,...t)=>this.#a(e,...t),this.#r.reallyExit=e=>this.#c(e)}}unload(){this.#i&&(this.#i=!1,je.forEach(e=>{const t=this.#s[e];if(!t)throw new Error("Listener not defined for signal: "+e);try{this.#r.removeListener(e,t)}catch(e){}}),this.#r.emit=this.#n,this.#r.reallyExit=this.#o,this.#t.count-=1)}#c(e){return Me(this.#r)?(this.#r.exitCode=e||0,this.#t.emit("exit",this.#r.exitCode,null),this.#o.call(this.#r,this.#r.exitCode)):0}#a(e,...t){const r=this.#n;if("exit"===e&&Me(this.#r)){"number"==typeof t[0]&&(this.#r.exitCode=t[0]);const n=r.call(this.#r,e,...t);return this.#t.emit("exit",this.#r.exitCode,null),n}return r.call(this.#r,e,...t)}}(We):new class extends ze{onExit(){return()=>{}}load(){}unload(){}},new TextEncoder,function(){if($e)return ke;$e=1;const{PassThrough:e}=B.default;ke=function(){var t=[],r=new e({objectMode:!0});return r.setMaxListeners(0),r.add=n,r.isEmpty=function(){return 0==t.length},r.on("unpipe",o),Array.prototype.slice.call(arguments).forEach(n),r;function n(e){return Array.isArray(e)?(e.forEach(n),this):(t.push(e),e.once("end",o.bind(null,e)),e.once("error",r.emit.bind(r,"error")),e.pipe(r,{end:!1}),this)}function o(e){!(t=t.filter(function(t){return t!==e})).length&&r.readable&&r.end()}}}();var Ke=(async()=>{})().constructor.prototype;["then","catch","finally"].map(e=>[e,Reflect.getOwnPropertyDescriptor(Ke,e)]);var Ve=(e,t=[])=>Array.isArray(t)?[e,...t]:[e],qe=/^[\w.-]+$/,Je=l.debuglog("execa").enabled,Xe=(e,t)=>String(e).padStart(t,"0"),Qe=(e,t,r={})=>{const n=Se._parse(e,t,r);return e=n.command,t=n.args,(r={maxBuffer:1e8,buffer:!0,stripFinalNewline:!0,extendEnv:!0,preferLocal:!1,localDir:(r=n.options).cwd||U.default.cwd(),execPath:U.default.execPath,encoding:"utf8",reject:!0,cleanup:!0,all:!1,windowsHide:!0,verbose:Je,...r}).env=(({env:e,extendEnv:t,preferLocal:r,localDir:n,execPath:o})=>{const s=t?{...U.default.env,...e}:e;return r?(({env:e=U.default.env,...t}={})=>{const r=Re({env:e={...e}});return t.path=e[r],e[r]=(({cwd:e=U.default.cwd(),path:t=U.default.env[Re()],preferLocal:r=!0,execPath:n=U.default.execPath,addExecPath:o=!0}={})=>{const s=e instanceof URL?i.fileURLToPath(e):e,a=A.default.resolve(s),c=[];return r&&((e,t)=>{let r;for(;r!==t;)e.push(A.default.join(t,"node_modules/.bin")),r=t,t=A.default.resolve(t,"..")})(c,a),o&&((e,t,r)=>{const n=t instanceof URL?i.fileURLToPath(t):t;e.push(A.default.resolve(r,n,".."))})(c,n,a),[...c,t].join(A.default.delimiter)})(t),e})({env:s,cwd:n,execPath:o}):s})(r),r.stdio=(e=>{if(!e)return;const{stdio:t}=e;if(void 0===t)return Ne.map(t=>e[t]);if((e=>Ne.some(t=>void 0!==e[t]))(e))throw new Error(`It's not possible to provide \`stdio\` in combination with one of ${Ne.map(e=>`\`${e}\``).join(", ")}`);if("string"==typeof t)return t;if(!Array.isArray(t))throw new TypeError(`Expected \`stdio\` to be of type \`string\` or \`Array\`, got \`${typeof t}\``);const r=Math.max(t.length,Ne.length);return Array.from({length:r},(e,r)=>t[r])})(r),"win32"===U.default.platform&&"cmd"===A.default.basename(e,".exe")&&t.unshift("/q"),{file:e,args:t,options:r,parsed:n}},Ze=(e,r,n)=>"string"==typeof r||t.Buffer.isBuffer(r)?e.stripFinalNewline?function(e){const t="string"==typeof e?"\n":"\n".charCodeAt(),r="string"==typeof e?"\r":"\r".charCodeAt();return e[e.length-1]===t&&(e=e.slice(0,-1)),e[e.length-1]===r&&(e=e.slice(0,-1)),e}(r):r:void 0===n?void 0:"";function et(e,t,r){const n=Qe(e,t,r),o=((e,t)=>Ve(e,t).join(" "))(e,t),i=((e,t)=>Ve(e,t).map(e=>(e=>"string"!=typeof e||qe.test(e)?e:`"${e.replaceAll('"','\\"')}"`)(e)).join(" "))(e,t);((e,{verbose:t})=>{t&&U.default.stderr.write(`[${(()=>{const e=new Date;return`${Xe(e.getHours(),2)}:${Xe(e.getMinutes(),2)}:${Xe(e.getSeconds(),2)}.${Xe(e.getMilliseconds(),3)}`})()}] ${e}\n`)})(i,n.options);const a=(e=>{const t=(({input:e,inputFile:t})=>"string"!=typeof t?e:((e=>{if(void 0!==e)throw new TypeError("The `input` and `inputFile` options cannot be both set.")})(e),s.readFileSync(t)))(e);if(null!==(r=t)&&"object"==typeof r&&"function"==typeof r.pipe)throw new TypeError("The `input` option cannot be a stream in sync mode");var r;return t})(n.options);let c;try{c=P.default.spawnSync(n.file,n.args,{...n.options,input:a})}catch(e){throw De({error:e,stdout:"",stderr:"",all:"",command:o,escapedCommand:i,parsed:n,timedOut:!1,isCanceled:!1,killed:!1})}const l=Ze(n.options,c.stdout,c.error),d=Ze(n.options,c.stderr,c.error);if(c.error||0!==c.status||null!==c.signal){const e=De({stdout:l,stderr:d,error:c.error,signal:c.signal,exitCode:c.status,command:o,escapedCommand:i,parsed:n,timedOut:c.error&&"ETIMEDOUT"===c.error.code,isCanceled:!1,killed:null!==c.signal});if(!n.options.reject)return e;throw e}return{command:o,escapedCommand:i,exitCode:0,stdout:l,stderr:d,failed:!1,timedOut:!1,isCanceled:!1,killed:!1}}function tt(e){try{return et("git",["rev-parse","HEAD"],e).stdout}catch{return}}function rt(e){try{const t=et("git",["rev-parse","--abbrev-ref","HEAD"],e).stdout;if("HEAD"===t){const t=et("git",["show","-s","--pretty=%d","HEAD"],e).stdout.replace(/^\(|\)$/g,"").split(", ").find(e=>e.startsWith("origin/"));return t?t.match(/^origin\/(?<branch>.+)/)[1]:void 0}return t}catch{return}}var nt=/^(?:.*)@(?:.*):(?:\d+\/)?(.*)\.git$/,ot=/^\/(.*)\.git$/;function st(e){if(e){if(e.match(nt))return e.replace(nt,"$1");try{return new URL(e).pathname.replace(ot,"$1")}catch{return}}}var it,at={detect:({env:e})=>Boolean(e.BUILDKITE),configuration({env:e}){const t="false"===e.BUILDKITE_PULL_REQUEST?void 0:e.BUILDKITE_PULL_REQUEST,r=Boolean(t);return{name:"Buildkite",service:"buildkite",build:e.BUILDKITE_BUILD_NUMBER,buildUrl:e.BUILDKITE_BUILD_URL,commit:e.BUILDKITE_COMMIT,tag:e.BUILDKITE_TAG,branch:r?e.BUILDKITE_PULL_REQUEST_BASE_BRANCH:e.BUILDKITE_BRANCH,slug:st(e.BUILDKITE_REPO),pr:t,isPr:r,prBranch:r?e.BUILDKITE_BRANCH:void 0,root:e.BUILDKITE_BUILD_CHECKOUT_PATH}}},ct={detect:({env:e})=>Boolean(e.CIRCLECI),configuration({env:e}){const t=e.CIRCLE_PR_NUMBER||Y(e.CIRCLE_PULL_REQUEST||e.CI_PULL_REQUEST),r=Boolean(t);return{name:"CircleCI",service:"circleci",build:e.CIRCLE_BUILD_NUM,buildUrl:e.CIRCLE_BUILD_URL,job:`${e.CIRCLE_BUILD_NUM}.${e.CIRCLE_NODE_INDEX}`,commit:e.CIRCLE_SHA1,tag:e.CIRCLE_TAG,branch:r?void 0:e.CIRCLE_BRANCH,pr:t,isPr:r,prBranch:r?e.CIRCLE_BRANCH:void 0,slug:`${e.CIRCLE_PROJECT_USERNAME}/${e.CIRCLE_PROJECT_REPONAME}`}}},lt="https://cirrus-ci.com",dt={detect:({env:e})=>Boolean(e.CIRRUS_CI),configuration({env:e}){const t=e.CIRRUS_PR,r=Boolean(t);return{name:"Cirrus CI",service:"cirrus",commit:e.CIRRUS_CHANGE_IN_REPO,tag:e.CIRRUS_TAG,build:e.CIRRUS_BUILD_ID,buildUrl:`${lt}/build/${e.CIRRUS_BUILD_ID}`,job:e.CIRRUS_TASK_ID,jobUrl:`${lt}/task/${e.CIRRUS_TASK_ID}`,branch:r?e.CIRRUS_BASE_BRANCH:e.CIRRUS_BRANCH,pr:t,isPr:r,prBranch:r?e.CIRRUS_BRANCH:void 0,slug:e.CIRRUS_REPO_FULL_NAME,root:e.CIRRUS_WORKING_DIR}}},ut={detect:({env:e})=>Boolean(e.CODEBUILD_BUILD_ID),configuration:({env:e,cwd:t})=>({name:"AWS CodeBuild",service:"codebuild",commit:tt({env:e,cwd:t}),build:e.CODEBUILD_BUILD_ID,branch:rt({env:e,cwd:t}),buildUrl:`https://console.aws.amazon.com/codebuild/home?region=${e.AWS_REGION}#/builds/${e.CODEBUILD_BUILD_ID}/view/new`,root:e.PWD})},pt={detect:({env:e})=>Boolean(e.CF_BUILD_ID),configuration({env:e}){const t=e.CF_PULL_REQUEST_NUMBER,r=Boolean(t);return{name:"Codefresh",service:"codefresh",commit:e.CF_REVISION,build:e.CF_BUILD_ID,buildUrl:e.CF_BUILD_URL,branch:r?e.CF_PULL_REQUEST_TARGET:e.CF_BRANCH,pr:t,isPr:r,prBranch:r?e.CF_BRANCH:void 0,slug:`${e.CF_REPO_OWNER}/${e.CF_REPO_NAME}`,root:e.CF_VOLUME_PATH}}},ft={detect:({env:e})=>Boolean(e.DRONE),configuration({env:e}){const t="pull_request"===e.DRONE_BUILD_EVENT;return{name:"Drone",service:"drone",commit:e.DRONE_COMMIT_SHA,tag:e.DRONE_TAG,build:e.DRONE_BUILD_NUMBER,buildUrl:e.DRONE_BUILD_LINK,branch:t?e.DRONE_TARGET_BRANCH:e.DRONE_BRANCH,job:e.DRONE_JOB_NUMBER,jobUrl:e.DRONE_BUILD_LINK,pr:e.DRONE_PULL_REQUEST,isPr:t,prBranch:t?e.DRONE_SOURCE_BRANCH:void 0,slug:`${e.DRONE_REPO_OWNER}/${e.DRONE_REPO_NAME}`,root:e.DRONE_WORKSPACE}}},ht=({env:e})=>{try{const t=e.GITHUB_EVENT_PATH?JSON.parse(s.readFileSync(e.GITHUB_EVENT_PATH,"utf-8")):void 0;if(t&&t.pull_request)return{branch:t.pull_request.base?z(t.pull_request.base.ref):void 0,pr:t.pull_request.number}}catch{}return{pr:void 0,branch:void 0}},gt={detect:({env:e})=>Boolean(e.GITHUB_ACTIONS),configuration({env:e,cwd:t}){const r="pull_request"===e.GITHUB_EVENT_NAME||"pull_request_target"===e.GITHUB_EVENT_NAME,n=z("pull_request_target"===e.GITHUB_EVENT_NAME?`refs/pull/${(e=>{const t=e.GITHUB_EVENT_PATH?JSON.parse(s.readFileSync(e.GITHUB_EVENT_PATH,"utf-8")):void 0;return t&&t.pull_request?t.pull_request.number:void 0})(e)}/merge`:e.GITHUB_REF);return{name:"GitHub Actions",service:"github",commit:e.GITHUB_SHA,build:e.GITHUB_RUN_ID,buildUrl:`${e.GITHUB_SERVER_URL}/${e.GITHUB_REPOSITORY}/actions/runs/${e.GITHUB_RUN_ID}`,isPr:r,branch:n,prBranch:r?n:void 0,slug:e.GITHUB_REPOSITORY,root:e.GITHUB_WORKSPACE,...r?ht({env:e}):void 0}}},mt={detect:({env:e})=>Boolean(e.GITLAB_CI),configuration({env:e}){const t=e.CI_MERGE_REQUEST_ID,r=Boolean(t);return{name:"GitLab CI/CD",service:"gitlab",commit:e.CI_COMMIT_SHA,tag:e.CI_COMMIT_TAG,build:e.CI_PIPELINE_ID,buildUrl:`${e.CI_PROJECT_URL}/pipelines/${e.CI_PIPELINE_ID}`,job:e.CI_JOB_ID,jobUrl:`${e.CI_PROJECT_URL}/-/jobs/${e.CI_JOB_ID}`,branch:r?e.CI_MERGE_REQUEST_TARGET_BRANCH_NAME:e.CI_COMMIT_REF_NAME,pr:t,isPr:r,prBranch:e.CI_MERGE_REQUEST_SOURCE_BRANCH_NAME,slug:e.CI_PROJECT_PATH,root:e.CI_PROJECT_DIR}}},yt={detect:({env:e})=>Boolean(e.JENKINS_URL),configuration({env:e,cwd:t}){const r=e.ghprbPullId||e.gitlabMergeRequestId||e.CHANGE_ID,n=Boolean(r),o=e.GIT_LOCAL_BRANCH||e.GIT_BRANCH||e.gitlabBranch||e.BRANCH_NAME;return{name:"Jenkins",service:"jenkins",commit:e.ghprbActualCommit||e.GIT_COMMIT||tt({env:e,cwd:t}),branch:n?e.ghprbTargetBranch||e.gitlabTargetBranch:o,build:e.BUILD_NUMBER,buildUrl:e.BUILD_URL,root:e.WORKSPACE,pr:r,isPr:n,prBranch:n?e.ghprbSourceBranch||e.gitlabSourceBranch||o:void 0}}},_t={detect:({env:e})=>"true"===e.NETLIFY,configuration({env:e}){const t="true"===e.PULL_REQUEST;return{name:"Netlify",service:"netlify",commit:e.COMMIT_REF,build:e.DEPLOY_ID,buildUrl:`https://app.netlify.com/sites/${e.SITE_NAME}/deploys/${e.DEPLOY_ID}`,branch:t?void 0:e.HEAD,pr:e.REVIEW_ID,isPr:t,prBranch:t?e.HEAD:void 0,slug:e.REPOSITORY_URL.match(/[^/:]+\/[^/]+?$/)[0],root:e.PWD}}},bt={detect:({env:e})=>Boolean(e.DISTELLI_APPNAME),configuration:({env:e})=>({name:"Puppet",service:"puppet",build:e.DISTELLI_BUILDNUM,buildUrl:e.DISTELLI_RELEASE,commit:e.DISTELLI_RELREVISION,branch:e.DISTELLI_RELBRANCH,root:e.DISTELLI_INSTALLHOME})},Et={detect:({env:e})=>Boolean(e.SAILCI),configuration({env:e}){const t=e.SAIL_PULL_REQUEST_NUMBER,r=Boolean(t);return{name:"Sail CI",service:"sail",commit:e.SAIL_COMMIT_SHA,branch:r?void 0:e.SAIL_COMMIT_BRANCH,pr:t,isPr:r,slug:`${e.SAIL_REPO_OWNER}/${e.SAIL_REPO_NAME}`,root:e.SAIL_CLONE_DIR}}},It={detect:({env:e})=>Boolean(e.SCREWDRIVER),configuration({env:e}){const t=e.SD_PULL_REQUEST,r=Boolean(t);return{name:"Screwdriver.cd",service:"screwdriver",branch:r?e.PR_BASE_BRANCH_NAME:e.GIT_BRANCH,prBranch:r?e.PR_BRANCH_NAME:void 0,commit:e.SD_BUILD_SHA,build:e.SD_BUILD_ID,buildUrl:e.SD_UI_BUILD_URL,job:e.SD_JOB_ID,pr:t,isPr:r,slug:e.SD_PIPELINE_NAME,root:e.SD_ROOT_DIR}}},wt={detect:({env:e})=>Boolean(e.SCRUTINIZER),configuration({env:e}){const t=e.SCRUTINIZER_PR_NUMBER,r=Boolean(t);return{name:"Scrutinizer",service:"scrutinizer",commit:e.SCRUTINIZER_SHA1,build:e.SCRUTINIZER_INSPECTION_UUID,branch:e.SCRUTINIZER_BRANCH,pr:t,isPr:r,prBranch:e.SCRUTINIZER_PR_SOURCE_BRANCH}}},vt={detect:({env:e})=>Boolean(e.SEMAPHORE),configuration({env:e,cwd:t}){const r=e.SEMAPHORE_GIT_PR_NUMBER||e.PULL_REQUEST_NUMBER,n=Boolean(r);return{name:"Semaphore",service:"semaphore",commit:e.SEMAPHORE_GIT_SHA||tt({env:e,cwd:t}),tag:e.SEMAPHORE_GIT_TAG_NAME,build:e.SEMAPHORE_JOB_ID||e.SEMAPHORE_BUILD_NUMBER,branch:e.SEMAPHORE_GIT_BRANCH||(n?void 0:e.BRANCH_NAME),pr:r,isPr:n,prBranch:e.SEMAPHORE_GIT_PR_BRANCH||(n?e.BRANCH_NAME:void 0),slug:e.SEMAPHORE_GIT_REPO_SLUG||e.SEMAPHORE_REPO_SLUG,root:e.SEMAPHORE_GIT_DIR||e.SEMAPHORE_PROJECT_DIR}}},Tt={detect:({env:e})=>Boolean(e.SHIPPABLE),configuration({env:e}){const t="true"===e.IS_PULL_REQUEST?e.PULL_REQUEST:void 0,r=Boolean(t);return{name:"Shippable",service:"shippable",commit:e.COMMIT,tag:e.GIT_TAG_NAME,build:e.BUILD_NUMBER,buildUrl:e.BUILD_URL,branch:r?e.BASE_BRANCH:e.BRANCH,job:e.JOB_NUMBER,pr:t,isPr:r,prBranch:r?e.HEAD_BRANCH:void 0,slug:e.SHIPPABLE_REPO_SLUG,root:e.SHIPPABLE_BUILD_DIR}}},xt={};function St(){if(it)return xt;it=1,Object.defineProperty(xt,"__esModule",{value:!0}),xt.of=xt.PropertiesFile=void 0;var e,t=(e=L.default)&&e.__esModule?e:{default:e};class r{constructor(...e){this.objs={},e.length&&this.of.apply(this,e)}makeKeys(e){if(e&&0!==e.indexOf("#")){let t=["=",":"].map(t=>e.indexOf(t)).filter(e=>e>-1),r=Math.min(...t),n=e.substring(0,r).trim(),o=e.substring(r+1).trim();if(this.objs.hasOwnProperty(n))if(Array.isArray(this.objs[n]))this.objs[n].push(o);else{let e=this.objs[n];this.objs[n]=[e,o]}else{const e=o.replace(/"/g,'\\"').replace(/\\:/g,":").replace(/\\=/g,"=");this.objs[n]=unescape(JSON.parse('"'+e+'"'))}}}addFile(e){let r=t.default.readFileSync(e,"utf-8").split(/\r?\n/),n=this;for(let e=0;e<r.length;e++){let t=r[e];for(;"\\"===t.substring(t.length-1);)t=t.slice(0,-1),t+=r[e+1].trim(),e++;n.makeKeys(t)}}of(...e){for(let t=0;t<e.length;t++)this.addFile(e[t])}get(e,t){if(this.objs.hasOwnProperty(e)){if(Array.isArray(this.objs[e])){let t=[];for(let r=0;r<this.objs[e].length;r++)t[r]=this.interpolate(this.objs[e][r]);return t}return void 0===this.objs[e]?"":this.interpolate(this.objs[e])}return t}getLast(e,t){if(this.objs.hasOwnProperty(e)){if(Array.isArray(this.objs[e])){var r=this.objs[e].length;return this.interpolate(this.objs[e][r-1])}return void 0===this.objs[e]?"":this.interpolate(this.objs[e])}return t}getFirst(e,t){return this.objs.hasOwnProperty(e)?Array.isArray(this.objs[e])?this.interpolate(this.objs[e][0]):void 0===this.objs[e]?"":this.interpolate(this.objs[e]):t}getInt(e,t){let r=this.getLast(e);return r?parseInt(r,10):t}getFloat(e,t){let r=this.getLast(e);return r?parseFloat(r):t}getBoolean(e,t){let r=this.getLast(e);return r?!/^(false|0)$/i.test(n=r)&&!!n:t||!1;var n}set(e,t){this.objs[e]=t}interpolate(e){let t=this;return e.replace(/\\\\/g,"\\").replace(/\$\{([A-Za-z0-9\.\-\_]*)\}/g,function(e){return t.getLast(e.substring(2,e.length-1))})}getKeys(){let e=[];for(let t in this.objs)e.push(t);return e}getMatchingKeys(e){let t=[];for(let r in this.objs)-1!==r.search(e)&&t.push(r);return t}reset(){this.objs={}}}return xt.PropertiesFile=r,xt.of=function(...e){let t=new r;return t.of.apply(t,e),t},xt}var Rt=Q(St()),Ct={root:"teamcity.build.workingDir",branch:"teamcity.build.branch"},At=e=>{try{return Rt.of(e)}catch{return}},Pt=({env:e,cwd:t})=>{const r=e.TEAMCITY_BUILD_PROPERTIES_FILE?At(e.TEAMCITY_BUILD_PROPERTIES_FILE):void 0,n=r?r.get("teamcity.configuration.properties.file"):void 0,o=n?At(n):n;return Object.fromEntries(Object.keys(Ct).map(n=>[n,(r?r.get(Ct[n]):void 0)||(o?o.get(Ct[n]):void 0)||("branch"===n?rt({env:e,cwd:t}):void 0)]))},Ut={appveyor:F,azurePipelines:W,bamboo:K,bitbucket:V,bitrise:q,buddy:J,buildkite:at,circleci:ct,cirrus:dt,cloudflarePages:{detect:({env:e})=>"1"===e.CF_PAGES,configuration:({env:e})=>({name:"Cloudflare Pages",service:"cloudflarePages",commit:e.CF_PAGES_COMMIT_SHA,branch:e.CF_PAGES_BRANCH,root:e.PWD})},codebuild:ut,codefresh:pt,codeship:{detect:({env:e})=>e.CI_NAME&&"codeship"===e.CI_NAME,configuration:({env:e})=>({name:"Codeship",service:"codeship",build:e.CI_BUILD_NUMBER,buildUrl:e.CI_BUILD_URL,commit:e.CI_COMMIT_ID,branch:e.CI_BRANCH,slug:e.CI_REPO_NAME})},drone:ft,github:gt,gitlab:mt,jenkins:yt,netlify:_t,puppet:bt,sail:Et,screwdriver:It,scrutinizer:wt,semaphore:vt,shippable:Tt,teamcity:{detect:({env:e})=>Boolean(e.TEAMCITY_VERSION),configuration:({env:e,cwd:t})=>({name:"TeamCity",service:"teamcity",commit:e.BUILD_VCS_NUMBER,build:e.BUILD_NUMBER,slug:e.TEAMCITY_BUILDCONF_NAME,...Pt({env:e,cwd:t})})},travis:{detect:({env:e})=>Boolean(e.TRAVIS),configuration({env:e}){const t="false"===e.TRAVIS_PULL_REQUEST?void 0:e.TRAVIS_PULL_REQUEST,r=Boolean(t);return{name:"Travis CI",service:"travis",commit:e.TRAVIS_COMMIT,tag:e.TRAVIS_TAG,build:e.TRAVIS_BUILD_NUMBER,buildUrl:e.TRAVIS_BUILD_WEB_URL,branch:e.TRAVIS_BRANCH,job:e.TRAVIS_JOB_NUMBER,jobUrl:e.TRAVIS_JOB_WEB_URL,pr:t,isPr:r,prBranch:e.TRAVIS_PULL_REQUEST_BRANCH,slug:e.TRAVIS_REPO_SLUG,root:e.TRAVIS_BUILD_DIR}}},vela:{detect:({env:e})=>Boolean(e.VELA),configuration({env:e}){const t="pull_request"===e.VELA_BUILD_EVENT;return{name:"Vela",service:"vela",branch:t?e.VELA_PULL_REQUEST_TARGET:e.VELA_BUILD_BRANCH,commit:e.VELA_BUILD_COMMIT,tag:e.VELA_BUILD_TAG,build:e.VELA_BUILD_NUMBER,buildUrl:e.VELA_BUILD_LINK,job:void 0,jobUrl:void 0,isPr:t,pr:e.VELA_BUILD_PULL_REQUEST,prBranch:e.VELA_PULL_REQUEST_SOURCE,slug:e.VELA_REPO_FULL_NAME,root:e.VELA_BUILD_WORKSPACE}}},vercel:{detect:({env:e})=>Boolean(e.VERCEL)||Boolean(e.NOW_GITHUB_DEPLOYMENT),configuration({env:e}){const t="Vercel",r="vercel";return e.VERCEL?{name:t,service:r,commit:e.VERCEL_GIT_COMMIT_SHA,branch:e.VERCEL_GIT_COMMIT_REF,slug:`${e.VERCEL_GIT_REPO_OWNER}/${e.VERCEL_GIT_REPO_SLUG}`}:{name:t,service:r,commit:e.NOW_GITHUB_COMMIT_SHA,branch:e.NOW_GITHUB_COMMIT_REF,slug:`${e.NOW_GITHUB_ORG}/${e.NOW_GITHUB_REPO}`}}},wercker:{detect:({env:e})=>Boolean(e.WERCKER_MAIN_PIPELINE_STARTED),configuration:({env:e})=>({name:"Wercker",service:"wercker",commit:e.WERCKER_GIT_COMMIT,build:e.WERCKER_MAIN_PIPELINE_STARTED,buildUrl:e.WERCKER_RUN_URL,branch:e.WERCKER_GIT_BRANCH,slug:`${e.WERCKER_GIT_OWNER}/${e.WERCKER_GIT_REPOSITORY}`,root:e.WERCKER_ROOT})},woodpecker:{detect:({env:e})=>e.CI&&"woodpecker"===e.CI,configuration({env:e}){const t="pull_request"===e.CI_PIPELINE_EVENT;return{name:"Woodpecker CI",service:"woodpecker",commit:e.CI_COMMIT_SHA,tag:e.CI_COMMIT_TAG,build:e.CI_PIPELINE_NUMBER,buildUrl:e.CI_PIPELINE_URL,branch:t?e.CI_COMMIT_TARGET_BRANCH:e.CI_COMMIT_BRANCH,job:e.CI_STEP_NUMBER,jobUrl:e.CI_STEP_URL,pr:e.CI_COMMIT_PULL_REQUEST,isPr:t,prBranch:t?e.CI_COMMIT_SOURCE_BRANCH:void 0,slug:`${e.CI_REPO_OWNER}/${e.CI_REPO_NAME}`,root:e.CI_WORKSPACE}}},jetbrainsSpace:{detect:({env:e})=>Boolean(e.JB_SPACE_EXECUTION_NUMBER),configuration({env:e}){const t=e.JB_SPACE_PROJECT_KEY,r=e.JB_SPACE_GIT_REPOSITORY_NAME;return{name:"JetBrains Space",service:"jetbrainsSpace",commit:e.JB_SPACE_GIT_REVISION,build:e.JB_SPACE_EXECUTION_NUMBER,branch:z(e.JB_SPACE_GIT_BRANCH),slug:t&&r?`${t.toLowerCase()}/${r}`:void 0}}}},Lt=class e{git;config;snapshotTreeHash;snapshotIndexPath;constructor(e){this.config=e,this.git=f.simpleGit({baseDir:e.workingDir,maxConcurrentProcesses:1})}static createLocal({workingDir:t}){return new e({mode:"local",workingDir:t})}static createCloud({workingDir:t,baseBranch:r}){return new e({mode:"cloud",workingDir:t,baseBranch:r})}async captureSnapshot(){if("local"!==this.config.mode)return;this.snapshotIndexPath=r.join(a.tmpdir(),`git-diff-tracker-${h.randomUUID()}.index`),await this.git.env("GIT_INDEX_FILE",this.snapshotIndexPath).add(["-A"]);const e=await this.git.env("GIT_INDEX_FILE",this.snapshotIndexPath).raw(["write-tree"]);this.snapshotTreeHash=e.trim()}async computeDiff(){return"local"===this.config.mode?this.computeLocalDiff():this.computeCloudDiff()}async computeLocalDiff(){if(!this.snapshotTreeHash)throw new Error("No snapshot captured. Call captureSnapshot() first.");const e=r.join(a.tmpdir(),`git-diff-tracker-${h.randomUUID()}.index`);try{await this.git.env("GIT_INDEX_FILE",e).add(["-A"]);const t=(await this.git.env("GIT_INDEX_FILE",e).raw(["write-tree"])).trim();return await this.git.raw(["diff-tree","-p","--no-color",this.snapshotTreeHash,t])}finally{await Ot(e)}}async computeCloudDiff(){if("cloud"!==this.config.mode)throw new Error("computeCloudDiff called but mode is not cloud");const{baseBranch:e}=this.config;return await this.git.revparse([`origin/${e}`]).then(()=>!0).catch(()=>!1)||await this.git.fetch(["origin",`${e}:refs/remotes/origin/${e}`,"--depth","1","--quiet"]).catch(e=>{console.error("[git-diff-tracker] Failed to fetch base branch:",e)}),await this.git.diff([`origin/${e}`])}async cleanup(){this.snapshotIndexPath&&(await Ot(this.snapshotIndexPath),this.snapshotIndexPath=void 0),this.snapshotTreeHash=void 0}};async function Ot(e){try{await g.unlink(e)}catch{}}var Bt="x-stably-org-id",Dt={bodySerializer:e=>JSON.stringify(e,(e,t)=>"bigint"==typeof t?t.toString():t)},Nt=({allowReserved:e,explode:t,name:r,style:n,value:o})=>{if(!t){const t=(e?o:o.map(e=>encodeURIComponent(e))).join((e=>{switch(e){case"form":default:return",";case"pipeDelimited":return"|";case"spaceDelimited":return"%20"}})(n));switch(n){case"label":return`.${t}`;case"matrix":return`;${r}=${t}`;case"simple":return t;default:return`${r}=${t}`}}const s=(e=>{switch(e){case"label":return".";case"matrix":return";";case"simple":return",";default:return"&"}})(n),i=o.map(t=>"label"===n||"simple"===n?e?t:encodeURIComponent(t):jt({allowReserved:e,name:r,value:t})).join(s);return"label"===n||"matrix"===n?s+i:i},jt=({allowReserved:e,name:t,value:r})=>{if(null==r)return"";if("object"==typeof r)throw new Error("Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.");return`${t}=${e?r:encodeURIComponent(r)}`},kt=({allowReserved:e,explode:t,name:r,style:n,value:o,valueOnly:s})=>{if(o instanceof Date)return s?o.toISOString():`${r}=${o.toISOString()}`;if("deepObject"!==n&&!t){let t=[];Object.entries(o).forEach(([r,n])=>{t=[...t,r,e?n:encodeURIComponent(n)]});const s=t.join(",");switch(n){case"form":return`${r}=${s}`;case"label":return`.${s}`;case"matrix":return`;${r}=${s}`;default:return s}}const i=(e=>{switch(e){case"label":return".";case"matrix":return";";case"simple":return",";default:return"&"}})(n),a=Object.entries(o).map(([t,o])=>jt({allowReserved:e,name:"deepObject"===n?`${r}[${t}]`:t,value:o})).join(i);return"label"===n||"matrix"===n?i+a:a},$t=/\{[^{}]+\}/g;function Mt(e){const t=void 0!==e.body;return t&&e.bodySerializer?"serializedBody"in e?void 0!==e.serializedBody&&""!==e.serializedBody?e.serializedBody:null:""!==e.body?e.body:null:t?e.body:void 0}var Ht,Gt=async(e,t)=>{const r="function"==typeof t?await t(e):t;if(r)return"bearer"===e.scheme?`Bearer ${r}`:"basic"===e.scheme?`Basic ${btoa(r)}`:r},Ft=({parameters:e={},...t}={})=>r=>{const n=[];if(r&&"object"==typeof r)for(const o in r){const s=r[o];if(null==s)continue;const i=e[o]||t;if(Array.isArray(s)){const e=Nt({allowReserved:i.allowReserved,explode:!0,name:o,style:"form",value:s,...i.array});e&&n.push(e)}else if("object"==typeof s){const e=kt({allowReserved:i.allowReserved,explode:!0,name:o,style:"deepObject",value:s,...i.object});e&&n.push(e)}else{const e=jt({allowReserved:i.allowReserved,name:o,value:s});e&&n.push(e)}}return n.join("&")},Yt=(e,t)=>!!t&&!!(e.headers.has(t)||e.query?.[t]||e.headers.get("Cookie")?.includes(`${t}=`)),zt=e=>(({baseUrl:e,path:t,query:r,querySerializer:n,url:o})=>{let s=(e??"")+(o.startsWith("/")?o:`/${o}`);t&&(s=(({path:e,url:t})=>{let r=t;const n=t.match($t);if(n)for(const t of n){let n=!1,o=t.substring(1,t.length-1),s="simple";o.endsWith("*")&&(n=!0,o=o.substring(0,o.length-1)),o.startsWith(".")?(o=o.substring(1),s="label"):o.startsWith(";")&&(o=o.substring(1),s="matrix");const i=e[o];if(null==i)continue;if(Array.isArray(i)){r=r.replace(t,Nt({explode:n,name:o,style:s,value:i}));continue}if("object"==typeof i){r=r.replace(t,kt({explode:n,name:o,style:s,value:i,valueOnly:!0}));continue}if("matrix"===s){r=r.replace(t,`;${jt({name:o,value:i})}`);continue}const a=encodeURIComponent("label"===s?`.${i}`:i);r=r.replace(t,a)}return r})({path:t,url:s}));let i=r?n(r):"";return i.startsWith("?")&&(i=i.substring(1)),i&&(s+=`?${i}`),s})({baseUrl:e.baseUrl,path:e.path,query:e.query,querySerializer:"function"==typeof e.querySerializer?e.querySerializer:Ft(e.querySerializer),url:e.url}),Wt=(e,t)=>{const r={...e,...t};return r.baseUrl?.endsWith("/")&&(r.baseUrl=r.baseUrl.substring(0,r.baseUrl.length-1)),r.headers=Vt(e.headers,t.headers),r},Kt=e=>{const t=[];return e.forEach((e,r)=>{t.push([r,e])}),t},Vt=(...e)=>{const t=new Headers;for(const r of e){if(!r)continue;const e=r instanceof Headers?Kt(r):Object.entries(r);for(const[r,n]of e)if(null===n)t.delete(r);else if(Array.isArray(n))for(const e of n)t.append(r,e);else void 0!==n&&t.set(r,"object"==typeof n?JSON.stringify(n):n)}return t},qt=class{fns=[];clear(){this.fns=[]}eject(e){const t=this.getInterceptorIndex(e);this.fns[t]&&(this.fns[t]=null)}exists(e){const t=this.getInterceptorIndex(e);return Boolean(this.fns[t])}getInterceptorIndex(e){return"number"==typeof e?this.fns[e]?e:-1:this.fns.indexOf(e)}update(e,t){const r=this.getInterceptorIndex(e);return!!this.fns[r]&&(this.fns[r]=t,e)}use(e){return this.fns.push(e),this.fns.length-1}},Jt=Ft({allowReserved:!1,array:{explode:!0,style:"form"},object:{explode:!0,style:"deepObject"}}),Xt={"Content-Type":"application/json"},Qt=(e={})=>({...Dt,headers:Xt,parseAs:"auto",querySerializer:Jt,...e}),Zt=(e={})=>{let t=Wt(Qt(),e);const r=()=>({...t}),n={error:new qt,request:new qt,response:new qt},o=async e=>{const r={...t,...e,fetch:e.fetch??t.fetch??globalThis.fetch,headers:Vt(t.headers,e.headers),serializedBody:void 0};return r.security&&await(async({security:e,...t})=>{for(const r of e){if(Yt(t,r.name))continue;const e=await Gt(r,t.auth);if(!e)continue;const n=r.name??"Authorization";switch(r.in){case"query":t.query||(t.query={}),t.query[n]=e;break;case"cookie":t.headers.append("Cookie",`${n}=${e}`);break;default:t.headers.set(n,e)}}})({...r,security:r.security}),r.requestValidator&&await r.requestValidator(r),void 0!==r.body&&r.bodySerializer&&(r.serializedBody=r.bodySerializer(r.body)),void 0!==r.body&&""!==r.serializedBody||r.headers.delete("Content-Type"),{opts:r,url:zt(r)}},s=async e=>{const{opts:t,url:r}=await o(e),s={redirect:"follow",...t,body:Mt(t)};let i=new Request(r,s);for(const e of n.request.fns)e&&(i=await e(i,t));const a=t.fetch;let c;try{c=await a(i)}catch(e){let r=e;for(const o of n.error.fns)o&&(r=await o(e,void 0,i,t));if(r=r||{},t.throwOnError)throw r;return"data"===t.responseStyle?void 0:{error:r,request:i,response:void 0}}for(const e of n.response.fns)e&&(c=await e(c,i,t));const l={request:i,response:c};if(c.ok){const e=("auto"===t.parseAs?(e=>{if(!e)return"stream";const t=e.split(";")[0]?.trim();return t?t.startsWith("application/json")||t.endsWith("+json")?"json":"multipart/form-data"===t?"formData":["application/","audio/","image/","video/"].some(e=>t.startsWith(e))?"blob":t.startsWith("text/")?"text":void 0:void 0})(c.headers.get("Content-Type")):t.parseAs)??"json";if(204===c.status||"0"===c.headers.get("Content-Length")){let r;switch(e){case"arrayBuffer":case"blob":case"text":r=await c[e]();break;case"formData":r=new FormData;break;case"stream":r=c.body;break;default:r={}}return"data"===t.responseStyle?r:{data:r,...l}}let r;switch(e){case"arrayBuffer":case"blob":case"formData":case"json":case"text":r=await c[e]();break;case"stream":return"data"===t.responseStyle?c.body:{data:c.body,...l}}return"json"===e&&(t.responseValidator&&await t.responseValidator(r),t.responseTransformer&&(r=await t.responseTransformer(r))),"data"===t.responseStyle?r:{data:r,...l}}const d=await c.text();let u;try{u=JSON.parse(d)}catch{}const p=u??d;let f=p;for(const e of n.error.fns)e&&(f=await e(p,c,i,t));if(f=f||{},t.throwOnError)throw f;return"data"===t.responseStyle?void 0:{error:f,...l}},i=e=>t=>s({...t,method:e}),a=e=>async t=>{const{opts:r,url:s}=await o(t);return(({onRequest:e,onSseError:t,onSseEvent:r,responseTransformer:n,responseValidator:o,sseDefaultRetryDelay:s,sseMaxRetryAttempts:i,sseMaxRetryDelay:a,sseSleepFn:c,url:l,...d})=>{let u;const p=c??(e=>new Promise(t=>setTimeout(t,e))),f=async function*(){let c=s??3e3,f=0;const h=d.signal??(new AbortController).signal;for(;!h.aborted;){f++;const s=d.headers instanceof Headers?d.headers:new Headers(d.headers);void 0!==u&&s.set("Last-Event-ID",u);try{const t={redirect:"follow",...d,body:d.serializedBody,headers:s,signal:h};let i=new Request(l,t);e&&(i=await e(l,t));const a=d.fetch??globalThis.fetch,p=await a(i);if(!p.ok)throw new Error(`SSE failed: ${p.status} ${p.statusText}`);if(!p.body)throw new Error("No body in SSE response");const f=p.body.pipeThrough(new TextDecoderStream).getReader();let g="";const m=()=>{try{f.cancel()}catch{}};h.addEventListener("abort",m);try{for(;;){const{done:e,value:t}=await f.read();if(e)break;g+=t;const s=g.split("\n\n");g=s.pop()??"";for(const e of s){const t=e.split("\n"),s=[];let i,a;for(const e of t)if(e.startsWith("data:"))s.push(e.replace(/^data:\s*/,""));else if(e.startsWith("event:"))i=e.replace(/^event:\s*/,"");else if(e.startsWith("id:"))u=e.replace(/^id:\s*/,"");else if(e.startsWith("retry:")){const t=Number.parseInt(e.replace(/^retry:\s*/,""),10);Number.isNaN(t)||(c=t)}let l=!1;if(s.length){const e=s.join("\n");try{a=JSON.parse(e),l=!0}catch{a=e}}l&&(o&&await o(a),n&&(a=await n(a))),r?.({data:a,event:i,id:u,retry:c}),s.length&&(yield a)}}}finally{h.removeEventListener("abort",m),f.releaseLock()}break}catch(e){if(t?.(e),void 0!==i&&f>=i)break;const r=Math.min(c*2**(f-1),a??3e4);await p(r)}}}();return{stream:f}})({...r,body:r.body,headers:r.headers,method:e,onRequest:async(e,t)=>{let o=new Request(e,t);for(const e of n.request.fns)e&&(o=await e(o,r));return o},url:s})};return{buildUrl:zt,connect:i("CONNECT"),delete:i("DELETE"),get:i("GET"),getConfig:r,head:i("HEAD"),interceptors:n,options:i("OPTIONS"),patch:i("PATCH"),post:i("POST"),put:i("PUT"),request:s,setConfig:e=>(t=Wt(t,e),r()),sse:{connect:a("CONNECT"),delete:a("DELETE"),get:a("GET"),head:a("HEAD"),options:a("OPTIONS"),patch:a("PATCH"),post:a("POST"),put:a("PUT"),trace:a("TRACE")},trace:i("TRACE")}},er=Zt(Qt({baseUrl:"https://api.stably.ai"})),tr="4.4.3",rr=process.env.STABLY_API_URL||"https://api.stably.ai",nr=process.env.AUTH_URL||"https://auth.stably.ai",or=process.env.AUTH_CLIENT_ID||"288007877071cce81f269428ea78653a",sr=process.env.AI_PROXY_URL||"https://ai-proxy.stably.ai",ir="http://localhost:9876/auth/callback",ar=()=>Ht||(Ht=Zt(Qt({baseUrl:rr,headers:{"X-STABLY-CLI-VERSION":tr,"X-STABLY-SOURCE":"cli"}}))),cr=async(e,t)=>{const r=await(n={body:{accessToken:e,orgId:t},client:ar()},(n.client??er).post({url:"/internal/v1/cli/exchange-token",...n,headers:{"Content-Type":"application/json",...n.headers}}));var n;if(401===r.response.status)throw new Error("Invalid or expired access token");if(403===r.response.status)throw new Error("You do not have access to this organization");if(r.error)throw new Error(`Failed to exchange token: ${r.response.status}`);return r.data},lr=_.z.object({org_id:_.z.string(),org_name:_.z.string()}),dr=_.z.object({email:_.z.string(),org_id_to_org_member_info:_.z.record(_.z.string(),lr).optional(),org_member_info:lr.optional(),user_id:_.z.string()});_.z.object({email:_.z.string(),firstName:_.z.string().optional(),lastName:_.z.string().optional(),organizations:_.z.array(_.z.object({id:_.z.string(),name:_.z.string()})),userId:_.z.string()});var ur=e=>{const t=e.split(".");if(3!==t.length)throw new Error("Invalid JWT format");const r=t[1].replace(/-/g,"+").replace(/_/g,"/"),n=Buffer.from(r,"base64").toString("utf-8");return JSON.parse(n)},pr=e=>{try{const t=dr.parse(ur(e)),r=t.org_id_to_org_member_info?Object.entries(t.org_id_to_org_member_info).map(([e,t])=>({id:e,name:t.org_name})):t.org_member_info?[{id:t.org_member_info.org_id,name:t.org_member_info.org_name}]:[];return{email:t.email,organizations:r,userId:t.user_id}}catch(e){throw new Error(`Failed to decode token: ${e instanceof Error?e.message:"Unknown error"}`)}},fr=A.default.join(O.default.homedir(),".stably"),hr=A.default.join(fr,"auth.json"),gr=".stably",mr="project.json",yr=k.default.object({accessToken:k.default.string(),expiresAt:k.default.number(),idToken:k.default.string().optional(),refreshToken:k.default.string()}),_r=k.default.object({orgId:k.default.string(),orgName:k.default.string(),projectId:k.default.string(),projectName:k.default.string()}),br=async()=>{try{const e=await g.readFile(hr,"utf-8");return yr.parse(JSON.parse(e))}catch{return}},Er=async e=>{await g.mkdir(fr,{recursive:!0}),await g.writeFile(hr,JSON.stringify(e,null,2),{mode:384})},Ir=async()=>{try{await g.unlink(hr)}catch{}},wr=async e=>{let t=e;const{root:r}=A.default.parse(t);for(;t!==r;){const e=A.default.join(t,gr);try{return await g.access(e),e}catch{t=A.default.dirname(t)}}},vr=async()=>{try{const e=await wr(process.cwd());if(!e)return;const t=A.default.join(e,mr),r=await g.readFile(t,"utf-8");return _r.parse(JSON.parse(r))}catch{return}},Tr=async()=>{try{const e=await wr(process.cwd());e&&await g.unlink(A.default.join(e,mr))}catch{}},xr=e=>Date.now()>=e.expiresAt-3e5,Sr=async e=>{const t=new URLSearchParams({client_id:or,grant_type:"refresh_token",refresh_token:e}),r=await fetch(`${nr}/propelauth/oauth/token`,{body:t.toString(),headers:{"Content-Type":"application/x-www-form-urlencoded"},method:"POST"});if(!r.ok)throw new Error(`Token refresh failed: ${r.status}`);const n=await r.json();return{accessToken:n.access_token,expiresAt:Date.now()+1e3*n.expires_in,refreshToken:n.refresh_token}},Rr=e=>`\n<!DOCTYPE html>\n<html>\n<head>\n <title>Authentication Failed Stably CLI</title>\n <style>\n * { box-sizing: border-box; }\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 100vh;\n margin: 0;\n background: #000;\n color: #fafafa;\n }\n .container {\n text-align: center;\n padding: 48px;\n max-width: 400px;\n }\n .icon {\n width: 48px;\n height: 48px;\n border-radius: 50%;\n background: #ef4444;\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0 auto 24px;\n }\n .icon svg { width: 24px; height: 24px; }\n .title {\n font-size: 24px;\n font-weight: 600;\n margin: 0 0 8px;\n letter-spacing: -0.5px;\n }\n .subtitle {\n color: #888;\n font-size: 14px;\n margin: 0 0 32px;\n line-height: 1.5;\n }\n .error-box {\n background: rgba(239, 68, 68, 0.1);\n border: 1px solid rgba(239, 68, 68, 0.3);\n border-radius: 8px;\n padding: 16px;\n margin-bottom: 24px;\n }\n .error-label {\n font-size: 11px;\n font-weight: 600;\n color: #ef4444;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 8px;\n }\n .error-message {\n font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;\n font-size: 13px;\n color: #fafafa;\n word-break: break-word;\n }\n .hint {\n color: #666;\n font-size: 13px;\n }\n .hint code {\n background: #111;\n border: 1px solid #333;\n border-radius: 4px;\n padding: 2px 6px;\n font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;\n font-size: 12px;\n color: #888;\n }\n .brand {\n margin-top: 32px;\n font-size: 12px;\n color: #444;\n letter-spacing: 0.5px;\n }\n </style>\n</head>\n<body>\n <div class="container">\n <div class="icon">\n <svg fill="none" stroke="#000" stroke-width="3" viewBox="0 0 24 24">\n <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/>\n </svg>\n </div>\n <h1 class="title">Authentication Failed</h1>\n <p class="subtitle">Something went wrong during login.</p>\n <div class="error-box">\n <div class="error-label">Error</div>\n <div class="error-message">${e}</div>\n </div>\n <p class="hint">Run <code>stably login</code> to try again.</p>\n <div class="brand">STABLY</div>\n </div>\n</body>\n</html>\n`,Cr=(e,t,r)=>{e.writeHead(t,{"Content-Type":"text/html"}),e.end(r)},Ar=(e,t)=>{const r=new URLSearchParams({client_id:or,code_challenge:e,code_challenge_method:"S256",redirect_uri:ir,response_type:"code",state:t});return`${nr}/propelauth/oauth/authorize?${r.toString()}`},Pr=async e=>{const t=m.spinner();let r;t.start("Loading user info...");try{r=pr(e.accessToken),t.stop(D.default.green(`✓ Logged in as ${D.default.cyan(r.email)}`))}catch(e){t.stop(D.default.red("✗ Failed to load user info"));const r=e instanceof Error?e.message:"Unknown error";return m.log.error(r),{success:!1}}const n=await(async e=>{if(0===e.length)return void m.log.error("You don't belong to any organizations.");if(1===e.length)return m.log.info(`Using organization: ${D.default.cyan(e[0].name)}`),e[0];if(!process.stdin.isTTY)return m.log.info(`Auto-selecting organization: ${D.default.cyan(e[0].name)}`),e[0];const t=await m.select({message:"Select an organization",options:[...e].sort((e,t)=>e.name.localeCompare(t.name)).map(e=>({label:e.name,value:e.id}))});return m.isCancel(t)?void 0:e.find(e=>e.id===t)})(r.organizations);if(!n)return m.log.warn("Organization selection cancelled."),{success:!1};let o;t.start("Getting org credentials...");try{const r=await cr(e.accessToken,n.id);o={accessToken:r.accessToken,expiresAt:Date.now()+1e3*r.expiresInSeconds,idToken:e.idToken,refreshToken:e.refreshToken},t.stop(D.default.green("✓ Credentials obtained"))}catch(e){t.stop(D.default.red("✗ Failed to get org credentials"));const r=e instanceof Error?e.message:"Unknown error";return m.log.error(r),{success:!1}}const s=await(async(e,t)=>{const r=m.spinner();let n;r.start("Loading projects...");try{n=await(async({accessToken:e,orgId:t})=>{const r=await(n={auth:e,client:ar(),path:{orgId:t}},(n.client??er).get({security:[{scheme:"bearer",type:"http"}],url:"/internal/v1/cli/orgs/{orgId}/projects",...n}));var n;if(401===r.response.status)throw new Error("Invalid or expired access token");if(403===r.response.status)throw new Error("You do not have access to this organization");if(r.error)throw new Error(`Failed to list projects: ${r.response.status}`);return r.data.projects})({accessToken:e,orgId:t}),r.stop(D.default.green("✓ Projects loaded"))}catch(e){r.stop(D.default.red("✗ Failed to load projects"));const t=e instanceof Error?e.message:"Unknown error";return void m.log.error(t)}if(0===n.length)return m.log.error("No projects found in this organization."),void m.log.info(`Create a project at ${D.default.underline(D.default.cyan("https://app.stably.ai"))}`);if(1===n.length)return m.log.info(`Using project: ${D.default.cyan(n[0].name)}`),n[0];if(!process.stdin.isTTY)return m.log.info(`Auto-selecting project: ${D.default.cyan(n[0].name)}`),n[0];const o=await m.select({message:"Select a project",options:n.map(e=>({label:e.name,value:e.id}))});return m.isCancel(o)?void 0:n.find(e=>e.id===o)})(o.accessToken,n.id);return s?(await(async e=>{const t=A.default.join(process.cwd(),gr),r=A.default.join(t,mr);await g.mkdir(t,{recursive:!0}),await g.writeFile(r,JSON.stringify(e,null,2)),await(async e=>{const t=A.default.join(e,".gitignore"),r="# Stably CLI (only docs/ are tracked)\n.stably/*\n!.stably/docs/";try{const e=await g.readFile(t,"utf-8"),n=e.split("\n").map(e=>e.trim());if(n.includes(".stably/*")&&n.includes("!.stably/docs/"))return;const o=/^# Stably CLI\n\.stably\/?$/m,s=/^\.stably\/?$/m;if(o.test(e)){const n=e.replace(o,`\n${r}\n`);await g.writeFile(t,n)}else if(s.test(e)){const n=e.replace(s,`\n${r}\n`);await g.writeFile(t,n)}else await g.appendFile(t,`\n${r}\n`)}catch{await g.writeFile(t,`${r}\n`)}})(process.cwd())})({orgId:n.id,orgName:n.name,projectId:s.id,projectName:s.name}),m.log.info(D.default.dim("Linked this directory to your Stably project.")),{scopedTokens:o,success:!0}):(m.log.warn("Project selection cancelled."),{success:!1})},Ur=async()=>{if(Xr())return m.log.warn(`Environment variables ${D.default.cyan("STABLY_API_KEY")} and ${D.default.cyan("STABLY_PROJECT_ID")} are set.`),m.log.warn("These will be used for authentication instead of OAuth login."),m.log.warn("To use OAuth login, unset these environment variables first."),void m.outro(D.default.yellow("Login skipped - using environment variable authentication."));const e=await br();if(e){if(!xr(e)){if(await vr())return void m.outro(D.default.yellow("You are already logged in. Run `stably logout` first to log out."));m.log.info("You are logged in but haven't selected a project yet.");const t=await Pr(e);return void(t.success?(await Er(t.scopedTokens),m.outro(D.default.green("Setup complete! You can now use Stably CLI."))):m.outro(D.default.yellow("Setup incomplete. Run `stably login` to try again.")))}const t=m.spinner();t.start("Refreshing session...");try{const r=await Sr(e.refreshToken);t.stop(D.default.green("✓ Session refreshed"));const n=await vr();if(n){t.start("Getting org credentials...");try{const e=await cr(r.accessToken,n.orgId),o={accessToken:e.accessToken,expiresAt:Date.now()+1e3*e.expiresInSeconds,idToken:r.idToken,refreshToken:r.refreshToken};await Er(o),t.stop(D.default.green("✓ Credentials obtained")),m.outro(D.default.green("Login successful"))}catch{await Er(r),t.stop(D.default.yellow("Using full credentials")),m.outro(D.default.green("Login successful"))}}else{const e=await Pr(r);e.success?(await Er(e.scopedTokens),m.outro(D.default.green("Setup complete! You can now use Stably CLI."))):m.outro(D.default.yellow("Setup incomplete. Run `stably login` to try again."))}return}catch{t.stop(D.default.yellow("Session expired, proceeding with fresh login...")),await Ir(),await Tr()}}const{authorizeUrl:t,waitForCallback:r}=(()=>{const{authorizeUrl:e,codeVerifier:t,state:r}=(()=>{const e=N.default.randomBytes(32).toString("base64url"),t=(r=e,N.default.createHash("sha256").update(r).digest("base64url"));var r;const n=N.default.randomBytes(16).toString("base64url");return{authorizeUrl:Ar(t,n),codeVerifier:e,state:n}})();return{authorizeUrl:e,waitForCallback:async()=>(async(e,t)=>{const r=await(n=e,new Promise((e,t)=>{const r=setTimeout(()=>{s.close(),e({error:"Login timed out",success:!1})},3e5),o=()=>{clearTimeout(r)},s=M.default.createServer((t,r)=>{const a=new i.URL(t.url||"","http://localhost:9876");if("/auth/callback"!==a.pathname)return r.writeHead(404),void r.end("Not found");const c=a.searchParams.get("code"),l=a.searchParams.get("state"),d=a.searchParams.get("error");return d?(Cr(r,400,Rr(d)),o(),s.close(),void e({error:d,success:!1})):c&&l?l!==n?(Cr(r,400,Rr("Invalid state parameter (possible CSRF attack)")),o(),s.close(),void e({error:"State mismatch",success:!1})):(Cr(r,200,'\n<!DOCTYPE html>\n<html>\n<head>\n <title>Authenticated Stably CLI</title>\n <style>\n * { box-sizing: border-box; }\n body {\n font-family: -apple-system, BlinkMacSystemFont, \'Segoe UI\', Roboto, sans-serif;\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 100vh;\n margin: 0;\n background: #000;\n color: #fafafa;\n }\n .container {\n text-align: center;\n padding: 48px;\n max-width: 400px;\n }\n .icon {\n width: 48px;\n height: 48px;\n border-radius: 50%;\n background: #22c55e;\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0 auto 24px;\n }\n .icon svg { width: 24px; height: 24px; }\n .title {\n font-size: 24px;\n font-weight: 600;\n margin: 0 0 8px;\n letter-spacing: -0.5px;\n }\n .subtitle {\n color: #888;\n font-size: 14px;\n margin: 0 0 32px;\n line-height: 1.5;\n }\n .terminal {\n background: #111;\n border: 1px solid #333;\n border-radius: 8px;\n padding: 16px;\n text-align: left;\n font-family: \'SF Mono\', \'Fira Code\', \'Consolas\', monospace;\n font-size: 13px;\n }\n .terminal-header {\n display: flex;\n gap: 6px;\n margin-bottom: 12px;\n }\n .terminal-dot {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n background: #333;\n }\n .terminal-line {\n color: #888;\n }\n .terminal-line .prompt { color: #888; }\n .terminal-line .cmd { color: #fafafa; }\n .terminal-line.success { color: #22c55e; }\n .brand {\n margin-top: 32px;\n font-size: 12px;\n color: #444;\n letter-spacing: 0.5px;\n }\n </style>\n</head>\n<body>\n <div class="container">\n <div class="icon">\n <svg fill="none" stroke="#000" stroke-width="3" viewBox="0 0 24 24">\n <path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7"/>\n </svg>\n </div>\n <h1 class="title">Authenticated</h1>\n <p class="subtitle">You can close this tab and return to your terminal.</p>\n <div class="terminal">\n <div class="terminal-header">\n <div class="terminal-dot"></div>\n <div class="terminal-dot"></div>\n <div class="terminal-dot"></div>\n </div>\n <div class="terminal-line"><span class="prompt">$</span> <span class="cmd">stably login</span></div>\n <div class="terminal-line success">Logged in successfully</div>\n </div>\n <div class="brand">STABLY</div>\n </div>\n</body>\n</html>\n'),o(),s.close(),void e({code:c,state:l,success:!0})):(Cr(r,400,Rr("Missing code or state parameter")),o(),s.close(),void e({error:"Missing code or state parameter",success:!1}))});s.on("error",e=>{o(),"EADDRINUSE"!==e.code?t(new Error(`Failed to start callback server: ${e.message}`)):t(new Error("Port 9876 is already in use. Please close the application using it and try again."))}),s.listen(9876)}));var n;if(!r.success)throw new Error(r.error);return(async(e,t)=>{const r=new URLSearchParams({client_id:or,code:e,code_verifier:t,grant_type:"authorization_code",redirect_uri:ir}),n=await fetch(`${nr}/propelauth/oauth/token`,{body:r.toString(),headers:{"Content-Type":"application/x-www-form-urlencoded"},method:"POST"});if(!n.ok){const e=await n.text();throw new Error(`Token exchange failed: ${n.status} ${e}`)}const o=await n.json();return{accessToken:o.access_token,expiresAt:Date.now()+1e3*o.expires_in,idToken:o.id_token,refreshToken:o.refresh_token}})(r.code,t)})(r,t)}})();m.log.info("Opening browser for authentication..."),m.log.info(D.default.dim("If browser doesn't open, visit:")),m.log.info(D.default.underline(D.default.cyan(t)));try{await $.default(t)}catch{m.log.warn("Could not open browser automatically. Please open the URL above manually.")}const n=m.spinner();let o;n.start("Waiting for authentication...");try{o=await r(),n.stop(D.default.green("✓ Authentication successful"))}catch(e){n.stop(D.default.red("✗ Authentication failed"));const t=e instanceof Error?e.message:"Unknown error";m.outro(D.default.red(`Login failed: ${t}`)),process.exit(1)}const s=await Pr(o);s.success?(await Er(s.scopedTokens),m.outro(D.default.green("Setup complete! You can now use Stably CLI."))):(m.outro(D.default.yellow("Setup incomplete. Run `stably login` to try again.")),process.exit(1))},Lr={fatal:60,error:50,warn:40,info:30,debug:20,trace:10},Or=new Set(["help","login","logout","whoami","tunnel","create","fix","init","upgrade","test","show-report","codegen"]),Br=(new Date).toISOString().split("T")[0],Dr=A.default.join(O.default.tmpdir(),"stably-logs",Br);L.default.mkdirSync(Dr,{recursive:!0});var Nr,jr=process.argv.includes("--verbose")||process.argv.includes("-v"),kr=process.env.STABLY_LOG_LEVEL?.toLowerCase(),$r=jr?"debug":void 0!==(Nr=kr)&&Nr in Lr?kr:"warn",Mr=Lr[$r],Hr=null,Gr=null,Fr=null,Yr=[],zr=!1,Wr=e=>{if(!zr){Hr=(e=>{const t=(()=>{const e=new Date;return[e.getHours().toString().padStart(2,"0"),e.getMinutes().toString().padStart(2,"0"),e.getSeconds().toString().padStart(2,"0")].join("-")})(),r=((e,t=100)=>e.replace(/[/\\:*?"<>|]/g,"-").replace(/\s+/g,"-").replace(/[^a-zA-Z0-9\-_]/g,"").replace(/-+/g,"-").replace(/^-+|-+$/g,"").slice(0,t).toLowerCase()||"session")(e);return A.default.join(Dr,`${t}-${r}.log`)})(e),(e=>{const t=["","=".repeat(60),"Stably CLI Debug Log",`Version: ${tr}`,`Generated: ${(new Date).toISOString()}`,`Node: ${process.version}`,`Platform: ${process.platform} ${O.default.release()}`,`CWD: ${process.cwd()}`,`Args: ${process.argv.slice(2).join(" ")}`,`Log Level (console): ${$r}`,"=".repeat(60),""].join("\n");e.write(t)})(Gr=new G.default({dest:Hr,minLength:4096,sync:!1,append:!0})),Fr=H.default({level:"debug",timestamp:H.default.stdTimeFunctions.isoTime,base:{version:tr}},Gr);for(const{level:e,msg:t,context:r}of Yr)r?Fr[e](r,t):Fr[e](t);Yr=[],zr=!0,jr&&process.stderr.write(`${D.default.dim(`Debug log: ${Hr}`)}\n\n`)}},Kr=(()=>{const e=process.argv.slice(2).find(e=>!e.startsWith("-"));return e&&Or.has(e)?e:null})();Kr&&Wr(Kr);var Vr=e=>(t,r)=>{if(Fr?r?Fr[e](r,t):Fr[e](t):Yr.push({level:e,msg:t,context:r}),(e=>Lr[e]>=Mr)(e)){const r=((e,t)=>`${{fatal:D.default.bgRed(D.default.white(" FATAL ")),error:D.default.red("error"),warn:D.default.yellow("warn"),info:D.default.cyan("info"),debug:D.default.dim("debug"),trace:D.default.dim("trace")}[e]} ${t}`)(e,t);process.stderr.write(`${r}\n`)}},qr={fatal:Vr("fatal"),error:Vr("error"),warn:Vr("warn"),info:Vr("info"),debug:Vr("debug"),trace:Vr("trace"),initSession:e=>{zr||Wr(e)},getLogFilePath:()=>Hr,flush:()=>{if(Gr)try{Gr.flushSync()}catch{}},printLogFileInfo:()=>{Hr&&(process.stderr.write(`\n${D.default.dim("Debug log written to:")}\n`),process.stderr.write(` ${D.default.cyan(Hr)}\n`),process.stderr.write(`${D.default.dim("Share this file with support for assistance.")}\n`))},getPinoLogger:()=>Fr};setInterval(()=>{qr.flush()},3e4).unref(),process.on("beforeExit",()=>{qr.flush()});var Jr=e=>{const t=()=>{qr.flush(),jr&&qr.printLogFileInfo(),process.removeListener(e,t),process.kill(process.pid,e)};return t};process.on("SIGINT",Jr("SIGINT")),process.on("SIGTERM",Jr("SIGTERM"));var Xr=()=>{const e=process.env.STABLY_API_KEY?.trim(),t=process.env.STABLY_PROJECT_ID?.trim();if(e&&t)return qr.debug("Environment auth detected",{hasApiKey:!0,hasProjectId:!0}),{apiKey:e,projectId:t};qr.debug("Environment auth not set",{hasApiKey:!!e,hasProjectId:!!t})},Qr=!1,Zr=()=>{Qr||(Qr=!0,m.log.warn("Both environment variable auth and stored OAuth login were detected."),m.log.warn(`Honoring environment variables (${D.default.cyan("STABLY_API_KEY")} + ${D.default.cyan("STABLY_PROJECT_ID")}).`),m.log.warn("To use OAuth login instead, unset those environment variables."))},en=async()=>{qr.debug("Checking for stored auth tokens");const e=await br();if(!e)return void qr.debug("No stored auth tokens found");const t=xr(e);if(qr.debug("Auth tokens status",{expired:t}),!t){const t=await vr(),r=(e=>{try{const t=dr.parse(ur(e));if(t.org_id_to_org_member_info)return"full";if(t.org_member_info)return"org"}catch{return"unknown"}return"unknown"})(e.accessToken);if(qr.debug("Token scope check",{scope:r,hasContext:!!t}),t&&"full"===r)try{qr.debug("Exchanging full token for org-scoped token",{orgId:t.orgId});const r=await cr(e.accessToken,t.orgId),n={accessToken:r.accessToken,expiresAt:Date.now()+1e3*r.expiresInSeconds,idToken:e.idToken,refreshToken:e.refreshToken};return await Er(n),qr.debug("Token exchange successful"),n}catch(t){return qr.debug("Token exchange failed, using existing token",{error:t instanceof Error?t.message:String(t)}),e}return e}try{qr.debug("Attempting token refresh");const t=await Sr(e.refreshToken);qr.debug("Token refresh successful");const r=await vr();if(r)try{qr.debug("Exchanging refreshed token for org-scoped token");const e=await cr(t.accessToken,r.orgId),n={accessToken:e.accessToken,expiresAt:Date.now()+1e3*e.expiresInSeconds,idToken:t.idToken,refreshToken:t.refreshToken};return await Er(n),n}catch{return await Er(t),t}return await Er(t),t}catch(e){return void qr.warn("Token refresh failed",{error:e instanceof Error?e.message:String(e)})}},tn=async(e={})=>{qr.debug("Requiring authentication",{autoLogin:e.autoLogin});const t=Xr();if(t){qr.info("Using environment variable authentication");try{await br()&&Zr()}catch{}return{auth:t,type:"env"}}let r=await en(),n=r?await vr():void 0;const o=process.stdin.isTTY&&process.stdout.isTTY;if(qr.debug("OAuth auth check",{hasTokens:!!r,hasContext:!!n,canPrompt:o}),(!r||!n)&&e.autoLogin&&o){qr.info("Prompting user to login"),r?m.log.info("You are logged in but need to select an organization and project."):m.log.info("You are not logged in."),m.log.info("Press Enter to log in."),process.stdout.write(`${D.default.dim("Alternatively, set environment variables for an org API key:")}\n${D.default.dim(" STABLY_API_KEY=... STABLY_PROJECT_ID=... stably")}\n`),process.stdout.write("\n");const e=y.createInterface({input:process.stdin,output:process.stdout});try{await e.question(D.default.dim("Press Enter to continue... "))}finally{e.close()}await Ur(),r=await en(),n=r?await vr():void 0}return r||(qr.warn("Authentication required but no tokens available"),m.outro(D.default.red("You are not logged in. Run `stably login` to authenticate.")),process.exit(1)),n||(qr.warn("Authentication succeeded but no project context selected"),m.outro(D.default.red("You haven't selected an organization and project. Run `stably login` to complete setup.")),process.exit(1)),qr.info("OAuth authentication successful",{orgId:n.orgId,projectId:n.projectId}),{auth:{accessToken:r.accessToken,context:n},type:"oauth"}},rn=e=>e?{...process.env,...e}:process.env,nn=async()=>{const e=Xr();if(e)return{STABLY_API_KEY:e.apiKey,STABLY_PROJECT_ID:e.projectId};const t=await(async()=>{const e=Xr();if(e){try{await br()&&Zr()}catch{}return{auth:e,type:"env"}}const t=await en(),r=t?await vr():void 0;if(t&&r)return{auth:{accessToken:t.accessToken,context:r},type:"oauth"}})();if(!t||"env"===t.type)return;const r=process.env.STABLY_PROJECT_ID?.trim(),n=r||(e=>"env"===e.type?e.auth.projectId:e.auth.context.projectId)(t);if(!n)return;const o=await(async(e,t)=>{try{return(await(async({accessToken:e,projectId:t})=>{const r=await(n={auth:e,client:ar(),path:{projectId:t}},(n.client??er).post({security:[{scheme:"bearer",type:"http"}],url:"/internal/v1/cli/projects/{projectId}/api-key",...n}));var n;if(401===r.response.status)throw new Error("Invalid or expired access token");if(403===r.response.status)throw new Error("You do not have access to this project");if(r.error)throw new Error(`Failed to get API key: ${r.response.status}`);return r.data})({accessToken:e,projectId:t})).apiKey}catch{return e}})(t.auth.accessToken,n);return o?{STABLY_API_KEY:o,STABLY_PROJECT_ID:n}:void 0},on=e=>e?{[Bt]:e}:void 0,sn=_.z.object({context:_.z.string().min(1),autohealReportUrl:_.z.string()}),an=v.z.object({bucket:v.z.string(),key:v.z.string()}),cn=v.z.object({diffBucketPath:an,expiresInSeconds:v.z.number(),key:v.z.string(),uploadUrl:v.z.string()}),ln=/\.(spec|test)\.(c|m)?[jt]sx?$/,dn=e=>{if(!e||"object"!=typeof e)return!1;const t=e;return"text"===t.type&&"string"==typeof t.text},un=e=>null!=e&&"object"==typeof e&&"tool_response"in e,pn=e=>{if(!e||"object"!=typeof e)return;const t=e;return Array.isArray(t.tool_response)?t.tool_response:void 0},fn=e=>{const t=pn(e);if(t)return t.filter(dn).map(e=>e.text).join("\n")||void 0},hn=/\u001b\[[0-9;]*m/g,gn=e=>e.replace(hn,""),mn=/\$\{process\.env\.([A-Z_][A-Z0-9_]*)\}/g;function yn({envVars:e}){return async t=>{if(!function(e){return Boolean(e&&"object"==typeof e&&"tool_input"in e&&e.tool_input&&"object"==typeof e.tool_input)}(t))return{decision:"approve"};const r=t.tool_input,n="string"==typeof r.text?r.text:void 0;if(!n)return{decision:"approve"};const o=n.replace(mn,(t,r)=>{const n=e[r];return null!=n?n:t});return o===n?{decision:"approve"}:{decision:"approve",hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"allow",reason:"Evaluated environment variable placeholders in browser text input.",updatedInput:{...r,text:o}}}}}function _n({onResult:e}){return async t=>{if(!un(t))return{decision:"approve"};const r=fn(t);if(!r)return{decision:"approve"};const n=function(e){const t=gn(e),r=t.split(/Running \d+ tests? using \d+ workers?/).at(-1)??t,n=parseInt(r.match(/(\d+)\s+passed/g)?.at(-1)?.match(/(\d+)/)?.[1]??"0"),o=parseInt(r.match(/(\d+)\s+failed/g)?.at(-1)?.match(/(\d+)/)?.[1]??"0");if(0===n&&0===o)return;const s=[n>0?`${n} test${1===n?"":"s"} passed ✓`:void 0,o>0?`${o} test${1===o?"":"s"} failed ✗`:void 0].filter(e=>void 0!==e).join(", ");if(0===o)return s;const i=r.split(/\n\s+\d+\)\s+\[id=/).slice(1).map(e=>e.match(/\n\s{4}((?:TimeoutError|Error|AssertionError):\s*[^\n]+)/)?.[1]?.trim()).filter(e=>void 0!==e);return 0===i.length?s:`${s}\n${i.map(e=>` - ${e}`).join("\n")}`}(r);return n&&e(n),{decision:"approve"}}}function bn({onResult:e}){return async t=>{if(!un(t))return{decision:"approve"};const r=fn(t);if(!r)return{decision:"approve"};const n=function(e){const t=gn(e);if(t.match(/### Paused on error:/)){const e=t.match(/### Paused on error:\s*\n((?:TimeoutError|Error|AssertionError):\s*[^\n]+)/);return e?`Test paused on error - ${e[1].trim()}`:"Test paused on error"}const r=t.match(/(\d+)\s+passed/);if(r){const e=parseInt(r[1]);return`${e} test${1===e?"":"s"} passed ✓`}}(r);return n&&e(n),{decision:"approve"}}}var En=/\.(spec|test)\.(ts|tsx|js|jsx|mts|mjs)$/;function In({onFileCreated:e}){return async t=>{const r=(e=>{if(!e||"object"!=typeof e)return;const t=e;return t.tool_input&&"object"==typeof t.tool_input&&!Array.isArray(t.tool_input)?t.tool_input:void 0})(t),n=r?.file_path;return"string"==typeof n&&En.test(n)&&e(n),{decision:"approve"}}}l.promisify(n.exec);var wn=class{queue=[];pendingResolve=void 0;done=!1;canSend=!0;[Symbol.asyncIterator](){return this}pushText(e){const t=e.trim();t&&!this.done&&(this.queue.push(t),this.maybeFlush())}allowNextTurn(){this.done||(this.canSend=!0,this.maybeFlush())}finish(){this.done=!0,this.pendingResolve&&(this.pendingResolve({done:!0,value:void 0}),this.pendingResolve=void 0)}maybeFlush(){if(!this.pendingResolve)return;if(!this.canSend)return;const e=this.queue.shift();if(void 0===e)return;const t={message:{content:[{text:e,type:"text"}],role:"user"},parent_tool_use_id:null,type:"user",session_id:""};this.canSend=!1,this.pendingResolve({done:!1,value:t}),this.pendingResolve=void 0}next(){return this.done?Promise.resolve({done:!0,value:void 0}):new Promise(e=>{this.pendingResolve=e,this.maybeFlush()})}},vn=[".ts",".js",".mts",".mjs",".cts",".cjs"],Tn=10240,xn=async({defaultContent:e,fileName:t,filePath:r})=>{try{const e=(await g.stat(r)).size,n=await g.readFile(r,"utf-8"),o=Buffer.byteLength(n,"utf-8");if(o<=Tn)return n;const s=(e=>{const t=e.split("\n"),r=[];let n=!1,o=!1,s=0,i=!1;for(let e=0;e<t.length;e++){const a=t[e],c=a.trim();c.startsWith("/*")&&(n=!0),c.includes("*/")?n=!1:n||c.startsWith("//")&&!c.startsWith("///")||(c.startsWith("import ")||c.startsWith("export ")?(r.push(a),i=!0):i&&""===c?(r.push(a),i=!1):(i=!1,c.startsWith("type ")||c.startsWith("interface ")?r.push(a):c.startsWith("function ")||c.startsWith("const ")||c.startsWith("async function ")||c.startsWith("export function ")||c.startsWith("export const ")||c.startsWith("test.describe(")||c.startsWith("test(")?(r.push(a),o=!0,s=(a.match(/{/g)||[]).length-(a.match(/}/g)||[]).length,0===s&&(c.endsWith(";")||c.endsWith(","))&&(o=!1)):o?(s+=(a.match(/{/g)||[]).length,s-=(a.match(/}/g)||[]).length,0===s&&c.includes("}")?(r.push(a),o=!1):s>0&&" // ... implementation omitted ..."!==r.at(-1)&&r.push(" // ... implementation omitted ...")):c.match(/^[a-zA-Z_]+:/)&&r.push(a)))}return r.join("\n")})(n),i=Buffer.byteLength(s,"utf-8");return i<=Tn?s:s.slice(0,Tn)+`\n\n... [TRUNCATED: File "${t}" at ${r} was ${e} bytes (${o} bytes as UTF-8), reduced to ~${i} bytes of essential content, then truncated to 10240 bytes] ...`}catch(r){let n;if(r&&"object"==typeof r&&"code"in r){const e=r.code;"string"==typeof e&&(n=e)}return"ENOENT"!==n&&console.warn(`Failed to read ${t}: ${r}`),e}},Sn=async({defaultContent:e,dirName:t,dirPath:r})=>{try{const e=await g.readdir(r);return e.length>0?e.join("\n"):"(empty)"}catch(r){let n;if(r&&"object"==typeof r&&"code"in r){const e=r.code;"string"==typeof e&&(n=e)}return"ENOENT"!==n&&console.warn(`Failed to read ${t}: ${r}`),e}},Rn=async({allowedEnvVars:e,mode:t,workspaceInfo:r,authHeader:o,customHeader:s,maxParallelWorkers:i})=>{const a=ar(),c=function(e){try{const t=n.execSync("git branch --show-current",{cwd:e,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();if(!t)return;return{branch:t}}catch{return}}(r.absolutePath);qr.debug("Requesting system prompt from API",{mode:t,hasGitContext:!!c,envVarCount:e.length});const l=await(d={client:a,auth:o,body:{mode:t,workspaceInfo:r,allowedEnvVars:e,gitContext:c,maxParallelWorkers:i}},(d.client??er).post({security:[{scheme:"bearer",type:"http"}],url:"/internal/v1/cli/prompts/system",...d,headers:{"Content-Type":"application/json",...d.headers}}));var d;if(401===l.response.status)throw qr.warn("System prompt fetch failed: unauthorized (401)"),await Ir(),new Error("Your session has expired or been revoked. Credentials have been cleared. Please run `stably login` to re-authenticate.");if(403===l.response.status)throw qr.warn("System prompt fetch failed: forbidden (403)"),await Ir(),new Error("You no longer have access to this organization. Credentials have been cleared. Please run `stably login` to re-authenticate.");if(l.error)throw qr.warn("System prompt fetch failed",{error:l.error}),new Error(`Failed to fetch system prompt: ${JSON.stringify(l.error)}`);const u=function({customHeader:e,systemPrompt:t}){return e?`${t}\n\nWhen writing or updating the generated test file, prepend this exact header at the top of the file without modification:\n\`\`\`ts\n${e}\n\`\`\``:t}({systemPrompt:l.data.systemPrompt,customHeader:s});return qr.debug("System prompt received",{size:u.length,appendedCustomHeader:!!s}),u},Cn=".stably-playwright-wrapper.config.*",An=[".ts",".js",".mts",".mjs",".cts",".cjs"];function Pn(e){const t=r.resolve(e);if(s.existsSync(t))for(const e of An){const n=r.join(t,`playwright.config${e}`);if(s.existsSync(n))return n}}var Un=["tests","e2e","__tests__","test"];function Ln(e){try{return s.existsSync(e)&&s.statSync(e).isDirectory()}catch{return!1}}function On(e,t){const r="output-flag"===t?"--output flag":"playwright.config.ts"===t?"playwright.config.ts":"auto-detected"===t?"auto-detected":"cwd fallback";console.error(D.default.dim(`Using output directory: ${e} (from ${r})`))}var Bn=["mcp__playwright-test__","mcp__auto-heal-report__","mcp__test-doc-sync__","mcp__stably-agent-control__"],Dn=["planner_","generator_"],Nn={"mcp__stably-agent-control__restart_mcp_servers":"Restarting Browser Tools"},jn=(e,t)=>{const r=t.find(t=>e.startsWith(t));return r?e.slice(r.length):e},kn=e=>{const t=Nn[e];if(t)return t;const r=jn(e,Bn);return jn(r,Dn).split("_").map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join(" ")},$n=(e,t)=>{if(!t||"object"!=typeof t)return;const r=t,n="string"==typeof r.intent?r.intent:void 0;if("Read"!==e&&"Write"!==e&&"Edit"!==e){if("Glob"===e||"Grep"===e)return"string"==typeof r.pattern?r.pattern:void 0;if("mcp__playwright-test__test_run"!==e&&"test_run"!==e){if("mcp__playwright-test__test_debug"===e||"test_debug"===e){const e=r.test;return"string"==typeof e?.title?e.title:void 0}return"mcp__playwright-test__generator_setup_page"===e||"generator_setup_page"===e?"string"==typeof r.seedFile?r.seedFile:"tests/seed.spec.ts":"mcp__playwright-test__generator_write_test"===e||"generator_write_test"===e?"string"==typeof r.fileName?r.fileName:void 0:"Bash"===e?"string"==typeof r.command?r.command.length>50?`${r.command.slice(0,50)}...`:r.command:void 0:e.includes("browser_navigate")&&!e.includes("back")?"string"==typeof r.url?r.url:n:e.includes("browser_type")?("string"==typeof r.text?`"${r.text}"`:void 0)??n:e.includes("browser_click")?"string"==typeof r.element?r.element:n:e.includes("browser_wait_for")?"string"==typeof r.text?`text: "${r.text}"`:"number"==typeof r.time?`${r.time}ms`:n:e.includes("verify_text")?"string"==typeof r.text?`"${r.text}"`:n:e.includes("verify_element")?"string"==typeof r.accessibleName?r.accessibleName:n:e.includes("screenshot")&&"string"==typeof r.filename?r.filename:n}if(Array.isArray(r.locations)){const e=r.locations.filter(e=>"string"==typeof e);return e.length>0?e.join(", "):void 0}}else if("string"==typeof r.file_path)return r.file_path.split("/").at(-1)??void 0},Mn=["test","bug","other"],Hn={bug:"Application code defect; behavior diverges from expected requirements.",other:"External dependencies, environment, or infra issues outside test/app code.",test:"Test code is incorrect, out-of-date, or missing necessary setup."},Gn=e=>Hn[e],{zSuiteAutoHealReport:Fn}=function(e){const t=e.enum(Mn),r=["Classification of the root cause:","",`- test: ${Gn("test")}`,`- bug: ${Gn("bug")}`,`- other: ${Gn("other")}`].join("\n"),n=e.object({erroredUrl:e.string().optional(),issueType:t.describe(r),relatedTestCaseIds:e.array(e.string()).min(1).describe("List of ALL test case IDs impacted by this root cause and fix (must be existing IDs only)."),rootCause:e.string().describe("Brief explanation of what happened (1-2 sentences).")}),o=e.discriminatedUnion("result",[n.extend({fixApplied:e.string().describe("What fix was applied (brief, specific)."),result:e.literal("fixed")}),n.extend({followUpActions:e.string().optional().describe("Optional list of follow-up actions for any unfixed issues or missing data."),reasonNotFixed:e.string().describe("Why it could not be auto-fixed (brief)."),result:e.literal("unfixed")})]);return{zAutoHealReport:o,zIssueCategory:t,zSuiteAutoHealReport:e.object({issues:e.array(o).min(1).describe("List of all auto-heal issues/outcomes for this suite."),summary:e.string().min(3).describe("High-level summary (2-3 sentences) of the suite auto-heal results.")})}}(v.z),Yn=({authHeader:e,diffTracker:t,orgId:r,runId:n})=>d.createSdkMcpServer({name:"auto-heal-report",tools:[d.tool("generate-report",["After attempting to fix all broken tests (skip only those truly infeasible), generate and return a suite auto-heal report in the required schema.","","Ensure the payload matches zSuiteAutoHealReport exactly; include every issue discovered."].join("\n"),{report:Fn},async({report:o})=>{const s=await t.computeDiff(),i=Fn.parse(o);try{await(async({authHeader:e,orgId:t,report:r,runId:n})=>{const o=await(s={auth:e,body:{report:JSON.stringify(r)},client:ar(),headers:on(t),path:{runId:n}},(s.client??er).post({security:[{scheme:"bearer",type:"http"}],url:"/internal/v1/cli/runs/{runId}/autoheal-report",...s,headers:{"Content-Type":"application/json",...s.headers}}));var s;if(o.error)throw new Error(`Failed to upload auto-heal report (${o.response.status})`)})({authHeader:e,orgId:r,report:i,runId:n});const{uploadUrl:t}=await(async({authHeader:e,contentType:t="text/plain",orgId:r,runId:n})=>{const o=await(s={auth:e,body:{contentType:t},client:ar(),headers:on(r),path:{runId:n}},(s.client??er).post({security:[{scheme:"bearer",type:"http"}],url:"/internal/v1/cli/runs/{runId}/autoheal-diff/upload-url",...s,headers:{"Content-Type":"application/json",...s.headers}}));var s;if(o.error)throw new Error(`Failed to presign diff upload (${o.response.status})`);const i=cn.parse(o.data);return{diffBucketPath:i.diffBucketPath,expiresInSeconds:i.expiresInSeconds,key:i.key,uploadUrl:i.uploadUrl}})({authHeader:e,contentType:"text/plain",orgId:r,runId:n});await(async({contentType:e="text/plain",diff:t,uploadUrl:r})=>{const n=await fetch(r,{body:t,headers:{"Content-Type":e},method:"PUT"});if(!n.ok)throw new Error(`Failed to upload diff (${n.status})`)})({contentType:"text/plain",diff:s,uploadUrl:t})}catch(e){return console.error("[auto-heal-report] Failed to upload report or diff:",e),{content:[{text:"Error: Failed to upload auto-heal report or diff. Please surface this to the user, and terminate the session.",type:"text"}]}}return{content:[{text:"Auto-heal report generated. You may terminate this session now.",type:"text"}]}})],version:"0.0.1"}),zn=({onComplete:e})=>d.createSdkMcpServer({name:"session-control",tools:[d.tool("complete_session",["Call this tool when you have completed your task and the session should end.","Use this instead of waiting for the user to manually terminate.","Only call this when you are confident the task is fully complete."].join("\n"),{summary:v.z.string().describe("A brief summary of what was accomplished")},async({summary:t})=>{const r=t;return e(),`Session complete: ${r}`})]}),Wn=e=>e.replace(/Bearer\s+[A-Za-z0-9._-]+/gi,"Bearer [redacted]").replace(/\bsk-[A-Za-z0-9_-]{16,}\b/g,"[redacted]").replace(/\bstably_[A-Za-z0-9_-]{16,}\b/g,"[redacted]"),Kn=(e,t)=>({message:Wn(e),status:t?.status,statusText:t?.statusText}),Vn=new Set(["ANTHROPIC_API_KEY","ANTHROPIC_AUTH_TOKEN","ANTHROPIC_CUSTOM_HEADERS","ANTHROPIC_DEFAULT_HAIKU_MODEL","ANTHROPIC_DEFAULT_OPUS_MODEL","ANTHROPIC_DEFAULT_SONNET_MODEL","ANTHROPIC_FOUNDRY_API_KEY","ANTHROPIC_MODEL","ANTHROPIC_SMALL_FAST_MODEL","ANTHROPIC_SMALL_FAST_MODEL_AWS_REGION","AWS_BEARER_TOKEN_BEDROCK","BASH_DEFAULT_TIMEOUT_MS","BASH_MAX_OUTPUT_LENGTH","BASH_MAX_TIMEOUT_MS","CLAUDE_BASH_MAINTAIN_PROJECT_WORKING_DIR","CLAUDE_CODE_API_KEY_HELPER_TTL_MS","CLAUDE_CODE_CLIENT_CERT","CLAUDE_CODE_CLIENT_KEY_PASSPHRASE","CLAUDE_CODE_CLIENT_KEY","CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS","CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC","CLAUDE_CODE_DISABLE_TERMINAL_TITLE","CLAUDE_CODE_IDE_SKIP_AUTO_INSTALL","CLAUDE_CODE_MAX_OUTPUT_TOKENS","CLAUDE_CODE_SHELL_PREFIX","CLAUDE_CODE_SKIP_BEDROCK_AUTH","CLAUDE_CODE_SKIP_FOUNDRY_AUTH","CLAUDE_CODE_SKIP_VERTEX_AUTH","CLAUDE_CODE_SUBAGENT_MODEL","CLAUDE_CODE_USE_BEDROCK","CLAUDE_CODE_USE_FOUNDRY","CLAUDE_CODE_USE_VERTEX","CLAUDE_CONFIG_DIR","DISABLE_AUTOUPDATER","DISABLE_BUG_COMMAND","DISABLE_COST_WARNINGS","DISABLE_ERROR_REPORTING","DISABLE_NON_ESSENTIAL_MODEL_CALLS","DISABLE_PROMPT_CACHING","DISABLE_PROMPT_CACHING_HAIKU","DISABLE_PROMPT_CACHING_OPUS","DISABLE_PROMPT_CACHING_SONNET","DISABLE_TELEMETRY","HTTP_PROXY","HTTPS_PROXY","MAX_MCP_OUTPUT_TOKENS","MAX_THINKING_TOKENS","MCP_TIMEOUT","MCP_TOOL_TIMEOUT","NO_PROXY","SLASH_COMMAND_TOOL_CHAR_BUDGET","USE_BUILTIN_RIPGREP","VERTEX_REGION_CLAUDE_3_5_HAIKU","VERTEX_REGION_CLAUDE_3_7_SONNET","VERTEX_REGION_CLAUDE_4_0_OPUS","VERTEX_REGION_CLAUDE_4_0_SONNET","VERTEX_REGION_CLAUDE_4_1_OPUS"]),qn=async({authHeader:e,mode:t,maxTurnsOverride:r})=>{const n=ar();qr.debug("Requesting subagent definitions from API",{mode:t,maxTurnsOverride:r});const o=await(s={client:n,auth:e,body:{mode:t,maxTurnsOverride:r}},(s.client??er).post({security:[{scheme:"bearer",type:"http"}],url:"/internal/v1/cli/prompts/subagents",...s,headers:{"Content-Type":"application/json",...s.headers}}));var s;if(401===o.response.status)throw qr.warn("Subagent definitions fetch failed: unauthorized (401)"),await Ir(),new Error("Your session has expired or been revoked. Credentials have been cleared. Please run `stably login` to re-authenticate.");if(403===o.response.status)throw qr.warn("Subagent definitions fetch failed: forbidden (403)"),await Ir(),new Error("You no longer have access to this organization. Credentials have been cleared. Please run `stably login` to re-authenticate.");if(o.error)throw qr.warn("Subagent definitions fetch failed",{error:o.error}),new Error(`Failed to fetch subagent definitions: ${JSON.stringify(o.error)}`);const{subagents:i}=o.data;return qr.debug("Subagent definitions received",{count:Object.keys(i).length}),i},{zStablyYaml:Jn}=function(e){const t=e.object({cron:e.string(),stablyTestArgs:e.string().optional(),timezone:e.string().optional()}),r=e.object({maxTurnsPerIssue:e.number().int().positive().optional(),maxParallelWorkers:e.number().int().positive().optional(),rules:e.string().optional()}),n=e.object({fix:r.optional()});return{zStablyYaml:e.object({schedules:e.record(e.string(),t).optional(),agent:n.optional()}),zAgentConfig:n,zAgentFixConfig:r,zScheduleEntry:t}}(_.z),Xn=["Bash","Read","Write","Edit","Glob","Grep","Task"],Qn=["Task","mcp__playwright-test"],Zn=["Bash","Read","Write","Edit","Glob","Grep","mcp__session-control"],eo=e=>{if("EPIPE"!==e.code)throw e},to=async e=>{if("single"===e.mode||"build"===e.mode){const t=Array.isArray(e.prompt)?e.prompt.join(" "):e.prompt;qr.initSession(t||"create-from-diff")}else"fix"===e.mode&&qr.initSession(`fix-${e.runId}`);qr.info("Agent session starting",{mode:e.mode}),process.stdout.on("error",eo),process.stderr.on("error",eo);const t=e=>{if("EPIPE"!==e.code)throw e};process.on("uncaughtException",t),qr.debug("Checking authentication");const n=await tn({autoLogin:"chat"===e.mode||"init"===e.mode}),o=(e=>"env"===e.type?e.auth.apiKey:e.auth.accessToken)(n);qr.debug("Authentication resolved",{authType:n.type});const i="oauth"===n.type?n.auth.context.orgId:void 0,a=A.default.resolve(process.cwd()),c=A.default.join(a,".env"),l=L.default.existsSync(c)&&L.default.statSync(c).isFile(),p=l?u.parse(L.default.readFileSync(c,"utf8")):{};qr.debug("Environment file",{path:c,exists:l,variableCount:Object.keys(p).length});const f="chat"!==e.mode&&"init"!==e.mode,h="chat"===e.mode||"init"===e.mode?new wn:void 0,m="chat"===e.mode?e.getHelpText:void 0,y={log:[],promptDisplay:"chat"===e.mode?"Ask Stably to build tests for you":"init"===e.mode?"Setting up Playwright and Stably SDK":"fix"===e.mode?"Fixing broken tests":(Array.isArray(e.prompt)?e.prompt.join(" "):e.prompt)?.trim()||"Creating tests from PR/branch changes",status:"running"};let _,b=f,E=!1;const I=new Map;let w=null,v=!1,R=!1;const C=async t=>{if("fix"===e.mode){if("STARTED"===t){if(v)return;v=!0}else{if(R)return;R=!0}try{await(async({authHeader:e,orgId:t,runId:r,status:n})=>{const o=await(s={auth:e,body:{status:n},client:ar(),headers:on(t),path:{runId:r}},(s.client??er).post({security:[{scheme:"bearer",type:"http"}],url:"/internal/v1/cli/runs/{runId}/autoheal-status",...s,headers:{"Content-Type":"application/json",...s.headers}}));var s;if(o.error)throw new Error(`Failed to update autoheal status (${o.response.status})`)})({authHeader:o,orgId:i,runId:e.runId,status:t})}catch{}}},P={current:e=>{}},U={current:async()=>{}},{addSubagentActivity:O,addSubagentStart:B,addTool:N,addToolResult:j,appendText:k,appendUserMessage:$,cleanup:M,setExiting:H,setStatus:G,setSubagentStatus:F,updateFixProgress:Y}=await(async(e,t)=>{const{Box:r,Static:n,Text:o,render:s,useInput:i}=await import("ink"),a=!!process.stdin.isTTY,c=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],l=()=>x.jsx(o,{inverse:!0,children:" "}),d=(({Box:e,Text:t,useInput:r},n,o)=>function({onChoice:s,prompt:i}){const[a,c]=T.useState(0),[l,d]=T.useState(!1),[u,p]=T.useState(""),f=[{label:"Yes, allow this once",value:"allow"},{label:"Yes, always allow for this session",value:"always"},{label:"No, tell AI what to do differently",value:"deny_with_message"}];r((e,t)=>{if(l)return t.return?void s("deny_with_message",u||"User denied this action"):t.escape?(d(!1),void p("")):t.backspace||t.delete?void p(e=>e.slice(0,-1)):void(t.ctrl||t.meta||p(t=>`${t}${e}`));if(t.upArrow)return void c(e=>e>0?e-1:f.length-1);if(t.downArrow)return void c(e=>e<f.length-1?e+1:0);if(t.return){const e=f[a];return"deny_with_message"===e.value?void d(!0):void s(e.value)}const r=parseInt(e,10);if(r>=1&&r<=f.length){const e=f[r-1];if("deny_with_message"===e.value)return void d(!0);s(e.value)}},{isActive:o});const h=kn(i.toolName),g=$n(i.toolName,i.input);return x.jsxs(e,{borderColor:"yellow",borderStyle:"round",flexDirection:"column",marginTop:1,paddingX:1,paddingY:0,children:[x.jsx(t,{bold:!0,color:"yellow",children:"Permission Required"}),x.jsxs(e,{flexDirection:"column",marginTop:1,children:[x.jsx(t,{color:"magenta",children:h}),null!=g&&x.jsxs(t,{color:"gray",children:[" ",g]})]}),null!=i.decisionReason&&x.jsx(e,{marginTop:1,children:x.jsxs(t,{color:"gray",children:["Reason: ",i.decisionReason]})}),l?x.jsxs(e,{flexDirection:"column",marginTop:1,children:[x.jsx(t,{color:"gray",children:"Enter message for AI (press Enter to submit, Esc to cancel):"}),x.jsxs(t,{children:[x.jsx(t,{color:"yellow",children:">"})," ",u,x.jsx(n,{})]})]}):x.jsxs(e,{flexDirection:"column",marginTop:1,children:[x.jsx(t,{color:"gray",children:"Use ↑↓ arrows or number keys to select:"}),f.map((e,r)=>x.jsx(t,{children:x.jsxs(t,{color:r===a?"cyan":void 0,children:[r===a?"❯":" "," ",r+1,". ",e.label]})},e.value))]})]})})({Box:r,Text:o,useInput:i},l,a),u=(({Cursor:e,inkComponents:{Box:t,Static:r,Text:n,useInput:o},isRawModeSupported:s,PermissionPrompt:i,Spinner:a})=>{const c=({progress:e})=>{const[r,o]=T.useState(Date.now());T.useEffect(()=>{const e=setInterval(()=>o(Date.now()),1e3);return()=>clearInterval(e)},[]);const s=r-e.startedAt,i=Math.floor(s/1e3),a=Math.floor(i/60),c=i%60,l=a>0?`${a}m ${c.toString().padStart(2,"0")}s`:`${c}s`,{label:d,color:u}={initializing:{label:"Fetching test results",color:"gray"},triage:{label:"Triaging failures",color:"yellow"},fixing:{label:"Fixing tests",color:"cyan"},validation:{label:"Validating fixes",color:"blue"},complete:{label:"Complete",color:"green"}}[e.phase],p=e.fixedTests+e.failedTests,f="fixing"===e.phase&&p>0?null!==e.totalTests?` (fixed ${e.fixedTests}/${e.totalTests}${e.failedTests>0?`, failed ${e.failedTests}`:""})`:` (fixed ${e.fixedTests}${e.failedTests>0?`, failed ${e.failedTests}`:""})`:"";return x.jsx(t,{flexDirection:"column",children:x.jsxs(n,{children:[x.jsx(n,{color:u,bold:!0,children:d}),x.jsx(n,{color:"gray",children:f}),x.jsxs(n,{color:"gray",children:[" [",l,"]"]})]})})},l=({progress:e})=>{const r=e.endedAt??Date.now(),o=Math.floor((r-e.startedAt)/1e3),s=Math.floor(o/60),i=o%60,a=s>0?`${s}m ${i.toString().padStart(2,"0")}s`:`${i}s`,c=e.isError?"yellow":"green",l=e.isError?"Fix stopped":"Fix complete";return x.jsxs(t,{flexDirection:"column",children:[x.jsxs(n,{color:c,bold:!0,children:[l," in ",a]}),null!==e.totalTests&&x.jsxs(n,{color:"gray",children:[e.fixedTests,"/",e.totalTests," tests fixed",e.failedTests>0?`, ${e.failedTests} failed`:""]})]})},d=e=>{if("subagent"===e.kind&&e.subagent){const{subagent:r}=e,o="complete"===r.status?"green":"error"===r.status?"red":"yellow";return x.jsxs(t,{flexDirection:"column",marginTop:1,children:[x.jsxs(n,{children:[x.jsx(n,{color:o,bold:!0,children:"Agent"}),r.description?x.jsxs(n,{color:"gray",children:[" (",r.description,")"]}):null]}),r.activities.length>0&&x.jsx(t,{flexDirection:"column",marginLeft:2,children:r.activities.map(e=>(e=>"tool"===e.kind?x.jsxs(n,{color:"magenta",children:["• ",e.content]},e.id):"tool_result"===e.kind?x.jsx(n,{color:"gray",children:e.content},e.id):null)(e))})]},e.id)}return"tool"===e.kind?x.jsxs(n,{color:"magenta",children:["• ",e.content]},e.id):"tool_result"===e.kind?x.jsx(n,{color:"gray",children:e.content},e.id):"user"===e.kind?x.jsxs(n,{color:"cyan",children:["You: ",e.content]},e.id):x.jsx(n,{children:e.content},e.id)},u="vscode"===process.env.TERM_PROGRAM,p=(e,t)=>{if(t<=0)return 0;let r=t-1;for(;r>0&&/\s/.test(e[r]);)r--;for(;r>0&&!/\s/.test(e[r-1]);)r--;return r},f=(e,t)=>{if(t>=e.length)return e.length;let r=t;for(;r<e.length&&!/\s/.test(e[r]);)r++;for(;r<e.length&&/\s/.test(e[r]);)r++;return r},h=(e,t)=>{if(t<=0)return 0;const r=e.lastIndexOf("\n",t-1);return-1===r?0:r+1},g=(e,t)=>{const r=e.indexOf("\n",t);return-1===r?e.length:r};return function({onExit:m,onPermissionChoice:y,onSend:_,showSpinnerImmediately:b,state:E}){const[I,w]=T.useState({value:"",cursor:0}),v=I.value,S=I.cursor,R=T.useRef(!1),C=T.useRef(void 0),[A,P]=T.useState(!1),U=T.useRef(0),L=E.log.at(-1),O="text"===L?.kind&&"running"===E.status,B=E.log.findIndex(e=>"subagent"===e.kind&&"running"===e.subagent?.status),D=u?0:-1!==B?B:O?E.log.length-1:E.log.length;T.useEffect(()=>{E.log.length<U.current&&(U.current=0),D>U.current&&(U.current=D)},[E.log.length,D]);const N=E.log.slice(0,U.current),j=E.log.slice(U.current),k=!!E.permissionPrompt,$=T.useCallback(async()=>{R.current?(C.current&&clearTimeout(C.current),await(m?.()),process.exit(0)):(R.current=!0,P(!0),C.current=setTimeout(()=>{R.current=!1,P(!1)},2e3))},[m]);o((e,t)=>{t.ctrl&&"c"===e&&$().catch(()=>process.exit(1))},{isActive:s}),T.useEffect(()=>{if(k||!_)return;const e=e=>{const t=e.toString();""!==t&&"[1;5~"!==t?""!==t&&"[4;5~"!==t?""!==t&&"[1~"!==t&&"OH"!==t&&"[7~"!==t?""!==t&&"[4~"!==t&&"OF"!==t&&"[8~"!==t||w(e=>({...e,cursor:g(e.value,e.cursor)})):w(e=>({...e,cursor:h(e.value,e.cursor)})):w(e=>({...e,cursor:e.value.length})):w(e=>({...e,cursor:0}))};return process.stdin.on("data",e),()=>{process.stdin.off("data",e)}},[k,_,v]),o((e,t)=>{if(!t.ctrl||"c"!==e){if(t.return){const e=v.trim();return e&&_?.(e),void w({value:"",cursor:0})}t.ctrl&&"w"===e||t.ctrl&&t.backspace?w(e=>{const t=p(e.value,e.cursor);return{value:e.value.slice(0,t)+e.value.slice(e.cursor),cursor:t}}):!t.backspace&&!t.delete||t.ctrl?t.ctrl&&t.leftArrow||t.meta&&"b"===e?w(e=>({...e,cursor:p(e.value,e.cursor)})):t.ctrl&&t.rightArrow||t.meta&&"f"===e?w(e=>({...e,cursor:f(e.value,e.cursor)})):t.leftArrow?w(e=>({...e,cursor:Math.max(0,e.cursor-1)})):t.rightArrow?w(e=>({...e,cursor:Math.min(e.value.length,e.cursor+1)})):t.ctrl&&"a"===e?w(e=>({...e,cursor:0})):t.ctrl&&"e"===e?w(e=>({...e,cursor:e.value.length})):!e||t.ctrl||t.meta||t.escape||e.includes("")||/^\[./.test(e)||/^O[A-D]$/.test(e)||w(t=>({value:t.value.slice(0,t.cursor)+e+t.value.slice(t.cursor),cursor:t.cursor+e.length})):w(e=>e.cursor>0?{value:e.value.slice(0,e.cursor-1)+e.value.slice(e.cursor),cursor:e.cursor-1}:e)}},{isActive:s&&!!_&&!k});const M=T.useMemo(()=>"running"===E.status?x.jsx(a,{label:"Working"}):"success"!==E.status?x.jsx(n,{color:"red",children:"✖ Failed"}):void 0,[E.status]),H=!(b||!_||"running"!==E.status||0!==E.log.length||E.resultText||E.errorText),G="running"===E.status&&!H||E.log.length>0||E.resultText||E.errorText||"running"!==E.status;return x.jsxs(t,{flexDirection:"column",children:[x.jsx(r,{items:["header"],children:()=>x.jsxs(t,{flexDirection:"column",flexShrink:0,children:[x.jsx(n,{color:"cyan",bold:!0,children:"Stably Agent"}),x.jsx(t,{flexDirection:"column",marginTop:1,children:x.jsx(n,{color:"gray",children:E.promptDisplay})})]},"header")}),N.length>0&&x.jsx(r,{items:N,children:e=>d(e)}),j.length>0&&x.jsx(t,{flexDirection:"column",children:j.map(e=>d(e))}),"error"===E.status&&E.errorText&&x.jsx(t,{marginTop:1,children:x.jsx(n,{color:"red",children:E.errorText})}),"success"===E.status&&E.resultText&&x.jsx(t,{marginTop:1,children:x.jsx(n,{children:E.resultText})}),G&&x.jsx(t,{flexDirection:"column",flexShrink:0,marginTop:1,children:"running"===E.status&&E.fixProgress?x.jsxs(t,{flexDirection:"column",children:[x.jsxs(t,{children:[x.jsx(a,{}),x.jsx(n,{children:" "}),x.jsx(c,{progress:E.fixProgress})]}),"fixing"===E.fixProgress.phase&&E.log.flatMap(e=>{const{subagent:r}=e;if("subagent"!==e.kind||"fix-worker"!==r?.subagentType||"running"!==r.status)return[];const{activities:o}=r,s=o.filter(e=>"tool"===e.kind).length,i=o.at(-1),c=o.filter(e=>"tool"===e.kind).at(-1),l=(()=>{if(!i)return null;if("tool"===i.kind)return null;if("text"===i.kind){const e=i.content.trim().split("\n").at(-1)?.trim();return e?e.length>80?`${e.slice(0,80)}…`:e:null}if("tool_result"===i.kind){const e=i.content.trim().split("\n")[0]?.trim();return e?e.length>80?`${e.slice(0,80)}…`:e:null}return null})();return x.jsxs(t,{flexDirection:"column",children:[x.jsxs(n,{children:[" ",x.jsx(a,{}),x.jsxs(n,{color:"gray",children:[r.description||"fix-worker",s>0?` (${s} ${1===s?"cycle":"cycles"})`:""]})]}),c&&x.jsxs(n,{color:"gray",dimColor:!0,children:[" • ",c.content]}),l&&x.jsxs(n,{color:"gray",dimColor:!0,children:[" ",l]})]},e.id)})]}):"success"!==E.status&&"error"!==E.status||!E.fixProgress?M:x.jsx(l,{progress:E.fixProgress})}),null!=E.permissionPrompt&&null!=y&&x.jsx(i,{onChoice:y,prompt:E.permissionPrompt}),null!=_&&null==E.permissionPrompt&&!E.isExiting&&x.jsxs(t,{borderColor:"gray",borderStyle:"round",flexDirection:"column",flexShrink:0,marginTop:1,paddingX:1,paddingY:0,children:[x.jsx(n,{color:"gray",children:"Type a message and press Enter. Press Ctrl+C to exit."}),x.jsxs(n,{children:[x.jsx(n,{color:"yellow",children:">"})," ",v.slice(0,S),x.jsx(e,{}),v.slice(S)]})]}),A&&x.jsxs(t,{marginTop:1,flexDirection:"column",children:[x.jsx(n,{color:"yellow",children:"Press Ctrl+C again to exit"}),jr&&x.jsxs(n,{color:"gray",children:["Debug log: ",Hr]})]})]})}})({Cursor:l,inkComponents:{Box:r,Static:n,Text:o,useInput:i},isRawModeSupported:a,PermissionPrompt:d,Spinner:({label:e})=>{const[t,r]=T.useState(0);return T.useEffect(()=>{const e=setInterval(()=>r(e=>(e+1)%c.length),80);return()=>clearInterval(e)},[]),x.jsxs(o,{color:"yellow",children:[c[t]," ",e]})}});let p=e;t?.isFixMode&&(p.fixProgress={phase:"initializing",totalTests:null,fixedTests:0,failedTests:0,currentTestDescription:null,lastTestDescription:null,startedAt:Date.now(),endedAt:null,isError:!1});const f={current:(e,t)=>{}},h=s(x.jsx(u,{onExit:t?.onExit,onPermissionChoice:(e,t)=>f.current(e,t),onSend:t?.onSend,showSpinnerImmediately:t?.showSpinnerImmediately,state:p}),{exitOnCtrlC:!1}),g=()=>{p={...p},h.rerender(x.jsx(u,{onExit:t?.onExit,onPermissionChoice:(e,t)=>f.current(e,t),onSend:t?.onSend,showSpinnerImmediately:t?.showSpinnerImmediately,state:p}))},m=({text:e})=>{e&&(p.log=[...p.log,{content:e,id:p.log.length,kind:"user"}],g())},y=new Map;return{addSubagentActivity:({toolUseId:e,kind:t,content:r})=>{const n=y.get(e);if(void 0===n)return void console.error("[addSubagentActivity] No entry index for toolUseId:",e);const o=p.log[n];if(o&&"subagent"===o.kind&&o.subagent){if("text"===t){const e=o.subagent.activities.at(-1);e&&"text"===e.kind?e.content+=r:o.subagent.activities.push({id:o.subagent.activities.length,kind:"text",content:r.replace(/^\s*\n+/,"")})}else o.subagent.activities.push({id:o.subagent.activities.length,kind:t,content:r});p.log=[...p.log],g()}else console.error("[addSubagentActivity] Entry not found or not subagent:",{entryIndex:n,entryKind:o?.kind})},addSubagentStart:({toolUseId:e,subagentType:t,description:r})=>{const n=p.log.length;if(y.set(e,n),p.log=[...p.log,{content:"",id:n,kind:"subagent",subagent:{toolUseId:e,subagentType:t,description:r,status:"running",activities:[]}}],p.fixProgress)if("triage"===t&&"initializing"===p.fixProgress.phase)p.fixProgress={...p.fixProgress,phase:"triage"};else if("fix-worker"===t){const e=(p.fixProgress.totalTests??0)+1,t=r||null;p.fixProgress={...p.fixProgress,phase:"fixing",totalTests:e,currentTestDescription:t,lastTestDescription:t??p.fixProgress.lastTestDescription}}else"validation"===t?p.fixProgress={...p.fixProgress,phase:"validation",currentTestDescription:null}:"context"===t&&(p.fixProgress={...p.fixProgress,currentTestDescription:r||p.fixProgress.currentTestDescription});g()},addTool:({rawName:e,toolInput:t})=>{const r=kn(e),n=$n(e,t),o=n?`${r} (${n})`:r;p.log=[...p.log,{content:o,id:p.log.length,kind:"tool"}],g()},addToolResult:({message:e})=>{p.log=[...p.log,{content:e,id:p.log.length,kind:"tool_result"}],g()},appendText:({text:e})=>{if(!e)return;const t=p.log.at(-1),r=t&&"text"===t.kind?e:e.replace(/^\s*\n+/,"");t&&"text"===t.kind?p.log=[...p.log.slice(0,-1),{...t,content:`${t.content}${r}`}]:p.log=[...p.log,{content:r,id:p.log.length,kind:"text"}],g()},appendUserMessage:m,cleanup:async()=>{const e=h.waitUntilExit();h.unmount(),await e},setExiting:()=>{p.isExiting=!0,g()},setStatus:({error:e,result:t,status:r})=>{p.errorText=e,p.resultText=t,p.status=r,g()},setSubagentStatus:({toolUseId:e,status:t})=>{const r=y.get(e);if(void 0===r)return;const n=p.log[r];n&&"subagent"===n.kind&&n.subagent&&(n.subagent.status=t,p.fixProgress&&"fix-worker"===n.subagent.subagentType&&("complete"===t?p.fixProgress={...p.fixProgress,fixedTests:p.fixProgress.fixedTests+1,currentTestDescription:null}:"error"===t&&(p.fixProgress={...p.fixProgress,failedTests:p.fixProgress.failedTests+1,currentTestDescription:null})),p.log=[...p.log],g(),"complete"!==t&&"error"!==t||y.delete(e))},showPermissionPrompt:e=>new Promise(t=>{f.current=(r,n)=>{if(p.permissionPrompt=void 0,g(),"allow"===r)t({behavior:"allow",updatedInput:e.input});else if("always"===r)t({behavior:"allow",updatedInput:e.input,updatedPermissions:e.suggestions});else{const e=n??"User denied this action";m({text:e}),t({behavior:"deny",message:e,interrupt:!1})}},p.permissionPrompt={...e,resolve:t},g()}),updateFixProgress:t?.isFixMode?e=>{p.fixProgress&&(p.fixProgress={...p.fixProgress,...e},g())}:void 0}})(y,"chat"===e.mode||"init"===e.mode?{onExit:()=>U.current(),onSend:e=>P.current(e),showSpinnerImmediately:"init"===e.mode}:"fix"===e.mode?{onExit:()=>U.current(),isFixMode:!0}:void 0);let z=y.status;const W=({error:e,result:t,status:r})=>{z=r,G({error:e,result:t,status:r})};let K;P.current=t=>{const r=t.trim();if("chat"!==e.mode||qr.getLogFilePath()||qr.initSession(r||"chat"),qr.debug("User message",{text:r}),"/help"===r){b&&h&&(E=!0,_?.interrupt?.(),h.allowNextTurn(),b=!1),"running"===z&&W({status:"success"}),$({text:t});const e=m?.();return void k({text:e??"Help is not available in this session."})}h&&(b&&(E=!0,_?.interrupt?.(),h.allowNextTurn(),b=!1),W({status:"running"}),$({text:t}),h.pushText(t),b=!0)};const V=[];let q;const J=await(async()=>{if("single"===e.mode||"build"===e.mode){const n=await async function(e,t){const n=r.resolve(e);if(t){const e=r.resolve(n,t);return On(e,"output-flag"),{path:e,source:"output-flag"}}const o=Pn(n);if(o){const e=await async function(e){try{const t=(await g.readFile(e,"utf-8")).match(/testDir:\s*['"]([^'"]+)['"]/);return t?.[1]}catch{return}}(o);if(e){const t=r.resolve(r.dirname(o),e);if(Ln(t))return On(t,"playwright.config.ts"),{path:t,source:"playwright.config.ts"}}}for(const e of Un){const t=r.join(n,e);if(Ln(t))return On(t,"auto-detected"),{path:t,source:"auto-detected"}}return On(n,"cwd-fallback"),{path:n,source:"cwd-fallback"}}(a,e.outputDir);return q=n.path,t=e.prompt,`${(Array.isArray(t)?t.join(" "):t).trim()||"Create tests based on the changes in the current PR or branch. Use the Pull Request Context or Git Branch Context section of the system prompt to understand what code was changed, then create appropriate tests for the new or modified functionality. After generating the tests, run them locally (e.g. `pnpm playwright test` or the repo's Playwright test command) and iterate until the new tests pass."}\n\n[Output directory: ${q}]`}var t;if("fix"===e.mode)try{const{context:t,autohealReportUrl:r}=await(async({authHeader:e,orgId:t,runId:r})=>{qr.debug("Fetching autoheal context",{runId:r});const n=await(o={auth:e,client:ar(),headers:on(t),path:{runId:r}},(o.client??er).get({security:[{scheme:"bearer",type:"http"}],url:"/internal/v1/cli/runs/{runId}/autoheal-context",...o}));var o;if(404===n.response.status)throw qr.warn("Autoheal context not found",{runId:r,status:404}),new Error(`Run ID "${r}" was not found.`);if(401===n.response.status)throw qr.warn("Autoheal context fetch unauthorized",{runId:r,status:401}),new Error("Unauthorized: failed to fetch autoheal context (401).");if(422===n.response.status)throw qr.warn("Autoheal context fetch invalid request",{runId:r,status:422,error:n.error?.error}),new Error(n.error?.error??"Failed to fetch autoheal context (422).");if(!n.error){const e=sn.safeParse(n.data);if(e.success)return qr.debug("Autoheal context fetched successfully",{runId:r,contextSize:e.data.context.length}),{context:e.data.context,autohealReportUrl:e.data.autohealReportUrl};throw qr.warn("Autoheal context response invalid",{runId:r}),new Error("Autoheal context response missing or invalid context.")}throw qr.warn("Autoheal context fetch failed",{runId:r,error:n.error}),new Error("Failed to fetch autoheal context")})({authHeader:o,orgId:i,runId:e.runId});return K=r,C("STARTED"),t}catch(e){const t=e instanceof Error?e.message:"Failed to fetch autoheal context.";W({error:t,status:"error"}),await M(),process.exit(1)}return"init"===e.mode?"Please analyze this project and set up Playwright with the Stably SDK. Check for existing configurations and install the necessary dependencies.":""})(),X=await async function(e){const t=A.default.resolve(e),r=A.default.join(t,"tests"),n=A.default.join(r,"helpers"),o=A.default.join(r,"assets"),i=function(e){const t=A.default.resolve(e);if(s.existsSync(t))for(const e of vn){const r=A.default.join(t,`playwright.config${e}`);if(s.existsSync(r))return r}}(t)??A.default.join(t,"playwright.config.ts"),a=A.default.basename(i),c=A.default.join(r,"seed.spec.ts"),[l,d,u,p,f,h]=await Promise.all([Sn({defaultContent:"Unable to read directory",dirName:"working directory",dirPath:t}),Sn({defaultContent:"Unable to read directory",dirName:"tests directory",dirPath:r}),Sn({defaultContent:"Directory does not exist yet",dirName:"helpers directory",dirPath:n}),Sn({defaultContent:"Directory does not exist yet",dirName:"assets directory",dirPath:o}),xn({defaultContent:"File does not exist or could not be read",fileName:a,filePath:i}),xn({defaultContent:"File does not exist or could not be read",fileName:"seed.spec.ts",filePath:c})]);return{absolutePath:t,directories:{assets:p,helpers:u,root:l,tests:d},files:{playwrightConfig:f,playwrightConfigFilename:a,seedSpec:h}}}(a),Q=await(async e=>{try{const t=await(async e=>{let t=e;const{root:r}=A.default.parse(t);for(;t!==r;){const e=A.default.join(t,"stably.yaml");try{return await g.readFile(e),e}catch{t=A.default.dirname(t)}}})(e);if(!t)return void qr.debug("No stably.yaml found");const r=await g.readFile(t,"utf-8");if(!r.trim())return;const n=S.parseDocument(r),o=Jn.parse(n.toJS()),s=o.agent?.fix?.maxTurnsPerIssue,i=o.agent?.fix?.maxParallelWorkers,a=!!o.agent?.fix?.rules;return qr.debug(`Loaded stably.yaml: maxTurnsPerIssue=${s??"default"}, maxParallelWorkers=${i??"default"}, hasRules=${a}`,{path:t,config:o.agent}),o}catch(e){return void qr.warn("Failed to parse stably.yaml",{error:e})}})(a),Z=Q?.agent?.fix?.maxTurnsPerIssue,ee=Q?.agent?.fix?.maxParallelWorkers,te=Q?.agent?.fix?.rules;qr.debug("Fetching system prompt and subagents",{mode:e.mode,maxTurnsOverride:Z,hasCustomRules:!!te});const[re,ne]=await Promise.all([Rn({allowedEnvVars:Object.keys(p),mode:e.mode,workspaceInfo:X,authHeader:o,customHeader:"single"===e.mode||"build"===e.mode?e.customHeader:void 0,maxParallelWorkers:"fix"===e.mode?ee:void 0}),"fix"===e.mode?qn({authHeader:o,mode:e.mode,maxTurnsOverride:Z}):Promise.resolve({})]);qr.debug("System prompt and subagents fetched",{systemPromptSize:re.length,subagentCount:Object.keys(ne).length,maxTurnsOverride:Z??"default"});const oe={...p,...process.env},se={};for(const[e,t]of Object.entries(oe))Vn.has(e)||void 0===t||(se[e]=t);qr.debug("AI proxy configuration",{useStablyAiProxy:!0,wantsBypassProxy:!1,wantsUseOllama:!1});const ie=await async function({auth:e,client:t,source:r,metadata:n,duration:o}){try{const i=await(s={auth:e,client:t,body:{source:r,metadata:n??{},duration:o}},(s.client??er).post({security:[{scheme:"bearer",type:"http"}],url:"/v1/proxy/api-key",...s,headers:{"Content-Type":"application/json",...s.headers}})),a=i.response;if(i.error){const e="object"==typeof i.error&&"error"in i.error?i.error.error:"Unknown error";return{error:Kn(e,a)}}return i.data?{key:i.data.key}:{error:Kn("No data in response",a)}}catch(e){const t=e instanceof Error?e.message:"Unknown error";return{error:Kn(t)}}var s}({auth:o,client:ar(),source:"cli"}),ae=ie?.key;if(!ae){const e=ie?.error?.message?`Unable to make AI calls: ${ie.error.message}`:"Unable to make AI calls. Check if you are authenticated.";qr.warn("Failed to get proxy API key",{error:ie?.error?.message}),W({error:e,status:"error"}),await M(),qr.flush(),qr.printLogFileInfo(),process.exit(1)}qr.debug("Proxy API key acquired",{success:!!ae});const ce=await nn(),le=ce?Object.fromEntries(Object.entries(rn(ce)).filter(e=>null!=e[1])):void 0,de="init"===e.mode,ue="fix"===e.mode,pe=ue?Lt.createLocal({workingDir:a}):void 0;pe&&await pe.captureSnapshot();const fe=de?Zn:[...Xn,...ue?["mcp__auto-heal-report"]:[]],he=de?Zn:Qn,ge=de?{"session-control":zn({onComplete:()=>{W({status:"success"}),H(),h?.finish(),process.exit(0)}})}:ue&&pe?{"playwright-test":{args:["playwright","run-test-mcp-server"],command:"npx",env:le},"auto-heal-report":Yn({authHeader:o,diffTracker:pe,orgId:i,runId:e.runId})}:{"playwright-test":{args:["playwright","run-test-mcp-server"],command:"npx",env:le}},me="single"===e.mode||"build"===e.mode,ye=de?[]:[{hooks:[async e=>{const t=pn(e);if(!t)return{decision:"approve"};let r=!1;const n=t.map(e=>dn(e)?e.text.length<=4e4?e:(r=!0,{...e,text:`${e.text.slice(0,4e4)}...[truncated to 40000 characters]`}):e);return r?{decision:"approve",hookSpecificOutput:{hookEventName:"PostToolUse",updatedMCPToolOutput:n}}:{decision:"approve"}}],matcher:"mcp__playwright-test__.*"},{matcher:"mcp__playwright-test__test_run",hooks:[_n({onResult:e=>j({message:e})})]},{matcher:"mcp__playwright-test__test_debug",hooks:[bn({onResult:e=>j({message:e})})]},...me?[{matcher:"Write",hooks:[In({onFileCreated:e=>V.push(e)})]}]:[]],_e=de?[]:[{matcher:"mcp__playwright-test__browser_type",hooks:[yn({envVars:p})]}],be=Object.keys(ne).length>0?ne:void 0,Ee={...se};Ee.MCP_TOOL_TIMEOUT=String(6e5),ae&&(Ee.ANTHROPIC_API_KEY=ae,Ee.ANTHROPIC_BASE_URL=sr,Ee.CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS="1");const Ie=process.env.STABLY_AGENT_MODEL??"claude-opus-4-5-20251101",we=te?`${re}\n\n## Custom Rules\n${te}`:re;qr.info("Starting agent query",{model:Ie,tools:fe,mcpServers:Object.keys(ge),subagentsEnabled:!!be,subagentCount:Object.keys(ne).length}),_=d.query({options:{tools:fe,allowedTools:he,betas:[],canUseTool:(e,t)=>Promise.resolve({behavior:"allow",updatedInput:t}),cwd:a,env:Ee,hooks:{PostToolUse:ye,PreToolUse:_e},includePartialMessages:!0,agents:be,mcpServers:ge,model:Ie,permissionMode:"default",systemPrompt:we},prompt:h??J}),"init"===e.mode&&h&&h.pushText(J),U.current=async()=>{w="CANCELED",await C("CANCELED"),qr.flush(),H();try{await(_?.interrupt?.())}catch{}h?.finish(),M()};try{for await(const e of _){if("stream_event"===e.type){const{event:t}=e,r=t&&"object"==typeof t&&"parent_tool_use_id"in t&&"string"==typeof t.parent_tool_use_id?t.parent_tool_use_id:void 0;if("content_block_delta"===t?.type){const{delta:e}=t;"text_delta"===e?.type&&e.text&&(r&&I.has(r)?O({toolUseId:r,kind:"text",content:e.text}):k({text:e.text}))}"message_stop"===t?.type&&h&&h.allowNextTurn();continue}if("assistant"===e.type){const t="parent_tool_use_id"in e&&"string"==typeof e.parent_tool_use_id?e.parent_tool_use_id:void 0,{content:r}=e.message??{};if(Array.isArray(r)&&!t){const e=r.filter(e=>e&&"object"==typeof e&&"type"in e&&"text"===e.type).map(e=>e&&"object"==typeof e&&"text"in e&&"string"==typeof e.text?e.text:void 0).filter(Boolean).join("");e&&qr.debug("Assistant message",{text:e})}if(I.size>0){const n=Array.isArray(r)?r.filter(e=>e&&"object"==typeof e&&"type"in e&&"tool_use"===e.type).map(e=>e&&"object"==typeof e&&"name"in e&&"string"==typeof e.name?e.name:void 0):[];qr.debug("Assistant message with active subagents",{hasParentToolUseId:!!t,parentToolUseId:t,activeSubagentIds:Array.from(I.keys()),toolNames:n,fullMessageKeys:Object.keys(e),rawMessage:JSON.stringify(e).slice(0,500)})}if(Array.isArray(r))for(const e of r){if("tool_use"===e?.type){if(e.name.startsWith("mcp__session-control__"))continue;if(I.size>0&&qr.debug("Tool use detected with active subagents",{toolName:e.name,hasParentToolUseId:!!t,parentToolUseId:t,wouldRouteToSubagent:!!t&&I.has(t),activeSubagentIds:Array.from(I.keys())}),"Task"===e.name){const t=e.input,r=t&&"object"==typeof t?t:void 0,n=r&&"subagent_type"in r&&"string"==typeof r.subagent_type?r.subagent_type:"subagent",o=r&&"description"in r&&"string"==typeof r.description?r.description.trim():"";qr.debug("Subagent started",{subagentType:n,description:o,toolUseId:e.id}),I.set(e.id,{subagentType:n,description:o}),B({toolUseId:e.id,subagentType:n,description:o});continue}if(t&&I.has(t)){const r=kn(e.name),n=$n(e.name,e.input),o=n?`${r} (${n})`:r;qr.debug("Subagent tool called",{tool:e.name,parentToolUseId:t}),O({toolUseId:t,kind:"tool",content:o});continue}t&&qr.debug("Tool with parent_tool_use_id but no matching subagent",{tool:e.name,parentToolUseId:t,activeSubagentIds:Array.from(I.keys())}),qr.debug("Tool called",{tool:e.name,input:e.input}),N({rawName:e.name,toolInput:e.input})}if("text"===e?.type&&t&&I.has(t)){const r="string"==typeof e.text?e.text:"";r&&O({toolUseId:t,kind:"text",content:r})}}continue}if("user"===e.type){const t="message"in e&&e.message&&"object"==typeof e.message&&"content"in e.message?e.message.content:void 0;if(Array.isArray(t))for(const e of t)if(e&&"object"==typeof e&&"type"in e&&"tool_result"===e.type&&"tool_use_id"in e){const t="string"==typeof e.tool_use_id?e.tool_use_id:void 0,r="is_error"in e&&!0===e.is_error,n="content"in e&&"string"==typeof e.content?e.content:void 0;qr.debug("Tool result",{toolUseId:t,isError:r,output:n?.slice(0,500)}),t&&I.has(t)&&(qr.debug("Subagent completed",{toolUseId:t,isError:r}),F({toolUseId:t,status:r?"error":"complete"}),I.delete(t))}continue}if("result"!==e.type);else{if(qr.debug("Agent result",{subtype:e.subtype}),f){if("success"===e.subtype){if(Y?.({phase:"complete",currentTestDescription:null,endedAt:Date.now()}),me&&V.length>0){D.default.green("Created files:");for(const e of V)D.default.green(`- ${e}`)}const e=K?D.default.cyan(`📊 View Autoheal Report:\n ${D.default.cyan(D.default.bold(D.default.underline(K)))}`):void 0;W({status:"success",result:e}),w="COMPLETED"}else E?w="CANCELED":(Y?.({endedAt:Date.now(),isError:!0}),W({error:"Run failed.",status:"error"}),process.exitCode=1,w="FAILED");E=!1;break}"success"!==e.subtype?E||(W({error:"Run failed.",status:"error"}),process.exitCode=1):W({status:"success"}),b=!1,E=!1,h?.allowNextTurn()}}}catch(e){E?w="CANCELED":(qr.error("Agent encountered an error",{error:e instanceof Error?e.message:String(e),stack:e instanceof Error?e.stack:void 0}),W({error:`Agent encountered an error: ${e}`,status:"error"}),process.exitCode=1,w="FAILED",qr.flush(),qr.printLogFileInfo())}finally{qr.info("Agent session ending"),b=!1,E=!1,process.off("uncaughtException",t),h?.finish(),w&&await C(w),await(pe?.cleanup()),await M()}},ro=k.default.object({runId:k.default.string(),timestamp:k.default.number()}),no="sha256",oo=/^\/\*\*\r?\n \* @generated by stably build[\s\S]*?\*\/(?:\r?\n)*/;function so(e){return!!e&&"object"==typeof e&&"code"in e}async function io({errorMessage:e,filePath:t}){try{return await j.default.readFile(t,"utf8")}catch(t){if(so(t)&&"ENOENT"===t.code)throw new Error(e);throw t}}function ao(e){return e.split(A.default.sep).join("/")}async function co(e){try{return(await j.default.readdir(e)).filter(e=>ln.test(e)).map(t=>A.default.join(e,t))}catch(e){if(so(e)&&"ENOENT"===e.code)return[];throw e}}function lo(e=process.cwd()){let t=r.resolve(e);for(;;){const e=uo(t);if(e){const n={...e.dependencies,...e.devDependencies},o="@playwright/test"in n?"@playwright/test":"playwright"in n?"playwright":void 0;if(o){const e=po(t);let n=!1,i=t;for(;;){const e=r.join(i,"node_modules"),t=r.join(e,o);if(s.existsSync(t)){n=!0;break}const a=r.dirname(i);if(a===i)break;i=a}return{inNodeModules:n,installed:!0,packageManager:e,packageName:o}}}const n=r.dirname(t);if(n===t)return{inNodeModules:!1,installed:!1,packageManager:void 0};t=n}}function uo(e){const t=r.join(e,"package.json");let n;try{n=s.readFileSync(t,"utf-8")}catch{return}try{return JSON.parse(n)}catch{return}}function po(e){const t=[["npm","package-lock.json"],["pnpm","pnpm-lock.yaml"],["yarn","yarn.lock"]];let n=e;for(;;){for(const[e,o]of t)if(s.existsSync(r.join(n,o)))return e;const e=r.dirname(n);if(e===n)return;n=e}}function fo(e){if("npm"===e)return["npx","playwright"];if("pnpm"===e)return["pnpm","exec","playwright"];if("yarn"===e)return["yarn","playwright"];throw new Error("Package manager not supported")}var ho=[{args:["--trace=on"],description:"Run Playwright tests",name:"test"},{args:[],description:"Install browser dependencies",name:"install"}];function go(e){const[t,...r]=fo(e),n=[t,...r.slice(0,-1)].join(" ");return(t,r)=>{let o=t.toString();for(const e of ho)o=o.replaceAll(`${n} playwright ${e.name}`,`${n} stably ${e.name}`).replaceAll(`npx playwright ${e.name}`,`npx stably ${e.name}`);if("yarn"===e){const e=o.split("\n");return e.length>0&&e[0].includes("/.bin/playwright")&&e.shift(),void r.write(e.join("\n"))}r.write(o)}}function mo(e=""){process.stdout.write(`${e}\n`)}function yo(...e){process.stderr.write(`${e.join(" ")}\n`)}var _o="stably",bo=`https://registry.npmjs.org/${_o}/latest`,Eo=_.z.object({version:_.z.string()});function Io(e){const t=e.match(/^(\d+)\.(\d+)\.(\d+)/);return t?{major:parseInt(t[1],10),minor:parseInt(t[2],10),patch:parseInt(t[3],10)}:null}function wo(e,t){const r=Io(e),n=Io(t);return!(!r||!n)&&(n.major>r.major||!(n.major<r.major)&&(n.minor>r.minor||!(n.minor<r.minor)&&n.patch>r.patch))}var vo=A.default.join(O.default.homedir(),".stably"),To=A.default.join(vo,"update-check.json"),xo=`https://registry.npmjs.org/${_o}/latest`,So=_.z.object({lastCheck:_.z.number(),latestVersion:_.z.string()}),Ro=!1,Co=!1,Ao=async()=>{if(Co)try{const{shutdown:e}=await import("@hyperdx/node-opentelemetry"),t=console.log;console.log=(...e)=>{e[0]?.toString().includes("OpenTelemetry")||t(...e)};try{await e()}finally{console.log=t}}catch{}};!function(){const e=function(){try{const e=L.default.readFileSync(To,"utf-8");return So.parse(JSON.parse(e))}catch{return null}}(),t=Date.now();if((null==e||t-e.lastCheck>=18e5)&&function(){const e=`\n const https = require('https');\n const fs = require('fs');\n const url = '${xo}';\n const cacheFile = ${JSON.stringify(To)};\n const cacheDir = ${JSON.stringify(vo)};\n\n const req = https.get(url, { timeout: 5000 }, (res) => {\n if (res.statusCode !== 200) process.exit(1);\n let data = '';\n res.on('data', (chunk) => data += chunk);\n res.on('end', () => {\n try {\n const version = JSON.parse(data).version;\n if (!fs.existsSync(cacheDir)) fs.mkdirSync(cacheDir, { recursive: true });\n fs.writeFileSync(cacheFile, JSON.stringify({ lastCheck: Date.now(), latestVersion: version }));\n } catch {}\n process.exit(0);\n });\n });\n req.on('error', () => process.exit(1));\n req.on('timeout', () => { req.destroy(); process.exit(1); });\n `;try{n.spawn(process.execPath,["-e",e],{detached:!0,stdio:"ignore",windowsHide:!0}).unref()}catch{}}(),null!=e&&wo(tr,e.latestVersion)){if(Ro)return;Ro=!0;let t=!1;const r=()=>{if(t)return;t=!0;const r=`${D.default.yellow(`update available (${tr} → ${e.latestVersion})`)} - run \`${_o} upgrade\` to get the latest version\n`;try{L.default.writeSync(2,r)}catch{}};process.once("beforeExit",r),process.once("exit",r)}}();var Po=process.argv.findIndex(e=>"-C"===e||"--cwd"===e);if(-1!==Po&&process.argv[Po+1]){const e=process.argv[Po+1];process.chdir(e),qr.debug("Changed working directory",{cwd:e}),process.argv.splice(Po,2)}var Uo=process.argv.findIndex(e=>"-v"===e||"--verbose"===e);-1!==Uo&&process.argv.splice(Uo,1);var Lo=process.argv.findIndex(e=>"--no-telemetry"===e);-1!==Lo&&process.argv.splice(Lo,1),qr.info("CLI starting",{version:tr,args:process.argv.slice(2),cwd:process.cwd()}),process.on("unhandledRejection",(e,t)=>{qr.error("Unhandled promise rejection",{reason:e instanceof Error?{message:e.message,stack:e.stack}:e,promise:String(t)}),qr.flush(),qr.printLogFileInfo()}),process.on("uncaughtException",(e,t)=>{"EPIPE"!==e.code&&(qr.error("Uncaught exception",{error:{message:e.message,stack:e.stack,name:e.name},origin:t}),qr.flush(),qr.printLogFileInfo())});var Oo=new e.Command;Oo.name("stably").description("AI-assisted Playwright testing CLI").version(tr),Oo.enablePositionalOptions(),Oo.showHelpAfterError(),Oo.exitOverride(),Oo.configureHelp({subcommandTerm:e=>{const t=e.registeredArguments.map(e=>e.required?`<${e.name()}>`:`[${e.name()}]`).join(" ");return t?`${e.name()} ${t}`:e.name()}});var Bo=[];Oo.configureOutput({writeOut:e=>process.stdout.write(e),writeErr:e=>{Bo.push(e)}});var Do=()=>{const e=Oo.helpInformation().trimEnd();return e?`${e}\n`:""},No=(e,t)=>{let r=e;for(const e of t){const t=r.commands.find(t=>t.name()===e||t.aliases().includes(e));if(!t)return;r=t}return r},jo=()=>{process.stdout.write(Do())};Oo.command("help [command...]").description("Show help for a command (e.g. stably help create)").action(e=>{if(!e||0===e.length)return void jo();const t=No(Oo,e);if(!t)return process.stderr.write(`Unknown command: ${e.join(" ")}\n`),jo(),void(process.exitCode=1);var r;r=t,process.stdout.write((e=>{const t=e.helpInformation().trimEnd();return t?`${t}\n`:""})(r))}),Oo.action(()=>to({mode:"chat",getHelpText:Do})),Oo.command("login").description("Authenticate with Stably in your browser").action(Ur),Oo.command("logout").description("Clear stored Stably credentials").action(async()=>{const e=Xr();e&&(m.log.warn(`Environment variables ${D.default.cyan("STABLY_API_KEY")} and ${D.default.cyan("STABLY_PROJECT_ID")} are set.`),m.log.warn("They will continue to be used for authentication even after logout."),m.log.warn("Unset them if you want to fully de-authenticate this shell/session."));const t=await br();if(!t)return void m.outro(e?D.default.yellow("No stored OAuth login found to clear."):D.default.yellow("You are not logged in."));const r=m.spinner();r.start("Logging out..."),await(async e=>{try{await fetch(`${nr}/api/backend/v1/logout`,{body:JSON.stringify({refresh_token:e}),headers:{"Content-Type":"application/json"},method:"POST"})}catch{}})(t.refreshToken),await Ir(),await Tr(),r.stop(D.default.green("✓ Logged out")),m.outro(D.default.green("You have been logged out successfully."))}),Oo.command("whoami").description("Show auth status and current project").action(async()=>{m.log.info(`${D.default.bold("CLI Version:")} ${D.default.cyan(tr)}`);const e=Xr();if(e){m.log.info(D.default.dim("Authentication: Environment variables")),m.log.info(` ${D.default.bold("API Key:")} ${D.default.cyan(e.apiKey.slice(0,8))}...`),m.log.info(` ${D.default.bold("Project ID:")} ${D.default.cyan(e.projectId)}`);const t=await br();if(t){let e;try{e=pr(t.accessToken).email}catch{e=void 0}m.log.warn("Stored OAuth login detected but will be ignored (env auth takes precedence)."),e&&m.log.info(` ${D.default.bold("OAuth Email:")} ${D.default.cyan(e)}`),m.log.info(` ${D.default.bold("Tip:")} Unset env vars to use OAuth`)}return void m.outro(D.default.green("Authenticated via environment variables"))}const t=await br();if(!t)return void m.outro(D.default.yellow("Not logged in. Run `stably login` to authenticate."));let r;try{r=pr(t.accessToken).email}catch{r=void 0}const n=await vr();if(!n)return m.log.info(D.default.dim("Authentication: OAuth (not linked to a project)")),r&&m.log.info(` ${D.default.bold("Email:")} ${D.default.cyan(r)}`),void m.outro(D.default.yellow("Logged in but this directory is not linked to a project. Run `stably login` to link."));const o=await(async()=>wr(process.cwd()))(),s=o?A.default.dirname(o):process.cwd(),i=A.default.relative(process.cwd(),s)||".";m.log.info(D.default.dim("Authentication: OAuth")),r&&m.log.info(` ${D.default.bold("Email:")} ${D.default.cyan(r)}`),m.log.info(` ${D.default.bold("Organization:")} ${D.default.cyan(n.orgName)}`),m.log.info(` ${D.default.bold("Project:")} ${D.default.cyan(n.projectName)}`),m.log.info(` ${D.default.bold("Linked at:")} ${D.default.dim(i)}`),m.outro(D.default.green("Authenticated"))}),Oo.command("build <input>").description("Compile a prompt file into a Playwright test").requiredOption("-o, --output <file>","Output file (required)").option("--force","Force regeneration even if prompt is unchanged").action(async(e,t)=>{try{await async function({force:e,input:t,output:r}){const n=process.cwd(),o=A.default.resolve(n,t),s=await async function({output:e}){const t=e.trim();if(!t)throw new Error("Output file is required. Example: -o tests/example.spec.ts");const r=A.default.resolve(process.cwd(),t);if([A.default.sep,"/"].some(e=>t.endsWith(e)))return{mode:"directory",dirPath:r};try{if((await j.default.stat(r)).isDirectory())return{mode:"directory",dirPath:r}}catch(e){if(!so(e)||"ENOENT"!==e.code)throw e}if(!ln.test(r))throw new Error(`Output file must be a valid Playwright test file (e.g., .spec.ts, .test.ts): ${e}`);return{mode:"file",filePath:r}}({output:r}),i=await io({filePath:o,errorMessage:`Prompt file not found: ${t}`});if(!i.trim())throw new Error(`Prompt file is empty: ${t}`);const a=function(e){const t=N.default.createHash(no).update(e,"utf8").digest("hex");return`${no}:${t}`}(i),c=ao(A.default.relative(n,o)),l="directory"===s.mode,d=l?s.dirPath:A.default.dirname(s.filePath),u=(p=o,A.default.basename(p).replace(/\.prompt\.md$/,"").replace(/\.md$/,"").replace(/\.txt$/,""));var p;let f=l?await async function(e,t){return(await co(e)).find(e=>{const r=A.default.basename(e);return r.startsWith(`${t}.spec`)||r.startsWith(`${t}.test`)})}(s.dirPath,u):s.filePath;if(!e&&f&&await async function({outputFilePath:e,promptHash:t}){try{const r=function(e){const t=e.match(/^\/\*\*[\s\S]*?@prompt-hash\s+(sha256:[a-f0-9]{64})[\s\S]*?\*\//);return t?.[1]}(await j.default.readFile(e,"utf8"));return r===t}catch(e){if(so(e)&&"ENOENT"===e.code)return!1;throw e}}({outputFilePath:f,promptHash:a}))return D.default.green("Skipped build: test code is up to date (hash unchanged)"),"skipped";const h=l?new Set(await co(s.dirPath)):void 0;await j.default.mkdir(d,{recursive:!0});const g=function({builtAt:e=new Date,promptFile:t,promptHash:r}){return["/**"," * @generated by stably build",` * @prompt-hash ${r}`,` * @prompt-file ${t}`,` * @built-at ${e.toISOString()}`," *",` * DO NOT EDIT MANUALLY - regenerate with: stably build ${t} --force`," */"].join("\n")}({promptFile:c,promptHash:a}),m=ao(l?A.default.relative(n,s.dirPath)||s.dirPath:A.default.relative(n,s.filePath)),y=function(e){const{promptContent:t}=e;return["Compile this test specification into a Playwright test file.",..."file"===e.mode?[`Primary output file: ${e.outputFile}`,"","File creation rules:","- Always create/update the primary output file specified above."]:[`Output directory: ${e.outputDir}`,"","Choose output filename:",`- Look at existing test files in ${e.outputDir} to determine the naming convention.`,"- Use the same extension pattern as existing tests (e.g., .test.ts or .spec.ts).","- If no existing tests, default to .spec.ts.","- Base the filename on the prompt content (e.g., login.spec.ts for login tests).","","File creation rules:","- Create your test file in the output directory with your chosen filename."],"- You MAY create shared helper files (e.g., lib/auth.ts) if the prompt explicitly requests reusable components.","- Prefer single-file output unless shared helpers would significantly improve maintainability.","- Never modify unrelated existing files.","","Sync workflow for existing files:",`1. Check whether ${"file"===e.mode?e.outputFile:`the test file in ${e.outputDir} (based on prompt filename or matching test file)`} already exists.`,"2. If it exists, read it first and compare it against the prompt specification.","3. Apply sync rules:"," - If file does not exist: CREATE from scratch."," - If file exists and already satisfies the prompt: KEEP behavior and make minimal edits only when needed."," - If file exists but only partially matches: UPDATE only changed scenarios so code aligns with prompt."," - If file structure conflicts heavily with prompt: REGENERATE the file content completely.","4. Prompt specification is the source of truth for final test behavior.","","Test verification:","After generating the test file, run the tests locally to verify they work correctly.","Use the appropriate Playwright test command (e.g., `pnpm playwright test` or the repository's test command).","If tests fail, analyze the errors and iterate on the test code until all tests pass.","","Prompt specification:",t].join("\n")}(l?{mode:"directory",outputDir:m,promptContent:i}:{mode:"file",outputFile:m,promptContent:i});await to({mode:"build",prompt:y,outputDir:d,customHeader:g});const _=process.exitCode;if("number"==typeof _&&0!==_)throw new Error(`Build generation failed for: ${m}`);if(l&&!f&&h&&(f=(await co(s.dirPath)).find(e=>!h.has(e)),!f))throw new Error(`Build finished but no new test file was created in: ${m}`);if(!f)throw new Error(`Build finished but output file was not created: ${m}`);const b=await io({filePath:f,errorMessage:`Build finished but output file was not created: ${m}`}),E=function(e){return e.replace(oo,"")}(b),I=b.startsWith(g)?b:`${g}\n\n${E}`;I!==b&&await j.default.writeFile(f,I,"utf8");const w=ao(A.default.relative(n,f));return D.default.green(`Built: ${w}`),"built"}({force:t.force??!1,input:e,output:t.output})}catch(e){const t=e instanceof Error?e.message:String(e);process.stderr.write(`${t}\n`),process.exitCode=1}}),Oo.command("tunnel",{hidden:!0}).description("Expose a local server with a secure tunnel URL").option("-p, --port <number>","Local port to expose","3000").action(async e=>{m.intro(`Starting development server for port ${e.port}...`);const t=await tn(),r="oauth"===t.type?`${t.auth.context.orgName}-${t.auth.context.projectName}`.toLowerCase().replace(/[^a-z0-9-]/g,""):`project-${t.auth.projectId}`.toLowerCase(),n=m.spinner();n.start("Starting development server...");const o=await R.startTunnel(`http://localhost:${e.port}`,{subdomain:r});n.stop(`Your local environment is available at: ${D.default.underline(D.default.cyan(o.url))}`)}),Oo.command("create [prompt...]").description("Generate a test from prompt (omit prompt to infer from branch diff)").option("-o, --output <dir>","Output directory for generated test files").action((e,t)=>{const r=e.length>0&&"test"===e[0]?e.slice(1):e;return to({mode:"single",prompt:r,outputDir:t.output})}).command("test",{hidden:!0}).description("Generate a Playwright test from a prompt (deprecated: use `stably create <prompt>` directly)").argument("<prompt...>","Prompt describing the test to generate").option("-o, --output <dir>","Output directory for generated test files").action((e,t)=>to({mode:"single",prompt:e,outputDir:t.output})),Oo.command("fix [runId]").description("Fix failing tests from a run (auto-detects from last test run or CI)").action(async e=>{const t=await(async e=>{const t=e=>e.replace(/\//g,"_");if(e)return qr.debug("Run ID provided explicitly",{runId:e}),t(e);const r=function(){if(process.env.CI_BUILD_ID)return process.env.CI_BUILD_ID;const e=(({env:e=process.env,cwd:t=process.cwd()}={})=>{for(const r of Object.keys(Ut))if(Ut[r].detect({env:e,cwd:t}))return{isCi:!0,...Ut[r].configuration({env:e,cwd:t})};return{isCi:Boolean(e.CI),...(r={env:e,cwd:t},{commit:tt(r),branch:rt(r)})};var r})();if(!e.isCi)return;const t=function(e){switch(e){case"github":return process.env.GITHUB_RUN_ATTEMPT;case"azure-devops":return process.env.SYSTEM_JOBATTEMPT;case"bitbucket":return process.env.BITBUCKET_STEP_RUN_NUMBER;default:return}}(e.service),r=[e.service,"slug"in e?e.slug?.replace(/\//g,"_"):void 0,"build"in e?String(e.build):void 0,"job"in e?String(e.job):void 0,t&&String(t)].filter(Boolean);return r.length>0?r.join("-"):void 0}();if(r)return qr.debug("Run ID detected from CI environment",{runId:r}),t(r);qr.debug("No explicit run ID or CI environment detected, checking last-run.json");const n=await(async()=>{try{const e=await(async()=>{let e=process.cwd();const{root:t}=A.default.parse(e);for(;e!==t;){const t=A.default.join(e,".stably/last-run.json");try{return await g.access(t),t}catch{e=A.default.dirname(e)}}})();if(!e)return;const t=await g.readFile(e,"utf-8");return{...ro.parse(JSON.parse(t)),filePath:e}}catch{return}})();if(n){const e=(Date.now()-n.timestamp)/36e5;return qr.debug("Run ID found in last-run.json",{runId:n.runId,timestamp:n.timestamp,filePath:n.filePath,ageHours:Math.round(e)}),e>24&&qr.warn(`Using run ID from ${Math.round(e)} hours ago (${n.filePath}). Provide an explicit run ID if this is not the run you want to fix.`),t(n.runId)}qr.debug("No run ID found in last-run.json")})(e);return t||(process.stderr.write('Run ID is required. Either:\n 1. Run "stably test" first (run ID will be auto-detected)\n 2. Provide a run ID: stably fix <runId>\n 3. Run in CI (auto-detected from environment)\n'),process.exit(1)),to({mode:"fix",runId:t})}),Oo.command("init").description("Initialize Playwright and Stably SDK in your project").action(()=>to({mode:"init"})),Oo.command("upgrade").description("Upgrade to latest version (use --check to only check)").option("-c, --check","Only check for updates without upgrading").action(e=>async function(e){const{check:t=!1}=e;let r;mo(D.default.cyan("Checking for updates...\n"));try{r=await async function(){const e=await async function(){const e=new AbortController,t=setTimeout(()=>e.abort(),1e4);t.unref();try{const t=await fetch(bo,{signal:e.signal});if(!t.ok)throw new Error(`Failed to fetch latest version: ${t.statusText}`);return Eo.parse(await t.json()).version}finally{clearTimeout(t)}}();return{current:tr,latest:e,isOutdated:wo(tr,e)}}()}catch(e){return yo(D.default.red("Failed to check for updates:"),e instanceof Error?e.message:e),void(process.exitCode=1)}if(mo(`Current version: ${D.default.yellow(r.current)}`),mo(`Latest version: ${D.default.green(r.latest)}`),mo(),!r.isOutdated)return void mo(D.default.green("✓ You are already on the latest version!"));if(mo(D.default.yellow(`⚠ A new version is available: ${r.current} → ${r.latest}`)),mo(),t)return mo(D.default.dim("Exiting with code 1 to indicate update available (useful for CI).")),void(process.exitCode=1);const o=function(){const e=process.argv[1]||"";if(e.includes("_npx")||e.includes(".npm/_cacache"))return"npx";try{const t=n.execSync("npm root -g",{encoding:"utf-8"}).trim();if(e.includes(t))return"global-npm"}catch{}if(e.includes("node_modules/stably"))return"global-npm";try{const t=n.execSync("pnpm root -g",{encoding:"utf-8"}).trim();if(e.includes(t))return"global-pnpm"}catch{}try{const t=n.execSync("yarn global dir",{encoding:"utf-8"}).trim();if(e.includes(t))return"global-yarn-classic"}catch{}try{const t=n.execSync("yarn config get globalFolder",{encoding:"utf-8"}).trim();if(e.includes(t))return"global-yarn-berry"}catch{}return"unknown"}(),s=function(e){switch(e){case"global-npm":case"global-yarn-berry":case"unknown":return{command:"npm",args:["install","-g",`${_o}@latest`],description:`npm install -g ${_o}@latest`};case"global-pnpm":return{command:"pnpm",args:["add","-g",`${_o}@latest`],description:`pnpm add -g ${_o}@latest`};case"global-yarn-classic":return{command:"yarn",args:["global","add",`${_o}@latest`],description:`yarn global add ${_o}@latest`};case"npx":return{command:"npx",args:[`${_o}@latest`],description:`npx ${_o}@latest (always uses latest)`}}}(o);if("npx"===o)return mo(D.default.dim("You are running via npx, which always fetches the latest version.")),void mo(D.default.dim(`Simply run: ${D.default.white("npx stably")} to use the latest version.`));"unknown"===o?(mo(D.default.yellow("Could not detect installation method. Falling back to npm.")),mo()):"global-yarn-berry"===o&&(mo(D.default.yellow("Yarn Berry does not support global packages. Falling back to npm.")),mo()),mo(`Upgrade command: ${D.default.cyan(s.description)}`),mo(),mo(D.default.cyan("Upgrading...")),mo();try{await(i=s.command,a=s.args,new Promise((e,t)=>{const r=n.spawn(i,a,{stdio:"inherit",shell:"win32"===process.platform});r.on("close",r=>{0===r?e():t(new Error(`Upgrade command exited with code ${r}`))}),r.on("error",e=>{t(e)})})),mo(),mo(D.default.green("✓ Upgrade complete!")),mo(D.default.dim(`Run ${D.default.white("stably --version")} to verify.`))}catch(e){yo(D.default.red("Upgrade failed:"),e instanceof Error?e.message:e),mo(),mo(D.default.dim("You can try manually running:")),mo(D.default.cyan(` ${s.description}`)),process.exitCode=1}var i,a}(e)),ho.forEach(({args:e,description:t,name:o})=>{Oo.command(o).description(t).helpOption(!1).helpCommand(!1).allowUnknownOption(!0).allowExcessArguments(!0).passThroughOptions().action(()=>async function({overrideArgs:e,subcommand:t}){const o=process.argv,i=o.findIndex((e,r)=>r>1&&e===t),a=-1===i?[]:o.slice(i+1),c="--"===a[0],l=c?a.slice(1):a;if(!c&&("--help"===l[0]||"-h"===l[0]))return async function({subcommand:e}){const t=ho.find(t=>t.name===e),r=e=>process.stdout.write(`${e}\n`);r(`stably ${e} - ${t?.description??""}`),r(""),"test"===e&&(r('IMPORTANT: Always use "stably" commands instead of "playwright" directly.'),r(""),r("Stably commands:"),r(" stably test [file] Run tests (auto-enables tracing and analytics)"),r(" stably fix [file] Auto-fix failing tests using AI"),r(" stably create <url> Generate new tests from a URL using AI"),r(""),r("Why use Stably?"),r(' - "stably fix" automatically repairs broken tests'),r(' - "stably test" enables --trace=on and test analytics'),r(' - "stably create" generates tests from prompt'),r(""));const o=lo();if(!o.installed||!o.inNodeModules)return void r('No Playwright project found in this directory or its parents.\nMake sure you\'re in a directory within your Playwright project, or run "stably init" to create a new playwright directory.');const{packageManager:s}=o;if(!s)return void r("Could not determine package manager.");r("Playwright options:"),r("");const[i,...a]=fo(s),c=go(s);return new Promise(t=>{const r=n.spawn(i,[...a,e,"--help"],{stdio:["inherit","pipe","pipe"],env:{...process.env,...process.env.CI?{}:{FORCE_COLOR:"1"}}});r.stdout?.on("data",e=>{c(e,process.stdout)}),r.stderr?.on("data",e=>{c(e,process.stderr)}),r.on("close",()=>{t()})})}({subcommand:t});const d=e??[],u=new Set(d.map(e=>{const[t]=e.split("=");return t})),p=[];for(let e=0;e<l.length;e++){const t=l[e],[r]=t.split("=");u.has(r)?!t.includes("=")&&e+1<l.length&&!l[e+1].startsWith("-")&&e++:p.push(t)}const f=[t,...d,...p],h="test"===t?await nn():void 0,g="test"===t?function({forwardedArgs:e,hasCredentials:t}){if(!t)return console.warn("⚠️ Stably credentials not found. Test results will not be reported to Stably."),console.warn(" To enable reporting, either:"),console.warn(" • Run `npx stably login` to authenticate"),void console.warn(" • Or set STABLY_API_KEY and STABLY_PROJECT_ID environment variables\n");const o=process.cwd(),i=e=>{const t=function(e){let t=r.resolve(e);for(;;){if([r.join(t,"node_modules","@stablyai","playwright-test"),r.join(t,"node_modules",".pnpm","@stablyai+playwright-test")].some(e=>s.existsSync(e)))return!0;const e=r.dirname(t);if(e===t)return!1;t=e}}(e);return t||(console.warn("⚠️ @stablyai/playwright-test is not installed. Stably reporter will not be injected."),console.warn(" Install it with: npm install @stablyai/playwright-test"),console.warn(" Reference: https://docs.stably.ai/getting-started/sdk-setup-guide\n")),t},a=(e,t)=>{try{return function({baseConfigPath:e,projectDir:t}){const o=function(e){try{const t=n.execSync("npm pkg get type",{cwd:e,encoding:"utf-8",stdio:["pipe","pipe","pipe"]});return"module"===JSON.parse(t.trim())}catch{return!1}}(t),i=o?"mts":"ts",a=r.dirname(r.resolve(e)),c=r.basename(e),l=r.join(a,`.stably-playwright-wrapper.config.${i}`),d=`\n// Auto-generated wrapper config by Stably CLI\n// This file injects the Stably reporter and ensures trace is enabled\nimport baseConfig from './${c}';\nimport { defineConfig, stablyReporter } from '@stablyai/playwright-test';\n\n// Inline type definitions to avoid import failures when @stablyai/playwright-test is not installed\ntype StablyNotificationConfig = {\n email?: { to: string[]; notifyOnStart?: boolean; notifyOnResult?: 'all' | 'failures-only' | null } | null;\n slack?: { channelName: string; notifyOnStart?: boolean; notifyOnResult?: 'all' | 'failures-only' } | null;\n};\n\ntype ProjectNotificationConfig = {\n projectName: string;\n notifications: StablyNotificationConfig;\n};\n\n// Extract notification configs from projects that have stably.notifications defined\n// This runs at config-load time before Playwright strips custom properties\nconst extractNotificationConfigs = (): ProjectNotificationConfig[] | undefined => {\n const projects = baseConfig.projects;\n if (!projects || !Array.isArray(projects)) return undefined;\n\n const configs = projects\n .map((p: { name?: string; stably?: { notifications?: StablyNotificationConfig } }) => {\n const notifications = p.stably?.notifications;\n return notifications ? { projectName: p.name ?? '', notifications } : undefined;\n })\n .filter((config): config is ProjectNotificationConfig => config != null);\n\n return configs.length > 0 ? configs : undefined;\n};\n\nconst isStablyReporter = (reporter: unknown): boolean => {\n // Only match @stablyai npm scope to avoid false positives on unrelated reporters\n // that might contain "stably" substring (e.g., "unstably-runner")\n if (typeof reporter === 'string') {\n return reporter.includes('@stablyai');\n }\n if (Array.isArray(reporter) && typeof reporter[0] === 'string') {\n return reporter[0].includes('@stablyai');\n }\n return false;\n};\n\nconst filterOutStablyReporter = (reporters: unknown[]): unknown[] => {\n return reporters.filter((reporter) => !isStablyReporter(reporter));\n};\n\nconst buildReporterList = () => {\n const existingReporters = baseConfig.reporter;\n\n // Create the stably reporter entry with notification configs\n // This replaces any existing stably reporter to ensure notificationConfigs are included\n const stablyReporterEntry = stablyReporter({\n apiKey: process.env.STABLY_API_KEY,\n projectId: process.env.STABLY_PROJECT_ID,\n notificationConfigs: extractNotificationConfigs(),\n });\n\n // No existing reporters - just return our reporter\n if (!existingReporters) {\n return [stablyReporterEntry];\n }\n\n // Array of reporters - filter out any existing stably reporter and add ours\n if (Array.isArray(existingReporters)) {\n const filtered = filterOutStablyReporter(existingReporters);\n return [...filtered, stablyReporterEntry];\n }\n\n // Single reporter as string - check if it's a stably reporter\n if (typeof existingReporters === 'string') {\n if (isStablyReporter(existingReporters)) {\n return [stablyReporterEntry];\n }\n return [[existingReporters, {}], stablyReporterEntry];\n }\n\n // For any other type (class, object, etc.), wrap it and add our reporter\n return [[existingReporters, {}], stablyReporterEntry];\n};\n\nexport default defineConfig({\n ...baseConfig,\n use: {\n ...baseConfig.use,\n trace: 'on',\n },\n reporter: buildReporterList(),\n});\n`.trim();return s.existsSync(a)||s.mkdirSync(a,{recursive:!0}),s.writeFileSync(l,d,"utf-8"),function(e){const t=r.join(e,".gitignore");try{if(s.existsSync(t)){const e=s.readFileSync(t,"utf-8");if(e.split("\n").map(e=>e.trim()).includes(Cn))return;const r=e.length>0&&!e.endsWith("\n");s.appendFileSync(t,`${r?"\n":""}${Cn}\n`)}else s.writeFileSync(t,`${Cn}\n`)}catch{}}(a),l}({baseConfigPath:e,projectDir:t})}catch{return void console.warn("⚠️ Could not create Stably wrapper config. Reporter injection skipped.")}};if(e.some(e=>"--config"===e||"-c"===e||e.startsWith("--config=")||e.startsWith("-c="))){const t=e.findIndex(e=>"--config"===e||"-c"===e);if(-1!==t&&e[t+1]){const n=r.resolve(o,e[t+1]),s=r.dirname(n);if(!i(s))return;const c=a(n,s);if(!c)return;return e[t+1]=c,c}const n=e.findIndex(e=>e.startsWith("--config=")||e.startsWith("-c="));if(-1!==n){const t=r.resolve(o,e[n].split("=")[1]),s=r.dirname(t);if(!i(s))return;const c=a(t,s);if(!c)return;const l=e[n].startsWith("--config=")?"--config=":"-c=";return e[n]=`${l}${c}`,c}}const c=Pn(o);if(!c)return;const l=r.dirname(c);if(!i(l))return;const d=a(c,l);return d?(e.push("--config",d),d):void 0}({forwardedArgs:f,hasCredentials:null!=h}):void 0;!function(e,t={}){const r=lo();r.installed||(console.error('Playwright is not installed. Please run "stably init" to install it.'),process.exit(1)),r.inNodeModules||(console.error("Playwright is present in your project, but not in node_modules. Please install your dependencies before proceeding."),process.exit(1));const{packageManager:o}=r;o||(console.error("Playwright installation not found. Could not determine your package manager (tried pnpm, yarn, and npm)."),process.exit(1));const[s,...i]=fo(o),a=rn(t.env),c=n.spawn(s,[...i,...e],{stdio:["inherit","pipe","pipe"],env:{...a,...process.env.CI?{}:{FORCE_COLOR:"1"}}}),l=go(o);c.stdout?.on("data",e=>{l(e,process.stdout)}),c.stderr?.on("data",e=>{l(e,process.stderr)});let d=!1;const u=()=>{d||(d=!0,t.onClose?.())},p=e=>{u(),c.kill(e);const t="SIGINT"===e?130:143;process.exit(t)};process.on("SIGINT",p),process.on("SIGTERM",p),c.on("close",e=>{u(),process.exitCode=e??0,process.removeListener("SIGINT",p),process.removeListener("SIGTERM",p)})}(f,{env:h,onClose:()=>{var e;(e=g)&&s.existsSync(e)&&s.rmSync(e)}})}({overrideArgs:e,subcommand:o}))});var ko=()=>{0!==Bo.length&&(process.stderr.write(Bo.join("")),Bo=[])};(async()=>{await(async()=>{if(!Co&&"1"!==process.env.STABLY_DISABLE_TELEMETRY&&"1"!==process.env.DO_NOT_TRACK&&!process.argv.includes("--no-telemetry"))try{const{init:e}=await import("@hyperdx/node-opentelemetry");e({apiKey:"61d10b50-9534-47be-a732-95bfe461adb7",service:"stably-cli",consoleCapture:!0,disableTracing:!0,disableMetrics:!0,disableStartupLogs:!0,additionalResourceAttributes:{"cli.version":tr,"node.version":process.version,"os.platform":process.platform}}),Co=!0}catch{}})();try{await Oo.parseAsync(process.argv),qr.info("CLI completed successfully")}catch(e){if(!(e=>!!e&&"object"==typeof e&&"code"in e)(e))throw qr.error("Unexpected CLI error",{error:e instanceof Error?e.message:String(e),stack:e instanceof Error?e.stack:void 0}),ko(),qr.flush(),qr.printLogFileInfo(),await Ao(),e;const t="number"==typeof e.exitCode?e.exitCode:1,r=process.argv.slice(2).find(e=>!e.startsWith("-")),n=!!r&&!!No(Oo,[r]);if(("commander.excessArguments"===e.code||"commander.unknownCommand"===e.code)&&r&&!n)return Bo=[],qr.warn("Unknown command",{command:r}),process.stderr.write(`command '${r}' not found\n`),jo(),void(process.exitCode=t);qr.debug("Commander error",{code:e.code,exitCode:t}),ko(),process.exitCode=t}finally{qr.flush(),await Ao()}})();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "stably",
3
- "version": "4.4.2",
3
+ "version": "4.4.3",
4
4
  "packageManager": "pnpm@10.24.0",
5
5
  "description": "AI-powered E2E Playwright testing CLI. Stably can understand your codebase, edit/run tests, and handle complex test scenarios for you.",
6
6
  "main": "dist/index.js",
@@ -58,6 +58,7 @@
58
58
  "@anthropic-ai/claude-agent-sdk": "0.2.34",
59
59
  "@clack/prompts": "^0.11.0",
60
60
  "@hyperdx/node-opentelemetry": "^0.10.2",
61
+ "@stablyai/agent-schemas": "workspace:*",
61
62
  "@stablyhq/runner-sdk": "^1.0.8",
62
63
  "commander": "^14.0.1",
63
64
  "dotenv": "^17.2.3",
@@ -68,12 +69,12 @@
68
69
  "react": "^19.2.1",
69
70
  "simple-git": "^3.30.0",
70
71
  "sonic-boom": "^4.2.0",
72
+ "yaml": "^2.7.0",
71
73
  "zod": "^4.1.12"
72
74
  },
73
75
  "devDependencies": {
74
76
  "@stablyai-internal/api-client": "workspace:*",
75
77
  "@stablyai/agent-hooks": "workspace:*",
76
- "@stablyai/agent-schemas": "workspace:*",
77
78
  "@stablyai/agent-security-hooks": "workspace:*",
78
79
  "@stablyai/agent-tool-display": "workspace:*",
79
80
  "@stablyai/agent-workspace-info": "workspace:*",