stably 4.7.0 → 4.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.mjs +1 -1
- package/package.json +3 -1
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{config as e,parse as t}from"dotenv";import r,{resolve as n,dirname as o,join as s,basename as i}from"path";import{Command as a}from"commander";import{Buffer as c}from"buffer";import l,{exec as u,execSync as d,spawn as p}from"child_process";import f from"process";import h,{existsSync as g,statSync as m,createReadStream as y,readFileSync as b,mkdirSync as v,writeFileSync as w,appendFileSync as _,openSync as E,readSync as I,closeSync as T,rmSync as x}from"fs";import{fileURLToPath as S,URL as A}from"url";import C,{tmpdir as R,constants as P}from"os";import"timers/promises";import U from"stream";import{debuglog as k,promisify as L,TextDecoder as D,TextEncoder as O}from"util";import{createSdkMcpServer as B,tool as N,query as $}from"@anthropic-ai/claude-agent-sdk";import{match as j}from"ts-pattern";import M,{randomUUID as H}from"crypto";import G from"picocolors";import{simpleGit as F}from"simple-git";import{readFile as Y,mkdir as V,writeFile as z,unlink as W,access as K,readdir as q,stat as J,rm as X,appendFile as Q}from"fs/promises";import{log as Z,outro as ee,spinner as te,intro as re,select as ne,isCancel as oe}from"@clack/prompts";import{createInterface as se}from"readline/promises";import ie,{z as ae}from"zod";import ce from"open";import le from"http";import ue from"pino";import de from"sonic-boom";import{z as pe}from"zod/v3";import fe from"ws";import{useState as he,useRef as ge,useEffect as me,useCallback as ye,useMemo as be}from"react";import{jsx as ve,jsxs as we}from"react/jsx-runtime";import{createRequire as _e}from"module";import{parseDocument as Ee}from"yaml";import{startTunnel as Ie}from"@stablyhq/runner-sdk";var Te={cwdChanged:!1,newCwd:void 0,envFilesLoaded:[],envFileErrors:[]},xe=process.argv.findIndex(e=>"-C"===e||"--cwd"===e);if(-1!==xe&&process.argv[xe+1]){const e=process.argv[xe+1];process.chdir(e),Te.cwdChanged=!0,Te.newCwd=e,process.argv.splice(xe,2)}for(var Se=[],Ae=0;Ae<process.argv.length;)if("--env-file"===process.argv[Ae]){const e=process.argv[Ae+1];e&&!e.startsWith("-")?(Se.push(e),process.argv.splice(Ae,2)):Ae++}else Ae++;for(const t of Se){const n=r.resolve(process.cwd(),t),o=e({path:n,override:!0,quiet:!0});if(o.error){const e=`warning: could not load env file: ${n} (${o.error.message})`;Te.envFileErrors.push(e),process.stderr.write(`${e}\n`)}else Te.envFilesLoaded.push(n)}var Ce={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 Re(e){return(/\d+(?!.*\d+)/.exec(e)||[])[0]}function Pe(e){return e?/^(?:refs\/heads\/)?(?<branch>.+)$/i.exec(e)[1]:void 0}var Ue={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:Pe(r?e.SYSTEM_PULLREQUEST_TARGETBRANCH:e.BUILD_SOURCEBRANCH),pr:t,isPr:r,prBranch:Pe(r?e.SYSTEM_PULLREQUEST_SOURCEBRANCH:void 0),root:e.BUILD_REPOSITORY_LOCALPATH}}},ke={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})},Le={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})},De={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}}},Oe={detect:({env:e})=>Boolean(e.BUDDY_WORKSPACE_ID),configuration({env:e}){const t=Re(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}}},Be="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function Ne(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var $e,je,Me,He,Ge,Fe,Ye,Ve,ze={exports:{}};var We,Ke,qe,Je,Xe,Qe,Ze,et,tt,rt,nt,ot,st,it,at,ct={exports:{}},lt={};function ut(){if(ot)return nt;ot=1;const e=r,t=function(){if(qe)return Ke;qe=1;const e=r,t=function(){if(Ve)return Ye;Ve=1;const e="win32"===process.platform||"cygwin"===process.env.OSTYPE||"msys"===process.env.OSTYPE,t=r,n=e?";":":",o=function(){if(Fe)return Ge;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 Fe=1,e="win32"===process.platform||Be.TESTING_WINDOWS?function(){if(je)return $e;je=1,$e=r,r.sync=function(r,n){return t(e.statSync(r),r,n)};var e=h;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 $e}():function(){if(He)return Me;He=1,Me=t,t.sync=function(t,n){return r(e.statSync(t),n)};var e=h;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 Me}(),Ge=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}},Ge}(),s=e=>Object.assign(new Error(`not found: ${e}`),{code:"ENOENT"}),i=(t,r)=>{const o=r.colon||n,s=t.match(/\//)||e&&t.match(/\\/)?[""]:[...e?[process.cwd()]:[],...(r.path||process.env.PATH||"").split(o)],i=e?r.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}},a=(e,r,n)=>{"function"==typeof r&&(n=r,r={}),r||(r={});const{pathEnv:a,pathExt:c,pathExtExe:l}=i(e,r),u=[],d=n=>new Promise((o,i)=>{if(n===a.length)return r.all&&u.length?o(u):i(s(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;o(p(f,n,0))}),p=(e,t,n)=>new Promise((s,i)=>{if(n===c.length)return s(d(t+1));const a=c[n];o(e+a,{pathExt:l},(o,i)=>{if(!o&&i){if(!r.all)return s(e+a);u.push(e+a)}return s(p(e,t,n+1))})});return n?d(0).then(e=>n(null,e),n):d(0)};return Ye=a,a.sync=(e,r)=>{r=r||{};const{pathEnv:n,pathExt:a,pathExtExe:c}=i(e,r),l=[];for(let s=0;s<n.length;s++){const i=n[s],u=/^".*"$/.test(i)?i.slice(1,-1):i,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(o.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 s(e)},Ye}(),n=function(){if(We)return ct.exports;We=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 ct.exports=e,ct.exports.default=e,ct.exports}();function o(r,o){const s=r.options.env||process.env,i=process.cwd(),a=null!=r.options.cwd,c=a&&void 0!==process.chdir&&!process.chdir.disabled;if(c)try{process.chdir(r.options.cwd)}catch(e){}let l;try{l=t.sync(r.command,{path:s[n({env:s})],pathExt:o?e.delimiter:void 0})}catch(e){}finally{c&&process.chdir(i)}return l&&(l=e.resolve(a?r.options.cwd:"",l)),l}return Ke=function(e){return o(e)||o(e,!0)}}(),n=function(){if(Je)return lt;Je=1;const e=/([()\][%!^"`<>&|;, *?])/g;return lt.command=function(t){return t.replace(e,"^$1")},lt.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},lt}(),o=function(){if(rt)return tt;rt=1;const e=h,t=function(){if(et)return Ze;et=1;const e=Qe?Xe:(Qe=1,Xe=/^#!(.*)/);return Ze=(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 tt=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())}}(),s="win32"===process.platform,i=/\.(?:com|exe)$/i,a=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;return nt=function(r,c,l){c&&!Array.isArray(c)&&(l=c,c=null);const u={command:r,args:c=c?c.slice(0):[],options:l=Object.assign({},l),file:void 0,original:{command:r,args:c}};return l.shell?u:function(r){if(!s)return r;const c=function(e){e.file=t(e);const r=e.file&&o(e.file);return r?(e.args.unshift(e.file),e.command=r,t(e)):e.file}(r),l=!i.test(c);if(r.options.forceShell||l){const t=a.test(c);r.command=e.normalize(r.command),r.command=n.command(r.command),r.args=r.args.map(e=>n.argument(e,t));const o=[r.command].concat(r.args).join(" ");r.args=["/d","/s","/c",`"${o}"`],r.command=process.env.comspec||"cmd.exe",r.options.windowsVerbatimArguments=!0}return r}(u)}}var dt=Ne(function(){if(at)return ze.exports;at=1;const e=l,t=ut(),r=function(){if(it)return st;it=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 st={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},st}();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 ze.exports=n,ze.exports.spawn=n,ze.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},ze.exports._parse=t,ze.exports._enoent=r,ze.exports}());function pt(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 ft=(e,t)=>({name:`SIGRT${t+1}`,number:ht+t,action:"terminate",description:"Application-specific signal (realtime)",standard:"posix"}),ht=34,gt=[{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"}],mt=()=>{const e=(()=>{const e=64-ht+1;return Array.from({length:e},ft)})();return[...gt,...e].map(yt)},yt=({name:e,number:t,description:r,action:n,forced:o=!1,standard:s})=>{const{signals:{[e]:i}}=P,a=void 0!==i;return{name:e,number:a?i:t,description:r,supported:a,action:n,forced:o,standard:s}},bt=({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}],vt=(()=>{const e=mt();return Object.fromEntries(e.map(bt))})();(()=>{const e=mt(),t=Array.from({length:65},(t,r)=>((e,t)=>{const r=((e,t)=>{const r=t.find(({name:t})=>P.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:a,standard:c}=r;return{[e]:{name:n,number:e,description:o,supported:s,action:i,forced:a,standard:c}}})(r,e));Object.assign({},...t)})();var wt=({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=f.cwd()}}})=>{s=null===s?void 0:s;const h=void 0===(o=null===o?void 0:o)?void 0:vt[o].description,g=(({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:h,exitCode:s,isCanceled:l}),m=`Command ${g}: ${i}`,y="[object Error]"===Object.prototype.toString.call(n),b=y?`${m}\n${n.message}`:m,v=[b,t,e].filter(Boolean).join("\n");return y?(n.originalMessage=n.message,n.message=v):n=new Error(v),n.shortMessage=b,n.command=i,n.escapedCommand=a,n.exitCode=s,n.signal=o,n.signalDescription=h,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},_t=["stdin","stdout","stderr"],Et=[];Et.push("SIGHUP","SIGINT","SIGTERM"),"win32"!==process.platform&&Et.push("SIGALRM","SIGABRT","SIGVTALRM","SIGXCPU","SIGXFSZ","SIGUSR2","SIGTRAP","SIGSYS","SIGQUIT","SIGIOT"),"linux"===process.platform&&Et.push("SIGIO","SIGPOLL","SIGPWR","SIGSTKFLT");var It,Tt,xt=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,St=Symbol.for("signal-exit emitter"),At=globalThis,Ct=Object.defineProperty.bind(Object),Rt=class{emitted={afterExit:!1,exit:!1};listeners={afterExit:[],exit:[]};count=0;id=Math.random();constructor(){if(At[St])return At[St];Ct(At,St,{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}},Pt=class{},Ut=globalThis.process;xt(Ut)?new class extends Pt{#e="win32"===Ut.platform?"SIGINT":"SIGHUP";#t=new Rt;#r;#n;#o;#s={};#i=!1;constructor(e){super(),this.#r=e,this.#s={};for(const t of Et)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(!xt(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 Et)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,Et.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 xt(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&&xt(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)}}(Ut):new class extends Pt{onExit(){return()=>{}}load(){}unload(){}},new TextEncoder,function(){if(Tt)return It;Tt=1;const{PassThrough:e}=U;It=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 kt=(async()=>{})().constructor.prototype;["then","catch","finally"].map(e=>[e,Reflect.getOwnPropertyDescriptor(kt,e)]);var Lt=(e,t=[])=>Array.isArray(t)?[e,...t]:[e],Dt=/^[\w.-]+$/,Ot=k("execa").enabled,Bt=(e,t)=>String(e).padStart(t,"0"),Nt=(e,t,n={})=>{const o=dt._parse(e,t,n);return e=o.command,t=o.args,(n={maxBuffer:1e8,buffer:!0,stripFinalNewline:!0,extendEnv:!0,preferLocal:!1,localDir:(n=o.options).cwd||f.cwd(),execPath:f.execPath,encoding:"utf8",reject:!0,cleanup:!0,all:!1,windowsHide:!0,verbose:Ot,...n}).env=(({env:e,extendEnv:t,preferLocal:n,localDir:o,execPath:s})=>{const i=t?{...f.env,...e}:e;return n?(({env:e=f.env,...t}={})=>{const n=pt({env:e={...e}});return t.path=e[n],e[n]=(({cwd:e=f.cwd(),path:t=f.env[pt()],preferLocal:n=!0,execPath:o=f.execPath,addExecPath:s=!0}={})=>{const i=e instanceof URL?S(e):e,a=r.resolve(i),c=[];return n&&((e,t)=>{let n;for(;n!==t;)e.push(r.join(t,"node_modules/.bin")),n=t,t=r.resolve(t,"..")})(c,a),s&&((e,t,n)=>{const o=t instanceof URL?S(t):t;e.push(r.resolve(n,o,".."))})(c,o,a),[...c,t].join(r.delimiter)})(t),e})({env:i,cwd:o,execPath:s}):i})(n),n.stdio=(e=>{if(!e)return;const{stdio:t}=e;if(void 0===t)return _t.map(t=>e[t]);if((e=>_t.some(t=>void 0!==e[t]))(e))throw new Error(`It's not possible to provide \`stdio\` in combination with one of ${_t.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,_t.length);return Array.from({length:r},(e,r)=>t[r])})(n),"win32"===f.platform&&"cmd"===r.basename(e,".exe")&&t.unshift("/q"),{file:e,args:t,options:n,parsed:o}},$t=(e,t,r)=>"string"==typeof t||c.isBuffer(t)?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}(t):t:void 0===r?void 0:"";function jt(e,t,r){const n=Nt(e,t,r),o=((e,t)=>Lt(e,t).join(" "))(e,t),s=((e,t)=>Lt(e,t).map(e=>(e=>"string"!=typeof e||Dt.test(e)?e:`"${e.replaceAll('"','\\"')}"`)(e)).join(" "))(e,t);((e,{verbose:t})=>{t&&f.stderr.write(`[${(()=>{const e=new Date;return`${Bt(e.getHours(),2)}:${Bt(e.getMinutes(),2)}:${Bt(e.getSeconds(),2)}.${Bt(e.getMilliseconds(),3)}`})()}] ${e}\n`)})(s,n.options);const i=(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),b(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 a;try{a=l.spawnSync(n.file,n.args,{...n.options,input:i})}catch(e){throw wt({error:e,stdout:"",stderr:"",all:"",command:o,escapedCommand:s,parsed:n,timedOut:!1,isCanceled:!1,killed:!1})}const c=$t(n.options,a.stdout,a.error),u=$t(n.options,a.stderr,a.error);if(a.error||0!==a.status||null!==a.signal){const e=wt({stdout:c,stderr:u,error:a.error,signal:a.signal,exitCode:a.status,command:o,escapedCommand:s,parsed:n,timedOut:a.error&&"ETIMEDOUT"===a.error.code,isCanceled:!1,killed:null!==a.signal});if(!n.options.reject)return e;throw e}return{command:o,escapedCommand:s,exitCode:0,stdout:c,stderr:u,failed:!1,timedOut:!1,isCanceled:!1,killed:!1}}function Mt(e){try{return jt("git",["rev-parse","HEAD"],e).stdout}catch{return}}function Ht(e){try{const t=jt("git",["rev-parse","--abbrev-ref","HEAD"],e).stdout;if("HEAD"===t){const t=jt("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 Gt=/^(?:.*)@(?:.*):(?:\d+\/)?(.*)\.git$/,Ft=/^\/(.*)\.git$/;function Yt(e){if(e){if(e.match(Gt))return e.replace(Gt,"$1");try{return new URL(e).pathname.replace(Ft,"$1")}catch{return}}}var Vt,zt={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:Yt(e.BUILDKITE_REPO),pr:t,isPr:r,prBranch:r?e.BUILDKITE_BRANCH:void 0,root:e.BUILDKITE_BUILD_CHECKOUT_PATH}}},Wt={detect:({env:e})=>Boolean(e.CIRCLECI),configuration({env:e}){const t=e.CIRCLE_PR_NUMBER||Re(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}`}}},Kt="https://cirrus-ci.com",qt={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:`${Kt}/build/${e.CIRRUS_BUILD_ID}`,job:e.CIRRUS_TASK_ID,jobUrl:`${Kt}/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}}},Jt={detect:({env:e})=>Boolean(e.CODEBUILD_BUILD_ID),configuration:({env:e,cwd:t})=>({name:"AWS CodeBuild",service:"codebuild",commit:Mt({env:e,cwd:t}),build:e.CODEBUILD_BUILD_ID,branch:Ht({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})},Xt={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}}},Qt={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}}},Zt=({env:e})=>{try{const t=e.GITHUB_EVENT_PATH?JSON.parse(b(e.GITHUB_EVENT_PATH,"utf-8")):void 0;if(t&&t.pull_request)return{branch:t.pull_request.base?Pe(t.pull_request.base.ref):void 0,pr:t.pull_request.number}}catch{}return{pr:void 0,branch:void 0}},er={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=Pe("pull_request_target"===e.GITHUB_EVENT_NAME?`refs/pull/${(e=>{const t=e.GITHUB_EVENT_PATH?JSON.parse(b(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?Zt({env:e}):void 0}}},tr={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}}},rr={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||Mt({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}}},nr={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}}},or={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})},sr={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}}},ir={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}}},ar={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}}},cr={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||Mt({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}}},lr={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}}},ur={};function dr(){if(Vt)return ur;Vt=1,Object.defineProperty(ur,"__esModule",{value:!0}),ur.of=ur.PropertiesFile=void 0;var e,t=(e=h)&&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 ur.PropertiesFile=r,ur.of=function(...e){let t=new r;return t.of.apply(t,e),t},ur}var pr=Ne(dr()),fr={root:"teamcity.build.workingDir",branch:"teamcity.build.branch"},hr=e=>{try{return pr.of(e)}catch{return}},gr=({env:e,cwd:t})=>{const r=e.TEAMCITY_BUILD_PROPERTIES_FILE?hr(e.TEAMCITY_BUILD_PROPERTIES_FILE):void 0,n=r?r.get("teamcity.configuration.properties.file"):void 0,o=n?hr(n):n;return Object.fromEntries(Object.keys(fr).map(n=>[n,(r?r.get(fr[n]):void 0)||(o?o.get(fr[n]):void 0)||("branch"===n?Ht({env:e,cwd:t}):void 0)]))},mr={appveyor:Ce,azurePipelines:Ue,bamboo:ke,bitbucket:Le,bitrise:De,buddy:Oe,buildkite:zt,circleci:Wt,cirrus:qt,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:Jt,codefresh:Xt,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:Qt,github:er,gitlab:tr,jenkins:rr,netlify:nr,puppet:or,sail:sr,screwdriver:ir,scrutinizer:ar,semaphore:cr,shippable:lr,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,...gr({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:Pe(e.JB_SPACE_GIT_BRANCH),slug:t&&r?`${t.toLowerCase()}/${r}`:void 0}}}},yr=class e{git;config;snapshotTreeHash;snapshotIndexPath;constructor(e){this.config=e,this.git=F({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=s(R(),`git-diff-tracker-${H()}.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=s(R(),`git-diff-tracker-${H()}.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 br(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 br(this.snapshotIndexPath),this.snapshotIndexPath=void 0),this.snapshotTreeHash=void 0}};async function br(e){try{await W(e)}catch{}}var vr="x-stably-org-id",wr={bodySerializer:e=>JSON.stringify(e,(e,t)=>"bigint"==typeof t?t.toString():t)},_r=({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):Er({allowReserved:e,name:r,value:t})).join(s);return"label"===n||"matrix"===n?s+i:i},Er=({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)}`},Ir=({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])=>Er({allowReserved:e,name:"deepObject"===n?`${r}[${t}]`:t,value:o})).join(i);return"label"===n||"matrix"===n?i+a:a},Tr=/\{[^{}]+\}/g;function xr(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 Sr,Ar=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},Cr=({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=_r({allowReserved:i.allowReserved,explode:!0,name:o,style:"form",value:s,...i.array});e&&n.push(e)}else if("object"==typeof s){const e=Ir({allowReserved:i.allowReserved,explode:!0,name:o,style:"deepObject",value:s,...i.object});e&&n.push(e)}else{const e=Er({allowReserved:i.allowReserved,name:o,value:s});e&&n.push(e)}}return n.join("&")},Rr=(e,t)=>!!t&&!!(e.headers.has(t)||e.query?.[t]||e.headers.get("Cookie")?.includes(`${t}=`)),Pr=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(Tr);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,_r({explode:n,name:o,style:s,value:i}));continue}if("object"==typeof i){r=r.replace(t,Ir({explode:n,name:o,style:s,value:i,valueOnly:!0}));continue}if("matrix"===s){r=r.replace(t,`;${Er({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:Cr(e.querySerializer),url:e.url}),Ur=(e,t)=>{const r={...e,...t};return r.baseUrl?.endsWith("/")&&(r.baseUrl=r.baseUrl.substring(0,r.baseUrl.length-1)),r.headers=Lr(e.headers,t.headers),r},kr=e=>{const t=[];return e.forEach((e,r)=>{t.push([r,e])}),t},Lr=(...e)=>{const t=new Headers;for(const r of e){if(!r)continue;const e=r instanceof Headers?kr(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},Dr=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}},Or=Cr({allowReserved:!1,array:{explode:!0,style:"form"},object:{explode:!0,style:"deepObject"}}),Br={"Content-Type":"application/json"},Nr=(e={})=>({...wr,headers:Br,parseAs:"auto",querySerializer:Or,...e}),$r=(e={})=>{let t=Ur(Nr(),e);const r=()=>({...t}),n={error:new Dr,request:new Dr,response:new Dr},o=async e=>{const r={...t,...e,fetch:e.fetch??t.fetch??globalThis.fetch,headers:Lr(t.headers,e.headers),serializedBody:void 0};return r.security&&await(async({security:e,...t})=>{for(const r of e){if(Rr(t,r.name))continue;const e=await Ar(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:Pr(r)}},s=async e=>{const{opts:t,url:r}=await o(e),s={redirect:"follow",...t,body:xr(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)));return{stream: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 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:"))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",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)}}}()}})({...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:Pr,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=Ur(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")}},jr=$r(Nr({baseUrl:"https://api.stably.ai"})),Mr="4.7.0",Hr=process.env.STABLY_API_URL||"https://api.stably.ai",Gr=e=>{const t=new URL(e);return t.protocol="http:"===t.protocol?"ws:":"wss:",t},Fr=process.env.AUTH_URL||"https://auth.stably.ai",Yr=process.env.AUTH_CLIENT_ID||"288007877071cce81f269428ea78653a",Vr=process.env.AI_PROXY_URL||"https://ai-proxy.stably.ai",zr=process.env.STABLY_AUTOHEAL_WS_URL||new URL("/autoheal",Gr(Hr)).toString(),Wr=process.env.STABLY_CREATE_PROGRESS_WS_URL||new URL("/create-progress",Gr(Hr)).toString(),Kr="http://localhost:9876/auth/callback",qr=()=>Sr||(Sr=$r(Nr({baseUrl:Hr,headers:{"X-STABLY-CLI-VERSION":Mr,"X-STABLY-SOURCE":"cli"}}))),Jr=async(e,t)=>{const r=await(n={body:{accessToken:e,orgId:t},client:qr()},(n.client??jr).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},Xr=ae.object({org_id:ae.string(),org_name:ae.string()}),Qr=ae.object({email:ae.string(),org_id_to_org_member_info:ae.record(ae.string(),Xr).optional(),org_member_info:Xr.optional(),user_id:ae.string()});ae.object({email:ae.string(),firstName:ae.string().optional(),lastName:ae.string().optional(),organizations:ae.array(ae.object({id:ae.string(),name:ae.string()})),userId:ae.string()});var Zr=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)},en=e=>{try{const t=Qr.parse(Zr(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"}`)}},tn=async(e,t)=>{let n=e;const{root:o}=r.parse(n);for(;n!==o;){const e=r.join(n,t);try{return await K(e),e}catch{n=r.dirname(n)}}},rn=r.join(C.homedir(),".stably"),nn=r.join(rn,"auth.json"),on=".stably",sn="project.json",an=ie.object({accessToken:ie.string(),expiresAt:ie.number(),idToken:ie.string().optional(),refreshToken:ie.string()}),cn=ie.object({orgId:ie.string(),orgName:ie.string(),projectId:ie.string(),projectName:ie.string()}),ln=async()=>{try{const e=await Y(nn,"utf-8");return an.parse(JSON.parse(e))}catch{return}},un=async e=>{await V(rn,{recursive:!0}),await z(nn,JSON.stringify(e,null,2),{mode:384})},dn=async()=>{try{await W(nn)}catch{}},pn=async()=>{try{const e=await tn(process.cwd(),on);if(!e)return;const t=r.join(e,sn),n=await Y(t,"utf-8");return cn.parse(JSON.parse(n))}catch{return}},fn=async()=>{try{const e=await tn(process.cwd(),on);e&&await W(r.join(e,sn))}catch{}},hn=e=>Date.now()>=e.expiresAt-3e5,gn=async e=>{const t=new URLSearchParams({client_id:Yr,grant_type:"refresh_token",refresh_token:e}),r=await fetch(`${Fr}/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}},mn=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`,yn=(e,t,r)=>{e.writeHead(t,{"Content-Type":"text/html"}),e.end(r)},bn=(e,t)=>{const r=new URLSearchParams({client_id:Yr,code_challenge:e,code_challenge_method:"S256",redirect_uri:Kr,response_type:"code",state:t});return`${Fr}/propelauth/oauth/authorize?${r.toString()}`},vn=async e=>{const t=te();let n;t.start("Loading user info...");try{n=en(e.accessToken),t.stop(G.green(`✓ Logged in as ${G.cyan(n.email)}`))}catch(e){t.stop(G.red("✗ Failed to load user info"));const r=e instanceof Error?e.message:"Unknown error";return Z.error(r),{success:!1}}const o=await(async e=>{if(0===e.length)return void Z.error("You don't belong to any organizations.");if(1===e.length)return Z.info(`Using organization: ${G.cyan(e[0].name)}`),e[0];if(!process.stdin.isTTY)return Z.info(`Auto-selecting organization: ${G.cyan(e[0].name)}`),e[0];const t=await ne({message:"Select an organization",options:[...e].sort((e,t)=>e.name.localeCompare(t.name)).map(e=>({label:e.name,value:e.id}))});return oe(t)?void 0:e.find(e=>e.id===t)})(n.organizations);if(!o)return Z.warn("Organization selection cancelled."),{success:!1};let s;t.start("Getting org credentials...");try{const r=await Jr(e.accessToken,o.id);s={accessToken:r.accessToken,expiresAt:Date.now()+1e3*r.expiresInSeconds,idToken:e.idToken,refreshToken:e.refreshToken},t.stop(G.green("✓ Credentials obtained"))}catch(e){t.stop(G.red("✗ Failed to get org credentials"));const r=e instanceof Error?e.message:"Unknown error";return Z.error(r),{success:!1}}const i=await(async(e,t)=>{const r=te();let n;r.start("Loading projects...");try{n=await(async({accessToken:e,orgId:t})=>{const r=await(n={auth:e,client:qr(),path:{orgId:t}},(n.client??jr).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(G.green("✓ Projects loaded"))}catch(e){r.stop(G.red("✗ Failed to load projects"));const t=e instanceof Error?e.message:"Unknown error";return void Z.error(t)}if(0===n.length)return Z.error("No projects found in this organization."),void Z.info(`Create a project at ${G.underline(G.cyan("https://app.stably.ai"))}`);if(1===n.length)return Z.info(`Using project: ${G.cyan(n[0].name)}`),n[0];if(!process.stdin.isTTY)return Z.info(`Auto-selecting project: ${G.cyan(n[0].name)}`),n[0];const o=await ne({message:"Select a project",options:n.map(e=>({label:e.name,value:e.id}))});return oe(o)?void 0:n.find(e=>e.id===o)})(s.accessToken,o.id);return i?(await(async e=>{const t=r.join(process.cwd(),on),n=r.join(t,sn);await V(t,{recursive:!0}),await z(n,JSON.stringify(e,null,2)),await(async e=>{const t=r.join(e,".gitignore"),n="# Stably CLI (only docs/ are tracked)\n.stably/*\n!.stably/docs/";try{const e=await Y(t,"utf-8"),r=e.split("\n").map(e=>e.trim());if(r.includes(".stably/*")&&r.includes("!.stably/docs/"))return;const o=/^# Stably CLI\n\.stably\/?$/m,s=/^\.stably\/?$/m;if(o.test(e)){const r=e.replace(o,`\n${n}\n`);await z(t,r)}else if(s.test(e)){const r=e.replace(s,`\n${n}\n`);await z(t,r)}else await Q(t,`\n${n}\n`)}catch{await z(t,`${n}\n`)}})(process.cwd())})({orgId:o.id,orgName:o.name,projectId:i.id,projectName:i.name}),Z.info(G.dim("Linked this directory to your Stably project.")),{scopedTokens:s,success:!0}):(Z.warn("Project selection cancelled."),{success:!1})},wn=async()=>{if(Mn())return Z.warn(`Environment variables ${G.cyan("STABLY_API_KEY")} and ${G.cyan("STABLY_PROJECT_ID")} are set.`),Z.warn("These will be used for authentication instead of OAuth login."),Z.warn("To use OAuth login, unset these environment variables first."),void ee(G.yellow("Login skipped - using environment variable authentication."));const e=await ln();if(e){if(!hn(e)){if(await pn())return void ee(G.yellow("You are already logged in. Run `stably logout` first to log out."));Z.info("You are logged in but haven't selected a project yet.");const t=await vn(e);return void(t.success?(await un(t.scopedTokens),ee(G.green("Setup complete! You can now use Stably CLI."))):ee(G.yellow("Setup incomplete. Run `stably login` to try again.")))}const t=te();t.start("Refreshing session...");try{const r=await gn(e.refreshToken);t.stop(G.green("✓ Session refreshed"));const n=await pn();if(n){t.start("Getting org credentials...");try{const e=await Jr(r.accessToken,n.orgId),o={accessToken:e.accessToken,expiresAt:Date.now()+1e3*e.expiresInSeconds,idToken:r.idToken,refreshToken:r.refreshToken};await un(o),t.stop(G.green("✓ Credentials obtained")),ee(G.green("Login successful"))}catch{await un(r),t.stop(G.yellow("Using full credentials")),ee(G.green("Login successful"))}}else{const e=await vn(r);e.success?(await un(e.scopedTokens),ee(G.green("Setup complete! You can now use Stably CLI."))):ee(G.yellow("Setup incomplete. Run `stably login` to try again."))}return}catch{t.stop(G.yellow("Session expired, proceeding with fresh login...")),await dn(),await fn()}}const{authorizeUrl:t,serverReady:r,waitForCallback:n}=(()=>{const{authorizeUrl:e,codeVerifier:t,state:r}=(()=>{const e=M.randomBytes(32).toString("base64url"),t=(r=e,M.createHash("sha256").update(r).digest("base64url"));var r;const n=M.randomBytes(16).toString("base64url");return{authorizeUrl:bn(t,n),codeVerifier:e,state:n}})(),{ready:n,result:o}=(e=>{let t,r;return{ready:new Promise((e,n)=>{t=e,r=n}),result:new Promise((n,o)=>{const s=setTimeout(()=>{a.close(),n({error:"Login timed out",success:!1})},3e5),i=()=>{clearTimeout(s)},a=le.createServer((t,r)=>{const o=new A(t.url||"","http://localhost:9876");if("/auth/callback"!==o.pathname)return r.writeHead(404),void r.end("Not found");const s=o.searchParams.get("code"),c=o.searchParams.get("state"),l=o.searchParams.get("error");return l?(yn(r,400,mn(l)),i(),a.close(),void n({error:l,success:!1})):s&&c?c!==e?(yn(r,400,mn("Invalid state parameter (possible CSRF attack)")),i(),a.close(),void n({error:"State mismatch",success:!1})):(yn(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'),i(),a.close(),void n({code:s,state:c,success:!0})):(yn(r,400,mn("Missing code or state parameter")),i(),a.close(),void n({error:"Missing code or state parameter",success:!1}))});a.on("error",e=>{if(i(),"EADDRINUSE"===e.code){const e=new Error("Port 9876 is already in use. Please close the application using it and try again.");return r(e),void o(e)}const t=new Error(`Failed to start callback server: ${e.message}`);r(t),o(t)}),a.listen(9876,()=>{t()})})}})(r);return{authorizeUrl:e,serverReady:n,waitForCallback:async()=>{const e=await o;if(!e.success)throw new Error(e.error);return(async(e,t)=>{const r=new URLSearchParams({client_id:Yr,code:e,code_verifier:t,grant_type:"authorization_code",redirect_uri:Kr}),n=await fetch(`${Fr}/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}})(e.code,t)}}})();await r,Z.info("Opening browser for authentication..."),Z.info(G.dim("If browser doesn't open, visit:")),Z.info(`]8;;${t}${G.underline(G.cyan(t))}]8;;`);try{await ce(t)}catch{Z.warn("Could not open browser automatically. Please open the URL above manually.")}const o=te();let s;o.start("Waiting for authentication...");try{s=await n(),o.stop(G.green("✓ Authentication successful"))}catch(e){o.stop(G.red("✗ Authentication failed"));const t=e instanceof Error?e.message:"Unknown error";ee(G.red(`Login failed: ${t}`)),process.exit(1)}const i=await vn(s);i.success?(await un(i.scopedTokens),ee(G.green("Setup complete! You can now use Stably CLI."))):(ee(G.yellow("Setup incomplete. Run `stably login` to try again.")),process.exit(1))},_n={fatal:60,error:50,warn:40,info:30,debug:20,trace:10},En=new Set(["help","login","logout","whoami","tunnel","create","fix","init","upgrade","test","show-report","codegen"]),In=(new Date).toISOString().split("T")[0],Tn=r.join(C.tmpdir(),"stably-logs",In);h.mkdirSync(Tn,{recursive:!0});var xn,Sn=process.argv.includes("--verbose")||process.argv.includes("-v"),An=process.env.STABLY_LOG_LEVEL?.toLowerCase(),Cn=Sn?"debug":void 0!==(xn=An)&&xn in _n?An:"warn",Rn=_n[Cn],Pn=null,Un=null,kn=null,Ln=[],Dn=!1,On=e=>{if(!Dn){Pn=(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("-")})(),n=((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 r.join(Tn,`${t}-${n}.log`)})(e),(e=>{const t=["","=".repeat(60),"Stably CLI Debug Log",`Version: ${Mr}`,`Generated: ${(new Date).toISOString()}`,`Node: ${process.version}`,`Platform: ${process.platform} ${C.release()}`,`CWD: ${process.cwd()}`,`Args: ${process.argv.slice(2).join(" ")}`,`Log Level (console): ${Cn}`,"=".repeat(60),""].join("\n");e.write(t)})(Un=new de({dest:Pn,minLength:4096,sync:!1,append:!0})),kn=ue({level:"debug",timestamp:ue.stdTimeFunctions.isoTime,base:{version:Mr}},Un);for(const{level:e,msg:t,context:r}of Ln)r?kn[e](r,t):kn[e](t);Ln=[],Dn=!0,Sn&&process.stderr.write(`${G.dim(`Debug log: ${Pn}`)}\n\n`)}},Bn=(()=>{const e=process.argv.slice(2).find(e=>!e.startsWith("-"));return e&&En.has(e)?e:null})();Bn&&On(Bn);var Nn=e=>(t,r)=>{if(kn?r?kn[e](r,t):kn[e](t):Ln.push({level:e,msg:t,context:r}),(e=>_n[e]>=Rn)(e)){const r=((e,t)=>`${{fatal:G.bgRed(G.white(" FATAL ")),error:G.red("error"),warn:G.yellow("warn"),info:G.cyan("info"),debug:G.dim("debug"),trace:G.dim("trace")}[e]} ${t}`)(e,t);process.stderr.write(`${r}\n`)}},$n={fatal:Nn("fatal"),error:Nn("error"),warn:Nn("warn"),info:Nn("info"),debug:Nn("debug"),trace:Nn("trace"),initSession:e=>{Dn||On(e)},getLogFilePath:()=>Pn,flush:()=>{if(Un)try{Un.flushSync()}catch{}},printLogFileInfo:()=>{Pn&&(process.stderr.write(`\n${G.dim("Debug log written to:")}\n`),process.stderr.write(` ${G.cyan(Pn)}\n`),process.stderr.write(`${G.dim("Share this file with support for assistance.")}\n`))},getPinoLogger:()=>kn};setInterval(()=>{$n.flush()},3e4).unref(),process.on("beforeExit",()=>{$n.flush()});var jn=e=>{const t=()=>{$n.flush(),Sn&&$n.printLogFileInfo(),process.removeListener(e,t),process.kill(process.pid,e)};return t};process.on("SIGINT",jn("SIGINT")),process.on("SIGTERM",jn("SIGTERM"));var Mn=()=>{const e=process.env.STABLY_API_KEY?.trim(),t=process.env.STABLY_PROJECT_ID?.trim();if(e&&t)return $n.debug("Environment auth detected",{hasApiKey:!0,hasProjectId:!0}),{apiKey:e,projectId:t};$n.debug("Environment auth not set",{hasApiKey:!!e,hasProjectId:!!t})},Hn=!1,Gn=()=>{Hn||(Hn=!0,Z.warn("Both environment variable auth and stored OAuth login were detected."),Z.warn(`Honoring environment variables (${G.cyan("STABLY_API_KEY")} + ${G.cyan("STABLY_PROJECT_ID")}).`),Z.warn("To use OAuth login instead, unset those environment variables."))},Fn=async()=>{$n.debug("Checking for stored auth tokens");const e=await ln();if(!e)return void $n.debug("No stored auth tokens found");const t=hn(e);if($n.debug("Auth tokens status",{expired:t}),!t){const t=await pn(),r=(e=>{try{const t=Qr.parse(Zr(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($n.debug("Token scope check",{scope:r,hasContext:!!t}),t&&"full"===r)try{$n.debug("Exchanging full token for org-scoped token",{orgId:t.orgId});const r=await Jr(e.accessToken,t.orgId),n={accessToken:r.accessToken,expiresAt:Date.now()+1e3*r.expiresInSeconds,idToken:e.idToken,refreshToken:e.refreshToken};return await un(n),$n.debug("Token exchange successful"),n}catch(t){return $n.debug("Token exchange failed, using existing token",{error:t instanceof Error?t.message:String(t)}),e}return e}try{$n.debug("Attempting token refresh");const t=await gn(e.refreshToken);$n.debug("Token refresh successful");const r=await pn();if(r)try{$n.debug("Exchanging refreshed token for org-scoped token");const e=await Jr(t.accessToken,r.orgId),n={accessToken:e.accessToken,expiresAt:Date.now()+1e3*e.expiresInSeconds,idToken:t.idToken,refreshToken:t.refreshToken};return await un(n),n}catch{return await un(t),t}return await un(t),t}catch(e){return void $n.warn("Token refresh failed",{error:e instanceof Error?e.message:String(e)})}},Yn=async(e={})=>{$n.debug("Requiring authentication",{autoLogin:e.autoLogin});const t=Mn();if(t){$n.info("Using environment variable authentication");try{await ln()&&Gn()}catch{}return{auth:t,type:"env"}}let r=await Fn(),n=r?await pn():void 0;const o=process.stdin.isTTY&&process.stdout.isTTY;if($n.debug("OAuth auth check",{hasTokens:!!r,hasContext:!!n,canPrompt:o}),(!r||!n)&&e.autoLogin&&o){$n.info("Prompting user to login"),r?Z.info("You are logged in but need to select an organization and project."):Z.info("You are not logged in."),Z.info("Press Enter to log in."),process.stdout.write(`${G.dim("Alternatively, set environment variables for an org API key:")}\n${G.dim(" STABLY_API_KEY=... STABLY_PROJECT_ID=... stably")}\n`),process.stdout.write("\n");const e=se({input:process.stdin,output:process.stdout});try{await e.question(G.dim("Press Enter to continue... "))}finally{e.close()}await wn(),r=await Fn(),n=r?await pn():void 0}return r||($n.warn("Authentication required but no tokens available"),ee(G.red("You are not logged in. Run `stably login` to authenticate.")),process.exit(1)),n||($n.warn("Authentication succeeded but no project context selected"),ee(G.red("You haven't selected an organization and project. Run `stably login` to complete setup.")),process.exit(1)),$n.info("OAuth authentication successful",{orgId:n.orgId,projectId:n.projectId}),{auth:{accessToken:r.accessToken,context:n},type:"oauth"}},Vn=e=>"env"===e.type?e.auth.projectId:e.auth.context.projectId,zn=e=>e?{...process.env,...e}:process.env,Wn=async()=>{$n.info("[test] Resolving Stably test env");const e=(()=>{if(process.env.STABLY_WS_URL)return;if("https://api.stably.ai"===Hr)return;const e=Hr.startsWith("http://")?"ws://":"wss://";return`${Hr.replace(/^https?:\/\//,e).replace(/\/$/,"")}/reporter`})();$n.debug("[test] WebSocket URL resolved",{wsUrl:e??"(default)"});const t=Mn();if(t)return $n.info("[test] Using env var auth (STABLY_API_KEY + STABLY_PROJECT_ID)"),{STABLY_API_KEY:t.apiKey,STABLY_PROJECT_ID:t.projectId,...e&&{STABLY_WS_URL:e}};$n.info("[test] No env var auth, attempting OAuth auth");const r=Date.now(),n=await(async()=>{const e=Mn();if(e){try{await ln()&&Gn()}catch{}return{auth:e,type:"env"}}const t=await Fn(),r=t?await pn():void 0;if(t&&r)return{auth:{accessToken:t.accessToken,context:r},type:"oauth"}})();if($n.info("[test] OAuth auth resolved",{durationMs:Date.now()-r,hasAuth:!!n,authType:n?.type}),!n||"env"===n.type)return void $n.info("[test] No usable auth found");const o=process.env.STABLY_PROJECT_ID?.trim(),s=o||Vn(n);if(!s)return void $n.warn("[test] No project ID available");$n.info("[test] Fetching JWT API key",{projectId:s});const i=Date.now(),a=await(async(e,t)=>{try{$n.debug("Requesting JWT API key",{projectId:t,apiUrl:Hr});const r=await(async({accessToken:e,projectId:t})=>{const r=await(n={auth:e,client:qr(),path:{projectId:t}},(n.client??jr).post({security:[{scheme:"bearer",type:"http"}],url:"/internal/v1/cli/projects/{projectId}/api-key",...n}));var n;if(r.error){const e=r.error?.error,{status:t}=r.response;throw new Error(e??`Failed to get API key: ${t}`)}return r.data})({accessToken:e,projectId:t});return $n.debug("JWT API key obtained",{keyPrefix:r.apiKey.substring(0,10)}),r.apiKey}catch(e){return void $n.warn("Failed to get JWT API key for test reporter",{error:e instanceof Error?e.message:String(e)})}})(n.auth.accessToken,s);$n.info("[test] JWT API key fetch complete",{durationMs:Date.now()-i,success:!!a});const c=a?{STABLY_API_KEY:a,STABLY_PROJECT_ID:s,...e&&{STABLY_WS_URL:e}}:void 0;return $n.info("[test] Stably test env resolved",{hasApiKey:!!c?.STABLY_API_KEY,projectId:c?.STABLY_PROJECT_ID,wsUrl:c?.STABLY_WS_URL??process.env.STABLY_WS_URL??"(default)"}),c},Kn=e=>e?{[vr]:e}:void 0,qn=ae.object({context:ae.string().min(1),autohealReportUrl:ae.string(),skippedTests:ae.array(ae.object({testIdentifier:ae.string(),testTitle:ae.string(),consecutiveUnfixedCount:ae.number()})).optional()}),Jn=pe.object({bucket:pe.string(),key:pe.string()}),Xn=pe.object({diffBucketPath:Jn,expiresInSeconds:pe.number(),key:pe.string(),uploadUrl:pe.string()}),Qn=pe.object({traceBucketPath:Jn,expiresInSeconds:pe.number(),key:pe.string(),uploadUrl:pe.string(),sensitiveValues:pe.array(pe.string())}),Zn=async({authHeader:e,contentType:t="text/plain",orgId:r,runId:n})=>{const o=await(s={auth:e,body:{contentType:t},client:qr(),headers:Kn(r),path:{runId:n}},(s.client??jr).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=Xn.parse(o.data);return{diffBucketPath:i.diffBucketPath,expiresInSeconds:i.expiresInSeconds,key:i.key,uploadUrl:i.uploadUrl}},eo=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})`)},to=async({authHeader:e,diffBucketPath:t,orgId:r,runId:n})=>{const o=(qr().getConfig().baseUrl??"").replace(/\/$/,""),s=await fetch(`${o}/internal/v1/cli/runs/${encodeURIComponent(n)}/autoheal-diff/confirm-upload`,{method:"POST",headers:{"Content-Type":"application/json",...Kn(r),authorization:e},body:JSON.stringify(t)});if(!s.ok)throw new Error(`Failed to confirm diff upload (${s.status})`)},ro=class{socket;url;authHeader;orgId;runId;pendingEvent=null;reconnectAttempts=0;reconnectTimer;debounceTimer;_isClosed=!1;isAuthenticated=!1;authenticationFailed=!1;onUserMessage;maxReconnectAttempts=3;reconnectDelay=2e3;debounceMs=500;get isClosed(){return this._isClosed}constructor({authHeader:e,orgId:t,runId:r,url:n=zr,onUserMessage:o}){this.authHeader=e,this.orgId=t,this.runId=r,this.url=n,this.onUserMessage=o,$n.info("[ws] Constructing AutohealWebSocketClient",{url:this.url,runId:r})}start(){this.connect()}connect(){if(!this._isClosed)try{const e={Authorization:this.authHeader};this.orgId&&(e["x-stably-org-id"]=this.orgId);const t=`${this.url}?runId=${encodeURIComponent(this.runId)}`;$n.info("[ws] Connecting",{url:t,attempt:this.reconnectAttempts}),this.socket=new fe(t,{headers:e}),this.socket.on("open",()=>{$n.info("[ws] Connection opened"),this.reconnectAttempts=0}),this.socket.on("message",e=>{try{const t="string"==typeof e?e:e.toString(),r=JSON.parse(t);$n.debug("[ws] Received message",{type:r?.type}),"connected"===r?.type&&($n.info("[ws] Authenticated successfully"),this.isAuthenticated=!0,this.authenticationFailed=!1,this.flushPending()),"user_message"===r?.type&&"string"==typeof r.content&&($n.info("[ws] Received user message from web UI"),this.onUserMessage?.(r.content))}catch{}}),this.socket.on("close",(e,t)=>{$n.info("[ws] Connection closed",{code:e,authFailed:1008===e,reconnectAttempts:this.reconnectAttempts,maxReconnect:this.maxReconnectAttempts,isClosed:this._isClosed}),this.isAuthenticated=!1,1008===e&&(this.authenticationFailed=!0),!this._isClosed&&!this.authenticationFailed&&this.reconnectAttempts<this.maxReconnectAttempts&&this.scheduleReconnect()}),this.socket.on("error",e=>{$n.warn("[ws] Connection error",{error:e.message})})}catch(e){$n.warn("[ws] Failed to create WebSocket",{error:e instanceof Error?e.message:String(e)}),this.scheduleReconnect()}}scheduleReconnect(){this._isClosed||this.reconnectTimer||(this.reconnectAttempts++,$n.info("[ws] Scheduling reconnect",{attempt:this.reconnectAttempts,maxAttempts:this.maxReconnectAttempts,delayMs:this.reconnectDelay}),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=void 0,this.connect()},this.reconnectDelay))}isConnected(){return!!this.socket&&this.socket.readyState===fe.OPEN&&this.isAuthenticated}sendProgress(e){if(this._isClosed)return void $n.debug("[ws] sendProgress called but client is closed",{phase:e.phase});const t={type:"autoheal_progress",payload:e};return this.pendingEvent=t,this.isConnected()?"complete"===e.phase?($n.info("[ws] sendProgress: flushing terminal state immediately"),void this.flushPending()):void(this.debounceTimer||(this.debounceTimer=setTimeout(()=>{this.debounceTimer=void 0,this.flushPending()},this.debounceMs))):($n.debug("[ws] sendProgress: not connected, queuing event",{phase:e.phase,socketState:this.socket?.readyState,isAuthenticated:this.isAuthenticated,reconnectAttempts:this.reconnectAttempts}),void(this.socket?.readyState===fe.CLOSED&&this.reconnectAttempts<this.maxReconnectAttempts&&this.scheduleReconnect()))}flushPending(){if(this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=void 0),!this.pendingEvent)return;const e=this.pendingEvent;if(this.pendingEvent=null,!this.isConnected())return $n.debug("[ws] flushPending: not connected, re-queuing event",{phase:e.payload.phase}),void(this.pendingEvent=e);try{$n.debug("[ws] flushPending: sending event",{phase:e.payload.phase}),this.socket?.send(JSON.stringify(e),t=>{t&&($n.warn("[ws] flushPending: send failed",{error:t.message,phase:e.payload.phase}),this.pendingEvent||(this.pendingEvent=e))})}catch(t){$n.warn("[ws] flushPending: send threw",{error:t instanceof Error?t.message:String(t)}),this.pendingEvent=e}}close(){if(this._isClosed)return;$n.info("[ws] Closing WebSocket client"),this._isClosed=!0,this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=void 0),this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=void 0),this.flushPending();const{socket:e}=this;this.socket=void 0,e&&setTimeout(()=>{e.close()},200)}},no=class{socket;url;authHeader;orgId;sessionId;pendingEvent=null;reconnectAttempts=0;reconnectTimer;debounceTimer;_isClosed=!1;isAuthenticated=!1;authenticationFailed=!1;onUserMessage;maxReconnectAttempts=3;reconnectDelay=2e3;debounceMs=500;get isClosed(){return this._isClosed}constructor({authHeader:e,orgId:t,sessionId:r,url:n=Wr,onUserMessage:o}){this.authHeader=e,this.orgId=t,this.sessionId=r,this.url=n,this.onUserMessage=o,$n.info("[ws] Constructing CreateProgressWebSocketClient",{url:this.url,sessionId:r})}start(){this.connect()}connect(){if(!this._isClosed)try{const e={Authorization:this.authHeader};this.orgId&&(e["x-stably-org-id"]=this.orgId);const t=`${this.url}?sessionId=${encodeURIComponent(this.sessionId)}`;$n.info("[ws] Connecting",{url:t,attempt:this.reconnectAttempts}),this.socket=new fe(t,{headers:e}),this.socket.on("open",()=>{$n.info("[ws] Connection opened"),this.reconnectAttempts=0}),this.socket.on("message",e=>{try{const t="string"==typeof e?e:e.toString(),r=JSON.parse(t);$n.debug("[ws] Received message",{type:r?.type}),"connected"===r?.type&&($n.info("[ws] Authenticated successfully"),this.isAuthenticated=!0,this.authenticationFailed=!1,this.flushPending()),"user_message"===r?.type&&"string"==typeof r.content&&($n.info("[ws] Received user message from web UI"),this.onUserMessage?.(r.content))}catch{}}),this.socket.on("close",(e,t)=>{$n.info("[ws] Connection closed",{code:e,authFailed:1008===e,reconnectAttempts:this.reconnectAttempts,maxReconnect:this.maxReconnectAttempts,isClosed:this._isClosed}),this.isAuthenticated=!1,1008===e&&(this.authenticationFailed=!0),!this._isClosed&&!this.authenticationFailed&&this.reconnectAttempts<this.maxReconnectAttempts&&this.scheduleReconnect()}),this.socket.on("error",e=>{$n.warn("[ws] Connection error",{error:e.message})})}catch(e){$n.warn("[ws] Failed to create WebSocket",{error:e instanceof Error?e.message:String(e)}),this.scheduleReconnect()}}scheduleReconnect(){this._isClosed||this.reconnectTimer||(this.reconnectAttempts++,$n.info("[ws] Scheduling reconnect",{attempt:this.reconnectAttempts,maxAttempts:this.maxReconnectAttempts,delayMs:this.reconnectDelay}),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=void 0,this.connect()},this.reconnectDelay))}isConnected(){return!!this.socket&&this.socket.readyState===fe.OPEN&&this.isAuthenticated}sendProgress(e){if(this._isClosed)return void $n.debug("[ws] sendProgress called but client is closed",{phase:e.phase});const t={type:"create_progress",payload:e};return this.pendingEvent=t,this.isConnected()?"complete"===e.phase?($n.info("[ws] sendProgress: flushing terminal state immediately"),void this.flushPending()):void(this.debounceTimer||(this.debounceTimer=setTimeout(()=>{this.debounceTimer=void 0,this.flushPending()},this.debounceMs))):($n.debug("[ws] sendProgress: not connected, queuing event",{phase:e.phase,socketState:this.socket?.readyState,isAuthenticated:this.isAuthenticated,reconnectAttempts:this.reconnectAttempts}),void(this.socket?.readyState===fe.CLOSED&&this.reconnectAttempts<this.maxReconnectAttempts&&this.scheduleReconnect()))}flushPending(){if(this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=void 0),!this.pendingEvent)return;const e=this.pendingEvent;if(this.pendingEvent=null,!this.isConnected())return $n.debug("[ws] flushPending: not connected, re-queuing event",{phase:e.payload.phase}),void(this.pendingEvent=e);try{$n.debug("[ws] flushPending: sending event",{phase:e.payload.phase}),this.socket?.send(JSON.stringify(e),t=>{t&&($n.warn("[ws] flushPending: send failed",{error:t.message,phase:e.payload.phase}),this.pendingEvent||(this.pendingEvent=e))})}catch(t){$n.warn("[ws] flushPending: send threw",{error:t instanceof Error?t.message:String(t)}),this.pendingEvent=e}}close(){if(this._isClosed)return;$n.info("[ws] Closing WebSocket client"),this._isClosed=!0,this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=void 0),this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=void 0),this.flushPending();const{socket:e}=this;this.socket=void 0,e&&setTimeout(()=>{e.close()},200)}},oo=e=>{if(!e||"object"!=typeof e)return!1;const t=e;return"text"===t.type&&"string"==typeof t.text},so=e=>null!=e&&"object"==typeof e&&"tool_response"in e,io=e=>{if(!e||"object"!=typeof e)return;const t=e;return Array.isArray(t.tool_response)?t.tool_response:void 0},ao=e=>{const t=io(e);if(t)return t.filter(oo).map(e=>e.text).join("\n")||void 0},co=/\u001b\[[0-9;]*m/g,lo=e=>e.replace(co,""),uo=/\$\{process\.env\.([A-Z_][A-Z0-9_]*)\}/g;function po({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(uo,(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 fo({onResult:e}){return async t=>{if(!so(t))return{decision:"approve"};const r=ao(t);if(!r)return{decision:"approve"};const n=function(e){const t=lo(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 ho({onResult:e}){return async t=>{if(!so(t))return{decision:"approve"};const r=ao(t);if(!r)return{decision:"approve"};const n=function(e){const t=lo(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 go=/\.(spec|test)\.(ts|tsx|js|jsx|mts|mjs)$/;function mo({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&&go.test(n)&&e(n),{decision:"approve"}}}var yo=L(u);async function bo(){try{const{stdout:e}=await yo('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 yo(`pkill -KILL -P ${e} '.*' 2>/dev/null || true`)}))}catch{}}var vo=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())}hasQueuedMessages(){return this.queue.length>0}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()})}};function wo(e){try{const t=d("git branch --show-current",{cwd:e,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();if(!t)return;return{branch:t}}catch{return}}var _o=[".ts",".js",".mts",".mjs",".cts",".cjs"],Eo=10240,Io=async({defaultContent:e,fileName:t,filePath:r})=>{try{const e=(await J(r)).size,n=await Y(r,"utf-8"),o=Buffer.byteLength(n,"utf-8");if(o<=Eo)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<=Eo?s:s.slice(0,Eo)+`\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}},To=async({defaultContent:e,dirName:t,dirPath:r})=>{try{const e=await q(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}},xo=async({allowedEnvVars:e,mode:t,workspaceInfo:r,authHeader:n,customHeader:o,maxParallelWorkers:s})=>{const i=qr(),a=wo(r.absolutePath);$n.debug("Requesting system prompt from API",{mode:t,hasGitContext:!!a,envVarCount:e.length});const c=await(l={client:i,auth:n,body:{mode:t,workspaceInfo:r,allowedEnvVars:e,gitContext:a,maxParallelWorkers:s}},(l.client??jr).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 $n.warn("System prompt fetch failed: unauthorized (401)"),await dn(),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 $n.warn("System prompt fetch failed: forbidden (403)"),await dn(),new Error("You no longer have access to this organization. Credentials have been cleared. Please run `stably login` to re-authenticate.");if(c.error){$n.warn("System prompt fetch failed",{error:c.error});const e=JSON.stringify(c.error);if(e.toLowerCase().includes("unauthorized")||e.toLowerCase().includes("unauthenticated"))throw await dn(),new Error("Your session has expired or been revoked. Credentials have been cleared. Please run `stably login` to re-authenticate.");throw new Error("Failed to fetch system prompt. Please check your network connection and try again. If this persists, run `stably login` to re-authenticate.")}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:o});return $n.debug("System prompt received",{size:u.length,appendedCustomHeader:!!o,hasPrContext:!!c.data.prContext}),{systemPrompt:u,prContext:c.data.prContext}},So=".stably-playwright-wrapper.config.*",Ao=[".ts",".js",".mts",".mjs",".cts",".cjs"];function Co(e){const t=n(e);if(g(t))for(const e of Ao){const r=s(t,`playwright.config${e}`);if(g(r))return r}}var Ro=["tests","e2e","__tests__","test"];function Po(e){try{return g(e)&&m(e).isDirectory()}catch{return!1}}function Uo(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(G.dim(`Using output directory: ${e} (from ${r})`))}var ko,Lo=["mcp__playwright-test__","mcp__auto-heal-report__","mcp__stably-agent-control__"],Do=["planner_","generator_"],Oo={"mcp__stably-agent-control__restart_mcp_servers":"Restarting Browser Tools","mcp__session-control__restart_mcp_servers":"Restarting Browser Tools"},Bo=(e,t)=>{const r=t.find(t=>e.startsWith(t));return r?e.slice(r.length):e},No=(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},$o=e=>"mcp__auto-heal-report__capture-trace-proof"===e?"Verify Test Run":"mcp__auto-heal-report__generate-report"===e?"Generate Report":(e=>{const t=Oo[e];if(t)return t;const r=Bo(e,Lo);return Bo(r,Do).split("_").map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join(" ")})(e),jo=["test","bug","flake","ui_change","other"],Mo={bug:"Application code defect; behavior diverges from expected requirements.",flake:"Non-deterministic failure; timing, race conditions, or environmental variance causes inconsistent test results.",other:"External dependencies, environment, or infra issues outside test/app code.",test:"Test code is incorrect, out-of-date, or missing necessary setup.",ui_change:"Application UI intentionally changed; test expectations (screenshots, selectors, text assertions) are stale and need updating."},Ho=e=>Mo[e],Go=/[^a-zA-Z0-9-_]/g,Fo=e=>{const t=e.trim().replace(Go,"_");return t.length>0?t.slice(0,80):void 0},Yo=e=>"string"==typeof e?Fo(e):void 0,Vo=_e("/");try{ko=Vo("worker_threads").Worker}catch(e){}var zo=ko?function(e,t,r,n,o){var s=!1,i=new ko(e+";var __w=require('worker_threads');__w.parentPort.on('message',function(m){onmessage({data:m})}),postMessage=function(m,t){__w.parentPort.postMessage(m,t)},close=process.exit;self=global",{eval:!0}).on("error",function(e){return o(e,null)}).on("message",function(e){return o(null,e)}).on("exit",function(e){e&&!s&&o(new Error("exited with code "+e),null)});return i.postMessage(r,n),i.terminate=function(){return s=!0,ko.prototype.terminate.call(i)},i}:function(e,t,r,n,o){setImmediate(function(){return o(new Error("async operations unsupported - update to Node 12+ (or Node 10-11 with the --experimental-worker CLI flag)"),null)});var s=function(){};return{terminate:s,postMessage:s}},Wo=Uint8Array,Ko=Uint16Array,qo=Int32Array,Jo=new Wo([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),Xo=new Wo([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),Qo=new Wo([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Zo=function(e,t){for(var r=new Ko(31),n=0;n<31;++n)r[n]=t+=1<<e[n-1];var o=new qo(r[30]);for(n=1;n<30;++n)for(var s=r[n];s<r[n+1];++s)o[s]=s-r[n]<<5|n;return{b:r,r:o}},es=Zo(Jo,2),ts=es.b,rs=es.r;ts[28]=258,rs[258]=28;var ns,os=Zo(Xo,0),ss=os.b,is=os.r,as=new Ko(32768);for(us=0;us<32768;++us)ns=(61680&(ns=(52428&(ns=(43690&us)>>1|(21845&us)<<1))>>2|(13107&ns)<<2))>>4|(3855&ns)<<4,as[us]=((65280&ns)>>8|(255&ns)<<8)>>1;var cs=function(e,t,r){for(var n=e.length,o=0,s=new Ko(t);o<n;++o)e[o]&&++s[e[o]-1];var i,a=new Ko(t);for(o=1;o<t;++o)a[o]=a[o-1]+s[o-1]<<1;if(r){i=new Ko(1<<t);var c=15-t;for(o=0;o<n;++o)if(e[o])for(var l=o<<4|e[o],u=t-e[o],d=a[e[o]-1]++<<u,p=d|(1<<u)-1;d<=p;++d)i[as[d]>>c]=l}else for(i=new Ko(n),o=0;o<n;++o)e[o]&&(i[o]=as[a[e[o]-1]++]>>15-e[o]);return i},ls=new Wo(288);for(us=0;us<144;++us)ls[us]=8;for(us=144;us<256;++us)ls[us]=9;for(us=256;us<280;++us)ls[us]=7;for(us=280;us<288;++us)ls[us]=8;var us,ds=new Wo(32);for(us=0;us<32;++us)ds[us]=5;var ps=cs(ls,9,0),fs=cs(ls,9,1),hs=cs(ds,5,0),gs=cs(ds,5,1),ms=function(e){for(var t=e[0],r=1;r<e.length;++r)e[r]>t&&(t=e[r]);return t},ys=function(e,t,r){var n=t/8|0;return(e[n]|e[n+1]<<8)>>(7&t)&r},bs=function(e,t){var r=t/8|0;return(e[r]|e[r+1]<<8|e[r+2]<<16)>>(7&t)},vs=function(e){return(e+7)/8|0},ws=function(e,t,r){return(null==t||t<0)&&(t=0),(null==r||r>e.length)&&(r=e.length),new Wo(e.subarray(t,r))},_s=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],Es=function(e,t,r){var n=new Error(t||_s[e]);if(n.code=e,Error.captureStackTrace&&Error.captureStackTrace(n,Es),!r)throw n;return n},Is=function(e,t,r,n){var o=e.length,s=n?n.length:0;if(!o||t.f&&!t.l)return r||new Wo(0);var i=!r,a=i||2!=t.i,c=t.i;i&&(r=new Wo(3*o));var l=function(e){var t=r.length;if(e>t){var n=new Wo(Math.max(2*t,e));n.set(r),r=n}},u=t.f||0,d=t.p||0,p=t.b||0,f=t.l,h=t.d,g=t.m,m=t.n,y=8*o;do{if(!f){u=ys(e,d,1);var b=ys(e,d+1,3);if(d+=3,!b){var v=e[(P=vs(d)+4)-4]|e[P-3]<<8,w=P+v;if(w>o){c&&Es(0);break}a&&l(p+v),r.set(e.subarray(P,w),p),t.b=p+=v,t.p=d=8*w,t.f=u;continue}if(1==b)f=fs,h=gs,g=9,m=5;else if(2==b){var _=ys(e,d,31)+257,E=ys(e,d+10,15)+4,I=_+ys(e,d+5,31)+1;d+=14;for(var T=new Wo(I),x=new Wo(19),S=0;S<E;++S)x[Qo[S]]=ys(e,d+3*S,7);d+=3*E;var A=ms(x),C=(1<<A)-1,R=cs(x,A,1);for(S=0;S<I;){var P,U=R[ys(e,d,C)];if(d+=15&U,(P=U>>4)<16)T[S++]=P;else{var k=0,L=0;for(16==P?(L=3+ys(e,d,3),d+=2,k=T[S-1]):17==P?(L=3+ys(e,d,7),d+=3):18==P&&(L=11+ys(e,d,127),d+=7);L--;)T[S++]=k}}var D=T.subarray(0,_),O=T.subarray(_);g=ms(D),m=ms(O),f=cs(D,g,1),h=cs(O,m,1)}else Es(1);if(d>y){c&&Es(0);break}}a&&l(p+131072);for(var B=(1<<g)-1,N=(1<<m)-1,$=d;;$=d){var j=(k=f[bs(e,d)&B])>>4;if((d+=15&k)>y){c&&Es(0);break}if(k||Es(2),j<256)r[p++]=j;else{if(256==j){$=d,f=null;break}var M=j-254;if(j>264){var H=Jo[S=j-257];M=ys(e,d,(1<<H)-1)+ts[S],d+=H}var G=h[bs(e,d)&N],F=G>>4;if(G||Es(3),d+=15&G,O=ss[F],F>3&&(H=Xo[F],O+=bs(e,d)&(1<<H)-1,d+=H),d>y){c&&Es(0);break}a&&l(p+131072);var Y=p+M;if(p<O){var V=s-O,z=Math.min(O,Y);for(V+p<0&&Es(3);p<z;++p)r[p]=n[V+p]}for(;p<Y;++p)r[p]=r[p-O]}}t.l=f,t.p=$,t.b=p,t.f=u,f&&(u=1,t.m=g,t.d=h,t.n=m)}while(!u);return p!=r.length&&i?ws(r,0,p):r.subarray(0,p)},Ts=function(e,t,r){r<<=7&t;var n=t/8|0;e[n]|=r,e[n+1]|=r>>8},xs=function(e,t,r){r<<=7&t;var n=t/8|0;e[n]|=r,e[n+1]|=r>>8,e[n+2]|=r>>16},Ss=function(e,t){for(var r=[],n=0;n<e.length;++n)e[n]&&r.push({s:n,f:e[n]});var o=r.length,s=r.slice();if(!o)return{t:Ls,l:0};if(1==o){var i=new Wo(r[0].s+1);return i[r[0].s]=1,{t:i,l:1}}r.sort(function(e,t){return e.f-t.f}),r.push({s:-1,f:25001});var a=r[0],c=r[1],l=0,u=1,d=2;for(r[0]={s:-1,f:a.f+c.f,l:a,r:c};u!=o-1;)a=r[r[l].f<r[d].f?l++:d++],c=r[l!=u&&r[l].f<r[d].f?l++:d++],r[u++]={s:-1,f:a.f+c.f,l:a,r:c};var p=s[0].s;for(n=1;n<o;++n)s[n].s>p&&(p=s[n].s);var f=new Ko(p+1),h=As(r[u-1],f,0);if(h>t){n=0;var g=0,m=h-t,y=1<<m;for(s.sort(function(e,t){return f[t.s]-f[e.s]||e.f-t.f});n<o;++n){var b=s[n].s;if(!(f[b]>t))break;g+=y-(1<<h-f[b]),f[b]=t}for(g>>=m;g>0;){var v=s[n].s;f[v]<t?g-=1<<t-f[v]++-1:++n}for(;n>=0&&g;--n){var w=s[n].s;f[w]==t&&(--f[w],++g)}h=t}return{t:new Wo(f),l:h}},As=function(e,t,r){return-1==e.s?Math.max(As(e.l,t,r+1),As(e.r,t,r+1)):t[e.s]=r},Cs=function(e){for(var t=e.length;t&&!e[--t];);for(var r=new Ko(++t),n=0,o=e[0],s=1,i=function(e){r[n++]=e},a=1;a<=t;++a)if(e[a]==o&&a!=t)++s;else{if(!o&&s>2){for(;s>138;s-=138)i(32754);s>2&&(i(s>10?s-11<<5|28690:s-3<<5|12305),s=0)}else if(s>3){for(i(o),--s;s>6;s-=6)i(8304);s>2&&(i(s-3<<5|8208),s=0)}for(;s--;)i(o);s=1,o=e[a]}return{c:r.subarray(0,n),n:t}},Rs=function(e,t){for(var r=0,n=0;n<t.length;++n)r+=e[n]*t[n];return r},Ps=function(e,t,r){var n=r.length,o=vs(t+2);e[o]=255&n,e[o+1]=n>>8,e[o+2]=255^e[o],e[o+3]=255^e[o+1];for(var s=0;s<n;++s)e[o+s+4]=r[s];return 8*(o+4+n)},Us=function(e,t,r,n,o,s,i,a,c,l,u){Ts(t,u++,r),++o[256];for(var d=Ss(o,15),p=d.t,f=d.l,h=Ss(s,15),g=h.t,m=h.l,y=Cs(p),b=y.c,v=y.n,w=Cs(g),_=w.c,E=w.n,I=new Ko(19),T=0;T<b.length;++T)++I[31&b[T]];for(T=0;T<_.length;++T)++I[31&_[T]];for(var x=Ss(I,7),S=x.t,A=x.l,C=19;C>4&&!S[Qo[C-1]];--C);var R,P,U,k,L=l+5<<3,D=Rs(o,ls)+Rs(s,ds)+i,O=Rs(o,p)+Rs(s,g)+i+14+3*C+Rs(I,S)+2*I[16]+3*I[17]+7*I[18];if(c>=0&&L<=D&&L<=O)return Ps(t,u,e.subarray(c,c+l));if(Ts(t,u,1+(O<D)),u+=2,O<D){R=cs(p,f,0),P=p,U=cs(g,m,0),k=g;var B=cs(S,A,0);for(Ts(t,u,v-257),Ts(t,u+5,E-1),Ts(t,u+10,C-4),u+=14,T=0;T<C;++T)Ts(t,u+3*T,S[Qo[T]]);u+=3*C;for(var N=[b,_],$=0;$<2;++$){var j=N[$];for(T=0;T<j.length;++T){var M=31&j[T];Ts(t,u,B[M]),u+=S[M],M>15&&(Ts(t,u,j[T]>>5&127),u+=j[T]>>12)}}}else R=ps,P=ls,U=hs,k=ds;for(T=0;T<a;++T){var H=n[T];if(H>255){xs(t,u,R[257+(M=H>>18&31)]),u+=P[M+257],M>7&&(Ts(t,u,H>>23&31),u+=Jo[M]);var G=31&H;xs(t,u,U[G]),u+=k[G],G>3&&(xs(t,u,H>>5&8191),u+=Xo[G])}else xs(t,u,R[H]),u+=P[H]}return xs(t,u,R[256]),u+P[256]},ks=new qo([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),Ls=new Wo(0),Ds=function(e,t,r,n,o,s){var i=s.z||e.length,a=new Wo(n+i+5*(1+Math.ceil(i/7e3))+o),c=a.subarray(n,a.length-o),l=s.l,u=7&(s.r||0);if(t){u&&(c[0]=s.r>>3);for(var d=ks[t-1],p=d>>13,f=8191&d,h=(1<<r)-1,g=s.p||new Ko(32768),m=s.h||new Ko(h+1),y=Math.ceil(r/3),b=2*y,v=function(t){return(e[t]^e[t+1]<<y^e[t+2]<<b)&h},w=new qo(25e3),_=new Ko(288),E=new Ko(32),I=0,T=0,x=s.i||0,S=0,A=s.w||0,C=0;x+2<i;++x){var R=v(x),P=32767&x,U=m[R];if(g[P]=U,m[R]=P,A<=x){var k=i-x;if((I>7e3||S>24576)&&(k>423||!l)){u=Us(e,c,0,w,_,E,T,S,C,x-C,u),S=I=T=0,C=x;for(var L=0;L<286;++L)_[L]=0;for(L=0;L<30;++L)E[L]=0}var D=2,O=0,B=f,N=P-U&32767;if(k>2&&R==v(x-N))for(var $=Math.min(p,k)-1,j=Math.min(32767,x),M=Math.min(258,k);N<=j&&--B&&P!=U;){if(e[x+D]==e[x+D-N]){for(var H=0;H<M&&e[x+H]==e[x+H-N];++H);if(H>D){if(D=H,O=N,H>$)break;var G=Math.min(N,H-2),F=0;for(L=0;L<G;++L){var Y=x-N+L&32767,V=Y-g[Y]&32767;V>F&&(F=V,U=Y)}}}N+=(P=U)-(U=g[P])&32767}if(O){w[S++]=268435456|rs[D]<<18|is[O];var z=31&rs[D],W=31&is[O];T+=Jo[z]+Xo[W],++_[257+z],++E[W],A=x+D,++I}else w[S++]=e[x],++_[e[x]]}}for(x=Math.max(x,A);x<i;++x)w[S++]=e[x],++_[e[x]];u=Us(e,c,l,w,_,E,T,S,C,x-C,u),l||(s.r=7&u|c[u/8|0]<<3,u-=7,s.h=m,s.p=g,s.i=x,s.w=A)}else{for(x=s.w||0;x<i+l;x+=65535){var K=x+65535;K>=i&&(c[u/8|0]=l,K=i),u=Ps(c,u+1,e.subarray(x,K))}s.i=i}return ws(a,0,n+vs(u)+o)},Os=function(){for(var e=new Int32Array(256),t=0;t<256;++t){for(var r=t,n=9;--n;)r=(1&r&&-306674912)^r>>>1;e[t]=r}return e}(),Bs=function(e,t,r,n,o){if(!o&&(o={l:1},t.dictionary)){var s=t.dictionary.subarray(-32768),i=new Wo(s.length+e.length);i.set(s),i.set(e,s.length),e=i,o.w=s.length}return Ds(e,null==t.level?6:t.level,null==t.mem?o.l?Math.ceil(1.5*Math.max(8,Math.min(13,Math.log(e.length)))):20:12+t.mem,r,n,o)},Ns=function(e,t){var r={};for(var n in e)r[n]=e[n];for(var n in t)r[n]=t[n];return r},$s=function(e,t,r){for(var n=e(),o=e.toString(),s=o.slice(o.indexOf("[")+1,o.lastIndexOf("]")).replace(/\s+/g,"").split(","),i=0;i<n.length;++i){var a=n[i],c=s[i];if("function"==typeof a){t+=";"+c+"=";var l=a.toString();if(a.prototype)if(-1!=l.indexOf("[native code]")){var u=l.indexOf(" ",8)+1;t+=l.slice(u,l.indexOf("(",u))}else for(var d in t+=l,a.prototype)t+=";"+c+".prototype."+d+"="+a.prototype[d].toString();else t+=l}else r[c]=a}return t},js=[],Ms=function(){return[Wo,Ko,qo,Jo,Xo,Qo,ts,ss,fs,gs,as,_s,cs,ms,ys,bs,vs,ws,Es,Is,Js,Gs,Fs]},Hs=function(){return[Wo,Ko,qo,Jo,Xo,Qo,rs,is,ps,ls,hs,ds,as,ks,Ls,cs,Ts,xs,Ss,As,Cs,Rs,Ps,Us,vs,ws,Ds,Bs,qs,Gs]},Gs=function(e){return postMessage(e,[e.buffer])},Fs=function(e){return e&&{out:e.size&&new Wo(e.size),dictionary:e.dictionary}},Ys=function(e,t,r,n,o,s){var i=function(e,t,r,n){if(!js[r]){for(var o="",s={},i=e.length-1,a=0;a<i;++a)o=$s(e[a],o,s);js[r]={c:$s(e[i],o,s),e:s}}var c=Ns({},js[r].e);return zo(js[r].c+";onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage="+t.toString()+"}",r,c,function(e){var t=[];for(var r in e)e[r].buffer&&t.push((e[r]=new e[r].constructor(e[r])).buffer);return t}(c),n)}(r,n,o,function(e,t){i.terminate(),s(e,t)});return i.postMessage([e,t],t.consume?[e.buffer]:[]),function(){i.terminate()}},Vs=function(e,t){return e[t]|e[t+1]<<8},zs=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},Ws=function(e,t){return zs(e,t)+4294967296*zs(e,t+4)},Ks=function(e,t,r){for(;r;++t)e[t]=r,r>>>=8};function qs(e,t){return Bs(e,t||{},0,0)}function Js(e,t){return Is(e,{i:2},t&&t.out,t&&t.dictionary)}var Xs=function(e,t,r,n){for(var o in e){var s=e[o],i=t+o,a=n;Array.isArray(s)&&(a=Ns(n,s[1]),s=s[0]),s instanceof Wo?r[i]=[s,a]:(r[i+="/"]=[new Wo(0),a],Xs(s,i,r,n))}},Qs="undefined"!=typeof TextEncoder&&new TextEncoder,Zs="undefined"!=typeof TextDecoder&&new TextDecoder;try{Zs.decode(Ls,{stream:!0})}catch(e){}function ei(e,t){if(Qs)return Qs.encode(e);for(var r=e.length,n=new Wo(e.length+(e.length>>1)),o=0,s=function(e){n[o++]=e},i=0;i<r;++i){if(o+5>n.length){var a=new Wo(o+8+(r-i<<1));a.set(n),n=a}var c=e.charCodeAt(i);c<128||t?s(c):c<2048?(s(192|c>>6),s(128|63&c)):c>55295&&c<57344?(s(240|(c=65536+(1047552&c)|1023&e.charCodeAt(++i))>>18),s(128|c>>12&63),s(128|c>>6&63),s(128|63&c)):(s(224|c>>12),s(128|c>>6&63),s(128|63&c))}return ws(n,0,o)}var ti=function(e){var t=0;if(e)for(var r in e){var n=e[r].length;n>65535&&Es(9),t+=n+4}return t},ri=function(e,t,r,n,o,s,i,a){var c=n.length,l=r.extra,u=a&&a.length,d=ti(l);Ks(e,t,null!=i?33639248:67324752),t+=4,null!=i&&(e[t++]=20,e[t++]=r.os),e[t]=20,t+=2,e[t++]=r.flag<<1|(s<0&&8),e[t++]=o&&8,e[t++]=255&r.compression,e[t++]=r.compression>>8;var p=new Date(null==r.mtime?Date.now():r.mtime),f=p.getFullYear()-1980;if((f<0||f>119)&&Es(10),Ks(e,t,f<<25|p.getMonth()+1<<21|p.getDate()<<16|p.getHours()<<11|p.getMinutes()<<5|p.getSeconds()>>1),t+=4,-1!=s&&(Ks(e,t,r.crc),Ks(e,t+4,s<0?-s-2:s),Ks(e,t+8,r.size)),Ks(e,t+12,c),Ks(e,t+14,d),t+=16,null!=i&&(Ks(e,t,u),Ks(e,t+6,r.attrs),Ks(e,t+10,i),t+=14),e.set(n,t),t+=c,d)for(var h in l){var g=l[h],m=g.length;Ks(e,t,+h),Ks(e,t+2,m),e.set(g,t+4),t+=4+m}return u&&(e.set(a,t),t+=u),t},ni="function"==typeof queueMicrotask?queueMicrotask:"function"==typeof setTimeout?setTimeout:function(e){e()};function oi(e,t,r){const n=Math.min(t,512);if("utf-16"===r||"utf-16le"===r||"utf-16be"===r){for(let t=0;t<n;t+=2){const o=e[t],s=t+1<n?e[t+1]:0;if(("utf-16le"===r||"utf-16"===r)&&0===s&&o<32&&9!==o&&10!==o&&13!==o&&0!==o)return!1;if(("utf-16be"===r||"utf-16"===r)&&0===o&&s<32&&9!==s&&10!==s&&13!==s&&0!==s)return!1}return!0}if("latin1"===r||"iso-8859-1"===r){for(let t=0;t<n;t++){const r=e[t];if(0===r)return!1;if(r<32&&9!==r&&10!==r&&13!==r)return!1}return!0}if("cjk"===r||"big5"===r||"gb2312"===r||"gbk"===r||"euc-kr"===r||"shift-jis"===r){for(let t=0;t<n;t++){const r=e[t];if(0===r)return!1;if(r<32&&9!==r&&10!==r&&13!==r)return!1}return!0}return!1}var si=class{fileBuffer;size;offset;error;constructor(e,t){this.fileBuffer=e,this.size=t,this.offset=0,this.error=!1}hasError(){return this.error}nextByte(){return this.offset===this.size||this.hasError()?(this.error=!0,255):this.fileBuffer[this.offset++]}next(e){if(e<0||e>this.size-this.offset)return this.error=!0,[];const t=new Array;for(let r=0;r<e;r++){if(this.error)return t;t[r]=this.nextByte()}return t}};function ii(e){let t=0,r=0;for(;!e.hasError();){const n=e.nextByte();if(r|=(127&n)<<7*t,!(128&n))break;if(t>=10){e.error=!0;break}t++}return r}function ai(e){switch(7&ii(e)){case 0:return ii(e),!0;case 1:return e.next(8),!0;case 2:const t=ii(e);return e.next(t),!0;case 5:return e.next(4),!0}return!1}function ci(e,t,r){if(0===t)return!1;let n=0;const o=Math.min(t,515),s=Math.min(o,512);if(t>=3&&239===e[0]&&187===e[1]&&191===e[2])return!1;if(t>=4&&0===e[0]&&0===e[1]&&254===e[2]&&255===e[3])return!1;if(t>=4&&255===e[0]&&254===e[1]&&0===e[2]&&0===e[3])return!1;if(t>=4&&132===e[0]&&49===e[1]&&149===e[2]&&51===e[3])return!1;if(o>=5&&"%PDF-"===e.slice(0,5).toString())return!0;if(t>=2&&254===e[0]&&255===e[1])return!1;if(t>=2&&255===e[0]&&254===e[1])return!1;if(r?.encoding)return!oi(e,t,r.encoding);const i=function(e,t){if(t<4)return null;const r=Math.min(t,512);let n=0,o=0;for(let t=0;t<r;t++)0===e[t]&&(t%2==0?n++:o++);const s=n+o;if(s>.3*r&&s<.7*r){if(o>3*n)return"utf-16le";if(n>3*o)return"utf-16be"}return null}(e,t);if(i)return!oi(e,t,i);for(let t=0;t<s;t++){if(0===e[t])return!0;if((e[t]<7||e[t]>14)&&(e[t]<32||e[t]>127)){if(e[t]>=192&&e[t]<=223&&t+1<o){if(t++,e[t]>=128&&e[t]<=191)continue}else if(e[t]>=224&&e[t]<=239&&t+2<o){if(t++,e[t]>=128&&e[t]<=191&&e[t+1]>=128&&e[t+1]<=191){t++;continue}}else if(e[t]>=240&&e[t]<=247&&t+3<o&&(t++,e[t]>=128&&e[t]<=191&&e[t+1]>=128&&e[t+1]<=191&&e[t+2]>=128&&e[t+2]<=191)){t+=2;continue}if(n++,t>=32&&100*n/s>10)return!0}}return 100*n/s>10||!!(n>1&&function(e,t){const r=new si(e,t);let n=0;for(;;){if(!ai(r)&&!r.hasError())return!1;if(r.hasError())break;n++}return n>0}(e,s))}var li=[/^\/$/,/^\*+$/,/^[0-9]+$/],ui=["/artifact/","https://","http://","*********"],di=new Set(["sha1","_sha1","pageref","downloadsPath","tracesDir","pageId"]);function pi({sensitiveValues:e,str:t}){return e.reduce((e,t)=>e.replaceAll(t,"[REDACTED]"),t)}function fi({sensitiveValues:e,value:t}){return"string"==typeof t?pi({sensitiveValues:e,str:t}):Array.isArray(t)?t.map(t=>fi({sensitiveValues:e,value:t})):function(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}(t)?gi({obj:t,sensitiveValues:e}):t}function hi(e){return!!di.has(e)||e.toLowerCase().endsWith("sha1")}function gi({obj:e,sensitiveValues:t}){return Object.fromEntries(Object.entries(e).map(([e,r])=>[e,hi(e)?r:fi({sensitiveValues:t,value:r})]))}function mi({error:e,sensitiveValues:t}){return e?{...e,message:pi({sensitiveValues:t,str:e.message})}:void 0}function yi({content:e,sensitiveValues:t}){const r=new D,n=new O,o=pi({sensitiveValues:t,str:r.decode(e)});return n.encode(o)}var bi=L(function(e,t,r){r||(r=t,t={}),"function"!=typeof r&&Es(7);var n=[],o=function(){for(var e=0;e<n.length;++e)n[e]()},s={},i=function(e,t){ni(function(){r(e,t)})};ni(function(){i=r});for(var a=e.length-22;101010256!=zs(e,a);--a)if(!a||e.length-a>65558)return i(Es(13,0,1),null),o;var c=Vs(e,a+8);if(c){var l=c,u=zs(e,a+16),d=4294967295==u||65535==l;if(d){var p=zs(e,a-12);(d=101075792==zs(e,p))&&(l=c=zs(e,p+32),u=zs(e,p+48))}for(var f=t&&t.filter,h=function(t){var r=function(e,t,r){var n=Vs(e,t+28),o=function(e,t){if(t){for(var r="",n=0;n<e.length;n+=16384)r+=String.fromCharCode.apply(null,e.subarray(n,n+16384));return r}if(Zs)return Zs.decode(e);var o=function(e){for(var t="",r=0;;){var n=e[r++],o=(n>127)+(n>223)+(n>239);if(r+o>e.length)return{s:t,r:ws(e,r-1)};o?3==o?(n=((15&n)<<18|(63&e[r++])<<12|(63&e[r++])<<6|63&e[r++])-65536,t+=String.fromCharCode(55296|n>>10,56320|1023&n)):t+=1&o?String.fromCharCode((31&n)<<6|63&e[r++]):String.fromCharCode((15&n)<<12|(63&e[r++])<<6|63&e[r++]):t+=String.fromCharCode(n)}}(e),s=o.s;return(r=o.r).length&&Es(8),s}(e.subarray(t+46,t+46+n),!(2048&Vs(e,t+8))),s=t+46+n,i=zs(e,t+20),a=r&&4294967295==i?function(e,t){for(;1!=Vs(e,t);t+=4+Vs(e,t+2));return[Ws(e,t+12),Ws(e,t+4),Ws(e,t+20)]}(e,s):[i,zs(e,t+24),zs(e,t+42)],c=a[0],l=a[1],u=a[2];return[Vs(e,t+10),c,l,o,s+Vs(e,t+30)+Vs(e,t+32),u]}(e,u,d),a=r[0],l=r[1],p=r[2],h=r[3],g=r[4],m=r[5],y=function(e,t){return t+30+Vs(e,t+26)+Vs(e,t+28)}(e,m);u=g;var b=function(e,t){e?(o(),i(e,null)):(t&&(s[h]=t),--c||i(null,s))};if(!f||f({name:h,size:l,originalSize:p,compression:a}))if(a)if(8==a){var v=e.subarray(y,y+l);if(p<524288||l>.8*p)try{b(null,Js(v,{out:new Wo(p)}))}catch(e){b(e,null)}else n.push(function(e,t,r){return r||(r=t,t={}),"function"!=typeof r&&Es(7),Ys(e,t,[Ms],function(e){return Gs(Js(e.data[0],Fs(e.data[1])))},1,r)}(v,{size:p},b))}else b(Es(14,"unknown compression type "+a,1),null);else b(null,ws(e,y,y+l));else b(null,null)},g=0;g<l;++g)h()}else i(null,{});return o}),vi=L(function(e,t,r){r||(r=t,t={}),"function"!=typeof r&&Es(7);var n={};Xs(e,"",n,t);var o=Object.keys(n),s=o.length,i=0,a=0,c=s,l=new Array(s),u=[],d=function(){for(var e=0;e<u.length;++e)u[e]()},p=function(e,t){ni(function(){r(e,t)})};ni(function(){p=r});var f=function(){var e=new Wo(a+22),t=i,r=a-i;a=0;for(var n=0;n<c;++n){var o=l[n];try{var s=o.c.length;ri(e,a,o,o.f,o.u,s);var u=30+o.f.length+ti(o.extra),d=a+u;e.set(o.c,d),ri(e,i,o,o.f,o.u,s,a,o.m),i+=16+u+(o.m?o.m.length:0),a=d+s}catch(e){return p(e,null)}}!function(e,t,r,n,o){Ks(e,t,101010256),Ks(e,t+8,r),Ks(e,t+10,r),Ks(e,t+12,n),Ks(e,t+16,o)}(e,i,l.length,r,t),p(null,e)};s||f();for(var h=function(e){var t=o[e],r=n[t],c=r[0],h=r[1],g=function(){var e=-1;return{p:function(t){for(var r=e,n=0;n<t.length;++n)r=Os[255&r^t[n]]^r>>>8;e=r},d:function(){return~e}}}(),m=c.length;g.p(c);var y=ei(t),b=y.length,v=h.comment,w=v&&ei(v),_=w&&w.length,E=ti(h.extra),I=0==h.level?0:8,T=function(r,n){if(r)d(),p(r,null);else{var o=n.length;l[e]=Ns(h,{size:m,crc:g.d(),c:n,f:y,m:w,u:b!=t.length||w&&v.length!=_,compression:I}),i+=30+b+E+o,a+=76+2*(b+E)+(_||0)+o,--s||f()}};if(b>65535&&T(Es(11,0,1),null),I)if(m<16e4)try{T(null,qs(c,h))}catch(e){T(e,null)}else u.push(function(e,t,r){return r||(r=t,t={}),"function"!=typeof r&&Es(7),Ys(e,t,[Hs],function(e){return Gs(qs(e.data[0],e.data[1]))},0,r)}(c,h,T));else T(null,c)},g=0;g<c;++g)h(g);return d});async function wi({content:e,filename:t,sensitiveValues:r}){const n=t.toLowerCase();return n.endsWith(".trace")||n.endsWith(".network")?function({content:e,sensitiveValues:t}){const r=new D,n=new O,o=r.decode(e).split("\n").map(e=>{if(!e.trim())return e;try{const r=function({event:e,sensitiveValues:t}){return j(e).with({type:"console"},e=>({...e,args:e.args?.map(e=>({...e,preview:pi({sensitiveValues:t,str:e.preview}),value:fi({sensitiveValues:t,value:e.value})})),text:pi({sensitiveValues:t,str:e.text})})).with({type:"before"},e=>({...e,params:gi({obj:e.params,sensitiveValues:t}),title:e.title?pi({sensitiveValues:t,str:e.title}):void 0})).with({type:"after"},e=>({...e,error:mi({error:e.error,sensitiveValues:t}),result:void 0!==e.result?fi({sensitiveValues:t,value:e.result}):void 0})).with({type:"action"},e=>({...e,error:mi({error:e.error,sensitiveValues:t}),params:gi({obj:e.params,sensitiveValues:t}),result:void 0!==e.result?fi({sensitiveValues:t,value:e.result}):void 0,title:e.title?pi({sensitiveValues:t,str:e.title}):void 0})).with({type:"event"},e=>({...e,params:gi({obj:e.params,sensitiveValues:t})})).with({type:"stdout"},{type:"stderr"},e=>({...e,text:void 0!==e.text?pi({sensitiveValues:t,str:e.text}):void 0})).with({type:"error"},e=>({...e,message:pi({sensitiveValues:t,str:e.message})})).with({type:"log"},e=>({...e,message:pi({sensitiveValues:t,str:e.message})})).with({type:"context-options"},e=>({...e,options:gi({obj:e.options,sensitiveValues:t}),title:e.title?pi({sensitiveValues:t,str:e.title}):void 0})).with({type:"frame-snapshot"},e=>({...e,snapshot:gi({obj:e.snapshot,sensitiveValues:t})})).with({type:"resource-snapshot"},e=>({...e,snapshot:gi({obj:e.snapshot,sensitiveValues:t})})).with({type:"screencast-frame"},{type:"input"},e=>e).exhaustive()}({event:JSON.parse(e),sensitiveValues:t});return JSON.stringify(r)}catch{return pi({sensitiveValues:t,str:e})}});return n.encode(o.join("\n"))}({content:e,sensitiveValues:r}):n.endsWith(".html")||n.endsWith(".dat")||n.endsWith(".json")?yi({content:e,sensitiveValues:r}):n.startsWith("resources/")?async function({content:e,sensitiveValues:t}){return function(e){return function(e,t){if(function(e){return"string"==typeof e}(e)){!function(e){if(!e.isFile())throw new Error("Path provided was not a file!")}(m(e));const r=E(e,"r"),n=Buffer.alloc(515),o=I(r,n,0,515,0);return T(r),ci(n,o,t)}return ci(e,void 0!==t?.size?t.size:e.length,t)}(Buffer.from(e),{size:e.length})}(e)?e:yi({content:e,sensitiveValues:t})}({content:e,sensitiveValues:r}):e}function _i(e=process.cwd()){let t=n(e);for(;;){const e=Ei(t);if(e){const r={...e.dependencies,...e.devDependencies},n="@playwright/test"in r?"@playwright/test":"playwright"in r?"playwright":void 0;if(n){const e=Ii(t);let r=!1,i=t;for(;;){const e=s(i,"node_modules"),t=s(e,n);if(g(t)){r=!0;break}const a=o(i);if(a===i)break;i=a}return{inNodeModules:r,installed:!0,packageManager:e,packageName:n}}}const r=o(t);if(r===t)return{inNodeModules:!1,installed:!1,packageManager:void 0};t=r}}function Ei(e){const t=s(e,"package.json");let r;try{r=b(t,"utf-8")}catch{return}try{return JSON.parse(r)}catch{return}}function Ii(e){const t=[["npm","package-lock.json"],["pnpm","pnpm-lock.yaml"],["yarn","yarn.lock"]];let r=e;for(;;){for(const[e,n]of t)if(g(s(r,n)))return e;const e=o(r);if(e===r)return;r=e}}function Ti(e){if("npm"===e||"pnpm"===e)return["npx","playwright"];if("yarn"===e)return["yarn","playwright"];throw new Error("Package manager not supported")}var xi=e=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),Si=e=>(e instanceof Error?e.message:String(e)).slice(0,400),Ai=({outputDir:e,representativeTest:t})=>{const r=["test","--trace=on","--workers=1","--retries=0","--output",e];return t.filePath&&r.push(t.filePath),t.testTitle?r.push("--grep",xi(t.testTitle)):t.testIdentifier&&r.push("--grep",`^${xi(t.testIdentifier)}$`),r},Ci=async e=>{const t=await q(e,{withFileTypes:!0}),n=[];for(const o of t){const t=r.join(e,o.name);if(o.isDirectory())n.push(...await Ci(t));else if(o.isFile()&&"trace.zip"===o.name){const e=await J(t);n.push({path:t,mtimeMs:e.mtimeMs})}}return n},{zSuiteAutoHealReport:Ri,zRepresentativeTest:Pi}=function(e){const t=e.enum(jo),r=["Classification of the root cause:","",`- test: ${Ho("test")}`,`- bug: ${Ho("bug")}`,`- flake: ${Ho("flake")}`,`- ui_change: ${Ho("ui_change")}`,`- other: ${Ho("other")}`].join("\n"),n=e.object({filePath:e.string().optional(),testIdentifier:e.string().optional(),testTitle:e.string().optional()}),o=e.object({status:e.enum(["captured","capture_failed","upload_failed"]),representativeTest:n,storage:e.object({bucket:e.string(),key:e.string()}).optional(),signedUrl:e.string().optional(),error:e.string().optional()}),s=o.extend({testCaseId:e.string().min(1).describe("Test case ID this trace proof corresponds to.")}),i=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 (must be existing IDs only)."),rootCause:e.string().describe("Brief explanation of what happened (1-2 sentences). Include file:line references (e.g., `src/tests/login.spec.ts:42`) to back up your claim."),traceProofs:e.array(s).min(1).optional().describe("Per-test trace proofs for each testCaseId in this issue.")}),a=e.discriminatedUnion("result",[i.extend({fixApplied:e.string().describe("What fix was applied (brief, specific). Include file:line references (e.g., `src/tests/login.spec.ts:42`) showing where changes were made."),result:e.literal("fixed"),traceProof:o.optional()}),i.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). Include file:line references (e.g., `src/tests/login.spec.ts:42`) pointing to the problematic code."),result:e.literal("unfixed")})]);return{zAutoHealReport:a,zIssueCategory:t,zRepresentativeTest:n,zSuiteAutoHealReport:e.object({issues:e.array(a).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.")}),zTraceProof:o,zTraceProofByTest:s}}(pe),Ui=({authHeader:e,diffTracker:t,orgId:n,runId:o,workingDir:s})=>B({name:"auto-heal-report",tools:[N("capture-trace-proof",["Capture and upload a Playwright trace proof for a test case.","","MANDATORY: Call for EVERY testCaseId in your issue, whether fixed or unfixed.","- Fixed: Trace proves the fix works","- Unfixed: Trace shows the failure state for auditability","","Pass testCaseId and call once per test case.","testCaseId is for per-test mapping/storage metadata; representativeTest selects the runnable test."].join("\n"),{issueId:pe.string().min(1).describe("Issue identifier for deterministic output paths and storage key naming."),proofId:pe.string().min(1).optional().describe("Optional id for deterministic proof naming and deduplication."),representativeTest:Pi.optional().default({}),testCaseId:pe.string().min(1).optional().describe("Optional test case ID when capturing per-test trace proofs.")},async({issueId:t,proofId:i,representativeTest:a,testCaseId:c})=>{const l=pe.string().min(1).parse(t),u=null==i?void 0:pe.string().min(1).parse(i),d=null==c?void 0:pe.string().min(1).parse(c),f=await(async({authHeader:e,issueId:t,orgId:n,proofId:o,representativeTest:s,runId:i,testCaseId:a,workingDir:c})=>{if(!(e=>null!=e.filePath||null!=e.testTitle||null!=e.testIdentifier)(s))return{status:"capture_failed",representativeTest:s,error:"Representative test info is missing (need filePath, testTitle, or testIdentifier)."};const l=_i(c);if(!l.installed||!l.inNodeModules||!l.packageManager)return{status:"capture_failed",representativeTest:s,error:"Playwright is not installed in the current workspace."};const u=(e=>Fo(e)??"issue")(t),d=(({proofId:e,testCaseId:t})=>Yo(t)??Yo(e))({testCaseId:a,proofId:o}),f=r.join(c,".stably","autoheal-proof",u,d??"issue"),[h,...g]=Ti(l.packageManager),m=[...g,...Ai({outputDir:f,representativeTest:s})];try{await X(f,{force:!0,recursive:!0}),await V(f,{recursive:!0});const{code:r,stderr:l,timedOut:u}=await(async({args:e,command:t,cwd:r,env:n,timeoutMs:o})=>await new Promise((s,i)=>{const a=p(t,e,{cwd:r,env:n??process.env,stdio:["ignore","ignore","pipe"]});let c="",l=!1;a.stderr.on("data",e=>{c+=e.toString()});const u=setTimeout(()=>{l=!0,a.kill("SIGTERM")},o);a.on("error",e=>{clearTimeout(u),i(e)}),a.on("close",e=>{clearTimeout(u),s({code:e,stderr:c,timedOut:l})})}))({args:m,command:h,cwd:c,env:{...process.env,STABLY_INTERNAL_DISABLE_REPORTING:"1"},timeoutMs:3e5});if(u)return{status:"capture_failed",representativeTest:s,error:"Trace proof run timed out while executing Playwright verification."};if(0!==r)return{status:"capture_failed",representativeTest:s,error:`Trace proof run failed (exit code ${r??"unknown"}): ${l.trim().slice(0,280)}`};const d=await(async e=>{const t=await Ci(e);if(0!==t.length)return t.sort((e,t)=>t.mtimeMs-e.mtimeMs),t[0]?.path})(f);if(!d)return{status:"capture_failed",representativeTest:s,error:"Trace proof run completed, but no trace.zip was produced."};const{traceBucketPath:g,uploadUrl:b,sensitiveValues:v}=await(async({authHeader:e,issueId:t,proofId:r,testCaseId:n,contentType:o="application/zip",orgId:s,runId:i})=>{const a=await(c={auth:e,body:{contentType:o,issueId:t,proofId:r,testCaseId:n},client:qr(),headers:Kn(s),path:{runId:i}},(c.client??jr).post({security:[{scheme:"bearer",type:"http"}],url:"/internal/v1/cli/runs/{runId}/autoheal-trace/upload-url",...c,headers:{"Content-Type":"application/json",...c.headers}}));var c;if(a.error)throw new Error(`Failed to presign trace upload (${a.response.status})`);const l=Qn.parse(a.data);return{traceBucketPath:l.traceBucketPath,expiresInSeconds:l.expiresInSeconds,key:l.key,uploadUrl:l.uploadUrl,sensitiveValues:l.sensitiveValues}})({authHeader:e,issueId:t,proofId:o,orgId:n,runId:i,testCaseId:a}),w=await async function({tracePath:e,sensitiveValues:t}){const r=[],n=y(e);for await(const e of n)r.push(e);return async function({sensitiveValues:e,traceBuffer:t}){const r=e.filter(e=>!(e.length<3||li.some(t=>t.test(e))||ui.some(t=>e.includes(t))));if(0===r.length)return new Uint8Array(t);const n=[...r].sort((e,t)=>t.length-e.length),o=await bi(new Uint8Array(t)),s=Object.entries(o),i=await Promise.all(s.map(async([e,t])=>[e,await wi({content:t,filename:e,sensitiveValues:n})])),a=Object.fromEntries(i);return vi(a)}({traceBuffer:new Uint8Array(Buffer.concat(r)),sensitiveValues:t})}({tracePath:d,sensitiveValues:v});try{await(async({contentType:e="application/zip",traceBuffer:t,uploadUrl:r})=>{const n=await fetch(r,{body:Buffer.from(t),headers:{"Content-Type":e},method:"PUT"});if(!n.ok)throw new Error(`Failed to upload trace (${n.status})`)})({traceBuffer:w,uploadUrl:b})}catch(e){return{status:"upload_failed",representativeTest:s,error:Si(e)}}return{status:"captured",representativeTest:s,storage:g}}catch(e){return{status:"capture_failed",representativeTest:s,error:Si(e)}}})({authHeader:e,issueId:l,orgId:n,proofId:u,representativeTest:Pi.parse(a??{}),runId:o,testCaseId:d,workingDir:s}),h="string"==typeof d?{testCaseId:d,...f}:f;return{content:[{text:JSON.stringify(h),type:"text"}]}}),N("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:Ri},async({report:r})=>{const s=await t.computeDiff(),i=(e=>{if(!e||"object"!=typeof e)return e;const t=e;if(!Array.isArray(t.issues))return e;const r=t.issues.map(e=>{if(!e||"object"!=typeof e)return e;const t=e;if("fixed"!==t.result||null!=t.traceProof||!Array.isArray(t.traceProofs))return e;const[r]=t.traceProofs;if(!r||"object"!=typeof r)return e;const n={...r};return delete n.testCaseId,{...t,traceProof:n}});return{...t,issues:r}})(r),a=Ri.parse(i);try{await(async({authHeader:e,orgId:t,report:r,runId:n})=>{const o=await(s={auth:e,body:{report:JSON.stringify(r)},client:qr(),headers:Kn(t),path:{runId:n}},(s.client??jr).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:n,report:a,runId:o});const{diffBucketPath:t,uploadUrl:r}=await Zn({authHeader:e,contentType:"text/plain",orgId:n,runId:o});await eo({contentType:"text/plain",diff:s,uploadUrl:r}),await to({authHeader:e,diffBucketPath:t,orgId:n,runId:o})}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. ${e instanceof Error?e.message:String(e)} 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"}),ki=({onComplete:e,onRestartRequested:t})=>B(e?{name:"session-control",tools:[N("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:pe.string().describe("A brief summary of what was accomplished")},({summary:t})=>{const r="string"==typeof t?t:String(t);return e(),Promise.resolve(`Session complete: ${r}`)})]}:{name:"stably-agent-control",version:"1.0.0",tools:[N("restart_mcp_servers",'Restart the MCP servers to reinitialize browser tools after dependency changes.\n\nWHEN TO USE:\n- After installing or updating @playwright/test to version 1.56.x\n- When browser tools fail due to version mismatch errors\n- When the user has fixed a dependency issue and you need to reinitialize\n\nIMPORTANT: The restart happens at the END of your current turn.\n- Do NOT call any browser tools (setup_page, navigate, etc.) after this tool in the same turn - they will use the OLD servers\n- After calling this tool, END your turn naturally (no more tool calls)\n- The system will automatically continue in a new turn once the tools are restarted\n- Do NOT ask the user to reply again just to resume (only ask if you truly need additional input)\n\nEnd your turn briefly. You may say something like:\n- "Restarting browser tools now…"\n- "Tools are restarting to pick up the dependency changes…"',{},()=>(t(),Promise.resolve({content:[{type:"text",text:"MCP servers are being restarted. Browser tools will be reinitialized."}]})))]}),Li=pe.object({commentUrl:pe.string()}),Di=({prContext:e,authHeader:t,orgId:r,onReportPosted:n})=>B({name:"create-report",tools:[N("post_create_report",`Post a test creation report as a GitHub comment on PR #${e.prNumber}.\nCall this tool at the end of test creation to summarize what was created.\nThe report will be posted to: ${e.prUrl}\n\nWHEN TO USE:\n- After you have finished creating test files\n- To provide a summary of the tests created on the PR for visibility\n\nThe report will include:\n- A list of all test files created\n- Your summary of what was tested`,{summary:pe.string().describe("A summary of the tests created. Include what features/flows are tested and any important notes."),filesCreated:pe.array(pe.string()).describe("List of test file paths that were created (relative to workspace root)")},async({summary:o,filesCreated:s})=>{const i=Array.isArray(s)?s:[];$n.info("[create-report] Posting report to GitHub PR",{prNumber:e.prNumber,filesCount:i.length});try{const s={summary:"string"==typeof o?o:String(o),filesCreated:i.map(String)},a=await async function({authHeader:e,orgId:t,prNumber:r,owner:n,repo:o,report:s}){const i=new URL("/internal/v1/cli/create-report",Hr).toString(),a={Authorization:e,"Content-Type":"application/json"};t&&(a["x-stably-org-id"]=t),$n.debug("Posting create report to GitHub",{prNumber:r,owner:n,repo:o,filesCount:s.filesCreated.length});const c=await fetch(i,{method:"POST",headers:a,body:JSON.stringify({prNumber:r,owner:n,repo:o,report:s}),signal:AbortSignal.timeout(3e4)});if(!c.ok){const e=await c.text().catch(()=>"");throw $n.error("Failed to post create report",{status:c.status,error:e.slice(0,500)}),new Error(`Failed to post create report: ${c.status} ${e.slice(0,200)}`)}const l=Li.parse(await c.json());return $n.info("Create report posted successfully",{commentUrl:l.commentUrl}),l}({authHeader:t,orgId:r,prNumber:e.prNumber,owner:e.owner,repo:e.repo,report:s});return n?.(a),$n.info("[create-report] Report posted successfully",{commentUrl:a.commentUrl}),{content:[{type:"text",text:`✅ Test creation report posted to PR #${e.prNumber}\n\nView the comment: ${a.commentUrl}`}]}}catch(e){const t=e instanceof Error?e.message:String(e);return $n.error("[create-report] Failed to post report",{error:t}),{content:[{type:"text",text:`❌ Failed to post report to GitHub: ${t}\n\nThe tests were still created successfully, but the PR comment could not be posted.`}],isError:!0}}})]}),Oi=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]"),Bi=(e,t)=>({message:Oi(e),status:t?.status,statusText:t?.statusText}),Ni=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"]),$i=async({authHeader:e,mode:t,maxTurnsOverride:r})=>{const n=qr();$n.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??jr).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 $n.warn("Subagent definitions fetch failed: unauthorized (401)"),await dn(),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 $n.warn("Subagent definitions fetch failed: forbidden (403)"),await dn(),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 $n.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 $n.debug("Subagent definitions received",{count:Object.keys(i).length}),i},ji=r.dirname(S(import.meta.url)),Mi=r.join(".claude-plugin","plugin.json"),Hi=[r.join("packages","agent-plugin","stably-plugin"),r.join("agent-plugin","stably-plugin")];function Gi(e){return g(r.join(e,Mi))}var{zStablyYaml:Fi}=function(e){const t=e.object({cron:e.string(),stablyTestArgs:e.string().optional(),timezone:e.string().optional(),command:e.string().optional()}),r=e.object({maxTurnsPerIssue:e.number().int().positive().optional(),maxParallelWorkers:e.number().int().positive().optional(),rules:e.string().optional(),skipAfterConsecutiveUnfixed:e.number().int().positive().optional()}),n=e.object({fix:r.optional()}),o=e.object({setupScript:e.string().optional()});return{zStablyYaml:e.object({schedules:e.record(e.string(),t).optional(),agent:n.optional(),cloud:o.optional()}),zAgentConfig:n,zAgentFixConfig:r,zScheduleEntry:t,zCloudConfig:o}}(ae),Yi=async(e,t)=>{try{const r=await tn(e,t);if(!r)return void $n.debug(`No ${t} found`);const n=await Y(r,"utf-8");if(!n.trim())return;return n.length>1e4?($n.warn(`${t} exceeds max length (${n.length} > 10000), truncating`,{path:r}),{content:n.slice(0,1e4),path:r}):($n.debug(`Loaded ${t} rules`,{path:r,contentLength:n.length}),{content:n,path:r})}catch(e){return void $n.warn(`Failed to read ${t}`,{error:e})}},Vi=["Bash","Read","Write","Edit","Glob","Grep","Task","Skill"],zi=["Task","mcp__playwright-test","Skill"],Wi=["Bash","Read","Write","Edit","Glob","Grep","mcp__session-control"],Ki=e=>{if("EPIPE"!==e.code)throw e},qi="__main__",Ji=e=>"mcp__auto-heal-report__generate-report"===e;async function Xi(e,t){return!!e&&(!!e.hasQueuedMessages()||new Promise(r=>{const n=setTimeout(()=>{clearInterval(o),r(!1)},t),o=setInterval(()=>{e.hasQueuedMessages()&&(clearTimeout(n),clearInterval(o),r(!0))},200)}))}var Qi=async e=>{if("single"===e.mode){const t=Array.isArray(e.prompt)?e.prompt.join(" "):e.prompt;$n.initSession(t||"create-from-diff")}else"fix"===e.mode&&$n.initSession(`fix-${e.runId}`);$n.info("Agent session starting",{mode:e.mode}),process.stdout.on("error",Ki),process.stderr.on("error",Ki);const i=e=>{if("EPIPE"!==e.code)throw e};process.on("uncaughtException",i),$n.debug("Checking authentication");const a=await Yn({autoLogin:"chat"===e.mode||"init"===e.mode}),c=(e=>"env"===e.type?e.auth.apiKey:e.auth.accessToken)(a);$n.debug("Authentication resolved",{authType:a.type});const l="oauth"===a.type?a.auth.context.orgId:void 0,u=r.resolve(process.cwd()),d=r.join(u,".env"),p=h.existsSync(d)&&h.statSync(d).isFile(),f=p?t(h.readFileSync(d,"utf8")):{};$n.debug("Environment file",{path:d,exists:p,variableCount:Object.keys(f).length});const m="chat"!==e.mode&&"init"!==e.mode,y="chat"===e.mode;let b=new vo;const v="chat"===e.mode?e.getHelpText:void 0,w={log:[],promptDisplay:j(e).with({mode:"chat"},()=>"Ask Stably to build tests for you").with({mode:"init"},()=>"Setting up Playwright and Stably SDK").with({mode:"fix"},()=>"Fixing broken tests").with({mode:"single"},e=>{const t=(Array.isArray(e.prompt)?e.prompt.join(" "):e.prompt)?.trim();return t||"Creating tests from PR/branch changes"}).exhaustive(),status:"running"};let _,E,I,T,x=m,S=!1,A=!1,C=0,R=0,P=!1;const U=[];let k,L,D=[],O=!1,B=!1,N=0;const H=new Map;let F=null,V=!1,z=!1;const W=Date.now();let K,q="fix"===e.mode?{suiteId:e.runId,phase:"initializing",totalTests:null,fixedTests:0,failedTests:0,currentTestDescription:null,lastTestDescription:null,startedAt:W,endedAt:null,isError:!1,updatedAt:W,recentActivity:[],workers:[{id:qi,testDescription:"Orchestrator",workerType:"main",status:"running",summary:null,startedAt:W,endedAt:null,activity:[]}]}:null;const J=new Set,X=(e,t)=>{if(!q)return;const r=q.workers.map(r=>{if(r.id!==e)return r;const n=[...r.activity,{...t,timestamp:Date.now()}].slice(-15);return{...r,activity:n}});ee({workers:r})},Q=e=>{if(!q)return;const t=[...q.recentActivity,{...e,timestamp:Date.now()}].slice(-10);ee({recentActivity:t})},Z=e=>(q?.workers??[]).map(t=>t.id===qi?{...t,status:e?"failed":"succeeded",endedAt:t.endedAt??Date.now()}:"running"===t.status?{...t,status:"failed",endedAt:Date.now()}:t),ee=e=>{q&&!K?.isClosed&&(q={...q,...e,updatedAt:Date.now()},K?.sendProgress(q))},te=async t=>{if("fix"===e.mode){if("STARTED"===t){if(V)return;V=!0}else{if(z)return;z=!0}try{await(async({authHeader:e,orgId:t,runId:r,status:n})=>{const o=await(s={auth:e,body:{status:n},client:qr(),headers:Kn(t),path:{runId:r}},(s.client??jr).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:c,orgId:l,runId:e.runId,status:t})}catch{}}},re="single"===e.mode,ne=Date.now();let oe,se=null;const ie=e=>{se&&!oe?.isClosed&&(se={...se,...e,updatedAt:Date.now()},oe?.sendProgress(se))},ae=e=>{if(!se)return;const t=[...se.recentActivity,{...e,timestamp:Date.now()}].slice(-10);ie({recentActivity:t})};if(re||"fix"===e.mode)try{const t=new URL("/internal/v1/cli/progress",Hr).toString(),r={Authorization:c,"Content-Type":"application/json"};l&&(r["x-stably-org-id"]=l);const n="single"===e.mode?"create":"fix",o=await fetch(t,{method:"POST",headers:r,body:JSON.stringify({mode:n,projectId:Vn(a),agentId:M.randomUUID(),..."fix"===e.mode?{playwrightSuiteRunId:e.runId}:{}}),signal:AbortSignal.timeout(1e4)});if(o.ok){const{sessionId:t}=await o.json();if(re){const r="single"===e.mode?Array.isArray(e.prompt)?e.prompt.join(" "):e.prompt:null,n=wo(u);se={sessionId:t,phase:"initializing",startedAt:ne,endedAt:null,isError:!1,updatedAt:ne,currentActivity:null,filesCreated:[],recentActivity:[],prompt:r||null,environment:{gitBranch:n?.branch??null,workingDirectory:u,nodeVersion:process.version,cliVersion:Mr}},oe=new no({authHeader:c,orgId:l,sessionId:t,onUserMessage:e=>{b&&($n.info("[ws] Injecting web UI message into agent",{contentLength:e.length}),ae({type:"user_message",summary:e}),Ie({text:`[Web] ${e}`}),b.pushText(`[Message from web UI user]: ${e}`),x||(x=!0,Ue({status:"running"})))}}),oe.start(),ie({phase:"initializing"})}$n.info(`[${n}] Progress session created`,{sessionId:t})}else{const e=await o.text().catch(()=>"");$n.warn(`[${n}] Failed to create progress session: ${o.status} ${t} — ${e.slice(0,300)}`)}}catch(e){const t=e instanceof Error?e.message:String(e);$n.warn(`[progress] Session creation failed (non-fatal): ${t}`)}const ce={current:e=>{}},le={current:async()=>{}},{addSubagentActivity:ue,addSubagentStart:de,addTool:pe,addToolResult:fe,appendText:_e,appendUserMessage:Ie,cleanup:Te,setExiting:xe,setRunningLabel:Se,setStatus:Ae,setSubagentStatus:Ce,updateFixProgress:Re}=await(async(e,t)=>{const{Box:r,Static:n,Text:o,render:s,useInput:i}=await import("ink"),a=!!process.stdin.isTTY,c=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],l=()=>ve(o,{inverse:!0,children:" "}),u=(({Box:e,Text:t,useInput:r},n,o)=>function({onChoice:s,prompt:i}){const[a,c]=he(0),[l,u]=he(!1),[d,p]=he(""),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=$o(i.toolName),g=No(i.toolName,i.input);return we(e,{borderColor:"yellow",borderStyle:"round",flexDirection:"column",marginTop:1,paddingX:1,paddingY:0,children:[ve(t,{bold:!0,color:"yellow",children:"Permission Required"}),we(e,{flexDirection:"column",marginTop:1,children:[ve(t,{color:"magenta",children:h}),null!=g&&we(t,{color:"gray",children:[" ",g]})]}),null!=i.decisionReason&&ve(e,{marginTop:1,children:we(t,{color:"gray",children:["Reason: ",i.decisionReason]})}),we(e,l?{flexDirection:"column",marginTop:1,children:[ve(t,{color:"gray",children:"Enter message for AI (press Enter to submit, Esc to cancel):"}),we(t,{children:[ve(t,{color:"yellow",children:">"})," ",d,ve(n,{})]})]}:{flexDirection:"column",marginTop:1,children:[ve(t,{color:"gray",children:"Use ↑↓ arrows or number keys to select:"}),f.map((e,r)=>ve(t,{children:we(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=({progress:e})=>{const[r,o]=he(Date.now());me(()=>{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:u,color:d}={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 ve(t,{flexDirection:"column",children:we(n,{children:[ve(n,{color:d,bold:!0,children:u}),ve(n,{color:"gray",children:f}),we(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 we(t,{flexDirection:"column",children:[we(n,{color:c,bold:!0,children:[l," in ",a]}),null!==e.totalTests&&we(n,{color:"gray",children:[e.fixedTests,"/",e.totalTests," tests fixed",e.failedTests>0?`, ${e.failedTests} failed`:""]})]})},u=e=>{if("subagent"===e.kind&&e.subagent){const{subagent:r}=e,o="complete"===r.status?"green":"error"===r.status?"red":"yellow";return we(t,{flexDirection:"column",marginTop:1,children:[we(n,{children:[ve(n,{color:o,bold:!0,children:"Agent"}),r.description?we(n,{color:"gray",children:[" (",r.description,")"]}):null]}),r.activities.length>0&&ve(t,{flexDirection:"column",marginLeft:2,children:r.activities.map(e=>(e=>"tool"===e.kind?we(n,{color:"magenta",children:["• ",e.content]},e.id):"tool_result"===e.kind?ve(n,{color:"gray",children:e.content},e.id):null)(e))})]},e.id)}return"tool"===e.kind?we(n,{color:"magenta",children:["• ",e.content]},e.id):"tool_result"===e.kind?ve(n,{color:"gray",children:e.content},e.id):"user"===e.kind?we(n,{color:"cyan",children:["You: ",e.content]},e.id):ve(n,{children:e.content},e.id)},d="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:b,showSpinnerImmediately:v,state:w}){const[_,E]=he({value:"",cursor:0}),I=_.value,T=_.cursor,x=ge(!1),S=ge(void 0),[A,C]=he(!1),R=ge(0),P=w.log.at(-1),U="text"===P?.kind&&"running"===w.status,k=w.log.findIndex(e=>"subagent"===e.kind&&"running"===e.subagent?.status),L=d?0:-1!==k?k:U?w.log.length-1:w.log.length;me(()=>{w.log.length<R.current&&(R.current=0),L>R.current&&(R.current=L)},[w.log.length,L]);const D=w.log.slice(0,R.current),O=w.log.slice(R.current),B=!!w.permissionPrompt,N=ye(async()=>{x.current?(S.current&&clearTimeout(S.current),await(m?.()),process.exit(0)):(x.current=!0,C(!0),S.current=setTimeout(()=>{x.current=!1,C(!1)},2e3))},[m]);o((e,t)=>{t.ctrl&&"c"===e&&N().catch(()=>process.exit(1))},{isActive:s}),me(()=>{if(B||!b)return;const e=e=>{const t=e.toString();"[1;5H"!==t&&"[1;5~"!==t?"[1;5F"!==t&&"[4;5~"!==t?"[H"!==t&&"[1~"!==t&&"OH"!==t&&"[7~"!==t?"[F"!==t&&"[4~"!==t&&"OF"!==t&&"[8~"!==t||E(e=>({...e,cursor:g(e.value,e.cursor)})):E(e=>({...e,cursor:h(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)}},[B,b,I]),o((e,t)=>{if(!t.ctrl||"c"!==e){if(t.return){const e=I.trim();return e&&b?.(e),void E({value:"",cursor:0})}t.ctrl&&"w"===e||t.ctrl&&t.backspace?E(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?E(e=>({...e,cursor:p(e.value,e.cursor)})):t.ctrl&&t.rightArrow||t.meta&&"f"===e?E(e=>({...e,cursor:f(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&&!!b&&!B});const $=be(()=>"running"===w.status?ve(a,{label:w.runningLabel??"Working"}):"success"!==w.status?ve(n,{color:"red",children:"✖ Failed"}):void 0,[w.runningLabel,w.status]),j=!(v||!b||"running"!==w.status||0!==w.log.length||w.resultText||w.errorText),M="running"===w.status&&!j||w.log.length>0||w.resultText||w.errorText||"running"!==w.status;return we(t,{flexDirection:"column",children:[ve(r,{items:["header"],children:()=>we(t,{flexDirection:"column",flexShrink:0,children:[ve(n,{color:"cyan",bold:!0,children:"Stably Agent"}),ve(t,{flexDirection:"column",marginTop:1,children:ve(n,{color:"gray",children:w.promptDisplay})})]},"header")}),D.length>0&&ve(r,{items:D,children:e=>u(e)}),O.length>0&&ve(t,{flexDirection:"column",children:O.map(e=>u(e))}),"error"===w.status&&w.errorText&&ve(t,{marginTop:1,children:ve(n,{color:"red",children:w.errorText})}),"success"===w.status&&w.resultText&&ve(t,{marginTop:1,children:ve(n,{children:w.resultText})}),M&&ve(t,{flexDirection:"column",flexShrink:0,marginTop:1,children:"running"===w.status&&w.fixProgress?we(t,{flexDirection:"column",children:[we(t,{children:[ve(a,{}),ve(n,{children:" "}),ve(c,{progress:w.fixProgress})]}),"fixing"===w.fixProgress.phase&&w.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 we(t,{flexDirection:"column",children:[we(n,{children:[" ",ve(a,{}),we(n,{color:"gray",children:[r.description||"fix-worker",s>0?` (${s} ${1===s?"cycle":"cycles"})`:""]})]}),c&&we(n,{color:"gray",dimColor:!0,children:[" • ",c.content]}),l&&we(n,{color:"gray",dimColor:!0,children:[" ",l]})]},e.id)})]}):"success"!==w.status&&"error"!==w.status||!w.fixProgress?$:ve(l,{progress:w.fixProgress})}),null!=w.permissionPrompt&&null!=y&&ve(i,{onChoice:y,prompt:w.permissionPrompt}),null!=b&&null==w.permissionPrompt&&!w.isExiting&&we(t,{borderColor:"gray",borderStyle:"round",flexDirection:"column",flexShrink:0,marginTop:1,paddingX:1,paddingY:0,children:[ve(n,{color:"gray",children:"Type a message and press Enter. Press Ctrl+C to exit."}),we(n,{children:[ve(n,{color:"yellow",children:">"})," ",I.slice(0,T),ve(e,{}),I.slice(T)]})]}),A&&we(t,{marginTop:1,flexDirection:"column",children:[ve(n,{color:"yellow",children:"Press Ctrl+C again to exit"}),Sn&&we(n,{color:"gray",children:["Debug log: ",Pn]})]})]})}})({Cursor:l,inkComponents:{Box:r,Static:n,Text:o,useInput:i},isRawModeSupported:a,PermissionPrompt:u,Spinner:({label:e})=>{const[t,r]=he(0);return me(()=>{const e=setInterval(()=>r(e=>(e+1)%c.length),80);return()=>clearInterval(e)},[]),we(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(ve(d,{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(ve(d,{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=$o(e),n=No(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()},setRunningLabel:({label:e})=>{p.runningLabel=e,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}})(w,"chat"===e.mode||"init"===e.mode?{onExit:()=>le.current(),onSend:e=>ce.current(e),showSpinnerImmediately:"init"===e.mode}:"fix"===e.mode?{onExit:()=>le.current(),isFixMode:!0}:void 0);let Pe=w.status;const Ue=({error:e,result:t,status:r})=>{Pe=r,Ae({error:e,result:t,status:r})};let ke;ce.current=e=>{const t=e.trim();if(y&&!$n.getLogFilePath()&&$n.initSession(t||"chat"),$n.debug("User message",{text:t}),"/help"===t){x&&b&&(S=!0,_?.interrupt?.(),b.allowNextTurn(),x=!1),"running"===Pe&&Ue({status:"success"}),Ie({text:e});const t=v?.();return void _e({text:t??"Help is not available in this session."})}const r=I||A&&x;if(y&&(C+=1,T=void 0,r||(P=!1,Se({label:void 0}))),b){if(r)return Ue({status:"running"}),Ie({text:e}),void U.push(e);if(!A||x||I||(A=!1),x)return Ue({status:"running"}),Ie({text:e}),b.pushText(e),void(R+=1);Ue({status:"running"}),Ie({text:e}),b.pushText(e),x=!0}};const Le=[];let De;const Oe=await(async e=>{try{const t=await tn(e,"stably.yaml");if(!t)return void $n.debug("No stably.yaml found");const r=await Y(t,"utf-8");if(!r.trim())return;const n=Ee(r),o=Fi.parse(n.toJS()),s=o.agent?.fix?.maxTurnsPerIssue,i=o.agent?.fix?.maxParallelWorkers,a=!!o.agent?.fix?.rules;return $n.debug(`Loaded stably.yaml: maxTurnsPerIssue=${s??"default"}, maxParallelWorkers=${i??"default"}, hasRules=${a}`,{path:t,config:o.agent}),o}catch(e){return void $n.warn("Failed to parse stably.yaml",{error:e})}})(u),Be=Oe?.agent?.fix?.skipAfterConsecutiveUnfixed,Ne=await(async()=>{if("single"===e.mode){const r=await async function(e,t){const r=n(e);if(t){const e=n(r,t);return Uo(e,"output-flag"),{path:e,source:"output-flag"}}const i=Co(r);if(i){const e=await async function(e){try{const t=(await Y(e,"utf-8")).match(/testDir:\s*['"]([^'"]+)['"]/);return t?.[1]}catch{return}}(i);if(e){const t=n(o(i),e);if(Po(t))return Uo(t,"playwright.config.ts"),{path:t,source:"playwright.config.ts"}}}for(const e of Ro){const t=s(r,e);if(Po(t))return Uo(t,"auto-detected"),{path:t,source:"auto-detected"}}return Uo(r,"cwd-fallback"),{path:r,source:"cwd-fallback"}}(u,e.outputDir);return De=r.path,t=e.prompt,`${(Array.isArray(t)?t.join(" "):t).trim()||"Create tests based on the changes in the current PR or branch. If the user references a specific PR number or branch name, first checkout that PR/branch using `gh pr checkout <number>` or `git checkout <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 stably test` or the repo's test command) and iterate until the new tests pass."}\n\n[Output directory: ${De}]`}var t;if("fix"===e.mode)try{$n.info("[fix] Fetching autoheal context",{runId:e.runId,skipAfterConsecutiveUnfixed:Be});const t=Date.now(),{context:r,autohealReportUrl:n,skippedTests:o}=await(async({authHeader:e,orgId:t,runId:r,skipAfterConsecutiveUnfixed:n})=>{$n.debug("Fetching autoheal context",{runId:r,skipAfterConsecutiveUnfixed:n});const o=await(s={auth:e,client:qr(),headers:Kn(t),path:{runId:r},query:null!=n?{skipAfterConsecutiveUnfixed:n}:{}},(s.client??jr).get({security:[{scheme:"bearer",type:"http"}],url:"/internal/v1/cli/runs/{runId}/autoheal-context",...s}));var s;if(404===o.response.status)throw $n.warn("Autoheal context not found",{runId:r,status:404}),new Error(`Run ID "${r}" was not found.`);if(401===o.response.status)throw $n.warn("Autoheal context fetch unauthorized",{runId:r,status:401}),new Error("Unauthorized: failed to fetch autoheal context (401).");if(422===o.response.status)throw $n.warn("Autoheal context fetch invalid request",{runId:r,status:422,error:o.error?.error}),new Error(o.error?.error??"Failed to fetch autoheal context (422).");if(!o.error){const e=qn.safeParse(o.data);if(e.success)return $n.debug("Autoheal context fetched successfully",{runId:r,contextSize:e.data.context.length,skippedTestCount:e.data.skippedTests?.length??0}),{context:e.data.context,autohealReportUrl:e.data.autohealReportUrl,skippedTests:e.data.skippedTests??[]};throw $n.warn("Autoheal context response invalid",{runId:r}),new Error("Autoheal context response missing or invalid context.")}throw $n.warn("Autoheal context fetch failed",{runId:r,error:o.error}),new Error("Failed to fetch autoheal context")})({authHeader:c,orgId:l,runId:e.runId,skipAfterConsecutiveUnfixed:Be});if($n.info("[fix] Autoheal context fetched",{runId:e.runId,durationMs:Date.now()-t,contextLength:r.length,skippedTestCount:o.length}),ke=n,o.length>0){$n.info(`[fix] Skipping ${o.length} test(s) that failed to be fixed ${Be}+ consecutive times`);for(const e of o)$n.info(`[fix] Skipped: ${e.testIdentifier} — ${e.testTitle} (unfixed ${e.consecutiveUnfixedCount}x)`)}return r.includes("No failing tests to fix (all were skipped).")&&($n.info("[fix] All failing tests were skipped — nothing to fix"),Ue({status:"success",result:`All failing tests skipped (unfixed ${Be}+ consecutive times). Nothing to fix.`}),await Te(),process.exit(0)),K||($n.info("[fix] Creating WebSocket progress reporter"),K=new ro({authHeader:c,orgId:l,runId:e.runId,onUserMessage:e=>{if($n.info("[ws] Injecting web UI message into fix agent",{contentLength:e.length}),X(qi,{type:"user_message",summary:e}),Q({type:"user_message",summary:e}),Ie({text:`[Web] ${e}`}),!x)return b.pushText(`[Message from web UI user]: ${e}`),x=!0,void b.allowNextTurn();O||Date.now()-N<2e3?b.pushText(`[Message from web UI user]: ${e}`):(D.push(e),k&&clearTimeout(k),k=setTimeout(()=>{k=void 0;const e=[...D];D=[],N=Date.now(),Ct(e)},500))}}),K.start(),ee({phase:"initializing"})),te("STARTED"),r}catch(e){const t=e instanceof Error?e.message:"Failed to fetch autoheal context.";$n.error("[fix] Failed to fetch autoheal context",{error:t}),Ue({error:t,status:"error"}),await Te(),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.":""})(),$e=await async function(e){const t=r.resolve(e),n=r.join(t,"tests"),o=r.join(n,"helpers"),s=r.join(n,"assets"),i=function(e){const t=r.resolve(e);if(g(t))for(const e of _o){const n=r.join(t,`playwright.config${e}`);if(g(n))return n}}(t)??r.join(t,"playwright.config.ts"),a=r.basename(i),c=r.join(n,"seed.spec.ts"),[l,u,d,p,f,h]=await Promise.all([To({defaultContent:"Unable to read directory",dirName:"working directory",dirPath:t}),To({defaultContent:"Unable to read directory",dirName:"tests directory",dirPath:n}),To({defaultContent:"Directory does not exist yet",dirName:"helpers directory",dirPath:o}),To({defaultContent:"Directory does not exist yet",dirName:"assets directory",dirPath:s}),Io({defaultContent:"File does not exist or could not be read",fileName:a,filePath:i}),Io({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}}}(u),je=Oe?.agent?.fix?.maxTurnsPerIssue,Me=Oe?.agent?.fix?.maxParallelWorkers,He=Oe?.agent?.fix?.rules,Ge="fix"===e.mode||"single"===e.mode,Fe="single"===e.mode?await(async e=>{const t=await Yi(e,"STABLY-CREATE.md");return t?.content})(u):void 0,Ye=await(e=>Yi(e,"STABLY.md"))(u),Ve=Ye?.content;$n.info("[fix] Fetching system prompt and subagent definitions",{mode:e.mode,maxTurnsOverride:je,hasCustomRules:!!He,hasCreateRules:!!Fe,hasStablyMd:!!Ve,stablyMdPath:Ye?.path}),Ye&&$n.info(`STABLY.md loaded (${Ye.content.length} chars)`,{path:Ye.path});const ze=Date.now(),[{systemPrompt:We,prContext:Ke},qe]=await Promise.all([xo({allowedEnvVars:Object.keys(f),mode:e.mode,workspaceInfo:$e,authHeader:c,customHeader:"single"===e.mode?e.customHeader:void 0,maxParallelWorkers:"fix"===e.mode?Me:void 0}),Ge?$i({authHeader:c,mode:e.mode,maxTurnsOverride:je}):Promise.resolve({})]);$n.info("[fix] System prompt and subagents fetched",{durationMs:Date.now()-ze,systemPromptSize:We.length,subagentCount:Object.keys(qe).length,maxTurnsOverride:je??"default",hasPrContext:!!Ke});const Je={...f,...process.env},Xe={};for(const[e,t]of Object.entries(Je))Ni.has(e)||void 0===t||(Xe[e]=t);const Qe=!0;$n.debug("AI proxy configuration",{useStablyAiProxy:Qe,wantsBypassProxy:!1,wantsUseOllama:!1}),$n.info("[fix] Acquiring AI proxy key",{useStablyAiProxy:Qe});const Ze=Date.now(),et=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??jr).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:Bi(e,a)}}return i.data?{key:i.data.key}:{error:Bi("No data in response",a)}}catch(e){const t=e instanceof Error?e.message:"Unknown error";return{error:Bi(t)}}var s}({auth:c,client:qr(),source:"cli"}),tt=et?.key;if($n.info("[fix] AI proxy key acquired",{durationMs:Date.now()-Ze,success:!!tt,hasError:!!et?.error}),!tt){const e=et?.error?.message?`Unable to make AI calls: ${et.error.message}`:"Unable to make AI calls. Check if you are authenticated.";$n.warn("Failed to get proxy API key",{error:et?.error?.message}),Ue({error:e,status:"error"}),await Te(),$n.flush(),$n.printLogFileInfo(),process.exit(1)}$n.debug("Proxy API key acquired",{success:!!tt});const rt=await Wn(),nt=rt?Object.fromEntries(Object.entries(zn(rt)).filter(e=>null!=e[1])):void 0,ot="init"===e.mode,st="fix"===e.mode,it=st?yr.createLocal({workingDir:u}):void 0;it&&await it.captureSnapshot();const at=ot?ki({onComplete:()=>{Ue({status:"success"}),xe(),b?.finish(),process.exit(0)}}):y?ki({onRestartRequested:()=>{y&&(A=!0,Ue({status:"running"}),Se({label:"Restarting browser tools..."}),T={createdAtUserMessageSeq:C,attempts:0})}}):void 0,ct=at?y?{"stably-agent-control":at}:{"session-control":at}:{},lt=re&&Ke?["mcp__create-report"]:[],ut=ot?Wi:[...Vi,...st?["mcp__auto-heal-report"]:[],...lt],dt=ot?Wi:y?[...zi,"mcp__stably-agent-control"]:[...zi,...lt],pt=re&&Ke?{"create-report":Di({prContext:Ke,authHeader:c,orgId:l,onReportPosted:e=>{ie({githubComment:{url:e.commentUrl,prNumber:Ke.prNumber}})}})}:{},ft=ot?ct:st&&it?{"playwright-test":{args:["playwright","run-test-mcp-server"],command:"npx",env:nt},"auto-heal-report":Ui({authHeader:c,diffTracker:it,orgId:l,runId:e.runId,workingDir:u}),...ct}:{"playwright-test":{args:["playwright","run-test-mcp-server"],command:"npx",env:nt},...ct,...pt},ht="single"===e.mode,gt=ot?[]:[{hooks:[async e=>{const t=io(e);if(!t)return{decision:"approve"};let r=!1;const n=t.map(e=>oo(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:[fo({onResult:e=>fe({message:e})})]},{matcher:"mcp__playwright-test__test_debug",hooks:[ho({onResult:e=>fe({message:e})})]},...ht?[{matcher:"Write",hooks:[mo({onFileCreated:e=>{Le.push(e),se&&ie({filesCreated:[...se.filesCreated,e]})}})]}]:[]],mt=ot?[]:[{matcher:"mcp__playwright-test__browser_type",hooks:[po({envVars:f})]}],yt=Object.keys(qe).length>0?qe:void 0,bt={...Xe};bt.MCP_TOOL_TIMEOUT=String(6e5),tt&&(bt.ANTHROPIC_API_KEY=tt,bt.ANTHROPIC_BASE_URL=Vr,bt.CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS="1");const vt=process.env.STABLY_AGENT_MODEL??"claude-opus-4-6",wt=He?`\n\n## Custom Rules\n${He}`:"",_t=Fe?`\n\n## Custom Test Generation Rules\n${Fe}`:"",Et=Ve?`\n\n## Project Rules (STABLY.md)\n${Ve}`:"",It=We+wt+_t+Et;$n.debug("[fix] Final system prompt assembled",{baseSize:We.length,fixRulesSize:wt.length,createRulesSize:_t.length,stablyMdSize:Et.length,finalSize:It.length});const Tt=function(){const e=function(){const e=function(){const e=process.env.STABLY_PLUGIN_PATH?.trim();if(!e)return;const t=r.isAbsolute(e)?e:r.resolve(process.cwd(),e);return Gi(t)?t:void 0}();if(e)return e;const t=r.join(ji,"stably-plugin");if(Gi(t))return t;for(const e of function*(e){let t=r.resolve(e);for(;;){yield t;const e=r.dirname(t);if(e===t)return;t=e}}(ji))for(const t of Hi){const n=r.join(e,t);if(Gi(n))return n}}();if(e)return{type:"local",path:e}}(),xt=()=>($n.info("[fix] Starting SDK query",{model:vt,tools:ut,mcpServers:Object.keys(ft),resumeSessionId:E??null,subagentsEnabled:!!yt,subagentCount:Object.keys(qe).length,useStablyAiProxy:Qe,aiProxyUrl:Vr,anthropicBaseUrl:void 0,stablyPluginPath:Tt?.path,stablyPluginExists:!!Tt}),$({options:{executableArgs:["--max-old-space-size=4096"],tools:ut,allowedTools:dt,betas:[],canUseTool:(e,t)=>($n.debug("[fix] canUseTool called",{toolName:e}),Promise.resolve({behavior:"allow",updatedInput:t})),cwd:u,env:bt,hooks:{PostToolUse:gt,PreToolUse:mt},includePartialMessages:!0,agents:yt,mcpServers:ft,model:vt,permissionMode:"default",plugins:Tt?[Tt]:void 0,systemPrompt:It,...E?{resume:E}:{}},prompt:b??Ne})),St=()=>{if(b&&0!==U.length){for(const e of U)b.pushText(e);U.length=0,x=!0,Ue({status:"running"})}},At=async()=>{y&&(I||(I=(async()=>{$n.info("Restarting MCP servers for chat mode"),Ue({status:"running"}),Se({label:"Restarting browser tools..."});try{await(_?.interrupt?.())}catch(e){$n.warn("Failed to interrupt response during MCP restart",{error:e instanceof Error?e.message:String(e)})}await bo(),b?.finish(),b=new vo,R=0,x=!1,S=!1,H.clear(),_=xt(),P=!0,Se({label:"Restarting browser tools..."}),y&&b&&T&&(T.createdAtUserMessageSeq===C?T.attempts>=1||U.length>0?T=void 0:(T.attempts+=1,b.pushText(["[SYSTEM] MCP servers were restarted successfully.","Continue the task using existing conversation context.","Do not ask the user to resend their message unless new input is required."].join("\n")),T=void 0,x=!0,Ue({status:"running"})):T=void 0),St()})().finally(()=>{I=void 0,St()})),await I)},Ct=async e=>{if(m&&x&&!O&&!L)L=(async()=>{$n.info("[fix] Interrupting for user message",{messageCount:e.length,phase:q?.phase});try{await(_?.interrupt?.())}catch(e){$n.warn("[fix] Failed to interrupt response for user message",{error:e instanceof Error?e.message:String(e)})}await bo(),b?.finish(),b=new vo,H.clear(),_=xt();const t=e.map(e=>`[Message from web UI user]: ${e}`).join("\n\n");b.pushText(`[SYSTEM] The user sent a message while you were working. Read their message below, incorporate their feedback, and continue your task. Do not restart from scratch unless the user explicitly asks.\n\n${t}`),B=!0,x=!0})().finally(()=>{L=void 0}),await L;else for(const t of e)b?.pushText(`[Message from web UI user]: ${t}`)};if(tt){const e=Vr,t=`${e.replace(/\/$/,"")}/v1/messages`;$n.debug(`[fix] Pre-flight: POST ${t}`);const r=Date.now();try{const e=await fetch(t,{method:"POST",signal:AbortSignal.timeout(1e4),headers:{"x-api-key":tt,"anthropic-version":"2023-06-01","content-type":"application/json"},body:"{}"}),n=await e.text().catch(()=>""),o=Date.now()-r;$n.debug(`[fix] Pre-flight: ${e.status} in ${o}ms — ${n.slice(0,300)}`),401===e.status||403===e.status?$n.error(`[fix] Pre-flight: AI proxy key rejected (${e.status}) at ${t}`):$n.info("[fix] Pre-flight: AI proxy key valid",{status:e.status,durationMs:o})}catch(t){$n.error("[fix] Pre-flight: AI proxy unreachable",{error:t instanceof Error?t.message:String(t),durationMs:Date.now()-r,url:e})}}$n.info("[fix] Creating initial agent query"),$n.flush(),_=xt(),$n.info("[fix] Agent query created, entering message loop"),"chat"!==e.mode&&b.pushText(Ne),le.current=async()=>{F="CANCELED",await te("CANCELED"),ee({phase:"complete",endedAt:Date.now(),isError:!1,isInterrupted:!0,currentTestDescription:null,workers:Z(!0)}),K?.close(),ie({phase:"complete",endedAt:Date.now(),isError:!1,isInterrupted:!0}),oe?.close(),k&&(clearTimeout(k),k=void 0),$n.flush(),xe();try{await(_?.interrupt?.())}catch{}b?.finish(),Te()};let Rt=0,Pt=null;const Ut=setInterval(()=>{const e=Date.now()-W;Pt?$n.info("[fix] Watchdog: message loop active",{messageCount:Rt,elapsed:e}):$n.info("[fix] Watchdog: waiting for first SDK message",{elapsed:e}),$n.flush()},15e3);Ut.unref();try{let t=!1;for(;;){if(!_){$n.info("[fix] No response object, exiting message loop");break}t=!1,$n.info("[fix] Entering for-await on SDK response");for await(const r of _){Rt++,Pt||(Pt=Date.now(),$n.info("[fix] First SDK message received",{waitDurationMs:Pt-W,messageType:r.type,messageSubtype:"subtype"in r?r.subtype:void 0}));const n="session_id"in r&&"string"==typeof r.session_id?r.session_id:void 0;if(n&&n!==E&&(E=n,$n.debug("Captured Claude session id",{sessionId:E})),"stream_event"===r.type){const{event:e}=r;(Rt<=5||Rt%200==0)&&$n.debug("[fix] Stream event",{msgNum:Rt,eventType:e?.type});const t=e&&"object"==typeof e&&"parent_tool_use_id"in e&&"string"==typeof e.parent_tool_use_id?e.parent_tool_use_id:void 0;if("content_block_delta"===e?.type){const{delta:r}=e;if("text_delta"===r?.type&&r.text){if(y&&A&&!t)continue;P&&(P=!1,Se({label:void 0})),t&&H.has(t)?ue({toolUseId:t,kind:"text",content:r.text}):_e({text:r.text})}}"message_stop"===e?.type&&b&&(O=!1,b.allowNextTurn());continue}if("assistant"===r.type){const t="parent_tool_use_id"in r&&"string"==typeof r.parent_tool_use_id?r.parent_tool_use_id:void 0,{content:n}=r.message??{};if(Array.isArray(n)&&!t){const t=n.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("");t&&($n.debug("Assistant message",{text:t}),"fix"===e.mode&&(X(qi,{type:"ai_message",summary:t.slice(0,200)}),Q({type:"ai_message",summary:t.slice(0,200)})),re&&ae({type:"ai_message",summary:t.slice(0,200)}))}if(H.size>0){const e=Array.isArray(n)?n.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):[];$n.debug("Assistant message with active subagents",{hasParentToolUseId:!!t,parentToolUseId:t,activeSubagentIds:Array.from(H.keys()),toolNames:e,fullMessageKeys:Object.keys(r),rawMessage:JSON.stringify(r).slice(0,500)})}if(Array.isArray(n))for(const r of n){if("tool_use"===r?.type){if("mcp__auto-heal-report__generate-report"===r.name&&(O=!0),"mcp__session-control__restart_mcp_servers"===r.name||"mcp__stably-agent-control__restart_mcp_servers"===r.name){pe({rawName:r.name,toolInput:r.input});continue}if(r.name.startsWith("mcp__session-control__")||r.name.startsWith("mcp__stably-agent-control__"))continue;if(Ji(r.name))continue;if(H.size>0&&$n.debug("Tool use detected with active subagents",{toolName:r.name,hasParentToolUseId:!!t,parentToolUseId:t,wouldRouteToSubagent:!!t&&H.has(t),activeSubagentIds:Array.from(H.keys())}),"Task"===r.name){const t=r.input,n=t&&"object"==typeof t?t:void 0,o=n&&"subagent_type"in n&&"string"==typeof n.subagent_type?n.subagent_type:"subagent",s=n&&"description"in n&&"string"==typeof n.description?n.description.trim():"";if($n.info("[fix] Subagent started",{subagentType:o,description:s,toolUseId:r.id,activeSubagentCount:H.size+1}),H.set(r.id,{subagentType:o,description:s}),de({toolUseId:r.id,subagentType:o,description:s}),"fix"===e.mode){if("triage"===o){Re?.({phase:"triage"});const e={id:r.id,testDescription:"Triage",workerType:"triage",status:"running",summary:null,startedAt:Date.now(),endedAt:null,activity:[]};ee({phase:"triage",workers:[...q?.workers??[],e]})}else if("fix-worker"===o){J.add(s||r.id);const e={id:r.id,testDescription:s||r.id,workerType:"fix-worker",status:"running",summary:null,startedAt:Date.now(),endedAt:null,activity:[]};Re?.({phase:"fixing",totalTests:J.size,currentTestDescription:s||null}),ee({phase:"fixing",totalTests:J.size,currentTestDescription:s||null,lastTestDescription:s||q?.lastTestDescription||null,workers:[...q?.workers??[],e]})}else"validation"===o?(Re?.({phase:"validation",currentTestDescription:null}),ee({phase:"validation",currentTestDescription:null})):"context"===o&&ee({currentTestDescription:s||null});Q({type:"tool_call",summary:`[${o}] ${s}`.trim()})}continue}if(t&&H.has(t)){const n=$o(r.name),o=No(r.name,r.input),s=o?`${n} (${o})`:n;if($n.debug("Subagent tool called",{tool:r.name,parentToolUseId:t}),ue({toolUseId:t,kind:"tool",content:s}),"fix"===e.mode){Q({type:"tool_call",summary:s});const e=H.get(t);"fix-worker"!==e?.subagentType&&"triage"!==e?.subagentType||X(t,{type:"tool_call",summary:s})}continue}if(t&&$n.debug("Tool with parent_tool_use_id but no matching subagent",{tool:r.name,parentToolUseId:t,activeSubagentIds:Array.from(H.keys())}),$n.debug("Tool called",{tool:r.name,input:r.input}),pe({rawName:r.name,toolInput:r.input}),"fix"===e.mode){const e=$o(r.name),t=No(r.name,r.input),n=t?`${e} (${t})`:e;X(qi,{type:"tool_call",summary:n}),Q({type:"tool_call",summary:n})}if(re){const e=$o(r.name),t=No(r.name,r.input),n=t?`${e} (${t})`:e;"initializing"===se?.phase?ie({phase:"generating",currentActivity:n}):"mcp__playwright-test__test_run"===r.name&&"generating"===se?.phase?ie({phase:"testing",currentActivity:n}):ie({currentActivity:n}),ae({type:"tool_call",summary:n})}}if("text"===r?.type&&t&&H.has(t)){const n="string"==typeof r.text?r.text:"";if(n&&(ue({toolUseId:t,kind:"text",content:n}),"fix"===e.mode)){const e=H.get(t);"fix-worker"!==e?.subagentType&&"triage"!==e?.subagentType||X(t,{type:"ai_message",summary:n.slice(0,200)})}}}continue}if("user"===r.type){const t="message"in r&&r.message&&"object"==typeof r.message&&"content"in r.message?r.message.content:void 0;if(Array.isArray(t))for(const r of t)if(r&&"object"==typeof r&&"type"in r&&"tool_result"===r.type&&"tool_use_id"in r){const t="string"==typeof r.tool_use_id?r.tool_use_id:void 0,n="is_error"in r&&!0===r.is_error,o="content"in r&&"string"==typeof r.content?r.content:void 0;if($n.debug("Tool result",{toolUseId:t,isError:n,output:o?.slice(0,500)}),t&&H.has(t)){const r=H.get(t);if($n.info("[fix] Subagent completed",{toolUseId:t,isError:n,subagentType:r?.subagentType,description:r?.description,activeSubagentCount:H.size-1}),Ce({toolUseId:t,status:n?"error":"complete"}),"fix"===e.mode&&"triage"===r?.subagentType){const e=n?"failed":"succeeded",r=o?o.slice(0,500):null,s=(q?.workers??[]).map(n=>n.id===t?{...n,status:e,summary:r,endedAt:Date.now()}:n);ee({workers:s})}if("fix"===e.mode&&"fix-worker"===r?.subagentType){const e=n?"failed":"succeeded",r=o?o.slice(0,500):null,s=(q?.workers??[]).map(n=>n.id===t?{...n,status:e,summary:r,endedAt:Date.now()}:n);n?(Re?.({failedTests:(q?.failedTests??0)+1,currentTestDescription:null}),ee({failedTests:(q?.failedTests??0)+1,currentTestDescription:null,workers:s})):(Re?.({fixedTests:(q?.fixedTests??0)+1,currentTestDescription:null}),ee({fixedTests:(q?.fixedTests??0)+1,currentTestDescription:null,workers:s}))}H.delete(t)}}continue}if("result"===r.type){if($n.info("[fix] Agent result received",{subtype:r.subtype,messageCount:Rt,elapsed:Date.now()-W,activeSubagents:H.size,fixedTests:q?.fixedTests,failedTests:q?.failedTests,phase:q?.phase}),m){if("success"===r.subtype){k&&(clearTimeout(k),k=void 0);for(const e of D)b?.pushText(`[Message from web UI user]: ${e}`);if(D=[],(re||"fix"===e.mode)&&b){if(b.hasQueuedMessages()){$n.info("[ws] Queued web UI messages found, continuing agent"),x=!0,b.allowNextTurn();continue}if(await Xi(b,3e3)){$n.info("[ws] Web UI message received during grace period, continuing agent"),x=!0,b.allowNextTurn();continue}b.finish()}if(Re?.({phase:"complete",currentTestDescription:null,endedAt:Date.now()}),ee({phase:"complete",currentTestDescription:null,endedAt:Date.now(),isError:!1,workers:Z(!1)}),ie({phase:"complete",endedAt:Date.now(),isError:!1,currentActivity:null}),ht&&Le.length>0){G.green("Created files:");for(const e of Le)G.green(`- ${e}`)}const t=(e,t)=>`]8;;${e}${t}]8;;`,r=ke?G.cyan(`📊 View Autoheal Report:\n ${t(ke,G.cyan(G.bold(G.underline(ke))))}`):void 0;Ue({status:"success",result:r}),F="COMPLETED"}else L||B?$n.info("[fix] Suppressing error status: user-message interrupt in progress"):S?(F="CANCELED",ee({phase:"complete",endedAt:Date.now(),isError:!1,isInterrupted:!0,currentTestDescription:null,workers:Z(!0)}),ie({phase:"complete",endedAt:Date.now(),isError:!1,isInterrupted:!0})):(Re?.({endedAt:Date.now(),isError:!0}),ee({phase:"complete",endedAt:Date.now(),isError:!0,currentTestDescription:null,workers:Z(!0)}),ie({phase:"complete",endedAt:Date.now(),isError:!0,currentActivity:null}),Ue({error:"Run failed.",status:"error"}),process.exitCode=1,F="FAILED");S=!1;break}const n=y&&A;if("success"!==r.subtype?S||(Ue({error:"Run failed.",status:"error"}),process.exitCode=1):Ue(n?{status:"running"}:{status:"success"}),x=!1,S=!1,n){A=!1,$n.info("Processing deferred MCP restart request in chat mode"),await At(),t=!0;break}P=!1,Se({label:void 0}),b?.allowNextTurn(),y&&R>0&&(R-=1,x=!0,Ue({status:"running"}));continue}}if(L&&await L,B&&(B=!1,t=!0,Ue({status:"running"}),$n.info("[fix] Resuming after user-message interrupt")),!t)break}}catch(e){S?(F="CANCELED",ee({phase:"complete",endedAt:Date.now(),isError:!1,isInterrupted:!0,currentTestDescription:null,workers:Z(!0)}),ie({phase:"complete",endedAt:Date.now(),isError:!1,isInterrupted:!0})):($n.error("[fix] Agent encountered an error",{error:e instanceof Error?e.message:String(e),stack:e instanceof Error?e.stack:void 0,elapsed:Date.now()-W}),Ue({error:`Agent encountered an error: ${e}`,status:"error"}),process.exitCode=1,F="FAILED",ee({phase:"complete",endedAt:Date.now(),isError:!0,currentTestDescription:null,workers:Z(!0)}),ie({phase:"complete",endedAt:Date.now(),isError:!0,currentActivity:null}),$n.flush(),$n.printLogFileInfo())}finally{if(clearInterval(Ut),k&&(clearTimeout(k),k=void 0),$n.info("[fix] Agent session ending",{finalStatus:F,elapsed:Date.now()-W,totalMessages:Rt}),x=!1,S=!1,process.off("uncaughtException",i),b?.finish(),F){$n.info("[fix] Reporting final autoheal status",{status:F});const e=Date.now();await te(F),$n.info("[fix] Final autoheal status reported",{durationMs:Date.now()-e})}if($n.info("[fix] Closing WebSocket progress reporter"),K?.close(),oe?.close(),st&&it){const t=Date.now();try{$n.info("[fix] Computing diff...");const r=await it.computeDiff();if(r&&r.trim().length>0){$n.info("[fix] Uploading diff...",{diffLength:r.length});const{diffBucketPath:n,uploadUrl:o}=await Zn({authHeader:c,contentType:"text/plain",orgId:l,runId:e.runId});await eo({contentType:"text/plain",diff:r,uploadUrl:o}),await to({authHeader:c,diffBucketPath:n,orgId:l,runId:e.runId}),$n.info("[fix] Diff uploaded",{durationMs:Date.now()-t})}else $n.info("[fix] No diff to upload (empty or no changes)")}catch(e){$n.warn("[fix] Failed to upload diff",{error:e instanceof Error?e.message:String(e),durationMs:Date.now()-t})}}$n.info("[fix] Cleaning up diff tracker"),await(it?.cleanup()),$n.info("[fix] Running final cleanup"),await Te(),$n.info("[fix] Cleanup complete")}},Zi=ie.object({runId:ie.string(),timestamp:ie.number()}),ea=[{args:["--trace=on"],description:"Run Playwright tests",name:"test"},{args:[],description:"Install browser dependencies",name:"install"}],ta=["You have two different versions of @playwright/test"];function ra(e){const[t,...r]=Ti(e),n=[t,...r.slice(0,-1)].join(" ");return(t,r)=>{let o=t.toString();for(const e of ea)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)}}async function na({overrideArgs:e,subcommand:t}){$n.info("[test] forwardToPlaywright starting",{subcommand:t,overrideArgs:e});const r=process.argv,a=r.findIndex((e,r)=>r>1&&e===t),c=-1===a?[]:r.slice(a+1),l="--"===c[0],u=l?c.slice(1):c;if(!l&&("--help"===u[0]||"-h"===u[0]))return async function({subcommand:e}){const t=ea.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 n=_i();if(!n.installed||!n.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:o}=n;if(!o)return void r("Could not determine package manager.");r("Playwright options:"),r("");const[s,...i]=Ti(o),a=ra(o);return new Promise(t=>{const r=p(s,[...i,e,"--help"],{stdio:["inherit","pipe","pipe"],env:{...process.env,...process.env.CI?{}:{FORCE_COLOR:"1"}}});r.stdout?.on("data",e=>{a(e,process.stdout)}),r.stderr?.on("data",e=>{a(e,process.stderr)}),r.on("close",()=>{t()})})}({subcommand:t});const f=e??[],h=new Set(f.map(e=>{const[t]=e.split("=");return t})),m=[];for(let e=0;e<u.length;e++){const t=u[e],[r]=t.split("=");h.has(r)?!t.includes("=")&&e+1<u.length&&!u[e+1].startsWith("-")&&e++:m.push(t)}const y=[t,...f,...m];$n.info("[test] Forwarded args computed",{forwardedArgs:y}),$n.info("[test] Resolving Stably test environment");const E=Date.now(),I="test"===t?await Wn():void 0;$n.info("[test] Stably test environment resolved",{durationMs:Date.now()-E,hasCredentials:null!=I,hasWsUrl:!!I?.STABLY_WS_URL}),$n.info("[test] Setting up Stably reporter injection");const T="test"===t?function({forwardedArgs:e,hasCredentials:t}){if(!t)return console.warn("[33m⚠️ Stably credentials not found. Test results will not be reported to Stably.[0m"),console.warn("[33m To enable reporting, either:[0m"),console.warn("[33m • Run `npx stably login` to authenticate[0m"),void console.warn("[33m • Or set STABLY_API_KEY and STABLY_PROJECT_ID environment variables[0m\n");const r=process.cwd(),a=e=>{const t=function(e){let t=n(e);for(;;){if([s(t,"node_modules","@stablyai","playwright-test"),s(t,"node_modules",".pnpm","@stablyai+playwright-test")].some(e=>g(e)))return!0;const e=o(t);if(e===t)return!1;t=e}}(e);return t||(console.warn("[33m⚠️ @stablyai/playwright-test is not installed. Stably reporter will not be injected.[0m"),console.warn("[33m Install it with: npm install @stablyai/playwright-test[0m"),console.warn("[33m Reference: ]8;;https://docs.stably.ai/getting-started/sdk-setup-guidehttps://docs.stably.ai/getting-started/sdk-setup-guide]8;;[0m\n")),t},c=(e,t)=>{try{return function({baseConfigPath:e,projectDir:t}){const r=function(e){try{const t=d("npm pkg get type",{cwd:e,encoding:"utf-8",stdio:["pipe","pipe","pipe"]});return"module"===JSON.parse(t.trim())}catch{return!1}}(t),a=r?"mts":"ts",c=o(n(e)),l=i(e),u=s(c,`.stably-playwright-wrapper.config.${a}`),p=`\n// Auto-generated wrapper config by Stably CLI\n// This file injects the Stably reporter and ensures trace is enabled\nimport baseConfig from './${l}';\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 getStablyReporterOptions = (reporters: unknown[]): Record<string, unknown> | undefined => {\n for (const reporter of reporters) {\n if (Array.isArray(reporter) && typeof reporter[0] === 'string' && reporter[0].includes('@stablyai')) {\n return (reporter[1] as Record<string, unknown>) ?? {};\n }\n }\n return undefined;\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 // Resolve errorSummary: env var STABLY_ERROR_SUMMARY=0 disables it\n const resolveErrorSummary = (existingValue?: unknown): boolean | undefined => {\n if (process.env.STABLY_ERROR_SUMMARY === '0') return false;\n if (typeof existingValue === 'boolean') return existingValue;\n return undefined; // let the reporter default (true)\n };\n\n // No existing reporters - create fresh stably reporter\n if (!existingReporters) {\n return [stablyReporter({\n apiKey: process.env.STABLY_API_KEY,\n projectId: process.env.STABLY_PROJECT_ID,\n notificationConfigs: extractNotificationConfigs(),\n errorSummary: resolveErrorSummary(),\n })];\n }\n\n // Normalize to array\n const reportersArray: unknown[] = Array.isArray(existingReporters)\n ? existingReporters\n : [[existingReporters, {}]];\n\n // If user has a stably reporter, take their options but override credentials\n const existingOptions = getStablyReporterOptions(reportersArray);\n const stablyReporterEntry = stablyReporter({\n ...existingOptions,\n apiKey: process.env.STABLY_API_KEY,\n projectId: process.env.STABLY_PROJECT_ID,\n notificationConfigs: extractNotificationConfigs(),\n errorSummary: resolveErrorSummary(existingOptions?.errorSummary),\n });\n\n // Keep all non-stably reporters, add our (merged or fresh) stably reporter\n const otherReporters = filterOutStablyReporter(reportersArray);\n return [...otherReporters, stablyReporterEntry];\n};\n\nexport default defineConfig({\n ...baseConfig,\n use: {\n ...baseConfig.use,\n trace: 'on',\n },\n reporter: buildReporterList(),\n});\n`.trim();return g(c)||v(c,{recursive:!0}),w(u,p,"utf-8"),function(e){const t=s(e,".gitignore");try{if(g(t)){const e=b(t,"utf-8");if(e.split("\n").map(e=>e.trim()).includes(So))return;const r=e.length>0&&!e.endsWith("\n");_(t,`${r?"\n":""}${So}\n`)}else w(t,`${So}\n`)}catch{}}(c),u}({baseConfigPath:e,projectDir:t})}catch{return void console.warn("[33m⚠️ Could not create Stably wrapper config. Reporter injection skipped.[0m")}};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 s=n(r,e[t+1]),i=o(s);if(!a(i))return;const l=c(s,i);if(!l)return;return e[t+1]=l,l}const s=e.findIndex(e=>e.startsWith("--config=")||e.startsWith("-c="));if(-1!==s){const t=n(r,e[s].split("=")[1]),i=o(t);if(!a(i))return;const l=c(t,i);if(!l)return;const u=e[s].startsWith("--config=")?"--config=":"-c=";return e[s]=`${u}${l}`,l}}const l=Co(r);if(!l)return;const u=o(l);if(!a(u))return;const p=c(l,u);return p?(e.push("--config",p),p):void 0}({forwardedArgs:y,hasCredentials:null!=I}):void 0;$n.info("[test] Reporter injection setup complete",{hasWrapperConfig:!!T}),$n.info("[test] Spawning Playwright process"),await function(e,t={}){$n.info("[test] Detecting Playwright installation");const r=_i();$n.info("[test] Playwright installation check",{installed:r.installed,inNodeModules:r.inNodeModules,packageManager:r.packageManager,packageName:r.packageName}),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:n}=r;n||(console.error("Playwright installation not found. Could not determine your package manager (tried pnpm, yarn, and npm)."),process.exit(1));const[o,...s]=Ti(n),i=zn(t.env),a=[o,...s,...e];$n.info("[test] Spawning Playwright process",{command:a.join(" "),pid:process.pid});const c=Date.now(),l=p(o,[...s,...e],{stdio:["inherit","pipe","pipe"],env:{...i,...process.env.CI?{}:{FORCE_COLOR:"1"}}});$n.info("[test] Playwright process spawned",{childPid:l.pid});const u=ra(n),d=function(){let e=!1,t="";return(r,n)=>{if(!e){t+=r,t.length>1024&&(t=t.slice(-1024));for(const r of ta)if(t.includes(r))return n.write("\n[stably] Hint: This is a Playwright error, not caused by @stablyai/playwright-test.\n Common causes: running from the wrong directory (especially in monorepos),\n or a dependency pulling in a conflicting @playwright/test version.\n"),void(e=!0)}}}();l.stdout?.on("data",e=>{u(e,process.stdout)}),l.stderr?.on("data",e=>{const t=e.toString();u(e,process.stderr),d(t,process.stderr)});const f=new AbortController,h=()=>!f.signal.aborted&&(f.abort(),t.onClose?.(),process.removeListener("SIGINT",g),process.removeListener("SIGTERM",g),!0),g=e=>{$n.info("[test] Signal received, killing Playwright process",{signal:e,childPid:l.pid}),h(),l.kill(e);const t="SIGINT"===e?130:143;process.exit(t)};return process.on("SIGINT",g),process.on("SIGTERM",g),new Promise((e,t)=>{l.on("error",e=>{h()&&($n.error("[test] Playwright process error",{error:e.message,childPid:l.pid}),t(e))}),l.on("close",t=>{if(!h())return;$n.info("[test] Playwright process exited",{exitCode:t,durationMs:Date.now()-c});const r=[process.stdout,process.stderr].filter(e=>e.writableNeedDrain).map(e=>new Promise(t=>e.once("drain",t)));Promise.race([Promise.all(r),new Promise(e=>setTimeout(e,5e3))]).then(()=>{process.exitCode=t??0,e(t??0)})})})}(y,{env:I,onClose:()=>{var e;$n.info("[test] Playwright process closed, cleaning up wrapper config"),(e=T)&&g(e)&&x(e)}})}function oa(e=""){process.stdout.write(`${e}\n`)}function sa(...e){process.stderr.write(`${e.join(" ")}\n`)}var ia="stably",aa=`https://registry.npmjs.org/${ia}/latest`,ca=ae.object({version:ae.string()});function la(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 ua(e,t){const r=la(e),n=la(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 da=r.join(C.homedir(),".stably"),pa=r.join(da,"update-check.json"),fa=`https://registry.npmjs.org/${ia}/latest`,ha="1"===process.env.STABLY_DISABLE_UPDATE_CHECK,ga=ae.object({lastCheck:ae.number(),latestVersion:ae.string()}),ma=!1,ya=!1,ba=async()=>{if(ya)try{const{shutdown:e}=await import("@hyperdx/node-opentelemetry"),t=process.stderr.write.bind(process.stderr),r=process.stdout.write.bind(process.stdout),n=(e,...t)=>{const r=t[0];return!("string"!=typeof r||!r.includes("OpenTelemetry"))||!(!Buffer.isBuffer(r)||!r.toString().includes("OpenTelemetry"))||e(...t)};process.stderr.write=(...e)=>n(t,...e),process.stdout.write=(...e)=>n(r,...e);try{await e()}finally{process.stderr.write=t,process.stdout.write=r}}catch{}};!function(){if(ha)return;const e=function(){try{const e=h.readFileSync(pa,"utf-8");return ga.parse(JSON.parse(e))}catch{return null}}(),t=Date.now();if((null==e||t-e.lastCheck>=18e5)&&function(){const e=`\n import { get } from 'node:https';\n import fs from 'node:fs';\n const url = '${fa}';\n const cacheFile = ${JSON.stringify(pa)};\n const cacheDir = ${JSON.stringify(da)};\n\n const req = 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{p(process.execPath,["--input-type=module","-e",e],{detached:!0,stdio:"ignore",windowsHide:!0}).unref()}catch{}}(),null!=e&&ua(Mr,e.latestVersion)){if(ma)return;ma=!0;let t=!1;const r=()=>{if(t)return;t=!0;const r=`${G.yellow(`update available (${Mr} → ${e.latestVersion})`)} - run \`${ia} upgrade\` to get the latest version\n`;try{h.writeSync(2,r)}catch{}};process.once("beforeExit",r),process.once("exit",r)}}(),Te.cwdChanged&&$n.debug("Changed working directory",{cwd:Te.newCwd});for(const e of Te.envFilesLoaded)$n.debug("Loaded env file",{path:e});for(const e of Te.envFileErrors)$n.warn(e);var va=process.argv.findIndex(e=>"-v"===e||"--verbose"===e);-1!==va&&process.argv.splice(va,1);var wa=process.argv.findIndex(e=>"--no-telemetry"===e);-1!==wa&&process.argv.splice(wa,1),$n.info("CLI starting",{version:Mr,args:process.argv.slice(2),cwd:process.cwd()}),process.on("unhandledRejection",(e,t)=>{$n.error("Unhandled promise rejection",{reason:e instanceof Error?{message:e.message,stack:e.stack}:e,promise:String(t)}),$n.flush(),$n.printLogFileInfo()}),process.on("uncaughtException",(e,t)=>{"EPIPE"!==e.code&&($n.error("Uncaught exception",{error:{message:e.message,stack:e.stack,name:e.name},origin:t}),$n.flush(),$n.printLogFileInfo())});var _a=new a;_a.name("stably").description("AI-assisted Playwright testing CLI").version(Mr),_a.enablePositionalOptions(),_a.showHelpAfterError(),_a.exitOverride(),_a.configureHelp({subcommandTerm:e=>{const t=e.registeredArguments.map(e=>e.required?`<${e.name()}>`:`[${e.name()}]`).join(" ");return t?`${e.name()} ${t}`:e.name()}});var Ea=[];_a.configureOutput({writeOut:e=>process.stdout.write(e),writeErr:e=>{Ea.push(e)}});var Ia=()=>{const e=_a.helpInformation().trimEnd();return e?`${e}\n`:""},Ta=(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},xa=()=>{process.stdout.write(Ia())};_a.command("help [command...]").description("Show help for a command (e.g. stably help create)").action(e=>{if(!e||0===e.length)return void xa();const t=Ta(_a,e);if(!t)return process.stderr.write(`Unknown command: ${e.join(" ")}\n`),xa(),void(process.exitCode=1);var r;r=t,process.stdout.write((e=>{const t=e.helpInformation().trimEnd();return t?`${t}\n`:""})(r))}),_a.action(()=>Qi({mode:"chat",getHelpText:Ia})),_a.command("login").description("Authenticate with Stably in your browser").action(wn),_a.command("logout").description("Clear stored Stably credentials").action(async()=>{const e=Mn();e&&(Z.warn(`Environment variables ${G.cyan("STABLY_API_KEY")} and ${G.cyan("STABLY_PROJECT_ID")} are set.`),Z.warn("They will continue to be used for authentication even after logout."),Z.warn("Unset them if you want to fully de-authenticate this shell/session."));const t=await ln();if(!t)return void ee(e?G.yellow("No stored OAuth login found to clear."):G.yellow("You are not logged in."));const r=te();r.start("Logging out..."),await(async e=>{try{await fetch(`${Fr}/api/backend/v1/logout`,{body:JSON.stringify({refresh_token:e}),headers:{"Content-Type":"application/json"},method:"POST"})}catch{}})(t.refreshToken),await dn(),await fn(),r.stop(G.green("✓ Logged out")),ee(G.green("You have been logged out successfully."))}),_a.command("whoami").description("Show auth status and current project").action(async()=>{Z.info(`${G.bold("CLI Version:")} ${G.cyan(Mr)}`);const e=Mn();if(e){Z.info(G.dim("Authentication: Environment variables")),Z.info(` ${G.bold("API Key:")} ${G.cyan(e.apiKey.slice(0,8))}...`),Z.info(` ${G.bold("Project ID:")} ${G.cyan(e.projectId)}`);const t=await ln();if(t){let e;try{e=en(t.accessToken).email}catch{e=void 0}Z.warn("Stored OAuth login detected but will be ignored (env auth takes precedence)."),e&&Z.info(` ${G.bold("OAuth Email:")} ${G.cyan(e)}`),Z.info(` ${G.bold("Tip:")} Unset env vars to use OAuth`)}return void ee(G.green("Authenticated via environment variables"))}const t=await ln();if(!t)return void ee(G.yellow("Not logged in. Run `stably login` to authenticate."));let n;try{n=en(t.accessToken).email}catch{n=void 0}const o=await pn();if(!o)return Z.info(G.dim("Authentication: OAuth (not linked to a project)")),n&&Z.info(` ${G.bold("Email:")} ${G.cyan(n)}`),void ee(G.yellow("Logged in but this directory is not linked to a project. Run `stably login` to link."));const s=await(async()=>tn(process.cwd(),on))(),i=s?r.dirname(s):process.cwd(),a=r.relative(process.cwd(),i)||".";Z.info(G.dim("Authentication: OAuth")),n&&Z.info(` ${G.bold("Email:")} ${G.cyan(n)}`),Z.info(` ${G.bold("Organization:")} ${G.cyan(o.orgName)}`),Z.info(` ${G.bold("Project:")} ${G.cyan(o.projectName)}`),Z.info(` ${G.bold("Linked at:")} ${G.dim(a)}`),ee(G.green("Authenticated"))}),_a.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=>{re(`Starting development server for port ${e.port}...`);const t=await Yn(),r="oauth"===t.type?`${t.auth.context.orgName}-${t.auth.context.projectName}`.toLowerCase().replace(/[^a-z0-9-]/g,""):`project-${t.auth.projectId}`.toLowerCase(),n=te();n.start("Starting development server...");const o=await Ie(`http://localhost:${e.port}`,{subdomain:r});n.stop(`Your local environment is available at: ]8;;${o.url}${G.underline(G.cyan(o.url))}]8;;`)}),_a.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(async(e,t)=>{const r=e.length>0&&"test"===e[0]?e.slice(1):e;return Qi({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(async(e,t)=>Qi({mode:"single",prompt:e,outputDir:t.output})),_a.command("fix [runId]").description("Fix failing tests from a run (auto-detects from last test run or CI)").action(async e=>{(function(e){try{return d("git rev-parse --is-inside-work-tree",{cwd:e,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch{return!1}})(process.cwd())||($n.error('Not a git repository. The "stably fix" command requires a git repository to track changes made during the fix. Please run this command from inside a git repository.'),process.stderr.write('Error: Not a git repository.\nThe "stably fix" command requires a git repository to track changes made during the fix.\nPlease run this command from inside a git repository.\n'),process.exit(1));const t=await(async e=>{const t=e=>e.replace(/\//g,"_");if(e)return $n.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(mr))if(mr[r].detect({env:e,cwd:t}))return{isCi:!0,...mr[r].configuration({env:e,cwd:t})};return{isCi:Boolean(e.CI),...(r={env:e,cwd:t},{commit:Mt(r),branch:Ht(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 $n.debug("Run ID detected from CI environment",{runId:r}),t(r);$n.debug("No explicit run ID or CI environment detected, checking last-run.json");const n=await(async()=>{try{const e=await tn(process.cwd(),".stably/last-run.json");if(!e)return;const t=await Y(e,"utf-8");return{...Zi.parse(JSON.parse(t)),filePath:e}}catch{return}})();if(n){const e=(Date.now()-n.timestamp)/36e5;return $n.debug("Run ID found in last-run.json",{runId:n.runId,timestamp:n.timestamp,filePath:n.filePath,ageHours:Math.round(e)}),e>24&&$n.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)}$n.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)),Qi({mode:"fix",runId:t})}),_a.command("init").description("Initialize Playwright and Stably SDK in your project").action(async()=>Qi({mode:"init"})),_a.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;oa(G.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(aa,{signal:e.signal});if(!t.ok)throw new Error(`Failed to fetch latest version: ${t.statusText}`);return ca.parse(await t.json()).version}finally{clearTimeout(t)}}();return{current:Mr,latest:e,isOutdated:ua(Mr,e)}}()}catch(e){return sa(G.red("Failed to check for updates:"),e instanceof Error?e.message:e),void(process.exitCode=1)}if(oa(`Current version: ${G.yellow(r.current)}`),oa(`Latest version: ${G.green(r.latest)}`),oa(),!r.isOutdated)return void oa(G.green("✓ You are already on the latest version!"));if(oa(G.yellow(`⚠ A new version is available: ${r.current} → ${r.latest}`)),oa(),t)return oa(G.dim("Exiting with code 1 to indicate update available (useful for CI).")),void(process.exitCode=1);const n=function(){const e=process.argv[1]||"";if(e.includes("_npx")||e.includes(".npm/_cacache"))return"npx";try{const t=d("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=d("pnpm root -g",{encoding:"utf-8"}).trim();if(e.includes(t))return"global-pnpm"}catch{}try{const t=d("yarn global dir",{encoding:"utf-8"}).trim();if(e.includes(t))return"global-yarn-classic"}catch{}try{const t=d("yarn config get globalFolder",{encoding:"utf-8"}).trim();if(e.includes(t))return"global-yarn-berry"}catch{}return"unknown"}(),o=function(e){switch(e){case"global-npm":case"global-yarn-berry":case"unknown":return{command:"npm",args:["install","-g",`${ia}@latest`],description:`npm install -g ${ia}@latest`};case"global-pnpm":return{command:"pnpm",args:["add","-g",`${ia}@latest`],description:`pnpm add -g ${ia}@latest`};case"global-yarn-classic":return{command:"yarn",args:["global","add",`${ia}@latest`],description:`yarn global add ${ia}@latest`};case"npx":return{command:"npx",args:[`${ia}@latest`],description:`npx ${ia}@latest (always uses latest)`}}}(n);if("npx"===n)return oa(G.dim("You are running via npx, which always fetches the latest version.")),void oa(G.dim(`Simply run: ${G.white("npx stably")} to use the latest version.`));"unknown"===n?(oa(G.yellow("Could not detect installation method. Falling back to npm.")),oa()):"global-yarn-berry"===n&&(oa(G.yellow("Yarn Berry does not support global packages. Falling back to npm.")),oa()),oa(`Upgrade command: ${G.cyan(o.description)}`),oa(),oa(G.cyan("Upgrading...")),oa();try{await(s=o.command,i=o.args,new Promise((e,t)=>{const r=p(s,i,{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)})})),oa(),oa(G.green("✓ Upgrade complete!")),oa(G.dim(`Run ${G.white("stably --version")} to verify.`))}catch(e){sa(G.red("Upgrade failed:"),e instanceof Error?e.message:e),oa(),oa(G.dim("You can try manually running:")),oa(G.cyan(` ${o.description}`)),process.exitCode=1}var s,i}(e)),_a.command("build",{hidden:!0}).description('(Deprecated) Use "stably create" instead').allowUnknownOption(!0).allowExcessArguments(!0).action(()=>{process.stderr.write('\n👋 "stably build" has moved! Use "stably create" instead:\n\n stably create "Read the .md files in /tests directory and then create playwright tests"\n\n'),process.exit(1)}),ea.forEach(({args:e,description:t,name:r})=>{_a.command(r).description(t).helpOption(!1).helpCommand(!1).allowUnknownOption(!0).allowExcessArguments(!0).passThroughOptions().action(()=>na({overrideArgs:e,subcommand:r}))});var Sa=()=>{0!==Ea.length&&(process.stderr.write(Ea.join("")),Ea=[])};(async()=>{await(async()=>{if(!ya&&"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":Mr,"node.version":process.version,"os.platform":process.platform}}),ya=!0}catch{}})();try{await _a.parseAsync(process.argv),$n.info("CLI completed successfully")}catch(e){if(!(e=>!!e&&"object"==typeof e&&"code"in e)(e))throw $n.error("Unexpected CLI error",{error:e instanceof Error?e.message:String(e),stack:e instanceof Error?e.stack:void 0}),Sa(),$n.flush(),$n.printLogFileInfo(),await ba(),e;const t="number"==typeof e.exitCode?e.exitCode:1,r=process.argv.slice(2).find(e=>!e.startsWith("-")),n=!!r&&!!Ta(_a,[r]);if(("commander.excessArguments"===e.code||"commander.unknownCommand"===e.code)&&r&&!n)return Ea=[],$n.warn("Unknown command",{command:r}),process.stderr.write(`command '${r}' not found\n`),xa(),void(process.exitCode=t);$n.debug("Commander error",{code:e.code,exitCode:t}),Sa(),process.exitCode=t}finally{$n.flush(),await ba()}})();
|
|
2
|
+
import{config as e,parse as t}from"dotenv";import r,{resolve as n,dirname as o,join as s,basename as i}from"path";import{Command as a}from"commander";import{Buffer as c}from"buffer";import l,{exec as u,execSync as d,spawn as p}from"child_process";import f from"process";import h,{existsSync as g,statSync as m,createReadStream as y,readFileSync as v,mkdirSync as b,writeFileSync as w,appendFileSync as _,openSync as E,readSync as I,closeSync as T,rmSync as x}from"fs";import{fileURLToPath as S,URL as A}from"url";import C,{tmpdir as R,constants as P}from"os";import"timers/promises";import U from"stream";import{debuglog as k,promisify as L,TextDecoder as D,TextEncoder as O}from"util";import{createSdkMcpServer as B,tool as N,query as $}from"@anthropic-ai/claude-agent-sdk";import{match as j}from"ts-pattern";import M,{randomUUID as H}from"crypto";import G from"picocolors";import{simpleGit as F}from"simple-git";import{readFile as V,mkdir as Y,writeFile as z,unlink as W,access as K,readdir as q,stat as J,rm as X,appendFile as Q}from"fs/promises";import{log as Z,outro as ee,spinner as te,intro as re,select as ne,isCancel as oe}from"@clack/prompts";import{createInterface as se}from"readline/promises";import ie,{z as ae}from"zod";import ce from"open";import le from"http";import ue from"pino";import de from"sonic-boom";import{z as pe}from"zod/v3";import fe from"ws";import{useState as he,useRef as ge,useEffect as me,useCallback as ye,useMemo as ve}from"react";import{jsx as be,jsxs as we}from"react/jsx-runtime";import{createRequire as _e}from"module";import{parseDocument as Ee}from"yaml";import{startTunnel as Ie}from"@stablyhq/runner-sdk";var Te={cwdChanged:!1,newCwd:void 0,envFilesLoaded:[],envFileErrors:[],remoteEnvName:void 0},xe=process.argv.findIndex(e=>"-C"===e||"--cwd"===e);if(-1!==xe&&process.argv[xe+1]){const e=process.argv[xe+1];process.chdir(e),Te.cwdChanged=!0,Te.newCwd=e,process.argv.splice(xe,2)}for(var Se=[],Ae=0;Ae<process.argv.length;)if("--env-file"===process.argv[Ae]){const e=process.argv[Ae+1];e&&!e.startsWith("-")?(Se.push(e),process.argv.splice(Ae,2)):Ae++}else Ae++;var Ce=process.argv.findIndex(e=>"--env"===e);-1!==Ce&&process.argv[Ce+1]&&!process.argv[Ce+1].startsWith("-")&&(Te.remoteEnvName=process.argv[Ce+1],process.argv.splice(Ce,2));for(const t of Se){const n=r.resolve(process.cwd(),t),o=e({path:n,override:!0,quiet:!0});if(o.error){const e=`warning: could not load env file: ${n} (${o.error.message})`;Te.envFileErrors.push(e),process.stderr.write(`${e}\n`)}else Te.envFilesLoaded.push(n)}var Re={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 Pe(e){return(/\d+(?!.*\d+)/.exec(e)||[])[0]}function Ue(e){return e?/^(?:refs\/heads\/)?(?<branch>.+)$/i.exec(e)[1]:void 0}var ke={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:Ue(r?e.SYSTEM_PULLREQUEST_TARGETBRANCH:e.BUILD_SOURCEBRANCH),pr:t,isPr:r,prBranch:Ue(r?e.SYSTEM_PULLREQUEST_SOURCEBRANCH:void 0),root:e.BUILD_REPOSITORY_LOCALPATH}}},Le={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})},De={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})},Oe={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}}},Be={detect:({env:e})=>Boolean(e.BUDDY_WORKSPACE_ID),configuration({env:e}){const t=Pe(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}}},Ne="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function $e(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var je,Me,He,Ge,Fe,Ve,Ye,ze,We={exports:{}};var Ke,qe,Je,Xe,Qe,Ze,et,tt,rt,nt,ot,st,it,at,ct,lt={exports:{}},ut={};function dt(){if(st)return ot;st=1;const e=r,t=function(){if(Je)return qe;Je=1;const e=r,t=function(){if(ze)return Ye;ze=1;const e="win32"===process.platform||"cygwin"===process.env.OSTYPE||"msys"===process.env.OSTYPE,t=r,n=e?";":":",o=function(){if(Ve)return Fe;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 Ve=1,e="win32"===process.platform||Ne.TESTING_WINDOWS?function(){if(Me)return je;Me=1,je=r,r.sync=function(r,n){return t(e.statSync(r),r,n)};var e=h;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 je}():function(){if(Ge)return He;Ge=1,He=t,t.sync=function(t,n){return r(e.statSync(t),n)};var e=h;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 He}(),Fe=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}},Fe}(),s=e=>Object.assign(new Error(`not found: ${e}`),{code:"ENOENT"}),i=(t,r)=>{const o=r.colon||n,s=t.match(/\//)||e&&t.match(/\\/)?[""]:[...e?[process.cwd()]:[],...(r.path||process.env.PATH||"").split(o)],i=e?r.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}},a=(e,r,n)=>{"function"==typeof r&&(n=r,r={}),r||(r={});const{pathEnv:a,pathExt:c,pathExtExe:l}=i(e,r),u=[],d=n=>new Promise((o,i)=>{if(n===a.length)return r.all&&u.length?o(u):i(s(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;o(p(f,n,0))}),p=(e,t,n)=>new Promise((s,i)=>{if(n===c.length)return s(d(t+1));const a=c[n];o(e+a,{pathExt:l},(o,i)=>{if(!o&&i){if(!r.all)return s(e+a);u.push(e+a)}return s(p(e,t,n+1))})});return n?d(0).then(e=>n(null,e),n):d(0)};return Ye=a,a.sync=(e,r)=>{r=r||{};const{pathEnv:n,pathExt:a,pathExtExe:c}=i(e,r),l=[];for(let s=0;s<n.length;s++){const i=n[s],u=/^".*"$/.test(i)?i.slice(1,-1):i,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(o.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 s(e)},Ye}(),n=function(){if(Ke)return lt.exports;Ke=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 lt.exports=e,lt.exports.default=e,lt.exports}();function o(r,o){const s=r.options.env||process.env,i=process.cwd(),a=null!=r.options.cwd,c=a&&void 0!==process.chdir&&!process.chdir.disabled;if(c)try{process.chdir(r.options.cwd)}catch(e){}let l;try{l=t.sync(r.command,{path:s[n({env:s})],pathExt:o?e.delimiter:void 0})}catch(e){}finally{c&&process.chdir(i)}return l&&(l=e.resolve(a?r.options.cwd:"",l)),l}return qe=function(e){return o(e)||o(e,!0)}}(),n=function(){if(Xe)return ut;Xe=1;const e=/([()\][%!^"`<>&|;, *?])/g;return ut.command=function(t){return t.replace(e,"^$1")},ut.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},ut}(),o=function(){if(nt)return rt;nt=1;const e=h,t=function(){if(tt)return et;tt=1;const e=Ze?Qe:(Ze=1,Qe=/^#!(.*)/);return et=(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 rt=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())}}(),s="win32"===process.platform,i=/\.(?:com|exe)$/i,a=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;return ot=function(r,c,l){c&&!Array.isArray(c)&&(l=c,c=null);const u={command:r,args:c=c?c.slice(0):[],options:l=Object.assign({},l),file:void 0,original:{command:r,args:c}};return l.shell?u:function(r){if(!s)return r;const c=function(e){e.file=t(e);const r=e.file&&o(e.file);return r?(e.args.unshift(e.file),e.command=r,t(e)):e.file}(r),l=!i.test(c);if(r.options.forceShell||l){const t=a.test(c);r.command=e.normalize(r.command),r.command=n.command(r.command),r.args=r.args.map(e=>n.argument(e,t));const o=[r.command].concat(r.args).join(" ");r.args=["/d","/s","/c",`"${o}"`],r.command=process.env.comspec||"cmd.exe",r.options.windowsVerbatimArguments=!0}return r}(u)}}var pt=$e(function(){if(ct)return We.exports;ct=1;const e=l,t=dt(),r=function(){if(at)return it;at=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 it={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},it}();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 We.exports=n,We.exports.spawn=n,We.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},We.exports._parse=t,We.exports._enoent=r,We.exports}());function ft(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 ht=(e,t)=>({name:`SIGRT${t+1}`,number:gt+t,action:"terminate",description:"Application-specific signal (realtime)",standard:"posix"}),gt=34,mt=[{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"}],yt=()=>{const e=(()=>{const e=64-gt+1;return Array.from({length:e},ht)})();return[...mt,...e].map(vt)},vt=({name:e,number:t,description:r,action:n,forced:o=!1,standard:s})=>{const{signals:{[e]:i}}=P,a=void 0!==i;return{name:e,number:a?i:t,description:r,supported:a,action:n,forced:o,standard:s}},bt=({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}],wt=(()=>{const e=yt();return Object.fromEntries(e.map(bt))})();(()=>{const e=yt(),t=Array.from({length:65},(t,r)=>((e,t)=>{const r=((e,t)=>{const r=t.find(({name:t})=>P.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:a,standard:c}=r;return{[e]:{name:n,number:e,description:o,supported:s,action:i,forced:a,standard:c}}})(r,e));Object.assign({},...t)})();var _t=({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=f.cwd()}}})=>{s=null===s?void 0:s;const h=void 0===(o=null===o?void 0:o)?void 0:wt[o].description,g=(({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:h,exitCode:s,isCanceled:l}),m=`Command ${g}: ${i}`,y="[object Error]"===Object.prototype.toString.call(n),v=y?`${m}\n${n.message}`:m,b=[v,t,e].filter(Boolean).join("\n");return y?(n.originalMessage=n.message,n.message=b):n=new Error(b),n.shortMessage=v,n.command=i,n.escapedCommand=a,n.exitCode=s,n.signal=o,n.signalDescription=h,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},Et=["stdin","stdout","stderr"],It=[];It.push("SIGHUP","SIGINT","SIGTERM"),"win32"!==process.platform&&It.push("SIGALRM","SIGABRT","SIGVTALRM","SIGXCPU","SIGXFSZ","SIGUSR2","SIGTRAP","SIGSYS","SIGQUIT","SIGIOT"),"linux"===process.platform&&It.push("SIGIO","SIGPOLL","SIGPWR","SIGSTKFLT");var Tt,xt,St=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,At=Symbol.for("signal-exit emitter"),Ct=globalThis,Rt=Object.defineProperty.bind(Object),Pt=class{emitted={afterExit:!1,exit:!1};listeners={afterExit:[],exit:[]};count=0;id=Math.random();constructor(){if(Ct[At])return Ct[At];Rt(Ct,At,{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}},Ut=class{},kt=globalThis.process;St(kt)?new class extends Ut{#e="win32"===kt.platform?"SIGINT":"SIGHUP";#t=new Pt;#r;#n;#o;#s={};#i=!1;constructor(e){super(),this.#r=e,this.#s={};for(const t of It)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(!St(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 It)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,It.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 St(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&&St(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)}}(kt):new class extends Ut{onExit(){return()=>{}}load(){}unload(){}},new TextEncoder,function(){if(xt)return Tt;xt=1;const{PassThrough:e}=U;Tt=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 Lt=(async()=>{})().constructor.prototype;["then","catch","finally"].map(e=>[e,Reflect.getOwnPropertyDescriptor(Lt,e)]);var Dt=(e,t=[])=>Array.isArray(t)?[e,...t]:[e],Ot=/^[\w.-]+$/,Bt=k("execa").enabled,Nt=(e,t)=>String(e).padStart(t,"0"),$t=(e,t,n={})=>{const o=pt._parse(e,t,n);return e=o.command,t=o.args,(n={maxBuffer:1e8,buffer:!0,stripFinalNewline:!0,extendEnv:!0,preferLocal:!1,localDir:(n=o.options).cwd||f.cwd(),execPath:f.execPath,encoding:"utf8",reject:!0,cleanup:!0,all:!1,windowsHide:!0,verbose:Bt,...n}).env=(({env:e,extendEnv:t,preferLocal:n,localDir:o,execPath:s})=>{const i=t?{...f.env,...e}:e;return n?(({env:e=f.env,...t}={})=>{const n=ft({env:e={...e}});return t.path=e[n],e[n]=(({cwd:e=f.cwd(),path:t=f.env[ft()],preferLocal:n=!0,execPath:o=f.execPath,addExecPath:s=!0}={})=>{const i=e instanceof URL?S(e):e,a=r.resolve(i),c=[];return n&&((e,t)=>{let n;for(;n!==t;)e.push(r.join(t,"node_modules/.bin")),n=t,t=r.resolve(t,"..")})(c,a),s&&((e,t,n)=>{const o=t instanceof URL?S(t):t;e.push(r.resolve(n,o,".."))})(c,o,a),[...c,t].join(r.delimiter)})(t),e})({env:i,cwd:o,execPath:s}):i})(n),n.stdio=(e=>{if(!e)return;const{stdio:t}=e;if(void 0===t)return Et.map(t=>e[t]);if((e=>Et.some(t=>void 0!==e[t]))(e))throw new Error(`It's not possible to provide \`stdio\` in combination with one of ${Et.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,Et.length);return Array.from({length:r},(e,r)=>t[r])})(n),"win32"===f.platform&&"cmd"===r.basename(e,".exe")&&t.unshift("/q"),{file:e,args:t,options:n,parsed:o}},jt=(e,t,r)=>"string"==typeof t||c.isBuffer(t)?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}(t):t:void 0===r?void 0:"";function Mt(e,t,r){const n=$t(e,t,r),o=((e,t)=>Dt(e,t).join(" "))(e,t),s=((e,t)=>Dt(e,t).map(e=>(e=>"string"!=typeof e||Ot.test(e)?e:`"${e.replaceAll('"','\\"')}"`)(e)).join(" "))(e,t);((e,{verbose:t})=>{t&&f.stderr.write(`[${(()=>{const e=new Date;return`${Nt(e.getHours(),2)}:${Nt(e.getMinutes(),2)}:${Nt(e.getSeconds(),2)}.${Nt(e.getMilliseconds(),3)}`})()}] ${e}\n`)})(s,n.options);const i=(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),v(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 a;try{a=l.spawnSync(n.file,n.args,{...n.options,input:i})}catch(e){throw _t({error:e,stdout:"",stderr:"",all:"",command:o,escapedCommand:s,parsed:n,timedOut:!1,isCanceled:!1,killed:!1})}const c=jt(n.options,a.stdout,a.error),u=jt(n.options,a.stderr,a.error);if(a.error||0!==a.status||null!==a.signal){const e=_t({stdout:c,stderr:u,error:a.error,signal:a.signal,exitCode:a.status,command:o,escapedCommand:s,parsed:n,timedOut:a.error&&"ETIMEDOUT"===a.error.code,isCanceled:!1,killed:null!==a.signal});if(!n.options.reject)return e;throw e}return{command:o,escapedCommand:s,exitCode:0,stdout:c,stderr:u,failed:!1,timedOut:!1,isCanceled:!1,killed:!1}}function Ht(e){try{return Mt("git",["rev-parse","HEAD"],e).stdout}catch{return}}function Gt(e){try{const t=Mt("git",["rev-parse","--abbrev-ref","HEAD"],e).stdout;if("HEAD"===t){const t=Mt("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 Ft=/^(?:.*)@(?:.*):(?:\d+\/)?(.*)\.git$/,Vt=/^\/(.*)\.git$/;function Yt(e){if(e){if(e.match(Ft))return e.replace(Ft,"$1");try{return new URL(e).pathname.replace(Vt,"$1")}catch{return}}}var zt,Wt={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:Yt(e.BUILDKITE_REPO),pr:t,isPr:r,prBranch:r?e.BUILDKITE_BRANCH:void 0,root:e.BUILDKITE_BUILD_CHECKOUT_PATH}}},Kt={detect:({env:e})=>Boolean(e.CIRCLECI),configuration({env:e}){const t=e.CIRCLE_PR_NUMBER||Pe(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}`}}},qt="https://cirrus-ci.com",Jt={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:`${qt}/build/${e.CIRRUS_BUILD_ID}`,job:e.CIRRUS_TASK_ID,jobUrl:`${qt}/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}}},Xt={detect:({env:e})=>Boolean(e.CODEBUILD_BUILD_ID),configuration:({env:e,cwd:t})=>({name:"AWS CodeBuild",service:"codebuild",commit:Ht({env:e,cwd:t}),build:e.CODEBUILD_BUILD_ID,branch:Gt({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})},Qt={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}}},Zt={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}}},er=({env:e})=>{try{const t=e.GITHUB_EVENT_PATH?JSON.parse(v(e.GITHUB_EVENT_PATH,"utf-8")):void 0;if(t&&t.pull_request)return{branch:t.pull_request.base?Ue(t.pull_request.base.ref):void 0,pr:t.pull_request.number}}catch{}return{pr:void 0,branch:void 0}},tr={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=Ue("pull_request_target"===e.GITHUB_EVENT_NAME?`refs/pull/${(e=>{const t=e.GITHUB_EVENT_PATH?JSON.parse(v(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?er({env:e}):void 0}}},rr={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}}},nr={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||Ht({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}}},or={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}}},sr={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})},ir={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}}},ar={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}}},cr={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}}},lr={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||Ht({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}}},ur={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}}},dr={};function pr(){if(zt)return dr;zt=1,Object.defineProperty(dr,"__esModule",{value:!0}),dr.of=dr.PropertiesFile=void 0;var e,t=(e=h)&&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 dr.PropertiesFile=r,dr.of=function(...e){let t=new r;return t.of.apply(t,e),t},dr}var fr=$e(pr()),hr={root:"teamcity.build.workingDir",branch:"teamcity.build.branch"},gr=e=>{try{return fr.of(e)}catch{return}},mr=({env:e,cwd:t})=>{const r=e.TEAMCITY_BUILD_PROPERTIES_FILE?gr(e.TEAMCITY_BUILD_PROPERTIES_FILE):void 0,n=r?r.get("teamcity.configuration.properties.file"):void 0,o=n?gr(n):n;return Object.fromEntries(Object.keys(hr).map(n=>[n,(r?r.get(hr[n]):void 0)||(o?o.get(hr[n]):void 0)||("branch"===n?Gt({env:e,cwd:t}):void 0)]))},yr={appveyor:Re,azurePipelines:ke,bamboo:Le,bitbucket:De,bitrise:Oe,buddy:Be,buildkite:Wt,circleci:Kt,cirrus:Jt,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:Xt,codefresh:Qt,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:Zt,github:tr,gitlab:rr,jenkins:nr,netlify:or,puppet:sr,sail:ir,screwdriver:ar,scrutinizer:cr,semaphore:lr,shippable:ur,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,...mr({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:Ue(e.JB_SPACE_GIT_BRANCH),slug:t&&r?`${t.toLowerCase()}/${r}`:void 0}}}},vr=class e{git;config;snapshotTreeHash;snapshotIndexPath;constructor(e){this.config=e,this.git=F({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=s(R(),`git-diff-tracker-${H()}.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=s(R(),`git-diff-tracker-${H()}.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 br(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 br(this.snapshotIndexPath),this.snapshotIndexPath=void 0),this.snapshotTreeHash=void 0}};async function br(e){try{await W(e)}catch{}}var wr="x-stably-org-id",_r={bodySerializer:e=>JSON.stringify(e,(e,t)=>"bigint"==typeof t?t.toString():t)},Er=({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):Ir({allowReserved:e,name:r,value:t})).join(s);return"label"===n||"matrix"===n?s+i:i},Ir=({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)}`},Tr=({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])=>Ir({allowReserved:e,name:"deepObject"===n?`${r}[${t}]`:t,value:o})).join(i);return"label"===n||"matrix"===n?i+a:a},xr=/\{[^{}]+\}/g;function Sr(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 Ar,Cr=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},Rr=({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=Er({allowReserved:i.allowReserved,explode:!0,name:o,style:"form",value:s,...i.array});e&&n.push(e)}else if("object"==typeof s){const e=Tr({allowReserved:i.allowReserved,explode:!0,name:o,style:"deepObject",value:s,...i.object});e&&n.push(e)}else{const e=Ir({allowReserved:i.allowReserved,name:o,value:s});e&&n.push(e)}}return n.join("&")},Pr=(e,t)=>!!t&&!!(e.headers.has(t)||e.query?.[t]||e.headers.get("Cookie")?.includes(`${t}=`)),Ur=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(xr);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,Er({explode:n,name:o,style:s,value:i}));continue}if("object"==typeof i){r=r.replace(t,Tr({explode:n,name:o,style:s,value:i,valueOnly:!0}));continue}if("matrix"===s){r=r.replace(t,`;${Ir({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:Rr(e.querySerializer),url:e.url}),kr=(e,t)=>{const r={...e,...t};return r.baseUrl?.endsWith("/")&&(r.baseUrl=r.baseUrl.substring(0,r.baseUrl.length-1)),r.headers=Dr(e.headers,t.headers),r},Lr=e=>{const t=[];return e.forEach((e,r)=>{t.push([r,e])}),t},Dr=(...e)=>{const t=new Headers;for(const r of e){if(!r)continue;const e=r instanceof Headers?Lr(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},Or=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}},Br=Rr({allowReserved:!1,array:{explode:!0,style:"form"},object:{explode:!0,style:"deepObject"}}),Nr={"Content-Type":"application/json"},$r=(e={})=>({..._r,headers:Nr,parseAs:"auto",querySerializer:Br,...e}),jr=(e={})=>{let t=kr($r(),e);const r=()=>({...t}),n={error:new Or,request:new Or,response:new Or},o=async e=>{const r={...t,...e,fetch:e.fetch??t.fetch??globalThis.fetch,headers:Dr(t.headers,e.headers),serializedBody:void 0};return r.security&&await(async({security:e,...t})=>{for(const r of e){if(Pr(t,r.name))continue;const e=await Cr(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:Ur(r)}},s=async e=>{const{opts:t,url:r}=await o(e),s={redirect:"follow",...t,body:Sr(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)));return{stream: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 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:"))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",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)}}}()}})({...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:Ur,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=kr(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")}},Mr=jr($r({baseUrl:"https://api.stably.ai"})),Hr="4.8.0",Gr=process.env.STABLY_API_URL||"https://api.stably.ai",Fr=e=>{const t=new URL(e);return t.protocol="http:"===t.protocol?"ws:":"wss:",t},Vr=process.env.AUTH_URL||"https://auth.stably.ai",Yr=process.env.AUTH_CLIENT_ID||"288007877071cce81f269428ea78653a",zr=process.env.AI_PROXY_URL||"https://ai-proxy.stably.ai",Wr=process.env.STABLY_AUTOHEAL_WS_URL||new URL("/autoheal",Fr(Gr)).toString(),Kr=process.env.STABLY_CREATE_PROGRESS_WS_URL||new URL("/create-progress",Fr(Gr)).toString(),qr="http://localhost:9876/auth/callback",Jr=()=>Ar||(Ar=jr($r({baseUrl:Gr,headers:{"X-STABLY-CLI-VERSION":Hr,"X-STABLY-SOURCE":"cli"}}))),Xr=async(e,t)=>{const r=await(n={body:{accessToken:e,orgId:t},client:Jr()},(n.client??Mr).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},Qr=ae.object({org_id:ae.string(),org_name:ae.string()}),Zr=ae.object({email:ae.string(),org_id_to_org_member_info:ae.record(ae.string(),Qr).optional(),org_member_info:Qr.optional(),user_id:ae.string()});ae.object({email:ae.string(),firstName:ae.string().optional(),lastName:ae.string().optional(),organizations:ae.array(ae.object({id:ae.string(),name:ae.string()})),userId:ae.string()});var en=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)},tn=e=>{try{const t=Zr.parse(en(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"}`)}},rn=async(e,t)=>{let n=e;const{root:o}=r.parse(n);for(;n!==o;){const e=r.join(n,t);try{return await K(e),e}catch{n=r.dirname(n)}}},nn=r.join(C.homedir(),".stably"),on=r.join(nn,"auth.json"),sn=".stably",an="project.json",cn=ie.object({accessToken:ie.string(),expiresAt:ie.number(),idToken:ie.string().optional(),refreshToken:ie.string()}),ln=ie.object({orgId:ie.string(),orgName:ie.string(),projectId:ie.string(),projectName:ie.string()}),un=async()=>{try{const e=await V(on,"utf-8");return cn.parse(JSON.parse(e))}catch{return}},dn=async e=>{await Y(nn,{recursive:!0}),await z(on,JSON.stringify(e,null,2),{mode:384})},pn=async()=>{try{await W(on)}catch{}},fn=async()=>{try{const e=await rn(process.cwd(),sn);if(!e)return;const t=r.join(e,an),n=await V(t,"utf-8");return ln.parse(JSON.parse(n))}catch{return}},hn=async()=>{try{const e=await rn(process.cwd(),sn);e&&await W(r.join(e,an))}catch{}},gn=e=>Date.now()>=e.expiresAt-3e5,mn=async e=>{const t=new URLSearchParams({client_id:Yr,grant_type:"refresh_token",refresh_token:e}),r=await fetch(`${Vr}/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}},yn=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`,vn=(e,t,r)=>{e.writeHead(t,{"Content-Type":"text/html"}),e.end(r)},bn=(e,t)=>{const r=new URLSearchParams({client_id:Yr,code_challenge:e,code_challenge_method:"S256",redirect_uri:qr,response_type:"code",state:t});return`${Vr}/propelauth/oauth/authorize?${r.toString()}`},wn=async e=>{const t=te();let n;t.start("Loading user info...");try{n=tn(e.accessToken),t.stop(G.green(`✓ Logged in as ${G.cyan(n.email)}`))}catch(e){t.stop(G.red("✗ Failed to load user info"));const r=e instanceof Error?e.message:"Unknown error";return Z.error(r),{success:!1}}const o=await(async e=>{if(0===e.length)return void Z.error("You don't belong to any organizations.");if(1===e.length)return Z.info(`Using organization: ${G.cyan(e[0].name)}`),e[0];if(!process.stdin.isTTY)return Z.info(`Auto-selecting organization: ${G.cyan(e[0].name)}`),e[0];const t=await ne({message:"Select an organization",options:[...e].sort((e,t)=>e.name.localeCompare(t.name)).map(e=>({label:e.name,value:e.id}))});return oe(t)?void 0:e.find(e=>e.id===t)})(n.organizations);if(!o)return Z.warn("Organization selection cancelled."),{success:!1};let s;t.start("Getting org credentials...");try{const r=await Xr(e.accessToken,o.id);s={accessToken:r.accessToken,expiresAt:Date.now()+1e3*r.expiresInSeconds,idToken:e.idToken,refreshToken:e.refreshToken},t.stop(G.green("✓ Credentials obtained"))}catch(e){t.stop(G.red("✗ Failed to get org credentials"));const r=e instanceof Error?e.message:"Unknown error";return Z.error(r),{success:!1}}const i=await(async(e,t)=>{const r=te();let n;r.start("Loading projects...");try{n=await(async({accessToken:e,orgId:t})=>{const r=await(n={auth:e,client:Jr(),path:{orgId:t}},(n.client??Mr).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(G.green("✓ Projects loaded"))}catch(e){r.stop(G.red("✗ Failed to load projects"));const t=e instanceof Error?e.message:"Unknown error";return void Z.error(t)}if(0===n.length)return Z.error("No projects found in this organization."),void Z.info(`Create a project at ${G.underline(G.cyan("https://app.stably.ai"))}`);if(1===n.length)return Z.info(`Using project: ${G.cyan(n[0].name)}`),n[0];if(!process.stdin.isTTY)return Z.info(`Auto-selecting project: ${G.cyan(n[0].name)}`),n[0];const o=await ne({message:"Select a project",options:n.map(e=>({label:e.name,value:e.id}))});return oe(o)?void 0:n.find(e=>e.id===o)})(s.accessToken,o.id);return i?(await(async e=>{const t=r.join(process.cwd(),sn),n=r.join(t,an);await Y(t,{recursive:!0}),await z(n,JSON.stringify(e,null,2)),await(async e=>{const t=r.join(e,".gitignore"),n="# Stably CLI (only docs/ are tracked)\n.stably/*\n!.stably/docs/";try{const e=await V(t,"utf-8"),r=e.split("\n").map(e=>e.trim());if(r.includes(".stably/*")&&r.includes("!.stably/docs/"))return;const o=/^# Stably CLI\n\.stably\/?$/m,s=/^\.stably\/?$/m;if(o.test(e)){const r=e.replace(o,`\n${n}\n`);await z(t,r)}else if(s.test(e)){const r=e.replace(s,`\n${n}\n`);await z(t,r)}else await Q(t,`\n${n}\n`)}catch{await z(t,`${n}\n`)}})(process.cwd())})({orgId:o.id,orgName:o.name,projectId:i.id,projectName:i.name}),Z.info(G.dim("Linked this directory to your Stably project.")),{scopedTokens:s,success:!0}):(Z.warn("Project selection cancelled."),{success:!1})},_n=async()=>{if(Hn())return Z.warn(`Environment variables ${G.cyan("STABLY_API_KEY")} and ${G.cyan("STABLY_PROJECT_ID")} are set.`),Z.warn("These will be used for authentication instead of OAuth login."),Z.warn("To use OAuth login, unset these environment variables first."),void ee(G.yellow("Login skipped - using environment variable authentication."));const e=await un();if(e){if(!gn(e)){if(await fn())return void ee(G.yellow("You are already logged in. Run `stably logout` first to log out."));Z.info("You are logged in but haven't selected a project yet.");const t=await wn(e);return void(t.success?(await dn(t.scopedTokens),ee(G.green("Setup complete! You can now use Stably CLI."))):ee(G.yellow("Setup incomplete. Run `stably login` to try again.")))}const t=te();t.start("Refreshing session...");try{const r=await mn(e.refreshToken);t.stop(G.green("✓ Session refreshed"));const n=await fn();if(n){t.start("Getting org credentials...");try{const e=await Xr(r.accessToken,n.orgId),o={accessToken:e.accessToken,expiresAt:Date.now()+1e3*e.expiresInSeconds,idToken:r.idToken,refreshToken:r.refreshToken};await dn(o),t.stop(G.green("✓ Credentials obtained")),ee(G.green("Login successful"))}catch{await dn(r),t.stop(G.yellow("Using full credentials")),ee(G.green("Login successful"))}}else{const e=await wn(r);e.success?(await dn(e.scopedTokens),ee(G.green("Setup complete! You can now use Stably CLI."))):ee(G.yellow("Setup incomplete. Run `stably login` to try again."))}return}catch{t.stop(G.yellow("Session expired, proceeding with fresh login...")),await pn(),await hn()}}const{authorizeUrl:t,serverReady:r,waitForCallback:n}=(()=>{const{authorizeUrl:e,codeVerifier:t,state:r}=(()=>{const e=M.randomBytes(32).toString("base64url"),t=(r=e,M.createHash("sha256").update(r).digest("base64url"));var r;const n=M.randomBytes(16).toString("base64url");return{authorizeUrl:bn(t,n),codeVerifier:e,state:n}})(),{ready:n,result:o}=(e=>{let t,r;return{ready:new Promise((e,n)=>{t=e,r=n}),result:new Promise((n,o)=>{const s=setTimeout(()=>{a.close(),n({error:"Login timed out",success:!1})},3e5),i=()=>{clearTimeout(s)},a=le.createServer((t,r)=>{const o=new A(t.url||"","http://localhost:9876");if("/auth/callback"!==o.pathname)return r.writeHead(404),void r.end("Not found");const s=o.searchParams.get("code"),c=o.searchParams.get("state"),l=o.searchParams.get("error");return l?(vn(r,400,yn(l)),i(),a.close(),void n({error:l,success:!1})):s&&c?c!==e?(vn(r,400,yn("Invalid state parameter (possible CSRF attack)")),i(),a.close(),void n({error:"State mismatch",success:!1})):(vn(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'),i(),a.close(),void n({code:s,state:c,success:!0})):(vn(r,400,yn("Missing code or state parameter")),i(),a.close(),void n({error:"Missing code or state parameter",success:!1}))});a.on("error",e=>{if(i(),"EADDRINUSE"===e.code){const e=new Error("Port 9876 is already in use. Please close the application using it and try again.");return r(e),void o(e)}const t=new Error(`Failed to start callback server: ${e.message}`);r(t),o(t)}),a.listen(9876,()=>{t()})})}})(r);return{authorizeUrl:e,serverReady:n,waitForCallback:async()=>{const e=await o;if(!e.success)throw new Error(e.error);return(async(e,t)=>{const r=new URLSearchParams({client_id:Yr,code:e,code_verifier:t,grant_type:"authorization_code",redirect_uri:qr}),n=await fetch(`${Vr}/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}})(e.code,t)}}})();await r,Z.info("Opening browser for authentication..."),Z.info(G.dim("If browser doesn't open, visit:")),Z.info(`]8;;${t}${G.underline(G.cyan(t))}]8;;`);try{await ce(t)}catch{Z.warn("Could not open browser automatically. Please open the URL above manually.")}const o=te();let s;o.start("Waiting for authentication...");try{s=await n(),o.stop(G.green("✓ Authentication successful"))}catch(e){o.stop(G.red("✗ Authentication failed"));const t=e instanceof Error?e.message:"Unknown error";ee(G.red(`Login failed: ${t}`)),process.exit(1)}const i=await wn(s);i.success?(await dn(i.scopedTokens),ee(G.green("Setup complete! You can now use Stably CLI."))):(ee(G.yellow("Setup incomplete. Run `stably login` to try again.")),process.exit(1))},En={fatal:60,error:50,warn:40,info:30,debug:20,trace:10},In=new Set(["help","login","logout","whoami","tunnel","create","fix","init","upgrade","test","show-report","codegen"]),Tn=(new Date).toISOString().split("T")[0],xn=r.join(C.tmpdir(),"stably-logs",Tn);h.mkdirSync(xn,{recursive:!0});var Sn,An=process.argv.includes("--verbose")||process.argv.includes("-v"),Cn=process.env.STABLY_LOG_LEVEL?.toLowerCase(),Rn=An?"debug":void 0!==(Sn=Cn)&&Sn in En?Cn:"warn",Pn=En[Rn],Un=null,kn=null,Ln=null,Dn=[],On=!1,Bn=e=>{if(!On){Un=(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("-")})(),n=((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 r.join(xn,`${t}-${n}.log`)})(e),(e=>{const t=["","=".repeat(60),"Stably CLI Debug Log",`Version: ${Hr}`,`Generated: ${(new Date).toISOString()}`,`Node: ${process.version}`,`Platform: ${process.platform} ${C.release()}`,`CWD: ${process.cwd()}`,`Args: ${process.argv.slice(2).join(" ")}`,`Log Level (console): ${Rn}`,"=".repeat(60),""].join("\n");e.write(t)})(kn=new de({dest:Un,minLength:4096,sync:!1,append:!0})),Ln=ue({level:"debug",timestamp:ue.stdTimeFunctions.isoTime,base:{version:Hr}},kn);for(const{level:e,msg:t,context:r}of Dn)r?Ln[e](r,t):Ln[e](t);Dn=[],On=!0,An&&process.stderr.write(`${G.dim(`Debug log: ${Un}`)}\n\n`)}},Nn=(()=>{const e=process.argv.slice(2).find(e=>!e.startsWith("-"));return e&&In.has(e)?e:null})();Nn&&Bn(Nn);var $n=e=>(t,r)=>{if(Ln?r?Ln[e](r,t):Ln[e](t):Dn.push({level:e,msg:t,context:r}),(e=>En[e]>=Pn)(e)){const r=((e,t)=>`${{fatal:G.bgRed(G.white(" FATAL ")),error:G.red("error"),warn:G.yellow("warn"),info:G.cyan("info"),debug:G.dim("debug"),trace:G.dim("trace")}[e]} ${t}`)(e,t);process.stderr.write(`${r}\n`)}},jn={fatal:$n("fatal"),error:$n("error"),warn:$n("warn"),info:$n("info"),debug:$n("debug"),trace:$n("trace"),initSession:e=>{On||Bn(e)},getLogFilePath:()=>Un,flush:()=>{if(kn)try{kn.flushSync()}catch{}},printLogFileInfo:()=>{Un&&(process.stderr.write(`\n${G.dim("Debug log written to:")}\n`),process.stderr.write(` ${G.cyan(Un)}\n`),process.stderr.write(`${G.dim("Share this file with support for assistance.")}\n`))},getPinoLogger:()=>Ln};setInterval(()=>{jn.flush()},3e4).unref(),process.on("beforeExit",()=>{jn.flush()});var Mn=e=>{const t=()=>{jn.flush(),An&&jn.printLogFileInfo(),process.removeListener(e,t),process.kill(process.pid,e)};return t};process.on("SIGINT",Mn("SIGINT")),process.on("SIGTERM",Mn("SIGTERM"));var Hn=()=>{const e=process.env.STABLY_API_KEY?.trim(),t=process.env.STABLY_PROJECT_ID?.trim();if(e&&t)return jn.debug("Environment auth detected",{hasApiKey:!0,hasProjectId:!0}),{apiKey:e,projectId:t};jn.debug("Environment auth not set",{hasApiKey:!!e,hasProjectId:!!t})},Gn=!1,Fn=()=>{Gn||(Gn=!0,Z.warn("Both environment variable auth and stored OAuth login were detected."),Z.warn(`Honoring environment variables (${G.cyan("STABLY_API_KEY")} + ${G.cyan("STABLY_PROJECT_ID")}).`),Z.warn("To use OAuth login instead, unset those environment variables."))},Vn=async()=>{jn.debug("Checking for stored auth tokens");const e=await un();if(!e)return void jn.debug("No stored auth tokens found");const t=gn(e);if(jn.debug("Auth tokens status",{expired:t}),!t){const t=await fn(),r=(e=>{try{const t=Zr.parse(en(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(jn.debug("Token scope check",{scope:r,hasContext:!!t}),t&&"full"===r)try{jn.debug("Exchanging full token for org-scoped token",{orgId:t.orgId});const r=await Xr(e.accessToken,t.orgId),n={accessToken:r.accessToken,expiresAt:Date.now()+1e3*r.expiresInSeconds,idToken:e.idToken,refreshToken:e.refreshToken};return await dn(n),jn.debug("Token exchange successful"),n}catch(t){return jn.debug("Token exchange failed, using existing token",{error:t instanceof Error?t.message:String(t)}),e}return e}try{jn.debug("Attempting token refresh");const t=await mn(e.refreshToken);jn.debug("Token refresh successful");const r=await fn();if(r)try{jn.debug("Exchanging refreshed token for org-scoped token");const e=await Xr(t.accessToken,r.orgId),n={accessToken:e.accessToken,expiresAt:Date.now()+1e3*e.expiresInSeconds,idToken:t.idToken,refreshToken:t.refreshToken};return await dn(n),n}catch{return await dn(t),t}return await dn(t),t}catch(e){return void jn.warn("Token refresh failed",{error:e instanceof Error?e.message:String(e)})}},Yn=async(e={})=>{jn.debug("Requiring authentication",{autoLogin:e.autoLogin});const t=Hn();if(t){jn.info("Using environment variable authentication");try{await un()&&Fn()}catch{}return{auth:t,type:"env"}}let r=await Vn(),n=r?await fn():void 0;const o=process.stdin.isTTY&&process.stdout.isTTY;if(jn.debug("OAuth auth check",{hasTokens:!!r,hasContext:!!n,canPrompt:o}),(!r||!n)&&e.autoLogin&&o){jn.info("Prompting user to login"),r?Z.info("You are logged in but need to select an organization and project."):Z.info("You are not logged in."),Z.info("Press Enter to log in."),process.stdout.write(`${G.dim("Alternatively, set environment variables for an org API key:")}\n${G.dim(" STABLY_API_KEY=... STABLY_PROJECT_ID=... stably")}\n`),process.stdout.write("\n");const e=se({input:process.stdin,output:process.stdout});try{await e.question(G.dim("Press Enter to continue... "))}finally{e.close()}await _n(),r=await Vn(),n=r?await fn():void 0}return r||(jn.warn("Authentication required but no tokens available"),ee(G.red("You are not logged in. Run `stably login` to authenticate.")),process.exit(1)),n||(jn.warn("Authentication succeeded but no project context selected"),ee(G.red("You haven't selected an organization and project. Run `stably login` to complete setup.")),process.exit(1)),jn.info("OAuth authentication successful",{orgId:n.orgId,projectId:n.projectId}),{auth:{accessToken:r.accessToken,context:n},type:"oauth"}},zn=e=>"env"===e.type?e.auth.projectId:e.auth.context.projectId,Wn=e=>"env"===e.type?e.auth.apiKey:e.auth.accessToken,Kn=e=>e?{...process.env,...e}:process.env,qn=async()=>{jn.info("[test] Resolving Stably test env");const e=(()=>{if(process.env.STABLY_WS_URL)return;if("https://api.stably.ai"===Gr)return;const e=Gr.startsWith("http://")?"ws://":"wss://";return`${Gr.replace(/^https?:\/\//,e).replace(/\/$/,"")}/reporter`})();jn.debug("[test] WebSocket URL resolved",{wsUrl:e??"(default)"});const t=Hn();if(t)return jn.info("[test] Using env var auth (STABLY_API_KEY + STABLY_PROJECT_ID)"),{STABLY_API_KEY:t.apiKey,STABLY_PROJECT_ID:t.projectId,...e&&{STABLY_WS_URL:e}};jn.info("[test] No env var auth, attempting OAuth auth");const r=Date.now(),n=await(async()=>{const e=Hn();if(e){try{await un()&&Fn()}catch{}return{auth:e,type:"env"}}const t=await Vn(),r=t?await fn():void 0;if(t&&r)return{auth:{accessToken:t.accessToken,context:r},type:"oauth"}})();if(jn.info("[test] OAuth auth resolved",{durationMs:Date.now()-r,hasAuth:!!n,authType:n?.type}),!n||"env"===n.type)return void jn.info("[test] No usable auth found");const o=process.env.STABLY_PROJECT_ID?.trim(),s=o||zn(n);if(!s)return void jn.warn("[test] No project ID available");jn.info("[test] Fetching JWT API key",{projectId:s});const i=Date.now(),a=await(async(e,t)=>{try{jn.debug("Requesting JWT API key",{projectId:t,apiUrl:Gr});const r=await(async({accessToken:e,projectId:t})=>{const r=await(n={auth:e,client:Jr(),path:{projectId:t}},(n.client??Mr).post({security:[{scheme:"bearer",type:"http"}],url:"/internal/v1/cli/projects/{projectId}/api-key",...n}));var n;if(r.error){const e=r.error?.error,{status:t}=r.response;throw new Error(e??`Failed to get API key: ${t}`)}return r.data})({accessToken:e,projectId:t});return jn.debug("JWT API key obtained",{keyPrefix:r.apiKey.substring(0,10)}),r.apiKey}catch(e){return void jn.warn("Failed to get JWT API key for test reporter",{error:e instanceof Error?e.message:String(e)})}})(n.auth.accessToken,s);jn.info("[test] JWT API key fetch complete",{durationMs:Date.now()-i,success:!!a});const c=a?{STABLY_API_KEY:a,STABLY_PROJECT_ID:s,...e&&{STABLY_WS_URL:e}}:void 0;return jn.info("[test] Stably test env resolved",{hasApiKey:!!c?.STABLY_API_KEY,projectId:c?.STABLY_PROJECT_ID,wsUrl:c?.STABLY_WS_URL??process.env.STABLY_WS_URL??"(default)"}),c},Jn=async()=>{const e=Te.remoteEnvName;if(!e)return;const t=await Yn(),r=zn(t),n=Wn(t);jn.debug("Fetching remote environment variables",{envName:e,projectId:r});const o=await(s={auth:n,client:Jr(),path:{projectId:r,environmentName:e}},(s.client??Mr).get({security:[{scheme:"bearer",type:"http"}],url:"/internal/v1/cli/projects/{projectId}/environments/{environmentName}/variables",...s}));var s;404===o.response.status&&(ee(G.red(`Environment "${e}" not found. Check the name on your Stably dashboard.`)),process.exit(1)),401!==o.response.status&&403!==o.response.status||(ee(G.red(`Access denied to environment "${e}".`)),process.exit(1)),o.error&&(ee(G.red(`Failed to fetch environment "${e}": ${o.response.status}`)),process.exit(1));const i={},a=[];for(const e of o.data.variables)i[e.name]=e.value,e.sensitive&&e.value.length>0&&a.push(e.value);const c=o.data.variables.length,l=a.length;return process.stderr.write(`${G.cyan(`Loaded ${c} variable${1!==c?"s":""} from "${e}"`)}${l>0?G.dim(` (${l} sensitive)`):""}\n`),{variables:i,sensitiveValues:a}},Xn=e=>e?{[wr]:e}:void 0,Qn=ae.object({context:ae.string().min(1),autohealReportUrl:ae.string(),skippedTests:ae.array(ae.object({testIdentifier:ae.string(),testTitle:ae.string(),consecutiveUnfixedCount:ae.number()})).optional()}),Zn=pe.object({bucket:pe.string(),key:pe.string()}),eo=pe.object({diffBucketPath:Zn,expiresInSeconds:pe.number(),key:pe.string(),uploadUrl:pe.string()}),to=pe.object({traceBucketPath:Zn,expiresInSeconds:pe.number(),key:pe.string(),uploadUrl:pe.string(),sensitiveValues:pe.array(pe.string())}),ro=async({authHeader:e,contentType:t="text/plain",orgId:r,runId:n})=>{const o=await(s={auth:e,body:{contentType:t},client:Jr(),headers:Xn(r),path:{runId:n}},(s.client??Mr).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=eo.parse(o.data);return{diffBucketPath:i.diffBucketPath,expiresInSeconds:i.expiresInSeconds,key:i.key,uploadUrl:i.uploadUrl}},no=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})`)},oo=async({authHeader:e,diffBucketPath:t,orgId:r,runId:n})=>{const o=(Jr().getConfig().baseUrl??"").replace(/\/$/,""),s=await fetch(`${o}/internal/v1/cli/runs/${encodeURIComponent(n)}/autoheal-diff/confirm-upload`,{method:"POST",headers:{"Content-Type":"application/json",...Xn(r),authorization:e},body:JSON.stringify(t)});if(!s.ok)throw new Error(`Failed to confirm diff upload (${s.status})`)},so=class{socket;url;authHeader;orgId;runId;pendingEvent=null;reconnectAttempts=0;reconnectTimer;debounceTimer;_isClosed=!1;isAuthenticated=!1;authenticationFailed=!1;onUserMessage;maxReconnectAttempts=3;reconnectDelay=2e3;debounceMs=500;get isClosed(){return this._isClosed}constructor({authHeader:e,orgId:t,runId:r,url:n=Wr,onUserMessage:o}){this.authHeader=e,this.orgId=t,this.runId=r,this.url=n,this.onUserMessage=o,jn.info("[ws] Constructing AutohealWebSocketClient",{url:this.url,runId:r})}start(){this.connect()}connect(){if(!this._isClosed)try{const e={Authorization:this.authHeader};this.orgId&&(e["x-stably-org-id"]=this.orgId);const t=`${this.url}?runId=${encodeURIComponent(this.runId)}`;jn.info("[ws] Connecting",{url:t,attempt:this.reconnectAttempts}),this.socket=new fe(t,{headers:e}),this.socket.on("open",()=>{jn.info("[ws] Connection opened"),this.reconnectAttempts=0}),this.socket.on("message",e=>{try{const t="string"==typeof e?e:e.toString(),r=JSON.parse(t);jn.debug("[ws] Received message",{type:r?.type}),"connected"===r?.type&&(jn.info("[ws] Authenticated successfully"),this.isAuthenticated=!0,this.authenticationFailed=!1,this.flushPending()),"user_message"===r?.type&&"string"==typeof r.content&&(jn.info("[ws] Received user message from web UI"),this.onUserMessage?.(r.content))}catch{}}),this.socket.on("close",(e,t)=>{jn.info("[ws] Connection closed",{code:e,authFailed:1008===e,reconnectAttempts:this.reconnectAttempts,maxReconnect:this.maxReconnectAttempts,isClosed:this._isClosed}),this.isAuthenticated=!1,1008===e&&(this.authenticationFailed=!0),!this._isClosed&&!this.authenticationFailed&&this.reconnectAttempts<this.maxReconnectAttempts&&this.scheduleReconnect()}),this.socket.on("error",e=>{jn.warn("[ws] Connection error",{error:e.message})})}catch(e){jn.warn("[ws] Failed to create WebSocket",{error:e instanceof Error?e.message:String(e)}),this.scheduleReconnect()}}scheduleReconnect(){this._isClosed||this.reconnectTimer||(this.reconnectAttempts++,jn.info("[ws] Scheduling reconnect",{attempt:this.reconnectAttempts,maxAttempts:this.maxReconnectAttempts,delayMs:this.reconnectDelay}),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=void 0,this.connect()},this.reconnectDelay))}isConnected(){return!!this.socket&&this.socket.readyState===fe.OPEN&&this.isAuthenticated}sendProgress(e){if(this._isClosed)return void jn.debug("[ws] sendProgress called but client is closed",{phase:e.phase});const t={type:"autoheal_progress",payload:e};return this.pendingEvent=t,this.isConnected()?"complete"===e.phase?(jn.info("[ws] sendProgress: flushing terminal state immediately"),void this.flushPending()):void(this.debounceTimer||(this.debounceTimer=setTimeout(()=>{this.debounceTimer=void 0,this.flushPending()},this.debounceMs))):(jn.debug("[ws] sendProgress: not connected, queuing event",{phase:e.phase,socketState:this.socket?.readyState,isAuthenticated:this.isAuthenticated,reconnectAttempts:this.reconnectAttempts}),void(this.socket?.readyState===fe.CLOSED&&this.reconnectAttempts<this.maxReconnectAttempts&&this.scheduleReconnect()))}flushPending(){if(this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=void 0),!this.pendingEvent)return;const e=this.pendingEvent;if(this.pendingEvent=null,!this.isConnected())return jn.debug("[ws] flushPending: not connected, re-queuing event",{phase:e.payload.phase}),void(this.pendingEvent=e);try{jn.debug("[ws] flushPending: sending event",{phase:e.payload.phase}),this.socket?.send(JSON.stringify(e),t=>{t&&(jn.warn("[ws] flushPending: send failed",{error:t.message,phase:e.payload.phase}),this.pendingEvent||(this.pendingEvent=e))})}catch(t){jn.warn("[ws] flushPending: send threw",{error:t instanceof Error?t.message:String(t)}),this.pendingEvent=e}}close(){if(this._isClosed)return;jn.info("[ws] Closing WebSocket client"),this._isClosed=!0,this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=void 0),this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=void 0),this.flushPending();const{socket:e}=this;this.socket=void 0,e&&setTimeout(()=>{e.close()},200)}},io=class{socket;url;authHeader;orgId;sessionId;pendingEvent=null;reconnectAttempts=0;reconnectTimer;debounceTimer;_isClosed=!1;isAuthenticated=!1;authenticationFailed=!1;onUserMessage;maxReconnectAttempts=3;reconnectDelay=2e3;debounceMs=500;get isClosed(){return this._isClosed}constructor({authHeader:e,orgId:t,sessionId:r,url:n=Kr,onUserMessage:o}){this.authHeader=e,this.orgId=t,this.sessionId=r,this.url=n,this.onUserMessage=o,jn.info("[ws] Constructing CreateProgressWebSocketClient",{url:this.url,sessionId:r})}start(){this.connect()}connect(){if(!this._isClosed)try{const e={Authorization:this.authHeader};this.orgId&&(e["x-stably-org-id"]=this.orgId);const t=`${this.url}?sessionId=${encodeURIComponent(this.sessionId)}`;jn.info("[ws] Connecting",{url:t,attempt:this.reconnectAttempts}),this.socket=new fe(t,{headers:e}),this.socket.on("open",()=>{jn.info("[ws] Connection opened"),this.reconnectAttempts=0}),this.socket.on("message",e=>{try{const t="string"==typeof e?e:e.toString(),r=JSON.parse(t);jn.debug("[ws] Received message",{type:r?.type}),"connected"===r?.type&&(jn.info("[ws] Authenticated successfully"),this.isAuthenticated=!0,this.authenticationFailed=!1,this.flushPending()),"user_message"===r?.type&&"string"==typeof r.content&&(jn.info("[ws] Received user message from web UI"),this.onUserMessage?.(r.content))}catch{}}),this.socket.on("close",(e,t)=>{jn.info("[ws] Connection closed",{code:e,authFailed:1008===e,reconnectAttempts:this.reconnectAttempts,maxReconnect:this.maxReconnectAttempts,isClosed:this._isClosed}),this.isAuthenticated=!1,1008===e&&(this.authenticationFailed=!0),!this._isClosed&&!this.authenticationFailed&&this.reconnectAttempts<this.maxReconnectAttempts&&this.scheduleReconnect()}),this.socket.on("error",e=>{jn.warn("[ws] Connection error",{error:e.message})})}catch(e){jn.warn("[ws] Failed to create WebSocket",{error:e instanceof Error?e.message:String(e)}),this.scheduleReconnect()}}scheduleReconnect(){this._isClosed||this.reconnectTimer||(this.reconnectAttempts++,jn.info("[ws] Scheduling reconnect",{attempt:this.reconnectAttempts,maxAttempts:this.maxReconnectAttempts,delayMs:this.reconnectDelay}),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=void 0,this.connect()},this.reconnectDelay))}isConnected(){return!!this.socket&&this.socket.readyState===fe.OPEN&&this.isAuthenticated}sendProgress(e){if(this._isClosed)return void jn.debug("[ws] sendProgress called but client is closed",{phase:e.phase});const t={type:"create_progress",payload:e};return this.pendingEvent=t,this.isConnected()?"complete"===e.phase?(jn.info("[ws] sendProgress: flushing terminal state immediately"),void this.flushPending()):void(this.debounceTimer||(this.debounceTimer=setTimeout(()=>{this.debounceTimer=void 0,this.flushPending()},this.debounceMs))):(jn.debug("[ws] sendProgress: not connected, queuing event",{phase:e.phase,socketState:this.socket?.readyState,isAuthenticated:this.isAuthenticated,reconnectAttempts:this.reconnectAttempts}),void(this.socket?.readyState===fe.CLOSED&&this.reconnectAttempts<this.maxReconnectAttempts&&this.scheduleReconnect()))}flushPending(){if(this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=void 0),!this.pendingEvent)return;const e=this.pendingEvent;if(this.pendingEvent=null,!this.isConnected())return jn.debug("[ws] flushPending: not connected, re-queuing event",{phase:e.payload.phase}),void(this.pendingEvent=e);try{jn.debug("[ws] flushPending: sending event",{phase:e.payload.phase}),this.socket?.send(JSON.stringify(e),t=>{t&&(jn.warn("[ws] flushPending: send failed",{error:t.message,phase:e.payload.phase}),this.pendingEvent||(this.pendingEvent=e))})}catch(t){jn.warn("[ws] flushPending: send threw",{error:t instanceof Error?t.message:String(t)}),this.pendingEvent=e}}close(){if(this._isClosed)return;jn.info("[ws] Closing WebSocket client"),this._isClosed=!0,this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=void 0),this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=void 0),this.flushPending();const{socket:e}=this;this.socket=void 0,e&&setTimeout(()=>{e.close()},200)}},ao=e=>{if(!e||"object"!=typeof e)return!1;const t=e;return"text"===t.type&&"string"==typeof t.text},co=e=>null!=e&&"object"==typeof e&&"tool_response"in e,lo=e=>{if(!e||"object"!=typeof e)return;const t=e;return Array.isArray(t.tool_response)?t.tool_response:void 0},uo=e=>{const t=lo(e);if(t)return t.filter(ao).map(e=>e.text).join("\n")||void 0},po=/\u001b\[[0-9;]*m/g,fo=e=>e.replace(po,""),ho=/\$\{process\.env\.([A-Z_][A-Z0-9_]*)\}/g;function go(e,t){return e.replace(ho,(e,r)=>{const n=t[r];return null!=n?n:e})}function mo({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={...r};let o=!1;if("string"==typeof r.text){const t=go(r.text,e);t!==r.text&&(n.text=t,o=!0)}if("string"==typeof r.url){const t=go(r.url,e);t!==r.url&&(n.url=t,o=!0)}if("string"==typeof r.function){const t=go(r.function,e);t!==r.function&&(n.function=t,o=!0)}if(Array.isArray(r.fields)){const t=r.fields.map(t=>{if("string"==typeof t.value){const r=go(t.value,e);if(r!==t.value)return o=!0,{...t,value:r}}return t});o&&(n.fields=t)}return o?{decision:"approve",hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"allow",reason:"Evaluated environment variable placeholders in browser tool input.",updatedInput:n}}:{decision:"approve"}}}function yo({onResult:e}){return async t=>{if(!co(t))return{decision:"approve"};const r=uo(t);if(!r)return{decision:"approve"};const n=function(e){const t=fo(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 vo({onResult:e}){return async t=>{if(!co(t))return{decision:"approve"};const r=uo(t);if(!r)return{decision:"approve"};const n=function(e){const t=fo(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 bo=/\.(spec|test)\.(ts|tsx|js|jsx|mts|mjs)$/;function wo({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&&bo.test(n)&&e(n),{decision:"approve"}}}var _o=L(u);async function Eo(){try{const{stdout:e}=await _o('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 _o(`pkill -KILL -P ${e} '.*' 2>/dev/null || true`)}))}catch{}}var Io=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())}hasQueuedMessages(){return this.queue.length>0}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()})}};function To(e){try{const t=d("git branch --show-current",{cwd:e,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();if(!t)return;return{branch:t}}catch{return}}var xo=[".ts",".js",".mts",".mjs",".cts",".cjs"],So=10240,Ao=async({defaultContent:e,fileName:t,filePath:r})=>{try{const e=(await J(r)).size,n=await V(r,"utf-8"),o=Buffer.byteLength(n,"utf-8");if(o<=So)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<=So?s:s.slice(0,So)+`\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}},Co=async({defaultContent:e,dirName:t,dirPath:r})=>{try{const e=await q(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}},Ro=async({allowedEnvVars:e,mode:t,workspaceInfo:r,authHeader:n,customHeader:o,maxParallelWorkers:s})=>{const i=Jr(),a=To(r.absolutePath);jn.debug("Requesting system prompt from API",{mode:t,hasGitContext:!!a,envVarCount:e.length});const c=await(l={client:i,auth:n,body:{mode:t,workspaceInfo:r,allowedEnvVars:e,gitContext:a,maxParallelWorkers:s}},(l.client??Mr).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 jn.warn("System prompt fetch failed: unauthorized (401)"),await pn(),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 jn.debug("System prompt fetch failed: forbidden (403)"),new Error("Your organization does not have an active subscription. Manage your subscription at https://app.stably.ai or contact your organization admin.");if(c.error){jn.warn("System prompt fetch failed",{error:c.error});const e=JSON.stringify(c.error);if(e.toLowerCase().includes("unauthorized")||e.toLowerCase().includes("unauthenticated"))throw await pn(),new Error("Your session has expired or been revoked. Credentials have been cleared. Please run `stably login` to re-authenticate.");throw new Error("Failed to fetch system prompt. Please check your network connection and try again. If this persists, run `stably login` to re-authenticate.")}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:o});return jn.debug("System prompt received",{size:u.length,appendedCustomHeader:!!o,hasPrContext:!!c.data.prContext}),{systemPrompt:u,prContext:c.data.prContext}},Po=".stably-playwright-wrapper.config.*",Uo=[".ts",".js",".mts",".mjs",".cts",".cjs"];function ko(e){const t=n(e);if(g(t))for(const e of Uo){const r=s(t,`playwright.config${e}`);if(g(r))return r}}var Lo=["tests","e2e","__tests__","test"];function Do(e){try{return g(e)&&m(e).isDirectory()}catch{return!1}}function Oo(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(G.dim(`Using output directory: ${e} (from ${r})`))}var Bo,No=["mcp__playwright-test__","mcp__auto-heal-report__","mcp__stably-agent-control__"],$o=["planner_","generator_"],jo={"mcp__stably-agent-control__restart_mcp_servers":"Restarting Browser Tools","mcp__session-control__restart_mcp_servers":"Restarting Browser Tools"},Mo=(e,t)=>{const r=t.find(t=>e.startsWith(t));return r?e.slice(r.length):e},Ho=(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},Go=e=>"mcp__auto-heal-report__capture-trace-proof"===e?"Verify Test Run":"mcp__auto-heal-report__generate-report"===e?"Generate Report":(e=>{const t=jo[e];if(t)return t;const r=Mo(e,No);return Mo(r,$o).split("_").map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join(" ")})(e),Fo=["test","bug","flake","ui_change","other"],Vo={bug:"Application code defect; behavior diverges from expected requirements.",flake:"Non-deterministic failure; timing, race conditions, or environmental variance causes inconsistent test results.",other:"External dependencies, environment, or infra issues outside test/app code.",test:"Test code is incorrect, out-of-date, or missing necessary setup.",ui_change:"Application UI intentionally changed; test expectations (screenshots, selectors, text assertions) are stale and need updating."},Yo=e=>Vo[e],zo=/[^a-zA-Z0-9-_]/g,Wo=e=>{const t=e.trim().replace(zo,"_");return t.length>0?t.slice(0,80):void 0},Ko=e=>"string"==typeof e?Wo(e):void 0,qo=_e("/");try{Bo=qo("worker_threads").Worker}catch(e){}var Jo=Bo?function(e,t,r,n,o){var s=!1,i=new Bo(e+";var __w=require('worker_threads');__w.parentPort.on('message',function(m){onmessage({data:m})}),postMessage=function(m,t){__w.parentPort.postMessage(m,t)},close=process.exit;self=global",{eval:!0}).on("error",function(e){return o(e,null)}).on("message",function(e){return o(null,e)}).on("exit",function(e){e&&!s&&o(new Error("exited with code "+e),null)});return i.postMessage(r,n),i.terminate=function(){return s=!0,Bo.prototype.terminate.call(i)},i}:function(e,t,r,n,o){setImmediate(function(){return o(new Error("async operations unsupported - update to Node 12+ (or Node 10-11 with the --experimental-worker CLI flag)"),null)});var s=function(){};return{terminate:s,postMessage:s}},Xo=Uint8Array,Qo=Uint16Array,Zo=Int32Array,es=new Xo([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),ts=new Xo([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),rs=new Xo([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),ns=function(e,t){for(var r=new Qo(31),n=0;n<31;++n)r[n]=t+=1<<e[n-1];var o=new Zo(r[30]);for(n=1;n<30;++n)for(var s=r[n];s<r[n+1];++s)o[s]=s-r[n]<<5|n;return{b:r,r:o}},os=ns(es,2),ss=os.b,is=os.r;ss[28]=258,is[258]=28;var as,cs=ns(ts,0),ls=cs.b,us=cs.r,ds=new Qo(32768);for(hs=0;hs<32768;++hs)as=(61680&(as=(52428&(as=(43690&hs)>>1|(21845&hs)<<1))>>2|(13107&as)<<2))>>4|(3855&as)<<4,ds[hs]=((65280&as)>>8|(255&as)<<8)>>1;var ps=function(e,t,r){for(var n=e.length,o=0,s=new Qo(t);o<n;++o)e[o]&&++s[e[o]-1];var i,a=new Qo(t);for(o=1;o<t;++o)a[o]=a[o-1]+s[o-1]<<1;if(r){i=new Qo(1<<t);var c=15-t;for(o=0;o<n;++o)if(e[o])for(var l=o<<4|e[o],u=t-e[o],d=a[e[o]-1]++<<u,p=d|(1<<u)-1;d<=p;++d)i[ds[d]>>c]=l}else for(i=new Qo(n),o=0;o<n;++o)e[o]&&(i[o]=ds[a[e[o]-1]++]>>15-e[o]);return i},fs=new Xo(288);for(hs=0;hs<144;++hs)fs[hs]=8;for(hs=144;hs<256;++hs)fs[hs]=9;for(hs=256;hs<280;++hs)fs[hs]=7;for(hs=280;hs<288;++hs)fs[hs]=8;var hs,gs=new Xo(32);for(hs=0;hs<32;++hs)gs[hs]=5;var ms=ps(fs,9,0),ys=ps(fs,9,1),vs=ps(gs,5,0),bs=ps(gs,5,1),ws=function(e){for(var t=e[0],r=1;r<e.length;++r)e[r]>t&&(t=e[r]);return t},_s=function(e,t,r){var n=t/8|0;return(e[n]|e[n+1]<<8)>>(7&t)&r},Es=function(e,t){var r=t/8|0;return(e[r]|e[r+1]<<8|e[r+2]<<16)>>(7&t)},Is=function(e){return(e+7)/8|0},Ts=function(e,t,r){return(null==t||t<0)&&(t=0),(null==r||r>e.length)&&(r=e.length),new Xo(e.subarray(t,r))},xs=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],Ss=function(e,t,r){var n=new Error(t||xs[e]);if(n.code=e,Error.captureStackTrace&&Error.captureStackTrace(n,Ss),!r)throw n;return n},As=function(e,t,r,n){var o=e.length,s=n?n.length:0;if(!o||t.f&&!t.l)return r||new Xo(0);var i=!r,a=i||2!=t.i,c=t.i;i&&(r=new Xo(3*o));var l=function(e){var t=r.length;if(e>t){var n=new Xo(Math.max(2*t,e));n.set(r),r=n}},u=t.f||0,d=t.p||0,p=t.b||0,f=t.l,h=t.d,g=t.m,m=t.n,y=8*o;do{if(!f){u=_s(e,d,1);var v=_s(e,d+1,3);if(d+=3,!v){var b=e[(P=Is(d)+4)-4]|e[P-3]<<8,w=P+b;if(w>o){c&&Ss(0);break}a&&l(p+b),r.set(e.subarray(P,w),p),t.b=p+=b,t.p=d=8*w,t.f=u;continue}if(1==v)f=ys,h=bs,g=9,m=5;else if(2==v){var _=_s(e,d,31)+257,E=_s(e,d+10,15)+4,I=_+_s(e,d+5,31)+1;d+=14;for(var T=new Xo(I),x=new Xo(19),S=0;S<E;++S)x[rs[S]]=_s(e,d+3*S,7);d+=3*E;var A=ws(x),C=(1<<A)-1,R=ps(x,A,1);for(S=0;S<I;){var P,U=R[_s(e,d,C)];if(d+=15&U,(P=U>>4)<16)T[S++]=P;else{var k=0,L=0;for(16==P?(L=3+_s(e,d,3),d+=2,k=T[S-1]):17==P?(L=3+_s(e,d,7),d+=3):18==P&&(L=11+_s(e,d,127),d+=7);L--;)T[S++]=k}}var D=T.subarray(0,_),O=T.subarray(_);g=ws(D),m=ws(O),f=ps(D,g,1),h=ps(O,m,1)}else Ss(1);if(d>y){c&&Ss(0);break}}a&&l(p+131072);for(var B=(1<<g)-1,N=(1<<m)-1,$=d;;$=d){var j=(k=f[Es(e,d)&B])>>4;if((d+=15&k)>y){c&&Ss(0);break}if(k||Ss(2),j<256)r[p++]=j;else{if(256==j){$=d,f=null;break}var M=j-254;if(j>264){var H=es[S=j-257];M=_s(e,d,(1<<H)-1)+ss[S],d+=H}var G=h[Es(e,d)&N],F=G>>4;if(G||Ss(3),d+=15&G,O=ls[F],F>3&&(H=ts[F],O+=Es(e,d)&(1<<H)-1,d+=H),d>y){c&&Ss(0);break}a&&l(p+131072);var V=p+M;if(p<O){var Y=s-O,z=Math.min(O,V);for(Y+p<0&&Ss(3);p<z;++p)r[p]=n[Y+p]}for(;p<V;++p)r[p]=r[p-O]}}t.l=f,t.p=$,t.b=p,t.f=u,f&&(u=1,t.m=g,t.d=h,t.n=m)}while(!u);return p!=r.length&&i?Ts(r,0,p):r.subarray(0,p)},Cs=function(e,t,r){r<<=7&t;var n=t/8|0;e[n]|=r,e[n+1]|=r>>8},Rs=function(e,t,r){r<<=7&t;var n=t/8|0;e[n]|=r,e[n+1]|=r>>8,e[n+2]|=r>>16},Ps=function(e,t){for(var r=[],n=0;n<e.length;++n)e[n]&&r.push({s:n,f:e[n]});var o=r.length,s=r.slice();if(!o)return{t:Ns,l:0};if(1==o){var i=new Xo(r[0].s+1);return i[r[0].s]=1,{t:i,l:1}}r.sort(function(e,t){return e.f-t.f}),r.push({s:-1,f:25001});var a=r[0],c=r[1],l=0,u=1,d=2;for(r[0]={s:-1,f:a.f+c.f,l:a,r:c};u!=o-1;)a=r[r[l].f<r[d].f?l++:d++],c=r[l!=u&&r[l].f<r[d].f?l++:d++],r[u++]={s:-1,f:a.f+c.f,l:a,r:c};var p=s[0].s;for(n=1;n<o;++n)s[n].s>p&&(p=s[n].s);var f=new Qo(p+1),h=Us(r[u-1],f,0);if(h>t){n=0;var g=0,m=h-t,y=1<<m;for(s.sort(function(e,t){return f[t.s]-f[e.s]||e.f-t.f});n<o;++n){var v=s[n].s;if(!(f[v]>t))break;g+=y-(1<<h-f[v]),f[v]=t}for(g>>=m;g>0;){var b=s[n].s;f[b]<t?g-=1<<t-f[b]++-1:++n}for(;n>=0&&g;--n){var w=s[n].s;f[w]==t&&(--f[w],++g)}h=t}return{t:new Xo(f),l:h}},Us=function(e,t,r){return-1==e.s?Math.max(Us(e.l,t,r+1),Us(e.r,t,r+1)):t[e.s]=r},ks=function(e){for(var t=e.length;t&&!e[--t];);for(var r=new Qo(++t),n=0,o=e[0],s=1,i=function(e){r[n++]=e},a=1;a<=t;++a)if(e[a]==o&&a!=t)++s;else{if(!o&&s>2){for(;s>138;s-=138)i(32754);s>2&&(i(s>10?s-11<<5|28690:s-3<<5|12305),s=0)}else if(s>3){for(i(o),--s;s>6;s-=6)i(8304);s>2&&(i(s-3<<5|8208),s=0)}for(;s--;)i(o);s=1,o=e[a]}return{c:r.subarray(0,n),n:t}},Ls=function(e,t){for(var r=0,n=0;n<t.length;++n)r+=e[n]*t[n];return r},Ds=function(e,t,r){var n=r.length,o=Is(t+2);e[o]=255&n,e[o+1]=n>>8,e[o+2]=255^e[o],e[o+3]=255^e[o+1];for(var s=0;s<n;++s)e[o+s+4]=r[s];return 8*(o+4+n)},Os=function(e,t,r,n,o,s,i,a,c,l,u){Cs(t,u++,r),++o[256];for(var d=Ps(o,15),p=d.t,f=d.l,h=Ps(s,15),g=h.t,m=h.l,y=ks(p),v=y.c,b=y.n,w=ks(g),_=w.c,E=w.n,I=new Qo(19),T=0;T<v.length;++T)++I[31&v[T]];for(T=0;T<_.length;++T)++I[31&_[T]];for(var x=Ps(I,7),S=x.t,A=x.l,C=19;C>4&&!S[rs[C-1]];--C);var R,P,U,k,L=l+5<<3,D=Ls(o,fs)+Ls(s,gs)+i,O=Ls(o,p)+Ls(s,g)+i+14+3*C+Ls(I,S)+2*I[16]+3*I[17]+7*I[18];if(c>=0&&L<=D&&L<=O)return Ds(t,u,e.subarray(c,c+l));if(Cs(t,u,1+(O<D)),u+=2,O<D){R=ps(p,f,0),P=p,U=ps(g,m,0),k=g;var B=ps(S,A,0);for(Cs(t,u,b-257),Cs(t,u+5,E-1),Cs(t,u+10,C-4),u+=14,T=0;T<C;++T)Cs(t,u+3*T,S[rs[T]]);u+=3*C;for(var N=[v,_],$=0;$<2;++$){var j=N[$];for(T=0;T<j.length;++T){var M=31&j[T];Cs(t,u,B[M]),u+=S[M],M>15&&(Cs(t,u,j[T]>>5&127),u+=j[T]>>12)}}}else R=ms,P=fs,U=vs,k=gs;for(T=0;T<a;++T){var H=n[T];if(H>255){Rs(t,u,R[257+(M=H>>18&31)]),u+=P[M+257],M>7&&(Cs(t,u,H>>23&31),u+=es[M]);var G=31&H;Rs(t,u,U[G]),u+=k[G],G>3&&(Rs(t,u,H>>5&8191),u+=ts[G])}else Rs(t,u,R[H]),u+=P[H]}return Rs(t,u,R[256]),u+P[256]},Bs=new Zo([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),Ns=new Xo(0),$s=function(e,t,r,n,o,s){var i=s.z||e.length,a=new Xo(n+i+5*(1+Math.ceil(i/7e3))+o),c=a.subarray(n,a.length-o),l=s.l,u=7&(s.r||0);if(t){u&&(c[0]=s.r>>3);for(var d=Bs[t-1],p=d>>13,f=8191&d,h=(1<<r)-1,g=s.p||new Qo(32768),m=s.h||new Qo(h+1),y=Math.ceil(r/3),v=2*y,b=function(t){return(e[t]^e[t+1]<<y^e[t+2]<<v)&h},w=new Zo(25e3),_=new Qo(288),E=new Qo(32),I=0,T=0,x=s.i||0,S=0,A=s.w||0,C=0;x+2<i;++x){var R=b(x),P=32767&x,U=m[R];if(g[P]=U,m[R]=P,A<=x){var k=i-x;if((I>7e3||S>24576)&&(k>423||!l)){u=Os(e,c,0,w,_,E,T,S,C,x-C,u),S=I=T=0,C=x;for(var L=0;L<286;++L)_[L]=0;for(L=0;L<30;++L)E[L]=0}var D=2,O=0,B=f,N=P-U&32767;if(k>2&&R==b(x-N))for(var $=Math.min(p,k)-1,j=Math.min(32767,x),M=Math.min(258,k);N<=j&&--B&&P!=U;){if(e[x+D]==e[x+D-N]){for(var H=0;H<M&&e[x+H]==e[x+H-N];++H);if(H>D){if(D=H,O=N,H>$)break;var G=Math.min(N,H-2),F=0;for(L=0;L<G;++L){var V=x-N+L&32767,Y=V-g[V]&32767;Y>F&&(F=Y,U=V)}}}N+=(P=U)-(U=g[P])&32767}if(O){w[S++]=268435456|is[D]<<18|us[O];var z=31&is[D],W=31&us[O];T+=es[z]+ts[W],++_[257+z],++E[W],A=x+D,++I}else w[S++]=e[x],++_[e[x]]}}for(x=Math.max(x,A);x<i;++x)w[S++]=e[x],++_[e[x]];u=Os(e,c,l,w,_,E,T,S,C,x-C,u),l||(s.r=7&u|c[u/8|0]<<3,u-=7,s.h=m,s.p=g,s.i=x,s.w=A)}else{for(x=s.w||0;x<i+l;x+=65535){var K=x+65535;K>=i&&(c[u/8|0]=l,K=i),u=Ds(c,u+1,e.subarray(x,K))}s.i=i}return Ts(a,0,n+Is(u)+o)},js=function(){for(var e=new Int32Array(256),t=0;t<256;++t){for(var r=t,n=9;--n;)r=(1&r&&-306674912)^r>>>1;e[t]=r}return e}(),Ms=function(e,t,r,n,o){if(!o&&(o={l:1},t.dictionary)){var s=t.dictionary.subarray(-32768),i=new Xo(s.length+e.length);i.set(s),i.set(e,s.length),e=i,o.w=s.length}return $s(e,null==t.level?6:t.level,null==t.mem?o.l?Math.ceil(1.5*Math.max(8,Math.min(13,Math.log(e.length)))):20:12+t.mem,r,n,o)},Hs=function(e,t){var r={};for(var n in e)r[n]=e[n];for(var n in t)r[n]=t[n];return r},Gs=function(e,t,r){for(var n=e(),o=e.toString(),s=o.slice(o.indexOf("[")+1,o.lastIndexOf("]")).replace(/\s+/g,"").split(","),i=0;i<n.length;++i){var a=n[i],c=s[i];if("function"==typeof a){t+=";"+c+"=";var l=a.toString();if(a.prototype)if(-1!=l.indexOf("[native code]")){var u=l.indexOf(" ",8)+1;t+=l.slice(u,l.indexOf("(",u))}else for(var d in t+=l,a.prototype)t+=";"+c+".prototype."+d+"="+a.prototype[d].toString();else t+=l}else r[c]=a}return t},Fs=[],Vs=function(){return[Xo,Qo,Zo,es,ts,rs,ss,ls,ys,bs,ds,xs,ps,ws,_s,Es,Is,Ts,Ss,As,ei,zs,Ws]},Ys=function(){return[Xo,Qo,Zo,es,ts,rs,is,us,ms,fs,vs,gs,ds,Bs,Ns,ps,Cs,Rs,Ps,Us,ks,Ls,Ds,Os,Is,Ts,$s,Ms,Zs,zs]},zs=function(e){return postMessage(e,[e.buffer])},Ws=function(e){return e&&{out:e.size&&new Xo(e.size),dictionary:e.dictionary}},Ks=function(e,t,r,n,o,s){var i=function(e,t,r,n){if(!Fs[r]){for(var o="",s={},i=e.length-1,a=0;a<i;++a)o=Gs(e[a],o,s);Fs[r]={c:Gs(e[i],o,s),e:s}}var c=Hs({},Fs[r].e);return Jo(Fs[r].c+";onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage="+t.toString()+"}",r,c,function(e){var t=[];for(var r in e)e[r].buffer&&t.push((e[r]=new e[r].constructor(e[r])).buffer);return t}(c),n)}(r,n,o,function(e,t){i.terminate(),s(e,t)});return i.postMessage([e,t],t.consume?[e.buffer]:[]),function(){i.terminate()}},qs=function(e,t){return e[t]|e[t+1]<<8},Js=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},Xs=function(e,t){return Js(e,t)+4294967296*Js(e,t+4)},Qs=function(e,t,r){for(;r;++t)e[t]=r,r>>>=8};function Zs(e,t){return Ms(e,t||{},0,0)}function ei(e,t){return As(e,{i:2},t&&t.out,t&&t.dictionary)}var ti=function(e,t,r,n){for(var o in e){var s=e[o],i=t+o,a=n;Array.isArray(s)&&(a=Hs(n,s[1]),s=s[0]),s instanceof Xo?r[i]=[s,a]:(r[i+="/"]=[new Xo(0),a],ti(s,i,r,n))}},ri="undefined"!=typeof TextEncoder&&new TextEncoder,ni="undefined"!=typeof TextDecoder&&new TextDecoder;try{ni.decode(Ns,{stream:!0})}catch(e){}function oi(e,t){if(ri)return ri.encode(e);for(var r=e.length,n=new Xo(e.length+(e.length>>1)),o=0,s=function(e){n[o++]=e},i=0;i<r;++i){if(o+5>n.length){var a=new Xo(o+8+(r-i<<1));a.set(n),n=a}var c=e.charCodeAt(i);c<128||t?s(c):c<2048?(s(192|c>>6),s(128|63&c)):c>55295&&c<57344?(s(240|(c=65536+(1047552&c)|1023&e.charCodeAt(++i))>>18),s(128|c>>12&63),s(128|c>>6&63),s(128|63&c)):(s(224|c>>12),s(128|c>>6&63),s(128|63&c))}return Ts(n,0,o)}var si=function(e){var t=0;if(e)for(var r in e){var n=e[r].length;n>65535&&Ss(9),t+=n+4}return t},ii=function(e,t,r,n,o,s,i,a){var c=n.length,l=r.extra,u=a&&a.length,d=si(l);Qs(e,t,null!=i?33639248:67324752),t+=4,null!=i&&(e[t++]=20,e[t++]=r.os),e[t]=20,t+=2,e[t++]=r.flag<<1|(s<0&&8),e[t++]=o&&8,e[t++]=255&r.compression,e[t++]=r.compression>>8;var p=new Date(null==r.mtime?Date.now():r.mtime),f=p.getFullYear()-1980;if((f<0||f>119)&&Ss(10),Qs(e,t,f<<25|p.getMonth()+1<<21|p.getDate()<<16|p.getHours()<<11|p.getMinutes()<<5|p.getSeconds()>>1),t+=4,-1!=s&&(Qs(e,t,r.crc),Qs(e,t+4,s<0?-s-2:s),Qs(e,t+8,r.size)),Qs(e,t+12,c),Qs(e,t+14,d),t+=16,null!=i&&(Qs(e,t,u),Qs(e,t+6,r.attrs),Qs(e,t+10,i),t+=14),e.set(n,t),t+=c,d)for(var h in l){var g=l[h],m=g.length;Qs(e,t,+h),Qs(e,t+2,m),e.set(g,t+4),t+=4+m}return u&&(e.set(a,t),t+=u),t},ai="function"==typeof queueMicrotask?queueMicrotask:"function"==typeof setTimeout?setTimeout:function(e){e()};function ci(e,t,r){const n=Math.min(t,512);if("utf-16"===r||"utf-16le"===r||"utf-16be"===r){for(let t=0;t<n;t+=2){const o=e[t],s=t+1<n?e[t+1]:0;if(("utf-16le"===r||"utf-16"===r)&&0===s&&o<32&&9!==o&&10!==o&&13!==o&&0!==o)return!1;if(("utf-16be"===r||"utf-16"===r)&&0===o&&s<32&&9!==s&&10!==s&&13!==s&&0!==s)return!1}return!0}if("latin1"===r||"iso-8859-1"===r){for(let t=0;t<n;t++){const r=e[t];if(0===r)return!1;if(r<32&&9!==r&&10!==r&&13!==r)return!1}return!0}if("cjk"===r||"big5"===r||"gb2312"===r||"gbk"===r||"euc-kr"===r||"shift-jis"===r){for(let t=0;t<n;t++){const r=e[t];if(0===r)return!1;if(r<32&&9!==r&&10!==r&&13!==r)return!1}return!0}return!1}var li=class{fileBuffer;size;offset;error;constructor(e,t){this.fileBuffer=e,this.size=t,this.offset=0,this.error=!1}hasError(){return this.error}nextByte(){return this.offset===this.size||this.hasError()?(this.error=!0,255):this.fileBuffer[this.offset++]}next(e){if(e<0||e>this.size-this.offset)return this.error=!0,[];const t=new Array;for(let r=0;r<e;r++){if(this.error)return t;t[r]=this.nextByte()}return t}};function ui(e){let t=0,r=0;for(;!e.hasError();){const n=e.nextByte();if(r|=(127&n)<<7*t,!(128&n))break;if(t>=10){e.error=!0;break}t++}return r}function di(e){switch(7&ui(e)){case 0:return ui(e),!0;case 1:return e.next(8),!0;case 2:const t=ui(e);return e.next(t),!0;case 5:return e.next(4),!0}return!1}function pi(e,t,r){if(0===t)return!1;let n=0;const o=Math.min(t,515),s=Math.min(o,512);if(t>=3&&239===e[0]&&187===e[1]&&191===e[2])return!1;if(t>=4&&0===e[0]&&0===e[1]&&254===e[2]&&255===e[3])return!1;if(t>=4&&255===e[0]&&254===e[1]&&0===e[2]&&0===e[3])return!1;if(t>=4&&132===e[0]&&49===e[1]&&149===e[2]&&51===e[3])return!1;if(o>=5&&"%PDF-"===e.slice(0,5).toString())return!0;if(t>=2&&254===e[0]&&255===e[1])return!1;if(t>=2&&255===e[0]&&254===e[1])return!1;if(r?.encoding)return!ci(e,t,r.encoding);const i=function(e,t){if(t<4)return null;const r=Math.min(t,512);let n=0,o=0;for(let t=0;t<r;t++)0===e[t]&&(t%2==0?n++:o++);const s=n+o;if(s>.3*r&&s<.7*r){if(o>3*n)return"utf-16le";if(n>3*o)return"utf-16be"}return null}(e,t);if(i)return!ci(e,t,i);for(let t=0;t<s;t++){if(0===e[t])return!0;if((e[t]<7||e[t]>14)&&(e[t]<32||e[t]>127)){if(e[t]>=192&&e[t]<=223&&t+1<o){if(t++,e[t]>=128&&e[t]<=191)continue}else if(e[t]>=224&&e[t]<=239&&t+2<o){if(t++,e[t]>=128&&e[t]<=191&&e[t+1]>=128&&e[t+1]<=191){t++;continue}}else if(e[t]>=240&&e[t]<=247&&t+3<o&&(t++,e[t]>=128&&e[t]<=191&&e[t+1]>=128&&e[t+1]<=191&&e[t+2]>=128&&e[t+2]<=191)){t+=2;continue}if(n++,t>=32&&100*n/s>10)return!0}}return 100*n/s>10||!!(n>1&&function(e,t){const r=new li(e,t);let n=0;for(;;){if(!di(r)&&!r.hasError())return!1;if(r.hasError())break;n++}return n>0}(e,s))}var fi=[/^\/$/,/^\*+$/,/^[0-9]+$/],hi=["/artifact/","https://","http://","*********"],gi=new Set(["sha1","_sha1","pageref","downloadsPath","tracesDir","pageId"]);function mi({sensitiveValues:e,str:t}){return e.reduce((e,t)=>e.replaceAll(t,"[REDACTED]"),t)}function yi({sensitiveValues:e,value:t}){return"string"==typeof t?mi({sensitiveValues:e,str:t}):Array.isArray(t)?t.map(t=>yi({sensitiveValues:e,value:t})):function(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}(t)?bi({obj:t,sensitiveValues:e}):t}function vi(e){return!!gi.has(e)||e.toLowerCase().endsWith("sha1")}function bi({obj:e,sensitiveValues:t}){return Object.fromEntries(Object.entries(e).map(([e,r])=>[e,vi(e)?r:yi({sensitiveValues:t,value:r})]))}function wi({error:e,sensitiveValues:t}){return e?{...e,message:mi({sensitiveValues:t,str:e.message})}:void 0}function _i({content:e,sensitiveValues:t}){const r=new D,n=new O,o=mi({sensitiveValues:t,str:r.decode(e)});return n.encode(o)}var Ei=L(function(e,t,r){r||(r=t,t={}),"function"!=typeof r&&Ss(7);var n=[],o=function(){for(var e=0;e<n.length;++e)n[e]()},s={},i=function(e,t){ai(function(){r(e,t)})};ai(function(){i=r});for(var a=e.length-22;101010256!=Js(e,a);--a)if(!a||e.length-a>65558)return i(Ss(13,0,1),null),o;var c=qs(e,a+8);if(c){var l=c,u=Js(e,a+16),d=4294967295==u||65535==l;if(d){var p=Js(e,a-12);(d=101075792==Js(e,p))&&(l=c=Js(e,p+32),u=Js(e,p+48))}for(var f=t&&t.filter,h=function(t){var r=function(e,t,r){var n=qs(e,t+28),o=function(e,t){if(t){for(var r="",n=0;n<e.length;n+=16384)r+=String.fromCharCode.apply(null,e.subarray(n,n+16384));return r}if(ni)return ni.decode(e);var o=function(e){for(var t="",r=0;;){var n=e[r++],o=(n>127)+(n>223)+(n>239);if(r+o>e.length)return{s:t,r:Ts(e,r-1)};o?3==o?(n=((15&n)<<18|(63&e[r++])<<12|(63&e[r++])<<6|63&e[r++])-65536,t+=String.fromCharCode(55296|n>>10,56320|1023&n)):t+=1&o?String.fromCharCode((31&n)<<6|63&e[r++]):String.fromCharCode((15&n)<<12|(63&e[r++])<<6|63&e[r++]):t+=String.fromCharCode(n)}}(e),s=o.s;return(r=o.r).length&&Ss(8),s}(e.subarray(t+46,t+46+n),!(2048&qs(e,t+8))),s=t+46+n,i=Js(e,t+20),a=r&&4294967295==i?function(e,t){for(;1!=qs(e,t);t+=4+qs(e,t+2));return[Xs(e,t+12),Xs(e,t+4),Xs(e,t+20)]}(e,s):[i,Js(e,t+24),Js(e,t+42)],c=a[0],l=a[1],u=a[2];return[qs(e,t+10),c,l,o,s+qs(e,t+30)+qs(e,t+32),u]}(e,u,d),a=r[0],l=r[1],p=r[2],h=r[3],g=r[4],m=r[5],y=function(e,t){return t+30+qs(e,t+26)+qs(e,t+28)}(e,m);u=g;var v=function(e,t){e?(o(),i(e,null)):(t&&(s[h]=t),--c||i(null,s))};if(!f||f({name:h,size:l,originalSize:p,compression:a}))if(a)if(8==a){var b=e.subarray(y,y+l);if(p<524288||l>.8*p)try{v(null,ei(b,{out:new Xo(p)}))}catch(e){v(e,null)}else n.push(function(e,t,r){return r||(r=t,t={}),"function"!=typeof r&&Ss(7),Ks(e,t,[Vs],function(e){return zs(ei(e.data[0],Ws(e.data[1])))},1,r)}(b,{size:p},v))}else v(Ss(14,"unknown compression type "+a,1),null);else v(null,Ts(e,y,y+l));else v(null,null)},g=0;g<l;++g)h()}else i(null,{});return o}),Ii=L(function(e,t,r){r||(r=t,t={}),"function"!=typeof r&&Ss(7);var n={};ti(e,"",n,t);var o=Object.keys(n),s=o.length,i=0,a=0,c=s,l=new Array(s),u=[],d=function(){for(var e=0;e<u.length;++e)u[e]()},p=function(e,t){ai(function(){r(e,t)})};ai(function(){p=r});var f=function(){var e=new Xo(a+22),t=i,r=a-i;a=0;for(var n=0;n<c;++n){var o=l[n];try{var s=o.c.length;ii(e,a,o,o.f,o.u,s);var u=30+o.f.length+si(o.extra),d=a+u;e.set(o.c,d),ii(e,i,o,o.f,o.u,s,a,o.m),i+=16+u+(o.m?o.m.length:0),a=d+s}catch(e){return p(e,null)}}!function(e,t,r,n,o){Qs(e,t,101010256),Qs(e,t+8,r),Qs(e,t+10,r),Qs(e,t+12,n),Qs(e,t+16,o)}(e,i,l.length,r,t),p(null,e)};s||f();for(var h=function(e){var t=o[e],r=n[t],c=r[0],h=r[1],g=function(){var e=-1;return{p:function(t){for(var r=e,n=0;n<t.length;++n)r=js[255&r^t[n]]^r>>>8;e=r},d:function(){return~e}}}(),m=c.length;g.p(c);var y=oi(t),v=y.length,b=h.comment,w=b&&oi(b),_=w&&w.length,E=si(h.extra),I=0==h.level?0:8,T=function(r,n){if(r)d(),p(r,null);else{var o=n.length;l[e]=Hs(h,{size:m,crc:g.d(),c:n,f:y,m:w,u:v!=t.length||w&&b.length!=_,compression:I}),i+=30+v+E+o,a+=76+2*(v+E)+(_||0)+o,--s||f()}};if(v>65535&&T(Ss(11,0,1),null),I)if(m<16e4)try{T(null,Zs(c,h))}catch(e){T(e,null)}else u.push(function(e,t,r){return r||(r=t,t={}),"function"!=typeof r&&Ss(7),Ks(e,t,[Ys],function(e){return zs(Zs(e.data[0],e.data[1]))},0,r)}(c,h,T));else T(null,c)},g=0;g<c;++g)h(g);return d});async function Ti({content:e,filename:t,sensitiveValues:r}){const n=t.toLowerCase();return n.endsWith(".trace")||n.endsWith(".network")?function({content:e,sensitiveValues:t}){const r=new D,n=new O,o=r.decode(e).split("\n").map(e=>{if(!e.trim())return e;try{const r=function({event:e,sensitiveValues:t}){return j(e).with({type:"console"},e=>({...e,args:e.args?.map(e=>({...e,preview:mi({sensitiveValues:t,str:e.preview}),value:yi({sensitiveValues:t,value:e.value})})),text:mi({sensitiveValues:t,str:e.text})})).with({type:"before"},e=>({...e,params:bi({obj:e.params,sensitiveValues:t}),title:e.title?mi({sensitiveValues:t,str:e.title}):void 0})).with({type:"after"},e=>({...e,error:wi({error:e.error,sensitiveValues:t}),result:void 0!==e.result?yi({sensitiveValues:t,value:e.result}):void 0})).with({type:"action"},e=>({...e,error:wi({error:e.error,sensitiveValues:t}),params:bi({obj:e.params,sensitiveValues:t}),result:void 0!==e.result?yi({sensitiveValues:t,value:e.result}):void 0,title:e.title?mi({sensitiveValues:t,str:e.title}):void 0})).with({type:"event"},e=>({...e,params:bi({obj:e.params,sensitiveValues:t})})).with({type:"stdout"},{type:"stderr"},e=>({...e,text:void 0!==e.text?mi({sensitiveValues:t,str:e.text}):void 0})).with({type:"error"},e=>({...e,message:mi({sensitiveValues:t,str:e.message})})).with({type:"log"},e=>({...e,message:mi({sensitiveValues:t,str:e.message})})).with({type:"context-options"},e=>({...e,options:bi({obj:e.options,sensitiveValues:t}),title:e.title?mi({sensitiveValues:t,str:e.title}):void 0})).with({type:"frame-snapshot"},e=>({...e,snapshot:bi({obj:e.snapshot,sensitiveValues:t})})).with({type:"resource-snapshot"},e=>({...e,snapshot:bi({obj:e.snapshot,sensitiveValues:t})})).with({type:"screencast-frame"},{type:"input"},e=>e).exhaustive()}({event:JSON.parse(e),sensitiveValues:t});return JSON.stringify(r)}catch{return mi({sensitiveValues:t,str:e})}});return n.encode(o.join("\n"))}({content:e,sensitiveValues:r}):n.endsWith(".html")||n.endsWith(".dat")||n.endsWith(".json")?_i({content:e,sensitiveValues:r}):n.startsWith("resources/")?async function({content:e,sensitiveValues:t}){return function(e){return function(e,t){if(function(e){return"string"==typeof e}(e)){!function(e){if(!e.isFile())throw new Error("Path provided was not a file!")}(m(e));const r=E(e,"r"),n=Buffer.alloc(515),o=I(r,n,0,515,0);return T(r),pi(n,o,t)}return pi(e,void 0!==t?.size?t.size:e.length,t)}(Buffer.from(e),{size:e.length})}(e)?e:_i({content:e,sensitiveValues:t})}({content:e,sensitiveValues:r}):e}function xi(e=process.cwd()){let t=n(e);for(;;){const e=Si(t);if(e){const r={...e.dependencies,...e.devDependencies},n="@playwright/test"in r?"@playwright/test":"playwright"in r?"playwright":void 0;if(n){const e=Ai(t);let r=!1,i=t;for(;;){const e=s(i,"node_modules"),t=s(e,n);if(g(t)){r=!0;break}const a=o(i);if(a===i)break;i=a}return{inNodeModules:r,installed:!0,packageManager:e,packageName:n}}}const r=o(t);if(r===t)return{inNodeModules:!1,installed:!1,packageManager:void 0};t=r}}function Si(e){const t=s(e,"package.json");let r;try{r=v(t,"utf-8")}catch{return}try{return JSON.parse(r)}catch{return}}function Ai(e){const t=[["npm","package-lock.json"],["pnpm","pnpm-lock.yaml"],["yarn","yarn.lock"]];let r=e;for(;;){for(const[e,n]of t)if(g(s(r,n)))return e;const e=o(r);if(e===r)return;r=e}}function Ci(e){if("npm"===e||"pnpm"===e)return["npx","playwright"];if("yarn"===e)return["yarn","playwright"];throw new Error("Package manager not supported")}var Ri=e=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),Pi=e=>(e instanceof Error?e.message:String(e)).slice(0,400),Ui=({outputDir:e,representativeTest:t})=>{const r=["test","--trace=on","--workers=1","--retries=0","--output",e];return t.filePath&&r.push(t.filePath),t.testTitle?r.push("--grep",Ri(t.testTitle)):t.testIdentifier&&r.push("--grep",`^${Ri(t.testIdentifier)}$`),r},ki=async e=>{const t=await q(e,{withFileTypes:!0}),n=[];for(const o of t){const t=r.join(e,o.name);if(o.isDirectory())n.push(...await ki(t));else if(o.isFile()&&"trace.zip"===o.name){const e=await J(t);n.push({path:t,mtimeMs:e.mtimeMs})}}return n},{zSuiteAutoHealReport:Li,zRepresentativeTest:Di}=function(e){const t=e.enum(Fo),r=["Classification of the root cause:","",`- test: ${Yo("test")}`,`- bug: ${Yo("bug")}`,`- flake: ${Yo("flake")}`,`- ui_change: ${Yo("ui_change")}`,`- other: ${Yo("other")}`].join("\n"),n=e.object({filePath:e.string().optional(),testIdentifier:e.string().optional(),testTitle:e.string().optional()}),o=e.object({status:e.enum(["captured","capture_failed","upload_failed"]),representativeTest:n,storage:e.object({bucket:e.string(),key:e.string()}).optional(),signedUrl:e.string().optional(),error:e.string().optional()}),s=o.extend({testCaseId:e.string().min(1).describe("Test case ID this trace proof corresponds to.")}),i=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 (must be existing IDs only)."),rootCause:e.string().describe("Brief explanation of what happened (1-2 sentences). Include file:line references (e.g., `src/tests/login.spec.ts:42`) to back up your claim."),traceProofs:e.array(s).min(1).optional().describe("Per-test trace proofs for each testCaseId in this issue.")}),a=e.discriminatedUnion("result",[i.extend({fixApplied:e.string().describe("What fix was applied (brief, specific). Include file:line references (e.g., `src/tests/login.spec.ts:42`) showing where changes were made."),result:e.literal("fixed"),traceProof:o.optional()}),i.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). Include file:line references (e.g., `src/tests/login.spec.ts:42`) pointing to the problematic code."),result:e.literal("unfixed")})]);return{zAutoHealReport:a,zIssueCategory:t,zRepresentativeTest:n,zSuiteAutoHealReport:e.object({issues:e.array(a).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.")}),zTraceProof:o,zTraceProofByTest:s}}(pe),Oi=({authHeader:e,diffTracker:t,orgId:n,runId:o,workingDir:s})=>B({name:"auto-heal-report",tools:[N("capture-trace-proof",["Capture and upload a Playwright trace proof for a test case.","","MANDATORY: Call for EVERY testCaseId in your issue, whether fixed or unfixed.","- Fixed: Trace proves the fix works","- Unfixed: Trace shows the failure state for auditability","","Pass testCaseId and call once per test case.","testCaseId is for per-test mapping/storage metadata; representativeTest selects the runnable test."].join("\n"),{issueId:pe.string().min(1).describe("Issue identifier for deterministic output paths and storage key naming."),proofId:pe.string().min(1).optional().describe("Optional id for deterministic proof naming and deduplication."),representativeTest:Di.optional().default({}),testCaseId:pe.string().min(1).optional().describe("Optional test case ID when capturing per-test trace proofs.")},async({issueId:t,proofId:i,representativeTest:a,testCaseId:c})=>{const l=pe.string().min(1).parse(t),u=null==i?void 0:pe.string().min(1).parse(i),d=null==c?void 0:pe.string().min(1).parse(c),f=await(async({authHeader:e,issueId:t,orgId:n,proofId:o,representativeTest:s,runId:i,testCaseId:a,workingDir:c})=>{if(!(e=>null!=e.filePath||null!=e.testTitle||null!=e.testIdentifier)(s))return{status:"capture_failed",representativeTest:s,error:"Representative test info is missing (need filePath, testTitle, or testIdentifier)."};const l=xi(c);if(!l.installed||!l.inNodeModules||!l.packageManager)return{status:"capture_failed",representativeTest:s,error:"Playwright is not installed in the current workspace."};const u=(e=>Wo(e)??"issue")(t),d=(({proofId:e,testCaseId:t})=>Ko(t)??Ko(e))({testCaseId:a,proofId:o}),f=r.join(c,".stably","autoheal-proof",u,d??"issue"),[h,...g]=Ci(l.packageManager),m=[...g,...Ui({outputDir:f,representativeTest:s})];try{await X(f,{force:!0,recursive:!0}),await Y(f,{recursive:!0});const{code:r,stderr:l,timedOut:u}=await(async({args:e,command:t,cwd:r,env:n,timeoutMs:o})=>await new Promise((s,i)=>{const a=p(t,e,{cwd:r,env:n??process.env,stdio:["ignore","ignore","pipe"]});let c="",l=!1;a.stderr.on("data",e=>{c+=e.toString()});const u=setTimeout(()=>{l=!0,a.kill("SIGTERM")},o);a.on("error",e=>{clearTimeout(u),i(e)}),a.on("close",e=>{clearTimeout(u),s({code:e,stderr:c,timedOut:l})})}))({args:m,command:h,cwd:c,env:{...process.env,STABLY_INTERNAL_DISABLE_REPORTING:"1"},timeoutMs:3e5});if(u)return{status:"capture_failed",representativeTest:s,error:"Trace proof run timed out while executing Playwright verification."};if(0!==r)return{status:"capture_failed",representativeTest:s,error:`Trace proof run failed (exit code ${r??"unknown"}): ${l.trim().slice(0,280)}`};const d=await(async e=>{const t=await ki(e);if(0!==t.length)return t.sort((e,t)=>t.mtimeMs-e.mtimeMs),t[0]?.path})(f);if(!d)return{status:"capture_failed",representativeTest:s,error:"Trace proof run completed, but no trace.zip was produced."};const{traceBucketPath:g,uploadUrl:v,sensitiveValues:b}=await(async({authHeader:e,issueId:t,proofId:r,testCaseId:n,contentType:o="application/zip",orgId:s,runId:i})=>{const a=await(c={auth:e,body:{contentType:o,issueId:t,proofId:r,testCaseId:n},client:Jr(),headers:Xn(s),path:{runId:i}},(c.client??Mr).post({security:[{scheme:"bearer",type:"http"}],url:"/internal/v1/cli/runs/{runId}/autoheal-trace/upload-url",...c,headers:{"Content-Type":"application/json",...c.headers}}));var c;if(a.error)throw new Error(`Failed to presign trace upload (${a.response.status})`);const l=to.parse(a.data);return{traceBucketPath:l.traceBucketPath,expiresInSeconds:l.expiresInSeconds,key:l.key,uploadUrl:l.uploadUrl,sensitiveValues:l.sensitiveValues}})({authHeader:e,issueId:t,proofId:o,orgId:n,runId:i,testCaseId:a}),w=await async function({tracePath:e,sensitiveValues:t}){const r=[],n=y(e);for await(const e of n)r.push(e);return async function({sensitiveValues:e,traceBuffer:t}){const r=e.filter(e=>!(e.length<3||fi.some(t=>t.test(e))||hi.some(t=>e.includes(t))));if(0===r.length)return new Uint8Array(t);const n=[...r].sort((e,t)=>t.length-e.length),o=await Ei(new Uint8Array(t)),s=Object.entries(o),i=await Promise.all(s.map(async([e,t])=>[e,await Ti({content:t,filename:e,sensitiveValues:n})])),a=Object.fromEntries(i);return Ii(a)}({traceBuffer:new Uint8Array(Buffer.concat(r)),sensitiveValues:t})}({tracePath:d,sensitiveValues:b});try{await(async({contentType:e="application/zip",traceBuffer:t,uploadUrl:r})=>{const n=await fetch(r,{body:Buffer.from(t),headers:{"Content-Type":e},method:"PUT"});if(!n.ok)throw new Error(`Failed to upload trace (${n.status})`)})({traceBuffer:w,uploadUrl:v})}catch(e){return{status:"upload_failed",representativeTest:s,error:Pi(e)}}return{status:"captured",representativeTest:s,storage:g}}catch(e){return{status:"capture_failed",representativeTest:s,error:Pi(e)}}})({authHeader:e,issueId:l,orgId:n,proofId:u,representativeTest:Di.parse(a??{}),runId:o,testCaseId:d,workingDir:s}),h="string"==typeof d?{testCaseId:d,...f}:f;return{content:[{text:JSON.stringify(h),type:"text"}]}}),N("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:Li},async({report:r})=>{const s=await t.computeDiff(),i=(e=>{if(!e||"object"!=typeof e)return e;const t=e;if(!Array.isArray(t.issues))return e;const r=t.issues.map(e=>{if(!e||"object"!=typeof e)return e;const t=e;if("fixed"!==t.result||null!=t.traceProof||!Array.isArray(t.traceProofs))return e;const[r]=t.traceProofs;if(!r||"object"!=typeof r)return e;const n={...r};return delete n.testCaseId,{...t,traceProof:n}});return{...t,issues:r}})(r),a=Li.parse(i);try{await(async({authHeader:e,orgId:t,report:r,runId:n})=>{const o=await(s={auth:e,body:{report:JSON.stringify(r)},client:Jr(),headers:Xn(t),path:{runId:n}},(s.client??Mr).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:n,report:a,runId:o});const{diffBucketPath:t,uploadUrl:r}=await ro({authHeader:e,contentType:"text/plain",orgId:n,runId:o});await no({contentType:"text/plain",diff:s,uploadUrl:r}),await oo({authHeader:e,diffBucketPath:t,orgId:n,runId:o})}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. ${e instanceof Error?e.message:String(e)} 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"}),Bi=({onComplete:e,onRestartRequested:t})=>B(e?{name:"session-control",tools:[N("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:pe.string().describe("A brief summary of what was accomplished")},({summary:t})=>{const r="string"==typeof t?t:String(t);return e(),Promise.resolve(`Session complete: ${r}`)})]}:{name:"stably-agent-control",version:"1.0.0",tools:[N("restart_mcp_servers",'Restart the MCP servers to reinitialize browser tools after dependency changes.\n\nWHEN TO USE:\n- After installing or updating @playwright/test to version 1.56.x\n- When browser tools fail due to version mismatch errors\n- When the user has fixed a dependency issue and you need to reinitialize\n\nIMPORTANT: The restart happens at the END of your current turn.\n- Do NOT call any browser tools (setup_page, navigate, etc.) after this tool in the same turn - they will use the OLD servers\n- After calling this tool, END your turn naturally (no more tool calls)\n- The system will automatically continue in a new turn once the tools are restarted\n- Do NOT ask the user to reply again just to resume (only ask if you truly need additional input)\n\nEnd your turn briefly. You may say something like:\n- "Restarting browser tools now…"\n- "Tools are restarting to pick up the dependency changes…"',{},()=>(t(),Promise.resolve({content:[{type:"text",text:"MCP servers are being restarted. Browser tools will be reinitialized."}]})))]}),Ni=pe.object({commentUrl:pe.string()}),$i=({prContext:e,authHeader:t,orgId:r,onReportPosted:n})=>B({name:"create-report",tools:[N("post_create_report",`Post a test creation report as a GitHub comment on PR #${e.prNumber}.\nCall this tool at the end of test creation to summarize what was created.\nThe report will be posted to: ${e.prUrl}\n\nWHEN TO USE:\n- After you have finished creating test files\n- To provide a summary of the tests created on the PR for visibility\n\nThe report will include:\n- A list of all test files created\n- Your summary of what was tested`,{summary:pe.string().describe("A summary of the tests created. Include what features/flows are tested and any important notes."),filesCreated:pe.array(pe.string()).describe("List of test file paths that were created (relative to workspace root)")},async({summary:o,filesCreated:s})=>{const i=Array.isArray(s)?s:[];jn.info("[create-report] Posting report to GitHub PR",{prNumber:e.prNumber,filesCount:i.length});try{const s={summary:"string"==typeof o?o:String(o),filesCreated:i.map(String)},a=await async function({authHeader:e,orgId:t,prNumber:r,owner:n,repo:o,report:s}){const i=new URL("/internal/v1/cli/create-report",Gr).toString(),a={Authorization:e,"Content-Type":"application/json"};t&&(a["x-stably-org-id"]=t),jn.debug("Posting create report to GitHub",{prNumber:r,owner:n,repo:o,filesCount:s.filesCreated.length});const c=await fetch(i,{method:"POST",headers:a,body:JSON.stringify({prNumber:r,owner:n,repo:o,report:s}),signal:AbortSignal.timeout(3e4)});if(!c.ok){const e=await c.text().catch(()=>"");throw jn.error("Failed to post create report",{status:c.status,error:e.slice(0,500)}),new Error(`Failed to post create report: ${c.status} ${e.slice(0,200)}`)}const l=Ni.parse(await c.json());return jn.info("Create report posted successfully",{commentUrl:l.commentUrl}),l}({authHeader:t,orgId:r,prNumber:e.prNumber,owner:e.owner,repo:e.repo,report:s});return n?.(a),jn.info("[create-report] Report posted successfully",{commentUrl:a.commentUrl}),{content:[{type:"text",text:`✅ Test creation report posted to PR #${e.prNumber}\n\nView the comment: ${a.commentUrl}`}]}}catch(e){const t=e instanceof Error?e.message:String(e);return jn.error("[create-report] Failed to post report",{error:t}),{content:[{type:"text",text:`❌ Failed to post report to GitHub: ${t}\n\nThe tests were still created successfully, but the PR comment could not be posted.`}],isError:!0}}})]}),ji=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]"),Mi=(e,t)=>({message:ji(e),status:t?.status,statusText:t?.statusText}),Hi=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"]),Gi=async({authHeader:e,mode:t,maxTurnsOverride:r})=>{const n=Jr();jn.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??Mr).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 jn.warn("Subagent definitions fetch failed: unauthorized (401)"),await pn(),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 jn.debug("Subagent definitions fetch failed: forbidden (403)"),new Error("Your organization does not have an active subscription. Manage your subscription at https://app.stably.ai or contact your organization admin.");if(o.error)throw jn.warn("Subagent definitions fetch failed",{error:o.error}),new Error("Failed to fetch subagent definitions. Please check your network connection and try again. If this persists, run `stably login` to re-authenticate.");const{subagents:i}=o.data;return jn.debug("Subagent definitions received",{count:Object.keys(i).length}),i},Fi=r.dirname(S(import.meta.url)),Vi=r.join(".claude-plugin","plugin.json"),Yi=[r.join("packages","agent-plugin","stably-plugin"),r.join("agent-plugin","stably-plugin")];function zi(e){return g(r.join(e,Vi))}var{zStablyYaml:Wi}=function(e){const t=e.object({cron:e.string(),stablyTestArgs:e.string().optional(),timezone:e.string().optional(),command:e.string().optional()}),r=e.object({maxTurnsPerIssue:e.number().int().positive().optional(),maxParallelWorkers:e.number().int().positive().optional(),rules:e.string().optional(),skipAfterConsecutiveUnfixed:e.number().int().positive().optional()}),n=e.object({fix:r.optional()}),o=e.object({setupScript:e.string().optional()});return{zStablyYaml:e.object({schedules:e.record(e.string(),t).optional(),agent:n.optional(),cloud:o.optional()}),zAgentConfig:n,zAgentFixConfig:r,zScheduleEntry:t,zCloudConfig:o}}(ae),Ki=async(e,t)=>{try{const r=await rn(e,t);if(!r)return void jn.debug(`No ${t} found`);const n=await V(r,"utf-8");if(!n.trim())return;return n.length>1e4?(jn.warn(`${t} exceeds max length (${n.length} > 10000), truncating`,{path:r}),{content:n.slice(0,1e4),path:r}):(jn.debug(`Loaded ${t} rules`,{path:r,contentLength:n.length}),{content:n,path:r})}catch(e){return void jn.warn(`Failed to read ${t}`,{error:e})}},qi=["Bash","Read","Write","Edit","Glob","Grep","Task","Skill"],Ji=["Task","mcp__playwright-test","Skill"],Xi=["Bash","Read","Write","Edit","Glob","Grep","mcp__session-control"],Qi=e=>{if("EPIPE"!==e.code)throw e},Zi="__main__",ea=e=>"mcp__auto-heal-report__generate-report"===e;async function ta(e,t){return!!e&&(!!e.hasQueuedMessages()||new Promise(r=>{const n=setTimeout(()=>{clearInterval(o),r(!1)},t),o=setInterval(()=>{e.hasQueuedMessages()&&(clearTimeout(n),clearInterval(o),r(!0))},200)}))}var ra=async e=>{if("single"===e.mode){const t=Array.isArray(e.prompt)?e.prompt.join(" "):e.prompt;jn.initSession(t||"create-from-diff")}else"fix"===e.mode&&jn.initSession(`fix-${e.runId}`);jn.info("Agent session starting",{mode:e.mode}),process.stdout.on("error",Qi),process.stderr.on("error",Qi);const i=e=>{if("EPIPE"!==e.code)throw e};process.on("uncaughtException",i),jn.debug("Checking authentication");const a=await Yn({autoLogin:"chat"===e.mode||"init"===e.mode}),c=Wn(a);jn.debug("Authentication resolved",{authType:a.type});const l="oauth"===a.type?a.auth.context.orgId:void 0,u=r.resolve(process.cwd()),d=r.join(u,".env"),p=h.existsSync(d)&&h.statSync(d).isFile(),f=p?t(h.readFileSync(d,"utf8")):{};jn.debug("Environment file",{path:d,exists:p,variableCount:Object.keys(f).length});const m="chat"!==e.mode&&"init"!==e.mode,y="chat"===e.mode;let v=new Io;const b="chat"===e.mode?e.getHelpText:void 0,w={log:[],promptDisplay:j(e).with({mode:"chat"},()=>"Ask Stably to build tests for you").with({mode:"init"},()=>"Setting up Playwright and Stably SDK").with({mode:"fix"},()=>"Fixing broken tests").with({mode:"single"},e=>{const t=(Array.isArray(e.prompt)?e.prompt.join(" "):e.prompt)?.trim();return t||"Creating tests from PR/branch changes"}).exhaustive(),status:"running"};let _,E,I,T,x=m,S=!1,A=!1,C=0,R=0,P=!1;const U=[];let k,L,D=[],O=!1,B=!1,N=0;const H=new Map;let F=null,Y=!1,z=!1;const W=Date.now();let K,q="fix"===e.mode?{suiteId:e.runId,phase:"initializing",totalTests:null,fixedTests:0,failedTests:0,currentTestDescription:null,lastTestDescription:null,startedAt:W,endedAt:null,isError:!1,updatedAt:W,recentActivity:[],workers:[{id:Zi,testDescription:"Orchestrator",workerType:"main",status:"running",summary:null,startedAt:W,endedAt:null,activity:[]}]}:null;const J=new Set,X=(e,t)=>{if(!q)return;const r=q.workers.map(r=>{if(r.id!==e)return r;const n=[...r.activity,{...t,timestamp:Date.now()}].slice(-15);return{...r,activity:n}});ee({workers:r})},Q=e=>{if(!q)return;const t=[...q.recentActivity,{...e,timestamp:Date.now()}].slice(-10);ee({recentActivity:t})},Z=e=>(q?.workers??[]).map(t=>t.id===Zi?{...t,status:e?"failed":"succeeded",endedAt:t.endedAt??Date.now()}:"running"===t.status?{...t,status:"failed",endedAt:Date.now()}:t),ee=e=>{q&&!K?.isClosed&&(q={...q,...e,updatedAt:Date.now()},K?.sendProgress(q))},te=async t=>{if("fix"===e.mode){if("STARTED"===t){if(Y)return;Y=!0}else{if(z)return;z=!0}try{await(async({authHeader:e,orgId:t,runId:r,status:n})=>{const o=await(s={auth:e,body:{status:n},client:Jr(),headers:Xn(t),path:{runId:r}},(s.client??Mr).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:c,orgId:l,runId:e.runId,status:t})}catch{}}},re="single"===e.mode,ne=Date.now();let oe,se=null;const ie=e=>{se&&!oe?.isClosed&&(se={...se,...e,updatedAt:Date.now()},oe?.sendProgress(se))},ae=e=>{if(!se)return;const t=[...se.recentActivity,{...e,timestamp:Date.now()}].slice(-10);ie({recentActivity:t})};if(re||"fix"===e.mode)try{const t=new URL("/internal/v1/cli/progress",Gr).toString(),r={Authorization:c,"Content-Type":"application/json"};l&&(r["x-stably-org-id"]=l);const n="single"===e.mode?"create":"fix",o=await fetch(t,{method:"POST",headers:r,body:JSON.stringify({mode:n,projectId:zn(a),agentId:M.randomUUID(),..."fix"===e.mode?{playwrightSuiteRunId:e.runId}:{}}),signal:AbortSignal.timeout(1e4)});if(o.ok){const{sessionId:t}=await o.json();if(re){const r="single"===e.mode?Array.isArray(e.prompt)?e.prompt.join(" "):e.prompt:null,n=To(u);se={sessionId:t,phase:"initializing",startedAt:ne,endedAt:null,isError:!1,updatedAt:ne,currentActivity:null,filesCreated:[],recentActivity:[],prompt:r||null,environment:{gitBranch:n?.branch??null,workingDirectory:u,nodeVersion:process.version,cliVersion:Hr}},oe=new io({authHeader:c,orgId:l,sessionId:t,onUserMessage:e=>{v&&(jn.info("[ws] Injecting web UI message into agent",{contentLength:e.length}),ae({type:"user_message",summary:e}),Ie({text:`[Web] ${e}`}),v.pushText(`[Message from web UI user]: ${e}`),x||(x=!0,Ue({status:"running"})))}}),oe.start(),ie({phase:"initializing"})}jn.info(`[${n}] Progress session created`,{sessionId:t})}else{const e=await o.text().catch(()=>"");jn.warn(`[${n}] Failed to create progress session: ${o.status} ${t} — ${e.slice(0,300)}`)}}catch(e){const t=e instanceof Error?e.message:String(e);jn.warn(`[progress] Session creation failed (non-fatal): ${t}`)}const ce={current:e=>{}},le={current:async()=>{}},{addSubagentActivity:ue,addSubagentStart:de,addTool:pe,addToolResult:fe,appendText:_e,appendUserMessage:Ie,cleanup:Te,setExiting:xe,setRunningLabel:Se,setStatus:Ae,setSubagentStatus:Ce,updateFixProgress:Re}=await(async(e,t)=>{const{Box:r,Static:n,Text:o,render:s,useInput:i}=await import("ink"),a=!!process.stdin.isTTY,c=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],l=()=>be(o,{inverse:!0,children:" "}),u=(({Box:e,Text:t,useInput:r},n,o)=>function({onChoice:s,prompt:i}){const[a,c]=he(0),[l,u]=he(!1),[d,p]=he(""),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=Go(i.toolName),g=Ho(i.toolName,i.input);return we(e,{borderColor:"yellow",borderStyle:"round",flexDirection:"column",marginTop:1,paddingX:1,paddingY:0,children:[be(t,{bold:!0,color:"yellow",children:"Permission Required"}),we(e,{flexDirection:"column",marginTop:1,children:[be(t,{color:"gray",dimColor:!0,children:h}),null!=g&&we(t,{color:"gray",children:[" ",g]})]}),null!=i.decisionReason&&be(e,{marginTop:1,children:we(t,{color:"gray",children:["Reason: ",i.decisionReason]})}),we(e,l?{flexDirection:"column",marginTop:1,children:[be(t,{color:"gray",children:"Enter message for AI (press Enter to submit, Esc to cancel):"}),we(t,{children:[be(t,{color:"yellow",children:">"})," ",d,be(n,{})]})]}:{flexDirection:"column",marginTop:1,children:[be(t,{color:"gray",children:"Use ↑↓ arrows or number keys to select:"}),f.map((e,r)=>be(t,{children:we(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=({progress:e})=>{const[r,o]=he(Date.now());me(()=>{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:u,color:d}={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 be(t,{flexDirection:"column",children:we(n,{children:[be(n,{color:d,bold:!0,children:u}),be(n,{color:"gray",children:f}),we(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 we(t,{flexDirection:"column",children:[we(n,{color:c,bold:!0,children:[l," in ",a]}),null!==e.totalTests&&we(n,{color:"gray",children:[e.fixedTests,"/",e.totalTests," tests fixed",e.failedTests>0?`, ${e.failedTests} failed`:""]})]})},u=e=>{if("subagent"===e.kind&&e.subagent){const{subagent:r}=e,o="complete"===r.status?"green":"error"===r.status?"red":"yellow";return we(t,{flexDirection:"column",marginTop:1,children:[we(n,{children:[be(n,{color:o,bold:!0,children:"Agent"}),r.description?we(n,{color:"gray",children:[" (",r.description,")"]}):null]}),r.activities.length>0&&be(t,{flexDirection:"column",marginLeft:2,children:r.activities.map(e=>(e=>"tool"===e.kind?we(n,{color:"gray",dimColor:!0,children:["• ",e.content]},e.id):"tool_result"===e.kind?be(n,{color:"gray",children:e.content},e.id):null)(e))})]},e.id)}return"tool"===e.kind?we(n,{color:"gray",dimColor:!0,children:["• ",e.content]},e.id):"tool_result"===e.kind?be(n,{color:"gray",children:e.content},e.id):"user"===e.kind?we(n,{color:"cyan",children:["You: ",e.content]},e.id):be(n,{children:e.content},e.id)},d="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:v,showSpinnerImmediately:b,state:w}){const[_,E]=he({value:"",cursor:0}),I=_.value,T=_.cursor,x=ge(!1),S=ge(void 0),[A,C]=he(!1),R=ge(0),P=w.log.at(-1),U="text"===P?.kind&&"running"===w.status,k=w.log.findIndex(e=>"subagent"===e.kind&&"running"===e.subagent?.status),L=d?0:-1!==k?k:U?w.log.length-1:w.log.length;me(()=>{w.log.length<R.current&&(R.current=0),L>R.current&&(R.current=L)},[w.log.length,L]);const D=w.log.slice(0,R.current),O=w.log.slice(R.current),B=!!w.permissionPrompt,N=ye(async()=>{x.current?(S.current&&clearTimeout(S.current),await(m?.()),process.exit(0)):(x.current=!0,C(!0),S.current=setTimeout(()=>{x.current=!1,C(!1)},2e3))},[m]);o((e,t)=>{t.ctrl&&"c"===e&&N().catch(()=>process.exit(1))},{isActive:s}),me(()=>{if(B||!v)return;const e=e=>{const t=e.toString();"[1;5H"!==t&&"[1;5~"!==t?"[1;5F"!==t&&"[4;5~"!==t?"[H"!==t&&"[1~"!==t&&"OH"!==t&&"[7~"!==t?"[F"!==t&&"[4~"!==t&&"OF"!==t&&"[8~"!==t||E(e=>({...e,cursor:g(e.value,e.cursor)})):E(e=>({...e,cursor:h(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)}},[B,v,I]),o((e,t)=>{if(!t.ctrl||"c"!==e){if(t.return){const e=I.trim();return e&&v?.(e),void E({value:"",cursor:0})}t.ctrl&&"w"===e||t.ctrl&&t.backspace?E(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?E(e=>({...e,cursor:p(e.value,e.cursor)})):t.ctrl&&t.rightArrow||t.meta&&"f"===e?E(e=>({...e,cursor:f(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&&!!v&&!B});const $=ve(()=>"running"===w.status?be(a,{label:w.runningLabel??"Working"}):"success"!==w.status?be(n,{color:"red",children:"✖ Failed"}):void 0,[w.runningLabel,w.status]),j=!(b||!v||"running"!==w.status||0!==w.log.length||w.resultText||w.errorText),M="running"===w.status&&!j||w.log.length>0||w.resultText||w.errorText||"running"!==w.status;return we(t,{flexDirection:"column",children:[be(r,{items:["header"],children:()=>we(t,{flexDirection:"column",flexShrink:0,children:[be(n,{color:"cyan",bold:!0,children:"Stably Agent"}),be(t,{flexDirection:"column",marginTop:1,children:be(n,{color:"gray",children:w.promptDisplay})})]},"header")}),D.length>0&&be(r,{items:D,children:e=>u(e)}),O.length>0&&be(t,{flexDirection:"column",children:O.map(e=>u(e))}),"error"===w.status&&w.errorText&&be(t,{marginTop:1,children:be(n,{color:"red",children:w.errorText})}),"success"===w.status&&w.resultText&&be(t,{marginTop:1,children:be(n,{children:w.resultText})}),M&&be(t,{flexDirection:"column",flexShrink:0,marginTop:1,children:"running"===w.status&&w.fixProgress?we(t,{flexDirection:"column",children:[we(t,{children:[be(a,{}),be(n,{children:" "}),be(c,{progress:w.fixProgress})]}),"fixing"===w.fixProgress.phase&&w.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 we(t,{flexDirection:"column",children:[we(n,{children:[" ",be(a,{}),we(n,{color:"gray",children:[r.description||"fix-worker",s>0?` (${s} ${1===s?"cycle":"cycles"})`:""]})]}),c&&we(n,{color:"gray",dimColor:!0,children:[" • ",c.content]}),l&&we(n,{color:"gray",dimColor:!0,children:[" ",l]})]},e.id)})]}):"success"!==w.status&&"error"!==w.status||!w.fixProgress?$:be(l,{progress:w.fixProgress})}),null!=w.permissionPrompt&&null!=y&&be(i,{onChoice:y,prompt:w.permissionPrompt}),null!=v&&null==w.permissionPrompt&&!w.isExiting&&we(t,{borderColor:"gray",borderStyle:"round",flexDirection:"column",flexShrink:0,marginTop:1,paddingX:1,paddingY:0,children:[be(n,{color:"gray",children:"Type a message and press Enter. Press Ctrl+C to exit."}),we(n,{children:[be(n,{color:"yellow",children:">"})," ",I.slice(0,T),be(e,{}),I.slice(T)]})]}),A&&we(t,{marginTop:1,flexDirection:"column",children:[be(n,{color:"yellow",children:"Press Ctrl+C again to exit"}),An&&we(n,{color:"gray",children:["Debug log: ",Un]})]})]})}})({Cursor:l,inkComponents:{Box:r,Static:n,Text:o,useInput:i},isRawModeSupported:a,PermissionPrompt:u,Spinner:({label:e})=>{const[t,r]=he(0);return me(()=>{const e=setInterval(()=>r(e=>(e+1)%c.length),80);return()=>clearInterval(e)},[]),we(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(be(d,{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(be(d,{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=Go(e),n=Ho(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()},setRunningLabel:({label:e})=>{p.runningLabel=e,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}})(w,"chat"===e.mode||"init"===e.mode?{onExit:()=>le.current(),onSend:e=>ce.current(e),showSpinnerImmediately:"init"===e.mode}:"fix"===e.mode?{onExit:()=>le.current(),isFixMode:!0}:void 0);let Pe=w.status;const Ue=({error:e,result:t,status:r})=>{Pe=r,Ae({error:e,result:t,status:r})};let ke;ce.current=e=>{const t=e.trim();if(y&&!jn.getLogFilePath()&&jn.initSession(t||"chat"),jn.debug("User message",{text:t}),"/help"===t){x&&v&&(S=!0,_?.interrupt?.(),v.allowNextTurn(),x=!1),"running"===Pe&&Ue({status:"success"}),Ie({text:e});const t=b?.();return void _e({text:t??"Help is not available in this session."})}const r=I||A&&x;if(y&&(C+=1,T=void 0,r||(P=!1,Se({label:void 0}))),v){if(r)return Ue({status:"running"}),Ie({text:e}),void U.push(e);if(!A||x||I||(A=!1),x)return Ue({status:"running"}),Ie({text:e}),v.pushText(e),void(R+=1);Ue({status:"running"}),Ie({text:e}),v.pushText(e),x=!0}};const Le=[];let De;const Oe=await(async e=>{try{const t=await rn(e,"stably.yaml");if(!t)return void jn.debug("No stably.yaml found");const r=await V(t,"utf-8");if(!r.trim())return;const n=Ee(r),o=Wi.parse(n.toJS()),s=o.agent?.fix?.maxTurnsPerIssue,i=o.agent?.fix?.maxParallelWorkers,a=!!o.agent?.fix?.rules;return jn.debug(`Loaded stably.yaml: maxTurnsPerIssue=${s??"default"}, maxParallelWorkers=${i??"default"}, hasRules=${a}`,{path:t,config:o.agent}),o}catch(e){return void jn.warn("Failed to parse stably.yaml",{error:e})}})(u),Be=Oe?.agent?.fix?.skipAfterConsecutiveUnfixed,Ne=await(async()=>{if("single"===e.mode){const r=await async function(e,t){const r=n(e);if(t){const e=n(r,t);return Oo(e,"output-flag"),{path:e,source:"output-flag"}}const i=ko(r);if(i){const e=await async function(e){try{const t=(await V(e,"utf-8")).match(/testDir:\s*['"]([^'"]+)['"]/);return t?.[1]}catch{return}}(i);if(e){const t=n(o(i),e);if(Do(t))return Oo(t,"playwright.config.ts"),{path:t,source:"playwright.config.ts"}}}for(const e of Lo){const t=s(r,e);if(Do(t))return Oo(t,"auto-detected"),{path:t,source:"auto-detected"}}return Oo(r,"cwd-fallback"),{path:r,source:"cwd-fallback"}}(u,e.outputDir);return De=r.path,t=e.prompt,`${(Array.isArray(t)?t.join(" "):t).trim()||"Create tests based on the changes in the current PR or branch. If the user references a specific PR number or branch name, first checkout that PR/branch using `gh pr checkout <number>` or `git checkout <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 stably test` or the repo's test command) and iterate until the new tests pass."}\n\n[Output directory: ${De}]`}var t;if("fix"===e.mode)try{jn.info("[fix] Fetching autoheal context",{runId:e.runId,skipAfterConsecutiveUnfixed:Be});const t=Date.now(),{context:r,autohealReportUrl:n,skippedTests:o}=await(async({authHeader:e,orgId:t,runId:r,skipAfterConsecutiveUnfixed:n})=>{jn.debug("Fetching autoheal context",{runId:r,skipAfterConsecutiveUnfixed:n});const o=await(s={auth:e,client:Jr(),headers:Xn(t),path:{runId:r},query:null!=n?{skipAfterConsecutiveUnfixed:n}:{}},(s.client??Mr).get({security:[{scheme:"bearer",type:"http"}],url:"/internal/v1/cli/runs/{runId}/autoheal-context",...s}));var s;if(404===o.response.status)throw jn.warn("Autoheal context not found",{runId:r,status:404}),new Error(`Run ID "${r}" was not found.`);if(401===o.response.status)throw jn.warn("Autoheal context fetch unauthorized",{runId:r,status:401}),new Error("Unauthorized: failed to fetch autoheal context (401).");if(422===o.response.status)throw jn.warn("Autoheal context fetch invalid request",{runId:r,status:422,error:o.error?.error}),new Error(o.error?.error??"Failed to fetch autoheal context (422).");if(!o.error){const e=Qn.safeParse(o.data);if(e.success)return jn.debug("Autoheal context fetched successfully",{runId:r,contextSize:e.data.context.length,skippedTestCount:e.data.skippedTests?.length??0}),{context:e.data.context,autohealReportUrl:e.data.autohealReportUrl,skippedTests:e.data.skippedTests??[]};throw jn.warn("Autoheal context response invalid",{runId:r}),new Error("Autoheal context response missing or invalid context.")}throw jn.warn("Autoheal context fetch failed",{runId:r,error:o.error}),new Error("Failed to fetch autoheal context")})({authHeader:c,orgId:l,runId:e.runId,skipAfterConsecutiveUnfixed:Be});if(jn.info("[fix] Autoheal context fetched",{runId:e.runId,durationMs:Date.now()-t,contextLength:r.length,skippedTestCount:o.length}),ke=n,o.length>0){jn.info(`[fix] Skipping ${o.length} test(s) that failed to be fixed ${Be}+ consecutive times`);for(const e of o)jn.info(`[fix] Skipped: ${e.testIdentifier} — ${e.testTitle} (unfixed ${e.consecutiveUnfixedCount}x)`)}return r.includes("No failing tests to fix (all were skipped).")&&(jn.info("[fix] All failing tests were skipped — nothing to fix"),Ue({status:"success",result:`All failing tests skipped (unfixed ${Be}+ consecutive times). Nothing to fix.`}),await Te(),process.exit(0)),K||(jn.info("[fix] Creating WebSocket progress reporter"),K=new so({authHeader:c,orgId:l,runId:e.runId,onUserMessage:e=>{if(jn.info("[ws] Injecting web UI message into fix agent",{contentLength:e.length}),X(Zi,{type:"user_message",summary:e}),Q({type:"user_message",summary:e}),Ie({text:`[Web] ${e}`}),!x)return v.pushText(`[Message from web UI user]: ${e}`),x=!0,void v.allowNextTurn();O||Date.now()-N<2e3?v.pushText(`[Message from web UI user]: ${e}`):(D.push(e),k&&clearTimeout(k),k=setTimeout(()=>{k=void 0;const e=[...D];D=[],N=Date.now(),kt(e)},500))}}),K.start(),ee({phase:"initializing"})),te("STARTED"),r}catch(e){const t=e instanceof Error?e.message:"Failed to fetch autoheal context.";jn.error("[fix] Failed to fetch autoheal context",{error:t}),Ue({error:t,status:"error"}),await Te(),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.":""})(),$e=await async function(e){const t=r.resolve(e),n=r.join(t,"tests"),o=r.join(n,"helpers"),s=r.join(n,"assets"),i=function(e){const t=r.resolve(e);if(g(t))for(const e of xo){const n=r.join(t,`playwright.config${e}`);if(g(n))return n}}(t)??r.join(t,"playwright.config.ts"),a=r.basename(i),c=r.join(n,"seed.spec.ts"),[l,u,d,p,f,h]=await Promise.all([Co({defaultContent:"Unable to read directory",dirName:"working directory",dirPath:t}),Co({defaultContent:"Unable to read directory",dirName:"tests directory",dirPath:n}),Co({defaultContent:"Directory does not exist yet",dirName:"helpers directory",dirPath:o}),Co({defaultContent:"Directory does not exist yet",dirName:"assets directory",dirPath:s}),Ao({defaultContent:"File does not exist or could not be read",fileName:a,filePath:i}),Ao({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}}}(u),je=Oe?.agent?.fix?.maxTurnsPerIssue,Me=Oe?.agent?.fix?.maxParallelWorkers,He=Oe?.agent?.fix?.rules,Ge="fix"===e.mode||"single"===e.mode,Fe="single"===e.mode?await(async e=>{const t=await Ki(e,"STABLY-CREATE.md");return t?.content})(u):void 0,Ve=await(e=>Ki(e,"STABLY.md"))(u),Ye=Ve?.content;jn.info("[fix] Fetching system prompt and subagent definitions",{mode:e.mode,maxTurnsOverride:je,hasCustomRules:!!He,hasCreateRules:!!Fe,hasStablyMd:!!Ye,stablyMdPath:Ve?.path}),Ve&&jn.info(`STABLY.md loaded (${Ve.content.length} chars)`,{path:Ve.path});const ze=await Jn(),We=ze?Object.keys(ze.variables):[],Ke=[...new Set([...Object.keys(f),...We])],qe=Date.now(),[{systemPrompt:Je,prContext:Xe},Qe]=await Promise.all([Ro({allowedEnvVars:Ke,mode:e.mode,workspaceInfo:$e,authHeader:c,customHeader:"single"===e.mode?e.customHeader:void 0,maxParallelWorkers:"fix"===e.mode?Me:void 0}),Ge?Gi({authHeader:c,mode:e.mode,maxTurnsOverride:je}):Promise.resolve({})]);jn.info("[fix] System prompt and subagents fetched",{durationMs:Date.now()-qe,systemPromptSize:Je.length,subagentCount:Object.keys(Qe).length,maxTurnsOverride:je??"default",hasPrContext:!!Xe});const Ze={...f,...process.env},et={};for(const[e,t]of Object.entries(Ze))Hi.has(e)||void 0===t||(et[e]=t);const tt=!0;jn.debug("AI proxy configuration",{useStablyAiProxy:tt,wantsBypassProxy:!1,wantsUseOllama:!1}),jn.info("[fix] Acquiring AI proxy key",{useStablyAiProxy:tt});const rt=Date.now(),nt=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??Mr).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:Mi(e,a)}}return i.data?{key:i.data.key}:{error:Mi("No data in response",a)}}catch(e){const t=e instanceof Error?e.message:"Unknown error";return{error:Mi(t)}}var s}({auth:c,client:Jr(),source:"cli"}),ot=nt?.key;if(jn.info("[fix] AI proxy key acquired",{durationMs:Date.now()-rt,success:!!ot,hasError:!!nt?.error}),!ot){const e=nt?.error?.message?`Unable to make AI calls: ${nt.error.message}`:"Unable to make AI calls. Check if you are authenticated.";jn.warn("Failed to get proxy API key",{error:nt?.error?.message}),Ue({error:e,status:"error"}),await Te(),jn.flush(),jn.printLogFileInfo(),process.exit(1)}jn.debug("Proxy API key acquired",{success:!!ot});const st=await qn(),it=ze?.sensitiveValues.length?{STABLY_SENSITIVE_VALUES:Buffer.from(JSON.stringify(ze.sensitiveValues)).toString("base64")}:{},at=st?Object.fromEntries(Object.entries(Kn({...ze?.variables,...it,...st})).filter(e=>null!=e[1])):ze?Object.fromEntries(Object.entries(Kn({...ze.variables,...it})).filter(e=>null!=e[1])):void 0,ct="init"===e.mode,lt="fix"===e.mode,ut=lt?vr.createLocal({workingDir:u}):void 0;ut&&await ut.captureSnapshot();const dt=ct?Bi({onComplete:()=>{Ue({status:"success"}),xe(),v?.finish(),process.exit(0)}}):y?Bi({onRestartRequested:()=>{y&&(A=!0,Ue({status:"running"}),Se({label:"Restarting browser tools..."}),T={createdAtUserMessageSeq:C,attempts:0})}}):void 0,pt=dt?y?{"stably-agent-control":dt}:{"session-control":dt}:{},ft=re&&Xe?["mcp__create-report"]:[],ht=ct?Xi:[...qi,...lt?["mcp__auto-heal-report"]:[],...ft],gt=ct?Xi:y?[...Ji,"mcp__stably-agent-control"]:[...Ji,...ft],mt=re&&Xe?{"create-report":$i({prContext:Xe,authHeader:c,orgId:l,onReportPosted:e=>{ie({githubComment:{url:e.commentUrl,prNumber:Xe.prNumber}})}})}:{},yt=ct?pt:lt&&ut?{"playwright-test":{args:["playwright","run-test-mcp-server"],command:"npx",env:at},"auto-heal-report":Oi({authHeader:c,diffTracker:ut,orgId:l,runId:e.runId,workingDir:u}),...pt}:{"playwright-test":{args:["playwright","run-test-mcp-server"],command:"npx",env:at},...pt,...mt},vt="single"===e.mode,bt=ct?[]:[{hooks:[async e=>{const t=lo(e);if(!t)return{decision:"approve"};let r=!1;const n=t.map(e=>ao(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:[yo({onResult:e=>fe({message:e})})]},{matcher:"mcp__playwright-test__test_debug",hooks:[vo({onResult:e=>fe({message:e})})]},...vt?[{matcher:"Write",hooks:[wo({onFileCreated:e=>{Le.push(e),se&&ie({filesCreated:[...se.filesCreated,e]})}})]}]:[]],wt=ct?[]:[{matcher:"mcp__playwright-test__browser_(type|navigate|evaluate|fill_form)",hooks:[mo({envVars:{...f,...ze?.variables}})]}],_t=Object.keys(Qe).length>0?Qe:void 0,Et={...et};Et.MCP_TOOL_TIMEOUT=String(6e5),ot&&(Et.ANTHROPIC_API_KEY=ot,Et.ANTHROPIC_BASE_URL=zr,Et.CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS="1");const It=process.env.STABLY_AGENT_MODEL??"claude-opus-4-6",Tt=He?`\n\n## Custom Rules\n${He}`:"",xt=Fe?`\n\n## Custom Test Generation Rules\n${Fe}`:"",St=Ye?`\n\n## Project Rules (STABLY.md)\n${Ye}`:"",At=Je+Tt+xt+St;jn.debug("[fix] Final system prompt assembled",{baseSize:Je.length,fixRulesSize:Tt.length,createRulesSize:xt.length,stablyMdSize:St.length,finalSize:At.length});const Ct=function(){const e=function(){const e=function(){const e=process.env.STABLY_PLUGIN_PATH?.trim();if(!e)return;const t=r.isAbsolute(e)?e:r.resolve(process.cwd(),e);return zi(t)?t:void 0}();if(e)return e;const t=r.join(Fi,"stably-plugin");if(zi(t))return t;for(const e of function*(e){let t=r.resolve(e);for(;;){yield t;const e=r.dirname(t);if(e===t)return;t=e}}(Fi))for(const t of Yi){const n=r.join(e,t);if(zi(n))return n}}();if(e)return{type:"local",path:e}}(),Rt=()=>(jn.info("[fix] Starting SDK query",{model:It,tools:ht,mcpServers:Object.keys(yt),resumeSessionId:E??null,subagentsEnabled:!!_t,subagentCount:Object.keys(Qe).length,useStablyAiProxy:tt,aiProxyUrl:zr,anthropicBaseUrl:void 0,stablyPluginPath:Ct?.path,stablyPluginExists:!!Ct}),$({options:{executableArgs:["--max-old-space-size=4096"],tools:ht,allowedTools:gt,betas:[],canUseTool:(e,t)=>(jn.debug("[fix] canUseTool called",{toolName:e}),Promise.resolve({behavior:"allow",updatedInput:t})),cwd:u,env:Et,hooks:{PostToolUse:bt,PreToolUse:wt},includePartialMessages:!0,agents:_t,mcpServers:yt,model:It,permissionMode:"default",plugins:Ct?[Ct]:void 0,systemPrompt:At,...E?{resume:E}:{}},prompt:v??Ne})),Pt=()=>{if(v&&0!==U.length){for(const e of U)v.pushText(e);U.length=0,x=!0,Ue({status:"running"})}},Ut=async()=>{y&&(I||(I=(async()=>{jn.info("Restarting MCP servers for chat mode"),Ue({status:"running"}),Se({label:"Restarting browser tools..."});try{await(_?.interrupt?.())}catch(e){jn.warn("Failed to interrupt response during MCP restart",{error:e instanceof Error?e.message:String(e)})}await Eo(),v?.finish(),v=new Io,R=0,x=!1,S=!1,H.clear(),_=Rt(),P=!0,Se({label:"Restarting browser tools..."}),y&&v&&T&&(T.createdAtUserMessageSeq===C?T.attempts>=1||U.length>0?T=void 0:(T.attempts+=1,v.pushText(["[SYSTEM] MCP servers were restarted successfully.","Continue the task using existing conversation context.","Do not ask the user to resend their message unless new input is required."].join("\n")),T=void 0,x=!0,Ue({status:"running"})):T=void 0),Pt()})().finally(()=>{I=void 0,Pt()})),await I)},kt=async e=>{if(m&&x&&!O&&!L)L=(async()=>{jn.info("[fix] Interrupting for user message",{messageCount:e.length,phase:q?.phase});try{await(_?.interrupt?.())}catch(e){jn.warn("[fix] Failed to interrupt response for user message",{error:e instanceof Error?e.message:String(e)})}await Eo(),v?.finish(),v=new Io,H.clear(),_=Rt();const t=e.map(e=>`[Message from web UI user]: ${e}`).join("\n\n");v.pushText(`[SYSTEM] The user sent a message while you were working. Read their message below, incorporate their feedback, and continue your task. Do not restart from scratch unless the user explicitly asks.\n\n${t}`),B=!0,x=!0})().finally(()=>{L=void 0}),await L;else for(const t of e)v?.pushText(`[Message from web UI user]: ${t}`)};if(ot){const e=zr,t=`${e.replace(/\/$/,"")}/v1/messages`;jn.debug(`[fix] Pre-flight: POST ${t}`);const r=Date.now();try{const e=await fetch(t,{method:"POST",signal:AbortSignal.timeout(1e4),headers:{"x-api-key":ot,"anthropic-version":"2023-06-01","content-type":"application/json"},body:"{}"}),n=await e.text().catch(()=>""),o=Date.now()-r;jn.debug(`[fix] Pre-flight: ${e.status} in ${o}ms — ${n.slice(0,300)}`),401===e.status||403===e.status?jn.error(`[fix] Pre-flight: AI proxy key rejected (${e.status}) at ${t}`):jn.info("[fix] Pre-flight: AI proxy key valid",{status:e.status,durationMs:o})}catch(t){jn.error("[fix] Pre-flight: AI proxy unreachable",{error:t instanceof Error?t.message:String(t),durationMs:Date.now()-r,url:e})}}jn.info("[fix] Creating initial agent query"),jn.flush(),_=Rt(),jn.info("[fix] Agent query created, entering message loop"),"chat"!==e.mode&&v.pushText(Ne),le.current=async()=>{F="CANCELED",await te("CANCELED"),ee({phase:"complete",endedAt:Date.now(),isError:!1,isInterrupted:!0,currentTestDescription:null,workers:Z(!0)}),K?.close(),ie({phase:"complete",endedAt:Date.now(),isError:!1,isInterrupted:!0}),oe?.close(),k&&(clearTimeout(k),k=void 0),jn.flush(),xe();try{await(_?.interrupt?.())}catch{}v?.finish(),Te()};let Lt=0,Dt=null;const Ot=setInterval(()=>{const e=Date.now()-W;Dt?jn.info("[fix] Watchdog: message loop active",{messageCount:Lt,elapsed:e}):jn.info("[fix] Watchdog: waiting for first SDK message",{elapsed:e}),jn.flush()},15e3);Ot.unref();try{let t=!1;for(;;){if(!_){jn.info("[fix] No response object, exiting message loop");break}t=!1,jn.info("[fix] Entering for-await on SDK response");for await(const r of _){Lt++,Dt||(Dt=Date.now(),jn.info("[fix] First SDK message received",{waitDurationMs:Dt-W,messageType:r.type,messageSubtype:"subtype"in r?r.subtype:void 0}));const n="session_id"in r&&"string"==typeof r.session_id?r.session_id:void 0;if(n&&n!==E&&(E=n,jn.debug("Captured Claude session id",{sessionId:E})),"stream_event"===r.type){const{event:e}=r;(Lt<=5||Lt%200==0)&&jn.debug("[fix] Stream event",{msgNum:Lt,eventType:e?.type});const t=e&&"object"==typeof e&&"parent_tool_use_id"in e&&"string"==typeof e.parent_tool_use_id?e.parent_tool_use_id:void 0;if("content_block_delta"===e?.type){const{delta:r}=e;if("text_delta"===r?.type&&r.text){if(y&&A&&!t)continue;P&&(P=!1,Se({label:void 0})),t&&H.has(t)?ue({toolUseId:t,kind:"text",content:r.text}):_e({text:r.text})}}"message_stop"===e?.type&&v&&(O=!1,v.allowNextTurn());continue}if("assistant"===r.type){const t="parent_tool_use_id"in r&&"string"==typeof r.parent_tool_use_id?r.parent_tool_use_id:void 0,{content:n}=r.message??{};if(Array.isArray(n)&&!t){const t=n.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("");t&&(jn.debug("Assistant message",{text:t}),"fix"===e.mode&&(X(Zi,{type:"ai_message",summary:t.slice(0,200)}),Q({type:"ai_message",summary:t.slice(0,200)})),re&&ae({type:"ai_message",summary:t.slice(0,200)}))}if(H.size>0){const e=Array.isArray(n)?n.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):[];jn.debug("Assistant message with active subagents",{hasParentToolUseId:!!t,parentToolUseId:t,activeSubagentIds:Array.from(H.keys()),toolNames:e,fullMessageKeys:Object.keys(r),rawMessage:JSON.stringify(r).slice(0,500)})}if(Array.isArray(n))for(const r of n){if("tool_use"===r?.type){if("mcp__auto-heal-report__generate-report"===r.name&&(O=!0),"mcp__session-control__restart_mcp_servers"===r.name||"mcp__stably-agent-control__restart_mcp_servers"===r.name){pe({rawName:r.name,toolInput:r.input});continue}if(r.name.startsWith("mcp__session-control__")||r.name.startsWith("mcp__stably-agent-control__"))continue;if(ea(r.name))continue;if(H.size>0&&jn.debug("Tool use detected with active subagents",{toolName:r.name,hasParentToolUseId:!!t,parentToolUseId:t,wouldRouteToSubagent:!!t&&H.has(t),activeSubagentIds:Array.from(H.keys())}),"Task"===r.name){const t=r.input,n=t&&"object"==typeof t?t:void 0,o=n&&"subagent_type"in n&&"string"==typeof n.subagent_type?n.subagent_type:"subagent",s=n&&"description"in n&&"string"==typeof n.description?n.description.trim():"";if(jn.info("[fix] Subagent started",{subagentType:o,description:s,toolUseId:r.id,activeSubagentCount:H.size+1}),H.set(r.id,{subagentType:o,description:s}),de({toolUseId:r.id,subagentType:o,description:s}),"fix"===e.mode){if("triage"===o){Re?.({phase:"triage"});const e={id:r.id,testDescription:"Triage",workerType:"triage",status:"running",summary:null,startedAt:Date.now(),endedAt:null,activity:[]};ee({phase:"triage",workers:[...q?.workers??[],e]})}else if("fix-worker"===o){J.add(s||r.id);const e={id:r.id,testDescription:s||r.id,workerType:"fix-worker",status:"running",summary:null,startedAt:Date.now(),endedAt:null,activity:[]};Re?.({phase:"fixing",totalTests:J.size,currentTestDescription:s||null}),ee({phase:"fixing",totalTests:J.size,currentTestDescription:s||null,lastTestDescription:s||q?.lastTestDescription||null,workers:[...q?.workers??[],e]})}else"validation"===o?(Re?.({phase:"validation",currentTestDescription:null}),ee({phase:"validation",currentTestDescription:null})):"context"===o&&ee({currentTestDescription:s||null});Q({type:"tool_call",summary:`[${o}] ${s}`.trim()})}continue}if(t&&H.has(t)){const n=Go(r.name),o=Ho(r.name,r.input),s=o?`${n} (${o})`:n;if(jn.debug("Subagent tool called",{tool:r.name,parentToolUseId:t}),ue({toolUseId:t,kind:"tool",content:s}),"fix"===e.mode){Q({type:"tool_call",summary:s});const e=H.get(t);"fix-worker"!==e?.subagentType&&"triage"!==e?.subagentType||X(t,{type:"tool_call",summary:s})}continue}if(t&&jn.debug("Tool with parent_tool_use_id but no matching subagent",{tool:r.name,parentToolUseId:t,activeSubagentIds:Array.from(H.keys())}),jn.debug("Tool called",{tool:r.name,input:r.input}),pe({rawName:r.name,toolInput:r.input}),"fix"===e.mode){const e=Go(r.name),t=Ho(r.name,r.input),n=t?`${e} (${t})`:e;X(Zi,{type:"tool_call",summary:n}),Q({type:"tool_call",summary:n})}if(re){const e=Go(r.name),t=Ho(r.name,r.input),n=t?`${e} (${t})`:e;"initializing"===se?.phase?ie({phase:"generating",currentActivity:n}):"mcp__playwright-test__test_run"===r.name&&"generating"===se?.phase?ie({phase:"testing",currentActivity:n}):ie({currentActivity:n}),ae({type:"tool_call",summary:n})}}if("text"===r?.type&&t&&H.has(t)){const n="string"==typeof r.text?r.text:"";if(n&&(ue({toolUseId:t,kind:"text",content:n}),"fix"===e.mode)){const e=H.get(t);"fix-worker"!==e?.subagentType&&"triage"!==e?.subagentType||X(t,{type:"ai_message",summary:n.slice(0,200)})}}}continue}if("user"===r.type){const t="message"in r&&r.message&&"object"==typeof r.message&&"content"in r.message?r.message.content:void 0;if(Array.isArray(t))for(const r of t)if(r&&"object"==typeof r&&"type"in r&&"tool_result"===r.type&&"tool_use_id"in r){const t="string"==typeof r.tool_use_id?r.tool_use_id:void 0,n="is_error"in r&&!0===r.is_error,o="content"in r&&"string"==typeof r.content?r.content:void 0;if(jn.debug("Tool result",{toolUseId:t,isError:n,output:o?.slice(0,500)}),t&&H.has(t)){const r=H.get(t);if(jn.info("[fix] Subagent completed",{toolUseId:t,isError:n,subagentType:r?.subagentType,description:r?.description,activeSubagentCount:H.size-1}),Ce({toolUseId:t,status:n?"error":"complete"}),"fix"===e.mode&&"triage"===r?.subagentType){const e=n?"failed":"succeeded",r=o?o.slice(0,500):null,s=(q?.workers??[]).map(n=>n.id===t?{...n,status:e,summary:r,endedAt:Date.now()}:n);ee({workers:s})}if("fix"===e.mode&&"fix-worker"===r?.subagentType){const e=n?"failed":"succeeded",r=o?o.slice(0,500):null,s=(q?.workers??[]).map(n=>n.id===t?{...n,status:e,summary:r,endedAt:Date.now()}:n);n?(Re?.({failedTests:(q?.failedTests??0)+1,currentTestDescription:null}),ee({failedTests:(q?.failedTests??0)+1,currentTestDescription:null,workers:s})):(Re?.({fixedTests:(q?.fixedTests??0)+1,currentTestDescription:null}),ee({fixedTests:(q?.fixedTests??0)+1,currentTestDescription:null,workers:s}))}H.delete(t)}}continue}if("result"===r.type){if(jn.info("[fix] Agent result received",{subtype:r.subtype,messageCount:Lt,elapsed:Date.now()-W,activeSubagents:H.size,fixedTests:q?.fixedTests,failedTests:q?.failedTests,phase:q?.phase}),m){if("success"===r.subtype){k&&(clearTimeout(k),k=void 0);for(const e of D)v?.pushText(`[Message from web UI user]: ${e}`);if(D=[],(re||"fix"===e.mode)&&v){if(v.hasQueuedMessages()){jn.info("[ws] Queued web UI messages found, continuing agent"),x=!0,v.allowNextTurn();continue}if(await ta(v,3e3)){jn.info("[ws] Web UI message received during grace period, continuing agent"),x=!0,v.allowNextTurn();continue}v.finish()}if(Re?.({phase:"complete",currentTestDescription:null,endedAt:Date.now()}),ee({phase:"complete",currentTestDescription:null,endedAt:Date.now(),isError:!1,workers:Z(!1)}),ie({phase:"complete",endedAt:Date.now(),isError:!1,currentActivity:null}),vt&&Le.length>0){G.green("Created files:");for(const e of Le)G.green(`- ${e}`)}const t=(e,t)=>`]8;;${e}${t}]8;;`,r=ke?G.cyan(`📊 View Autoheal Report:\n ${t(ke,G.cyan(G.bold(G.underline(ke))))}`):void 0;Ue({status:"success",result:r}),F="COMPLETED"}else L||B?jn.info("[fix] Suppressing error status: user-message interrupt in progress"):S?(F="CANCELED",ee({phase:"complete",endedAt:Date.now(),isError:!1,isInterrupted:!0,currentTestDescription:null,workers:Z(!0)}),ie({phase:"complete",endedAt:Date.now(),isError:!1,isInterrupted:!0})):(Re?.({endedAt:Date.now(),isError:!0}),ee({phase:"complete",endedAt:Date.now(),isError:!0,currentTestDescription:null,workers:Z(!0)}),ie({phase:"complete",endedAt:Date.now(),isError:!0,currentActivity:null}),Ue({error:"Run failed.",status:"error"}),process.exitCode=1,F="FAILED");S=!1;break}const n=y&&A;if("success"!==r.subtype?S||(Ue({error:"Run failed.",status:"error"}),process.exitCode=1):Ue(n?{status:"running"}:{status:"success"}),x=!1,S=!1,n){A=!1,jn.info("Processing deferred MCP restart request in chat mode"),await Ut(),t=!0;break}P=!1,Se({label:void 0}),v?.allowNextTurn(),y&&R>0&&(R-=1,x=!0,Ue({status:"running"}));continue}}if(L&&await L,B&&(B=!1,t=!0,Ue({status:"running"}),jn.info("[fix] Resuming after user-message interrupt")),!t)break}}catch(e){S?(F="CANCELED",ee({phase:"complete",endedAt:Date.now(),isError:!1,isInterrupted:!0,currentTestDescription:null,workers:Z(!0)}),ie({phase:"complete",endedAt:Date.now(),isError:!1,isInterrupted:!0})):(jn.error("[fix] Agent encountered an error",{error:e instanceof Error?e.message:String(e),stack:e instanceof Error?e.stack:void 0,elapsed:Date.now()-W}),Ue({error:`Agent encountered an error: ${e}`,status:"error"}),process.exitCode=1,F="FAILED",ee({phase:"complete",endedAt:Date.now(),isError:!0,currentTestDescription:null,workers:Z(!0)}),ie({phase:"complete",endedAt:Date.now(),isError:!0,currentActivity:null}),jn.flush(),jn.printLogFileInfo())}finally{if(clearInterval(Ot),k&&(clearTimeout(k),k=void 0),jn.info("[fix] Agent session ending",{finalStatus:F,elapsed:Date.now()-W,totalMessages:Lt}),x=!1,S=!1,process.off("uncaughtException",i),v?.finish(),F){jn.info("[fix] Reporting final autoheal status",{status:F});const e=Date.now();await te(F),jn.info("[fix] Final autoheal status reported",{durationMs:Date.now()-e})}if(jn.info("[fix] Closing WebSocket progress reporter"),K?.close(),oe?.close(),lt&&ut){const t=Date.now();try{jn.info("[fix] Computing diff...");const r=await ut.computeDiff();if(r&&r.trim().length>0){jn.info("[fix] Uploading diff...",{diffLength:r.length});const{diffBucketPath:n,uploadUrl:o}=await ro({authHeader:c,contentType:"text/plain",orgId:l,runId:e.runId});await no({contentType:"text/plain",diff:r,uploadUrl:o}),await oo({authHeader:c,diffBucketPath:n,orgId:l,runId:e.runId}),jn.info("[fix] Diff uploaded",{durationMs:Date.now()-t})}else jn.info("[fix] No diff to upload (empty or no changes)")}catch(e){jn.warn("[fix] Failed to upload diff",{error:e instanceof Error?e.message:String(e),durationMs:Date.now()-t})}}jn.info("[fix] Cleaning up diff tracker"),await(ut?.cleanup()),jn.info("[fix] Running final cleanup"),await Te(),jn.info("[fix] Cleanup complete")}},na=ie.object({runId:ie.string(),timestamp:ie.number()}),oa=[{args:["--trace=on"],description:"Run Playwright tests",name:"test"},{args:[],description:"Install browser dependencies",name:"install"}],sa=["You have two different versions of @playwright/test"];function ia(e){const[t,...r]=Ci(e),n=[t,...r.slice(0,-1)].join(" ");return(t,r)=>{let o=t.toString();for(const e of oa)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)}}async function aa({overrideArgs:e,subcommand:t}){jn.info("[test] forwardToPlaywright starting",{subcommand:t,overrideArgs:e});const r=process.argv,a=r.findIndex((e,r)=>r>1&&e===t),c=-1===a?[]:r.slice(a+1),l="--"===c[0],u=l?c.slice(1):c;if(!l&&("--help"===u[0]||"-h"===u[0]))return async function({subcommand:e}){const t=oa.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 n=xi();if(!n.installed||!n.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:o}=n;if(!o)return void r("Could not determine package manager.");r("Playwright options:"),r("");const[s,...i]=Ci(o),a=ia(o);return new Promise(t=>{const r=p(s,[...i,e,"--help"],{stdio:["inherit","pipe","pipe"],env:{...process.env,...process.env.CI?{}:{FORCE_COLOR:"1"}}});r.stdout?.on("data",e=>{a(e,process.stdout)}),r.stderr?.on("data",e=>{a(e,process.stderr)}),r.on("close",()=>{t()})})}({subcommand:t});const f=e??[],h=new Set(f.map(e=>{const[t]=e.split("=");return t})),m=[];for(let e=0;e<u.length;e++){const t=u[e],[r]=t.split("=");h.has(r)?!t.includes("=")&&e+1<u.length&&!u[e+1].startsWith("-")&&e++:m.push(t)}const y=[t,...f,...m];jn.info("[test] Forwarded args computed",{forwardedArgs:y}),jn.info("[test] Resolving Stably test environment");const E=Date.now(),I="test"===t?await qn():void 0;jn.info("[test] Stably test environment resolved",{durationMs:Date.now()-E,hasCredentials:null!=I,hasWsUrl:!!I?.STABLY_WS_URL}),jn.info("[test] Loading remote environment variables");const T=await Jn();jn.info("[test] Remote environment loaded",{hasRemoteEnv:!!T,variableCount:T?Object.keys(T.variables).length:0});const S={...T?.variables,...T?.sensitiveValues.length?{STABLY_SENSITIVE_VALUES:Buffer.from(JSON.stringify(T.sensitiveValues)).toString("base64")}:{}};jn.info("[test] Setting up Stably reporter injection");const A="test"===t?function({forwardedArgs:e,hasCredentials:t}){if(!t)return console.warn("[33m⚠️ Stably credentials not found. Test results will not be reported to Stably.[0m"),console.warn("[33m To enable reporting, either:[0m"),console.warn("[33m • Run `npx stably login` to authenticate[0m"),void console.warn("[33m • Or set STABLY_API_KEY and STABLY_PROJECT_ID environment variables[0m\n");const r=process.cwd(),a=e=>{const t=function(e){let t=n(e);for(;;){if([s(t,"node_modules","@stablyai","playwright-test"),s(t,"node_modules",".pnpm","@stablyai+playwright-test")].some(e=>g(e)))return!0;const e=o(t);if(e===t)return!1;t=e}}(e);return t||(console.warn("[33m⚠️ @stablyai/playwright-test is not installed. Stably reporter will not be injected.[0m"),console.warn("[33m Install it with: npm install @stablyai/playwright-test[0m"),console.warn("[33m Reference: ]8;;https://docs.stably.ai/getting-started/sdk-setup-guidehttps://docs.stably.ai/getting-started/sdk-setup-guide]8;;[0m\n")),t},c=(e,t)=>{try{return function({baseConfigPath:e,projectDir:t}){const r=function(e){try{const t=d("npm pkg get type",{cwd:e,encoding:"utf-8",stdio:["pipe","pipe","pipe"]});return"module"===JSON.parse(t.trim())}catch{return!1}}(t),a=r?"mts":"ts",c=o(n(e)),l=i(e),u=s(c,`.stably-playwright-wrapper.config.${a}`),p=`\n// Auto-generated wrapper config by Stably CLI\n// This file injects the Stably reporter and ensures trace is enabled\nimport baseConfig from './${l}';\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 getStablyReporterOptions = (reporters: unknown[]): Record<string, unknown> | undefined => {\n for (const reporter of reporters) {\n if (Array.isArray(reporter) && typeof reporter[0] === 'string' && reporter[0].includes('@stablyai')) {\n return (reporter[1] as Record<string, unknown>) ?? {};\n }\n }\n return undefined;\n};\n\nconst filterOutStablyReporter = (reporters: unknown[]): unknown[] => {\n return reporters.filter((reporter) => !isStablyReporter(reporter));\n};\n\n// Decode sensitive values from env var (set by CLI --env flag)\nconst decodeSensitiveValues = (): string[] | undefined => {\n const encoded = process.env.STABLY_SENSITIVE_VALUES;\n if (!encoded) return undefined;\n try {\n const decoded: unknown = JSON.parse(Buffer.from(encoded, 'base64').toString('utf-8'));\n return Array.isArray(decoded) ? decoded.filter((v): v is string => typeof v === 'string') : undefined;\n } catch {\n return undefined;\n }\n};\n\nconst buildReporterList = () => {\n const existingReporters = baseConfig.reporter;\n const sensitiveValues = decodeSensitiveValues();\n\n // Resolve errorSummary: env var STABLY_ERROR_SUMMARY=0 disables it\n const resolveErrorSummary = (existingValue?: unknown): boolean | undefined => {\n if (process.env.STABLY_ERROR_SUMMARY === '0') return false;\n if (typeof existingValue === 'boolean') return existingValue;\n return undefined; // let the reporter default (true)\n };\n\n // No existing reporters - create fresh stably reporter\n if (!existingReporters) {\n return [stablyReporter({\n apiKey: process.env.STABLY_API_KEY,\n projectId: process.env.STABLY_PROJECT_ID,\n notificationConfigs: extractNotificationConfigs(),\n errorSummary: resolveErrorSummary(),\n ...(sensitiveValues && { sensitiveValues }),\n })];\n }\n\n // Normalize to array\n const reportersArray: unknown[] = Array.isArray(existingReporters)\n ? existingReporters\n : [[existingReporters, {}]];\n\n // If user has a stably reporter, take their options but override credentials\n const existingOptions = getStablyReporterOptions(reportersArray);\n const stablyReporterEntry = stablyReporter({\n ...existingOptions,\n apiKey: process.env.STABLY_API_KEY,\n projectId: process.env.STABLY_PROJECT_ID,\n notificationConfigs: extractNotificationConfigs(),\n errorSummary: resolveErrorSummary(existingOptions?.errorSummary),\n ...(sensitiveValues && { sensitiveValues }),\n });\n\n // Keep all non-stably reporters, add our (merged or fresh) stably reporter\n const otherReporters = filterOutStablyReporter(reportersArray);\n return [...otherReporters, stablyReporterEntry];\n};\n\nexport default defineConfig({\n ...baseConfig,\n use: {\n ...baseConfig.use,\n trace: 'on',\n },\n reporter: buildReporterList(),\n});\n`.trim();return g(c)||b(c,{recursive:!0}),w(u,p,"utf-8"),function(e){const t=s(e,".gitignore");try{if(g(t)){const e=v(t,"utf-8");if(e.split("\n").map(e=>e.trim()).includes(Po))return;const r=e.length>0&&!e.endsWith("\n");_(t,`${r?"\n":""}${Po}\n`)}else w(t,`${Po}\n`)}catch{}}(c),u}({baseConfigPath:e,projectDir:t})}catch{return void console.warn("[33m⚠️ Could not create Stably wrapper config. Reporter injection skipped.[0m")}};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 s=n(r,e[t+1]),i=o(s);if(!a(i))return;const l=c(s,i);if(!l)return;return e[t+1]=l,l}const s=e.findIndex(e=>e.startsWith("--config=")||e.startsWith("-c="));if(-1!==s){const t=n(r,e[s].split("=")[1]),i=o(t);if(!a(i))return;const l=c(t,i);if(!l)return;const u=e[s].startsWith("--config=")?"--config=":"-c=";return e[s]=`${u}${l}`,l}}const l=ko(r);if(!l)return;const u=o(l);if(!a(u))return;const p=c(l,u);return p?(e.push("--config",p),p):void 0}({forwardedArgs:y,hasCredentials:null!=I}):void 0;jn.info("[test] Reporter injection setup complete",{hasWrapperConfig:!!A}),jn.info("[test] Spawning Playwright process"),await function(e,t={}){jn.info("[test] Detecting Playwright installation");const r=xi();jn.info("[test] Playwright installation check",{installed:r.installed,inNodeModules:r.inNodeModules,packageManager:r.packageManager,packageName:r.packageName}),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:n}=r;n||(console.error("Playwright installation not found. Could not determine your package manager (tried pnpm, yarn, and npm)."),process.exit(1));const[o,...s]=Ci(n),i=Kn(t.env),a=[o,...s,...e];jn.info("[test] Spawning Playwright process",{command:a.join(" "),pid:process.pid});const c=Date.now(),l=p(o,[...s,...e],{stdio:["inherit","pipe","pipe"],env:{...i,...process.env.CI?{}:{FORCE_COLOR:"1"}}});jn.info("[test] Playwright process spawned",{childPid:l.pid});const u=ia(n),d=function(){let e=!1,t="";return(r,n)=>{if(!e){t+=r,t.length>1024&&(t=t.slice(-1024));for(const r of sa)if(t.includes(r))return n.write("\n[stably] Hint: This is a Playwright error, not caused by @stablyai/playwright-test.\n Common causes: running from the wrong directory (especially in monorepos),\n or a dependency pulling in a conflicting @playwright/test version.\n"),void(e=!0)}}}();l.stdout?.on("data",e=>{u(e,process.stdout)}),l.stderr?.on("data",e=>{const t=e.toString();u(e,process.stderr),d(t,process.stderr)});const f=new AbortController,h=()=>!f.signal.aborted&&(f.abort(),t.onClose?.(),process.removeListener("SIGINT",g),process.removeListener("SIGTERM",g),!0),g=e=>{jn.info("[test] Signal received, killing Playwright process",{signal:e,childPid:l.pid}),h(),l.kill(e);const t="SIGINT"===e?130:143;process.exit(t)};return process.on("SIGINT",g),process.on("SIGTERM",g),new Promise((e,t)=>{l.on("error",e=>{h()&&(jn.error("[test] Playwright process error",{error:e.message,childPid:l.pid}),t(e))}),l.on("close",t=>{if(!h())return;jn.info("[test] Playwright process exited",{exitCode:t,durationMs:Date.now()-c});const r=[process.stdout,process.stderr].filter(e=>e.writableNeedDrain).map(e=>new Promise(t=>e.once("drain",t)));Promise.race([Promise.all(r),new Promise(e=>setTimeout(e,5e3))]).then(()=>{process.exitCode=t??0,e(t??0)})})})}(y,{env:{...S,...I},onClose:()=>{var e;jn.info("[test] Playwright process closed, cleaning up wrapper config"),(e=A)&&g(e)&&x(e)}})}function ca(e=""){process.stdout.write(`${e}\n`)}function la(...e){process.stderr.write(`${e.join(" ")}\n`)}var ua="stably",da=`https://registry.npmjs.org/${ua}/latest`,pa=ae.object({version:ae.string()});function fa(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 ha(e,t){const r=fa(e),n=fa(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 ga=r.join(C.homedir(),".stably"),ma=r.join(ga,"update-check.json"),ya=`https://registry.npmjs.org/${ua}/latest`,va="1"===process.env.STABLY_DISABLE_UPDATE_CHECK,ba=ae.object({lastCheck:ae.number(),latestVersion:ae.string()}),wa=!1,_a=!1,Ea=async()=>{if(_a)try{const{shutdown:e}=await import("@hyperdx/node-opentelemetry"),t=process.stderr.write.bind(process.stderr),r=process.stdout.write.bind(process.stdout),n=(e,...t)=>{const r=t[0];return!("string"!=typeof r||!r.includes("OpenTelemetry"))||!(!Buffer.isBuffer(r)||!r.toString().includes("OpenTelemetry"))||e(...t)};process.stderr.write=(...e)=>n(t,...e),process.stdout.write=(...e)=>n(r,...e);try{await e()}finally{process.stderr.write=t,process.stdout.write=r}}catch{}};!function(){if(va)return;const e=function(){try{const e=h.readFileSync(ma,"utf-8");return ba.parse(JSON.parse(e))}catch{return null}}(),t=Date.now();if((null==e||t-e.lastCheck>=18e5)&&function(){const e=`\n import { get } from 'node:https';\n import fs from 'node:fs';\n const url = '${ya}';\n const cacheFile = ${JSON.stringify(ma)};\n const cacheDir = ${JSON.stringify(ga)};\n\n const req = 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{p(process.execPath,["--input-type=module","-e",e],{detached:!0,stdio:"ignore",windowsHide:!0}).unref()}catch{}}(),null!=e&&ha(Hr,e.latestVersion)){if(wa)return;wa=!0;let t=!1;const r=()=>{if(t)return;t=!0;const r=`${G.yellow(`update available (${Hr} → ${e.latestVersion})`)} - run \`${ua} upgrade\` to get the latest version\n`;try{h.writeSync(2,r)}catch{}};process.once("beforeExit",r),process.once("exit",r)}}(),Te.cwdChanged&&jn.debug("Changed working directory",{cwd:Te.newCwd});for(const e of Te.envFilesLoaded)jn.debug("Loaded env file",{path:e});for(const e of Te.envFileErrors)jn.warn(e);var Ia=process.argv.findIndex(e=>"-v"===e||"--verbose"===e);-1!==Ia&&process.argv.splice(Ia,1);var Ta=process.argv.findIndex(e=>"--no-telemetry"===e);-1!==Ta&&process.argv.splice(Ta,1),jn.info("CLI starting",{version:Hr,args:process.argv.slice(2),cwd:process.cwd()}),process.on("unhandledRejection",(e,t)=>{jn.error("Unhandled promise rejection",{reason:e instanceof Error?{message:e.message,stack:e.stack}:e,promise:String(t)}),jn.flush(),jn.printLogFileInfo()}),process.on("uncaughtException",(e,t)=>{"EPIPE"!==e.code&&(jn.error("Uncaught exception",{error:{message:e.message,stack:e.stack,name:e.name},origin:t}),jn.flush(),jn.printLogFileInfo())});var xa=new a;xa.name("stably").description("AI-assisted Playwright testing CLI").version(Hr),xa.enablePositionalOptions(),xa.showHelpAfterError(),xa.exitOverride(),xa.configureHelp({subcommandTerm:e=>{const t=e.registeredArguments.map(e=>e.required?`<${e.name()}>`:`[${e.name()}]`).join(" ");return t?`${e.name()} ${t}`:e.name()}});var Sa=[];xa.configureOutput({writeOut:e=>process.stdout.write(e),writeErr:e=>{Sa.push(e)}});var Aa=()=>{const e=xa.helpInformation().trimEnd();return e?`${e}\n`:""},Ca=(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},Ra=()=>{process.stdout.write(Aa())};xa.command("help [command...]").description("Show help for a command (e.g. stably help create)").action(e=>{if(!e||0===e.length)return void Ra();const t=Ca(xa,e);if(!t)return process.stderr.write(`Unknown command: ${e.join(" ")}\n`),Ra(),void(process.exitCode=1);var r;r=t,process.stdout.write((e=>{const t=e.helpInformation().trimEnd();return t?`${t}\n`:""})(r))}),xa.action(()=>ra({mode:"chat",getHelpText:Aa})),xa.command("login").description("Authenticate with Stably in your browser").action(_n),xa.command("logout").description("Clear stored Stably credentials").action(async()=>{const e=Hn();e&&(Z.warn(`Environment variables ${G.cyan("STABLY_API_KEY")} and ${G.cyan("STABLY_PROJECT_ID")} are set.`),Z.warn("They will continue to be used for authentication even after logout."),Z.warn("Unset them if you want to fully de-authenticate this shell/session."));const t=await un();if(!t)return void ee(e?G.yellow("No stored OAuth login found to clear."):G.yellow("You are not logged in."));const r=te();r.start("Logging out..."),await(async e=>{try{await fetch(`${Vr}/api/backend/v1/logout`,{body:JSON.stringify({refresh_token:e}),headers:{"Content-Type":"application/json"},method:"POST"})}catch{}})(t.refreshToken),await pn(),await hn(),r.stop(G.green("✓ Logged out")),ee(G.green("You have been logged out successfully."))}),xa.command("whoami").description("Show auth status and current project").action(async()=>{Z.info(`${G.bold("CLI Version:")} ${G.cyan(Hr)}`);const e=Hn();if(e){Z.info(G.dim("Authentication: Environment variables")),Z.info(` ${G.bold("API Key:")} ${G.cyan(e.apiKey.slice(0,8))}...`),Z.info(` ${G.bold("Project ID:")} ${G.cyan(e.projectId)}`);const t=await un();if(t){let e;try{e=tn(t.accessToken).email}catch{e=void 0}Z.warn("Stored OAuth login detected but will be ignored (env auth takes precedence)."),e&&Z.info(` ${G.bold("OAuth Email:")} ${G.cyan(e)}`),Z.info(` ${G.bold("Tip:")} Unset env vars to use OAuth`)}return void ee(G.green("Authenticated via environment variables"))}const t=await un();if(!t)return void ee(G.yellow("Not logged in. Run `stably login` to authenticate."));let n;try{n=tn(t.accessToken).email}catch{n=void 0}const o=await fn();if(!o)return Z.info(G.dim("Authentication: OAuth (not linked to a project)")),n&&Z.info(` ${G.bold("Email:")} ${G.cyan(n)}`),void ee(G.yellow("Logged in but this directory is not linked to a project. Run `stably login` to link."));const s=await(async()=>rn(process.cwd(),sn))(),i=s?r.dirname(s):process.cwd(),a=r.relative(process.cwd(),i)||".";Z.info(G.dim("Authentication: OAuth")),n&&Z.info(` ${G.bold("Email:")} ${G.cyan(n)}`),Z.info(` ${G.bold("Organization:")} ${G.cyan(o.orgName)}`),Z.info(` ${G.bold("Project:")} ${G.cyan(o.projectName)}`),Z.info(` ${G.bold("Linked at:")} ${G.dim(a)}`),ee(G.green("Authenticated"))}),xa.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=>{re(`Starting development server for port ${e.port}...`);const t=await Yn(),r="oauth"===t.type?`${t.auth.context.orgName}-${t.auth.context.projectName}`.toLowerCase().replace(/[^a-z0-9-]/g,""):`project-${t.auth.projectId}`.toLowerCase(),n=te();n.start("Starting development server...");const o=await Ie(`http://localhost:${e.port}`,{subdomain:r});n.stop(`Your local environment is available at: ]8;;${o.url}${G.underline(G.cyan(o.url))}]8;;`)}),xa.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(async(e,t)=>{const r=e.length>0&&"test"===e[0]?e.slice(1):e;return ra({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(async(e,t)=>ra({mode:"single",prompt:e,outputDir:t.output})),xa.command("fix [runId]").description("Fix failing tests from a run (auto-detects from last test run or CI)").action(async e=>{(function(e){try{return d("git rev-parse --is-inside-work-tree",{cwd:e,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch{return!1}})(process.cwd())||(jn.error('Not a git repository. The "stably fix" command requires a git repository to track changes made during the fix. Please run this command from inside a git repository.'),process.stderr.write('Error: Not a git repository.\nThe "stably fix" command requires a git repository to track changes made during the fix.\nPlease run this command from inside a git repository.\n'),process.exit(1));const t=await(async e=>{const t=e=>e.replace(/\//g,"_");if(e)return jn.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(yr))if(yr[r].detect({env:e,cwd:t}))return{isCi:!0,...yr[r].configuration({env:e,cwd:t})};return{isCi:Boolean(e.CI),...(r={env:e,cwd:t},{commit:Ht(r),branch:Gt(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 jn.debug("Run ID detected from CI environment",{runId:r}),t(r);jn.debug("No explicit run ID or CI environment detected, checking last-run.json");const n=await(async()=>{try{const e=await rn(process.cwd(),".stably/last-run.json");if(!e)return;const t=await V(e,"utf-8");return{...na.parse(JSON.parse(t)),filePath:e}}catch{return}})();if(n){const e=(Date.now()-n.timestamp)/36e5;return jn.debug("Run ID found in last-run.json",{runId:n.runId,timestamp:n.timestamp,filePath:n.filePath,ageHours:Math.round(e)}),e>24&&jn.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)}jn.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)),ra({mode:"fix",runId:t})}),xa.command("init").description("Initialize Playwright and Stably SDK in your project").action(async()=>ra({mode:"init"})),xa.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;ca(G.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(da,{signal:e.signal});if(!t.ok)throw new Error(`Failed to fetch latest version: ${t.statusText}`);return pa.parse(await t.json()).version}finally{clearTimeout(t)}}();return{current:Hr,latest:e,isOutdated:ha(Hr,e)}}()}catch(e){return la(G.red("Failed to check for updates:"),e instanceof Error?e.message:e),void(process.exitCode=1)}if(ca(`Current version: ${G.yellow(r.current)}`),ca(`Latest version: ${G.green(r.latest)}`),ca(),!r.isOutdated)return void ca(G.green("✓ You are already on the latest version!"));if(ca(G.yellow(`⚠ A new version is available: ${r.current} → ${r.latest}`)),ca(),t)return ca(G.dim("Exiting with code 1 to indicate update available (useful for CI).")),void(process.exitCode=1);const n=function(){const e=process.argv[1]||"";if(e.includes("_npx")||e.includes(".npm/_cacache"))return"npx";try{const t=d("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=d("pnpm root -g",{encoding:"utf-8"}).trim();if(e.includes(t))return"global-pnpm"}catch{}try{const t=d("yarn global dir",{encoding:"utf-8"}).trim();if(e.includes(t))return"global-yarn-classic"}catch{}try{const t=d("yarn config get globalFolder",{encoding:"utf-8"}).trim();if(e.includes(t))return"global-yarn-berry"}catch{}return"unknown"}(),o=function(e){switch(e){case"global-npm":case"global-yarn-berry":case"unknown":return{command:"npm",args:["install","-g",`${ua}@latest`],description:`npm install -g ${ua}@latest`};case"global-pnpm":return{command:"pnpm",args:["add","-g",`${ua}@latest`],description:`pnpm add -g ${ua}@latest`};case"global-yarn-classic":return{command:"yarn",args:["global","add",`${ua}@latest`],description:`yarn global add ${ua}@latest`};case"npx":return{command:"npx",args:[`${ua}@latest`],description:`npx ${ua}@latest (always uses latest)`}}}(n);if("npx"===n)return ca(G.dim("You are running via npx, which always fetches the latest version.")),void ca(G.dim(`Simply run: ${G.white("npx stably")} to use the latest version.`));"unknown"===n?(ca(G.yellow("Could not detect installation method. Falling back to npm.")),ca()):"global-yarn-berry"===n&&(ca(G.yellow("Yarn Berry does not support global packages. Falling back to npm.")),ca()),ca(`Upgrade command: ${G.cyan(o.description)}`),ca(),ca(G.cyan("Upgrading...")),ca();try{await(s=o.command,i=o.args,new Promise((e,t)=>{const r=p(s,i,{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)})})),ca(),ca(G.green("✓ Upgrade complete!")),ca(G.dim(`Run ${G.white("stably --version")} to verify.`))}catch(e){la(G.red("Upgrade failed:"),e instanceof Error?e.message:e),ca(),ca(G.dim("You can try manually running:")),ca(G.cyan(` ${o.description}`)),process.exitCode=1}var s,i}(e)),xa.command("build",{hidden:!0}).description('(Deprecated) Use "stably create" instead').allowUnknownOption(!0).allowExcessArguments(!0).action(()=>{process.stderr.write('\n👋 "stably build" has moved! Use "stably create" instead:\n\n stably create "Read the .md files in /tests directory and then create playwright tests"\n\n'),process.exit(1)}),oa.forEach(({args:e,description:t,name:r})=>{xa.command(r).description(t).helpOption(!1).helpCommand(!1).allowUnknownOption(!0).allowExcessArguments(!0).passThroughOptions().action(()=>aa({overrideArgs:e,subcommand:r}))});var Pa=()=>{0!==Sa.length&&(process.stderr.write(Sa.join("")),Sa=[])};(async()=>{await(async()=>{if(!_a&&"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":Hr,"node.version":process.version,"os.platform":process.platform}}),_a=!0}catch{}})();try{await xa.parseAsync(process.argv),jn.info("CLI completed successfully")}catch(e){if(!(e=>!!e&&"object"==typeof e&&"code"in e)(e)){const t=e instanceof Error?e.message:String(e);return jn.error(t,{stack:e instanceof Error?e.stack:void 0}),Pa(),jn.flush(),jn.printLogFileInfo(),await Ea(),void(process.exitCode=1)}const t="number"==typeof e.exitCode?e.exitCode:1,r=process.argv.slice(2).find(e=>!e.startsWith("-")),n=!!r&&!!Ca(xa,[r]);if(("commander.excessArguments"===e.code||"commander.unknownCommand"===e.code)&&r&&!n)return Sa=[],jn.warn("Unknown command",{command:r}),process.stderr.write(`command '${r}' not found\n`),Ra(),void(process.exitCode=t);jn.debug("Commander error",{code:e.code,exitCode:t}),Pa(),process.exitCode=t}finally{jn.flush(),await Ea()}})();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "stably",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.8.0",
|
|
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.mjs",
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
"test": "vitest run",
|
|
31
31
|
"test:unit": "vitest run --exclude='**/*.integration.test.ts'",
|
|
32
32
|
"test:integration": "vitest run --config vitest.integration.config.ts",
|
|
33
|
+
"test:e2e": "bash scripts/e2e.sh",
|
|
33
34
|
"test:watch": "vitest",
|
|
34
35
|
"lint": "PATH=../../node_modules/.bin:$PATH oxlint . --type-aware --tsconfig ./tsconfig.json",
|
|
35
36
|
"lintf": "PATH=../../node_modules/.bin:$PATH oxlint . --fix --quiet --type-aware --tsconfig ./tsconfig.json",
|
|
@@ -102,6 +103,7 @@
|
|
|
102
103
|
"terser": "^5.44.1",
|
|
103
104
|
"tsup": "^8.5.0",
|
|
104
105
|
"tsx": "^4.20.5",
|
|
106
|
+
"execa": "^9.5.3",
|
|
105
107
|
"vitest": "^4.0.16"
|
|
106
108
|
}
|
|
107
109
|
}
|