stably 4.5.3 → 4.5.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/index.js +1 -1
  2. package/dist/stably-plugin/.claude-plugin/plugin.json +5 -0
  3. package/dist/stably-plugin/skills/playwright-best-practices/SKILL.md +235 -0
  4. package/dist/stably-plugin/skills/playwright-best-practices/references/accessibility.md +359 -0
  5. package/dist/stably-plugin/skills/playwright-best-practices/references/annotations.md +423 -0
  6. package/dist/stably-plugin/skills/playwright-best-practices/references/assertions-waiting.md +361 -0
  7. package/dist/stably-plugin/skills/playwright-best-practices/references/browser-apis.md +391 -0
  8. package/dist/stably-plugin/skills/playwright-best-practices/references/browser-extensions.md +506 -0
  9. package/dist/stably-plugin/skills/playwright-best-practices/references/canvas-webgl.md +493 -0
  10. package/dist/stably-plugin/skills/playwright-best-practices/references/ci-cd.md +407 -0
  11. package/dist/stably-plugin/skills/playwright-best-practices/references/clock-mocking.md +364 -0
  12. package/dist/stably-plugin/skills/playwright-best-practices/references/component-testing.md +500 -0
  13. package/dist/stably-plugin/skills/playwright-best-practices/references/console-errors.md +420 -0
  14. package/dist/stably-plugin/skills/playwright-best-practices/references/debugging.md +491 -0
  15. package/dist/stably-plugin/skills/playwright-best-practices/references/electron.md +509 -0
  16. package/dist/stably-plugin/skills/playwright-best-practices/references/error-testing.md +360 -0
  17. package/dist/stably-plugin/skills/playwright-best-practices/references/file-operations.md +375 -0
  18. package/dist/stably-plugin/skills/playwright-best-practices/references/fixtures-hooks.md +417 -0
  19. package/dist/stably-plugin/skills/playwright-best-practices/references/flaky-tests.md +494 -0
  20. package/dist/stably-plugin/skills/playwright-best-practices/references/global-setup.md +434 -0
  21. package/dist/stably-plugin/skills/playwright-best-practices/references/i18n.md +508 -0
  22. package/dist/stably-plugin/skills/playwright-best-practices/references/iframes.md +403 -0
  23. package/dist/stably-plugin/skills/playwright-best-practices/references/locators.md +242 -0
  24. package/dist/stably-plugin/skills/playwright-best-practices/references/mobile-testing.md +409 -0
  25. package/dist/stably-plugin/skills/playwright-best-practices/references/multi-context.md +288 -0
  26. package/dist/stably-plugin/skills/playwright-best-practices/references/multi-user.md +393 -0
  27. package/dist/stably-plugin/skills/playwright-best-practices/references/network-advanced.md +452 -0
  28. package/dist/stably-plugin/skills/playwright-best-practices/references/page-object-model.md +315 -0
  29. package/dist/stably-plugin/skills/playwright-best-practices/references/performance-testing.md +476 -0
  30. package/dist/stably-plugin/skills/playwright-best-practices/references/performance.md +453 -0
  31. package/dist/stably-plugin/skills/playwright-best-practices/references/projects-dependencies.md +456 -0
  32. package/dist/stably-plugin/skills/playwright-best-practices/references/security-testing.md +430 -0
  33. package/dist/stably-plugin/skills/playwright-best-practices/references/service-workers.md +504 -0
  34. package/dist/stably-plugin/skills/playwright-best-practices/references/test-coverage.md +495 -0
  35. package/dist/stably-plugin/skills/playwright-best-practices/references/test-data.md +492 -0
  36. package/dist/stably-plugin/skills/playwright-best-practices/references/test-organization.md +361 -0
  37. package/dist/stably-plugin/skills/playwright-best-practices/references/third-party.md +464 -0
  38. package/dist/stably-plugin/skills/playwright-best-practices/references/websockets.md +403 -0
  39. package/package.json +2 -1
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var e=require("dotenv"),t=require("path"),r=require("commander"),n=require("buffer"),o=require("child_process"),s=require("process"),i=require("fs"),a=require("url"),c=require("os");require("timers/promises");var l=require("stream"),u=require("util"),d=require("@anthropic-ai/claude-agent-sdk"),p=require("crypto"),f=require("picocolors"),h=require("simple-git"),g=require("fs/promises"),m=require("@clack/prompts"),y=require("readline/promises"),v=require("zod"),b=require("open"),w=require("http"),_=require("pino"),E=require("sonic-boom"),I=require("zod/v3"),T=require("ws"),x=require("react"),S=require("react/jsx-runtime"),A=require("module"),C=require("yaml"),R=require("@stablyhq/runner-sdk");function P(e){return e&&e.__esModule?e:{default:e}}var U,L,O=P(t),k=P(o),D=P(s),B=P(i),N=P(c),j=P(l),$=P(p),M=P(f),H=P(g),F=P(v),G=P(b),z=P(w),Y=P(_),W=P(E),V=P(T),q=Object.create,K=Object.defineProperty,J=Object.getOwnPropertyDescriptor,X=Object.getOwnPropertyNames,Q=Object.getPrototypeOf,Z=Object.prototype.hasOwnProperty,ee=(e=>"undefined"!=typeof require?require:"undefined"!=typeof Proxy?new Proxy(e,{get:(e,t)=>("undefined"!=typeof require?require:e)[t]}):e)(function(e){if("undefined"!=typeof require)return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')}),te=(U={"../playwright-trace-scrubber/node_modules/.pnpm/isbinaryfile@5.0.7/node_modules/isbinaryfile/lib/index.js"(e){Object.defineProperty(e,"__esModule",{value:!0}),e.isBinaryFileSync=e.isBinaryFile=void 0;var t=ee("fs"),r=ee("util"),n=(0,r.promisify)(t.stat),o=(0,r.promisify)(t.open),s=(0,r.promisify)(t.close),i=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){const t=new Array;for(let r=0;r<e;r++){if(this.error)return t;t[r]=this.nextByte()}return t}};function a(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 c(e){switch(7&a(e)){case 0:return a(e),!0;case 1:return e.next(8),!0;case 2:const t=a(e);return e.next(t),!0;case 5:return e.next(4),!0}return!1}function l(e,t){if(0===t)return!1;let r=0;const n=Math.min(t,515),o=Math.min(n,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(n>=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;for(let t=0;t<o;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<n){if(t++,e[t]>=128&&e[t]<=191)continue}else if(e[t]>=224&&e[t]<=239&&t+2<n){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<n&&(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(r++,t>=32&&100*r/o>10)return!0}}return 100*r/o>10||!!(r>1&&function(e,t){const r=new i(e,t);let n=0;for(;;){if(!c(r)&&!r.hasError())return!1;if(r.hasError())break;n++}return n>0}(e,o))}function u(e){return"string"==typeof e}function d(e){if(!e.isFile())throw new Error("Path provided was not a file!")}e.isBinaryFile=async function(e,r){if(u(e)){d(await n(e));const r=await o(e,"r"),i=Buffer.alloc(515);return new Promise((e,n)=>{t.read(r,i,0,515,0,(t,o,a)=>{if(s(r),t)n(t);else try{e(l(i,o))}catch(e){n(e)}})})}return void 0===r&&(r=e.length),l(e,r)},e.isBinaryFileSync=function(e,r){if(u(e)){d(t.statSync(e));const r=t.openSync(e,"r"),n=Buffer.alloc(515),o=t.readSync(r,n,0,515,0);return t.closeSync(r),l(n,o)}return void 0===r&&(r=e.length),l(e,r)}}},function(){return L||(0,U[X(U)[0]])((L={exports:{}}).exports,L),L.exports}),re={cwdChanged:!1,newCwd:void 0,envFilesLoaded:[],envFileErrors:[]},ne=process.argv.findIndex(e=>"-C"===e||"--cwd"===e);if(-1!==ne&&process.argv[ne+1]){const e=process.argv[ne+1];process.chdir(e),re.cwdChanged=!0,re.newCwd=e,process.argv.splice(ne,2)}for(var oe=[],se=0;se<process.argv.length;)if("--env-file"===process.argv[se]){const e=process.argv[se+1];e&&!e.startsWith("-")?(oe.push(e),process.argv.splice(se,2)):se++}else se++;for(const t of oe){const r=O.default.resolve(process.cwd(),t),n=e.config({path:r,override:!0,quiet:!0});if(n.error){const e=`warning: could not load env file: ${r} (${n.error.message})`;re.envFileErrors.push(e),process.stderr.write(`${e}\n`)}else re.envFilesLoaded.push(r)}var ie={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 ae(e){return(/\d+(?!.*\d+)/.exec(e)||[])[0]}function ce(e){return e?/^(?:refs\/heads\/)?(?<branch>.+)$/i.exec(e)[1]:void 0}var le={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:ce(r?e.SYSTEM_PULLREQUEST_TARGETBRANCH:e.BUILD_SOURCEBRANCH),pr:t,isPr:r,prBranch:ce(r?e.SYSTEM_PULLREQUEST_SOURCEBRANCH:void 0),root:e.BUILD_REPOSITORY_LOCALPATH}}},ue={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})},pe={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}}},fe={detect:({env:e})=>Boolean(e.BUDDY_WORKSPACE_ID),configuration({env:e}){const t=ae(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}}},he="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function ge(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var me,ye,ve,be,we,_e,Ee,Ie,Te={exports:{}};var xe,Se,Ae,Ce,Re,Pe,Ue,Le,Oe,ke,De,Be,Ne,je,$e,Me={exports:{}},He={};function Fe(){if(Be)return De;Be=1;const e=O.default,t=function(){if(Ae)return Se;Ae=1;const e=O.default,t=function(){if(Ie)return Ee;Ie=1;const e="win32"===process.platform||"cygwin"===process.env.OSTYPE||"msys"===process.env.OSTYPE,t=O.default,r=e?";":":",n=function(){if(_e)return we;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 _e=1,e="win32"===process.platform||he.TESTING_WINDOWS?function(){if(ye)return me;ye=1,me=r,r.sync=function(r,n){return t(e.statSync(r),r,n)};var e=B.default;function t(e,t,r){return!(!e.isSymbolicLink()&&!e.isFile())&&function(e,t){var r=void 0!==t.pathExt?t.pathExt:process.env.PATHEXT;if(!r)return!0;if(-1!==(r=r.split(";")).indexOf(""))return!0;for(var n=0;n<r.length;n++){var o=r[n].toLowerCase();if(o&&e.substr(-o.length).toLowerCase()===o)return!0}return!1}(t,r)}function r(r,n,o){e.stat(r,function(e,s){o(e,!e&&t(s,r,n))})}return me}():function(){if(be)return ve;be=1,ve=t,t.sync=function(t,n){return r(e.statSync(t),n)};var e=B.default;function t(t,n,o){e.stat(t,function(e,t){o(e,!e&&r(t,n))})}function r(e,t){return e.isFile()&&function(e,t){var r=e.mode,n=e.uid,o=e.gid,s=void 0!==t.uid?t.uid:process.getuid&&process.getuid(),i=void 0!==t.gid?t.gid:process.getgid&&process.getgid(),a=parseInt("100",8),c=parseInt("010",8);return r&parseInt("001",8)||r&c&&o===i||r&a&&n===s||r&(a|c)&&0===s}(e,t)}return ve}(),we=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}},we}(),o=e=>Object.assign(new Error(`not found: ${e}`),{code:"ENOENT"}),s=(t,n)=>{const o=n.colon||r,s=t.match(/\//)||e&&t.match(/\\/)?[""]:[...e?[process.cwd()]:[],...(n.path||process.env.PATH||"").split(o)],i=e?n.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",a=e?i.split(o):[""];return e&&-1!==t.indexOf(".")&&""!==a[0]&&a.unshift(""),{pathEnv:s,pathExt:a,pathExtExe:i}},i=(e,r,i)=>{"function"==typeof r&&(i=r,r={}),r||(r={});const{pathEnv:a,pathExt:c,pathExtExe:l}=s(e,r),u=[],d=n=>new Promise((s,i)=>{if(n===a.length)return r.all&&u.length?s(u):i(o(e));const c=a[n],l=/^".*"$/.test(c)?c.slice(1,-1):c,d=t.join(l,e),f=!l&&/^\.[\\\/]/.test(e)?e.slice(0,2)+d:d;s(p(f,n,0))}),p=(e,t,o)=>new Promise((s,i)=>{if(o===c.length)return s(d(t+1));const a=c[o];n(e+a,{pathExt:l},(n,i)=>{if(!n&&i){if(!r.all)return s(e+a);u.push(e+a)}return s(p(e,t,o+1))})});return i?d(0).then(e=>i(null,e),i):d(0)};return Ee=i,i.sync=(e,r)=>{r=r||{};const{pathEnv:i,pathExt:a,pathExtExe:c}=s(e,r),l=[];for(let o=0;o<i.length;o++){const s=i[o],u=/^".*"$/.test(s)?s.slice(1,-1):s,d=t.join(u,e),p=!u&&/^\.[\\\/]/.test(e)?e.slice(0,2)+d:d;for(let e=0;e<a.length;e++){const t=p+a[e];try{if(n.sync(t,{pathExt:c})){if(!r.all)return t;l.push(t)}}catch(e){}}}if(r.all&&l.length)return l;if(r.nothrow)return null;throw o(e)},Ee}(),r=function(){if(xe)return Me.exports;xe=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 Me.exports=e,Me.exports.default=e,Me.exports}();function n(n,o){const s=n.options.env||process.env,i=process.cwd(),a=null!=n.options.cwd,c=a&&void 0!==process.chdir&&!process.chdir.disabled;if(c)try{process.chdir(n.options.cwd)}catch(e){}let l;try{l=t.sync(n.command,{path:s[r({env:s})],pathExt:o?e.delimiter:void 0})}catch(e){}finally{c&&process.chdir(i)}return l&&(l=e.resolve(a?n.options.cwd:"",l)),l}return Se=function(e){return n(e)||n(e,!0)}}(),r=function(){if(Ce)return He;Ce=1;const e=/([()\][%!^"`<>&|;, *?])/g;return He.command=function(t){return t.replace(e,"^$1")},He.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},He}(),n=function(){if(ke)return Oe;ke=1;const e=B.default,t=function(){if(Le)return Ue;Le=1;const e=Pe?Re:(Pe=1,Re=/^#!(.*)/);return Ue=(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 Oe=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())},Oe}(),o="win32"===process.platform,s=/\.(?:com|exe)$/i,i=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;return De=function(a,c,l){c&&!Array.isArray(c)&&(l=c,c=null);const u={command:a,args:c=c?c.slice(0):[],options:l=Object.assign({},l),file:void 0,original:{command:a,args:c}};return l.shell?u:function(a){if(!o)return a;const c=function(e){e.file=t(e);const r=e.file&&n(e.file);return r?(e.args.unshift(e.file),e.command=r,t(e)):e.file}(a),l=!s.test(c);if(a.options.forceShell||l){const t=i.test(c);a.command=e.normalize(a.command),a.command=r.command(a.command),a.args=a.args.map(e=>r.argument(e,t));const n=[a.command].concat(a.args).join(" ");a.args=["/d","/s","/c",`"${n}"`],a.command=process.env.comspec||"cmd.exe",a.options.windowsVerbatimArguments=!0}return a}(u)}}var Ge=ge(function(){if($e)return Te.exports;$e=1;const e=k.default,t=Fe(),r=function(){if(je)return Ne;je=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 Ne={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},Ne}();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 Te.exports=n,Te.exports.spawn=n,Te.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},Te.exports._parse=t,Te.exports._enoent=r,Te.exports}());function ze(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 Ye=(e,t)=>({name:`SIGRT${t+1}`,number:We+t,action:"terminate",description:"Application-specific signal (realtime)",standard:"posix"}),We=34,Ve=[{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"}],qe=()=>{const e=(()=>{const e=64-We+1;return Array.from({length:e},Ye)})();return[...Ve,...e].map(Ke)},Ke=({name:e,number:t,description:r,action:n,forced:o=!1,standard:s})=>{const{signals:{[e]:i}}=c.constants,a=void 0!==i;return{name:e,number:a?i:t,description:r,supported:a,action:n,forced:o,standard:s}},Je=({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}],Xe=(()=>{const e=qe();return Object.fromEntries(e.map(Je))})();(()=>{const e=qe(),t=Array.from({length:65},(t,r)=>((e,t)=>{const r=((e,t)=>{const r=t.find(({name:t})=>c.constants.signals[t]===e);return void 0!==r?r:t.find(t=>t.number===e)})(e,t);if(void 0===r)return{};const{name:n,description:o,supported:s,action:i,forced:a,standard:l}=r;return{[e]:{name:n,number:e,description:o,supported:s,action:i,forced:a,standard:l}}})(r,e));Object.assign({},...t)})();var Qe=({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=D.default.cwd()}}})=>{s=null===s?void 0:s;const f=void 0===(o=null===o?void 0:o)?void 0:Xe[o].description,h=(({timedOut:e,timeout:t,errorCode:r,signal:n,signalDescription:o,exitCode:s,isCanceled:i})=>e?`timed out after ${t} milliseconds`:void 0!==r?`failed with ${r}`:void 0!==n?`was killed with ${n} (${o})`:void 0!==s?`failed with exit code ${s}`:"failed")({timedOut:c,timeout:d,errorCode:n&&n.code,signal:o,signalDescription:f,exitCode:s,isCanceled:l}),g=`Command ${h}: ${i}`,m="[object Error]"===Object.prototype.toString.call(n),y=m?`${g}\n${n.message}`:g,v=[y,t,e].filter(Boolean).join("\n");return m?(n.originalMessage=n.message,n.message=v):n=new Error(v),n.shortMessage=y,n.command=i,n.escapedCommand=a,n.exitCode=s,n.signal=o,n.signalDescription=f,n.stdout=e,n.stderr=t,n.cwd=p,void 0!==r&&(n.all=r),"bufferedData"in n&&delete n.bufferedData,n.failed=!0,n.timedOut=Boolean(c),n.isCanceled=l,n.killed=u&&!c,n},Ze=["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 tt,rt,nt=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,ot=Symbol.for("signal-exit emitter"),st=globalThis,it=Object.defineProperty.bind(Object),at=class{emitted={afterExit:!1,exit:!1};listeners={afterExit:[],exit:[]};count=0;id=Math.random();constructor(){if(st[ot])return st[ot];it(st,ot,{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}},ct=class{},lt=globalThis.process;nt(lt)?new class extends ct{#e="win32"===lt.platform?"SIGINT":"SIGHUP";#t=new at;#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(!nt(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 nt(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&&nt(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)}}(lt):new class extends ct{onExit(){return()=>{}}load(){}unload(){}},new TextEncoder,function(){if(rt)return tt;rt=1;const{PassThrough:e}=j.default;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 ut=(async()=>{})().constructor.prototype;["then","catch","finally"].map(e=>[e,Reflect.getOwnPropertyDescriptor(ut,e)]);var dt=(e,t=[])=>Array.isArray(t)?[e,...t]:[e],pt=/^[\w.-]+$/,ft=u.debuglog("execa").enabled,ht=(e,t)=>String(e).padStart(t,"0"),gt=(e,t,r={})=>{const n=Ge._parse(e,t,r);return e=n.command,t=n.args,(r={maxBuffer:1e8,buffer:!0,stripFinalNewline:!0,extendEnv:!0,preferLocal:!1,localDir:(r=n.options).cwd||D.default.cwd(),execPath:D.default.execPath,encoding:"utf8",reject:!0,cleanup:!0,all:!1,windowsHide:!0,verbose:ft,...r}).env=(({env:e,extendEnv:t,preferLocal:r,localDir:n,execPath:o})=>{const s=t?{...D.default.env,...e}:e;return r?(({env:e=D.default.env,...t}={})=>{const r=ze({env:e={...e}});return t.path=e[r],e[r]=(({cwd:e=D.default.cwd(),path:t=D.default.env[ze()],preferLocal:r=!0,execPath:n=D.default.execPath,addExecPath:o=!0}={})=>{const s=e instanceof URL?a.fileURLToPath(e):e,i=O.default.resolve(s),c=[];return r&&((e,t)=>{let r;for(;r!==t;)e.push(O.default.join(t,"node_modules/.bin")),r=t,t=O.default.resolve(t,"..")})(c,i),o&&((e,t,r)=>{const n=t instanceof URL?a.fileURLToPath(t):t;e.push(O.default.resolve(r,n,".."))})(c,n,i),[...c,t].join(O.default.delimiter)})(t),e})({env:s,cwd:n,execPath:o}):s})(r),r.stdio=(e=>{if(!e)return;const{stdio:t}=e;if(void 0===t)return Ze.map(t=>e[t]);if((e=>Ze.some(t=>void 0!==e[t]))(e))throw new Error(`It's not possible to provide \`stdio\` in combination with one of ${Ze.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,Ze.length);return Array.from({length:r},(e,r)=>t[r])})(r),"win32"===D.default.platform&&"cmd"===O.default.basename(e,".exe")&&t.unshift("/q"),{file:e,args:t,options:r,parsed:n}},mt=(e,t,r)=>"string"==typeof t||n.Buffer.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 yt(e,t,r){const n=gt(e,t,r),o=((e,t)=>dt(e,t).join(" "))(e,t),s=((e,t)=>dt(e,t).map(e=>(e=>"string"!=typeof e||pt.test(e)?e:`"${e.replaceAll('"','\\"')}"`)(e)).join(" "))(e,t);((e,{verbose:t})=>{t&&D.default.stderr.write(`[${(()=>{const e=new Date;return`${ht(e.getHours(),2)}:${ht(e.getMinutes(),2)}:${ht(e.getSeconds(),2)}.${ht(e.getMilliseconds(),3)}`})()}] ${e}\n`)})(s,n.options);const a=(e=>{const t=(({input:e,inputFile:t})=>"string"!=typeof t?e:((e=>{if(void 0!==e)throw new TypeError("The `input` and `inputFile` options cannot be both set.")})(e),i.readFileSync(t)))(e);if(null!==(r=t)&&"object"==typeof r&&"function"==typeof r.pipe)throw new TypeError("The `input` option cannot be a stream in sync mode");var r;return t})(n.options);let c;try{c=k.default.spawnSync(n.file,n.args,{...n.options,input:a})}catch(e){throw Qe({error:e,stdout:"",stderr:"",all:"",command:o,escapedCommand:s,parsed:n,timedOut:!1,isCanceled:!1,killed:!1})}const l=mt(n.options,c.stdout,c.error),u=mt(n.options,c.stderr,c.error);if(c.error||0!==c.status||null!==c.signal){const e=Qe({stdout:l,stderr:u,error:c.error,signal:c.signal,exitCode:c.status,command:o,escapedCommand:s,parsed:n,timedOut:c.error&&"ETIMEDOUT"===c.error.code,isCanceled:!1,killed:null!==c.signal});if(!n.options.reject)return e;throw e}return{command:o,escapedCommand:s,exitCode:0,stdout:l,stderr:u,failed:!1,timedOut:!1,isCanceled:!1,killed:!1}}function vt(e){try{return yt("git",["rev-parse","HEAD"],e).stdout}catch{return}}function bt(e){try{const t=yt("git",["rev-parse","--abbrev-ref","HEAD"],e).stdout;if("HEAD"===t){const t=yt("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 wt=/^(?:.*)@(?:.*):(?:\d+\/)?(.*)\.git$/,_t=/^\/(.*)\.git$/;function Et(e){if(e){if(e.match(wt))return e.replace(wt,"$1");try{return new URL(e).pathname.replace(_t,"$1")}catch{return}}}var It,Tt={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:Et(e.BUILDKITE_REPO),pr:t,isPr:r,prBranch:r?e.BUILDKITE_BRANCH:void 0,root:e.BUILDKITE_BUILD_CHECKOUT_PATH}}},xt={detect:({env:e})=>Boolean(e.CIRCLECI),configuration({env:e}){const t=e.CIRCLE_PR_NUMBER||ae(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}`}}},St="https://cirrus-ci.com",At={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:`${St}/build/${e.CIRRUS_BUILD_ID}`,job:e.CIRRUS_TASK_ID,jobUrl:`${St}/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}}},Ct={detect:({env:e})=>Boolean(e.CODEBUILD_BUILD_ID),configuration:({env:e,cwd:t})=>({name:"AWS CodeBuild",service:"codebuild",commit:vt({env:e,cwd:t}),build:e.CODEBUILD_BUILD_ID,branch:bt({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})},Rt={detect:({env:e})=>Boolean(e.CF_BUILD_ID),configuration({env:e}){const t=e.CF_PULL_REQUEST_NUMBER,r=Boolean(t);return{name:"Codefresh",service:"codefresh",commit:e.CF_REVISION,build:e.CF_BUILD_ID,buildUrl:e.CF_BUILD_URL,branch:r?e.CF_PULL_REQUEST_TARGET:e.CF_BRANCH,pr:t,isPr:r,prBranch:r?e.CF_BRANCH:void 0,slug:`${e.CF_REPO_OWNER}/${e.CF_REPO_NAME}`,root:e.CF_VOLUME_PATH}}},Pt={detect:({env:e})=>Boolean(e.DRONE),configuration({env:e}){const t="pull_request"===e.DRONE_BUILD_EVENT;return{name:"Drone",service:"drone",commit:e.DRONE_COMMIT_SHA,tag:e.DRONE_TAG,build:e.DRONE_BUILD_NUMBER,buildUrl:e.DRONE_BUILD_LINK,branch:t?e.DRONE_TARGET_BRANCH:e.DRONE_BRANCH,job:e.DRONE_JOB_NUMBER,jobUrl:e.DRONE_BUILD_LINK,pr:e.DRONE_PULL_REQUEST,isPr:t,prBranch:t?e.DRONE_SOURCE_BRANCH:void 0,slug:`${e.DRONE_REPO_OWNER}/${e.DRONE_REPO_NAME}`,root:e.DRONE_WORKSPACE}}},Ut=({env:e})=>{try{const t=e.GITHUB_EVENT_PATH?JSON.parse(i.readFileSync(e.GITHUB_EVENT_PATH,"utf-8")):void 0;if(t&&t.pull_request)return{branch:t.pull_request.base?ce(t.pull_request.base.ref):void 0,pr:t.pull_request.number}}catch{}return{pr:void 0,branch:void 0}},Lt={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=ce("pull_request_target"===e.GITHUB_EVENT_NAME?`refs/pull/${(e=>{const t=e.GITHUB_EVENT_PATH?JSON.parse(i.readFileSync(e.GITHUB_EVENT_PATH,"utf-8")):void 0;return t&&t.pull_request?t.pull_request.number:void 0})(e)}/merge`:e.GITHUB_REF);return{name:"GitHub Actions",service:"github",commit:e.GITHUB_SHA,build:e.GITHUB_RUN_ID,buildUrl:`${e.GITHUB_SERVER_URL}/${e.GITHUB_REPOSITORY}/actions/runs/${e.GITHUB_RUN_ID}`,isPr:r,branch:n,prBranch:r?n:void 0,slug:e.GITHUB_REPOSITORY,root:e.GITHUB_WORKSPACE,...r?Ut({env:e}):void 0}}},Ot={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}}},kt={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||vt({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}}},Dt={detect:({env:e})=>"true"===e.NETLIFY,configuration({env:e}){const t="true"===e.PULL_REQUEST;return{name:"Netlify",service:"netlify",commit:e.COMMIT_REF,build:e.DEPLOY_ID,buildUrl:`https://app.netlify.com/sites/${e.SITE_NAME}/deploys/${e.DEPLOY_ID}`,branch:t?void 0:e.HEAD,pr:e.REVIEW_ID,isPr:t,prBranch:t?e.HEAD:void 0,slug:e.REPOSITORY_URL.match(/[^/:]+\/[^/]+?$/)[0],root:e.PWD}}},Bt={detect:({env:e})=>Boolean(e.DISTELLI_APPNAME),configuration:({env:e})=>({name:"Puppet",service:"puppet",build:e.DISTELLI_BUILDNUM,buildUrl:e.DISTELLI_RELEASE,commit:e.DISTELLI_RELREVISION,branch:e.DISTELLI_RELBRANCH,root:e.DISTELLI_INSTALLHOME})},Nt={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}}},jt={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}}},$t={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}}},Mt={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||vt({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}}},Ht={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}}},Ft={};function Gt(){if(It)return Ft;It=1,Object.defineProperty(Ft,"__esModule",{value:!0}),Ft.of=Ft.PropertiesFile=void 0;var e,t=(e=B.default)&&e.__esModule?e:{default:e};class r{constructor(...e){this.objs={},e.length&&this.of.apply(this,e)}makeKeys(e){if(e&&0!==e.indexOf("#")){let t=["=",":"].map(t=>e.indexOf(t)).filter(e=>e>-1),r=Math.min(...t),n=e.substring(0,r).trim(),o=e.substring(r+1).trim();if(this.objs.hasOwnProperty(n))if(Array.isArray(this.objs[n]))this.objs[n].push(o);else{let e=this.objs[n];this.objs[n]=[e,o]}else{const e=o.replace(/"/g,'\\"').replace(/\\:/g,":").replace(/\\=/g,"=");this.objs[n]=unescape(JSON.parse('"'+e+'"'))}}}addFile(e){let r=t.default.readFileSync(e,"utf-8").split(/\r?\n/),n=this;for(let e=0;e<r.length;e++){let t=r[e];for(;"\\"===t.substring(t.length-1);)t=t.slice(0,-1),t+=r[e+1].trim(),e++;n.makeKeys(t)}}of(...e){for(let t=0;t<e.length;t++)this.addFile(e[t])}get(e,t){if(this.objs.hasOwnProperty(e)){if(Array.isArray(this.objs[e])){let t=[];for(let r=0;r<this.objs[e].length;r++)t[r]=this.interpolate(this.objs[e][r]);return t}return void 0===this.objs[e]?"":this.interpolate(this.objs[e])}return t}getLast(e,t){if(this.objs.hasOwnProperty(e)){if(Array.isArray(this.objs[e])){var r=this.objs[e].length;return this.interpolate(this.objs[e][r-1])}return void 0===this.objs[e]?"":this.interpolate(this.objs[e])}return t}getFirst(e,t){return this.objs.hasOwnProperty(e)?Array.isArray(this.objs[e])?this.interpolate(this.objs[e][0]):void 0===this.objs[e]?"":this.interpolate(this.objs[e]):t}getInt(e,t){let r=this.getLast(e);return r?parseInt(r,10):t}getFloat(e,t){let r=this.getLast(e);return r?parseFloat(r):t}getBoolean(e,t){let r=this.getLast(e);return r?!/^(false|0)$/i.test(n=r)&&!!n:t||!1;var n}set(e,t){this.objs[e]=t}interpolate(e){let t=this;return e.replace(/\\\\/g,"\\").replace(/\$\{([A-Za-z0-9\.\-\_]*)\}/g,function(e){return t.getLast(e.substring(2,e.length-1))})}getKeys(){let e=[];for(let t in this.objs)e.push(t);return e}getMatchingKeys(e){let t=[];for(let r in this.objs)-1!==r.search(e)&&t.push(r);return t}reset(){this.objs={}}}return Ft.PropertiesFile=r,Ft.of=function(...e){let t=new r;return t.of.apply(t,e),t},Ft}var zt=ge(Gt()),Yt={root:"teamcity.build.workingDir",branch:"teamcity.build.branch"},Wt=e=>{try{return zt.of(e)}catch{return}},Vt=({env:e,cwd:t})=>{const r=e.TEAMCITY_BUILD_PROPERTIES_FILE?Wt(e.TEAMCITY_BUILD_PROPERTIES_FILE):void 0,n=r?r.get("teamcity.configuration.properties.file"):void 0,o=n?Wt(n):n;return Object.fromEntries(Object.keys(Yt).map(n=>[n,(r?r.get(Yt[n]):void 0)||(o?o.get(Yt[n]):void 0)||("branch"===n?bt({env:e,cwd:t}):void 0)]))},qt={appveyor:ie,azurePipelines:le,bamboo:ue,bitbucket:de,bitrise:pe,buddy:fe,buildkite:Tt,circleci:xt,cirrus:At,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:Ct,codefresh:Rt,codeship:{detect:({env:e})=>e.CI_NAME&&"codeship"===e.CI_NAME,configuration:({env:e})=>({name:"Codeship",service:"codeship",build:e.CI_BUILD_NUMBER,buildUrl:e.CI_BUILD_URL,commit:e.CI_COMMIT_ID,branch:e.CI_BRANCH,slug:e.CI_REPO_NAME})},drone:Pt,github:Lt,gitlab:Ot,jenkins:kt,netlify:Dt,puppet:Bt,sail:Nt,screwdriver:jt,scrutinizer:$t,semaphore:Mt,shippable:Ht,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,...Vt({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:ce(e.JB_SPACE_GIT_BRANCH),slug:t&&r?`${t.toLowerCase()}/${r}`:void 0}}}},Kt=class e{git;config;snapshotTreeHash;snapshotIndexPath;constructor(e){this.config=e,this.git=h.simpleGit({baseDir:e.workingDir,maxConcurrentProcesses:1})}static createLocal({workingDir:t}){return new e({mode:"local",workingDir:t})}static createCloud({workingDir:t,baseBranch:r}){return new e({mode:"cloud",workingDir:t,baseBranch:r})}async captureSnapshot(){if("local"!==this.config.mode)return;this.snapshotIndexPath=t.join(c.tmpdir(),`git-diff-tracker-${p.randomUUID()}.index`),await this.git.env("GIT_INDEX_FILE",this.snapshotIndexPath).add(["-A"]);const e=await this.git.env("GIT_INDEX_FILE",this.snapshotIndexPath).raw(["write-tree"]);this.snapshotTreeHash=e.trim()}async computeDiff(){return"local"===this.config.mode?this.computeLocalDiff():this.computeCloudDiff()}async computeLocalDiff(){if(!this.snapshotTreeHash)throw new Error("No snapshot captured. Call captureSnapshot() first.");const e=t.join(c.tmpdir(),`git-diff-tracker-${p.randomUUID()}.index`);try{await this.git.env("GIT_INDEX_FILE",e).add(["-A"]);const t=(await this.git.env("GIT_INDEX_FILE",e).raw(["write-tree"])).trim();return await this.git.raw(["diff-tree","-p","--no-color",this.snapshotTreeHash,t])}finally{await Jt(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 Jt(this.snapshotIndexPath),this.snapshotIndexPath=void 0),this.snapshotTreeHash=void 0}};async function Jt(e){try{await g.unlink(e)}catch{}}var Xt="x-stably-org-id",Qt={bodySerializer:e=>JSON.stringify(e,(e,t)=>"bigint"==typeof t?t.toString():t)},Zt=({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)}`},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])=>er({allowReserved:e,name:"deepObject"===n?`${r}[${t}]`:t,value:o})).join(i);return"label"===n||"matrix"===n?i+a:a},rr=/\{[^{}]+\}/g;function nr(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 or,sr=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},ir=({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=Zt({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=er({allowReserved:i.allowReserved,name:o,value:s});e&&n.push(e)}}return n.join("&")},ar=(e,t)=>!!t&&!!(e.headers.has(t)||e.query?.[t]||e.headers.get("Cookie")?.includes(`${t}=`)),cr=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(rr);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,Zt({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,`;${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:ir(e.querySerializer),url:e.url}),lr=(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},ur=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?ur(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},pr=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}},fr=ir({allowReserved:!1,array:{explode:!0,style:"form"},object:{explode:!0,style:"deepObject"}}),hr={"Content-Type":"application/json"},gr=(e={})=>({...Qt,headers:hr,parseAs:"auto",querySerializer:fr,...e}),mr=(e={})=>{let t=lr(gr(),e);const r=()=>({...t}),n={error:new pr,request:new pr,response:new pr},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(ar(t,r.name))continue;const e=await sr(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:cr(r)}},s=async e=>{const{opts:t,url:r}=await o(e),s={redirect:"follow",...t,body:nr(t)};let i=new Request(r,s);for(const e of n.request.fns)e&&(i=await e(i,t));const a=t.fetch;let c;try{c=await a(i)}catch(e){let r=e;for(const o of n.error.fns)o&&(r=await o(e,void 0,i,t));if(r=r||{},t.throwOnError)throw r;return"data"===t.responseStyle?void 0:{error:r,request:i,response:void 0}}for(const e of n.response.fns)e&&(c=await e(c,i,t));const l={request:i,response:c};if(c.ok){const e=("auto"===t.parseAs?(e=>{if(!e)return"stream";const t=e.split(";")[0]?.trim();return t?t.startsWith("application/json")||t.endsWith("+json")?"json":"multipart/form-data"===t?"formData":["application/","audio/","image/","video/"].some(e=>t.startsWith(e))?"blob":t.startsWith("text/")?"text":void 0:void 0})(c.headers.get("Content-Type")):t.parseAs)??"json";if(204===c.status||"0"===c.headers.get("Content-Length")){let r;switch(e){case"arrayBuffer":case"blob":case"text":r=await c[e]();break;case"formData":r=new FormData;break;case"stream":r=c.body;break;default:r={}}return"data"===t.responseStyle?r:{data:r,...l}}let r;switch(e){case"arrayBuffer":case"blob":case"formData":case"json":case"text":r=await c[e]();break;case"stream":return"data"===t.responseStyle?c.body:{data:c.body,...l}}return"json"===e&&(t.responseValidator&&await t.responseValidator(r),t.responseTransformer&&(r=await t.responseTransformer(r))),"data"===t.responseStyle?r:{data:r,...l}}const u=await c.text();let d;try{d=JSON.parse(u)}catch{}const p=d??u;let f=p;for(const e of n.error.fns)e&&(f=await e(p,c,i,t));if(f=f||{},t.throwOnError)throw f;return"data"===t.responseStyle?void 0:{error:f,...l}},i=e=>t=>s({...t,method:e}),a=e=>async t=>{const{opts:r,url:s}=await o(t);return(({onRequest:e,onSseError:t,onSseEvent:r,responseTransformer:n,responseValidator:o,sseDefaultRetryDelay:s,sseMaxRetryAttempts:i,sseMaxRetryDelay:a,sseSleepFn:c,url:l,...u})=>{let d;const p=c??(e=>new Promise(t=>setTimeout(t,e))),f=async function*(){let c=s??3e3,f=0;const h=u.signal??(new AbortController).signal;for(;!h.aborted;){f++;const s=u.headers instanceof Headers?u.headers:new Headers(u.headers);void 0!==d&&s.set("Last-Event-ID",d);try{const t={redirect:"follow",...u,body:u.serializedBody,headers:s,signal:h};let i=new Request(l,t);e&&(i=await e(l,t));const a=u.fetch??globalThis.fetch,p=await a(i);if(!p.ok)throw new Error(`SSE failed: ${p.status} ${p.statusText}`);if(!p.body)throw new Error("No body in SSE response");const f=p.body.pipeThrough(new TextDecoderStream).getReader();let 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)}}}();return{stream:f}})({...r,body:r.body,headers:r.headers,method:e,onRequest:async(e,t)=>{let o=new Request(e,t);for(const e of n.request.fns)e&&(o=await e(o,r));return o},url:s})};return{buildUrl:cr,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=lr(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")}},yr=mr(gr({baseUrl:"https://api.stably.ai"})),vr="4.5.3",br=process.env.STABLY_API_URL||"https://api.stably.ai",wr=e=>{const t=new URL(e);return t.protocol="http:"===t.protocol?"ws:":"wss:",t},_r=process.env.AUTH_URL||"https://auth.stably.ai",Er=process.env.AUTH_CLIENT_ID||"288007877071cce81f269428ea78653a",Ir=process.env.AI_PROXY_URL||"https://ai-proxy.stably.ai",Tr=process.env.STABLY_AUTOHEAL_WS_URL||new URL("/autoheal",wr(br)).toString(),xr=process.env.STABLY_CREATE_PROGRESS_WS_URL||new URL("/create-progress",wr(br)).toString(),Sr="http://localhost:9876/auth/callback",Ar=()=>or||(or=mr(gr({baseUrl:br,headers:{"X-STABLY-CLI-VERSION":vr,"X-STABLY-SOURCE":"cli"}}))),Cr=async(e,t)=>{const r=await(n={body:{accessToken:e,orgId:t},client:Ar()},(n.client??yr).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},Rr=v.z.object({org_id:v.z.string(),org_name:v.z.string()}),Pr=v.z.object({email:v.z.string(),org_id_to_org_member_info:v.z.record(v.z.string(),Rr).optional(),org_member_info:Rr.optional(),user_id:v.z.string()});v.z.object({email:v.z.string(),firstName:v.z.string().optional(),lastName:v.z.string().optional(),organizations:v.z.array(v.z.object({id:v.z.string(),name:v.z.string()})),userId:v.z.string()});var Ur=e=>{const t=e.split(".");if(3!==t.length)throw new Error("Invalid JWT format");const r=t[1].replace(/-/g,"+").replace(/_/g,"/"),n=Buffer.from(r,"base64").toString("utf-8");return JSON.parse(n)},Lr=e=>{try{const t=Pr.parse(Ur(e)),r=t.org_id_to_org_member_info?Object.entries(t.org_id_to_org_member_info).map(([e,t])=>({id:e,name:t.org_name})):t.org_member_info?[{id:t.org_member_info.org_id,name:t.org_member_info.org_name}]:[];return{email:t.email,organizations:r,userId:t.user_id}}catch(e){throw new Error(`Failed to decode token: ${e instanceof Error?e.message:"Unknown error"}`)}},Or=async(e,t)=>{let r=e;const{root:n}=O.default.parse(r);for(;r!==n;){const e=O.default.join(r,t);try{return await g.access(e),e}catch{r=O.default.dirname(r)}}},kr=O.default.join(N.default.homedir(),".stably"),Dr=O.default.join(kr,"auth.json"),Br=".stably",Nr="project.json",jr=F.default.object({accessToken:F.default.string(),expiresAt:F.default.number(),idToken:F.default.string().optional(),refreshToken:F.default.string()}),$r=F.default.object({orgId:F.default.string(),orgName:F.default.string(),projectId:F.default.string(),projectName:F.default.string()}),Mr=async()=>{try{const e=await g.readFile(Dr,"utf-8");return jr.parse(JSON.parse(e))}catch{return}},Hr=async e=>{await g.mkdir(kr,{recursive:!0}),await g.writeFile(Dr,JSON.stringify(e,null,2),{mode:384})},Fr=async()=>{try{await g.unlink(Dr)}catch{}},Gr=async()=>{try{const e=await Or(process.cwd(),Br);if(!e)return;const t=O.default.join(e,Nr),r=await g.readFile(t,"utf-8");return $r.parse(JSON.parse(r))}catch{return}},zr=async()=>{try{const e=await Or(process.cwd(),Br);e&&await g.unlink(O.default.join(e,Nr))}catch{}},Yr=e=>Date.now()>=e.expiresAt-3e5,Wr=async e=>{const t=new URLSearchParams({client_id:Er,grant_type:"refresh_token",refresh_token:e}),r=await fetch(`${_r}/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}},Vr=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`,qr=(e,t,r)=>{e.writeHead(t,{"Content-Type":"text/html"}),e.end(r)},Kr=(e,t)=>{const r=new URLSearchParams({client_id:Er,code_challenge:e,code_challenge_method:"S256",redirect_uri:Sr,response_type:"code",state:t});return`${_r}/propelauth/oauth/authorize?${r.toString()}`},Jr=async e=>{const t=m.spinner();let r;t.start("Loading user info...");try{r=Lr(e.accessToken),t.stop(M.default.green(`✓ Logged in as ${M.default.cyan(r.email)}`))}catch(e){t.stop(M.default.red("✗ Failed to load user info"));const r=e instanceof Error?e.message:"Unknown error";return m.log.error(r),{success:!1}}const n=await(async e=>{if(0===e.length)return void m.log.error("You don't belong to any organizations.");if(1===e.length)return m.log.info(`Using organization: ${M.default.cyan(e[0].name)}`),e[0];if(!process.stdin.isTTY)return m.log.info(`Auto-selecting organization: ${M.default.cyan(e[0].name)}`),e[0];const t=await m.select({message:"Select an organization",options:[...e].sort((e,t)=>e.name.localeCompare(t.name)).map(e=>({label:e.name,value:e.id}))});return m.isCancel(t)?void 0:e.find(e=>e.id===t)})(r.organizations);if(!n)return m.log.warn("Organization selection cancelled."),{success:!1};let o;t.start("Getting org credentials...");try{const r=await Cr(e.accessToken,n.id);o={accessToken:r.accessToken,expiresAt:Date.now()+1e3*r.expiresInSeconds,idToken:e.idToken,refreshToken:e.refreshToken},t.stop(M.default.green("✓ Credentials obtained"))}catch(e){t.stop(M.default.red("✗ Failed to get org credentials"));const r=e instanceof Error?e.message:"Unknown error";return m.log.error(r),{success:!1}}const s=await(async(e,t)=>{const r=m.spinner();let n;r.start("Loading projects...");try{n=await(async({accessToken:e,orgId:t})=>{const r=await(n={auth:e,client:Ar(),path:{orgId:t}},(n.client??yr).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(M.default.green("✓ Projects loaded"))}catch(e){r.stop(M.default.red("✗ Failed to load projects"));const t=e instanceof Error?e.message:"Unknown error";return void m.log.error(t)}if(0===n.length)return m.log.error("No projects found in this organization."),void m.log.info(`Create a project at ${M.default.underline(M.default.cyan("https://app.stably.ai"))}`);if(1===n.length)return m.log.info(`Using project: ${M.default.cyan(n[0].name)}`),n[0];if(!process.stdin.isTTY)return m.log.info(`Auto-selecting project: ${M.default.cyan(n[0].name)}`),n[0];const o=await m.select({message:"Select a project",options:n.map(e=>({label:e.name,value:e.id}))});return m.isCancel(o)?void 0:n.find(e=>e.id===o)})(o.accessToken,n.id);return s?(await(async e=>{const t=O.default.join(process.cwd(),Br),r=O.default.join(t,Nr);await g.mkdir(t,{recursive:!0}),await g.writeFile(r,JSON.stringify(e,null,2)),await(async e=>{const t=O.default.join(e,".gitignore"),r="# Stably CLI (only docs/ are tracked)\n.stably/*\n!.stably/docs/";try{const e=await g.readFile(t,"utf-8"),n=e.split("\n").map(e=>e.trim());if(n.includes(".stably/*")&&n.includes("!.stably/docs/"))return;const o=/^# Stably CLI\n\.stably\/?$/m,s=/^\.stably\/?$/m;if(o.test(e)){const n=e.replace(o,`\n${r}\n`);await g.writeFile(t,n)}else if(s.test(e)){const n=e.replace(s,`\n${r}\n`);await g.writeFile(t,n)}else await g.appendFile(t,`\n${r}\n`)}catch{await g.writeFile(t,`${r}\n`)}})(process.cwd())})({orgId:n.id,orgName:n.name,projectId:s.id,projectName:s.name}),m.log.info(M.default.dim("Linked this directory to your Stably project.")),{scopedTokens:o,success:!0}):(m.log.warn("Project selection cancelled."),{success:!1})},Xr=async()=>{if(vn())return m.log.warn(`Environment variables ${M.default.cyan("STABLY_API_KEY")} and ${M.default.cyan("STABLY_PROJECT_ID")} are set.`),m.log.warn("These will be used for authentication instead of OAuth login."),m.log.warn("To use OAuth login, unset these environment variables first."),void m.outro(M.default.yellow("Login skipped - using environment variable authentication."));const e=await Mr();if(e){if(!Yr(e)){if(await Gr())return void m.outro(M.default.yellow("You are already logged in. Run `stably logout` first to log out."));m.log.info("You are logged in but haven't selected a project yet.");const t=await Jr(e);return void(t.success?(await Hr(t.scopedTokens),m.outro(M.default.green("Setup complete! You can now use Stably CLI."))):m.outro(M.default.yellow("Setup incomplete. Run `stably login` to try again.")))}const t=m.spinner();t.start("Refreshing session...");try{const r=await Wr(e.refreshToken);t.stop(M.default.green("✓ Session refreshed"));const n=await Gr();if(n){t.start("Getting org credentials...");try{const e=await Cr(r.accessToken,n.orgId),o={accessToken:e.accessToken,expiresAt:Date.now()+1e3*e.expiresInSeconds,idToken:r.idToken,refreshToken:r.refreshToken};await Hr(o),t.stop(M.default.green("✓ Credentials obtained")),m.outro(M.default.green("Login successful"))}catch{await Hr(r),t.stop(M.default.yellow("Using full credentials")),m.outro(M.default.green("Login successful"))}}else{const e=await Jr(r);e.success?(await Hr(e.scopedTokens),m.outro(M.default.green("Setup complete! You can now use Stably CLI."))):m.outro(M.default.yellow("Setup incomplete. Run `stably login` to try again."))}return}catch{t.stop(M.default.yellow("Session expired, proceeding with fresh login...")),await Fr(),await zr()}}const{authorizeUrl:t,serverReady:r,waitForCallback:n}=(()=>{const{authorizeUrl:e,codeVerifier:t,state:r}=(()=>{const e=$.default.randomBytes(32).toString("base64url"),t=(r=e,$.default.createHash("sha256").update(r).digest("base64url"));var r;const n=$.default.randomBytes(16).toString("base64url");return{authorizeUrl:Kr(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(()=>{c.close(),n({error:"Login timed out",success:!1})},3e5),i=()=>{clearTimeout(s)},c=z.default.createServer((t,r)=>{const o=new a.URL(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"),l=o.searchParams.get("state"),u=o.searchParams.get("error");return u?(qr(r,400,Vr(u)),i(),c.close(),void n({error:u,success:!1})):s&&l?l!==e?(qr(r,400,Vr("Invalid state parameter (possible CSRF attack)")),i(),c.close(),void n({error:"State mismatch",success:!1})):(qr(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(),c.close(),void n({code:s,state:l,success:!0})):(qr(r,400,Vr("Missing code or state parameter")),i(),c.close(),void n({error:"Missing code or state parameter",success:!1}))});c.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)}),c.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:Er,code:e,code_verifier:t,grant_type:"authorization_code",redirect_uri:Sr}),n=await fetch(`${_r}/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,m.log.info("Opening browser for authentication..."),m.log.info(M.default.dim("If browser doesn't open, visit:")),m.log.info(`]8;;${t}${M.default.underline(M.default.cyan(t))}]8;;`);try{await G.default(t)}catch{m.log.warn("Could not open browser automatically. Please open the URL above manually.")}const o=m.spinner();let s;o.start("Waiting for authentication...");try{s=await n(),o.stop(M.default.green("✓ Authentication successful"))}catch(e){o.stop(M.default.red("✗ Authentication failed"));const t=e instanceof Error?e.message:"Unknown error";m.outro(M.default.red(`Login failed: ${t}`)),process.exit(1)}const i=await Jr(s);i.success?(await Hr(i.scopedTokens),m.outro(M.default.green("Setup complete! You can now use Stably CLI."))):(m.outro(M.default.yellow("Setup incomplete. Run `stably login` to try again.")),process.exit(1))},Qr={fatal:60,error:50,warn:40,info:30,debug:20,trace:10},Zr=new Set(["help","login","logout","whoami","tunnel","create","fix","init","upgrade","test","show-report","codegen"]),en=(new Date).toISOString().split("T")[0],tn=O.default.join(N.default.tmpdir(),"stably-logs",en);B.default.mkdirSync(tn,{recursive:!0});var rn,nn=process.argv.includes("--verbose")||process.argv.includes("-v"),on=process.env.STABLY_LOG_LEVEL?.toLowerCase(),sn=nn?"debug":void 0!==(rn=on)&&rn in Qr?on:"warn",an=Qr[sn],cn=null,ln=null,un=null,dn=[],pn=!1,fn=e=>{if(!pn){cn=(e=>{const t=(()=>{const e=new Date;return[e.getHours().toString().padStart(2,"0"),e.getMinutes().toString().padStart(2,"0"),e.getSeconds().toString().padStart(2,"0")].join("-")})(),r=((e,t=100)=>e.replace(/[/\\:*?"<>|]/g,"-").replace(/\s+/g,"-").replace(/[^a-zA-Z0-9\-_]/g,"").replace(/-+/g,"-").replace(/^-+|-+$/g,"").slice(0,t).toLowerCase()||"session")(e);return O.default.join(tn,`${t}-${r}.log`)})(e),(e=>{const t=["","=".repeat(60),"Stably CLI Debug Log",`Version: ${vr}`,`Generated: ${(new Date).toISOString()}`,`Node: ${process.version}`,`Platform: ${process.platform} ${N.default.release()}`,`CWD: ${process.cwd()}`,`Args: ${process.argv.slice(2).join(" ")}`,`Log Level (console): ${sn}`,"=".repeat(60),""].join("\n");e.write(t)})(ln=new W.default({dest:cn,minLength:4096,sync:!1,append:!0})),un=Y.default({level:"debug",timestamp:Y.default.stdTimeFunctions.isoTime,base:{version:vr}},ln);for(const{level:e,msg:t,context:r}of dn)r?un[e](r,t):un[e](t);dn=[],pn=!0,nn&&process.stderr.write(`${M.default.dim(`Debug log: ${cn}`)}\n\n`)}},hn=(()=>{const e=process.argv.slice(2).find(e=>!e.startsWith("-"));return e&&Zr.has(e)?e:null})();hn&&fn(hn);var gn=e=>(t,r)=>{if(un?r?un[e](r,t):un[e](t):dn.push({level:e,msg:t,context:r}),(e=>Qr[e]>=an)(e)){const r=((e,t)=>`${{fatal:M.default.bgRed(M.default.white(" FATAL ")),error:M.default.red("error"),warn:M.default.yellow("warn"),info:M.default.cyan("info"),debug:M.default.dim("debug"),trace:M.default.dim("trace")}[e]} ${t}`)(e,t);process.stderr.write(`${r}\n`)}},mn={fatal:gn("fatal"),error:gn("error"),warn:gn("warn"),info:gn("info"),debug:gn("debug"),trace:gn("trace"),initSession:e=>{pn||fn(e)},getLogFilePath:()=>cn,flush:()=>{if(ln)try{ln.flushSync()}catch{}},printLogFileInfo:()=>{cn&&(process.stderr.write(`\n${M.default.dim("Debug log written to:")}\n`),process.stderr.write(` ${M.default.cyan(cn)}\n`),process.stderr.write(`${M.default.dim("Share this file with support for assistance.")}\n`))},getPinoLogger:()=>un};setInterval(()=>{mn.flush()},3e4).unref(),process.on("beforeExit",()=>{mn.flush()});var yn=e=>{const t=()=>{mn.flush(),nn&&mn.printLogFileInfo(),process.removeListener(e,t),process.kill(process.pid,e)};return t};process.on("SIGINT",yn("SIGINT")),process.on("SIGTERM",yn("SIGTERM"));var vn=()=>{const e=process.env.STABLY_API_KEY?.trim(),t=process.env.STABLY_PROJECT_ID?.trim();if(e&&t)return mn.debug("Environment auth detected",{hasApiKey:!0,hasProjectId:!0}),{apiKey:e,projectId:t};mn.debug("Environment auth not set",{hasApiKey:!!e,hasProjectId:!!t})},bn=!1,wn=()=>{bn||(bn=!0,m.log.warn("Both environment variable auth and stored OAuth login were detected."),m.log.warn(`Honoring environment variables (${M.default.cyan("STABLY_API_KEY")} + ${M.default.cyan("STABLY_PROJECT_ID")}).`),m.log.warn("To use OAuth login instead, unset those environment variables."))},_n=async()=>{mn.debug("Checking for stored auth tokens");const e=await Mr();if(!e)return void mn.debug("No stored auth tokens found");const t=Yr(e);if(mn.debug("Auth tokens status",{expired:t}),!t){const t=await Gr(),r=(e=>{try{const t=Pr.parse(Ur(e));if(t.org_id_to_org_member_info)return"full";if(t.org_member_info)return"org"}catch{return"unknown"}return"unknown"})(e.accessToken);if(mn.debug("Token scope check",{scope:r,hasContext:!!t}),t&&"full"===r)try{mn.debug("Exchanging full token for org-scoped token",{orgId:t.orgId});const r=await Cr(e.accessToken,t.orgId),n={accessToken:r.accessToken,expiresAt:Date.now()+1e3*r.expiresInSeconds,idToken:e.idToken,refreshToken:e.refreshToken};return await Hr(n),mn.debug("Token exchange successful"),n}catch(t){return mn.debug("Token exchange failed, using existing token",{error:t instanceof Error?t.message:String(t)}),e}return e}try{mn.debug("Attempting token refresh");const t=await Wr(e.refreshToken);mn.debug("Token refresh successful");const r=await Gr();if(r)try{mn.debug("Exchanging refreshed token for org-scoped token");const e=await Cr(t.accessToken,r.orgId),n={accessToken:e.accessToken,expiresAt:Date.now()+1e3*e.expiresInSeconds,idToken:t.idToken,refreshToken:t.refreshToken};return await Hr(n),n}catch{return await Hr(t),t}return await Hr(t),t}catch(e){return void mn.warn("Token refresh failed",{error:e instanceof Error?e.message:String(e)})}},En=async(e={})=>{mn.debug("Requiring authentication",{autoLogin:e.autoLogin});const t=vn();if(t){mn.info("Using environment variable authentication");try{await Mr()&&wn()}catch{}return{auth:t,type:"env"}}let r=await _n(),n=r?await Gr():void 0;const o=process.stdin.isTTY&&process.stdout.isTTY;if(mn.debug("OAuth auth check",{hasTokens:!!r,hasContext:!!n,canPrompt:o}),(!r||!n)&&e.autoLogin&&o){mn.info("Prompting user to login"),r?m.log.info("You are logged in but need to select an organization and project."):m.log.info("You are not logged in."),m.log.info("Press Enter to log in."),process.stdout.write(`${M.default.dim("Alternatively, set environment variables for an org API key:")}\n${M.default.dim(" STABLY_API_KEY=... STABLY_PROJECT_ID=... stably")}\n`),process.stdout.write("\n");const e=y.createInterface({input:process.stdin,output:process.stdout});try{await e.question(M.default.dim("Press Enter to continue... "))}finally{e.close()}await Xr(),r=await _n(),n=r?await Gr():void 0}return r||(mn.warn("Authentication required but no tokens available"),m.outro(M.default.red("You are not logged in. Run `stably login` to authenticate.")),process.exit(1)),n||(mn.warn("Authentication succeeded but no project context selected"),m.outro(M.default.red("You haven't selected an organization and project. Run `stably login` to complete setup.")),process.exit(1)),mn.info("OAuth authentication successful",{orgId:n.orgId,projectId:n.projectId}),{auth:{accessToken:r.accessToken,context:n},type:"oauth"}},In=e=>"env"===e.type?e.auth.projectId:e.auth.context.projectId,Tn=e=>e?{...process.env,...e}:process.env,xn=async()=>{mn.info("[test] Resolving Stably test env");const e=(()=>{if(process.env.STABLY_WS_URL)return;if("https://api.stably.ai"===br)return;const e=br.startsWith("http://")?"ws://":"wss://";return`${br.replace(/^https?:\/\//,e).replace(/\/$/,"")}/reporter`})();mn.debug("[test] WebSocket URL resolved",{wsUrl:e??"(default)"});const t=vn();if(t)return mn.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}};mn.info("[test] No env var auth, attempting OAuth auth");const r=Date.now(),n=await(async()=>{const e=vn();if(e){try{await Mr()&&wn()}catch{}return{auth:e,type:"env"}}const t=await _n(),r=t?await Gr():void 0;if(t&&r)return{auth:{accessToken:t.accessToken,context:r},type:"oauth"}})();if(mn.info("[test] OAuth auth resolved",{durationMs:Date.now()-r,hasAuth:!!n,authType:n?.type}),!n||"env"===n.type)return void mn.info("[test] No usable auth found");const o=process.env.STABLY_PROJECT_ID?.trim(),s=o||In(n);if(!s)return void mn.warn("[test] No project ID available");mn.info("[test] Fetching JWT API key",{projectId:s});const i=Date.now(),a=await(async(e,t)=>{try{mn.debug("Requesting JWT API key",{projectId:t,apiUrl:br});const r=await(async({accessToken:e,projectId:t})=>{const r=await(n={auth:e,client:Ar(),path:{projectId:t}},(n.client??yr).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 mn.debug("JWT API key obtained",{keyPrefix:r.apiKey.substring(0,10)}),r.apiKey}catch(e){return void mn.warn("Failed to get JWT API key for test reporter",{error:e instanceof Error?e.message:String(e)})}})(n.auth.accessToken,s);mn.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 mn.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},Sn=e=>e?{[Xt]:e}:void 0,An=v.z.object({context:v.z.string().min(1),autohealReportUrl:v.z.string()}),Cn=I.z.object({bucket:I.z.string(),key:I.z.string()}),Rn=I.z.object({diffBucketPath:Cn,expiresInSeconds:I.z.number(),key:I.z.string(),uploadUrl:I.z.string()}),Pn=I.z.object({traceBucketPath:Cn,expiresInSeconds:I.z.number(),key:I.z.string(),uploadUrl:I.z.string(),sensitiveValues:I.z.array(I.z.string())}),Un=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=Tr,onUserMessage:o}){this.authHeader=e,this.orgId=t,this.runId=r,this.url=n,this.onUserMessage=o,mn.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)}`;mn.info("[ws] Connecting",{url:t,attempt:this.reconnectAttempts}),this.socket=new V.default(t,{headers:e}),this.socket.on("open",()=>{mn.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);mn.debug("[ws] Received message",{type:r?.type}),"connected"===r?.type&&(mn.info("[ws] Authenticated successfully"),this.isAuthenticated=!0,this.authenticationFailed=!1,this.flushPending()),"user_message"===r?.type&&"string"==typeof r.content&&(mn.info("[ws] Received user message from web UI"),this.onUserMessage?.(r.content))}catch{}}),this.socket.on("close",(e,t)=>{mn.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=>{mn.warn("[ws] Connection error",{error:e.message})})}catch(e){mn.warn("[ws] Failed to create WebSocket",{error:e instanceof Error?e.message:String(e)}),this.scheduleReconnect()}}scheduleReconnect(){this._isClosed||this.reconnectTimer||(this.reconnectAttempts++,mn.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===V.default.OPEN&&this.isAuthenticated}sendProgress(e){if(this._isClosed)return void mn.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?(mn.info("[ws] sendProgress: flushing terminal state immediately"),void this.flushPending()):void(this.debounceTimer||(this.debounceTimer=setTimeout(()=>{this.debounceTimer=void 0,this.flushPending()},this.debounceMs))):(mn.debug("[ws] sendProgress: not connected, queuing event",{phase:e.phase,socketState:this.socket?.readyState,isAuthenticated:this.isAuthenticated,reconnectAttempts:this.reconnectAttempts}),void(this.socket?.readyState===V.default.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 mn.debug("[ws] flushPending: not connected, re-queuing event",{phase:e.payload.phase}),void(this.pendingEvent=e);try{mn.debug("[ws] flushPending: sending event",{phase:e.payload.phase}),this.socket?.send(JSON.stringify(e),t=>{t&&(mn.warn("[ws] flushPending: send failed",{error:t.message,phase:e.payload.phase}),this.pendingEvent||(this.pendingEvent=e))})}catch(t){mn.warn("[ws] flushPending: send threw",{error:t instanceof Error?t.message:String(t)}),this.pendingEvent=e}}close(){if(this._isClosed)return;mn.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)}},Ln=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=xr,onUserMessage:o}){this.authHeader=e,this.orgId=t,this.sessionId=r,this.url=n,this.onUserMessage=o,mn.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)}`;mn.info("[ws] Connecting",{url:t,attempt:this.reconnectAttempts}),this.socket=new V.default(t,{headers:e}),this.socket.on("open",()=>{mn.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);mn.debug("[ws] Received message",{type:r?.type}),"connected"===r?.type&&(mn.info("[ws] Authenticated successfully"),this.isAuthenticated=!0,this.authenticationFailed=!1,this.flushPending()),"user_message"===r?.type&&"string"==typeof r.content&&(mn.info("[ws] Received user message from web UI"),this.onUserMessage?.(r.content))}catch{}}),this.socket.on("close",(e,t)=>{mn.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=>{mn.warn("[ws] Connection error",{error:e.message})})}catch(e){mn.warn("[ws] Failed to create WebSocket",{error:e instanceof Error?e.message:String(e)}),this.scheduleReconnect()}}scheduleReconnect(){this._isClosed||this.reconnectTimer||(this.reconnectAttempts++,mn.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===V.default.OPEN&&this.isAuthenticated}sendProgress(e){if(this._isClosed)return void mn.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?(mn.info("[ws] sendProgress: flushing terminal state immediately"),void this.flushPending()):void(this.debounceTimer||(this.debounceTimer=setTimeout(()=>{this.debounceTimer=void 0,this.flushPending()},this.debounceMs))):(mn.debug("[ws] sendProgress: not connected, queuing event",{phase:e.phase,socketState:this.socket?.readyState,isAuthenticated:this.isAuthenticated,reconnectAttempts:this.reconnectAttempts}),void(this.socket?.readyState===V.default.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 mn.debug("[ws] flushPending: not connected, re-queuing event",{phase:e.payload.phase}),void(this.pendingEvent=e);try{mn.debug("[ws] flushPending: sending event",{phase:e.payload.phase}),this.socket?.send(JSON.stringify(e),t=>{t&&(mn.warn("[ws] flushPending: send failed",{error:t.message,phase:e.payload.phase}),this.pendingEvent||(this.pendingEvent=e))})}catch(t){mn.warn("[ws] flushPending: send threw",{error:t instanceof Error?t.message:String(t)}),this.pendingEvent=e}}close(){if(this._isClosed)return;mn.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)}},On=/\.(spec|test)\.(c|m)?[jt]sx?$/,kn=e=>{if(!e||"object"!=typeof e)return!1;const t=e;return"text"===t.type&&"string"==typeof t.text},Dn=e=>null!=e&&"object"==typeof e&&"tool_response"in e,Bn=e=>{if(!e||"object"!=typeof e)return;const t=e;return Array.isArray(t.tool_response)?t.tool_response:void 0},Nn=e=>{const t=Bn(e);if(t)return t.filter(kn).map(e=>e.text).join("\n")||void 0},jn=/\u001b\[[0-9;]*m/g,$n=e=>e.replace(jn,""),Mn=/\$\{process\.env\.([A-Z_][A-Z0-9_]*)\}/g;function Hn({envVars:e}){return async t=>{if(!function(e){return Boolean(e&&"object"==typeof e&&"tool_input"in e&&e.tool_input&&"object"==typeof e.tool_input)}(t))return{decision:"approve"};const r=t.tool_input,n="string"==typeof r.text?r.text:void 0;if(!n)return{decision:"approve"};const o=n.replace(Mn,(t,r)=>{const n=e[r];return null!=n?n:t});return o===n?{decision:"approve"}:{decision:"approve",hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"allow",reason:"Evaluated environment variable placeholders in browser text input.",updatedInput:{...r,text:o}}}}}function Fn({onResult:e}){return async t=>{if(!Dn(t))return{decision:"approve"};const r=Nn(t);if(!r)return{decision:"approve"};const n=function(e){const t=$n(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 Gn({onResult:e}){return async t=>{if(!Dn(t))return{decision:"approve"};const r=Nn(t);if(!r)return{decision:"approve"};const n=function(e){const t=$n(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 zn=/\.(spec|test)\.(ts|tsx|js|jsx|mts|mjs)$/;function Yn({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&&zn.test(n)&&e(n),{decision:"approve"}}}var Wn=u.promisify(o.exec),Vn=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 qn(e){try{const t=o.execSync("git branch --show-current",{cwd:e,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();if(!t)return;return{branch:t}}catch{return}}var Kn=[".ts",".js",".mts",".mjs",".cts",".cjs"],Jn=10240,Xn=async({defaultContent:e,fileName:t,filePath:r})=>{try{const e=(await g.stat(r)).size,n=await g.readFile(r,"utf-8"),o=Buffer.byteLength(n,"utf-8");if(o<=Jn)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<=Jn?s:s.slice(0,Jn)+`\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}},Qn=async({defaultContent:e,dirName:t,dirPath:r})=>{try{const e=await g.readdir(r);return e.length>0?e.join("\n"):"(empty)"}catch(r){let n;if(r&&"object"==typeof r&&"code"in r){const e=r.code;"string"==typeof e&&(n=e)}return"ENOENT"!==n&&console.warn(`Failed to read ${t}: ${r}`),e}},Zn=async({allowedEnvVars:e,mode:t,workspaceInfo:r,authHeader:n,customHeader:o,maxParallelWorkers:s})=>{const i=Ar(),a=qn(r.absolutePath);mn.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??yr).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 mn.warn("System prompt fetch failed: unauthorized (401)"),await Fr(),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 mn.warn("System prompt fetch failed: forbidden (403)"),await Fr(),new Error("You no longer have access to this organization. Credentials have been cleared. Please run `stably login` to re-authenticate.");if(c.error)throw mn.warn("System prompt fetch failed",{error:c.error}),new Error(`Failed to fetch system prompt: ${JSON.stringify(c.error)}`);const u=function({customHeader:e,systemPrompt:t}){return e?`${t}\n\nWhen writing or updating the generated test file, prepend this exact header at the top of the file without modification:\n\`\`\`ts\n${e}\n\`\`\``:t}({systemPrompt:c.data.systemPrompt,customHeader:o});return mn.debug("System prompt received",{size:u.length,appendedCustomHeader:!!o}),u},eo=".stably-playwright-wrapper.config.*",to=[".ts",".js",".mts",".mjs",".cts",".cjs"];function ro(e){const r=t.resolve(e);if(i.existsSync(r))for(const e of to){const n=t.join(r,`playwright.config${e}`);if(i.existsSync(n))return n}}var no=["tests","e2e","__tests__","test"];function oo(e){try{return i.existsSync(e)&&i.statSync(e).isDirectory()}catch{return!1}}function so(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(M.default.dim(`Using output directory: ${e} (from ${r})`))}var io,ao=["mcp__playwright-test__","mcp__auto-heal-report__","mcp__test-doc-sync__","mcp__stably-agent-control__"],co=["planner_","generator_"],lo={"mcp__stably-agent-control__restart_mcp_servers":"Restarting Browser Tools","mcp__session-control__restart_mcp_servers":"Restarting Browser Tools"},uo=(e,t)=>{const r=t.find(t=>e.startsWith(t));return r?e.slice(r.length):e},po=e=>{const t=lo[e];if(t)return t;const r=uo(e,ao);return uo(r,co).split("_").map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join(" ")},fo=(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},ho=["test","bug","other"],go={bug:"Application code defect; behavior diverges from expected requirements.",other:"External dependencies, environment, or infra issues outside test/app code.",test:"Test code is incorrect, out-of-date, or missing necessary setup."},mo=e=>go[e],yo=/[^a-zA-Z0-9-_]/g,vo=e=>{const t=e.trim().replace(yo,"_");return t.length>0?t.slice(0,80):void 0},bo=e=>"string"==typeof e?vo(e):void 0,wo=((e,t,r)=>(r=null!=e?q(Q(e)):{},((e,t,r,n)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let r of X(t))Z.call(e,r)||void 0===r||K(e,r,{get:()=>t[r],enumerable:!(n=J(t,r))||n.enumerable});return e})(K(r,"default",{value:e,enumerable:!0}),e)))(te()),_o=A.createRequire("/");try{io=_o("worker_threads").Worker}catch(e){}var Eo=io?function(e,t,r,n,o){var s=!1,i=new io(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,io.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}},Io=Uint8Array,To=Uint16Array,xo=Int32Array,So=new Io([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]),Ao=new Io([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]),Co=new Io([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Ro=function(e,t){for(var r=new To(31),n=0;n<31;++n)r[n]=t+=1<<e[n-1];var o=new xo(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}},Po=Ro(So,2),Uo=Po.b,Lo=Po.r;Uo[28]=258,Lo[258]=28;var Oo,ko=Ro(Ao,0),Do=ko.b,Bo=ko.r,No=new To(32768);for(Mo=0;Mo<32768;++Mo)Oo=(61680&(Oo=(52428&(Oo=(43690&Mo)>>1|(21845&Mo)<<1))>>2|(13107&Oo)<<2))>>4|(3855&Oo)<<4,No[Mo]=((65280&Oo)>>8|(255&Oo)<<8)>>1;var jo=function(e,t,r){for(var n=e.length,o=0,s=new To(t);o<n;++o)e[o]&&++s[e[o]-1];var i,a=new To(t);for(o=1;o<t;++o)a[o]=a[o-1]+s[o-1]<<1;if(r){i=new To(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[No[d]>>c]=l}else for(i=new To(n),o=0;o<n;++o)e[o]&&(i[o]=No[a[e[o]-1]++]>>15-e[o]);return i},$o=new Io(288);for(Mo=0;Mo<144;++Mo)$o[Mo]=8;for(Mo=144;Mo<256;++Mo)$o[Mo]=9;for(Mo=256;Mo<280;++Mo)$o[Mo]=7;for(Mo=280;Mo<288;++Mo)$o[Mo]=8;var Mo,Ho=new Io(32);for(Mo=0;Mo<32;++Mo)Ho[Mo]=5;var Fo=jo($o,9,0),Go=jo($o,9,1),zo=jo(Ho,5,0),Yo=jo(Ho,5,1),Wo=function(e){for(var t=e[0],r=1;r<e.length;++r)e[r]>t&&(t=e[r]);return t},Vo=function(e,t,r){var n=t/8|0;return(e[n]|e[n+1]<<8)>>(7&t)&r},qo=function(e,t){var r=t/8|0;return(e[r]|e[r+1]<<8|e[r+2]<<16)>>(7&t)},Ko=function(e){return(e+7)/8|0},Jo=function(e,t,r){return(null==t||t<0)&&(t=0),(null==r||r>e.length)&&(r=e.length),new Io(e.subarray(t,r))},Xo=["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"],Qo=function(e,t,r){var n=new Error(t||Xo[e]);if(n.code=e,Error.captureStackTrace&&Error.captureStackTrace(n,Qo),!r)throw n;return n},Zo=function(e,t,r,n){var o=e.length,s=n?n.length:0;if(!o||t.f&&!t.l)return r||new Io(0);var i=!r,a=i||2!=t.i,c=t.i;i&&(r=new Io(3*o));var l=function(e){var t=r.length;if(e>t){var n=new Io(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=Vo(e,d,1);var v=Vo(e,d+1,3);if(d+=3,!v){var b=e[(P=Ko(d)+4)-4]|e[P-3]<<8,w=P+b;if(w>o){c&&Qo(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=Go,h=Yo,g=9,m=5;else if(2==v){var _=Vo(e,d,31)+257,E=Vo(e,d+10,15)+4,I=_+Vo(e,d+5,31)+1;d+=14;for(var T=new Io(I),x=new Io(19),S=0;S<E;++S)x[Co[S]]=Vo(e,d+3*S,7);d+=3*E;var A=Wo(x),C=(1<<A)-1,R=jo(x,A,1);for(S=0;S<I;){var P,U=R[Vo(e,d,C)];if(d+=15&U,(P=U>>4)<16)T[S++]=P;else{var L=0,O=0;for(16==P?(O=3+Vo(e,d,3),d+=2,L=T[S-1]):17==P?(O=3+Vo(e,d,7),d+=3):18==P&&(O=11+Vo(e,d,127),d+=7);O--;)T[S++]=L}}var k=T.subarray(0,_),D=T.subarray(_);g=Wo(k),m=Wo(D),f=jo(k,g,1),h=jo(D,m,1)}else Qo(1);if(d>y){c&&Qo(0);break}}a&&l(p+131072);for(var B=(1<<g)-1,N=(1<<m)-1,j=d;;j=d){var $=(L=f[qo(e,d)&B])>>4;if((d+=15&L)>y){c&&Qo(0);break}if(L||Qo(2),$<256)r[p++]=$;else{if(256==$){j=d,f=null;break}var M=$-254;if($>264){var H=So[S=$-257];M=Vo(e,d,(1<<H)-1)+Uo[S],d+=H}var F=h[qo(e,d)&N],G=F>>4;if(F||Qo(3),d+=15&F,D=Do[G],G>3&&(H=Ao[G],D+=qo(e,d)&(1<<H)-1,d+=H),d>y){c&&Qo(0);break}a&&l(p+131072);var z=p+M;if(p<D){var Y=s-D,W=Math.min(D,z);for(Y+p<0&&Qo(3);p<W;++p)r[p]=n[Y+p]}for(;p<z;++p)r[p]=r[p-D]}}t.l=f,t.p=j,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?Jo(r,0,p):r.subarray(0,p)},es=function(e,t,r){r<<=7&t;var n=t/8|0;e[n]|=r,e[n+1]|=r>>8},ts=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},rs=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 Io(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 To(p+1),h=ns(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 Io(f),l:h}},ns=function(e,t,r){return-1==e.s?Math.max(ns(e.l,t,r+1),ns(e.r,t,r+1)):t[e.s]=r},os=function(e){for(var t=e.length;t&&!e[--t];);for(var r=new To(++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}},ss=function(e,t){for(var r=0,n=0;n<t.length;++n)r+=e[n]*t[n];return r},is=function(e,t,r){var n=r.length,o=Ko(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)},as=function(e,t,r,n,o,s,i,a,c,l,u){es(t,u++,r),++o[256];for(var d=rs(o,15),p=d.t,f=d.l,h=rs(s,15),g=h.t,m=h.l,y=os(p),v=y.c,b=y.n,w=os(g),_=w.c,E=w.n,I=new To(19),T=0;T<v.length;++T)++I[31&v[T]];for(T=0;T<_.length;++T)++I[31&_[T]];for(var x=rs(I,7),S=x.t,A=x.l,C=19;C>4&&!S[Co[C-1]];--C);var R,P,U,L,O=l+5<<3,k=ss(o,$o)+ss(s,Ho)+i,D=ss(o,p)+ss(s,g)+i+14+3*C+ss(I,S)+2*I[16]+3*I[17]+7*I[18];if(c>=0&&O<=k&&O<=D)return is(t,u,e.subarray(c,c+l));if(es(t,u,1+(D<k)),u+=2,D<k){R=jo(p,f,0),P=p,U=jo(g,m,0),L=g;var B=jo(S,A,0);for(es(t,u,b-257),es(t,u+5,E-1),es(t,u+10,C-4),u+=14,T=0;T<C;++T)es(t,u+3*T,S[Co[T]]);u+=3*C;for(var N=[v,_],j=0;j<2;++j){var $=N[j];for(T=0;T<$.length;++T){var M=31&$[T];es(t,u,B[M]),u+=S[M],M>15&&(es(t,u,$[T]>>5&127),u+=$[T]>>12)}}}else R=Fo,P=$o,U=zo,L=Ho;for(T=0;T<a;++T){var H=n[T];if(H>255){ts(t,u,R[257+(M=H>>18&31)]),u+=P[M+257],M>7&&(es(t,u,H>>23&31),u+=So[M]);var F=31&H;ts(t,u,U[F]),u+=L[F],F>3&&(ts(t,u,H>>5&8191),u+=Ao[F])}else ts(t,u,R[H]),u+=P[H]}return ts(t,u,R[256]),u+P[256]},cs=new xo([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),ls=new Io(0),us=function(e,t,r,n,o,s){var i=s.z||e.length,a=new Io(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=cs[t-1],p=d>>13,f=8191&d,h=(1<<r)-1,g=s.p||new To(32768),m=s.h||new To(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 xo(25e3),_=new To(288),E=new To(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 L=i-x;if((I>7e3||S>24576)&&(L>423||!l)){u=as(e,c,0,w,_,E,T,S,C,x-C,u),S=I=T=0,C=x;for(var O=0;O<286;++O)_[O]=0;for(O=0;O<30;++O)E[O]=0}var k=2,D=0,B=f,N=P-U&32767;if(L>2&&R==b(x-N))for(var j=Math.min(p,L)-1,$=Math.min(32767,x),M=Math.min(258,L);N<=$&&--B&&P!=U;){if(e[x+k]==e[x+k-N]){for(var H=0;H<M&&e[x+H]==e[x+H-N];++H);if(H>k){if(k=H,D=N,H>j)break;var F=Math.min(N,H-2),G=0;for(O=0;O<F;++O){var z=x-N+O&32767,Y=z-g[z]&32767;Y>G&&(G=Y,U=z)}}}N+=(P=U)-(U=g[P])&32767}if(D){w[S++]=268435456|Lo[k]<<18|Bo[D];var W=31&Lo[k],V=31&Bo[D];T+=So[W]+Ao[V],++_[257+W],++E[V],A=x+k,++I}else w[S++]=e[x],++_[e[x]]}}for(x=Math.max(x,A);x<i;++x)w[S++]=e[x],++_[e[x]];u=as(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 q=x+65535;q>=i&&(c[u/8|0]=l,q=i),u=is(c,u+1,e.subarray(x,q))}s.i=i}return Jo(a,0,n+Ko(u)+o)},ds=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}(),ps=function(e,t,r,n,o){if(!o&&(o={l:1},t.dictionary)){var s=t.dictionary.subarray(-32768),i=new Io(s.length+e.length);i.set(s),i.set(e,s.length),e=i,o.w=s.length}return us(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)},fs=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},hs=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},gs=[],ms=function(){return[Io,To,xo,So,Ao,Co,Uo,Do,Go,Yo,No,Xo,jo,Wo,Vo,qo,Ko,Jo,Qo,Zo,Ss,vs,bs]},ys=function(){return[Io,To,xo,So,Ao,Co,Lo,Bo,Fo,$o,zo,Ho,No,cs,ls,jo,es,ts,rs,ns,os,ss,is,as,Ko,Jo,us,ps,xs,vs]},vs=function(e){return postMessage(e,[e.buffer])},bs=function(e){return e&&{out:e.size&&new Io(e.size),dictionary:e.dictionary}},ws=function(e,t,r,n,o,s){var i=function(e,t,r,n){if(!gs[r]){for(var o="",s={},i=e.length-1,a=0;a<i;++a)o=hs(e[a],o,s);gs[r]={c:hs(e[i],o,s),e:s}}var c=fs({},gs[r].e);return Eo(gs[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()}},_s=function(e,t){return e[t]|e[t+1]<<8},Es=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},Is=function(e,t){return Es(e,t)+4294967296*Es(e,t+4)},Ts=function(e,t,r){for(;r;++t)e[t]=r,r>>>=8};function xs(e,t){return ps(e,t||{},0,0)}function Ss(e,t){return Zo(e,{i:2},t&&t.out,t&&t.dictionary)}var As=function(e,t,r,n){for(var o in e){var s=e[o],i=t+o,a=n;Array.isArray(s)&&(a=fs(n,s[1]),s=s[0]),s instanceof Io?r[i]=[s,a]:(r[i+="/"]=[new Io(0),a],As(s,i,r,n))}},Cs="undefined"!=typeof TextEncoder&&new TextEncoder,Rs="undefined"!=typeof TextDecoder&&new TextDecoder;try{Rs.decode(ls,{stream:!0})}catch(e){}function Ps(e,t){if(Cs)return Cs.encode(e);for(var r=e.length,n=new Io(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 Io(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 Jo(n,0,o)}var Us=function(e){var t=0;if(e)for(var r in e){var n=e[r].length;n>65535&&Qo(9),t+=n+4}return t},Ls=function(e,t,r,n,o,s,i,a){var c=n.length,l=r.extra,u=a&&a.length,d=Us(l);Ts(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)&&Qo(10),Ts(e,t,f<<25|p.getMonth()+1<<21|p.getDate()<<16|p.getHours()<<11|p.getMinutes()<<5|p.getSeconds()>>1),t+=4,-1!=s&&(Ts(e,t,r.crc),Ts(e,t+4,s<0?-s-2:s),Ts(e,t+8,r.size)),Ts(e,t+12,c),Ts(e,t+14,d),t+=16,null!=i&&(Ts(e,t,u),Ts(e,t+6,r.attrs),Ts(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;Ts(e,t,+h),Ts(e,t+2,m),e.set(g,t+4),t+=4+m}return u&&(e.set(a,t),t+=u),t},Os="function"==typeof queueMicrotask?queueMicrotask:"function"==typeof setTimeout?setTimeout:function(e){e()},ks=[/^\/$/,/^\*+$/,/^[0-9]+$/],Ds=["/artifact/","https://","http://","*********"],Bs=Symbol.for("@ts-pattern/matcher"),Ns=Symbol.for("@ts-pattern/isVariadic"),js="@ts-pattern/anonymous-select-key",$s=e=>Boolean(e&&"object"==typeof e),Ms=e=>e&&!!e[Bs],Hs=(e,t,r)=>{if(Ms(e)){const n=e[Bs](),{matched:o,selections:s}=n.match(t);return o&&s&&Object.keys(s).forEach(e=>r(e,s[e])),o}if($s(e)){if(!$s(t))return!1;if(Array.isArray(e)){if(!Array.isArray(t))return!1;let n=[],o=[],s=[];for(const t of e.keys()){const r=e[t];Ms(r)&&r[Ns]?s.push(r):s.length?o.push(r):n.push(r)}if(s.length){if(s.length>1)throw new Error("Pattern error: Using `...P.array(...)` several times in a single pattern is not allowed.");if(t.length<n.length+o.length)return!1;const e=t.slice(0,n.length),i=0===o.length?[]:t.slice(-o.length),a=t.slice(n.length,0===o.length?1/0:-o.length);return n.every((t,n)=>Hs(t,e[n],r))&&o.every((e,t)=>Hs(e,i[t],r))&&(0===s.length||Hs(s[0],a,r))}return e.length===t.length&&e.every((e,n)=>Hs(e,t[n],r))}return Reflect.ownKeys(e).every(n=>{const o=e[n];return(n in t||Ms(s=o)&&"optional"===s[Bs]().matcherType)&&Hs(o,t[n],r);var s})}return Object.is(t,e)},Fs=e=>{var t,r,n;return $s(e)?Ms(e)?null!=(t=null==(r=(n=e[Bs]()).getSelectionKeys)?void 0:r.call(n))?t:[]:Array.isArray(e)?Gs(e,Fs):Gs(Object.values(e),Fs):[]},Gs=(e,t)=>e.reduce((e,r)=>e.concat(t(r)),[]);function zs(e){return Object.assign(e,{optional:()=>{return t=e,zs({[Bs]:()=>({match:e=>{let r={};const n=(e,t)=>{r[e]=t};return void 0===e?(Fs(t).forEach(e=>n(e,void 0)),{matched:!0,selections:r}):{matched:Hs(t,e,n),selections:r}},getSelectionKeys:()=>Fs(t),matcherType:"optional"})});var t},and:t=>Ys(e,t),or:t=>function(...e){return zs({[Bs]:()=>({match:t=>{let r={};const n=(e,t)=>{r[e]=t};return Gs(e,Fs).forEach(e=>n(e,void 0)),{matched:e.some(e=>Hs(e,t,n)),selections:r}},getSelectionKeys:()=>Gs(e,Fs),matcherType:"or"})})}(e,t),select:t=>void 0===t?Vs(e):Vs(t,e)})}function Ys(...e){return zs({[Bs]:()=>({match:t=>{let r={};const n=(e,t)=>{r[e]=t};return{matched:e.every(e=>Hs(e,t,n)),selections:r}},getSelectionKeys:()=>Gs(e,Fs),matcherType:"and"})})}function Ws(e){return{[Bs]:()=>({match:t=>({matched:Boolean(e(t))})})}}function Vs(...e){const t="string"==typeof e[0]?e[0]:void 0,r=2===e.length?e[1]:"string"==typeof e[0]?void 0:e[0];return zs({[Bs]:()=>({match:e=>{let n={[null!=t?t:js]:e};return{matched:void 0===r||Hs(r,e,(e,t)=>{n[e]=t}),selections:n}},getSelectionKeys:()=>[null!=t?t:js].concat(void 0===r?[]:Fs(r))})})}function qs(e){return!0}function Ks(e){return"number"==typeof e}function Js(e){return"string"==typeof e}function Xs(e){return"bigint"==typeof e}zs(Ws(qs)),zs(Ws(qs));var Qs=e=>Object.assign(zs(e),{startsWith:t=>{return Qs(Ys(e,(r=t,Ws(e=>Js(e)&&e.startsWith(r)))));var r},endsWith:t=>{return Qs(Ys(e,(r=t,Ws(e=>Js(e)&&e.endsWith(r)))));var r},minLength:t=>{return Qs(Ys(e,(r=t,Ws(e=>Js(e)&&e.length>=r))));var r},length:t=>{return Qs(Ys(e,(r=t,Ws(e=>Js(e)&&e.length===r))));var r},maxLength:t=>{return Qs(Ys(e,(r=t,Ws(e=>Js(e)&&e.length<=r))));var r},includes:t=>{return Qs(Ys(e,(r=t,Ws(e=>Js(e)&&e.includes(r)))));var r},regex:t=>{return Qs(Ys(e,(r=t,Ws(e=>Js(e)&&Boolean(e.match(r))))));var r}});Qs(Ws(Js));var Zs=e=>Object.assign(zs(e),{between:(t,r)=>{return Zs(Ys(e,(n=t,o=r,Ws(e=>Ks(e)&&n<=e&&o>=e))));var n,o},lt:t=>{return Zs(Ys(e,(r=t,Ws(e=>Ks(e)&&e<r))));var r},gt:t=>{return Zs(Ys(e,(r=t,Ws(e=>Ks(e)&&e>r))));var r},lte:t=>{return Zs(Ys(e,(r=t,Ws(e=>Ks(e)&&e<=r))));var r},gte:t=>{return Zs(Ys(e,(r=t,Ws(e=>Ks(e)&&e>=r))));var r},int:()=>Zs(Ys(e,Ws(e=>Ks(e)&&Number.isInteger(e)))),finite:()=>Zs(Ys(e,Ws(e=>Ks(e)&&Number.isFinite(e)))),positive:()=>Zs(Ys(e,Ws(e=>Ks(e)&&e>0))),negative:()=>Zs(Ys(e,Ws(e=>Ks(e)&&e<0)))});Zs(Ws(Ks));var ei=e=>Object.assign(zs(e),{between:(t,r)=>{return ei(Ys(e,(n=t,o=r,Ws(e=>Xs(e)&&n<=e&&o>=e))));var n,o},lt:t=>{return ei(Ys(e,(r=t,Ws(e=>Xs(e)&&e<r))));var r},gt:t=>{return ei(Ys(e,(r=t,Ws(e=>Xs(e)&&e>r))));var r},lte:t=>{return ei(Ys(e,(r=t,Ws(e=>Xs(e)&&e<=r))));var r},gte:t=>{return ei(Ys(e,(r=t,Ws(e=>Xs(e)&&e>=r))));var r},positive:()=>ei(Ys(e,Ws(e=>Xs(e)&&e>0))),negative:()=>ei(Ys(e,Ws(e=>Xs(e)&&e<0)))});ei(Ws(Xs)),zs(Ws(function(e){return"boolean"==typeof e})),zs(Ws(function(e){return"symbol"==typeof e})),zs(Ws(function(e){return null==e})),zs(Ws(function(e){return null!=e}));var ti=class extends Error{constructor(e){let t;try{t=JSON.stringify(e)}catch(r){t=e}super(`Pattern matching error: no pattern matches value ${t}`),this.input=void 0,this.input=e}},ri={matched:!1,value:void 0},ni=class e{constructor(e,t){this.input=void 0,this.state=void 0,this.input=e,this.state=t}with(...t){if(this.state.matched)return this;const r=t[t.length-1],n=[t[0]];let o;3===t.length&&"function"==typeof t[1]?o=t[1]:t.length>2&&n.push(...t.slice(1,t.length-1));let s=!1,i={};const a=(e,t)=>{s=!0,i[e]=t},c=!n.some(e=>Hs(e,this.input,a))||o&&!Boolean(o(this.input))?ri:{matched:!0,value:r(s?js in i?i[js]:i:this.input,this.input)};return new e(this.input,c)}when(t,r){if(this.state.matched)return this;const n=Boolean(t(this.input));return new e(this.input,n?{matched:!0,value:r(this.input,this.input)}:ri)}otherwise(e){return this.state.matched?this.state.value:e(this.input)}exhaustive(e=oi){return this.state.matched?this.state.value:e(this.input)}run(){return this.exhaustive()}returnType(){return this}narrow(){return this}};function oi(e){throw new ti(e)}var si=new Set(["sha1","_sha1","pageref","downloadsPath","tracesDir","pageId"]);function ii({sensitiveValues:e,str:t}){return e.reduce((e,t)=>e.replaceAll(t,"[REDACTED]"),t)}function ai({sensitiveValues:e,value:t}){return"string"==typeof t?ii({sensitiveValues:e,str:t}):Array.isArray(t)?t.map(t=>ai({sensitiveValues:e,value:t})):function(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}(t)?li({obj:t,sensitiveValues:e}):t}function ci(e){return!!si.has(e)||e.toLowerCase().endsWith("sha1")}function li({obj:e,sensitiveValues:t}){return Object.fromEntries(Object.entries(e).map(([e,r])=>[e,ci(e)?r:ai({sensitiveValues:t,value:r})]))}function ui({error:e,sensitiveValues:t}){return e?{...e,message:ii({sensitiveValues:t,str:e.message})}:void 0}function di({content:e,sensitiveValues:t}){const r=new u.TextDecoder,n=new u.TextEncoder,o=ii({sensitiveValues:t,str:r.decode(e)});return n.encode(o)}var pi=u.promisify(function(e,t,r){r||(r=t,t={}),"function"!=typeof r&&Qo(7);var n=[],o=function(){for(var e=0;e<n.length;++e)n[e]()},s={},i=function(e,t){Os(function(){r(e,t)})};Os(function(){i=r});for(var a=e.length-22;101010256!=Es(e,a);--a)if(!a||e.length-a>65558)return i(Qo(13,0,1),null),o;var c=_s(e,a+8);if(c){var l=c,u=Es(e,a+16),d=4294967295==u||65535==l;if(d){var p=Es(e,a-12);(d=101075792==Es(e,p))&&(l=c=Es(e,p+32),u=Es(e,p+48))}for(var f=t&&t.filter,h=function(t){var r=function(e,t,r){var n=_s(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(Rs)return Rs.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:Jo(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&&Qo(8),s}(e.subarray(t+46,t+46+n),!(2048&_s(e,t+8))),s=t+46+n,i=Es(e,t+20),a=r&&4294967295==i?function(e,t){for(;1!=_s(e,t);t+=4+_s(e,t+2));return[Is(e,t+12),Is(e,t+4),Is(e,t+20)]}(e,s):[i,Es(e,t+24),Es(e,t+42)],c=a[0],l=a[1],u=a[2];return[_s(e,t+10),c,l,o,s+_s(e,t+30)+_s(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+_s(e,t+26)+_s(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,Ss(b,{out:new Io(p)}))}catch(e){v(e,null)}else n.push(function(e,t,r){return r||(r=t,t={}),"function"!=typeof r&&Qo(7),ws(e,t,[ms],function(e){return vs(Ss(e.data[0],bs(e.data[1])))},1,r)}(b,{size:p},v))}else v(Qo(14,"unknown compression type "+a,1),null);else v(null,Jo(e,y,y+l));else v(null,null)},g=0;g<l;++g)h()}else i(null,{});return o}),fi=u.promisify(function(e,t,r){r||(r=t,t={}),"function"!=typeof r&&Qo(7);var n={};As(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){Os(function(){r(e,t)})};Os(function(){p=r});var f=function(){var e=new Io(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;Ls(e,a,o,o.f,o.u,s);var u=30+o.f.length+Us(o.extra),d=a+u;e.set(o.c,d),Ls(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){Ts(e,t,101010256),Ts(e,t+8,r),Ts(e,t+10,r),Ts(e,t+12,n),Ts(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=ds[255&r^t[n]]^r>>>8;e=r},d:function(){return~e}}}(),m=c.length;g.p(c);var y=Ps(t),v=y.length,b=h.comment,w=b&&Ps(b),_=w&&w.length,E=Us(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]=fs(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(Qo(11,0,1),null),I)if(m<16e4)try{T(null,xs(c,h))}catch(e){T(e,null)}else u.push(function(e,t,r){return r||(r=t,t={}),"function"!=typeof r&&Qo(7),ws(e,t,[ys],function(e){return vs(xs(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 hi({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 u.TextDecoder,n=new u.TextEncoder,o=r.decode(e).split("\n").map(e=>{if(!e.trim())return e;try{const r=function({event:e,sensitiveValues:t}){return(r=e,new ni(r,ri)).with({type:"console"},e=>({...e,args:e.args?.map(e=>({...e,preview:ii({sensitiveValues:t,str:e.preview}),value:ai({sensitiveValues:t,value:e.value})})),text:ii({sensitiveValues:t,str:e.text})})).with({type:"before"},e=>({...e,params:li({obj:e.params,sensitiveValues:t}),title:e.title?ii({sensitiveValues:t,str:e.title}):void 0})).with({type:"after"},e=>({...e,error:ui({error:e.error,sensitiveValues:t}),result:void 0!==e.result?ai({sensitiveValues:t,value:e.result}):void 0})).with({type:"action"},e=>({...e,error:ui({error:e.error,sensitiveValues:t}),params:li({obj:e.params,sensitiveValues:t}),result:void 0!==e.result?ai({sensitiveValues:t,value:e.result}):void 0,title:e.title?ii({sensitiveValues:t,str:e.title}):void 0})).with({type:"event"},e=>({...e,params:li({obj:e.params,sensitiveValues:t})})).with({type:"stdout"},{type:"stderr"},e=>({...e,text:void 0!==e.text?ii({sensitiveValues:t,str:e.text}):void 0})).with({type:"error"},e=>({...e,message:ii({sensitiveValues:t,str:e.message})})).with({type:"log"},e=>({...e,message:ii({sensitiveValues:t,str:e.message})})).with({type:"context-options"},e=>({...e,options:li({obj:e.options,sensitiveValues:t}),title:e.title?ii({sensitiveValues:t,str:e.title}):void 0})).with({type:"frame-snapshot"},e=>({...e,snapshot:li({obj:e.snapshot,sensitiveValues:t})})).with({type:"resource-snapshot"},e=>({...e,snapshot:li({obj:e.snapshot,sensitiveValues:t})})).with({type:"screencast-frame"},{type:"input"},e=>e).exhaustive();var r}({event:JSON.parse(e),sensitiveValues:t});return JSON.stringify(r)}catch{return ii({sensitiveValues:t,str:e})}});return n.encode(o.join("\n"))}({content:e,sensitiveValues:r}):n.endsWith(".html")||n.endsWith(".dat")||n.endsWith(".json")?di({content:e,sensitiveValues:r}):n.startsWith("resources/")?async function({content:e,sensitiveValues:t}){return await(0,wo.isBinaryFile)(Buffer.from(e))?e:di({content:e,sensitiveValues:t})}({content:e,sensitiveValues:r}):e}function gi(e=process.cwd()){let r=t.resolve(e);for(;;){const e=mi(r);if(e){const n={...e.dependencies,...e.devDependencies},o="@playwright/test"in n?"@playwright/test":"playwright"in n?"playwright":void 0;if(o){const e=yi(r);let n=!1,s=r;for(;;){const e=t.join(s,"node_modules"),r=t.join(e,o);if(i.existsSync(r)){n=!0;break}const a=t.dirname(s);if(a===s)break;s=a}return{inNodeModules:n,installed:!0,packageManager:e,packageName:o}}}const n=t.dirname(r);if(n===r)return{inNodeModules:!1,installed:!1,packageManager:void 0};r=n}}function mi(e){const r=t.join(e,"package.json");let n;try{n=i.readFileSync(r,"utf-8")}catch{return}try{return JSON.parse(n)}catch{return}}function yi(e){const r=[["npm","package-lock.json"],["pnpm","pnpm-lock.yaml"],["yarn","yarn.lock"]];let n=e;for(;;){for(const[e,o]of r)if(i.existsSync(t.join(n,o)))return e;const e=t.dirname(n);if(e===n)return;n=e}}function vi(e){if("npm"===e)return["npx","playwright"];if("pnpm"===e)return["pnpm","exec","playwright"];if("yarn"===e)return["yarn","playwright"];throw new Error("Package manager not supported")}var bi=e=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),wi=e=>(e instanceof Error?e.message:String(e)).slice(0,400),_i=({outputDir:e,representativeTest:t})=>{const r=["test","--trace=on","--workers=1","--retries=0","--output",e];return t.filePath&&r.push(t.filePath),t.testIdentifier?r.push("--grep",`^${bi(t.testIdentifier)}$`):t.testTitle&&r.push("--grep",bi(t.testTitle)),r},Ei=async e=>{const t=await g.readdir(e,{withFileTypes:!0}),r=[];for(const n of t){const t=O.default.join(e,n.name);if(n.isDirectory())r.push(...await Ei(t));else if(n.isFile()&&"trace.zip"===n.name){const e=await g.stat(t);r.push({path:t,mtimeMs:e.mtimeMs})}}return r},{zSuiteAutoHealReport:Ii,zRepresentativeTest:Ti}=function(e){const t=e.enum(ho),r=["Classification of the root cause:","",`- test: ${mo("test")}`,`- bug: ${mo("bug")}`,`- other: ${mo("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 and fix (must be existing IDs only)."),rootCause:e.string().describe("Brief explanation of what happened (1-2 sentences).")}),a=e.discriminatedUnion("result",[i.extend({fixApplied:e.string().describe("What fix was applied (brief, specific)."),result:e.literal("fixed"),traceProof:o.optional().describe("Optional trace proof metadata for fixed issues."),traceProofs:e.array(s).min(1).optional().describe("Optional per-test trace proof metadata for fixed issues.")}),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)."),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}}(I.z),xi=({authHeader:e,diffTracker:t,orgId:r,runId:n,workingDir:s})=>d.createSdkMcpServer({name:"auto-heal-report",tools:[d.tool("capture-trace-proof",["Capture and upload a Playwright trace proof for a fixed issue or fixed test case.","","Use this only for fixed results. Pass representative test info from the worker.","Pass testCaseId and call once per fixed test case.","testCaseId is for per-test mapping/storage metadata; representativeTest selects the runnable test."].join("\n"),{issueId:I.z.string().min(1).describe("Issue identifier for deterministic output paths and storage key naming."),proofId:I.z.string().min(1).optional().describe("Optional id for deterministic proof naming and deduplication."),representativeTest:Ti.optional().default({}),testCaseId:I.z.string().min(1).optional().describe("Optional test case ID when capturing per-test trace proofs.")},async({issueId:t,proofId:a,representativeTest:c,testCaseId:l})=>{const u=I.z.string().min(1).parse(t),d=null==a?void 0:I.z.string().min(1).parse(a),p=null==l?void 0:I.z.string().min(1).parse(l),f=await(async({authHeader:e,issueId:t,orgId:r,proofId:n,representativeTest:s,runId:a,testCaseId:c,workingDir:l})=>{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 u=gi(l);if(!u.installed||!u.inNodeModules||!u.packageManager)return{status:"capture_failed",representativeTest:s,error:"Playwright is not installed in the current workspace."};const d=(e=>vo(e)??"issue")(t),p=(({proofId:e,testCaseId:t})=>bo(t)??bo(e))({testCaseId:c,proofId:n}),f=O.default.join(l,".stably","autoheal-proof",d,p??"issue"),[h,...m]=vi(u.packageManager),y=[...m,..._i({outputDir:f,representativeTest:s})];try{await g.rm(f,{force:!0,recursive:!0}),await g.mkdir(f,{recursive:!0});const{code:u,stderr:d,timedOut:p}=await(async({args:e,command:t,cwd:r,timeoutMs:n})=>await new Promise((s,i)=>{const a=o.spawn(t,e,{cwd:r,env: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")},n);a.on("error",e=>{clearTimeout(u),i(e)}),a.on("close",e=>{clearTimeout(u),s({code:e,stderr:c,timedOut:l})})}))({args:y,command:h,cwd:l,timeoutMs:3e5});if(p)return{status:"capture_failed",representativeTest:s,error:"Trace proof run timed out while executing Playwright verification."};if(0!==u)return{status:"capture_failed",representativeTest:s,error:`Trace proof run failed (exit code ${u??"unknown"}): ${d.trim().slice(0,280)}`};const m=await(async e=>{const t=await Ei(e);if(0!==t.length)return t.sort((e,t)=>t.mtimeMs-e.mtimeMs),t[0]?.path})(f);if(!m)return{status:"capture_failed",representativeTest:s,error:"Trace proof run completed, but no trace.zip was produced."};const{traceBucketPath:v,uploadUrl:b,sensitiveValues:w}=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:Ar(),headers:Sn(s),path:{runId:i}},(c.client??yr).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=Pn.parse(a.data);return{traceBucketPath:l.traceBucketPath,expiresInSeconds:l.expiresInSeconds,key:l.key,uploadUrl:l.uploadUrl,sensitiveValues:l.sensitiveValues}})({authHeader:e,issueId:t,proofId:n,orgId:r,runId:a,testCaseId:c}),_=await async function({tracePath:e,sensitiveValues:t}){const r=[],n=i.createReadStream(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||ks.some(t=>t.test(e))||Ds.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 pi(new Uint8Array(t)),s=Object.entries(o),i=await Promise.all(s.map(async([e,t])=>[e,await hi({content:t,filename:e,sensitiveValues:n})])),a=Object.fromEntries(i);return fi(a)}({traceBuffer:new Uint8Array(Buffer.concat(r)),sensitiveValues:t})}({tracePath:m,sensitiveValues:w});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:_,uploadUrl:b})}catch(e){return{status:"upload_failed",representativeTest:s,error:wi(e)}}return{status:"captured",representativeTest:s,storage:v}}catch(e){return{status:"capture_failed",representativeTest:s,error:wi(e)}}})({authHeader:e,issueId:u,orgId:r,proofId:d,representativeTest:Ti.parse(c??{}),runId:n,testCaseId:p,workingDir:s}),h="string"==typeof p?{testCaseId:p,...f}:f;return{content:[{text:JSON.stringify(h),type:"text"}]}}),d.tool("generate-report",["After attempting to fix all broken tests (skip only those truly infeasible), generate and return a suite auto-heal report in the required schema.","","Ensure the payload matches zSuiteAutoHealReport exactly; include every issue discovered."].join("\n"),{report:Ii},async({report:o})=>{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}})(o),a=Ii.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:Ar(),headers:Sn(t),path:{runId:n}},(s.client??yr).post({security:[{scheme:"bearer",type:"http"}],url:"/internal/v1/cli/runs/{runId}/autoheal-report",...s,headers:{"Content-Type":"application/json",...s.headers}}));var s;if(o.error)throw new Error(`Failed to upload auto-heal report (${o.response.status})`)})({authHeader:e,orgId:r,report:a,runId:n});const{uploadUrl:t}=await(async({authHeader:e,contentType:t="text/plain",orgId:r,runId:n})=>{const o=await(s={auth:e,body:{contentType:t},client:Ar(),headers:Sn(r),path:{runId:n}},(s.client??yr).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=Rn.parse(o.data);return{diffBucketPath:i.diffBucketPath,expiresInSeconds:i.expiresInSeconds,key:i.key,uploadUrl:i.uploadUrl}})({authHeader:e,contentType:"text/plain",orgId:r,runId:n});await(async({contentType:e="text/plain",diff:t,uploadUrl:r})=>{const n=await fetch(r,{body:t,headers:{"Content-Type":e},method:"PUT"});if(!n.ok)throw new Error(`Failed to upload diff (${n.status})`)})({contentType:"text/plain",diff:s,uploadUrl:t})}catch(e){return console.error("[auto-heal-report] Failed to upload report or diff:",e),{content:[{text:"Error: Failed to upload auto-heal report or diff. Please surface this to the user, and terminate the session.",type:"text"}]}}return{content:[{text:"Auto-heal report generated. You may terminate this session now.",type:"text"}]}})],version:"0.0.1"}),Si=({onComplete:e,onRestartRequested:t})=>e?d.createSdkMcpServer({name:"session-control",tools:[d.tool("complete_session",["Call this tool when you have completed your task and the session should end.","Use this instead of waiting for the user to manually terminate.","Only call this when you are confident the task is fully complete."].join("\n"),{summary:I.z.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}`)})]}):d.createSdkMcpServer({name:"stably-agent-control",version:"1.0.0",tools:[d.tool("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."}]})))]}),Ai=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]"),Ci=(e,t)=>({message:Ai(e),status:t?.status,statusText:t?.statusText}),Ri=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"]),Pi=async({authHeader:e,mode:t,maxTurnsOverride:r})=>{const n=Ar();mn.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??yr).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 mn.warn("Subagent definitions fetch failed: unauthorized (401)"),await Fr(),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 mn.warn("Subagent definitions fetch failed: forbidden (403)"),await Fr(),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 mn.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 mn.debug("Subagent definitions received",{count:Object.keys(i).length}),i},{zStablyYaml:Ui}=function(e){const t=e.object({cron:e.string(),stablyTestArgs:e.string().optional(),timezone:e.string().optional()}),r=e.object({maxTurnsPerIssue:e.number().int().positive().optional(),maxParallelWorkers:e.number().int().positive().optional(),rules:e.string().optional()}),n=e.object({fix:r.optional()});return{zStablyYaml:e.object({schedules:e.record(e.string(),t).optional(),agent:n.optional()}),zAgentConfig:n,zAgentFixConfig:r,zScheduleEntry:t}}(v.z),Li=["Bash","Read","Write","Edit","Glob","Grep","Task"],Oi=["Task","mcp__playwright-test"],ki=["Bash","Read","Write","Edit","Glob","Grep","mcp__session-control"],Di=e=>{if("EPIPE"!==e.code)throw e},Bi="__main__",Ni=e=>"mcp__auto-heal-report__generate-report"===e,ji=e=>"mcp__auto-heal-report__capture-trace-proof"===e?"Verify Test Run":"mcp__auto-heal-report__generate-report"===e?"Generate Report":po(e);async function $i(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 Mi=async r=>{if("single"===r.mode||"build"===r.mode){const e=Array.isArray(r.prompt)?r.prompt.join(" "):r.prompt;mn.initSession(e||"create-from-diff")}else"fix"===r.mode&&mn.initSession(`fix-${r.runId}`);mn.info("Agent session starting",{mode:r.mode}),process.stdout.on("error",Di),process.stderr.on("error",Di);const n=e=>{if("EPIPE"!==e.code)throw e};process.on("uncaughtException",n),mn.debug("Checking authentication");const o=await En({autoLogin:"chat"===r.mode||"init"===r.mode}),s=(e=>"env"===e.type?e.auth.apiKey:e.auth.accessToken)(o);mn.debug("Authentication resolved",{authType:o.type});const a="oauth"===o.type?o.auth.context.orgId:void 0,c=O.default.resolve(process.cwd()),l=O.default.join(c,".env"),u=B.default.existsSync(l)&&B.default.statSync(l).isFile(),p=u?e.parse(B.default.readFileSync(l,"utf8")):{};mn.debug("Environment file",{path:l,exists:u,variableCount:Object.keys(p).length});const f="chat"!==r.mode&&"init"!==r.mode,h="chat"===r.mode;let m=new Vn;const y="chat"===r.mode?r.getHelpText:void 0,v={log:[],promptDisplay:"chat"===r.mode?"Ask Stably to build tests for you":"init"===r.mode?"Setting up Playwright and Stably SDK":"fix"===r.mode?"Fixing broken tests":(Array.isArray(r.prompt)?r.prompt.join(" "):r.prompt)?.trim()||"Creating tests from PR/branch changes",status:"running"};let b,w,_,E,I=f,T=!1,A=!1,R=0,P=0,U=!1;const L=[],k=new Map;let D=null,N=!1,j=!1;const H=Date.now();let F,G="fix"===r.mode?{suiteId:r.runId,phase:"initializing",totalTests:null,fixedTests:0,failedTests:0,currentTestDescription:null,lastTestDescription:null,startedAt:H,endedAt:null,isError:!1,updatedAt:H,recentActivity:[],workers:[{id:Bi,testDescription:"Orchestrator",workerType:"main",status:"running",summary:null,startedAt:H,endedAt:null,activity:[]}]}:null;const z=new Set,Y=(e,t)=>{if(!G)return;const r=G.workers.map(r=>{if(r.id!==e)return r;const n=[...r.activity,{...t,timestamp:Date.now()}].slice(-15);return{...r,activity:n}});q({workers:r})},W=e=>{if(!G)return;const t=[...G.recentActivity,{...e,timestamp:Date.now()}].slice(-10);q({recentActivity:t})},V=e=>(G?.workers??[]).map(t=>t.id===Bi?{...t,status:e?"failed":"succeeded",endedAt:t.endedAt??Date.now()}:"running"===t.status?{...t,status:"failed",endedAt:Date.now()}:t),q=e=>{G&&!F?.isClosed&&(G={...G,...e,updatedAt:Date.now()},F?.sendProgress(G))},K=async e=>{if("fix"===r.mode){if("STARTED"===e){if(N)return;N=!0}else{if(j)return;j=!0}try{await(async({authHeader:e,orgId:t,runId:r,status:n})=>{const o=await(s={auth:e,body:{status:n},client:Ar(),headers:Sn(t),path:{runId:r}},(s.client??yr).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:s,orgId:a,runId:r.runId,status:e})}catch{}}},J="single"===r.mode||"build"===r.mode,X=Date.now();let Q,Z=null;const ee=e=>{Z&&!Q?.isClosed&&(Z={...Z,...e,updatedAt:Date.now()},Q?.sendProgress(Z))},te=e=>{if(!Z)return;const t=[...Z.recentActivity,{...e,timestamp:Date.now()}].slice(-10);ee({recentActivity:t})};if(J||"fix"===r.mode)try{const e=new URL("/internal/v1/cli/progress",br).toString(),t={Authorization:s,"Content-Type":"application/json"};a&&(t["x-stably-org-id"]=a);const n="single"===r.mode?"create":"build"===r.mode?"build":"fix",i=await fetch(e,{method:"POST",headers:t,body:JSON.stringify({mode:n,projectId:In(o),agentId:$.default.randomUUID(),..."fix"===r.mode?{playwrightSuiteRunId:r.runId}:{}}),signal:AbortSignal.timeout(1e4)});if(i.ok){const{sessionId:e}=await i.json();if(J){const t="single"===r.mode||"build"===r.mode?Array.isArray(r.prompt)?r.prompt.join(" "):r.prompt:null,n=qn(c);Z={sessionId:e,phase:"initializing",startedAt:X,endedAt:null,isError:!1,updatedAt:X,currentActivity:null,filesCreated:[],recentActivity:[],prompt:t||null,environment:{gitBranch:n?.branch??null,workingDirectory:c,nodeVersion:process.version,cliVersion:vr}},Q=new Ln({authHeader:s,orgId:a,sessionId:e,onUserMessage:e=>{m&&(mn.info("[ws] Injecting web UI message into agent",{contentLength:e.length}),te({type:"user_message",summary:e}),le({text:`[Web] ${e}`}),m.pushText(`[Message from web UI user]: ${e}`),I||(I=!0,ye({status:"running"})))}}),Q.start(),ee({phase:"initializing"})}mn.info(`[${n}] Progress session created`,{sessionId:e})}else{const t=await i.text().catch(()=>"");mn.warn(`[${n}] Failed to create progress session: ${i.status} ${e} — ${t.slice(0,300)}`)}}catch(e){const t=e instanceof Error?e.message:String(e);mn.warn(`[progress] Session creation failed (non-fatal): ${t}`)}const re={current:e=>{}},ne={current:async()=>{}},{addSubagentActivity:oe,addSubagentStart:se,addTool:ie,addToolResult:ae,appendText:ce,appendUserMessage:le,cleanup:ue,setExiting:de,setRunningLabel:pe,setStatus:fe,setSubagentStatus:he,updateFixProgress:ge}=await(async(e,t)=>{const{Box:r,Static:n,Text:o,render:s,useInput:i}=await import("ink"),a=!!process.stdin.isTTY,c=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],l=()=>S.jsx(o,{inverse:!0,children:" "}),u=(({Box:e,Text:t,useInput:r},n,o)=>function({onChoice:s,prompt:i}){const[a,c]=x.useState(0),[l,u]=x.useState(!1),[d,p]=x.useState(""),f=[{label:"Yes, allow this once",value:"allow"},{label:"Yes, always allow for this session",value:"always"},{label:"No, tell AI what to do differently",value:"deny_with_message"}];r((e,t)=>{if(l)return t.return?void s("deny_with_message",d||"User denied this action"):t.escape?(u(!1),void p("")):t.backspace||t.delete?void p(e=>e.slice(0,-1)):void(t.ctrl||t.meta||p(t=>`${t}${e}`));if(t.upArrow)return void c(e=>e>0?e-1:f.length-1);if(t.downArrow)return void c(e=>e<f.length-1?e+1:0);if(t.return){const e=f[a];return"deny_with_message"===e.value?void u(!0):void s(e.value)}const r=parseInt(e,10);if(r>=1&&r<=f.length){const e=f[r-1];if("deny_with_message"===e.value)return void u(!0);s(e.value)}},{isActive:o});const h=po(i.toolName),g=fo(i.toolName,i.input);return S.jsxs(e,{borderColor:"yellow",borderStyle:"round",flexDirection:"column",marginTop:1,paddingX:1,paddingY:0,children:[S.jsx(t,{bold:!0,color:"yellow",children:"Permission Required"}),S.jsxs(e,{flexDirection:"column",marginTop:1,children:[S.jsx(t,{color:"magenta",children:h}),null!=g&&S.jsxs(t,{color:"gray",children:[" ",g]})]}),null!=i.decisionReason&&S.jsx(e,{marginTop:1,children:S.jsxs(t,{color:"gray",children:["Reason: ",i.decisionReason]})}),l?S.jsxs(e,{flexDirection:"column",marginTop:1,children:[S.jsx(t,{color:"gray",children:"Enter message for AI (press Enter to submit, Esc to cancel):"}),S.jsxs(t,{children:[S.jsx(t,{color:"yellow",children:">"})," ",d,S.jsx(n,{})]})]}):S.jsxs(e,{flexDirection:"column",marginTop:1,children:[S.jsx(t,{color:"gray",children:"Use ↑↓ arrows or number keys to select:"}),f.map((e,r)=>S.jsx(t,{children:S.jsxs(t,{color:r===a?"cyan":void 0,children:[r===a?"❯":" "," ",r+1,". ",e.label]})},e.value))]})]})})({Box:r,Text:o,useInput:i},l,a),d=(({Cursor:e,inkComponents:{Box:t,Static:r,Text:n,useInput:o},isRawModeSupported:s,PermissionPrompt:i,Spinner:a})=>{const c=({progress:e})=>{const[r,o]=x.useState(Date.now());x.useEffect(()=>{const e=setInterval(()=>o(Date.now()),1e3);return()=>clearInterval(e)},[]);const s=r-e.startedAt,i=Math.floor(s/1e3),a=Math.floor(i/60),c=i%60,l=a>0?`${a}m ${c.toString().padStart(2,"0")}s`:`${c}s`,{label: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 S.jsx(t,{flexDirection:"column",children:S.jsxs(n,{children:[S.jsx(n,{color:d,bold:!0,children:u}),S.jsx(n,{color:"gray",children:f}),S.jsxs(n,{color:"gray",children:[" [",l,"]"]})]})})},l=({progress:e})=>{const r=e.endedAt??Date.now(),o=Math.floor((r-e.startedAt)/1e3),s=Math.floor(o/60),i=o%60,a=s>0?`${s}m ${i.toString().padStart(2,"0")}s`:`${i}s`,c=e.isError?"yellow":"green",l=e.isError?"Fix stopped":"Fix complete";return S.jsxs(t,{flexDirection:"column",children:[S.jsxs(n,{color:c,bold:!0,children:[l," in ",a]}),null!==e.totalTests&&S.jsxs(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 S.jsxs(t,{flexDirection:"column",marginTop:1,children:[S.jsxs(n,{children:[S.jsx(n,{color:o,bold:!0,children:"Agent"}),r.description?S.jsxs(n,{color:"gray",children:[" (",r.description,")"]}):null]}),r.activities.length>0&&S.jsx(t,{flexDirection:"column",marginLeft:2,children:r.activities.map(e=>(e=>"tool"===e.kind?S.jsxs(n,{color:"magenta",children:["• ",e.content]},e.id):"tool_result"===e.kind?S.jsx(n,{color:"gray",children:e.content},e.id):null)(e))})]},e.id)}return"tool"===e.kind?S.jsxs(n,{color:"magenta",children:["• ",e.content]},e.id):"tool_result"===e.kind?S.jsx(n,{color:"gray",children:e.content},e.id):"user"===e.kind?S.jsxs(n,{color:"cyan",children:["You: ",e.content]},e.id):S.jsx(n,{children:e.content},e.id)},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]=x.useState({value:"",cursor:0}),I=_.value,T=_.cursor,A=x.useRef(!1),C=x.useRef(void 0),[R,P]=x.useState(!1),U=x.useRef(0),L=w.log.at(-1),O="text"===L?.kind&&"running"===w.status,k=w.log.findIndex(e=>"subagent"===e.kind&&"running"===e.subagent?.status),D=d?0:-1!==k?k:O?w.log.length-1:w.log.length;x.useEffect(()=>{w.log.length<U.current&&(U.current=0),D>U.current&&(U.current=D)},[w.log.length,D]);const B=w.log.slice(0,U.current),N=w.log.slice(U.current),j=!!w.permissionPrompt,$=x.useCallback(async()=>{A.current?(C.current&&clearTimeout(C.current),await(m?.()),process.exit(0)):(A.current=!0,P(!0),C.current=setTimeout(()=>{A.current=!1,P(!1)},2e3))},[m]);o((e,t)=>{t.ctrl&&"c"===e&&$().catch(()=>process.exit(1))},{isActive:s}),x.useEffect(()=>{if(j||!v)return;const e=e=>{const t=e.toString();""!==t&&"[1;5~"!==t?""!==t&&"[4;5~"!==t?""!==t&&"[1~"!==t&&"OH"!==t&&"[7~"!==t?""!==t&&"[4~"!==t&&"OF"!==t&&"[8~"!==t||E(e=>({...e,cursor: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)}},[j,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&&!j});const M=x.useMemo(()=>"running"===w.status?S.jsx(a,{label:w.runningLabel??"Working"}):"success"!==w.status?S.jsx(n,{color:"red",children:"✖ Failed"}):void 0,[w.runningLabel,w.status]),H=!(b||!v||"running"!==w.status||0!==w.log.length||w.resultText||w.errorText),F="running"===w.status&&!H||w.log.length>0||w.resultText||w.errorText||"running"!==w.status;return S.jsxs(t,{flexDirection:"column",children:[S.jsx(r,{items:["header"],children:()=>S.jsxs(t,{flexDirection:"column",flexShrink:0,children:[S.jsx(n,{color:"cyan",bold:!0,children:"Stably Agent"}),S.jsx(t,{flexDirection:"column",marginTop:1,children:S.jsx(n,{color:"gray",children:w.promptDisplay})})]},"header")}),B.length>0&&S.jsx(r,{items:B,children:e=>u(e)}),N.length>0&&S.jsx(t,{flexDirection:"column",children:N.map(e=>u(e))}),"error"===w.status&&w.errorText&&S.jsx(t,{marginTop:1,children:S.jsx(n,{color:"red",children:w.errorText})}),"success"===w.status&&w.resultText&&S.jsx(t,{marginTop:1,children:S.jsx(n,{children:w.resultText})}),F&&S.jsx(t,{flexDirection:"column",flexShrink:0,marginTop:1,children:"running"===w.status&&w.fixProgress?S.jsxs(t,{flexDirection:"column",children:[S.jsxs(t,{children:[S.jsx(a,{}),S.jsx(n,{children:" "}),S.jsx(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 S.jsxs(t,{flexDirection:"column",children:[S.jsxs(n,{children:[" ",S.jsx(a,{}),S.jsxs(n,{color:"gray",children:[r.description||"fix-worker",s>0?` (${s} ${1===s?"cycle":"cycles"})`:""]})]}),c&&S.jsxs(n,{color:"gray",dimColor:!0,children:[" • ",c.content]}),l&&S.jsxs(n,{color:"gray",dimColor:!0,children:[" ",l]})]},e.id)})]}):"success"!==w.status&&"error"!==w.status||!w.fixProgress?M:S.jsx(l,{progress:w.fixProgress})}),null!=w.permissionPrompt&&null!=y&&S.jsx(i,{onChoice:y,prompt:w.permissionPrompt}),null!=v&&null==w.permissionPrompt&&!w.isExiting&&S.jsxs(t,{borderColor:"gray",borderStyle:"round",flexDirection:"column",flexShrink:0,marginTop:1,paddingX:1,paddingY:0,children:[S.jsx(n,{color:"gray",children:"Type a message and press Enter. Press Ctrl+C to exit."}),S.jsxs(n,{children:[S.jsx(n,{color:"yellow",children:">"})," ",I.slice(0,T),S.jsx(e,{}),I.slice(T)]})]}),R&&S.jsxs(t,{marginTop:1,flexDirection:"column",children:[S.jsx(n,{color:"yellow",children:"Press Ctrl+C again to exit"}),nn&&S.jsxs(n,{color:"gray",children:["Debug log: ",cn]})]})]})}})({Cursor:l,inkComponents:{Box:r,Static:n,Text:o,useInput:i},isRawModeSupported:a,PermissionPrompt:u,Spinner:({label:e})=>{const[t,r]=x.useState(0);return x.useEffect(()=>{const e=setInterval(()=>r(e=>(e+1)%c.length),80);return()=>clearInterval(e)},[]),S.jsxs(o,{color:"yellow",children:[c[t]," ",e]})}});let p=e;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(S.jsx(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(S.jsx(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=po(e),n=fo(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}})(v,"chat"===r.mode||"init"===r.mode?{onExit:()=>ne.current(),onSend:e=>re.current(e),showSpinnerImmediately:"init"===r.mode}:"fix"===r.mode?{onExit:()=>ne.current(),isFixMode:!0}:void 0);let me=v.status;const ye=({error:e,result:t,status:r})=>{me=r,fe({error:e,result:t,status:r})};let ve;re.current=e=>{const t=e.trim();if(h&&!mn.getLogFilePath()&&mn.initSession(t||"chat"),mn.debug("User message",{text:t}),"/help"===t){I&&m&&(T=!0,b?.interrupt?.(),m.allowNextTurn(),I=!1),"running"===me&&ye({status:"success"}),le({text:e});const t=y?.();return void ce({text:t??"Help is not available in this session."})}const r=_||A&&I;if(h&&(R+=1,E=void 0,r||(U=!1,pe({label:void 0}))),m){if(r)return ye({status:"running"}),le({text:e}),void L.push(e);if(!A||I||_||(A=!1),I)return ye({status:"running"}),le({text:e}),m.pushText(e),void(P+=1);ye({status:"running"}),le({text:e}),m.pushText(e),I=!0}};const be=[];let we;const _e=await(async()=>{if("single"===r.mode||"build"===r.mode){const n=await async function(e,r){const n=t.resolve(e);if(r){const e=t.resolve(n,r);return so(e,"output-flag"),{path:e,source:"output-flag"}}const o=ro(n);if(o){const e=await async function(e){try{const t=(await g.readFile(e,"utf-8")).match(/testDir:\s*['"]([^'"]+)['"]/);return t?.[1]}catch{return}}(o);if(e){const r=t.resolve(t.dirname(o),e);if(oo(r))return so(r,"playwright.config.ts"),{path:r,source:"playwright.config.ts"}}}for(const e of no){const r=t.join(n,e);if(oo(r))return so(r,"auto-detected"),{path:r,source:"auto-detected"}}return so(n,"cwd-fallback"),{path:n,source:"cwd-fallback"}}(c,r.outputDir);return we=n.path,e=r.prompt,`${(Array.isArray(e)?e.join(" "):e).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: ${we}]`}var e;if("fix"===r.mode)try{mn.info("[fix] Fetching autoheal context",{runId:r.runId});const e=Date.now(),{context:t,autohealReportUrl:n}=await(async({authHeader:e,orgId:t,runId:r})=>{mn.debug("Fetching autoheal context",{runId:r});const n=await(o={auth:e,client:Ar(),headers:Sn(t),path:{runId:r}},(o.client??yr).get({security:[{scheme:"bearer",type:"http"}],url:"/internal/v1/cli/runs/{runId}/autoheal-context",...o}));var o;if(404===n.response.status)throw mn.warn("Autoheal context not found",{runId:r,status:404}),new Error(`Run ID "${r}" was not found.`);if(401===n.response.status)throw mn.warn("Autoheal context fetch unauthorized",{runId:r,status:401}),new Error("Unauthorized: failed to fetch autoheal context (401).");if(422===n.response.status)throw mn.warn("Autoheal context fetch invalid request",{runId:r,status:422,error:n.error?.error}),new Error(n.error?.error??"Failed to fetch autoheal context (422).");if(!n.error){const e=An.safeParse(n.data);if(e.success)return mn.debug("Autoheal context fetched successfully",{runId:r,contextSize:e.data.context.length}),{context:e.data.context,autohealReportUrl:e.data.autohealReportUrl};throw mn.warn("Autoheal context response invalid",{runId:r}),new Error("Autoheal context response missing or invalid context.")}throw mn.warn("Autoheal context fetch failed",{runId:r,error:n.error}),new Error("Failed to fetch autoheal context")})({authHeader:s,orgId:a,runId:r.runId});return mn.info("[fix] Autoheal context fetched",{runId:r.runId,durationMs:Date.now()-e,contextLength:t.length}),ve=n,F||(mn.info("[fix] Creating WebSocket progress reporter"),F=new Un({authHeader:s,orgId:a,runId:r.runId,onUserMessage:e=>{mn.info("[ws] Injecting web UI message into fix agent",{contentLength:e.length}),Y(Bi,{type:"user_message",summary:e}),W({type:"user_message",summary:e}),le({text:`[Web] ${e}`}),m.pushText(`[Message from web UI user]: ${e}`)}}),F.start(),q({phase:"initializing"})),K("STARTED"),t}catch(e){const t=e instanceof Error?e.message:"Failed to fetch autoheal context.";mn.error("[fix] Failed to fetch autoheal context",{error:t}),ye({error:t,status:"error"}),await ue(),process.exit(1)}return"init"===r.mode?"Please analyze this project and set up Playwright with the Stably SDK. Check for existing configurations and install the necessary dependencies.":""})(),Ee=await async function(e){const t=O.default.resolve(e),r=O.default.join(t,"tests"),n=O.default.join(r,"helpers"),o=O.default.join(r,"assets"),s=function(e){const t=O.default.resolve(e);if(i.existsSync(t))for(const e of Kn){const r=O.default.join(t,`playwright.config${e}`);if(i.existsSync(r))return r}}(t)??O.default.join(t,"playwright.config.ts"),a=O.default.basename(s),c=O.default.join(r,"seed.spec.ts"),[l,u,d,p,f,h]=await Promise.all([Qn({defaultContent:"Unable to read directory",dirName:"working directory",dirPath:t}),Qn({defaultContent:"Unable to read directory",dirName:"tests directory",dirPath:r}),Qn({defaultContent:"Directory does not exist yet",dirName:"helpers directory",dirPath:n}),Qn({defaultContent:"Directory does not exist yet",dirName:"assets directory",dirPath:o}),Xn({defaultContent:"File does not exist or could not be read",fileName:a,filePath:s}),Xn({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}}}(c),Ie=await(async e=>{try{const t=await Or(e,"stably.yaml");if(!t)return void mn.debug("No stably.yaml found");const r=await g.readFile(t,"utf-8");if(!r.trim())return;const n=C.parseDocument(r),o=Ui.parse(n.toJS()),s=o.agent?.fix?.maxTurnsPerIssue,i=o.agent?.fix?.maxParallelWorkers,a=!!o.agent?.fix?.rules;return mn.debug(`Loaded stably.yaml: maxTurnsPerIssue=${s??"default"}, maxParallelWorkers=${i??"default"}, hasRules=${a}`,{path:t,config:o.agent}),o}catch(e){return void mn.warn("Failed to parse stably.yaml",{error:e})}})(c),Te=Ie?.agent?.fix?.maxTurnsPerIssue,xe=Ie?.agent?.fix?.maxParallelWorkers,Se=Ie?.agent?.fix?.rules,Ae="fix"===r.mode||"single"===r.mode||"build"===r.mode,Ce="single"===r.mode||"build"===r.mode?await(async e=>{try{const t=await Or(e,"STABLY-CREATE.md");if(!t)return void mn.debug("No STABLY-CREATE.md found");const r=await g.readFile(t,"utf-8");if(!r.trim())return;return r.length>1e4?(mn.warn(`STABLY-CREATE.md exceeds max length (${r.length} > 10000), truncating`,{path:t}),r.slice(0,1e4)):(mn.debug("Loaded STABLY-CREATE.md rules",{path:t,contentLength:r.length}),r)}catch(e){return void mn.warn("Failed to read STABLY-CREATE.md",{error:e})}})(c):void 0;mn.info("[fix] Fetching system prompt and subagent definitions",{mode:r.mode,maxTurnsOverride:Te,hasCustomRules:!!Se,hasCreateRules:!!Ce});const Re=Date.now(),[Pe,Ue]=await Promise.all([Zn({allowedEnvVars:Object.keys(p),mode:r.mode,workspaceInfo:Ee,authHeader:s,customHeader:"single"===r.mode||"build"===r.mode?r.customHeader:void 0,maxParallelWorkers:"fix"===r.mode?xe:void 0}),Ae?Pi({authHeader:s,mode:r.mode,maxTurnsOverride:Te}):Promise.resolve({})]);mn.info("[fix] System prompt and subagents fetched",{durationMs:Date.now()-Re,systemPromptSize:Pe.length,subagentCount:Object.keys(Ue).length,maxTurnsOverride:Te??"default"});const Le={...p,...process.env},Oe={};for(const[e,t]of Object.entries(Le))Ri.has(e)||void 0===t||(Oe[e]=t);const ke=!0;mn.debug("AI proxy configuration",{useStablyAiProxy:ke,wantsBypassProxy:!1,wantsUseOllama:!1}),mn.info("[fix] Acquiring AI proxy key",{useStablyAiProxy:ke});const De=Date.now(),Be=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??yr).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:Ci(e,a)}}return i.data?{key:i.data.key}:{error:Ci("No data in response",a)}}catch(e){const t=e instanceof Error?e.message:"Unknown error";return{error:Ci(t)}}var s}({auth:s,client:Ar(),source:"cli"}),Ne=Be?.key;if(mn.info("[fix] AI proxy key acquired",{durationMs:Date.now()-De,success:!!Ne,hasError:!!Be?.error}),!Ne){const e=Be?.error?.message?`Unable to make AI calls: ${Be.error.message}`:"Unable to make AI calls. Check if you are authenticated.";mn.warn("Failed to get proxy API key",{error:Be?.error?.message}),ye({error:e,status:"error"}),await ue(),mn.flush(),mn.printLogFileInfo(),process.exit(1)}mn.debug("Proxy API key acquired",{success:!!Ne});const je=await xn(),$e=je?Object.fromEntries(Object.entries(Tn(je)).filter(e=>null!=e[1])):void 0,Me="init"===r.mode,He="fix"===r.mode,Fe=He?Kt.createLocal({workingDir:c}):void 0;Fe&&await Fe.captureSnapshot();const Ge=Me?Si({onComplete:()=>{ye({status:"success"}),de(),m?.finish(),process.exit(0)}}):h?Si({onRestartRequested:()=>{h&&(A=!0,ye({status:"running"}),pe({label:"Restarting browser tools..."}),E={createdAtUserMessageSeq:R,attempts:0})}}):void 0,ze=Ge?h?{"stably-agent-control":Ge}:{"session-control":Ge}:{},Ye=Me?ki:[...Li,...He?["mcp__auto-heal-report"]:[]],We=Me?ki:h?[...Oi,"mcp__stably-agent-control"]:Oi,Ve=Me?ze:He&&Fe?{"playwright-test":{args:["playwright","run-test-mcp-server"],command:"npx",env:$e},"auto-heal-report":xi({authHeader:s,diffTracker:Fe,orgId:a,runId:r.runId,workingDir:c}),...ze}:{"playwright-test":{args:["playwright","run-test-mcp-server"],command:"npx",env:$e},...ze},qe="single"===r.mode||"build"===r.mode,Ke=Me?[]:[{hooks:[async e=>{const t=Bn(e);if(!t)return{decision:"approve"};let r=!1;const n=t.map(e=>kn(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:[Fn({onResult:e=>ae({message:e})})]},{matcher:"mcp__playwright-test__test_debug",hooks:[Gn({onResult:e=>ae({message:e})})]},...qe?[{matcher:"Write",hooks:[Yn({onFileCreated:e=>{be.push(e),Z&&ee({filesCreated:[...Z.filesCreated,e]})}})]}]:[]],Je=Me?[]:[{matcher:"mcp__playwright-test__browser_type",hooks:[Hn({envVars:p})]}],Xe=Object.keys(Ue).length>0?Ue:void 0,Qe={...Oe};Qe.MCP_TOOL_TIMEOUT=String(6e5),Ne&&(Qe.ANTHROPIC_API_KEY=Ne,Qe.ANTHROPIC_BASE_URL=Ir,Qe.CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS="1");const Ze=process.env.STABLY_AGENT_MODEL??"claude-opus-4-6",et=Se?`\n\n## Custom Rules\n${Se}`:"",tt=Ce?`\n\n## Custom Test Generation Rules\n${Ce}`:"",rt=Pe+et+tt;mn.debug("[fix] Final system prompt assembled",{baseSize:Pe.length,fixRulesSize:et.length,createRulesSize:tt.length,finalSize:rt.length});const nt=()=>(mn.info("[fix] Starting SDK query",{model:Ze,tools:Ye,mcpServers:Object.keys(Ve),resumeSessionId:w??null,subagentsEnabled:!!Xe,subagentCount:Object.keys(Ue).length,useStablyAiProxy:ke,aiProxyUrl:Ir,anthropicBaseUrl:void 0}),d.query({options:{tools:Ye,allowedTools:We,betas:[],canUseTool:(e,t)=>(mn.debug("[fix] canUseTool called",{toolName:e}),Promise.resolve({behavior:"allow",updatedInput:t})),cwd:c,env:Qe,hooks:{PostToolUse:Ke,PreToolUse:Je},includePartialMessages:!0,agents:Xe,mcpServers:Ve,model:Ze,permissionMode:"default",systemPrompt:rt,...w?{resume:w}:{}},prompt:m??_e})),ot=()=>{if(m&&0!==L.length){for(const e of L)m.pushText(e);L.length=0,I=!0,ye({status:"running"})}},st=async()=>{h&&(_||(_=(async()=>{mn.info("Restarting MCP servers for chat mode"),ye({status:"running"}),pe({label:"Restarting browser tools..."});try{await(b?.interrupt?.())}catch(e){mn.warn("Failed to interrupt response during MCP restart",{error:e instanceof Error?e.message:String(e)})}await async function(){try{const{stdout:e}=await Wn('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 Wn(`pkill -KILL -P ${e} '.*' 2>/dev/null || true`)}))}catch{}}(),m?.finish(),m=new Vn,P=0,I=!1,T=!1,k.clear(),b=nt(),U=!0,pe({label:"Restarting browser tools..."}),h&&m&&E&&(E.createdAtUserMessageSeq===R?E.attempts>=1||L.length>0?E=void 0:(E.attempts+=1,m.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")),E=void 0,I=!0,ye({status:"running"})):E=void 0),ot()})().finally(()=>{_=void 0,ot()})),await _)};if(Ne){const e=Ir,t=`${e.replace(/\/$/,"")}/v1/messages`;mn.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":Ne,"anthropic-version":"2023-06-01","content-type":"application/json"},body:"{}"}),n=await e.text().catch(()=>""),o=Date.now()-r;mn.debug(`[fix] Pre-flight: ${e.status} in ${o}ms — ${n.slice(0,300)}`),401===e.status||403===e.status?mn.error(`[fix] Pre-flight: AI proxy key rejected (${e.status}) at ${t}`):mn.info("[fix] Pre-flight: AI proxy key valid",{status:e.status,durationMs:o})}catch(t){mn.error("[fix] Pre-flight: AI proxy unreachable",{error:t instanceof Error?t.message:String(t),durationMs:Date.now()-r,url:e})}}mn.info("[fix] Creating initial agent query"),mn.flush(),b=nt(),mn.info("[fix] Agent query created, entering message loop"),"chat"!==r.mode&&m.pushText(_e),ne.current=async()=>{D="CANCELED",await K("CANCELED"),q({phase:"complete",endedAt:Date.now(),isError:!1,isInterrupted:!0,currentTestDescription:null,workers:V(!0)}),F?.close(),ee({phase:"complete",endedAt:Date.now(),isError:!1,isInterrupted:!0}),Q?.close(),mn.flush(),de();try{await(b?.interrupt?.())}catch{}m?.finish(),ue()};let it=0,at=null;const ct=setInterval(()=>{const e=Date.now()-H;at?mn.info("[fix] Watchdog: message loop active",{messageCount:it,elapsed:e}):mn.info("[fix] Watchdog: waiting for first SDK message",{elapsed:e}),mn.flush()},15e3);ct.unref();try{let e=!1;for(;;){if(!b){mn.info("[fix] No response object, exiting message loop");break}e=!1,mn.info("[fix] Entering for-await on SDK response");for await(const t of b){it++,at||(at=Date.now(),mn.info("[fix] First SDK message received",{waitDurationMs:at-H,messageType:t.type,messageSubtype:"subtype"in t?t.subtype:void 0}));const n="session_id"in t&&"string"==typeof t.session_id?t.session_id:void 0;if(n&&n!==w&&(w=n,mn.debug("Captured Claude session id",{sessionId:w})),"stream_event"===t.type){const{event:e}=t;(it<=5||it%200==0)&&mn.debug("[fix] Stream event",{msgNum:it,eventType:e?.type});const r=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:t}=e;if("text_delta"===t?.type&&t.text){if(h&&A&&!r)continue;U&&(U=!1,pe({label:void 0})),r&&k.has(r)?oe({toolUseId:r,kind:"text",content:t.text}):ce({text:t.text})}}"message_stop"===e?.type&&m&&m.allowNextTurn();continue}if("assistant"===t.type){const e="parent_tool_use_id"in t&&"string"==typeof t.parent_tool_use_id?t.parent_tool_use_id:void 0,{content:n}=t.message??{};if(Array.isArray(n)&&!e){const e=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("");e&&(mn.debug("Assistant message",{text:e}),"fix"===r.mode&&(Y(Bi,{type:"ai_message",summary:e.slice(0,200)}),W({type:"ai_message",summary:e.slice(0,200)})),J&&te({type:"ai_message",summary:e.slice(0,200)}))}if(k.size>0){const r=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):[];mn.debug("Assistant message with active subagents",{hasParentToolUseId:!!e,parentToolUseId:e,activeSubagentIds:Array.from(k.keys()),toolNames:r,fullMessageKeys:Object.keys(t),rawMessage:JSON.stringify(t).slice(0,500)})}if(Array.isArray(n))for(const t of n){if("tool_use"===t?.type){if("mcp__session-control__restart_mcp_servers"===t.name||"mcp__stably-agent-control__restart_mcp_servers"===t.name){ie({rawName:t.name,toolInput:t.input});continue}if(t.name.startsWith("mcp__session-control__")||t.name.startsWith("mcp__stably-agent-control__"))continue;if(Ni(t.name))continue;if(k.size>0&&mn.debug("Tool use detected with active subagents",{toolName:t.name,hasParentToolUseId:!!e,parentToolUseId:e,wouldRouteToSubagent:!!e&&k.has(e),activeSubagentIds:Array.from(k.keys())}),"Task"===t.name){const e=t.input,n=e&&"object"==typeof e?e: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(mn.info("[fix] Subagent started",{subagentType:o,description:s,toolUseId:t.id,activeSubagentCount:k.size+1}),k.set(t.id,{subagentType:o,description:s}),se({toolUseId:t.id,subagentType:o,description:s}),"fix"===r.mode){if("triage"===o){ge?.({phase:"triage"});const e={id:t.id,testDescription:"Triage",workerType:"triage",status:"running",summary:null,startedAt:Date.now(),endedAt:null,activity:[]};q({phase:"triage",workers:[...G?.workers??[],e]})}else if("fix-worker"===o){z.add(s||t.id);const e={id:t.id,testDescription:s||t.id,workerType:"fix-worker",status:"running",summary:null,startedAt:Date.now(),endedAt:null,activity:[]};ge?.({phase:"fixing",totalTests:z.size,currentTestDescription:s||null}),q({phase:"fixing",totalTests:z.size,currentTestDescription:s||null,lastTestDescription:s||G?.lastTestDescription||null,workers:[...G?.workers??[],e]})}else"validation"===o?(ge?.({phase:"validation",currentTestDescription:null}),q({phase:"validation",currentTestDescription:null})):"context"===o&&q({currentTestDescription:s||null});W({type:"tool_call",summary:`[${o}] ${s}`.trim()})}continue}if(e&&k.has(e)){const n=ji(t.name),o=fo(t.name,t.input),s=o?`${n} (${o})`:n;if(mn.debug("Subagent tool called",{tool:t.name,parentToolUseId:e}),oe({toolUseId:e,kind:"tool",content:s}),"fix"===r.mode){W({type:"tool_call",summary:s});const t=k.get(e);"fix-worker"!==t?.subagentType&&"triage"!==t?.subagentType||Y(e,{type:"tool_call",summary:s})}continue}if(e&&mn.debug("Tool with parent_tool_use_id but no matching subagent",{tool:t.name,parentToolUseId:e,activeSubagentIds:Array.from(k.keys())}),mn.debug("Tool called",{tool:t.name,input:t.input}),ie({rawName:t.name,toolInput:t.input}),"fix"===r.mode){const e=ji(t.name),r=fo(t.name,t.input),n=r?`${e} (${r})`:e;Y(Bi,{type:"tool_call",summary:n}),W({type:"tool_call",summary:n})}if(J){const e=ji(t.name),r=fo(t.name,t.input),n=r?`${e} (${r})`:e;"initializing"===Z?.phase?ee({phase:"generating",currentActivity:n}):"mcp__playwright-test__test_run"===t.name&&"generating"===Z?.phase?ee({phase:"testing",currentActivity:n}):ee({currentActivity:n}),te({type:"tool_call",summary:n})}}if("text"===t?.type&&e&&k.has(e)){const n="string"==typeof t.text?t.text:"";if(n&&(oe({toolUseId:e,kind:"text",content:n}),"fix"===r.mode)){const t=k.get(e);"fix-worker"!==t?.subagentType&&"triage"!==t?.subagentType||Y(e,{type:"ai_message",summary:n.slice(0,200)})}}}continue}if("user"===t.type){const e="message"in t&&t.message&&"object"==typeof t.message&&"content"in t.message?t.message.content:void 0;if(Array.isArray(e))for(const t of e)if(t&&"object"==typeof t&&"type"in t&&"tool_result"===t.type&&"tool_use_id"in t){const e="string"==typeof t.tool_use_id?t.tool_use_id:void 0,n="is_error"in t&&!0===t.is_error,o="content"in t&&"string"==typeof t.content?t.content:void 0;if(mn.debug("Tool result",{toolUseId:e,isError:n,output:o?.slice(0,500)}),e&&k.has(e)){const t=k.get(e);if(mn.info("[fix] Subagent completed",{toolUseId:e,isError:n,subagentType:t?.subagentType,description:t?.description,activeSubagentCount:k.size-1}),he({toolUseId:e,status:n?"error":"complete"}),"fix"===r.mode&&"triage"===t?.subagentType){const t=n?"failed":"succeeded",r=o?o.slice(0,500):null,s=(G?.workers??[]).map(n=>n.id===e?{...n,status:t,summary:r,endedAt:Date.now()}:n);q({workers:s})}if("fix"===r.mode&&"fix-worker"===t?.subagentType){const t=n?"failed":"succeeded",r=o?o.slice(0,500):null,s=(G?.workers??[]).map(n=>n.id===e?{...n,status:t,summary:r,endedAt:Date.now()}:n);n?(ge?.({failedTests:(G?.failedTests??0)+1,currentTestDescription:null}),q({failedTests:(G?.failedTests??0)+1,currentTestDescription:null,workers:s})):(ge?.({fixedTests:(G?.fixedTests??0)+1,currentTestDescription:null}),q({fixedTests:(G?.fixedTests??0)+1,currentTestDescription:null,workers:s}))}k.delete(e)}}continue}if("result"===t.type){if(mn.info("[fix] Agent result received",{subtype:t.subtype,messageCount:it,elapsed:Date.now()-H,activeSubagents:k.size,fixedTests:G?.fixedTests,failedTests:G?.failedTests,phase:G?.phase}),f){if("success"===t.subtype){if((J||"fix"===r.mode)&&m){if(m.hasQueuedMessages()){mn.info("[ws] Queued web UI messages found, continuing agent"),I=!0,m.allowNextTurn();continue}if(await $i(m,3e3)){mn.info("[ws] Web UI message received during grace period, continuing agent"),I=!0,m.allowNextTurn();continue}m.finish()}if(ge?.({phase:"complete",currentTestDescription:null,endedAt:Date.now()}),q({phase:"complete",currentTestDescription:null,endedAt:Date.now(),isError:!1,workers:V(!1)}),ee({phase:"complete",endedAt:Date.now(),isError:!1,currentActivity:null}),qe&&be.length>0){M.default.green("Created files:");for(const e of be)M.default.green(`- ${e}`)}const e=(e,t)=>`]8;;${e}${t}]8;;`,t=ve?M.default.cyan(`📊 View Autoheal Report:\n ${e(ve,M.default.cyan(M.default.bold(M.default.underline(ve))))}`):void 0;ye({status:"success",result:t}),D="COMPLETED"}else T?(D="CANCELED",q({phase:"complete",endedAt:Date.now(),isError:!1,isInterrupted:!0,currentTestDescription:null,workers:V(!0)}),ee({phase:"complete",endedAt:Date.now(),isError:!1,isInterrupted:!0})):(ge?.({endedAt:Date.now(),isError:!0}),q({phase:"complete",endedAt:Date.now(),isError:!0,currentTestDescription:null,workers:V(!0)}),ee({phase:"complete",endedAt:Date.now(),isError:!0,currentActivity:null}),ye({error:"Run failed.",status:"error"}),process.exitCode=1,D="FAILED");T=!1;break}const n=h&&A;if("success"!==t.subtype?T||(ye({error:"Run failed.",status:"error"}),process.exitCode=1):ye(n?{status:"running"}:{status:"success"}),I=!1,T=!1,n){A=!1,mn.info("Processing deferred MCP restart request in chat mode"),await st(),e=!0;break}U=!1,pe({label:void 0}),m?.allowNextTurn(),h&&P>0&&(P-=1,I=!0,ye({status:"running"}));continue}}if(!e)break}}catch(e){T?(D="CANCELED",q({phase:"complete",endedAt:Date.now(),isError:!1,isInterrupted:!0,currentTestDescription:null,workers:V(!0)}),ee({phase:"complete",endedAt:Date.now(),isError:!1,isInterrupted:!0})):(mn.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()-H}),ye({error:`Agent encountered an error: ${e}`,status:"error"}),process.exitCode=1,D="FAILED",q({phase:"complete",endedAt:Date.now(),isError:!0,currentTestDescription:null,workers:V(!0)}),ee({phase:"complete",endedAt:Date.now(),isError:!0,currentActivity:null}),mn.flush(),mn.printLogFileInfo())}finally{if(clearInterval(ct),mn.info("[fix] Agent session ending",{finalStatus:D,elapsed:Date.now()-H,totalMessages:it}),I=!1,T=!1,process.off("uncaughtException",n),m?.finish(),D){mn.info("[fix] Reporting final autoheal status",{status:D});const e=Date.now();await K(D),mn.info("[fix] Final autoheal status reported",{durationMs:Date.now()-e})}mn.info("[fix] Closing WebSocket progress reporter"),F?.close(),Q?.close(),mn.info("[fix] Cleaning up diff tracker"),await(Fe?.cleanup()),mn.info("[fix] Running final cleanup"),await ue(),mn.info("[fix] Cleanup complete")}},Hi=F.default.object({runId:F.default.string(),timestamp:F.default.number()}),Fi="sha256",Gi=/^\/\*\*\r?\n \* @generated by stably build[\s\S]*?\*\/(?:\r?\n)*/;function zi(e){return!!e&&"object"==typeof e&&"code"in e}async function Yi({errorMessage:e,filePath:t}){try{return await H.default.readFile(t,"utf8")}catch(t){if(zi(t)&&"ENOENT"===t.code)throw new Error(e);throw t}}function Wi(e){return e.split(O.default.sep).join("/")}async function Vi(e){try{return(await H.default.readdir(e)).filter(e=>On.test(e)).map(t=>O.default.join(e,t))}catch(e){if(zi(e)&&"ENOENT"===e.code)return[];throw e}}var qi=[{args:["--trace=on"],description:"Run Playwright tests",name:"test"},{args:[],description:"Install browser dependencies",name:"install"}],Ki=["You have two different versions of @playwright/test"];function Ji(e){const[t,...r]=vi(e),n=[t,...r.slice(0,-1)].join(" ");return(t,r)=>{let o=t.toString();for(const e of qi)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 Xi({overrideArgs:e,subcommand:r}){mn.info("[test] forwardToPlaywright starting",{subcommand:r,overrideArgs:e});const n=process.argv,s=n.findIndex((e,t)=>t>1&&e===r),a=-1===s?[]:n.slice(s+1),c="--"===a[0],l=c?a.slice(1):a;if(!c&&("--help"===l[0]||"-h"===l[0]))return async function({subcommand:e}){const t=qi.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=gi();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:s}=n;if(!s)return void r("Could not determine package manager.");r("Playwright options:"),r("");const[i,...a]=vi(s),c=Ji(s);return new Promise(t=>{const r=o.spawn(i,[...a,e,"--help"],{stdio:["inherit","pipe","pipe"],env:{...process.env,...process.env.CI?{}:{FORCE_COLOR:"1"}}});r.stdout?.on("data",e=>{c(e,process.stdout)}),r.stderr?.on("data",e=>{c(e,process.stderr)}),r.on("close",()=>{t()})})}({subcommand:r});const u=e??[],d=new Set(u.map(e=>{const[t]=e.split("=");return t})),p=[];for(let e=0;e<l.length;e++){const t=l[e],[r]=t.split("=");d.has(r)?!t.includes("=")&&e+1<l.length&&!l[e+1].startsWith("-")&&e++:p.push(t)}const f=[r,...u,...p];mn.info("[test] Forwarded args computed",{forwardedArgs:f}),mn.info("[test] Resolving Stably test environment");const h=Date.now(),g="test"===r?await xn():void 0;mn.info("[test] Stably test environment resolved",{durationMs:Date.now()-h,hasCredentials:null!=g,hasWsUrl:!!g?.STABLY_WS_URL}),mn.info("[test] Setting up Stably reporter injection");const m="test"===r?function({forwardedArgs:e,hasCredentials:r}){if(!r)return console.warn("⚠️ Stably credentials not found. Test results will not be reported to Stably."),console.warn(" To enable reporting, either:"),console.warn(" • Run `npx stably login` to authenticate"),void console.warn(" • Or set STABLY_API_KEY and STABLY_PROJECT_ID environment variables\n");const n=process.cwd(),s=e=>{const r=function(e){let r=t.resolve(e);for(;;){if([t.join(r,"node_modules","@stablyai","playwright-test"),t.join(r,"node_modules",".pnpm","@stablyai+playwright-test")].some(e=>i.existsSync(e)))return!0;const e=t.dirname(r);if(e===r)return!1;r=e}}(e);return r||(console.warn("⚠️ @stablyai/playwright-test is not installed. Stably reporter will not be injected."),console.warn(" Install it with: npm install @stablyai/playwright-test"),console.warn(" Reference: ]8;;https://docs.stably.ai/getting-started/sdk-setup-guidehttps://docs.stably.ai/getting-started/sdk-setup-guide]8;;\n")),r},a=(e,r)=>{try{return function({baseConfigPath:e,projectDir:r}){const n=function(e){try{const t=o.execSync("npm pkg get type",{cwd:e,encoding:"utf-8",stdio:["pipe","pipe","pipe"]});return"module"===JSON.parse(t.trim())}catch{return!1}}(r),s=n?"mts":"ts",a=t.dirname(t.resolve(e)),c=t.basename(e),l=t.join(a,`.stably-playwright-wrapper.config.${s}`),u=`\n// Auto-generated wrapper config by Stably CLI\n// This file injects the Stably reporter and ensures trace is enabled\nimport baseConfig from './${c}';\nimport { defineConfig, stablyReporter } from '@stablyai/playwright-test';\n\n// Inline type definitions to avoid import failures when @stablyai/playwright-test is not installed\ntype StablyNotificationConfig = {\n email?: { to: string[]; notifyOnStart?: boolean; notifyOnResult?: 'all' | 'failures-only' | null } | null;\n slack?: { channelName: string; notifyOnStart?: boolean; notifyOnResult?: 'all' | 'failures-only' } | null;\n};\n\ntype ProjectNotificationConfig = {\n projectName: string;\n notifications: StablyNotificationConfig;\n};\n\n// Extract notification configs from projects that have stably.notifications defined\n// This runs at config-load time before Playwright strips custom properties\nconst extractNotificationConfigs = (): ProjectNotificationConfig[] | undefined => {\n const projects = baseConfig.projects;\n if (!projects || !Array.isArray(projects)) return undefined;\n\n const configs = projects\n .map((p: { name?: string; stably?: { notifications?: StablyNotificationConfig } }) => {\n const notifications = p.stably?.notifications;\n return notifications ? { projectName: p.name ?? '', notifications } : undefined;\n })\n .filter((config): config is ProjectNotificationConfig => config != null);\n\n return configs.length > 0 ? configs : undefined;\n};\n\nconst isStablyReporter = (reporter: unknown): boolean => {\n // Only match @stablyai npm scope to avoid false positives on unrelated reporters\n // that might contain "stably" substring (e.g., "unstably-runner")\n if (typeof reporter === 'string') {\n return reporter.includes('@stablyai');\n }\n if (Array.isArray(reporter) && typeof reporter[0] === 'string') {\n return reporter[0].includes('@stablyai');\n }\n return false;\n};\n\nconst 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 // 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 })];\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 });\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 i.existsSync(a)||i.mkdirSync(a,{recursive:!0}),i.writeFileSync(l,u,"utf-8"),function(e){const r=t.join(e,".gitignore");try{if(i.existsSync(r)){const e=i.readFileSync(r,"utf-8");if(e.split("\n").map(e=>e.trim()).includes(eo))return;const t=e.length>0&&!e.endsWith("\n");i.appendFileSync(r,`${t?"\n":""}${eo}\n`)}else i.writeFileSync(r,`${eo}\n`)}catch{}}(a),l}({baseConfigPath:e,projectDir:r})}catch{return void console.warn("⚠️ Could not create Stably wrapper config. Reporter injection skipped.")}};if(e.some(e=>"--config"===e||"-c"===e||e.startsWith("--config=")||e.startsWith("-c="))){const r=e.findIndex(e=>"--config"===e||"-c"===e);if(-1!==r&&e[r+1]){const o=t.resolve(n,e[r+1]),i=t.dirname(o);if(!s(i))return;const c=a(o,i);if(!c)return;return e[r+1]=c,c}const o=e.findIndex(e=>e.startsWith("--config=")||e.startsWith("-c="));if(-1!==o){const r=t.resolve(n,e[o].split("=")[1]),i=t.dirname(r);if(!s(i))return;const c=a(r,i);if(!c)return;const l=e[o].startsWith("--config=")?"--config=":"-c=";return e[o]=`${l}${c}`,c}}const c=ro(n);if(!c)return;const l=t.dirname(c);if(!s(l))return;const u=a(c,l);return u?(e.push("--config",u),u):void 0}({forwardedArgs:f,hasCredentials:null!=g}):void 0;mn.info("[test] Reporter injection setup complete",{hasWrapperConfig:!!m}),mn.info("[test] Spawning Playwright process"),await function(e,t={}){mn.info("[test] Detecting Playwright installation");const r=gi();mn.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[s,...i]=vi(n),a=Tn(t.env),c=[s,...i,...e];mn.info("[test] Spawning Playwright process",{command:c.join(" "),pid:process.pid});const l=Date.now(),u=o.spawn(s,[...i,...e],{stdio:["inherit","pipe","pipe"],env:{...a,...process.env.CI?{}:{FORCE_COLOR:"1"}}});mn.info("[test] Playwright process spawned",{childPid:u.pid});const d=Ji(n),p=function(){let e=!1,t="";return(r,n)=>{if(!e){t+=r,t.length>1024&&(t=t.slice(-1024));for(const r of Ki)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)}}}();u.stdout?.on("data",e=>{d(e,process.stdout)}),u.stderr?.on("data",e=>{const t=e.toString();d(e,process.stderr),p(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=>{mn.info("[test] Signal received, killing Playwright process",{signal:e,childPid:u.pid}),h(),u.kill(e);const t="SIGINT"===e?130:143;process.exit(t)};return process.on("SIGINT",g),process.on("SIGTERM",g),new Promise((e,t)=>{u.on("error",e=>{h()&&(mn.error("[test] Playwright process error",{error:e.message,childPid:u.pid}),t(e))}),u.on("close",t=>{if(!h())return;mn.info("[test] Playwright process exited",{exitCode:t,durationMs:Date.now()-l});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)})})})}(f,{env:g,onClose:()=>{var e;mn.info("[test] Playwright process closed, cleaning up wrapper config"),(e=m)&&i.existsSync(e)&&i.rmSync(e)}})}function Qi(e=""){process.stdout.write(`${e}\n`)}function Zi(...e){process.stderr.write(`${e.join(" ")}\n`)}var ea="stably",ta=`https://registry.npmjs.org/${ea}/latest`,ra=v.z.object({version:v.z.string()});function na(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 oa(e,t){const r=na(e),n=na(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 sa=O.default.join(N.default.homedir(),".stably"),ia=O.default.join(sa,"update-check.json"),aa=`https://registry.npmjs.org/${ea}/latest`,ca=v.z.object({lastCheck:v.z.number(),latestVersion:v.z.string()}),la=!1,ua=!1,da=async()=>{if(ua)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(){const e=function(){try{const e=B.default.readFileSync(ia,"utf-8");return ca.parse(JSON.parse(e))}catch{return null}}(),t=Date.now();if((null==e||t-e.lastCheck>=18e5)&&function(){const e=`\n const https = require('https');\n const fs = require('fs');\n const url = '${aa}';\n const cacheFile = ${JSON.stringify(ia)};\n const cacheDir = ${JSON.stringify(sa)};\n\n const req = https.get(url, { timeout: 5000 }, (res) => {\n if (res.statusCode !== 200) process.exit(1);\n let data = '';\n res.on('data', (chunk) => data += chunk);\n res.on('end', () => {\n try {\n const version = JSON.parse(data).version;\n if (!fs.existsSync(cacheDir)) fs.mkdirSync(cacheDir, { recursive: true });\n fs.writeFileSync(cacheFile, JSON.stringify({ lastCheck: Date.now(), latestVersion: version }));\n } catch {}\n process.exit(0);\n });\n });\n req.on('error', () => process.exit(1));\n req.on('timeout', () => { req.destroy(); process.exit(1); });\n `;try{o.spawn(process.execPath,["-e",e],{detached:!0,stdio:"ignore",windowsHide:!0}).unref()}catch{}}(),null!=e&&oa(vr,e.latestVersion)){if(la)return;la=!0;let t=!1;const r=()=>{if(t)return;t=!0;const r=`${M.default.yellow(`update available (${vr} → ${e.latestVersion})`)} - run \`${ea} upgrade\` to get the latest version\n`;try{B.default.writeSync(2,r)}catch{}};process.once("beforeExit",r),process.once("exit",r)}}(),re.cwdChanged&&mn.debug("Changed working directory",{cwd:re.newCwd});for(const e of re.envFilesLoaded)mn.debug("Loaded env file",{path:e});for(const e of re.envFileErrors)mn.warn(e);var pa=process.argv.findIndex(e=>"-v"===e||"--verbose"===e);-1!==pa&&process.argv.splice(pa,1);var fa=process.argv.findIndex(e=>"--no-telemetry"===e);-1!==fa&&process.argv.splice(fa,1),mn.info("CLI starting",{version:vr,args:process.argv.slice(2),cwd:process.cwd()}),process.on("unhandledRejection",(e,t)=>{mn.error("Unhandled promise rejection",{reason:e instanceof Error?{message:e.message,stack:e.stack}:e,promise:String(t)}),mn.flush(),mn.printLogFileInfo()}),process.on("uncaughtException",(e,t)=>{"EPIPE"!==e.code&&(mn.error("Uncaught exception",{error:{message:e.message,stack:e.stack,name:e.name},origin:t}),mn.flush(),mn.printLogFileInfo())});var ha=new r.Command;ha.name("stably").description("AI-assisted Playwright testing CLI").version(vr),ha.enablePositionalOptions(),ha.showHelpAfterError(),ha.exitOverride(),ha.configureHelp({subcommandTerm:e=>{const t=e.registeredArguments.map(e=>e.required?`<${e.name()}>`:`[${e.name()}]`).join(" ");return t?`${e.name()} ${t}`:e.name()}});var ga=[];ha.configureOutput({writeOut:e=>process.stdout.write(e),writeErr:e=>{ga.push(e)}});var ma=()=>{const e=ha.helpInformation().trimEnd();return e?`${e}\n`:""},ya=(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},va=()=>{process.stdout.write(ma())};ha.command("help [command...]").description("Show help for a command (e.g. stably help create)").action(e=>{if(!e||0===e.length)return void va();const t=ya(ha,e);if(!t)return process.stderr.write(`Unknown command: ${e.join(" ")}\n`),va(),void(process.exitCode=1);var r;r=t,process.stdout.write((e=>{const t=e.helpInformation().trimEnd();return t?`${t}\n`:""})(r))}),ha.action(()=>Mi({mode:"chat",getHelpText:ma})),ha.command("login").description("Authenticate with Stably in your browser").action(Xr),ha.command("logout").description("Clear stored Stably credentials").action(async()=>{const e=vn();e&&(m.log.warn(`Environment variables ${M.default.cyan("STABLY_API_KEY")} and ${M.default.cyan("STABLY_PROJECT_ID")} are set.`),m.log.warn("They will continue to be used for authentication even after logout."),m.log.warn("Unset them if you want to fully de-authenticate this shell/session."));const t=await Mr();if(!t)return void m.outro(e?M.default.yellow("No stored OAuth login found to clear."):M.default.yellow("You are not logged in."));const r=m.spinner();r.start("Logging out..."),await(async e=>{try{await fetch(`${_r}/api/backend/v1/logout`,{body:JSON.stringify({refresh_token:e}),headers:{"Content-Type":"application/json"},method:"POST"})}catch{}})(t.refreshToken),await Fr(),await zr(),r.stop(M.default.green("✓ Logged out")),m.outro(M.default.green("You have been logged out successfully."))}),ha.command("whoami").description("Show auth status and current project").action(async()=>{m.log.info(`${M.default.bold("CLI Version:")} ${M.default.cyan(vr)}`);const e=vn();if(e){m.log.info(M.default.dim("Authentication: Environment variables")),m.log.info(` ${M.default.bold("API Key:")} ${M.default.cyan(e.apiKey.slice(0,8))}...`),m.log.info(` ${M.default.bold("Project ID:")} ${M.default.cyan(e.projectId)}`);const t=await Mr();if(t){let e;try{e=Lr(t.accessToken).email}catch{e=void 0}m.log.warn("Stored OAuth login detected but will be ignored (env auth takes precedence)."),e&&m.log.info(` ${M.default.bold("OAuth Email:")} ${M.default.cyan(e)}`),m.log.info(` ${M.default.bold("Tip:")} Unset env vars to use OAuth`)}return void m.outro(M.default.green("Authenticated via environment variables"))}const t=await Mr();if(!t)return void m.outro(M.default.yellow("Not logged in. Run `stably login` to authenticate."));let r;try{r=Lr(t.accessToken).email}catch{r=void 0}const n=await Gr();if(!n)return m.log.info(M.default.dim("Authentication: OAuth (not linked to a project)")),r&&m.log.info(` ${M.default.bold("Email:")} ${M.default.cyan(r)}`),void m.outro(M.default.yellow("Logged in but this directory is not linked to a project. Run `stably login` to link."));const o=await(async()=>Or(process.cwd(),Br))(),s=o?O.default.dirname(o):process.cwd(),i=O.default.relative(process.cwd(),s)||".";m.log.info(M.default.dim("Authentication: OAuth")),r&&m.log.info(` ${M.default.bold("Email:")} ${M.default.cyan(r)}`),m.log.info(` ${M.default.bold("Organization:")} ${M.default.cyan(n.orgName)}`),m.log.info(` ${M.default.bold("Project:")} ${M.default.cyan(n.projectName)}`),m.log.info(` ${M.default.bold("Linked at:")} ${M.default.dim(i)}`),m.outro(M.default.green("Authenticated"))}),ha.command("build <input>").description("Compile a prompt file into a Playwright test").requiredOption("-o, --output <file>","Output file (required)").option("--force","Force regeneration even if prompt is unchanged").action(async(e,t)=>{try{await async function({force:e,input:t,output:r}){const n=process.cwd(),o=O.default.resolve(n,t),s=await async function({output:e}){const t=e.trim();if(!t)throw new Error("Output file is required. Example: -o tests/example.spec.ts");const r=O.default.resolve(process.cwd(),t);if([O.default.sep,"/"].some(e=>t.endsWith(e)))return{mode:"directory",dirPath:r};try{if((await H.default.stat(r)).isDirectory())return{mode:"directory",dirPath:r}}catch(e){if(!zi(e)||"ENOENT"!==e.code)throw e}if(!On.test(r))throw new Error(`Output file must be a valid Playwright test file (e.g., .spec.ts, .test.ts): ${e}`);return{mode:"file",filePath:r}}({output:r}),i=await Yi({filePath:o,errorMessage:`Prompt file not found: ${t}`});if(!i.trim())throw new Error(`Prompt file is empty: ${t}`);const a=function(e){const t=$.default.createHash(Fi).update(e,"utf8").digest("hex");return`${Fi}:${t}`}(i),c=Wi(O.default.relative(n,o)),l="directory"===s.mode,u=l?s.dirPath:O.default.dirname(s.filePath),d=(p=o,O.default.basename(p).replace(/\.prompt\.md$/,"").replace(/\.md$/,"").replace(/\.txt$/,""));var p;let f=l?await async function(e,t){return(await Vi(e)).find(e=>{const r=O.default.basename(e);return r.startsWith(`${t}.spec`)||r.startsWith(`${t}.test`)})}(s.dirPath,d):s.filePath;if(!e&&f&&await async function({outputFilePath:e,promptHash:t}){try{const r=function(e){const t=e.match(/^\/\*\*[\s\S]*?@prompt-hash\s+(sha256:[a-f0-9]{64})[\s\S]*?\*\//);return t?.[1]}(await H.default.readFile(e,"utf8"));return r===t}catch(e){if(zi(e)&&"ENOENT"===e.code)return!1;throw e}}({outputFilePath:f,promptHash:a}))return M.default.green("Skipped build: test code is up to date (hash unchanged)"),"skipped";const h=l?new Set(await Vi(s.dirPath)):void 0;await H.default.mkdir(u,{recursive:!0});const g=function({builtAt:e=new Date,promptFile:t,promptHash:r}){return["/**"," * @generated by stably build",` * @prompt-hash ${r}`,` * @prompt-file ${t}`,` * @built-at ${e.toISOString()}`," *",` * DO NOT EDIT MANUALLY - regenerate with: stably build ${t} --force`," */"].join("\n")}({promptFile:c,promptHash:a}),m=Wi(l?O.default.relative(n,s.dirPath)||s.dirPath:O.default.relative(n,s.filePath)),y=function(e){const{promptContent:t}=e;return["Compile this test specification into a Playwright test file.",..."file"===e.mode?[`Primary output file: ${e.outputFile}`,"","File creation rules:","- Always create/update the primary output file specified above."]:[`Output directory: ${e.outputDir}`,"","Choose output filename:",`- Look at existing test files in ${e.outputDir} to determine the naming convention.`,"- Use the same extension pattern as existing tests (e.g., .test.ts or .spec.ts).","- If no existing tests, default to .spec.ts.","- Base the filename on the prompt content (e.g., login.spec.ts for login tests).","","File creation rules:","- Create your test file in the output directory with your chosen filename."],"- You MAY create shared helper files (e.g., lib/auth.ts) if the prompt explicitly requests reusable components.","- Prefer single-file output unless shared helpers would significantly improve maintainability.","- Never modify unrelated existing files.","","Sync workflow for existing files:",`1. Check whether ${"file"===e.mode?e.outputFile:`the test file in ${e.outputDir} (based on prompt filename or matching test file)`} already exists.`,"2. If it exists, read it first and compare it against the prompt specification.","3. Apply sync rules:"," - If file does not exist: CREATE from scratch."," - If file exists and already satisfies the prompt: KEEP behavior and make minimal edits only when needed."," - If file exists but only partially matches: UPDATE only changed scenarios so code aligns with prompt."," - If file structure conflicts heavily with prompt: REGENERATE the file content completely.","4. Prompt specification is the source of truth for final test behavior.","","Test verification:","After generating the test file, run the tests locally to verify they work correctly.","Use the appropriate test command (e.g., `pnpm stably test` or the repository's test command).","If tests fail, analyze the errors and iterate on the test code until all tests pass.","","Prompt specification:",t].join("\n")}(l?{mode:"directory",outputDir:m,promptContent:i}:{mode:"file",outputFile:m,promptContent:i});await Mi({mode:"build",prompt:y,outputDir:u,customHeader:g});const v=process.exitCode;if("number"==typeof v&&0!==v)throw new Error(`Build generation failed for: ${m}`);if(l&&!f&&h&&(f=(await Vi(s.dirPath)).find(e=>!h.has(e)),!f))throw new Error(`Build finished but no new test file was created in: ${m}`);if(!f)throw new Error(`Build finished but output file was not created: ${m}`);const b=await Yi({filePath:f,errorMessage:`Build finished but output file was not created: ${m}`}),w=function(e){return e.replace(Gi,"")}(b),_=b.startsWith(g)?b:`${g}\n\n${w}`;_!==b&&await H.default.writeFile(f,_,"utf8");const E=Wi(O.default.relative(n,f));return M.default.green(`Built: ${E}`),"built"}({force:t.force??!1,input:e,output:t.output})}catch(e){const t=e instanceof Error?e.message:String(e);process.stderr.write(`${t}\n`),process.exitCode=1}}),ha.command("tunnel",{hidden:!0}).description("Expose a local server with a secure tunnel URL").option("-p, --port <number>","Local port to expose","3000").action(async e=>{m.intro(`Starting development server for port ${e.port}...`);const t=await En(),r="oauth"===t.type?`${t.auth.context.orgName}-${t.auth.context.projectName}`.toLowerCase().replace(/[^a-z0-9-]/g,""):`project-${t.auth.projectId}`.toLowerCase(),n=m.spinner();n.start("Starting development server...");const o=await R.startTunnel(`http://localhost:${e.port}`,{subdomain:r});n.stop(`Your local environment is available at: ]8;;${o.url}${M.default.underline(M.default.cyan(o.url))}]8;;`)}),ha.command("create [prompt...]").description("Generate a test from prompt (omit prompt to infer from branch diff)").option("-o, --output <dir>","Output directory for generated test files").action((e,t)=>{const r=e.length>0&&"test"===e[0]?e.slice(1):e;return Mi({mode:"single",prompt:r,outputDir:t.output})}).command("test",{hidden:!0}).description("Generate a Playwright test from a prompt (deprecated: use `stably create <prompt>` directly)").argument("<prompt...>","Prompt describing the test to generate").option("-o, --output <dir>","Output directory for generated test files").action((e,t)=>Mi({mode:"single",prompt:e,outputDir:t.output})),ha.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 o.execSync("git rev-parse --is-inside-work-tree",{cwd:e,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch{return!1}})(process.cwd())||(mn.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 mn.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(qt))if(qt[r].detect({env:e,cwd:t}))return{isCi:!0,...qt[r].configuration({env:e,cwd:t})};return{isCi:Boolean(e.CI),...(r={env:e,cwd:t},{commit:vt(r),branch:bt(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 mn.debug("Run ID detected from CI environment",{runId:r}),t(r);mn.debug("No explicit run ID or CI environment detected, checking last-run.json");const n=await(async()=>{try{const e=await Or(process.cwd(),".stably/last-run.json");if(!e)return;const t=await g.readFile(e,"utf-8");return{...Hi.parse(JSON.parse(t)),filePath:e}}catch{return}})();if(n){const e=(Date.now()-n.timestamp)/36e5;return mn.debug("Run ID found in last-run.json",{runId:n.runId,timestamp:n.timestamp,filePath:n.filePath,ageHours:Math.round(e)}),e>24&&mn.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)}mn.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)),Mi({mode:"fix",runId:t})}),ha.command("init").description("Initialize Playwright and Stably SDK in your project").action(()=>Mi({mode:"init"})),ha.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;Qi(M.default.cyan("Checking for updates...\n"));try{r=await async function(){const e=await async function(){const e=new AbortController,t=setTimeout(()=>e.abort(),1e4);t.unref();try{const t=await fetch(ta,{signal:e.signal});if(!t.ok)throw new Error(`Failed to fetch latest version: ${t.statusText}`);return ra.parse(await t.json()).version}finally{clearTimeout(t)}}();return{current:vr,latest:e,isOutdated:oa(vr,e)}}()}catch(e){return Zi(M.default.red("Failed to check for updates:"),e instanceof Error?e.message:e),void(process.exitCode=1)}if(Qi(`Current version: ${M.default.yellow(r.current)}`),Qi(`Latest version: ${M.default.green(r.latest)}`),Qi(),!r.isOutdated)return void Qi(M.default.green("✓ You are already on the latest version!"));if(Qi(M.default.yellow(`⚠ A new version is available: ${r.current} → ${r.latest}`)),Qi(),t)return Qi(M.default.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=o.execSync("npm root -g",{encoding:"utf-8"}).trim();if(e.includes(t))return"global-npm"}catch{}if(e.includes("node_modules/stably"))return"global-npm";try{const t=o.execSync("pnpm root -g",{encoding:"utf-8"}).trim();if(e.includes(t))return"global-pnpm"}catch{}try{const t=o.execSync("yarn global dir",{encoding:"utf-8"}).trim();if(e.includes(t))return"global-yarn-classic"}catch{}try{const t=o.execSync("yarn config get globalFolder",{encoding:"utf-8"}).trim();if(e.includes(t))return"global-yarn-berry"}catch{}return"unknown"}(),s=function(e){switch(e){case"global-npm":case"global-yarn-berry":case"unknown":return{command:"npm",args:["install","-g",`${ea}@latest`],description:`npm install -g ${ea}@latest`};case"global-pnpm":return{command:"pnpm",args:["add","-g",`${ea}@latest`],description:`pnpm add -g ${ea}@latest`};case"global-yarn-classic":return{command:"yarn",args:["global","add",`${ea}@latest`],description:`yarn global add ${ea}@latest`};case"npx":return{command:"npx",args:[`${ea}@latest`],description:`npx ${ea}@latest (always uses latest)`}}}(n);if("npx"===n)return Qi(M.default.dim("You are running via npx, which always fetches the latest version.")),void Qi(M.default.dim(`Simply run: ${M.default.white("npx stably")} to use the latest version.`));"unknown"===n?(Qi(M.default.yellow("Could not detect installation method. Falling back to npm.")),Qi()):"global-yarn-berry"===n&&(Qi(M.default.yellow("Yarn Berry does not support global packages. Falling back to npm.")),Qi()),Qi(`Upgrade command: ${M.default.cyan(s.description)}`),Qi(),Qi(M.default.cyan("Upgrading...")),Qi();try{await(i=s.command,a=s.args,new Promise((e,t)=>{const r=o.spawn(i,a,{stdio:"inherit",shell:"win32"===process.platform});r.on("close",r=>{0===r?e():t(new Error(`Upgrade command exited with code ${r}`))}),r.on("error",e=>{t(e)})})),Qi(),Qi(M.default.green("✓ Upgrade complete!")),Qi(M.default.dim(`Run ${M.default.white("stably --version")} to verify.`))}catch(e){Zi(M.default.red("Upgrade failed:"),e instanceof Error?e.message:e),Qi(),Qi(M.default.dim("You can try manually running:")),Qi(M.default.cyan(` ${s.description}`)),process.exitCode=1}var i,a}(e)),qi.forEach(({args:e,description:t,name:r})=>{ha.command(r).description(t).helpOption(!1).helpCommand(!1).allowUnknownOption(!0).allowExcessArguments(!0).passThroughOptions().action(()=>Xi({overrideArgs:e,subcommand:r}))});var ba=()=>{0!==ga.length&&(process.stderr.write(ga.join("")),ga=[])};(async()=>{await(async()=>{if(!ua&&"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":vr,"node.version":process.version,"os.platform":process.platform}}),ua=!0}catch{}})();try{await ha.parseAsync(process.argv),mn.info("CLI completed successfully")}catch(e){if(!(e=>!!e&&"object"==typeof e&&"code"in e)(e))throw mn.error("Unexpected CLI error",{error:e instanceof Error?e.message:String(e),stack:e instanceof Error?e.stack:void 0}),ba(),mn.flush(),mn.printLogFileInfo(),await da(),e;const t="number"==typeof e.exitCode?e.exitCode:1,r=process.argv.slice(2).find(e=>!e.startsWith("-")),n=!!r&&!!ya(ha,[r]);if(("commander.excessArguments"===e.code||"commander.unknownCommand"===e.code)&&r&&!n)return ga=[],mn.warn("Unknown command",{command:r}),process.stderr.write(`command '${r}' not found\n`),va(),void(process.exitCode=t);mn.debug("Commander error",{code:e.code,exitCode:t}),ba(),process.exitCode=t}finally{mn.flush(),await da()}})();
2
+ "use strict";var e=require("dotenv"),t=require("path"),r=require("commander"),n=require("buffer"),o=require("child_process"),s=require("process"),i=require("fs"),a=require("url"),c=require("os");require("timers/promises");var l=require("stream"),u=require("util"),d=require("@anthropic-ai/claude-agent-sdk"),p=require("crypto"),f=require("picocolors"),h=require("simple-git"),g=require("fs/promises"),m=require("@clack/prompts"),y=require("readline/promises"),v=require("zod"),b=require("open"),w=require("http"),_=require("pino"),E=require("sonic-boom"),I=require("zod/v3"),T=require("ws"),x=require("react"),S=require("react/jsx-runtime"),A=require("module"),C=require("yaml"),R=require("@stablyhq/runner-sdk"),P="undefined"!=typeof document?document.currentScript:null;function U(e){return e&&e.__esModule?e:{default:e}}var L,O,D=U(t),k=U(o),B=U(s),N=U(i),j=U(c),$=U(l),M=U(p),H=U(f),F=U(g),G=U(v),z=U(b),Y=U(w),W=U(_),V=U(E),q=U(T),K=Object.create,J=Object.defineProperty,X=Object.getOwnPropertyDescriptor,Q=Object.getOwnPropertyNames,Z=Object.getPrototypeOf,ee=Object.prototype.hasOwnProperty,te=(e=>"undefined"!=typeof require?require:"undefined"!=typeof Proxy?new Proxy(e,{get:(e,t)=>("undefined"!=typeof require?require:e)[t]}):e)(function(e){if("undefined"!=typeof require)return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')}),re=(L={"../playwright-trace-scrubber/node_modules/.pnpm/isbinaryfile@5.0.7/node_modules/isbinaryfile/lib/index.js"(e){Object.defineProperty(e,"__esModule",{value:!0}),e.isBinaryFileSync=e.isBinaryFile=void 0;var t=te("fs"),r=te("util"),n=(0,r.promisify)(t.stat),o=(0,r.promisify)(t.open),s=(0,r.promisify)(t.close),i=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){const t=new Array;for(let r=0;r<e;r++){if(this.error)return t;t[r]=this.nextByte()}return t}};function a(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 c(e){switch(7&a(e)){case 0:return a(e),!0;case 1:return e.next(8),!0;case 2:const t=a(e);return e.next(t),!0;case 5:return e.next(4),!0}return!1}function l(e,t){if(0===t)return!1;let r=0;const n=Math.min(t,515),o=Math.min(n,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(n>=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;for(let t=0;t<o;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<n){if(t++,e[t]>=128&&e[t]<=191)continue}else if(e[t]>=224&&e[t]<=239&&t+2<n){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<n&&(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(r++,t>=32&&100*r/o>10)return!0}}return 100*r/o>10||!!(r>1&&function(e,t){const r=new i(e,t);let n=0;for(;;){if(!c(r)&&!r.hasError())return!1;if(r.hasError())break;n++}return n>0}(e,o))}function u(e){return"string"==typeof e}function d(e){if(!e.isFile())throw new Error("Path provided was not a file!")}e.isBinaryFile=async function(e,r){if(u(e)){d(await n(e));const r=await o(e,"r"),i=Buffer.alloc(515);return new Promise((e,n)=>{t.read(r,i,0,515,0,(t,o,a)=>{if(s(r),t)n(t);else try{e(l(i,o))}catch(e){n(e)}})})}return void 0===r&&(r=e.length),l(e,r)},e.isBinaryFileSync=function(e,r){if(u(e)){d(t.statSync(e));const r=t.openSync(e,"r"),n=Buffer.alloc(515),o=t.readSync(r,n,0,515,0);return t.closeSync(r),l(n,o)}return void 0===r&&(r=e.length),l(e,r)}}},function(){return O||(0,L[Q(L)[0]])((O={exports:{}}).exports,O),O.exports}),ne={cwdChanged:!1,newCwd:void 0,envFilesLoaded:[],envFileErrors:[]},oe=process.argv.findIndex(e=>"-C"===e||"--cwd"===e);if(-1!==oe&&process.argv[oe+1]){const e=process.argv[oe+1];process.chdir(e),ne.cwdChanged=!0,ne.newCwd=e,process.argv.splice(oe,2)}for(var se=[],ie=0;ie<process.argv.length;)if("--env-file"===process.argv[ie]){const e=process.argv[ie+1];e&&!e.startsWith("-")?(se.push(e),process.argv.splice(ie,2)):ie++}else ie++;for(const t of se){const r=D.default.resolve(process.cwd(),t),n=e.config({path:r,override:!0,quiet:!0});if(n.error){const e=`warning: could not load env file: ${r} (${n.error.message})`;ne.envFileErrors.push(e),process.stderr.write(`${e}\n`)}else ne.envFilesLoaded.push(r)}var ae={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 ce(e){return(/\d+(?!.*\d+)/.exec(e)||[])[0]}function le(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:le(r?e.SYSTEM_PULLREQUEST_TARGETBRANCH:e.BUILD_SOURCEBRANCH),pr:t,isPr:r,prBranch:le(r?e.SYSTEM_PULLREQUEST_SOURCEBRANCH:void 0),root:e.BUILD_REPOSITORY_LOCALPATH}}},de={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})},pe={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})},fe={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}}},he={detect:({env:e})=>Boolean(e.BUDDY_WORKSPACE_ID),configuration({env:e}){const t=ce(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}}},ge="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function me(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var ye,ve,be,we,_e,Ee,Ie,Te,xe={exports:{}};var Se,Ae,Ce,Re,Pe,Ue,Le,Oe,De,ke,Be,Ne,je,$e,Me,He={exports:{}},Fe={};function Ge(){if(Ne)return Be;Ne=1;const e=D.default,t=function(){if(Ce)return Ae;Ce=1;const e=D.default,t=function(){if(Te)return Ie;Te=1;const e="win32"===process.platform||"cygwin"===process.env.OSTYPE||"msys"===process.env.OSTYPE,t=D.default,r=e?";":":",n=function(){if(Ee)return _e;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 Ee=1,e="win32"===process.platform||ge.TESTING_WINDOWS?function(){if(ve)return ye;ve=1,ye=r,r.sync=function(r,n){return t(e.statSync(r),r,n)};var e=N.default;function t(e,t,r){return!(!e.isSymbolicLink()&&!e.isFile())&&function(e,t){var r=void 0!==t.pathExt?t.pathExt:process.env.PATHEXT;if(!r)return!0;if(-1!==(r=r.split(";")).indexOf(""))return!0;for(var n=0;n<r.length;n++){var o=r[n].toLowerCase();if(o&&e.substr(-o.length).toLowerCase()===o)return!0}return!1}(t,r)}function r(r,n,o){e.stat(r,function(e,s){o(e,!e&&t(s,r,n))})}return ye}():function(){if(we)return be;we=1,be=t,t.sync=function(t,n){return r(e.statSync(t),n)};var e=N.default;function t(t,n,o){e.stat(t,function(e,t){o(e,!e&&r(t,n))})}function r(e,t){return e.isFile()&&function(e,t){var r=e.mode,n=e.uid,o=e.gid,s=void 0!==t.uid?t.uid:process.getuid&&process.getuid(),i=void 0!==t.gid?t.gid:process.getgid&&process.getgid(),a=parseInt("100",8),c=parseInt("010",8);return r&parseInt("001",8)||r&c&&o===i||r&a&&n===s||r&(a|c)&&0===s}(e,t)}return be}(),_e=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}},_e}(),o=e=>Object.assign(new Error(`not found: ${e}`),{code:"ENOENT"}),s=(t,n)=>{const o=n.colon||r,s=t.match(/\//)||e&&t.match(/\\/)?[""]:[...e?[process.cwd()]:[],...(n.path||process.env.PATH||"").split(o)],i=e?n.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",a=e?i.split(o):[""];return e&&-1!==t.indexOf(".")&&""!==a[0]&&a.unshift(""),{pathEnv:s,pathExt:a,pathExtExe:i}},i=(e,r,i)=>{"function"==typeof r&&(i=r,r={}),r||(r={});const{pathEnv:a,pathExt:c,pathExtExe:l}=s(e,r),u=[],d=n=>new Promise((s,i)=>{if(n===a.length)return r.all&&u.length?s(u):i(o(e));const c=a[n],l=/^".*"$/.test(c)?c.slice(1,-1):c,d=t.join(l,e),f=!l&&/^\.[\\\/]/.test(e)?e.slice(0,2)+d:d;s(p(f,n,0))}),p=(e,t,o)=>new Promise((s,i)=>{if(o===c.length)return s(d(t+1));const a=c[o];n(e+a,{pathExt:l},(n,i)=>{if(!n&&i){if(!r.all)return s(e+a);u.push(e+a)}return s(p(e,t,o+1))})});return i?d(0).then(e=>i(null,e),i):d(0)};return Ie=i,i.sync=(e,r)=>{r=r||{};const{pathEnv:i,pathExt:a,pathExtExe:c}=s(e,r),l=[];for(let o=0;o<i.length;o++){const s=i[o],u=/^".*"$/.test(s)?s.slice(1,-1):s,d=t.join(u,e),p=!u&&/^\.[\\\/]/.test(e)?e.slice(0,2)+d:d;for(let e=0;e<a.length;e++){const t=p+a[e];try{if(n.sync(t,{pathExt:c})){if(!r.all)return t;l.push(t)}}catch(e){}}}if(r.all&&l.length)return l;if(r.nothrow)return null;throw o(e)},Ie}(),r=function(){if(Se)return He.exports;Se=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 He.exports=e,He.exports.default=e,He.exports}();function n(n,o){const s=n.options.env||process.env,i=process.cwd(),a=null!=n.options.cwd,c=a&&void 0!==process.chdir&&!process.chdir.disabled;if(c)try{process.chdir(n.options.cwd)}catch(e){}let l;try{l=t.sync(n.command,{path:s[r({env:s})],pathExt:o?e.delimiter:void 0})}catch(e){}finally{c&&process.chdir(i)}return l&&(l=e.resolve(a?n.options.cwd:"",l)),l}return Ae=function(e){return n(e)||n(e,!0)}}(),r=function(){if(Re)return Fe;Re=1;const e=/([()\][%!^"`<>&|;, *?])/g;return Fe.command=function(t){return t.replace(e,"^$1")},Fe.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},Fe}(),n=function(){if(ke)return De;ke=1;const e=N.default,t=function(){if(Oe)return Le;Oe=1;const e=Ue?Pe:(Ue=1,Pe=/^#!(.*)/);return Le=(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 De=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())},De}(),o="win32"===process.platform,s=/\.(?:com|exe)$/i,i=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;return Be=function(a,c,l){c&&!Array.isArray(c)&&(l=c,c=null);const u={command:a,args:c=c?c.slice(0):[],options:l=Object.assign({},l),file:void 0,original:{command:a,args:c}};return l.shell?u:function(a){if(!o)return a;const c=function(e){e.file=t(e);const r=e.file&&n(e.file);return r?(e.args.unshift(e.file),e.command=r,t(e)):e.file}(a),l=!s.test(c);if(a.options.forceShell||l){const t=i.test(c);a.command=e.normalize(a.command),a.command=r.command(a.command),a.args=a.args.map(e=>r.argument(e,t));const n=[a.command].concat(a.args).join(" ");a.args=["/d","/s","/c",`"${n}"`],a.command=process.env.comspec||"cmd.exe",a.options.windowsVerbatimArguments=!0}return a}(u)}}var ze=me(function(){if(Me)return xe.exports;Me=1;const e=k.default,t=Ge(),r=function(){if($e)return je;$e=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 je={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},je}();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 xe.exports=n,xe.exports.spawn=n,xe.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},xe.exports._parse=t,xe.exports._enoent=r,xe.exports}());function Ye(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 We=(e,t)=>({name:`SIGRT${t+1}`,number:Ve+t,action:"terminate",description:"Application-specific signal (realtime)",standard:"posix"}),Ve=34,qe=[{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"}],Ke=()=>{const e=(()=>{const e=64-Ve+1;return Array.from({length:e},We)})();return[...qe,...e].map(Je)},Je=({name:e,number:t,description:r,action:n,forced:o=!1,standard:s})=>{const{signals:{[e]:i}}=c.constants,a=void 0!==i;return{name:e,number:a?i:t,description:r,supported:a,action:n,forced:o,standard:s}},Xe=({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}],Qe=(()=>{const e=Ke();return Object.fromEntries(e.map(Xe))})();(()=>{const e=Ke(),t=Array.from({length:65},(t,r)=>((e,t)=>{const r=((e,t)=>{const r=t.find(({name:t})=>c.constants.signals[t]===e);return void 0!==r?r:t.find(t=>t.number===e)})(e,t);if(void 0===r)return{};const{name:n,description:o,supported:s,action:i,forced:a,standard:l}=r;return{[e]:{name:n,number:e,description:o,supported:s,action:i,forced:a,standard:l}}})(r,e));Object.assign({},...t)})();var Ze=({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=B.default.cwd()}}})=>{s=null===s?void 0:s;const f=void 0===(o=null===o?void 0:o)?void 0:Qe[o].description,h=(({timedOut:e,timeout:t,errorCode:r,signal:n,signalDescription:o,exitCode:s,isCanceled:i})=>e?`timed out after ${t} milliseconds`:void 0!==r?`failed with ${r}`:void 0!==n?`was killed with ${n} (${o})`:void 0!==s?`failed with exit code ${s}`:"failed")({timedOut:c,timeout:d,errorCode:n&&n.code,signal:o,signalDescription:f,exitCode:s,isCanceled:l}),g=`Command ${h}: ${i}`,m="[object Error]"===Object.prototype.toString.call(n),y=m?`${g}\n${n.message}`:g,v=[y,t,e].filter(Boolean).join("\n");return m?(n.originalMessage=n.message,n.message=v):n=new Error(v),n.shortMessage=y,n.command=i,n.escapedCommand=a,n.exitCode=s,n.signal=o,n.signalDescription=f,n.stdout=e,n.stderr=t,n.cwd=p,void 0!==r&&(n.all=r),"bufferedData"in n&&delete n.bufferedData,n.failed=!0,n.timedOut=Boolean(c),n.isCanceled=l,n.killed=u&&!c,n},et=["stdin","stdout","stderr"],tt=[];tt.push("SIGHUP","SIGINT","SIGTERM"),"win32"!==process.platform&&tt.push("SIGALRM","SIGABRT","SIGVTALRM","SIGXCPU","SIGXFSZ","SIGUSR2","SIGTRAP","SIGSYS","SIGQUIT","SIGIOT"),"linux"===process.platform&&tt.push("SIGIO","SIGPOLL","SIGPWR","SIGSTKFLT");var rt,nt,ot=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"),it=globalThis,at=Object.defineProperty.bind(Object),ct=class{emitted={afterExit:!1,exit:!1};listeners={afterExit:[],exit:[]};count=0;id=Math.random();constructor(){if(it[st])return it[st];at(it,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}},lt=class{},ut=globalThis.process;ot(ut)?new class extends lt{#e="win32"===ut.platform?"SIGINT":"SIGHUP";#t=new ct;#r;#n;#o;#s={};#i=!1;constructor(e){super(),this.#r=e,this.#s={};for(const t of tt)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(!ot(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 tt)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,tt.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 ot(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&&ot(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 lt{onExit(){return()=>{}}load(){}unload(){}},new TextEncoder,function(){if(nt)return rt;nt=1;const{PassThrough:e}=$.default;rt=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 dt=(async()=>{})().constructor.prototype;["then","catch","finally"].map(e=>[e,Reflect.getOwnPropertyDescriptor(dt,e)]);var pt=(e,t=[])=>Array.isArray(t)?[e,...t]:[e],ft=/^[\w.-]+$/,ht=u.debuglog("execa").enabled,gt=(e,t)=>String(e).padStart(t,"0"),mt=(e,t,r={})=>{const n=ze._parse(e,t,r);return e=n.command,t=n.args,(r={maxBuffer:1e8,buffer:!0,stripFinalNewline:!0,extendEnv:!0,preferLocal:!1,localDir:(r=n.options).cwd||B.default.cwd(),execPath:B.default.execPath,encoding:"utf8",reject:!0,cleanup:!0,all:!1,windowsHide:!0,verbose:ht,...r}).env=(({env:e,extendEnv:t,preferLocal:r,localDir:n,execPath:o})=>{const s=t?{...B.default.env,...e}:e;return r?(({env:e=B.default.env,...t}={})=>{const r=Ye({env:e={...e}});return t.path=e[r],e[r]=(({cwd:e=B.default.cwd(),path:t=B.default.env[Ye()],preferLocal:r=!0,execPath:n=B.default.execPath,addExecPath:o=!0}={})=>{const s=e instanceof URL?a.fileURLToPath(e):e,i=D.default.resolve(s),c=[];return r&&((e,t)=>{let r;for(;r!==t;)e.push(D.default.join(t,"node_modules/.bin")),r=t,t=D.default.resolve(t,"..")})(c,i),o&&((e,t,r)=>{const n=t instanceof URL?a.fileURLToPath(t):t;e.push(D.default.resolve(r,n,".."))})(c,n,i),[...c,t].join(D.default.delimiter)})(t),e})({env:s,cwd:n,execPath:o}):s})(r),r.stdio=(e=>{if(!e)return;const{stdio:t}=e;if(void 0===t)return 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])})(r),"win32"===B.default.platform&&"cmd"===D.default.basename(e,".exe")&&t.unshift("/q"),{file:e,args:t,options:r,parsed:n}},yt=(e,t,r)=>"string"==typeof t||n.Buffer.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 vt(e,t,r){const n=mt(e,t,r),o=((e,t)=>pt(e,t).join(" "))(e,t),s=((e,t)=>pt(e,t).map(e=>(e=>"string"!=typeof e||ft.test(e)?e:`"${e.replaceAll('"','\\"')}"`)(e)).join(" "))(e,t);((e,{verbose:t})=>{t&&B.default.stderr.write(`[${(()=>{const e=new Date;return`${gt(e.getHours(),2)}:${gt(e.getMinutes(),2)}:${gt(e.getSeconds(),2)}.${gt(e.getMilliseconds(),3)}`})()}] ${e}\n`)})(s,n.options);const a=(e=>{const t=(({input:e,inputFile:t})=>"string"!=typeof t?e:((e=>{if(void 0!==e)throw new TypeError("The `input` and `inputFile` options cannot be both set.")})(e),i.readFileSync(t)))(e);if(null!==(r=t)&&"object"==typeof r&&"function"==typeof r.pipe)throw new TypeError("The `input` option cannot be a stream in sync mode");var r;return t})(n.options);let c;try{c=k.default.spawnSync(n.file,n.args,{...n.options,input:a})}catch(e){throw Ze({error:e,stdout:"",stderr:"",all:"",command:o,escapedCommand:s,parsed:n,timedOut:!1,isCanceled:!1,killed:!1})}const l=yt(n.options,c.stdout,c.error),u=yt(n.options,c.stderr,c.error);if(c.error||0!==c.status||null!==c.signal){const e=Ze({stdout:l,stderr:u,error:c.error,signal:c.signal,exitCode:c.status,command:o,escapedCommand:s,parsed:n,timedOut:c.error&&"ETIMEDOUT"===c.error.code,isCanceled:!1,killed:null!==c.signal});if(!n.options.reject)return e;throw e}return{command:o,escapedCommand:s,exitCode:0,stdout:l,stderr:u,failed:!1,timedOut:!1,isCanceled:!1,killed:!1}}function bt(e){try{return vt("git",["rev-parse","HEAD"],e).stdout}catch{return}}function wt(e){try{const t=vt("git",["rev-parse","--abbrev-ref","HEAD"],e).stdout;if("HEAD"===t){const t=vt("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 _t=/^(?:.*)@(?:.*):(?:\d+\/)?(.*)\.git$/,Et=/^\/(.*)\.git$/;function It(e){if(e){if(e.match(_t))return e.replace(_t,"$1");try{return new URL(e).pathname.replace(Et,"$1")}catch{return}}}var Tt,xt={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:It(e.BUILDKITE_REPO),pr:t,isPr:r,prBranch:r?e.BUILDKITE_BRANCH:void 0,root:e.BUILDKITE_BUILD_CHECKOUT_PATH}}},St={detect:({env:e})=>Boolean(e.CIRCLECI),configuration({env:e}){const t=e.CIRCLE_PR_NUMBER||ce(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}`}}},At="https://cirrus-ci.com",Ct={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:`${At}/build/${e.CIRRUS_BUILD_ID}`,job:e.CIRRUS_TASK_ID,jobUrl:`${At}/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}}},Rt={detect:({env:e})=>Boolean(e.CODEBUILD_BUILD_ID),configuration:({env:e,cwd:t})=>({name:"AWS CodeBuild",service:"codebuild",commit:bt({env:e,cwd:t}),build:e.CODEBUILD_BUILD_ID,branch:wt({env:e,cwd:t}),buildUrl:`https://console.aws.amazon.com/codebuild/home?region=${e.AWS_REGION}#/builds/${e.CODEBUILD_BUILD_ID}/view/new`,root:e.PWD})},Pt={detect:({env:e})=>Boolean(e.CF_BUILD_ID),configuration({env:e}){const t=e.CF_PULL_REQUEST_NUMBER,r=Boolean(t);return{name:"Codefresh",service:"codefresh",commit:e.CF_REVISION,build:e.CF_BUILD_ID,buildUrl:e.CF_BUILD_URL,branch:r?e.CF_PULL_REQUEST_TARGET:e.CF_BRANCH,pr:t,isPr:r,prBranch:r?e.CF_BRANCH:void 0,slug:`${e.CF_REPO_OWNER}/${e.CF_REPO_NAME}`,root:e.CF_VOLUME_PATH}}},Ut={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}}},Lt=({env:e})=>{try{const t=e.GITHUB_EVENT_PATH?JSON.parse(i.readFileSync(e.GITHUB_EVENT_PATH,"utf-8")):void 0;if(t&&t.pull_request)return{branch:t.pull_request.base?le(t.pull_request.base.ref):void 0,pr:t.pull_request.number}}catch{}return{pr:void 0,branch:void 0}},Ot={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=le("pull_request_target"===e.GITHUB_EVENT_NAME?`refs/pull/${(e=>{const t=e.GITHUB_EVENT_PATH?JSON.parse(i.readFileSync(e.GITHUB_EVENT_PATH,"utf-8")):void 0;return t&&t.pull_request?t.pull_request.number:void 0})(e)}/merge`:e.GITHUB_REF);return{name:"GitHub Actions",service:"github",commit:e.GITHUB_SHA,build:e.GITHUB_RUN_ID,buildUrl:`${e.GITHUB_SERVER_URL}/${e.GITHUB_REPOSITORY}/actions/runs/${e.GITHUB_RUN_ID}`,isPr:r,branch:n,prBranch:r?n:void 0,slug:e.GITHUB_REPOSITORY,root:e.GITHUB_WORKSPACE,...r?Lt({env:e}):void 0}}},Dt={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}}},kt={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||bt({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}}},Bt={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}}},Nt={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})},jt={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}}},$t={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}}},Mt={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}}},Ht={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||bt({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}}},Ft={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}}},Gt={};function zt(){if(Tt)return Gt;Tt=1,Object.defineProperty(Gt,"__esModule",{value:!0}),Gt.of=Gt.PropertiesFile=void 0;var e,t=(e=N.default)&&e.__esModule?e:{default:e};class r{constructor(...e){this.objs={},e.length&&this.of.apply(this,e)}makeKeys(e){if(e&&0!==e.indexOf("#")){let t=["=",":"].map(t=>e.indexOf(t)).filter(e=>e>-1),r=Math.min(...t),n=e.substring(0,r).trim(),o=e.substring(r+1).trim();if(this.objs.hasOwnProperty(n))if(Array.isArray(this.objs[n]))this.objs[n].push(o);else{let e=this.objs[n];this.objs[n]=[e,o]}else{const e=o.replace(/"/g,'\\"').replace(/\\:/g,":").replace(/\\=/g,"=");this.objs[n]=unescape(JSON.parse('"'+e+'"'))}}}addFile(e){let r=t.default.readFileSync(e,"utf-8").split(/\r?\n/),n=this;for(let e=0;e<r.length;e++){let t=r[e];for(;"\\"===t.substring(t.length-1);)t=t.slice(0,-1),t+=r[e+1].trim(),e++;n.makeKeys(t)}}of(...e){for(let t=0;t<e.length;t++)this.addFile(e[t])}get(e,t){if(this.objs.hasOwnProperty(e)){if(Array.isArray(this.objs[e])){let t=[];for(let r=0;r<this.objs[e].length;r++)t[r]=this.interpolate(this.objs[e][r]);return t}return void 0===this.objs[e]?"":this.interpolate(this.objs[e])}return t}getLast(e,t){if(this.objs.hasOwnProperty(e)){if(Array.isArray(this.objs[e])){var r=this.objs[e].length;return this.interpolate(this.objs[e][r-1])}return void 0===this.objs[e]?"":this.interpolate(this.objs[e])}return t}getFirst(e,t){return this.objs.hasOwnProperty(e)?Array.isArray(this.objs[e])?this.interpolate(this.objs[e][0]):void 0===this.objs[e]?"":this.interpolate(this.objs[e]):t}getInt(e,t){let r=this.getLast(e);return r?parseInt(r,10):t}getFloat(e,t){let r=this.getLast(e);return r?parseFloat(r):t}getBoolean(e,t){let r=this.getLast(e);return r?!/^(false|0)$/i.test(n=r)&&!!n:t||!1;var n}set(e,t){this.objs[e]=t}interpolate(e){let t=this;return e.replace(/\\\\/g,"\\").replace(/\$\{([A-Za-z0-9\.\-\_]*)\}/g,function(e){return t.getLast(e.substring(2,e.length-1))})}getKeys(){let e=[];for(let t in this.objs)e.push(t);return e}getMatchingKeys(e){let t=[];for(let r in this.objs)-1!==r.search(e)&&t.push(r);return t}reset(){this.objs={}}}return Gt.PropertiesFile=r,Gt.of=function(...e){let t=new r;return t.of.apply(t,e),t},Gt}var Yt=me(zt()),Wt={root:"teamcity.build.workingDir",branch:"teamcity.build.branch"},Vt=e=>{try{return Yt.of(e)}catch{return}},qt=({env:e,cwd:t})=>{const r=e.TEAMCITY_BUILD_PROPERTIES_FILE?Vt(e.TEAMCITY_BUILD_PROPERTIES_FILE):void 0,n=r?r.get("teamcity.configuration.properties.file"):void 0,o=n?Vt(n):n;return Object.fromEntries(Object.keys(Wt).map(n=>[n,(r?r.get(Wt[n]):void 0)||(o?o.get(Wt[n]):void 0)||("branch"===n?wt({env:e,cwd:t}):void 0)]))},Kt={appveyor:ae,azurePipelines:ue,bamboo:de,bitbucket:pe,bitrise:fe,buddy:he,buildkite:xt,circleci:St,cirrus:Ct,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:Rt,codefresh:Pt,codeship:{detect:({env:e})=>e.CI_NAME&&"codeship"===e.CI_NAME,configuration:({env:e})=>({name:"Codeship",service:"codeship",build:e.CI_BUILD_NUMBER,buildUrl:e.CI_BUILD_URL,commit:e.CI_COMMIT_ID,branch:e.CI_BRANCH,slug:e.CI_REPO_NAME})},drone:Ut,github:Ot,gitlab:Dt,jenkins:kt,netlify:Bt,puppet:Nt,sail:jt,screwdriver:$t,scrutinizer:Mt,semaphore:Ht,shippable:Ft,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,...qt({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:le(e.JB_SPACE_GIT_BRANCH),slug:t&&r?`${t.toLowerCase()}/${r}`:void 0}}}},Jt=class e{git;config;snapshotTreeHash;snapshotIndexPath;constructor(e){this.config=e,this.git=h.simpleGit({baseDir:e.workingDir,maxConcurrentProcesses:1})}static createLocal({workingDir:t}){return new e({mode:"local",workingDir:t})}static createCloud({workingDir:t,baseBranch:r}){return new e({mode:"cloud",workingDir:t,baseBranch:r})}async captureSnapshot(){if("local"!==this.config.mode)return;this.snapshotIndexPath=t.join(c.tmpdir(),`git-diff-tracker-${p.randomUUID()}.index`),await this.git.env("GIT_INDEX_FILE",this.snapshotIndexPath).add(["-A"]);const e=await this.git.env("GIT_INDEX_FILE",this.snapshotIndexPath).raw(["write-tree"]);this.snapshotTreeHash=e.trim()}async computeDiff(){return"local"===this.config.mode?this.computeLocalDiff():this.computeCloudDiff()}async computeLocalDiff(){if(!this.snapshotTreeHash)throw new Error("No snapshot captured. Call captureSnapshot() first.");const e=t.join(c.tmpdir(),`git-diff-tracker-${p.randomUUID()}.index`);try{await this.git.env("GIT_INDEX_FILE",e).add(["-A"]);const t=(await this.git.env("GIT_INDEX_FILE",e).raw(["write-tree"])).trim();return await this.git.raw(["diff-tree","-p","--no-color",this.snapshotTreeHash,t])}finally{await Xt(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 Xt(this.snapshotIndexPath),this.snapshotIndexPath=void 0),this.snapshotTreeHash=void 0}};async function Xt(e){try{await g.unlink(e)}catch{}}var Qt="x-stably-org-id",Zt={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):tr({allowReserved:e,name:r,value:t})).join(s);return"label"===n||"matrix"===n?s+i:i},tr=({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)}`},rr=({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])=>tr({allowReserved:e,name:"deepObject"===n?`${r}[${t}]`:t,value:o})).join(i);return"label"===n||"matrix"===n?i+a:a},nr=/\{[^{}]+\}/g;function or(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,ir=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},ar=({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=rr({allowReserved:i.allowReserved,explode:!0,name:o,style:"deepObject",value:s,...i.object});e&&n.push(e)}else{const e=tr({allowReserved:i.allowReserved,name:o,value:s});e&&n.push(e)}}return n.join("&")},cr=(e,t)=>!!t&&!!(e.headers.has(t)||e.query?.[t]||e.headers.get("Cookie")?.includes(`${t}=`)),lr=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(nr);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,rr({explode:n,name:o,style:s,value:i,valueOnly:!0}));continue}if("matrix"===s){r=r.replace(t,`;${tr({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:ar(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=pr(e.headers,t.headers),r},dr=e=>{const t=[];return e.forEach((e,r)=>{t.push([r,e])}),t},pr=(...e)=>{const t=new Headers;for(const r of e){if(!r)continue;const e=r instanceof Headers?dr(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},fr=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}},hr=ar({allowReserved:!1,array:{explode:!0,style:"form"},object:{explode:!0,style:"deepObject"}}),gr={"Content-Type":"application/json"},mr=(e={})=>({...Zt,headers:gr,parseAs:"auto",querySerializer:hr,...e}),yr=(e={})=>{let t=ur(mr(),e);const r=()=>({...t}),n={error:new fr,request:new fr,response:new fr},o=async e=>{const r={...t,...e,fetch:e.fetch??t.fetch??globalThis.fetch,headers:pr(t.headers,e.headers),serializedBody:void 0};return r.security&&await(async({security:e,...t})=>{for(const r of e){if(cr(t,r.name))continue;const e=await ir(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:lr(r)}},s=async e=>{const{opts:t,url:r}=await o(e),s={redirect:"follow",...t,body:or(t)};let i=new Request(r,s);for(const e of n.request.fns)e&&(i=await e(i,t));const a=t.fetch;let c;try{c=await a(i)}catch(e){let r=e;for(const o of n.error.fns)o&&(r=await o(e,void 0,i,t));if(r=r||{},t.throwOnError)throw r;return"data"===t.responseStyle?void 0:{error:r,request:i,response:void 0}}for(const e of n.response.fns)e&&(c=await e(c,i,t));const l={request:i,response:c};if(c.ok){const e=("auto"===t.parseAs?(e=>{if(!e)return"stream";const t=e.split(";")[0]?.trim();return t?t.startsWith("application/json")||t.endsWith("+json")?"json":"multipart/form-data"===t?"formData":["application/","audio/","image/","video/"].some(e=>t.startsWith(e))?"blob":t.startsWith("text/")?"text":void 0:void 0})(c.headers.get("Content-Type")):t.parseAs)??"json";if(204===c.status||"0"===c.headers.get("Content-Length")){let r;switch(e){case"arrayBuffer":case"blob":case"text":r=await c[e]();break;case"formData":r=new FormData;break;case"stream":r=c.body;break;default:r={}}return"data"===t.responseStyle?r:{data:r,...l}}let r;switch(e){case"arrayBuffer":case"blob":case"formData":case"json":case"text":r=await c[e]();break;case"stream":return"data"===t.responseStyle?c.body:{data:c.body,...l}}return"json"===e&&(t.responseValidator&&await t.responseValidator(r),t.responseTransformer&&(r=await t.responseTransformer(r))),"data"===t.responseStyle?r:{data:r,...l}}const u=await c.text();let d;try{d=JSON.parse(u)}catch{}const p=d??u;let f=p;for(const e of n.error.fns)e&&(f=await e(p,c,i,t));if(f=f||{},t.throwOnError)throw f;return"data"===t.responseStyle?void 0:{error:f,...l}},i=e=>t=>s({...t,method:e}),a=e=>async t=>{const{opts:r,url:s}=await o(t);return(({onRequest:e,onSseError:t,onSseEvent:r,responseTransformer:n,responseValidator:o,sseDefaultRetryDelay:s,sseMaxRetryAttempts:i,sseMaxRetryDelay:a,sseSleepFn:c,url:l,...u})=>{let d;const p=c??(e=>new Promise(t=>setTimeout(t,e))),f=async function*(){let c=s??3e3,f=0;const h=u.signal??(new AbortController).signal;for(;!h.aborted;){f++;const s=u.headers instanceof Headers?u.headers:new Headers(u.headers);void 0!==d&&s.set("Last-Event-ID",d);try{const t={redirect:"follow",...u,body:u.serializedBody,headers:s,signal:h};let i=new Request(l,t);e&&(i=await e(l,t));const a=u.fetch??globalThis.fetch,p=await a(i);if(!p.ok)throw new Error(`SSE failed: ${p.status} ${p.statusText}`);if(!p.body)throw new Error("No body in SSE response");const f=p.body.pipeThrough(new TextDecoderStream).getReader();let 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)}}}();return{stream:f}})({...r,body:r.body,headers:r.headers,method:e,onRequest:async(e,t)=>{let o=new Request(e,t);for(const e of n.request.fns)e&&(o=await e(o,r));return o},url:s})};return{buildUrl:lr,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")}},vr=yr(mr({baseUrl:"https://api.stably.ai"})),br="4.5.4",wr=process.env.STABLY_API_URL||"https://api.stably.ai",_r=e=>{const t=new URL(e);return t.protocol="http:"===t.protocol?"ws:":"wss:",t},Er=process.env.AUTH_URL||"https://auth.stably.ai",Ir=process.env.AUTH_CLIENT_ID||"288007877071cce81f269428ea78653a",Tr=process.env.AI_PROXY_URL||"https://ai-proxy.stably.ai",xr=process.env.STABLY_AUTOHEAL_WS_URL||new URL("/autoheal",_r(wr)).toString(),Sr=process.env.STABLY_CREATE_PROGRESS_WS_URL||new URL("/create-progress",_r(wr)).toString(),Ar="http://localhost:9876/auth/callback",Cr=()=>sr||(sr=yr(mr({baseUrl:wr,headers:{"X-STABLY-CLI-VERSION":br,"X-STABLY-SOURCE":"cli"}}))),Rr=async(e,t)=>{const r=await(n={body:{accessToken:e,orgId:t},client:Cr()},(n.client??vr).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},Pr=v.z.object({org_id:v.z.string(),org_name:v.z.string()}),Ur=v.z.object({email:v.z.string(),org_id_to_org_member_info:v.z.record(v.z.string(),Pr).optional(),org_member_info:Pr.optional(),user_id:v.z.string()});v.z.object({email:v.z.string(),firstName:v.z.string().optional(),lastName:v.z.string().optional(),organizations:v.z.array(v.z.object({id:v.z.string(),name:v.z.string()})),userId:v.z.string()});var Lr=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)},Or=e=>{try{const t=Ur.parse(Lr(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"}`)}},Dr=async(e,t)=>{let r=e;const{root:n}=D.default.parse(r);for(;r!==n;){const e=D.default.join(r,t);try{return await g.access(e),e}catch{r=D.default.dirname(r)}}},kr=D.default.join(j.default.homedir(),".stably"),Br=D.default.join(kr,"auth.json"),Nr=".stably",jr="project.json",$r=G.default.object({accessToken:G.default.string(),expiresAt:G.default.number(),idToken:G.default.string().optional(),refreshToken:G.default.string()}),Mr=G.default.object({orgId:G.default.string(),orgName:G.default.string(),projectId:G.default.string(),projectName:G.default.string()}),Hr=async()=>{try{const e=await g.readFile(Br,"utf-8");return $r.parse(JSON.parse(e))}catch{return}},Fr=async e=>{await g.mkdir(kr,{recursive:!0}),await g.writeFile(Br,JSON.stringify(e,null,2),{mode:384})},Gr=async()=>{try{await g.unlink(Br)}catch{}},zr=async()=>{try{const e=await Dr(process.cwd(),Nr);if(!e)return;const t=D.default.join(e,jr),r=await g.readFile(t,"utf-8");return Mr.parse(JSON.parse(r))}catch{return}},Yr=async()=>{try{const e=await Dr(process.cwd(),Nr);e&&await g.unlink(D.default.join(e,jr))}catch{}},Wr=e=>Date.now()>=e.expiresAt-3e5,Vr=async e=>{const t=new URLSearchParams({client_id:Ir,grant_type:"refresh_token",refresh_token:e}),r=await fetch(`${Er}/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}},qr=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`,Kr=(e,t,r)=>{e.writeHead(t,{"Content-Type":"text/html"}),e.end(r)},Jr=(e,t)=>{const r=new URLSearchParams({client_id:Ir,code_challenge:e,code_challenge_method:"S256",redirect_uri:Ar,response_type:"code",state:t});return`${Er}/propelauth/oauth/authorize?${r.toString()}`},Xr=async e=>{const t=m.spinner();let r;t.start("Loading user info...");try{r=Or(e.accessToken),t.stop(H.default.green(`✓ Logged in as ${H.default.cyan(r.email)}`))}catch(e){t.stop(H.default.red("✗ Failed to load user info"));const r=e instanceof Error?e.message:"Unknown error";return m.log.error(r),{success:!1}}const n=await(async e=>{if(0===e.length)return void m.log.error("You don't belong to any organizations.");if(1===e.length)return m.log.info(`Using organization: ${H.default.cyan(e[0].name)}`),e[0];if(!process.stdin.isTTY)return m.log.info(`Auto-selecting organization: ${H.default.cyan(e[0].name)}`),e[0];const t=await m.select({message:"Select an organization",options:[...e].sort((e,t)=>e.name.localeCompare(t.name)).map(e=>({label:e.name,value:e.id}))});return m.isCancel(t)?void 0:e.find(e=>e.id===t)})(r.organizations);if(!n)return m.log.warn("Organization selection cancelled."),{success:!1};let o;t.start("Getting org credentials...");try{const r=await Rr(e.accessToken,n.id);o={accessToken:r.accessToken,expiresAt:Date.now()+1e3*r.expiresInSeconds,idToken:e.idToken,refreshToken:e.refreshToken},t.stop(H.default.green("✓ Credentials obtained"))}catch(e){t.stop(H.default.red("✗ Failed to get org credentials"));const r=e instanceof Error?e.message:"Unknown error";return m.log.error(r),{success:!1}}const s=await(async(e,t)=>{const r=m.spinner();let n;r.start("Loading projects...");try{n=await(async({accessToken:e,orgId:t})=>{const r=await(n={auth:e,client:Cr(),path:{orgId:t}},(n.client??vr).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(H.default.green("✓ Projects loaded"))}catch(e){r.stop(H.default.red("✗ Failed to load projects"));const t=e instanceof Error?e.message:"Unknown error";return void m.log.error(t)}if(0===n.length)return m.log.error("No projects found in this organization."),void m.log.info(`Create a project at ${H.default.underline(H.default.cyan("https://app.stably.ai"))}`);if(1===n.length)return m.log.info(`Using project: ${H.default.cyan(n[0].name)}`),n[0];if(!process.stdin.isTTY)return m.log.info(`Auto-selecting project: ${H.default.cyan(n[0].name)}`),n[0];const o=await m.select({message:"Select a project",options:n.map(e=>({label:e.name,value:e.id}))});return m.isCancel(o)?void 0:n.find(e=>e.id===o)})(o.accessToken,n.id);return s?(await(async e=>{const t=D.default.join(process.cwd(),Nr),r=D.default.join(t,jr);await g.mkdir(t,{recursive:!0}),await g.writeFile(r,JSON.stringify(e,null,2)),await(async e=>{const t=D.default.join(e,".gitignore"),r="# Stably CLI (only docs/ are tracked)\n.stably/*\n!.stably/docs/";try{const e=await g.readFile(t,"utf-8"),n=e.split("\n").map(e=>e.trim());if(n.includes(".stably/*")&&n.includes("!.stably/docs/"))return;const o=/^# Stably CLI\n\.stably\/?$/m,s=/^\.stably\/?$/m;if(o.test(e)){const n=e.replace(o,`\n${r}\n`);await g.writeFile(t,n)}else if(s.test(e)){const n=e.replace(s,`\n${r}\n`);await g.writeFile(t,n)}else await g.appendFile(t,`\n${r}\n`)}catch{await g.writeFile(t,`${r}\n`)}})(process.cwd())})({orgId:n.id,orgName:n.name,projectId:s.id,projectName:s.name}),m.log.info(H.default.dim("Linked this directory to your Stably project.")),{scopedTokens:o,success:!0}):(m.log.warn("Project selection cancelled."),{success:!1})},Qr=async()=>{if(bn())return m.log.warn(`Environment variables ${H.default.cyan("STABLY_API_KEY")} and ${H.default.cyan("STABLY_PROJECT_ID")} are set.`),m.log.warn("These will be used for authentication instead of OAuth login."),m.log.warn("To use OAuth login, unset these environment variables first."),void m.outro(H.default.yellow("Login skipped - using environment variable authentication."));const e=await Hr();if(e){if(!Wr(e)){if(await zr())return void m.outro(H.default.yellow("You are already logged in. Run `stably logout` first to log out."));m.log.info("You are logged in but haven't selected a project yet.");const t=await Xr(e);return void(t.success?(await Fr(t.scopedTokens),m.outro(H.default.green("Setup complete! You can now use Stably CLI."))):m.outro(H.default.yellow("Setup incomplete. Run `stably login` to try again.")))}const t=m.spinner();t.start("Refreshing session...");try{const r=await Vr(e.refreshToken);t.stop(H.default.green("✓ Session refreshed"));const n=await zr();if(n){t.start("Getting org credentials...");try{const e=await Rr(r.accessToken,n.orgId),o={accessToken:e.accessToken,expiresAt:Date.now()+1e3*e.expiresInSeconds,idToken:r.idToken,refreshToken:r.refreshToken};await Fr(o),t.stop(H.default.green("✓ Credentials obtained")),m.outro(H.default.green("Login successful"))}catch{await Fr(r),t.stop(H.default.yellow("Using full credentials")),m.outro(H.default.green("Login successful"))}}else{const e=await Xr(r);e.success?(await Fr(e.scopedTokens),m.outro(H.default.green("Setup complete! You can now use Stably CLI."))):m.outro(H.default.yellow("Setup incomplete. Run `stably login` to try again."))}return}catch{t.stop(H.default.yellow("Session expired, proceeding with fresh login...")),await Gr(),await Yr()}}const{authorizeUrl:t,serverReady:r,waitForCallback:n}=(()=>{const{authorizeUrl:e,codeVerifier:t,state:r}=(()=>{const e=M.default.randomBytes(32).toString("base64url"),t=(r=e,M.default.createHash("sha256").update(r).digest("base64url"));var r;const n=M.default.randomBytes(16).toString("base64url");return{authorizeUrl:Jr(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(()=>{c.close(),n({error:"Login timed out",success:!1})},3e5),i=()=>{clearTimeout(s)},c=Y.default.createServer((t,r)=>{const o=new a.URL(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"),l=o.searchParams.get("state"),u=o.searchParams.get("error");return u?(Kr(r,400,qr(u)),i(),c.close(),void n({error:u,success:!1})):s&&l?l!==e?(Kr(r,400,qr("Invalid state parameter (possible CSRF attack)")),i(),c.close(),void n({error:"State mismatch",success:!1})):(Kr(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(),c.close(),void n({code:s,state:l,success:!0})):(Kr(r,400,qr("Missing code or state parameter")),i(),c.close(),void n({error:"Missing code or state parameter",success:!1}))});c.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)}),c.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:Ir,code:e,code_verifier:t,grant_type:"authorization_code",redirect_uri:Ar}),n=await fetch(`${Er}/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,m.log.info("Opening browser for authentication..."),m.log.info(H.default.dim("If browser doesn't open, visit:")),m.log.info(`]8;;${t}${H.default.underline(H.default.cyan(t))}]8;;`);try{await z.default(t)}catch{m.log.warn("Could not open browser automatically. Please open the URL above manually.")}const o=m.spinner();let s;o.start("Waiting for authentication...");try{s=await n(),o.stop(H.default.green("✓ Authentication successful"))}catch(e){o.stop(H.default.red("✗ Authentication failed"));const t=e instanceof Error?e.message:"Unknown error";m.outro(H.default.red(`Login failed: ${t}`)),process.exit(1)}const i=await Xr(s);i.success?(await Fr(i.scopedTokens),m.outro(H.default.green("Setup complete! You can now use Stably CLI."))):(m.outro(H.default.yellow("Setup incomplete. Run `stably login` to try again.")),process.exit(1))},Zr={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"]),tn=(new Date).toISOString().split("T")[0],rn=D.default.join(j.default.tmpdir(),"stably-logs",tn);N.default.mkdirSync(rn,{recursive:!0});var nn,on=process.argv.includes("--verbose")||process.argv.includes("-v"),sn=process.env.STABLY_LOG_LEVEL?.toLowerCase(),an=on?"debug":void 0!==(nn=sn)&&nn in Zr?sn:"warn",cn=Zr[an],ln=null,un=null,dn=null,pn=[],fn=!1,hn=e=>{if(!fn){ln=(e=>{const t=(()=>{const e=new Date;return[e.getHours().toString().padStart(2,"0"),e.getMinutes().toString().padStart(2,"0"),e.getSeconds().toString().padStart(2,"0")].join("-")})(),r=((e,t=100)=>e.replace(/[/\\:*?"<>|]/g,"-").replace(/\s+/g,"-").replace(/[^a-zA-Z0-9\-_]/g,"").replace(/-+/g,"-").replace(/^-+|-+$/g,"").slice(0,t).toLowerCase()||"session")(e);return D.default.join(rn,`${t}-${r}.log`)})(e),(e=>{const t=["","=".repeat(60),"Stably CLI Debug Log",`Version: ${br}`,`Generated: ${(new Date).toISOString()}`,`Node: ${process.version}`,`Platform: ${process.platform} ${j.default.release()}`,`CWD: ${process.cwd()}`,`Args: ${process.argv.slice(2).join(" ")}`,`Log Level (console): ${an}`,"=".repeat(60),""].join("\n");e.write(t)})(un=new V.default({dest:ln,minLength:4096,sync:!1,append:!0})),dn=W.default({level:"debug",timestamp:W.default.stdTimeFunctions.isoTime,base:{version:br}},un);for(const{level:e,msg:t,context:r}of pn)r?dn[e](r,t):dn[e](t);pn=[],fn=!0,on&&process.stderr.write(`${H.default.dim(`Debug log: ${ln}`)}\n\n`)}},gn=(()=>{const e=process.argv.slice(2).find(e=>!e.startsWith("-"));return e&&en.has(e)?e:null})();gn&&hn(gn);var mn=e=>(t,r)=>{if(dn?r?dn[e](r,t):dn[e](t):pn.push({level:e,msg:t,context:r}),(e=>Zr[e]>=cn)(e)){const r=((e,t)=>`${{fatal:H.default.bgRed(H.default.white(" FATAL ")),error:H.default.red("error"),warn:H.default.yellow("warn"),info:H.default.cyan("info"),debug:H.default.dim("debug"),trace:H.default.dim("trace")}[e]} ${t}`)(e,t);process.stderr.write(`${r}\n`)}},yn={fatal:mn("fatal"),error:mn("error"),warn:mn("warn"),info:mn("info"),debug:mn("debug"),trace:mn("trace"),initSession:e=>{fn||hn(e)},getLogFilePath:()=>ln,flush:()=>{if(un)try{un.flushSync()}catch{}},printLogFileInfo:()=>{ln&&(process.stderr.write(`\n${H.default.dim("Debug log written to:")}\n`),process.stderr.write(` ${H.default.cyan(ln)}\n`),process.stderr.write(`${H.default.dim("Share this file with support for assistance.")}\n`))},getPinoLogger:()=>dn};setInterval(()=>{yn.flush()},3e4).unref(),process.on("beforeExit",()=>{yn.flush()});var vn=e=>{const t=()=>{yn.flush(),on&&yn.printLogFileInfo(),process.removeListener(e,t),process.kill(process.pid,e)};return t};process.on("SIGINT",vn("SIGINT")),process.on("SIGTERM",vn("SIGTERM"));var bn=()=>{const e=process.env.STABLY_API_KEY?.trim(),t=process.env.STABLY_PROJECT_ID?.trim();if(e&&t)return yn.debug("Environment auth detected",{hasApiKey:!0,hasProjectId:!0}),{apiKey:e,projectId:t};yn.debug("Environment auth not set",{hasApiKey:!!e,hasProjectId:!!t})},wn=!1,_n=()=>{wn||(wn=!0,m.log.warn("Both environment variable auth and stored OAuth login were detected."),m.log.warn(`Honoring environment variables (${H.default.cyan("STABLY_API_KEY")} + ${H.default.cyan("STABLY_PROJECT_ID")}).`),m.log.warn("To use OAuth login instead, unset those environment variables."))},En=async()=>{yn.debug("Checking for stored auth tokens");const e=await Hr();if(!e)return void yn.debug("No stored auth tokens found");const t=Wr(e);if(yn.debug("Auth tokens status",{expired:t}),!t){const t=await zr(),r=(e=>{try{const t=Ur.parse(Lr(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(yn.debug("Token scope check",{scope:r,hasContext:!!t}),t&&"full"===r)try{yn.debug("Exchanging full token for org-scoped token",{orgId:t.orgId});const r=await Rr(e.accessToken,t.orgId),n={accessToken:r.accessToken,expiresAt:Date.now()+1e3*r.expiresInSeconds,idToken:e.idToken,refreshToken:e.refreshToken};return await Fr(n),yn.debug("Token exchange successful"),n}catch(t){return yn.debug("Token exchange failed, using existing token",{error:t instanceof Error?t.message:String(t)}),e}return e}try{yn.debug("Attempting token refresh");const t=await Vr(e.refreshToken);yn.debug("Token refresh successful");const r=await zr();if(r)try{yn.debug("Exchanging refreshed token for org-scoped token");const e=await Rr(t.accessToken,r.orgId),n={accessToken:e.accessToken,expiresAt:Date.now()+1e3*e.expiresInSeconds,idToken:t.idToken,refreshToken:t.refreshToken};return await Fr(n),n}catch{return await Fr(t),t}return await Fr(t),t}catch(e){return void yn.warn("Token refresh failed",{error:e instanceof Error?e.message:String(e)})}},In=async(e={})=>{yn.debug("Requiring authentication",{autoLogin:e.autoLogin});const t=bn();if(t){yn.info("Using environment variable authentication");try{await Hr()&&_n()}catch{}return{auth:t,type:"env"}}let r=await En(),n=r?await zr():void 0;const o=process.stdin.isTTY&&process.stdout.isTTY;if(yn.debug("OAuth auth check",{hasTokens:!!r,hasContext:!!n,canPrompt:o}),(!r||!n)&&e.autoLogin&&o){yn.info("Prompting user to login"),r?m.log.info("You are logged in but need to select an organization and project."):m.log.info("You are not logged in."),m.log.info("Press Enter to log in."),process.stdout.write(`${H.default.dim("Alternatively, set environment variables for an org API key:")}\n${H.default.dim(" STABLY_API_KEY=... STABLY_PROJECT_ID=... stably")}\n`),process.stdout.write("\n");const e=y.createInterface({input:process.stdin,output:process.stdout});try{await e.question(H.default.dim("Press Enter to continue... "))}finally{e.close()}await Qr(),r=await En(),n=r?await zr():void 0}return r||(yn.warn("Authentication required but no tokens available"),m.outro(H.default.red("You are not logged in. Run `stably login` to authenticate.")),process.exit(1)),n||(yn.warn("Authentication succeeded but no project context selected"),m.outro(H.default.red("You haven't selected an organization and project. Run `stably login` to complete setup.")),process.exit(1)),yn.info("OAuth authentication successful",{orgId:n.orgId,projectId:n.projectId}),{auth:{accessToken:r.accessToken,context:n},type:"oauth"}},Tn=e=>"env"===e.type?e.auth.projectId:e.auth.context.projectId,xn=e=>e?{...process.env,...e}:process.env,Sn=async()=>{yn.info("[test] Resolving Stably test env");const e=(()=>{if(process.env.STABLY_WS_URL)return;if("https://api.stably.ai"===wr)return;const e=wr.startsWith("http://")?"ws://":"wss://";return`${wr.replace(/^https?:\/\//,e).replace(/\/$/,"")}/reporter`})();yn.debug("[test] WebSocket URL resolved",{wsUrl:e??"(default)"});const t=bn();if(t)return yn.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}};yn.info("[test] No env var auth, attempting OAuth auth");const r=Date.now(),n=await(async()=>{const e=bn();if(e){try{await Hr()&&_n()}catch{}return{auth:e,type:"env"}}const t=await En(),r=t?await zr():void 0;if(t&&r)return{auth:{accessToken:t.accessToken,context:r},type:"oauth"}})();if(yn.info("[test] OAuth auth resolved",{durationMs:Date.now()-r,hasAuth:!!n,authType:n?.type}),!n||"env"===n.type)return void yn.info("[test] No usable auth found");const o=process.env.STABLY_PROJECT_ID?.trim(),s=o||Tn(n);if(!s)return void yn.warn("[test] No project ID available");yn.info("[test] Fetching JWT API key",{projectId:s});const i=Date.now(),a=await(async(e,t)=>{try{yn.debug("Requesting JWT API key",{projectId:t,apiUrl:wr});const r=await(async({accessToken:e,projectId:t})=>{const r=await(n={auth:e,client:Cr(),path:{projectId:t}},(n.client??vr).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 yn.debug("JWT API key obtained",{keyPrefix:r.apiKey.substring(0,10)}),r.apiKey}catch(e){return void yn.warn("Failed to get JWT API key for test reporter",{error:e instanceof Error?e.message:String(e)})}})(n.auth.accessToken,s);yn.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 yn.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},An=e=>e?{[Qt]:e}:void 0,Cn=v.z.object({context:v.z.string().min(1),autohealReportUrl:v.z.string()}),Rn=I.z.object({bucket:I.z.string(),key:I.z.string()}),Pn=I.z.object({diffBucketPath:Rn,expiresInSeconds:I.z.number(),key:I.z.string(),uploadUrl:I.z.string()}),Un=I.z.object({traceBucketPath:Rn,expiresInSeconds:I.z.number(),key:I.z.string(),uploadUrl:I.z.string(),sensitiveValues:I.z.array(I.z.string())}),Ln=async({authHeader:e,contentType:t="text/plain",orgId:r,runId:n})=>{const o=await(s={auth:e,body:{contentType:t},client:Cr(),headers:An(r),path:{runId:n}},(s.client??vr).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=Pn.parse(o.data);return{diffBucketPath:i.diffBucketPath,expiresInSeconds:i.expiresInSeconds,key:i.key,uploadUrl:i.uploadUrl}},On=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})`)},Dn=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=xr,onUserMessage:o}){this.authHeader=e,this.orgId=t,this.runId=r,this.url=n,this.onUserMessage=o,yn.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)}`;yn.info("[ws] Connecting",{url:t,attempt:this.reconnectAttempts}),this.socket=new q.default(t,{headers:e}),this.socket.on("open",()=>{yn.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);yn.debug("[ws] Received message",{type:r?.type}),"connected"===r?.type&&(yn.info("[ws] Authenticated successfully"),this.isAuthenticated=!0,this.authenticationFailed=!1,this.flushPending()),"user_message"===r?.type&&"string"==typeof r.content&&(yn.info("[ws] Received user message from web UI"),this.onUserMessage?.(r.content))}catch{}}),this.socket.on("close",(e,t)=>{yn.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=>{yn.warn("[ws] Connection error",{error:e.message})})}catch(e){yn.warn("[ws] Failed to create WebSocket",{error:e instanceof Error?e.message:String(e)}),this.scheduleReconnect()}}scheduleReconnect(){this._isClosed||this.reconnectTimer||(this.reconnectAttempts++,yn.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===q.default.OPEN&&this.isAuthenticated}sendProgress(e){if(this._isClosed)return void yn.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?(yn.info("[ws] sendProgress: flushing terminal state immediately"),void this.flushPending()):void(this.debounceTimer||(this.debounceTimer=setTimeout(()=>{this.debounceTimer=void 0,this.flushPending()},this.debounceMs))):(yn.debug("[ws] sendProgress: not connected, queuing event",{phase:e.phase,socketState:this.socket?.readyState,isAuthenticated:this.isAuthenticated,reconnectAttempts:this.reconnectAttempts}),void(this.socket?.readyState===q.default.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 yn.debug("[ws] flushPending: not connected, re-queuing event",{phase:e.payload.phase}),void(this.pendingEvent=e);try{yn.debug("[ws] flushPending: sending event",{phase:e.payload.phase}),this.socket?.send(JSON.stringify(e),t=>{t&&(yn.warn("[ws] flushPending: send failed",{error:t.message,phase:e.payload.phase}),this.pendingEvent||(this.pendingEvent=e))})}catch(t){yn.warn("[ws] flushPending: send threw",{error:t instanceof Error?t.message:String(t)}),this.pendingEvent=e}}close(){if(this._isClosed)return;yn.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)}},kn=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=Sr,onUserMessage:o}){this.authHeader=e,this.orgId=t,this.sessionId=r,this.url=n,this.onUserMessage=o,yn.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)}`;yn.info("[ws] Connecting",{url:t,attempt:this.reconnectAttempts}),this.socket=new q.default(t,{headers:e}),this.socket.on("open",()=>{yn.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);yn.debug("[ws] Received message",{type:r?.type}),"connected"===r?.type&&(yn.info("[ws] Authenticated successfully"),this.isAuthenticated=!0,this.authenticationFailed=!1,this.flushPending()),"user_message"===r?.type&&"string"==typeof r.content&&(yn.info("[ws] Received user message from web UI"),this.onUserMessage?.(r.content))}catch{}}),this.socket.on("close",(e,t)=>{yn.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=>{yn.warn("[ws] Connection error",{error:e.message})})}catch(e){yn.warn("[ws] Failed to create WebSocket",{error:e instanceof Error?e.message:String(e)}),this.scheduleReconnect()}}scheduleReconnect(){this._isClosed||this.reconnectTimer||(this.reconnectAttempts++,yn.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===q.default.OPEN&&this.isAuthenticated}sendProgress(e){if(this._isClosed)return void yn.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?(yn.info("[ws] sendProgress: flushing terminal state immediately"),void this.flushPending()):void(this.debounceTimer||(this.debounceTimer=setTimeout(()=>{this.debounceTimer=void 0,this.flushPending()},this.debounceMs))):(yn.debug("[ws] sendProgress: not connected, queuing event",{phase:e.phase,socketState:this.socket?.readyState,isAuthenticated:this.isAuthenticated,reconnectAttempts:this.reconnectAttempts}),void(this.socket?.readyState===q.default.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 yn.debug("[ws] flushPending: not connected, re-queuing event",{phase:e.payload.phase}),void(this.pendingEvent=e);try{yn.debug("[ws] flushPending: sending event",{phase:e.payload.phase}),this.socket?.send(JSON.stringify(e),t=>{t&&(yn.warn("[ws] flushPending: send failed",{error:t.message,phase:e.payload.phase}),this.pendingEvent||(this.pendingEvent=e))})}catch(t){yn.warn("[ws] flushPending: send threw",{error:t instanceof Error?t.message:String(t)}),this.pendingEvent=e}}close(){if(this._isClosed)return;yn.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)}},Bn=/\.(spec|test)\.(c|m)?[jt]sx?$/,Nn=e=>{if(!e||"object"!=typeof e)return!1;const t=e;return"text"===t.type&&"string"==typeof t.text},jn=e=>null!=e&&"object"==typeof e&&"tool_response"in e,$n=e=>{if(!e||"object"!=typeof e)return;const t=e;return Array.isArray(t.tool_response)?t.tool_response:void 0},Mn=e=>{const t=$n(e);if(t)return t.filter(Nn).map(e=>e.text).join("\n")||void 0},Hn=/\u001b\[[0-9;]*m/g,Fn=e=>e.replace(Hn,""),Gn=/\$\{process\.env\.([A-Z_][A-Z0-9_]*)\}/g;function zn({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(Gn,(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 Yn({onResult:e}){return async t=>{if(!jn(t))return{decision:"approve"};const r=Mn(t);if(!r)return{decision:"approve"};const n=function(e){const t=Fn(e),r=t.split(/Running \d+ tests? using \d+ workers?/).at(-1)??t,n=parseInt(r.match(/(\d+)\s+passed/g)?.at(-1)?.match(/(\d+)/)?.[1]??"0"),o=parseInt(r.match(/(\d+)\s+failed/g)?.at(-1)?.match(/(\d+)/)?.[1]??"0");if(0===n&&0===o)return;const s=[n>0?`${n} test${1===n?"":"s"} passed ✓`:void 0,o>0?`${o} test${1===o?"":"s"} failed ✗`:void 0].filter(e=>void 0!==e).join(", ");if(0===o)return s;const i=r.split(/\n\s+\d+\)\s+\[id=/).slice(1).map(e=>e.match(/\n\s{4}((?:TimeoutError|Error|AssertionError):\s*[^\n]+)/)?.[1]?.trim()).filter(e=>void 0!==e);return 0===i.length?s:`${s}\n${i.map(e=>` - ${e}`).join("\n")}`}(r);return n&&e(n),{decision:"approve"}}}function Wn({onResult:e}){return async t=>{if(!jn(t))return{decision:"approve"};const r=Mn(t);if(!r)return{decision:"approve"};const n=function(e){const t=Fn(e);if(t.match(/### Paused on error:/)){const e=t.match(/### Paused on error:\s*\n((?:TimeoutError|Error|AssertionError):\s*[^\n]+)/);return e?`Test paused on error - ${e[1].trim()}`:"Test paused on error"}const r=t.match(/(\d+)\s+passed/);if(r){const e=parseInt(r[1]);return`${e} test${1===e?"":"s"} passed ✓`}}(r);return n&&e(n),{decision:"approve"}}}var Vn=/\.(spec|test)\.(ts|tsx|js|jsx|mts|mjs)$/;function qn({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&&Vn.test(n)&&e(n),{decision:"approve"}}}var Kn=u.promisify(o.exec),Jn=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 Xn(e){try{const t=o.execSync("git branch --show-current",{cwd:e,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();if(!t)return;return{branch:t}}catch{return}}var Qn=[".ts",".js",".mts",".mjs",".cts",".cjs"],Zn=10240,eo=async({defaultContent:e,fileName:t,filePath:r})=>{try{const e=(await g.stat(r)).size,n=await g.readFile(r,"utf-8"),o=Buffer.byteLength(n,"utf-8");if(o<=Zn)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<=Zn?s:s.slice(0,Zn)+`\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 g.readdir(r);return e.length>0?e.join("\n"):"(empty)"}catch(r){let n;if(r&&"object"==typeof r&&"code"in r){const e=r.code;"string"==typeof e&&(n=e)}return"ENOENT"!==n&&console.warn(`Failed to read ${t}: ${r}`),e}},ro=async({allowedEnvVars:e,mode:t,workspaceInfo:r,authHeader:n,customHeader:o,maxParallelWorkers:s})=>{const i=Cr(),a=Xn(r.absolutePath);yn.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??vr).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 yn.warn("System prompt fetch failed: unauthorized (401)"),await Gr(),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 yn.warn("System prompt fetch failed: forbidden (403)"),await Gr(),new Error("You no longer have access to this organization. Credentials have been cleared. Please run `stably login` to re-authenticate.");if(c.error)throw yn.warn("System prompt fetch failed",{error:c.error}),new Error(`Failed to fetch system prompt: ${JSON.stringify(c.error)}`);const u=function({customHeader:e,systemPrompt:t}){return e?`${t}\n\nWhen writing or updating the generated test file, prepend this exact header at the top of the file without modification:\n\`\`\`ts\n${e}\n\`\`\``:t}({systemPrompt:c.data.systemPrompt,customHeader:o});return yn.debug("System prompt received",{size:u.length,appendedCustomHeader:!!o}),u},no=".stably-playwright-wrapper.config.*",oo=[".ts",".js",".mts",".mjs",".cts",".cjs"];function so(e){const r=t.resolve(e);if(i.existsSync(r))for(const e of oo){const n=t.join(r,`playwright.config${e}`);if(i.existsSync(n))return n}}var io=["tests","e2e","__tests__","test"];function ao(e){try{return i.existsSync(e)&&i.statSync(e).isDirectory()}catch{return!1}}function co(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(H.default.dim(`Using output directory: ${e} (from ${r})`))}var lo,uo=["mcp__playwright-test__","mcp__auto-heal-report__","mcp__test-doc-sync__","mcp__stably-agent-control__"],po=["planner_","generator_"],fo={"mcp__stably-agent-control__restart_mcp_servers":"Restarting Browser Tools","mcp__session-control__restart_mcp_servers":"Restarting Browser Tools"},ho=(e,t)=>{const r=t.find(t=>e.startsWith(t));return r?e.slice(r.length):e},go=e=>{const t=fo[e];if(t)return t;const r=ho(e,uo);return ho(r,po).split("_").map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join(" ")},mo=(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},yo=["test","bug","other"],vo={bug:"Application code defect; behavior diverges from expected requirements.",other:"External dependencies, environment, or infra issues outside test/app code.",test:"Test code is incorrect, out-of-date, or missing necessary setup."},bo=e=>vo[e],wo=/[^a-zA-Z0-9-_]/g,_o=e=>{const t=e.trim().replace(wo,"_");return t.length>0?t.slice(0,80):void 0},Eo=e=>"string"==typeof e?_o(e):void 0,Io=((e,t,r)=>(r=null!=e?K(Z(e)):{},((e,t,r,n)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let r of Q(t))ee.call(e,r)||void 0===r||J(e,r,{get:()=>t[r],enumerable:!(n=X(t,r))||n.enumerable});return e})(J(r,"default",{value:e,enumerable:!0}),e)))(re()),To=A.createRequire("/");try{lo=To("worker_threads").Worker}catch(e){}var xo=lo?function(e,t,r,n,o){var s=!1,i=new lo(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,lo.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}},So=Uint8Array,Ao=Uint16Array,Co=Int32Array,Ro=new So([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]),Po=new So([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]),Uo=new So([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Lo=function(e,t){for(var r=new Ao(31),n=0;n<31;++n)r[n]=t+=1<<e[n-1];var o=new Co(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}},Oo=Lo(Ro,2),Do=Oo.b,ko=Oo.r;Do[28]=258,ko[258]=28;var Bo,No=Lo(Po,0),jo=No.b,$o=No.r,Mo=new Ao(32768);for(Go=0;Go<32768;++Go)Bo=(61680&(Bo=(52428&(Bo=(43690&Go)>>1|(21845&Go)<<1))>>2|(13107&Bo)<<2))>>4|(3855&Bo)<<4,Mo[Go]=((65280&Bo)>>8|(255&Bo)<<8)>>1;var Ho=function(e,t,r){for(var n=e.length,o=0,s=new Ao(t);o<n;++o)e[o]&&++s[e[o]-1];var i,a=new Ao(t);for(o=1;o<t;++o)a[o]=a[o-1]+s[o-1]<<1;if(r){i=new Ao(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[Mo[d]>>c]=l}else for(i=new Ao(n),o=0;o<n;++o)e[o]&&(i[o]=Mo[a[e[o]-1]++]>>15-e[o]);return i},Fo=new So(288);for(Go=0;Go<144;++Go)Fo[Go]=8;for(Go=144;Go<256;++Go)Fo[Go]=9;for(Go=256;Go<280;++Go)Fo[Go]=7;for(Go=280;Go<288;++Go)Fo[Go]=8;var Go,zo=new So(32);for(Go=0;Go<32;++Go)zo[Go]=5;var Yo=Ho(Fo,9,0),Wo=Ho(Fo,9,1),Vo=Ho(zo,5,0),qo=Ho(zo,5,1),Ko=function(e){for(var t=e[0],r=1;r<e.length;++r)e[r]>t&&(t=e[r]);return t},Jo=function(e,t,r){var n=t/8|0;return(e[n]|e[n+1]<<8)>>(7&t)&r},Xo=function(e,t){var r=t/8|0;return(e[r]|e[r+1]<<8|e[r+2]<<16)>>(7&t)},Qo=function(e){return(e+7)/8|0},Zo=function(e,t,r){return(null==t||t<0)&&(t=0),(null==r||r>e.length)&&(r=e.length),new So(e.subarray(t,r))},es=["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"],ts=function(e,t,r){var n=new Error(t||es[e]);if(n.code=e,Error.captureStackTrace&&Error.captureStackTrace(n,ts),!r)throw n;return n},rs=function(e,t,r,n){var o=e.length,s=n?n.length:0;if(!o||t.f&&!t.l)return r||new So(0);var i=!r,a=i||2!=t.i,c=t.i;i&&(r=new So(3*o));var l=function(e){var t=r.length;if(e>t){var n=new So(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=Jo(e,d,1);var v=Jo(e,d+1,3);if(d+=3,!v){var b=e[(P=Qo(d)+4)-4]|e[P-3]<<8,w=P+b;if(w>o){c&&ts(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=Wo,h=qo,g=9,m=5;else if(2==v){var _=Jo(e,d,31)+257,E=Jo(e,d+10,15)+4,I=_+Jo(e,d+5,31)+1;d+=14;for(var T=new So(I),x=new So(19),S=0;S<E;++S)x[Uo[S]]=Jo(e,d+3*S,7);d+=3*E;var A=Ko(x),C=(1<<A)-1,R=Ho(x,A,1);for(S=0;S<I;){var P,U=R[Jo(e,d,C)];if(d+=15&U,(P=U>>4)<16)T[S++]=P;else{var L=0,O=0;for(16==P?(O=3+Jo(e,d,3),d+=2,L=T[S-1]):17==P?(O=3+Jo(e,d,7),d+=3):18==P&&(O=11+Jo(e,d,127),d+=7);O--;)T[S++]=L}}var D=T.subarray(0,_),k=T.subarray(_);g=Ko(D),m=Ko(k),f=Ho(D,g,1),h=Ho(k,m,1)}else ts(1);if(d>y){c&&ts(0);break}}a&&l(p+131072);for(var B=(1<<g)-1,N=(1<<m)-1,j=d;;j=d){var $=(L=f[Xo(e,d)&B])>>4;if((d+=15&L)>y){c&&ts(0);break}if(L||ts(2),$<256)r[p++]=$;else{if(256==$){j=d,f=null;break}var M=$-254;if($>264){var H=Ro[S=$-257];M=Jo(e,d,(1<<H)-1)+Do[S],d+=H}var F=h[Xo(e,d)&N],G=F>>4;if(F||ts(3),d+=15&F,k=jo[G],G>3&&(H=Po[G],k+=Xo(e,d)&(1<<H)-1,d+=H),d>y){c&&ts(0);break}a&&l(p+131072);var z=p+M;if(p<k){var Y=s-k,W=Math.min(k,z);for(Y+p<0&&ts(3);p<W;++p)r[p]=n[Y+p]}for(;p<z;++p)r[p]=r[p-k]}}t.l=f,t.p=j,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?Zo(r,0,p):r.subarray(0,p)},ns=function(e,t,r){r<<=7&t;var n=t/8|0;e[n]|=r,e[n+1]|=r>>8},os=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:ps,l:0};if(1==o){var i=new So(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 Ao(p+1),h=is(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 So(f),l:h}},is=function(e,t,r){return-1==e.s?Math.max(is(e.l,t,r+1),is(e.r,t,r+1)):t[e.s]=r},as=function(e){for(var t=e.length;t&&!e[--t];);for(var r=new Ao(++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}},cs=function(e,t){for(var r=0,n=0;n<t.length;++n)r+=e[n]*t[n];return r},ls=function(e,t,r){var n=r.length,o=Qo(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){ns(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=as(p),v=y.c,b=y.n,w=as(g),_=w.c,E=w.n,I=new Ao(19),T=0;T<v.length;++T)++I[31&v[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[Uo[C-1]];--C);var R,P,U,L,O=l+5<<3,D=cs(o,Fo)+cs(s,zo)+i,k=cs(o,p)+cs(s,g)+i+14+3*C+cs(I,S)+2*I[16]+3*I[17]+7*I[18];if(c>=0&&O<=D&&O<=k)return ls(t,u,e.subarray(c,c+l));if(ns(t,u,1+(k<D)),u+=2,k<D){R=Ho(p,f,0),P=p,U=Ho(g,m,0),L=g;var B=Ho(S,A,0);for(ns(t,u,b-257),ns(t,u+5,E-1),ns(t,u+10,C-4),u+=14,T=0;T<C;++T)ns(t,u+3*T,S[Uo[T]]);u+=3*C;for(var N=[v,_],j=0;j<2;++j){var $=N[j];for(T=0;T<$.length;++T){var M=31&$[T];ns(t,u,B[M]),u+=S[M],M>15&&(ns(t,u,$[T]>>5&127),u+=$[T]>>12)}}}else R=Yo,P=Fo,U=Vo,L=zo;for(T=0;T<a;++T){var H=n[T];if(H>255){os(t,u,R[257+(M=H>>18&31)]),u+=P[M+257],M>7&&(ns(t,u,H>>23&31),u+=Ro[M]);var F=31&H;os(t,u,U[F]),u+=L[F],F>3&&(os(t,u,H>>5&8191),u+=Po[F])}else os(t,u,R[H]),u+=P[H]}return os(t,u,R[256]),u+P[256]},ds=new Co([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),ps=new So(0),fs=function(e,t,r,n,o,s){var i=s.z||e.length,a=new So(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=ds[t-1],p=d>>13,f=8191&d,h=(1<<r)-1,g=s.p||new Ao(32768),m=s.h||new Ao(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 Co(25e3),_=new Ao(288),E=new Ao(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 L=i-x;if((I>7e3||S>24576)&&(L>423||!l)){u=us(e,c,0,w,_,E,T,S,C,x-C,u),S=I=T=0,C=x;for(var O=0;O<286;++O)_[O]=0;for(O=0;O<30;++O)E[O]=0}var D=2,k=0,B=f,N=P-U&32767;if(L>2&&R==b(x-N))for(var j=Math.min(p,L)-1,$=Math.min(32767,x),M=Math.min(258,L);N<=$&&--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,k=N,H>j)break;var F=Math.min(N,H-2),G=0;for(O=0;O<F;++O){var z=x-N+O&32767,Y=z-g[z]&32767;Y>G&&(G=Y,U=z)}}}N+=(P=U)-(U=g[P])&32767}if(k){w[S++]=268435456|ko[D]<<18|$o[k];var W=31&ko[D],V=31&$o[k];T+=Ro[W]+Po[V],++_[257+W],++E[V],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 q=x+65535;q>=i&&(c[u/8|0]=l,q=i),u=ls(c,u+1,e.subarray(x,q))}s.i=i}return Zo(a,0,n+Qo(u)+o)},hs=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}(),gs=function(e,t,r,n,o){if(!o&&(o={l:1},t.dictionary)){var s=t.dictionary.subarray(-32768),i=new So(s.length+e.length);i.set(s),i.set(e,s.length),e=i,o.w=s.length}return fs(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)},ms=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},ys=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},vs=[],bs=function(){return[So,Ao,Co,Ro,Po,Uo,Do,jo,Wo,qo,Mo,es,Ho,Ko,Jo,Xo,Qo,Zo,ts,rs,Rs,_s,Es]},ws=function(){return[So,Ao,Co,Ro,Po,Uo,ko,$o,Yo,Fo,Vo,zo,Mo,ds,ps,Ho,ns,os,ss,is,as,cs,ls,us,Qo,Zo,fs,gs,Cs,_s]},_s=function(e){return postMessage(e,[e.buffer])},Es=function(e){return e&&{out:e.size&&new So(e.size),dictionary:e.dictionary}},Is=function(e,t,r,n,o,s){var i=function(e,t,r,n){if(!vs[r]){for(var o="",s={},i=e.length-1,a=0;a<i;++a)o=ys(e[a],o,s);vs[r]={c:ys(e[i],o,s),e:s}}var c=ms({},vs[r].e);return xo(vs[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()}},Ts=function(e,t){return e[t]|e[t+1]<<8},xs=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},Ss=function(e,t){return xs(e,t)+4294967296*xs(e,t+4)},As=function(e,t,r){for(;r;++t)e[t]=r,r>>>=8};function Cs(e,t){return gs(e,t||{},0,0)}function Rs(e,t){return rs(e,{i:2},t&&t.out,t&&t.dictionary)}var Ps=function(e,t,r,n){for(var o in e){var s=e[o],i=t+o,a=n;Array.isArray(s)&&(a=ms(n,s[1]),s=s[0]),s instanceof So?r[i]=[s,a]:(r[i+="/"]=[new So(0),a],Ps(s,i,r,n))}},Us="undefined"!=typeof TextEncoder&&new TextEncoder,Ls="undefined"!=typeof TextDecoder&&new TextDecoder;try{Ls.decode(ps,{stream:!0})}catch(e){}function Os(e,t){if(Us)return Us.encode(e);for(var r=e.length,n=new So(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 So(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 Zo(n,0,o)}var Ds=function(e){var t=0;if(e)for(var r in e){var n=e[r].length;n>65535&&ts(9),t+=n+4}return t},ks=function(e,t,r,n,o,s,i,a){var c=n.length,l=r.extra,u=a&&a.length,d=Ds(l);As(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)&&ts(10),As(e,t,f<<25|p.getMonth()+1<<21|p.getDate()<<16|p.getHours()<<11|p.getMinutes()<<5|p.getSeconds()>>1),t+=4,-1!=s&&(As(e,t,r.crc),As(e,t+4,s<0?-s-2:s),As(e,t+8,r.size)),As(e,t+12,c),As(e,t+14,d),t+=16,null!=i&&(As(e,t,u),As(e,t+6,r.attrs),As(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;As(e,t,+h),As(e,t+2,m),e.set(g,t+4),t+=4+m}return u&&(e.set(a,t),t+=u),t},Bs="function"==typeof queueMicrotask?queueMicrotask:"function"==typeof setTimeout?setTimeout:function(e){e()},Ns=[/^\/$/,/^\*+$/,/^[0-9]+$/],js=["/artifact/","https://","http://","*********"],$s=Symbol.for("@ts-pattern/matcher"),Ms=Symbol.for("@ts-pattern/isVariadic"),Hs="@ts-pattern/anonymous-select-key",Fs=e=>Boolean(e&&"object"==typeof e),Gs=e=>e&&!!e[$s],zs=(e,t,r)=>{if(Gs(e)){const n=e[$s](),{matched:o,selections:s}=n.match(t);return o&&s&&Object.keys(s).forEach(e=>r(e,s[e])),o}if(Fs(e)){if(!Fs(t))return!1;if(Array.isArray(e)){if(!Array.isArray(t))return!1;let n=[],o=[],s=[];for(const t of e.keys()){const r=e[t];Gs(r)&&r[Ms]?s.push(r):s.length?o.push(r):n.push(r)}if(s.length){if(s.length>1)throw new Error("Pattern error: Using `...P.array(...)` several times in a single pattern is not allowed.");if(t.length<n.length+o.length)return!1;const e=t.slice(0,n.length),i=0===o.length?[]:t.slice(-o.length),a=t.slice(n.length,0===o.length?1/0:-o.length);return n.every((t,n)=>zs(t,e[n],r))&&o.every((e,t)=>zs(e,i[t],r))&&(0===s.length||zs(s[0],a,r))}return e.length===t.length&&e.every((e,n)=>zs(e,t[n],r))}return Reflect.ownKeys(e).every(n=>{const o=e[n];return(n in t||Gs(s=o)&&"optional"===s[$s]().matcherType)&&zs(o,t[n],r);var s})}return Object.is(t,e)},Ys=e=>{var t,r,n;return Fs(e)?Gs(e)?null!=(t=null==(r=(n=e[$s]()).getSelectionKeys)?void 0:r.call(n))?t:[]:Array.isArray(e)?Ws(e,Ys):Ws(Object.values(e),Ys):[]},Ws=(e,t)=>e.reduce((e,r)=>e.concat(t(r)),[]);function Vs(e){return Object.assign(e,{optional:()=>{return t=e,Vs({[$s]:()=>({match:e=>{let r={};const n=(e,t)=>{r[e]=t};return void 0===e?(Ys(t).forEach(e=>n(e,void 0)),{matched:!0,selections:r}):{matched:zs(t,e,n),selections:r}},getSelectionKeys:()=>Ys(t),matcherType:"optional"})});var t},and:t=>qs(e,t),or:t=>function(...e){return Vs({[$s]:()=>({match:t=>{let r={};const n=(e,t)=>{r[e]=t};return Ws(e,Ys).forEach(e=>n(e,void 0)),{matched:e.some(e=>zs(e,t,n)),selections:r}},getSelectionKeys:()=>Ws(e,Ys),matcherType:"or"})})}(e,t),select:t=>void 0===t?Js(e):Js(t,e)})}function qs(...e){return Vs({[$s]:()=>({match:t=>{let r={};const n=(e,t)=>{r[e]=t};return{matched:e.every(e=>zs(e,t,n)),selections:r}},getSelectionKeys:()=>Ws(e,Ys),matcherType:"and"})})}function Ks(e){return{[$s]:()=>({match:t=>({matched:Boolean(e(t))})})}}function Js(...e){const t="string"==typeof e[0]?e[0]:void 0,r=2===e.length?e[1]:"string"==typeof e[0]?void 0:e[0];return Vs({[$s]:()=>({match:e=>{let n={[null!=t?t:Hs]:e};return{matched:void 0===r||zs(r,e,(e,t)=>{n[e]=t}),selections:n}},getSelectionKeys:()=>[null!=t?t:Hs].concat(void 0===r?[]:Ys(r))})})}function Xs(e){return!0}function Qs(e){return"number"==typeof e}function Zs(e){return"string"==typeof e}function ei(e){return"bigint"==typeof e}Vs(Ks(Xs)),Vs(Ks(Xs));var ti=e=>Object.assign(Vs(e),{startsWith:t=>{return ti(qs(e,(r=t,Ks(e=>Zs(e)&&e.startsWith(r)))));var r},endsWith:t=>{return ti(qs(e,(r=t,Ks(e=>Zs(e)&&e.endsWith(r)))));var r},minLength:t=>{return ti(qs(e,(r=t,Ks(e=>Zs(e)&&e.length>=r))));var r},length:t=>{return ti(qs(e,(r=t,Ks(e=>Zs(e)&&e.length===r))));var r},maxLength:t=>{return ti(qs(e,(r=t,Ks(e=>Zs(e)&&e.length<=r))));var r},includes:t=>{return ti(qs(e,(r=t,Ks(e=>Zs(e)&&e.includes(r)))));var r},regex:t=>{return ti(qs(e,(r=t,Ks(e=>Zs(e)&&Boolean(e.match(r))))));var r}});ti(Ks(Zs));var ri=e=>Object.assign(Vs(e),{between:(t,r)=>{return ri(qs(e,(n=t,o=r,Ks(e=>Qs(e)&&n<=e&&o>=e))));var n,o},lt:t=>{return ri(qs(e,(r=t,Ks(e=>Qs(e)&&e<r))));var r},gt:t=>{return ri(qs(e,(r=t,Ks(e=>Qs(e)&&e>r))));var r},lte:t=>{return ri(qs(e,(r=t,Ks(e=>Qs(e)&&e<=r))));var r},gte:t=>{return ri(qs(e,(r=t,Ks(e=>Qs(e)&&e>=r))));var r},int:()=>ri(qs(e,Ks(e=>Qs(e)&&Number.isInteger(e)))),finite:()=>ri(qs(e,Ks(e=>Qs(e)&&Number.isFinite(e)))),positive:()=>ri(qs(e,Ks(e=>Qs(e)&&e>0))),negative:()=>ri(qs(e,Ks(e=>Qs(e)&&e<0)))});ri(Ks(Qs));var ni=e=>Object.assign(Vs(e),{between:(t,r)=>{return ni(qs(e,(n=t,o=r,Ks(e=>ei(e)&&n<=e&&o>=e))));var n,o},lt:t=>{return ni(qs(e,(r=t,Ks(e=>ei(e)&&e<r))));var r},gt:t=>{return ni(qs(e,(r=t,Ks(e=>ei(e)&&e>r))));var r},lte:t=>{return ni(qs(e,(r=t,Ks(e=>ei(e)&&e<=r))));var r},gte:t=>{return ni(qs(e,(r=t,Ks(e=>ei(e)&&e>=r))));var r},positive:()=>ni(qs(e,Ks(e=>ei(e)&&e>0))),negative:()=>ni(qs(e,Ks(e=>ei(e)&&e<0)))});ni(Ks(ei)),Vs(Ks(function(e){return"boolean"==typeof e})),Vs(Ks(function(e){return"symbol"==typeof e})),Vs(Ks(function(e){return null==e})),Vs(Ks(function(e){return null!=e}));var oi=class extends Error{constructor(e){let t;try{t=JSON.stringify(e)}catch(r){t=e}super(`Pattern matching error: no pattern matches value ${t}`),this.input=void 0,this.input=e}},si={matched:!1,value:void 0},ii=class e{constructor(e,t){this.input=void 0,this.state=void 0,this.input=e,this.state=t}with(...t){if(this.state.matched)return this;const r=t[t.length-1],n=[t[0]];let o;3===t.length&&"function"==typeof t[1]?o=t[1]:t.length>2&&n.push(...t.slice(1,t.length-1));let s=!1,i={};const a=(e,t)=>{s=!0,i[e]=t},c=!n.some(e=>zs(e,this.input,a))||o&&!Boolean(o(this.input))?si:{matched:!0,value:r(s?Hs in i?i[Hs]:i:this.input,this.input)};return new e(this.input,c)}when(t,r){if(this.state.matched)return this;const n=Boolean(t(this.input));return new e(this.input,n?{matched:!0,value:r(this.input,this.input)}:si)}otherwise(e){return this.state.matched?this.state.value:e(this.input)}exhaustive(e=ai){return this.state.matched?this.state.value:e(this.input)}run(){return this.exhaustive()}returnType(){return this}narrow(){return this}};function ai(e){throw new oi(e)}var ci=new Set(["sha1","_sha1","pageref","downloadsPath","tracesDir","pageId"]);function li({sensitiveValues:e,str:t}){return e.reduce((e,t)=>e.replaceAll(t,"[REDACTED]"),t)}function ui({sensitiveValues:e,value:t}){return"string"==typeof t?li({sensitiveValues:e,str:t}):Array.isArray(t)?t.map(t=>ui({sensitiveValues:e,value:t})):function(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}(t)?pi({obj:t,sensitiveValues:e}):t}function di(e){return!!ci.has(e)||e.toLowerCase().endsWith("sha1")}function pi({obj:e,sensitiveValues:t}){return Object.fromEntries(Object.entries(e).map(([e,r])=>[e,di(e)?r:ui({sensitiveValues:t,value:r})]))}function fi({error:e,sensitiveValues:t}){return e?{...e,message:li({sensitiveValues:t,str:e.message})}:void 0}function hi({content:e,sensitiveValues:t}){const r=new u.TextDecoder,n=new u.TextEncoder,o=li({sensitiveValues:t,str:r.decode(e)});return n.encode(o)}var gi=u.promisify(function(e,t,r){r||(r=t,t={}),"function"!=typeof r&&ts(7);var n=[],o=function(){for(var e=0;e<n.length;++e)n[e]()},s={},i=function(e,t){Bs(function(){r(e,t)})};Bs(function(){i=r});for(var a=e.length-22;101010256!=xs(e,a);--a)if(!a||e.length-a>65558)return i(ts(13,0,1),null),o;var c=Ts(e,a+8);if(c){var l=c,u=xs(e,a+16),d=4294967295==u||65535==l;if(d){var p=xs(e,a-12);(d=101075792==xs(e,p))&&(l=c=xs(e,p+32),u=xs(e,p+48))}for(var f=t&&t.filter,h=function(t){var r=function(e,t,r){var n=Ts(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(Ls)return Ls.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:Zo(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&&ts(8),s}(e.subarray(t+46,t+46+n),!(2048&Ts(e,t+8))),s=t+46+n,i=xs(e,t+20),a=r&&4294967295==i?function(e,t){for(;1!=Ts(e,t);t+=4+Ts(e,t+2));return[Ss(e,t+12),Ss(e,t+4),Ss(e,t+20)]}(e,s):[i,xs(e,t+24),xs(e,t+42)],c=a[0],l=a[1],u=a[2];return[Ts(e,t+10),c,l,o,s+Ts(e,t+30)+Ts(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+Ts(e,t+26)+Ts(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,Rs(b,{out:new So(p)}))}catch(e){v(e,null)}else n.push(function(e,t,r){return r||(r=t,t={}),"function"!=typeof r&&ts(7),Is(e,t,[bs],function(e){return _s(Rs(e.data[0],Es(e.data[1])))},1,r)}(b,{size:p},v))}else v(ts(14,"unknown compression type "+a,1),null);else v(null,Zo(e,y,y+l));else v(null,null)},g=0;g<l;++g)h()}else i(null,{});return o}),mi=u.promisify(function(e,t,r){r||(r=t,t={}),"function"!=typeof r&&ts(7);var n={};Ps(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){Bs(function(){r(e,t)})};Bs(function(){p=r});var f=function(){var e=new So(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;ks(e,a,o,o.f,o.u,s);var u=30+o.f.length+Ds(o.extra),d=a+u;e.set(o.c,d),ks(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){As(e,t,101010256),As(e,t+8,r),As(e,t+10,r),As(e,t+12,n),As(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=hs[255&r^t[n]]^r>>>8;e=r},d:function(){return~e}}}(),m=c.length;g.p(c);var y=Os(t),v=y.length,b=h.comment,w=b&&Os(b),_=w&&w.length,E=Ds(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]=ms(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(ts(11,0,1),null),I)if(m<16e4)try{T(null,Cs(c,h))}catch(e){T(e,null)}else u.push(function(e,t,r){return r||(r=t,t={}),"function"!=typeof r&&ts(7),Is(e,t,[ws],function(e){return _s(Cs(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 yi({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 u.TextDecoder,n=new u.TextEncoder,o=r.decode(e).split("\n").map(e=>{if(!e.trim())return e;try{const r=function({event:e,sensitiveValues:t}){return(r=e,new ii(r,si)).with({type:"console"},e=>({...e,args:e.args?.map(e=>({...e,preview:li({sensitiveValues:t,str:e.preview}),value:ui({sensitiveValues:t,value:e.value})})),text:li({sensitiveValues:t,str:e.text})})).with({type:"before"},e=>({...e,params:pi({obj:e.params,sensitiveValues:t}),title:e.title?li({sensitiveValues:t,str:e.title}):void 0})).with({type:"after"},e=>({...e,error:fi({error:e.error,sensitiveValues:t}),result:void 0!==e.result?ui({sensitiveValues:t,value:e.result}):void 0})).with({type:"action"},e=>({...e,error:fi({error:e.error,sensitiveValues:t}),params:pi({obj:e.params,sensitiveValues:t}),result:void 0!==e.result?ui({sensitiveValues:t,value:e.result}):void 0,title:e.title?li({sensitiveValues:t,str:e.title}):void 0})).with({type:"event"},e=>({...e,params:pi({obj:e.params,sensitiveValues:t})})).with({type:"stdout"},{type:"stderr"},e=>({...e,text:void 0!==e.text?li({sensitiveValues:t,str:e.text}):void 0})).with({type:"error"},e=>({...e,message:li({sensitiveValues:t,str:e.message})})).with({type:"log"},e=>({...e,message:li({sensitiveValues:t,str:e.message})})).with({type:"context-options"},e=>({...e,options:pi({obj:e.options,sensitiveValues:t}),title:e.title?li({sensitiveValues:t,str:e.title}):void 0})).with({type:"frame-snapshot"},e=>({...e,snapshot:pi({obj:e.snapshot,sensitiveValues:t})})).with({type:"resource-snapshot"},e=>({...e,snapshot:pi({obj:e.snapshot,sensitiveValues:t})})).with({type:"screencast-frame"},{type:"input"},e=>e).exhaustive();var r}({event:JSON.parse(e),sensitiveValues:t});return JSON.stringify(r)}catch{return li({sensitiveValues:t,str:e})}});return n.encode(o.join("\n"))}({content:e,sensitiveValues:r}):n.endsWith(".html")||n.endsWith(".dat")||n.endsWith(".json")?hi({content:e,sensitiveValues:r}):n.startsWith("resources/")?async function({content:e,sensitiveValues:t}){return await(0,Io.isBinaryFile)(Buffer.from(e))?e:hi({content:e,sensitiveValues:t})}({content:e,sensitiveValues:r}):e}function vi(e=process.cwd()){let r=t.resolve(e);for(;;){const e=bi(r);if(e){const n={...e.dependencies,...e.devDependencies},o="@playwright/test"in n?"@playwright/test":"playwright"in n?"playwright":void 0;if(o){const e=wi(r);let n=!1,s=r;for(;;){const e=t.join(s,"node_modules"),r=t.join(e,o);if(i.existsSync(r)){n=!0;break}const a=t.dirname(s);if(a===s)break;s=a}return{inNodeModules:n,installed:!0,packageManager:e,packageName:o}}}const n=t.dirname(r);if(n===r)return{inNodeModules:!1,installed:!1,packageManager:void 0};r=n}}function bi(e){const r=t.join(e,"package.json");let n;try{n=i.readFileSync(r,"utf-8")}catch{return}try{return JSON.parse(n)}catch{return}}function wi(e){const r=[["npm","package-lock.json"],["pnpm","pnpm-lock.yaml"],["yarn","yarn.lock"]];let n=e;for(;;){for(const[e,o]of r)if(i.existsSync(t.join(n,o)))return e;const e=t.dirname(n);if(e===n)return;n=e}}function _i(e){if("npm"===e)return["npx","playwright"];if("pnpm"===e)return["pnpm","exec","playwright"];if("yarn"===e)return["yarn","playwright"];throw new Error("Package manager not supported")}var Ei=e=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),Ii=e=>(e instanceof Error?e.message:String(e)).slice(0,400),Ti=({outputDir:e,representativeTest:t})=>{const r=["test","--trace=on","--workers=1","--retries=0","--output",e];return t.filePath&&r.push(t.filePath),t.testIdentifier?r.push("--grep",`^${Ei(t.testIdentifier)}$`):t.testTitle&&r.push("--grep",Ei(t.testTitle)),r},xi=async e=>{const t=await g.readdir(e,{withFileTypes:!0}),r=[];for(const n of t){const t=D.default.join(e,n.name);if(n.isDirectory())r.push(...await xi(t));else if(n.isFile()&&"trace.zip"===n.name){const e=await g.stat(t);r.push({path:t,mtimeMs:e.mtimeMs})}}return r},{zSuiteAutoHealReport:Si,zRepresentativeTest:Ai}=function(e){const t=e.enum(yo),r=["Classification of the root cause:","",`- test: ${bo("test")}`,`- bug: ${bo("bug")}`,`- other: ${bo("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 and fix (must be existing IDs only)."),rootCause:e.string().describe("Brief explanation of what happened (1-2 sentences).")}),a=e.discriminatedUnion("result",[i.extend({fixApplied:e.string().describe("What fix was applied (brief, specific)."),result:e.literal("fixed"),traceProof:o.optional().describe("Optional trace proof metadata for fixed issues."),traceProofs:e.array(s).min(1).optional().describe("Optional per-test trace proof metadata for fixed issues.")}),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)."),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}}(I.z),Ci=({authHeader:e,diffTracker:t,orgId:r,runId:n,workingDir:s})=>d.createSdkMcpServer({name:"auto-heal-report",tools:[d.tool("capture-trace-proof",["Capture and upload a Playwright trace proof for a fixed issue or fixed test case.","","Use this only for fixed results. Pass representative test info from the worker.","Pass testCaseId and call once per fixed test case.","testCaseId is for per-test mapping/storage metadata; representativeTest selects the runnable test."].join("\n"),{issueId:I.z.string().min(1).describe("Issue identifier for deterministic output paths and storage key naming."),proofId:I.z.string().min(1).optional().describe("Optional id for deterministic proof naming and deduplication."),representativeTest:Ai.optional().default({}),testCaseId:I.z.string().min(1).optional().describe("Optional test case ID when capturing per-test trace proofs.")},async({issueId:t,proofId:a,representativeTest:c,testCaseId:l})=>{const u=I.z.string().min(1).parse(t),d=null==a?void 0:I.z.string().min(1).parse(a),p=null==l?void 0:I.z.string().min(1).parse(l),f=await(async({authHeader:e,issueId:t,orgId:r,proofId:n,representativeTest:s,runId:a,testCaseId:c,workingDir:l})=>{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 u=vi(l);if(!u.installed||!u.inNodeModules||!u.packageManager)return{status:"capture_failed",representativeTest:s,error:"Playwright is not installed in the current workspace."};const d=(e=>_o(e)??"issue")(t),p=(({proofId:e,testCaseId:t})=>Eo(t)??Eo(e))({testCaseId:c,proofId:n}),f=D.default.join(l,".stably","autoheal-proof",d,p??"issue"),[h,...m]=_i(u.packageManager),y=[...m,...Ti({outputDir:f,representativeTest:s})];try{await g.rm(f,{force:!0,recursive:!0}),await g.mkdir(f,{recursive:!0});const{code:u,stderr:d,timedOut:p}=await(async({args:e,command:t,cwd:r,timeoutMs:n})=>await new Promise((s,i)=>{const a=o.spawn(t,e,{cwd:r,env: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")},n);a.on("error",e=>{clearTimeout(u),i(e)}),a.on("close",e=>{clearTimeout(u),s({code:e,stderr:c,timedOut:l})})}))({args:y,command:h,cwd:l,timeoutMs:3e5});if(p)return{status:"capture_failed",representativeTest:s,error:"Trace proof run timed out while executing Playwright verification."};if(0!==u)return{status:"capture_failed",representativeTest:s,error:`Trace proof run failed (exit code ${u??"unknown"}): ${d.trim().slice(0,280)}`};const m=await(async e=>{const t=await xi(e);if(0!==t.length)return t.sort((e,t)=>t.mtimeMs-e.mtimeMs),t[0]?.path})(f);if(!m)return{status:"capture_failed",representativeTest:s,error:"Trace proof run completed, but no trace.zip was produced."};const{traceBucketPath:v,uploadUrl:b,sensitiveValues:w}=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:Cr(),headers:An(s),path:{runId:i}},(c.client??vr).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=Un.parse(a.data);return{traceBucketPath:l.traceBucketPath,expiresInSeconds:l.expiresInSeconds,key:l.key,uploadUrl:l.uploadUrl,sensitiveValues:l.sensitiveValues}})({authHeader:e,issueId:t,proofId:n,orgId:r,runId:a,testCaseId:c}),_=await async function({tracePath:e,sensitiveValues:t}){const r=[],n=i.createReadStream(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||Ns.some(t=>t.test(e))||js.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 gi(new Uint8Array(t)),s=Object.entries(o),i=await Promise.all(s.map(async([e,t])=>[e,await yi({content:t,filename:e,sensitiveValues:n})])),a=Object.fromEntries(i);return mi(a)}({traceBuffer:new Uint8Array(Buffer.concat(r)),sensitiveValues:t})}({tracePath:m,sensitiveValues:w});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:_,uploadUrl:b})}catch(e){return{status:"upload_failed",representativeTest:s,error:Ii(e)}}return{status:"captured",representativeTest:s,storage:v}}catch(e){return{status:"capture_failed",representativeTest:s,error:Ii(e)}}})({authHeader:e,issueId:u,orgId:r,proofId:d,representativeTest:Ai.parse(c??{}),runId:n,testCaseId:p,workingDir:s}),h="string"==typeof p?{testCaseId:p,...f}:f;return{content:[{text:JSON.stringify(h),type:"text"}]}}),d.tool("generate-report",["After attempting to fix all broken tests (skip only those truly infeasible), generate and return a suite auto-heal report in the required schema.","","Ensure the payload matches zSuiteAutoHealReport exactly; include every issue discovered."].join("\n"),{report:Si},async({report:o})=>{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}})(o),a=Si.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:Cr(),headers:An(t),path:{runId:n}},(s.client??vr).post({security:[{scheme:"bearer",type:"http"}],url:"/internal/v1/cli/runs/{runId}/autoheal-report",...s,headers:{"Content-Type":"application/json",...s.headers}}));var s;if(o.error)throw new Error(`Failed to upload auto-heal report (${o.response.status})`)})({authHeader:e,orgId:r,report:a,runId:n});const{uploadUrl:t}=await Ln({authHeader:e,contentType:"text/plain",orgId:r,runId:n});await On({contentType:"text/plain",diff:s,uploadUrl:t})}catch(e){return console.error("[auto-heal-report] Failed to upload report or diff:",e),{content:[{text:"Error: Failed to upload auto-heal report or diff. Please surface this to the user, and terminate the session.",type:"text"}]}}return{content:[{text:"Auto-heal report generated. You may terminate this session now.",type:"text"}]}})],version:"0.0.1"}),Ri=({onComplete:e,onRestartRequested:t})=>e?d.createSdkMcpServer({name:"session-control",tools:[d.tool("complete_session",["Call this tool when you have completed your task and the session should end.","Use this instead of waiting for the user to manually terminate.","Only call this when you are confident the task is fully complete."].join("\n"),{summary:I.z.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}`)})]}):d.createSdkMcpServer({name:"stably-agent-control",version:"1.0.0",tools:[d.tool("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."}]})))]}),Pi=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]"),Ui=(e,t)=>({message:Pi(e),status:t?.status,statusText:t?.statusText}),Li=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"]),Oi=async({authHeader:e,mode:t,maxTurnsOverride:r})=>{const n=Cr();yn.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??vr).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 yn.warn("Subagent definitions fetch failed: unauthorized (401)"),await Gr(),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 yn.warn("Subagent definitions fetch failed: forbidden (403)"),await Gr(),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 yn.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 yn.debug("Subagent definitions received",{count:Object.keys(i).length}),i},{zStablyYaml:Di}=function(e){const t=e.object({cron:e.string(),stablyTestArgs:e.string().optional(),timezone:e.string().optional()}),r=e.object({maxTurnsPerIssue:e.number().int().positive().optional(),maxParallelWorkers:e.number().int().positive().optional(),rules:e.string().optional()}),n=e.object({fix:r.optional()});return{zStablyYaml:e.object({schedules:e.record(e.string(),t).optional(),agent:n.optional()}),zAgentConfig:n,zAgentFixConfig:r,zScheduleEntry:t}}(v.z),ki=["Bash","Read","Write","Edit","Glob","Grep","Task","Skill"],Bi=["Task","mcp__playwright-test","Skill"],Ni=["Bash","Read","Write","Edit","Glob","Grep","mcp__session-control"],ji=e=>{if("EPIPE"!==e.code)throw e},$i="__main__",Mi=e=>"mcp__auto-heal-report__generate-report"===e,Hi=e=>"mcp__auto-heal-report__capture-trace-proof"===e?"Verify Test Run":"mcp__auto-heal-report__generate-report"===e?"Generate Report":go(e);async function Fi(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 Gi=async r=>{if("single"===r.mode||"build"===r.mode){const e=Array.isArray(r.prompt)?r.prompt.join(" "):r.prompt;yn.initSession(e||"create-from-diff")}else"fix"===r.mode&&yn.initSession(`fix-${r.runId}`);yn.info("Agent session starting",{mode:r.mode}),process.stdout.on("error",ji),process.stderr.on("error",ji);const n=e=>{if("EPIPE"!==e.code)throw e};process.on("uncaughtException",n),yn.debug("Checking authentication");const o=await In({autoLogin:"chat"===r.mode||"init"===r.mode}),s=(e=>"env"===e.type?e.auth.apiKey:e.auth.accessToken)(o);yn.debug("Authentication resolved",{authType:o.type});const c="oauth"===o.type?o.auth.context.orgId:void 0,l=D.default.resolve(process.cwd()),u=D.default.join(l,".env"),p=N.default.existsSync(u)&&N.default.statSync(u).isFile(),f=p?e.parse(N.default.readFileSync(u,"utf8")):{};yn.debug("Environment file",{path:u,exists:p,variableCount:Object.keys(f).length});const h="chat"!==r.mode&&"init"!==r.mode,m="chat"===r.mode;let y=new Jn;const v="chat"===r.mode?r.getHelpText:void 0,b={log:[],promptDisplay:"chat"===r.mode?"Ask Stably to build tests for you":"init"===r.mode?"Setting up Playwright and Stably SDK":"fix"===r.mode?"Fixing broken tests":(Array.isArray(r.prompt)?r.prompt.join(" "):r.prompt)?.trim()||"Creating tests from PR/branch changes",status:"running"};let w,_,E,I,T=h,A=!1,R=!1,U=0,L=0,O=!1;const k=[],B=new Map;let j=null,$=!1,F=!1;const G=Date.now();let z,Y="fix"===r.mode?{suiteId:r.runId,phase:"initializing",totalTests:null,fixedTests:0,failedTests:0,currentTestDescription:null,lastTestDescription:null,startedAt:G,endedAt:null,isError:!1,updatedAt:G,recentActivity:[],workers:[{id:$i,testDescription:"Orchestrator",workerType:"main",status:"running",summary:null,startedAt:G,endedAt:null,activity:[]}]}:null;const W=new Set,V=(e,t)=>{if(!Y)return;const r=Y.workers.map(r=>{if(r.id!==e)return r;const n=[...r.activity,{...t,timestamp:Date.now()}].slice(-15);return{...r,activity:n}});J({workers:r})},q=e=>{if(!Y)return;const t=[...Y.recentActivity,{...e,timestamp:Date.now()}].slice(-10);J({recentActivity:t})},K=e=>(Y?.workers??[]).map(t=>t.id===$i?{...t,status:e?"failed":"succeeded",endedAt:t.endedAt??Date.now()}:"running"===t.status?{...t,status:"failed",endedAt:Date.now()}:t),J=e=>{Y&&!z?.isClosed&&(Y={...Y,...e,updatedAt:Date.now()},z?.sendProgress(Y))},X=async e=>{if("fix"===r.mode){if("STARTED"===e){if($)return;$=!0}else{if(F)return;F=!0}try{await(async({authHeader:e,orgId:t,runId:r,status:n})=>{const o=await(s={auth:e,body:{status:n},client:Cr(),headers:An(t),path:{runId:r}},(s.client??vr).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:s,orgId:c,runId:r.runId,status:e})}catch{}}},Q="single"===r.mode||"build"===r.mode,Z=Date.now();let ee,te=null;const re=e=>{te&&!ee?.isClosed&&(te={...te,...e,updatedAt:Date.now()},ee?.sendProgress(te))},ne=e=>{if(!te)return;const t=[...te.recentActivity,{...e,timestamp:Date.now()}].slice(-10);re({recentActivity:t})};if(Q||"fix"===r.mode)try{const e=new URL("/internal/v1/cli/progress",wr).toString(),t={Authorization:s,"Content-Type":"application/json"};c&&(t["x-stably-org-id"]=c);const n="single"===r.mode?"create":"build"===r.mode?"build":"fix",i=await fetch(e,{method:"POST",headers:t,body:JSON.stringify({mode:n,projectId:Tn(o),agentId:M.default.randomUUID(),..."fix"===r.mode?{playwrightSuiteRunId:r.runId}:{}}),signal:AbortSignal.timeout(1e4)});if(i.ok){const{sessionId:e}=await i.json();if(Q){const t="single"===r.mode||"build"===r.mode?Array.isArray(r.prompt)?r.prompt.join(" "):r.prompt:null,n=Xn(l);te={sessionId:e,phase:"initializing",startedAt:Z,endedAt:null,isError:!1,updatedAt:Z,currentActivity:null,filesCreated:[],recentActivity:[],prompt:t||null,environment:{gitBranch:n?.branch??null,workingDirectory:l,nodeVersion:process.version,cliVersion:br}},ee=new kn({authHeader:s,orgId:c,sessionId:e,onUserMessage:e=>{y&&(yn.info("[ws] Injecting web UI message into agent",{contentLength:e.length}),ne({type:"user_message",summary:e}),de({text:`[Web] ${e}`}),y.pushText(`[Message from web UI user]: ${e}`),T||(T=!0,be({status:"running"})))}}),ee.start(),re({phase:"initializing"})}yn.info(`[${n}] Progress session created`,{sessionId:e})}else{const t=await i.text().catch(()=>"");yn.warn(`[${n}] Failed to create progress session: ${i.status} ${e} — ${t.slice(0,300)}`)}}catch(e){const t=e instanceof Error?e.message:String(e);yn.warn(`[progress] Session creation failed (non-fatal): ${t}`)}const oe={current:e=>{}},se={current:async()=>{}},{addSubagentActivity:ie,addSubagentStart:ae,addTool:ce,addToolResult:le,appendText:ue,appendUserMessage:de,cleanup:pe,setExiting:fe,setRunningLabel:he,setStatus:ge,setSubagentStatus:me,updateFixProgress:ye}=await(async(e,t)=>{const{Box:r,Static:n,Text:o,render:s,useInput:i}=await import("ink"),a=!!process.stdin.isTTY,c=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],l=()=>S.jsx(o,{inverse:!0,children:" "}),u=(({Box:e,Text:t,useInput:r},n,o)=>function({onChoice:s,prompt:i}){const[a,c]=x.useState(0),[l,u]=x.useState(!1),[d,p]=x.useState(""),f=[{label:"Yes, allow this once",value:"allow"},{label:"Yes, always allow for this session",value:"always"},{label:"No, tell AI what to do differently",value:"deny_with_message"}];r((e,t)=>{if(l)return t.return?void s("deny_with_message",d||"User denied this action"):t.escape?(u(!1),void p("")):t.backspace||t.delete?void p(e=>e.slice(0,-1)):void(t.ctrl||t.meta||p(t=>`${t}${e}`));if(t.upArrow)return void c(e=>e>0?e-1:f.length-1);if(t.downArrow)return void c(e=>e<f.length-1?e+1:0);if(t.return){const e=f[a];return"deny_with_message"===e.value?void u(!0):void s(e.value)}const r=parseInt(e,10);if(r>=1&&r<=f.length){const e=f[r-1];if("deny_with_message"===e.value)return void u(!0);s(e.value)}},{isActive:o});const h=go(i.toolName),g=mo(i.toolName,i.input);return S.jsxs(e,{borderColor:"yellow",borderStyle:"round",flexDirection:"column",marginTop:1,paddingX:1,paddingY:0,children:[S.jsx(t,{bold:!0,color:"yellow",children:"Permission Required"}),S.jsxs(e,{flexDirection:"column",marginTop:1,children:[S.jsx(t,{color:"magenta",children:h}),null!=g&&S.jsxs(t,{color:"gray",children:[" ",g]})]}),null!=i.decisionReason&&S.jsx(e,{marginTop:1,children:S.jsxs(t,{color:"gray",children:["Reason: ",i.decisionReason]})}),l?S.jsxs(e,{flexDirection:"column",marginTop:1,children:[S.jsx(t,{color:"gray",children:"Enter message for AI (press Enter to submit, Esc to cancel):"}),S.jsxs(t,{children:[S.jsx(t,{color:"yellow",children:">"})," ",d,S.jsx(n,{})]})]}):S.jsxs(e,{flexDirection:"column",marginTop:1,children:[S.jsx(t,{color:"gray",children:"Use ↑↓ arrows or number keys to select:"}),f.map((e,r)=>S.jsx(t,{children:S.jsxs(t,{color:r===a?"cyan":void 0,children:[r===a?"❯":" "," ",r+1,". ",e.label]})},e.value))]})]})})({Box:r,Text:o,useInput:i},l,a),d=(({Cursor:e,inkComponents:{Box:t,Static:r,Text:n,useInput:o},isRawModeSupported:s,PermissionPrompt:i,Spinner:a})=>{const c=({progress:e})=>{const[r,o]=x.useState(Date.now());x.useEffect(()=>{const e=setInterval(()=>o(Date.now()),1e3);return()=>clearInterval(e)},[]);const s=r-e.startedAt,i=Math.floor(s/1e3),a=Math.floor(i/60),c=i%60,l=a>0?`${a}m ${c.toString().padStart(2,"0")}s`:`${c}s`,{label: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 S.jsx(t,{flexDirection:"column",children:S.jsxs(n,{children:[S.jsx(n,{color:d,bold:!0,children:u}),S.jsx(n,{color:"gray",children:f}),S.jsxs(n,{color:"gray",children:[" [",l,"]"]})]})})},l=({progress:e})=>{const r=e.endedAt??Date.now(),o=Math.floor((r-e.startedAt)/1e3),s=Math.floor(o/60),i=o%60,a=s>0?`${s}m ${i.toString().padStart(2,"0")}s`:`${i}s`,c=e.isError?"yellow":"green",l=e.isError?"Fix stopped":"Fix complete";return S.jsxs(t,{flexDirection:"column",children:[S.jsxs(n,{color:c,bold:!0,children:[l," in ",a]}),null!==e.totalTests&&S.jsxs(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 S.jsxs(t,{flexDirection:"column",marginTop:1,children:[S.jsxs(n,{children:[S.jsx(n,{color:o,bold:!0,children:"Agent"}),r.description?S.jsxs(n,{color:"gray",children:[" (",r.description,")"]}):null]}),r.activities.length>0&&S.jsx(t,{flexDirection:"column",marginLeft:2,children:r.activities.map(e=>(e=>"tool"===e.kind?S.jsxs(n,{color:"magenta",children:["• ",e.content]},e.id):"tool_result"===e.kind?S.jsx(n,{color:"gray",children:e.content},e.id):null)(e))})]},e.id)}return"tool"===e.kind?S.jsxs(n,{color:"magenta",children:["• ",e.content]},e.id):"tool_result"===e.kind?S.jsx(n,{color:"gray",children:e.content},e.id):"user"===e.kind?S.jsxs(n,{color:"cyan",children:["You: ",e.content]},e.id):S.jsx(n,{children:e.content},e.id)},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]=x.useState({value:"",cursor:0}),I=_.value,T=_.cursor,A=x.useRef(!1),C=x.useRef(void 0),[R,P]=x.useState(!1),U=x.useRef(0),L=w.log.at(-1),O="text"===L?.kind&&"running"===w.status,D=w.log.findIndex(e=>"subagent"===e.kind&&"running"===e.subagent?.status),k=d?0:-1!==D?D:O?w.log.length-1:w.log.length;x.useEffect(()=>{w.log.length<U.current&&(U.current=0),k>U.current&&(U.current=k)},[w.log.length,k]);const B=w.log.slice(0,U.current),N=w.log.slice(U.current),j=!!w.permissionPrompt,$=x.useCallback(async()=>{A.current?(C.current&&clearTimeout(C.current),await(m?.()),process.exit(0)):(A.current=!0,P(!0),C.current=setTimeout(()=>{A.current=!1,P(!1)},2e3))},[m]);o((e,t)=>{t.ctrl&&"c"===e&&$().catch(()=>process.exit(1))},{isActive:s}),x.useEffect(()=>{if(j||!v)return;const e=e=>{const t=e.toString();""!==t&&"[1;5~"!==t?""!==t&&"[4;5~"!==t?""!==t&&"[1~"!==t&&"OH"!==t&&"[7~"!==t?""!==t&&"[4~"!==t&&"OF"!==t&&"[8~"!==t||E(e=>({...e,cursor: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)}},[j,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&&!j});const M=x.useMemo(()=>"running"===w.status?S.jsx(a,{label:w.runningLabel??"Working"}):"success"!==w.status?S.jsx(n,{color:"red",children:"✖ Failed"}):void 0,[w.runningLabel,w.status]),H=!(b||!v||"running"!==w.status||0!==w.log.length||w.resultText||w.errorText),F="running"===w.status&&!H||w.log.length>0||w.resultText||w.errorText||"running"!==w.status;return S.jsxs(t,{flexDirection:"column",children:[S.jsx(r,{items:["header"],children:()=>S.jsxs(t,{flexDirection:"column",flexShrink:0,children:[S.jsx(n,{color:"cyan",bold:!0,children:"Stably Agent"}),S.jsx(t,{flexDirection:"column",marginTop:1,children:S.jsx(n,{color:"gray",children:w.promptDisplay})})]},"header")}),B.length>0&&S.jsx(r,{items:B,children:e=>u(e)}),N.length>0&&S.jsx(t,{flexDirection:"column",children:N.map(e=>u(e))}),"error"===w.status&&w.errorText&&S.jsx(t,{marginTop:1,children:S.jsx(n,{color:"red",children:w.errorText})}),"success"===w.status&&w.resultText&&S.jsx(t,{marginTop:1,children:S.jsx(n,{children:w.resultText})}),F&&S.jsx(t,{flexDirection:"column",flexShrink:0,marginTop:1,children:"running"===w.status&&w.fixProgress?S.jsxs(t,{flexDirection:"column",children:[S.jsxs(t,{children:[S.jsx(a,{}),S.jsx(n,{children:" "}),S.jsx(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 S.jsxs(t,{flexDirection:"column",children:[S.jsxs(n,{children:[" ",S.jsx(a,{}),S.jsxs(n,{color:"gray",children:[r.description||"fix-worker",s>0?` (${s} ${1===s?"cycle":"cycles"})`:""]})]}),c&&S.jsxs(n,{color:"gray",dimColor:!0,children:[" • ",c.content]}),l&&S.jsxs(n,{color:"gray",dimColor:!0,children:[" ",l]})]},e.id)})]}):"success"!==w.status&&"error"!==w.status||!w.fixProgress?M:S.jsx(l,{progress:w.fixProgress})}),null!=w.permissionPrompt&&null!=y&&S.jsx(i,{onChoice:y,prompt:w.permissionPrompt}),null!=v&&null==w.permissionPrompt&&!w.isExiting&&S.jsxs(t,{borderColor:"gray",borderStyle:"round",flexDirection:"column",flexShrink:0,marginTop:1,paddingX:1,paddingY:0,children:[S.jsx(n,{color:"gray",children:"Type a message and press Enter. Press Ctrl+C to exit."}),S.jsxs(n,{children:[S.jsx(n,{color:"yellow",children:">"})," ",I.slice(0,T),S.jsx(e,{}),I.slice(T)]})]}),R&&S.jsxs(t,{marginTop:1,flexDirection:"column",children:[S.jsx(n,{color:"yellow",children:"Press Ctrl+C again to exit"}),on&&S.jsxs(n,{color:"gray",children:["Debug log: ",ln]})]})]})}})({Cursor:l,inkComponents:{Box:r,Static:n,Text:o,useInput:i},isRawModeSupported:a,PermissionPrompt:u,Spinner:({label:e})=>{const[t,r]=x.useState(0);return x.useEffect(()=>{const e=setInterval(()=>r(e=>(e+1)%c.length),80);return()=>clearInterval(e)},[]),S.jsxs(o,{color:"yellow",children:[c[t]," ",e]})}});let p=e;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(S.jsx(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(S.jsx(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=mo(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}})(b,"chat"===r.mode||"init"===r.mode?{onExit:()=>se.current(),onSend:e=>oe.current(e),showSpinnerImmediately:"init"===r.mode}:"fix"===r.mode?{onExit:()=>se.current(),isFixMode:!0}:void 0);let ve=b.status;const be=({error:e,result:t,status:r})=>{ve=r,ge({error:e,result:t,status:r})};let we;oe.current=e=>{const t=e.trim();if(m&&!yn.getLogFilePath()&&yn.initSession(t||"chat"),yn.debug("User message",{text:t}),"/help"===t){T&&y&&(A=!0,w?.interrupt?.(),y.allowNextTurn(),T=!1),"running"===ve&&be({status:"success"}),de({text:e});const t=v?.();return void ue({text:t??"Help is not available in this session."})}const r=E||R&&T;if(m&&(U+=1,I=void 0,r||(O=!1,he({label:void 0}))),y){if(r)return be({status:"running"}),de({text:e}),void k.push(e);if(!R||T||E||(R=!1),T)return be({status:"running"}),de({text:e}),y.pushText(e),void(L+=1);be({status:"running"}),de({text:e}),y.pushText(e),T=!0}};const _e=[];let Ee;const Ie=await(async()=>{if("single"===r.mode||"build"===r.mode){const n=await async function(e,r){const n=t.resolve(e);if(r){const e=t.resolve(n,r);return co(e,"output-flag"),{path:e,source:"output-flag"}}const o=so(n);if(o){const e=await async function(e){try{const t=(await g.readFile(e,"utf-8")).match(/testDir:\s*['"]([^'"]+)['"]/);return t?.[1]}catch{return}}(o);if(e){const r=t.resolve(t.dirname(o),e);if(ao(r))return co(r,"playwright.config.ts"),{path:r,source:"playwright.config.ts"}}}for(const e of io){const r=t.join(n,e);if(ao(r))return co(r,"auto-detected"),{path:r,source:"auto-detected"}}return co(n,"cwd-fallback"),{path:n,source:"cwd-fallback"}}(l,r.outputDir);return Ee=n.path,e=r.prompt,`${(Array.isArray(e)?e.join(" "):e).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: ${Ee}]`}var e;if("fix"===r.mode)try{yn.info("[fix] Fetching autoheal context",{runId:r.runId});const e=Date.now(),{context:t,autohealReportUrl:n}=await(async({authHeader:e,orgId:t,runId:r})=>{yn.debug("Fetching autoheal context",{runId:r});const n=await(o={auth:e,client:Cr(),headers:An(t),path:{runId:r}},(o.client??vr).get({security:[{scheme:"bearer",type:"http"}],url:"/internal/v1/cli/runs/{runId}/autoheal-context",...o}));var o;if(404===n.response.status)throw yn.warn("Autoheal context not found",{runId:r,status:404}),new Error(`Run ID "${r}" was not found.`);if(401===n.response.status)throw yn.warn("Autoheal context fetch unauthorized",{runId:r,status:401}),new Error("Unauthorized: failed to fetch autoheal context (401).");if(422===n.response.status)throw yn.warn("Autoheal context fetch invalid request",{runId:r,status:422,error:n.error?.error}),new Error(n.error?.error??"Failed to fetch autoheal context (422).");if(!n.error){const e=Cn.safeParse(n.data);if(e.success)return yn.debug("Autoheal context fetched successfully",{runId:r,contextSize:e.data.context.length}),{context:e.data.context,autohealReportUrl:e.data.autohealReportUrl};throw yn.warn("Autoheal context response invalid",{runId:r}),new Error("Autoheal context response missing or invalid context.")}throw yn.warn("Autoheal context fetch failed",{runId:r,error:n.error}),new Error("Failed to fetch autoheal context")})({authHeader:s,orgId:c,runId:r.runId});return yn.info("[fix] Autoheal context fetched",{runId:r.runId,durationMs:Date.now()-e,contextLength:t.length}),we=n,z||(yn.info("[fix] Creating WebSocket progress reporter"),z=new Dn({authHeader:s,orgId:c,runId:r.runId,onUserMessage:e=>{yn.info("[ws] Injecting web UI message into fix agent",{contentLength:e.length}),V($i,{type:"user_message",summary:e}),q({type:"user_message",summary:e}),de({text:`[Web] ${e}`}),y.pushText(`[Message from web UI user]: ${e}`)}}),z.start(),J({phase:"initializing"})),X("STARTED"),t}catch(e){const t=e instanceof Error?e.message:"Failed to fetch autoheal context.";yn.error("[fix] Failed to fetch autoheal context",{error:t}),be({error:t,status:"error"}),await pe(),process.exit(1)}return"init"===r.mode?"Please analyze this project and set up Playwright with the Stably SDK. Check for existing configurations and install the necessary dependencies.":""})(),Te=await async function(e){const t=D.default.resolve(e),r=D.default.join(t,"tests"),n=D.default.join(r,"helpers"),o=D.default.join(r,"assets"),s=function(e){const t=D.default.resolve(e);if(i.existsSync(t))for(const e of Qn){const r=D.default.join(t,`playwright.config${e}`);if(i.existsSync(r))return r}}(t)??D.default.join(t,"playwright.config.ts"),a=D.default.basename(s),c=D.default.join(r,"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:r}),to({defaultContent:"Directory does not exist yet",dirName:"helpers directory",dirPath:n}),to({defaultContent:"Directory does not exist yet",dirName:"assets directory",dirPath:o}),eo({defaultContent:"File does not exist or could not be read",fileName:a,filePath:s}),eo({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}}}(l),xe=await(async e=>{try{const t=await Dr(e,"stably.yaml");if(!t)return void yn.debug("No stably.yaml found");const r=await g.readFile(t,"utf-8");if(!r.trim())return;const n=C.parseDocument(r),o=Di.parse(n.toJS()),s=o.agent?.fix?.maxTurnsPerIssue,i=o.agent?.fix?.maxParallelWorkers,a=!!o.agent?.fix?.rules;return yn.debug(`Loaded stably.yaml: maxTurnsPerIssue=${s??"default"}, maxParallelWorkers=${i??"default"}, hasRules=${a}`,{path:t,config:o.agent}),o}catch(e){return void yn.warn("Failed to parse stably.yaml",{error:e})}})(l),Se=xe?.agent?.fix?.maxTurnsPerIssue,Ae=xe?.agent?.fix?.maxParallelWorkers,Ce=xe?.agent?.fix?.rules,Re="fix"===r.mode||"single"===r.mode||"build"===r.mode,Pe="single"===r.mode||"build"===r.mode?await(async e=>{try{const t=await Dr(e,"STABLY-CREATE.md");if(!t)return void yn.debug("No STABLY-CREATE.md found");const r=await g.readFile(t,"utf-8");if(!r.trim())return;return r.length>1e4?(yn.warn(`STABLY-CREATE.md exceeds max length (${r.length} > 10000), truncating`,{path:t}),r.slice(0,1e4)):(yn.debug("Loaded STABLY-CREATE.md rules",{path:t,contentLength:r.length}),r)}catch(e){return void yn.warn("Failed to read STABLY-CREATE.md",{error:e})}})(l):void 0;yn.info("[fix] Fetching system prompt and subagent definitions",{mode:r.mode,maxTurnsOverride:Se,hasCustomRules:!!Ce,hasCreateRules:!!Pe});const Ue=Date.now(),[Le,Oe]=await Promise.all([ro({allowedEnvVars:Object.keys(f),mode:r.mode,workspaceInfo:Te,authHeader:s,customHeader:"single"===r.mode||"build"===r.mode?r.customHeader:void 0,maxParallelWorkers:"fix"===r.mode?Ae:void 0}),Re?Oi({authHeader:s,mode:r.mode,maxTurnsOverride:Se}):Promise.resolve({})]);yn.info("[fix] System prompt and subagents fetched",{durationMs:Date.now()-Ue,systemPromptSize:Le.length,subagentCount:Object.keys(Oe).length,maxTurnsOverride:Se??"default"});const De={...f,...process.env},ke={};for(const[e,t]of Object.entries(De))Li.has(e)||void 0===t||(ke[e]=t);const Be=!0;yn.debug("AI proxy configuration",{useStablyAiProxy:Be,wantsBypassProxy:!1,wantsUseOllama:!1}),yn.info("[fix] Acquiring AI proxy key",{useStablyAiProxy:Be});const Ne=Date.now(),je=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??vr).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:Ui(e,a)}}return i.data?{key:i.data.key}:{error:Ui("No data in response",a)}}catch(e){const t=e instanceof Error?e.message:"Unknown error";return{error:Ui(t)}}var s}({auth:s,client:Cr(),source:"cli"}),$e=je?.key;if(yn.info("[fix] AI proxy key acquired",{durationMs:Date.now()-Ne,success:!!$e,hasError:!!je?.error}),!$e){const e=je?.error?.message?`Unable to make AI calls: ${je.error.message}`:"Unable to make AI calls. Check if you are authenticated.";yn.warn("Failed to get proxy API key",{error:je?.error?.message}),be({error:e,status:"error"}),await pe(),yn.flush(),yn.printLogFileInfo(),process.exit(1)}yn.debug("Proxy API key acquired",{success:!!$e});const Me=await Sn(),He=Me?Object.fromEntries(Object.entries(xn(Me)).filter(e=>null!=e[1])):void 0,Fe="init"===r.mode,Ge="fix"===r.mode,ze=Ge?Jt.createLocal({workingDir:l}):void 0;ze&&await ze.captureSnapshot();const Ye=Fe?Ri({onComplete:()=>{be({status:"success"}),fe(),y?.finish(),process.exit(0)}}):m?Ri({onRestartRequested:()=>{m&&(R=!0,be({status:"running"}),he({label:"Restarting browser tools..."}),I={createdAtUserMessageSeq:U,attempts:0})}}):void 0,We=Ye?m?{"stably-agent-control":Ye}:{"session-control":Ye}:{},Ve=Fe?Ni:[...ki,...Ge?["mcp__auto-heal-report"]:[]],qe=Fe?Ni:m?[...Bi,"mcp__stably-agent-control"]:Bi,Ke=Fe?We:Ge&&ze?{"playwright-test":{args:["playwright","run-test-mcp-server"],command:"npx",env:He},"auto-heal-report":Ci({authHeader:s,diffTracker:ze,orgId:c,runId:r.runId,workingDir:l}),...We}:{"playwright-test":{args:["playwright","run-test-mcp-server"],command:"npx",env:He},...We},Je="single"===r.mode||"build"===r.mode,Xe=Fe?[]:[{hooks:[async e=>{const t=$n(e);if(!t)return{decision:"approve"};let r=!1;const n=t.map(e=>Nn(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:[Yn({onResult:e=>le({message:e})})]},{matcher:"mcp__playwright-test__test_debug",hooks:[Wn({onResult:e=>le({message:e})})]},...Je?[{matcher:"Write",hooks:[qn({onFileCreated:e=>{_e.push(e),te&&re({filesCreated:[...te.filesCreated,e]})}})]}]:[]],Qe=Fe?[]:[{matcher:"mcp__playwright-test__browser_type",hooks:[zn({envVars:f})]}],Ze=Object.keys(Oe).length>0?Oe:void 0,et={...ke};et.MCP_TOOL_TIMEOUT=String(6e5),$e&&(et.ANTHROPIC_API_KEY=$e,et.ANTHROPIC_BASE_URL=Tr,et.CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS="1");const tt=process.env.STABLY_AGENT_MODEL??"claude-opus-4-6",rt=Ce?`\n\n## Custom Rules\n${Ce}`:"",nt=Pe?`\n\n## Custom Test Generation Rules\n${Pe}`:"",ot=Le+rt+nt;yn.debug("[fix] Final system prompt assembled",{baseSize:Le.length,fixRulesSize:rt.length,createRulesSize:nt.length,finalSize:ot.length});const st=D.default.join(__dirname,"stably-plugin"),it=N.default.existsSync(st)?{type:"local",path:st}:function(){const e=function(){try{if(!("undefined"==typeof document?require("url").pathToFileURL(e).href:P&&"SCRIPT"===P.tagName.toUpperCase()&&P.src||new URL("index.js",document.baseURI).href))return;const e=a.fileURLToPath("undefined"==typeof document?require("url").pathToFileURL(e).href:P&&"SCRIPT"===P.tagName.toUpperCase()&&P.src||new URL("index.js",document.baseURI).href),r=t.dirname(e);return t.join(r,"..","stably-plugin")}catch{return}}();if(e&&i.existsSync(e))return{type:"local",path:e}}(),at=()=>(yn.info("[fix] Starting SDK query",{model:tt,tools:Ve,mcpServers:Object.keys(Ke),resumeSessionId:_??null,subagentsEnabled:!!Ze,subagentCount:Object.keys(Oe).length,useStablyAiProxy:Be,aiProxyUrl:Tr,anthropicBaseUrl:void 0,stablyPluginPath:it?.path,stablyPluginExists:!!it}),d.query({options:{executableArgs:["--max-old-space-size=4096"],tools:Ve,allowedTools:qe,betas:[],canUseTool:(e,t)=>(yn.debug("[fix] canUseTool called",{toolName:e}),Promise.resolve({behavior:"allow",updatedInput:t})),cwd:l,env:et,hooks:{PostToolUse:Xe,PreToolUse:Qe},includePartialMessages:!0,agents:Ze,mcpServers:Ke,model:tt,permissionMode:"default",plugins:it?[it]:void 0,systemPrompt:ot,..._?{resume:_}:{}},prompt:y??Ie})),ct=()=>{if(y&&0!==k.length){for(const e of k)y.pushText(e);k.length=0,T=!0,be({status:"running"})}},lt=async()=>{m&&(E||(E=(async()=>{yn.info("Restarting MCP servers for chat mode"),be({status:"running"}),he({label:"Restarting browser tools..."});try{await(w?.interrupt?.())}catch(e){yn.warn("Failed to interrupt response during MCP restart",{error:e instanceof Error?e.message:String(e)})}await async function(){try{const{stdout:e}=await Kn('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 Kn(`pkill -KILL -P ${e} '.*' 2>/dev/null || true`)}))}catch{}}(),y?.finish(),y=new Jn,L=0,T=!1,A=!1,B.clear(),w=at(),O=!0,he({label:"Restarting browser tools..."}),m&&y&&I&&(I.createdAtUserMessageSeq===U?I.attempts>=1||k.length>0?I=void 0:(I.attempts+=1,y.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")),I=void 0,T=!0,be({status:"running"})):I=void 0),ct()})().finally(()=>{E=void 0,ct()})),await E)};if($e){const e=Tr,t=`${e.replace(/\/$/,"")}/v1/messages`;yn.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":$e,"anthropic-version":"2023-06-01","content-type":"application/json"},body:"{}"}),n=await e.text().catch(()=>""),o=Date.now()-r;yn.debug(`[fix] Pre-flight: ${e.status} in ${o}ms — ${n.slice(0,300)}`),401===e.status||403===e.status?yn.error(`[fix] Pre-flight: AI proxy key rejected (${e.status}) at ${t}`):yn.info("[fix] Pre-flight: AI proxy key valid",{status:e.status,durationMs:o})}catch(t){yn.error("[fix] Pre-flight: AI proxy unreachable",{error:t instanceof Error?t.message:String(t),durationMs:Date.now()-r,url:e})}}yn.info("[fix] Creating initial agent query"),yn.flush(),w=at(),yn.info("[fix] Agent query created, entering message loop"),"chat"!==r.mode&&y.pushText(Ie),se.current=async()=>{j="CANCELED",await X("CANCELED"),J({phase:"complete",endedAt:Date.now(),isError:!1,isInterrupted:!0,currentTestDescription:null,workers:K(!0)}),z?.close(),re({phase:"complete",endedAt:Date.now(),isError:!1,isInterrupted:!0}),ee?.close(),yn.flush(),fe();try{await(w?.interrupt?.())}catch{}y?.finish(),pe()};let ut=0,dt=null;const pt=setInterval(()=>{const e=Date.now()-G;dt?yn.info("[fix] Watchdog: message loop active",{messageCount:ut,elapsed:e}):yn.info("[fix] Watchdog: waiting for first SDK message",{elapsed:e}),yn.flush()},15e3);pt.unref();try{let e=!1;for(;;){if(!w){yn.info("[fix] No response object, exiting message loop");break}e=!1,yn.info("[fix] Entering for-await on SDK response");for await(const t of w){ut++,dt||(dt=Date.now(),yn.info("[fix] First SDK message received",{waitDurationMs:dt-G,messageType:t.type,messageSubtype:"subtype"in t?t.subtype:void 0}));const n="session_id"in t&&"string"==typeof t.session_id?t.session_id:void 0;if(n&&n!==_&&(_=n,yn.debug("Captured Claude session id",{sessionId:_})),"stream_event"===t.type){const{event:e}=t;(ut<=5||ut%200==0)&&yn.debug("[fix] Stream event",{msgNum:ut,eventType:e?.type});const r=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:t}=e;if("text_delta"===t?.type&&t.text){if(m&&R&&!r)continue;O&&(O=!1,he({label:void 0})),r&&B.has(r)?ie({toolUseId:r,kind:"text",content:t.text}):ue({text:t.text})}}"message_stop"===e?.type&&y&&y.allowNextTurn();continue}if("assistant"===t.type){const e="parent_tool_use_id"in t&&"string"==typeof t.parent_tool_use_id?t.parent_tool_use_id:void 0,{content:n}=t.message??{};if(Array.isArray(n)&&!e){const e=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("");e&&(yn.debug("Assistant message",{text:e}),"fix"===r.mode&&(V($i,{type:"ai_message",summary:e.slice(0,200)}),q({type:"ai_message",summary:e.slice(0,200)})),Q&&ne({type:"ai_message",summary:e.slice(0,200)}))}if(B.size>0){const r=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):[];yn.debug("Assistant message with active subagents",{hasParentToolUseId:!!e,parentToolUseId:e,activeSubagentIds:Array.from(B.keys()),toolNames:r,fullMessageKeys:Object.keys(t),rawMessage:JSON.stringify(t).slice(0,500)})}if(Array.isArray(n))for(const t of n){if("tool_use"===t?.type){if("mcp__session-control__restart_mcp_servers"===t.name||"mcp__stably-agent-control__restart_mcp_servers"===t.name){ce({rawName:t.name,toolInput:t.input});continue}if(t.name.startsWith("mcp__session-control__")||t.name.startsWith("mcp__stably-agent-control__"))continue;if(Mi(t.name))continue;if(B.size>0&&yn.debug("Tool use detected with active subagents",{toolName:t.name,hasParentToolUseId:!!e,parentToolUseId:e,wouldRouteToSubagent:!!e&&B.has(e),activeSubagentIds:Array.from(B.keys())}),"Task"===t.name){const e=t.input,n=e&&"object"==typeof e?e: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(yn.info("[fix] Subagent started",{subagentType:o,description:s,toolUseId:t.id,activeSubagentCount:B.size+1}),B.set(t.id,{subagentType:o,description:s}),ae({toolUseId:t.id,subagentType:o,description:s}),"fix"===r.mode){if("triage"===o){ye?.({phase:"triage"});const e={id:t.id,testDescription:"Triage",workerType:"triage",status:"running",summary:null,startedAt:Date.now(),endedAt:null,activity:[]};J({phase:"triage",workers:[...Y?.workers??[],e]})}else if("fix-worker"===o){W.add(s||t.id);const e={id:t.id,testDescription:s||t.id,workerType:"fix-worker",status:"running",summary:null,startedAt:Date.now(),endedAt:null,activity:[]};ye?.({phase:"fixing",totalTests:W.size,currentTestDescription:s||null}),J({phase:"fixing",totalTests:W.size,currentTestDescription:s||null,lastTestDescription:s||Y?.lastTestDescription||null,workers:[...Y?.workers??[],e]})}else"validation"===o?(ye?.({phase:"validation",currentTestDescription:null}),J({phase:"validation",currentTestDescription:null})):"context"===o&&J({currentTestDescription:s||null});q({type:"tool_call",summary:`[${o}] ${s}`.trim()})}continue}if(e&&B.has(e)){const n=Hi(t.name),o=mo(t.name,t.input),s=o?`${n} (${o})`:n;if(yn.debug("Subagent tool called",{tool:t.name,parentToolUseId:e}),ie({toolUseId:e,kind:"tool",content:s}),"fix"===r.mode){q({type:"tool_call",summary:s});const t=B.get(e);"fix-worker"!==t?.subagentType&&"triage"!==t?.subagentType||V(e,{type:"tool_call",summary:s})}continue}if(e&&yn.debug("Tool with parent_tool_use_id but no matching subagent",{tool:t.name,parentToolUseId:e,activeSubagentIds:Array.from(B.keys())}),yn.debug("Tool called",{tool:t.name,input:t.input}),ce({rawName:t.name,toolInput:t.input}),"fix"===r.mode){const e=Hi(t.name),r=mo(t.name,t.input),n=r?`${e} (${r})`:e;V($i,{type:"tool_call",summary:n}),q({type:"tool_call",summary:n})}if(Q){const e=Hi(t.name),r=mo(t.name,t.input),n=r?`${e} (${r})`:e;"initializing"===te?.phase?re({phase:"generating",currentActivity:n}):"mcp__playwright-test__test_run"===t.name&&"generating"===te?.phase?re({phase:"testing",currentActivity:n}):re({currentActivity:n}),ne({type:"tool_call",summary:n})}}if("text"===t?.type&&e&&B.has(e)){const n="string"==typeof t.text?t.text:"";if(n&&(ie({toolUseId:e,kind:"text",content:n}),"fix"===r.mode)){const t=B.get(e);"fix-worker"!==t?.subagentType&&"triage"!==t?.subagentType||V(e,{type:"ai_message",summary:n.slice(0,200)})}}}continue}if("user"===t.type){const e="message"in t&&t.message&&"object"==typeof t.message&&"content"in t.message?t.message.content:void 0;if(Array.isArray(e))for(const t of e)if(t&&"object"==typeof t&&"type"in t&&"tool_result"===t.type&&"tool_use_id"in t){const e="string"==typeof t.tool_use_id?t.tool_use_id:void 0,n="is_error"in t&&!0===t.is_error,o="content"in t&&"string"==typeof t.content?t.content:void 0;if(yn.debug("Tool result",{toolUseId:e,isError:n,output:o?.slice(0,500)}),e&&B.has(e)){const t=B.get(e);if(yn.info("[fix] Subagent completed",{toolUseId:e,isError:n,subagentType:t?.subagentType,description:t?.description,activeSubagentCount:B.size-1}),me({toolUseId:e,status:n?"error":"complete"}),"fix"===r.mode&&"triage"===t?.subagentType){const t=n?"failed":"succeeded",r=o?o.slice(0,500):null,s=(Y?.workers??[]).map(n=>n.id===e?{...n,status:t,summary:r,endedAt:Date.now()}:n);J({workers:s})}if("fix"===r.mode&&"fix-worker"===t?.subagentType){const t=n?"failed":"succeeded",r=o?o.slice(0,500):null,s=(Y?.workers??[]).map(n=>n.id===e?{...n,status:t,summary:r,endedAt:Date.now()}:n);n?(ye?.({failedTests:(Y?.failedTests??0)+1,currentTestDescription:null}),J({failedTests:(Y?.failedTests??0)+1,currentTestDescription:null,workers:s})):(ye?.({fixedTests:(Y?.fixedTests??0)+1,currentTestDescription:null}),J({fixedTests:(Y?.fixedTests??0)+1,currentTestDescription:null,workers:s}))}B.delete(e)}}continue}if("result"===t.type){if(yn.info("[fix] Agent result received",{subtype:t.subtype,messageCount:ut,elapsed:Date.now()-G,activeSubagents:B.size,fixedTests:Y?.fixedTests,failedTests:Y?.failedTests,phase:Y?.phase}),h){if("success"===t.subtype){if((Q||"fix"===r.mode)&&y){if(y.hasQueuedMessages()){yn.info("[ws] Queued web UI messages found, continuing agent"),T=!0,y.allowNextTurn();continue}if(await Fi(y,3e3)){yn.info("[ws] Web UI message received during grace period, continuing agent"),T=!0,y.allowNextTurn();continue}y.finish()}if(ye?.({phase:"complete",currentTestDescription:null,endedAt:Date.now()}),J({phase:"complete",currentTestDescription:null,endedAt:Date.now(),isError:!1,workers:K(!1)}),re({phase:"complete",endedAt:Date.now(),isError:!1,currentActivity:null}),Je&&_e.length>0){H.default.green("Created files:");for(const e of _e)H.default.green(`- ${e}`)}const e=(e,t)=>`]8;;${e}${t}]8;;`,t=we?H.default.cyan(`📊 View Autoheal Report:\n ${e(we,H.default.cyan(H.default.bold(H.default.underline(we))))}`):void 0;be({status:"success",result:t}),j="COMPLETED"}else A?(j="CANCELED",J({phase:"complete",endedAt:Date.now(),isError:!1,isInterrupted:!0,currentTestDescription:null,workers:K(!0)}),re({phase:"complete",endedAt:Date.now(),isError:!1,isInterrupted:!0})):(ye?.({endedAt:Date.now(),isError:!0}),J({phase:"complete",endedAt:Date.now(),isError:!0,currentTestDescription:null,workers:K(!0)}),re({phase:"complete",endedAt:Date.now(),isError:!0,currentActivity:null}),be({error:"Run failed.",status:"error"}),process.exitCode=1,j="FAILED");A=!1;break}const n=m&&R;if("success"!==t.subtype?A||(be({error:"Run failed.",status:"error"}),process.exitCode=1):be(n?{status:"running"}:{status:"success"}),T=!1,A=!1,n){R=!1,yn.info("Processing deferred MCP restart request in chat mode"),await lt(),e=!0;break}O=!1,he({label:void 0}),y?.allowNextTurn(),m&&L>0&&(L-=1,T=!0,be({status:"running"}));continue}}if(!e)break}}catch(e){A?(j="CANCELED",J({phase:"complete",endedAt:Date.now(),isError:!1,isInterrupted:!0,currentTestDescription:null,workers:K(!0)}),re({phase:"complete",endedAt:Date.now(),isError:!1,isInterrupted:!0})):(yn.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()-G}),be({error:`Agent encountered an error: ${e}`,status:"error"}),process.exitCode=1,j="FAILED",J({phase:"complete",endedAt:Date.now(),isError:!0,currentTestDescription:null,workers:K(!0)}),re({phase:"complete",endedAt:Date.now(),isError:!0,currentActivity:null}),yn.flush(),yn.printLogFileInfo())}finally{if(clearInterval(pt),yn.info("[fix] Agent session ending",{finalStatus:j,elapsed:Date.now()-G,totalMessages:ut}),T=!1,A=!1,process.off("uncaughtException",n),y?.finish(),j){yn.info("[fix] Reporting final autoheal status",{status:j});const e=Date.now();await X(j),yn.info("[fix] Final autoheal status reported",{durationMs:Date.now()-e})}if(yn.info("[fix] Closing WebSocket progress reporter"),z?.close(),ee?.close(),Ge&&ze){const e=Date.now();try{yn.info("[fix] Computing diff...");const t=await ze.computeDiff();if(t&&t.trim().length>0){yn.info("[fix] Uploading diff...",{diffLength:t.length});const{uploadUrl:n}=await Ln({authHeader:s,contentType:"text/plain",orgId:c,runId:r.runId});await On({contentType:"text/plain",diff:t,uploadUrl:n}),yn.info("[fix] Diff uploaded",{durationMs:Date.now()-e})}else yn.info("[fix] No diff to upload (empty or no changes)")}catch(t){yn.warn("[fix] Failed to upload diff",{error:t instanceof Error?t.message:String(t),durationMs:Date.now()-e})}}yn.info("[fix] Cleaning up diff tracker"),await(ze?.cleanup()),yn.info("[fix] Running final cleanup"),await pe(),yn.info("[fix] Cleanup complete")}},zi=G.default.object({runId:G.default.string(),timestamp:G.default.number()}),Yi="sha256",Wi=/^\/\*\*\r?\n \* @generated by stably build[\s\S]*?\*\/(?:\r?\n)*/;function Vi(e){return!!e&&"object"==typeof e&&"code"in e}async function qi({errorMessage:e,filePath:t}){try{return await F.default.readFile(t,"utf8")}catch(t){if(Vi(t)&&"ENOENT"===t.code)throw new Error(e);throw t}}function Ki(e){return e.split(D.default.sep).join("/")}async function Ji(e){try{return(await F.default.readdir(e)).filter(e=>Bn.test(e)).map(t=>D.default.join(e,t))}catch(e){if(Vi(e)&&"ENOENT"===e.code)return[];throw e}}var Xi=[{args:["--trace=on"],description:"Run Playwright tests",name:"test"},{args:[],description:"Install browser dependencies",name:"install"}],Qi=["You have two different versions of @playwright/test"];function Zi(e){const[t,...r]=_i(e),n=[t,...r.slice(0,-1)].join(" ");return(t,r)=>{let o=t.toString();for(const e of Xi)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 ea({overrideArgs:e,subcommand:r}){yn.info("[test] forwardToPlaywright starting",{subcommand:r,overrideArgs:e});const n=process.argv,s=n.findIndex((e,t)=>t>1&&e===r),a=-1===s?[]:n.slice(s+1),c="--"===a[0],l=c?a.slice(1):a;if(!c&&("--help"===l[0]||"-h"===l[0]))return async function({subcommand:e}){const t=Xi.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=vi();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:s}=n;if(!s)return void r("Could not determine package manager.");r("Playwright options:"),r("");const[i,...a]=_i(s),c=Zi(s);return new Promise(t=>{const r=o.spawn(i,[...a,e,"--help"],{stdio:["inherit","pipe","pipe"],env:{...process.env,...process.env.CI?{}:{FORCE_COLOR:"1"}}});r.stdout?.on("data",e=>{c(e,process.stdout)}),r.stderr?.on("data",e=>{c(e,process.stderr)}),r.on("close",()=>{t()})})}({subcommand:r});const u=e??[],d=new Set(u.map(e=>{const[t]=e.split("=");return t})),p=[];for(let e=0;e<l.length;e++){const t=l[e],[r]=t.split("=");d.has(r)?!t.includes("=")&&e+1<l.length&&!l[e+1].startsWith("-")&&e++:p.push(t)}const f=[r,...u,...p];yn.info("[test] Forwarded args computed",{forwardedArgs:f}),yn.info("[test] Resolving Stably test environment");const h=Date.now(),g="test"===r?await Sn():void 0;yn.info("[test] Stably test environment resolved",{durationMs:Date.now()-h,hasCredentials:null!=g,hasWsUrl:!!g?.STABLY_WS_URL}),yn.info("[test] Setting up Stably reporter injection");const m="test"===r?function({forwardedArgs:e,hasCredentials:r}){if(!r)return console.warn("⚠️ Stably credentials not found. Test results will not be reported to Stably."),console.warn(" To enable reporting, either:"),console.warn(" • Run `npx stably login` to authenticate"),void console.warn(" • Or set STABLY_API_KEY and STABLY_PROJECT_ID environment variables\n");const n=process.cwd(),s=e=>{const r=function(e){let r=t.resolve(e);for(;;){if([t.join(r,"node_modules","@stablyai","playwright-test"),t.join(r,"node_modules",".pnpm","@stablyai+playwright-test")].some(e=>i.existsSync(e)))return!0;const e=t.dirname(r);if(e===r)return!1;r=e}}(e);return r||(console.warn("⚠️ @stablyai/playwright-test is not installed. Stably reporter will not be injected."),console.warn(" Install it with: npm install @stablyai/playwright-test"),console.warn(" Reference: ]8;;https://docs.stably.ai/getting-started/sdk-setup-guidehttps://docs.stably.ai/getting-started/sdk-setup-guide]8;;\n")),r},a=(e,r)=>{try{return function({baseConfigPath:e,projectDir:r}){const n=function(e){try{const t=o.execSync("npm pkg get type",{cwd:e,encoding:"utf-8",stdio:["pipe","pipe","pipe"]});return"module"===JSON.parse(t.trim())}catch{return!1}}(r),s=n?"mts":"ts",a=t.dirname(t.resolve(e)),c=t.basename(e),l=t.join(a,`.stably-playwright-wrapper.config.${s}`),u=`\n// Auto-generated wrapper config by Stably CLI\n// This file injects the Stably reporter and ensures trace is enabled\nimport baseConfig from './${c}';\nimport { defineConfig, stablyReporter } from '@stablyai/playwright-test';\n\n// Inline type definitions to avoid import failures when @stablyai/playwright-test is not installed\ntype StablyNotificationConfig = {\n email?: { to: string[]; notifyOnStart?: boolean; notifyOnResult?: 'all' | 'failures-only' | null } | null;\n slack?: { channelName: string; notifyOnStart?: boolean; notifyOnResult?: 'all' | 'failures-only' } | null;\n};\n\ntype ProjectNotificationConfig = {\n projectName: string;\n notifications: StablyNotificationConfig;\n};\n\n// Extract notification configs from projects that have stably.notifications defined\n// This runs at config-load time before Playwright strips custom properties\nconst extractNotificationConfigs = (): ProjectNotificationConfig[] | undefined => {\n const projects = baseConfig.projects;\n if (!projects || !Array.isArray(projects)) return undefined;\n\n const configs = projects\n .map((p: { name?: string; stably?: { notifications?: StablyNotificationConfig } }) => {\n const notifications = p.stably?.notifications;\n return notifications ? { projectName: p.name ?? '', notifications } : undefined;\n })\n .filter((config): config is ProjectNotificationConfig => config != null);\n\n return configs.length > 0 ? configs : undefined;\n};\n\nconst isStablyReporter = (reporter: unknown): boolean => {\n // Only match @stablyai npm scope to avoid false positives on unrelated reporters\n // that might contain "stably" substring (e.g., "unstably-runner")\n if (typeof reporter === 'string') {\n return reporter.includes('@stablyai');\n }\n if (Array.isArray(reporter) && typeof reporter[0] === 'string') {\n return reporter[0].includes('@stablyai');\n }\n return false;\n};\n\nconst 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 // 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 })];\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 });\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 i.existsSync(a)||i.mkdirSync(a,{recursive:!0}),i.writeFileSync(l,u,"utf-8"),function(e){const r=t.join(e,".gitignore");try{if(i.existsSync(r)){const e=i.readFileSync(r,"utf-8");if(e.split("\n").map(e=>e.trim()).includes(no))return;const t=e.length>0&&!e.endsWith("\n");i.appendFileSync(r,`${t?"\n":""}${no}\n`)}else i.writeFileSync(r,`${no}\n`)}catch{}}(a),l}({baseConfigPath:e,projectDir:r})}catch{return void console.warn("⚠️ Could not create Stably wrapper config. Reporter injection skipped.")}};if(e.some(e=>"--config"===e||"-c"===e||e.startsWith("--config=")||e.startsWith("-c="))){const r=e.findIndex(e=>"--config"===e||"-c"===e);if(-1!==r&&e[r+1]){const o=t.resolve(n,e[r+1]),i=t.dirname(o);if(!s(i))return;const c=a(o,i);if(!c)return;return e[r+1]=c,c}const o=e.findIndex(e=>e.startsWith("--config=")||e.startsWith("-c="));if(-1!==o){const r=t.resolve(n,e[o].split("=")[1]),i=t.dirname(r);if(!s(i))return;const c=a(r,i);if(!c)return;const l=e[o].startsWith("--config=")?"--config=":"-c=";return e[o]=`${l}${c}`,c}}const c=so(n);if(!c)return;const l=t.dirname(c);if(!s(l))return;const u=a(c,l);return u?(e.push("--config",u),u):void 0}({forwardedArgs:f,hasCredentials:null!=g}):void 0;yn.info("[test] Reporter injection setup complete",{hasWrapperConfig:!!m}),yn.info("[test] Spawning Playwright process"),await function(e,t={}){yn.info("[test] Detecting Playwright installation");const r=vi();yn.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[s,...i]=_i(n),a=xn(t.env),c=[s,...i,...e];yn.info("[test] Spawning Playwright process",{command:c.join(" "),pid:process.pid});const l=Date.now(),u=o.spawn(s,[...i,...e],{stdio:["inherit","pipe","pipe"],env:{...a,...process.env.CI?{}:{FORCE_COLOR:"1"}}});yn.info("[test] Playwright process spawned",{childPid:u.pid});const d=Zi(n),p=function(){let e=!1,t="";return(r,n)=>{if(!e){t+=r,t.length>1024&&(t=t.slice(-1024));for(const r of Qi)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)}}}();u.stdout?.on("data",e=>{d(e,process.stdout)}),u.stderr?.on("data",e=>{const t=e.toString();d(e,process.stderr),p(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=>{yn.info("[test] Signal received, killing Playwright process",{signal:e,childPid:u.pid}),h(),u.kill(e);const t="SIGINT"===e?130:143;process.exit(t)};return process.on("SIGINT",g),process.on("SIGTERM",g),new Promise((e,t)=>{u.on("error",e=>{h()&&(yn.error("[test] Playwright process error",{error:e.message,childPid:u.pid}),t(e))}),u.on("close",t=>{if(!h())return;yn.info("[test] Playwright process exited",{exitCode:t,durationMs:Date.now()-l});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)})})})}(f,{env:g,onClose:()=>{var e;yn.info("[test] Playwright process closed, cleaning up wrapper config"),(e=m)&&i.existsSync(e)&&i.rmSync(e)}})}function ta(e=""){process.stdout.write(`${e}\n`)}function ra(...e){process.stderr.write(`${e.join(" ")}\n`)}var na="stably",oa=`https://registry.npmjs.org/${na}/latest`,sa=v.z.object({version:v.z.string()});function ia(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 aa(e,t){const r=ia(e),n=ia(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 ca=D.default.join(j.default.homedir(),".stably"),la=D.default.join(ca,"update-check.json"),ua=`https://registry.npmjs.org/${na}/latest`,da=v.z.object({lastCheck:v.z.number(),latestVersion:v.z.string()}),pa=!1,fa=!1,ha=async()=>{if(fa)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(){const e=function(){try{const e=N.default.readFileSync(la,"utf-8");return da.parse(JSON.parse(e))}catch{return null}}(),t=Date.now();if((null==e||t-e.lastCheck>=18e5)&&function(){const e=`\n const https = require('https');\n const fs = require('fs');\n const url = '${ua}';\n const cacheFile = ${JSON.stringify(la)};\n const cacheDir = ${JSON.stringify(ca)};\n\n const req = https.get(url, { timeout: 5000 }, (res) => {\n if (res.statusCode !== 200) process.exit(1);\n let data = '';\n res.on('data', (chunk) => data += chunk);\n res.on('end', () => {\n try {\n const version = JSON.parse(data).version;\n if (!fs.existsSync(cacheDir)) fs.mkdirSync(cacheDir, { recursive: true });\n fs.writeFileSync(cacheFile, JSON.stringify({ lastCheck: Date.now(), latestVersion: version }));\n } catch {}\n process.exit(0);\n });\n });\n req.on('error', () => process.exit(1));\n req.on('timeout', () => { req.destroy(); process.exit(1); });\n `;try{o.spawn(process.execPath,["-e",e],{detached:!0,stdio:"ignore",windowsHide:!0}).unref()}catch{}}(),null!=e&&aa(br,e.latestVersion)){if(pa)return;pa=!0;let t=!1;const r=()=>{if(t)return;t=!0;const r=`${H.default.yellow(`update available (${br} → ${e.latestVersion})`)} - run \`${na} upgrade\` to get the latest version\n`;try{N.default.writeSync(2,r)}catch{}};process.once("beforeExit",r),process.once("exit",r)}}(),ne.cwdChanged&&yn.debug("Changed working directory",{cwd:ne.newCwd});for(const e of ne.envFilesLoaded)yn.debug("Loaded env file",{path:e});for(const e of ne.envFileErrors)yn.warn(e);var ga=process.argv.findIndex(e=>"-v"===e||"--verbose"===e);-1!==ga&&process.argv.splice(ga,1);var ma=process.argv.findIndex(e=>"--no-telemetry"===e);-1!==ma&&process.argv.splice(ma,1),yn.info("CLI starting",{version:br,args:process.argv.slice(2),cwd:process.cwd()}),process.on("unhandledRejection",(e,t)=>{yn.error("Unhandled promise rejection",{reason:e instanceof Error?{message:e.message,stack:e.stack}:e,promise:String(t)}),yn.flush(),yn.printLogFileInfo()}),process.on("uncaughtException",(e,t)=>{"EPIPE"!==e.code&&(yn.error("Uncaught exception",{error:{message:e.message,stack:e.stack,name:e.name},origin:t}),yn.flush(),yn.printLogFileInfo())});var ya=new r.Command;ya.name("stably").description("AI-assisted Playwright testing CLI").version(br),ya.enablePositionalOptions(),ya.showHelpAfterError(),ya.exitOverride(),ya.configureHelp({subcommandTerm:e=>{const t=e.registeredArguments.map(e=>e.required?`<${e.name()}>`:`[${e.name()}]`).join(" ");return t?`${e.name()} ${t}`:e.name()}});var va=[];ya.configureOutput({writeOut:e=>process.stdout.write(e),writeErr:e=>{va.push(e)}});var ba=()=>{const e=ya.helpInformation().trimEnd();return e?`${e}\n`:""},wa=(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},_a=()=>{process.stdout.write(ba())};ya.command("help [command...]").description("Show help for a command (e.g. stably help create)").action(e=>{if(!e||0===e.length)return void _a();const t=wa(ya,e);if(!t)return process.stderr.write(`Unknown command: ${e.join(" ")}\n`),_a(),void(process.exitCode=1);var r;r=t,process.stdout.write((e=>{const t=e.helpInformation().trimEnd();return t?`${t}\n`:""})(r))}),ya.action(()=>Gi({mode:"chat",getHelpText:ba})),ya.command("login").description("Authenticate with Stably in your browser").action(Qr),ya.command("logout").description("Clear stored Stably credentials").action(async()=>{const e=bn();e&&(m.log.warn(`Environment variables ${H.default.cyan("STABLY_API_KEY")} and ${H.default.cyan("STABLY_PROJECT_ID")} are set.`),m.log.warn("They will continue to be used for authentication even after logout."),m.log.warn("Unset them if you want to fully de-authenticate this shell/session."));const t=await Hr();if(!t)return void m.outro(e?H.default.yellow("No stored OAuth login found to clear."):H.default.yellow("You are not logged in."));const r=m.spinner();r.start("Logging out..."),await(async e=>{try{await fetch(`${Er}/api/backend/v1/logout`,{body:JSON.stringify({refresh_token:e}),headers:{"Content-Type":"application/json"},method:"POST"})}catch{}})(t.refreshToken),await Gr(),await Yr(),r.stop(H.default.green("✓ Logged out")),m.outro(H.default.green("You have been logged out successfully."))}),ya.command("whoami").description("Show auth status and current project").action(async()=>{m.log.info(`${H.default.bold("CLI Version:")} ${H.default.cyan(br)}`);const e=bn();if(e){m.log.info(H.default.dim("Authentication: Environment variables")),m.log.info(` ${H.default.bold("API Key:")} ${H.default.cyan(e.apiKey.slice(0,8))}...`),m.log.info(` ${H.default.bold("Project ID:")} ${H.default.cyan(e.projectId)}`);const t=await Hr();if(t){let e;try{e=Or(t.accessToken).email}catch{e=void 0}m.log.warn("Stored OAuth login detected but will be ignored (env auth takes precedence)."),e&&m.log.info(` ${H.default.bold("OAuth Email:")} ${H.default.cyan(e)}`),m.log.info(` ${H.default.bold("Tip:")} Unset env vars to use OAuth`)}return void m.outro(H.default.green("Authenticated via environment variables"))}const t=await Hr();if(!t)return void m.outro(H.default.yellow("Not logged in. Run `stably login` to authenticate."));let r;try{r=Or(t.accessToken).email}catch{r=void 0}const n=await zr();if(!n)return m.log.info(H.default.dim("Authentication: OAuth (not linked to a project)")),r&&m.log.info(` ${H.default.bold("Email:")} ${H.default.cyan(r)}`),void m.outro(H.default.yellow("Logged in but this directory is not linked to a project. Run `stably login` to link."));const o=await(async()=>Dr(process.cwd(),Nr))(),s=o?D.default.dirname(o):process.cwd(),i=D.default.relative(process.cwd(),s)||".";m.log.info(H.default.dim("Authentication: OAuth")),r&&m.log.info(` ${H.default.bold("Email:")} ${H.default.cyan(r)}`),m.log.info(` ${H.default.bold("Organization:")} ${H.default.cyan(n.orgName)}`),m.log.info(` ${H.default.bold("Project:")} ${H.default.cyan(n.projectName)}`),m.log.info(` ${H.default.bold("Linked at:")} ${H.default.dim(i)}`),m.outro(H.default.green("Authenticated"))}),ya.command("build <input>").description("Compile a prompt file into a Playwright test").requiredOption("-o, --output <file>","Output file (required)").option("--force","Force regeneration even if prompt is unchanged").action(async(e,t)=>{try{await async function({force:e,input:t,output:r}){const n=process.cwd(),o=D.default.resolve(n,t),s=await async function({output:e}){const t=e.trim();if(!t)throw new Error("Output file is required. Example: -o tests/example.spec.ts");const r=D.default.resolve(process.cwd(),t);if([D.default.sep,"/"].some(e=>t.endsWith(e)))return{mode:"directory",dirPath:r};try{if((await F.default.stat(r)).isDirectory())return{mode:"directory",dirPath:r}}catch(e){if(!Vi(e)||"ENOENT"!==e.code)throw e}if(!Bn.test(r))throw new Error(`Output file must be a valid Playwright test file (e.g., .spec.ts, .test.ts): ${e}`);return{mode:"file",filePath:r}}({output:r}),i=await qi({filePath:o,errorMessage:`Prompt file not found: ${t}`});if(!i.trim())throw new Error(`Prompt file is empty: ${t}`);const a=function(e){const t=M.default.createHash(Yi).update(e,"utf8").digest("hex");return`${Yi}:${t}`}(i),c=Ki(D.default.relative(n,o)),l="directory"===s.mode,u=l?s.dirPath:D.default.dirname(s.filePath),d=(p=o,D.default.basename(p).replace(/\.prompt\.md$/,"").replace(/\.md$/,"").replace(/\.txt$/,""));var p;let f=l?await async function(e,t){return(await Ji(e)).find(e=>{const r=D.default.basename(e);return r.startsWith(`${t}.spec`)||r.startsWith(`${t}.test`)})}(s.dirPath,d):s.filePath;if(!e&&f&&await async function({outputFilePath:e,promptHash:t}){try{const r=function(e){const t=e.match(/^\/\*\*[\s\S]*?@prompt-hash\s+(sha256:[a-f0-9]{64})[\s\S]*?\*\//);return t?.[1]}(await F.default.readFile(e,"utf8"));return r===t}catch(e){if(Vi(e)&&"ENOENT"===e.code)return!1;throw e}}({outputFilePath:f,promptHash:a}))return H.default.green("Skipped build: test code is up to date (hash unchanged)"),"skipped";const h=l?new Set(await Ji(s.dirPath)):void 0;await F.default.mkdir(u,{recursive:!0});const g=function({builtAt:e=new Date,promptFile:t,promptHash:r}){return["/**"," * @generated by stably build",` * @prompt-hash ${r}`,` * @prompt-file ${t}`,` * @built-at ${e.toISOString()}`," *",` * DO NOT EDIT MANUALLY - regenerate with: stably build ${t} --force`," */"].join("\n")}({promptFile:c,promptHash:a}),m=Ki(l?D.default.relative(n,s.dirPath)||s.dirPath:D.default.relative(n,s.filePath)),y=function(e){const{promptContent:t}=e;return["Compile this test specification into a Playwright test file.",..."file"===e.mode?[`Primary output file: ${e.outputFile}`,"","File creation rules:","- Always create/update the primary output file specified above."]:[`Output directory: ${e.outputDir}`,"","Choose output filename:",`- Look at existing test files in ${e.outputDir} to determine the naming convention.`,"- Use the same extension pattern as existing tests (e.g., .test.ts or .spec.ts).","- If no existing tests, default to .spec.ts.","- Base the filename on the prompt content (e.g., login.spec.ts for login tests).","","File creation rules:","- Create your test file in the output directory with your chosen filename."],"- You MAY create shared helper files (e.g., lib/auth.ts) if the prompt explicitly requests reusable components.","- Prefer single-file output unless shared helpers would significantly improve maintainability.","- Never modify unrelated existing files.","","Sync workflow for existing files:",`1. Check whether ${"file"===e.mode?e.outputFile:`the test file in ${e.outputDir} (based on prompt filename or matching test file)`} already exists.`,"2. If it exists, read it first and compare it against the prompt specification.","3. Apply sync rules:"," - If file does not exist: CREATE from scratch."," - If file exists and already satisfies the prompt: KEEP behavior and make minimal edits only when needed."," - If file exists but only partially matches: UPDATE only changed scenarios so code aligns with prompt."," - If file structure conflicts heavily with prompt: REGENERATE the file content completely.","4. Prompt specification is the source of truth for final test behavior.","","Test verification:","After generating the test file, run the tests locally to verify they work correctly.","Use the appropriate test command (e.g., `pnpm stably test` or the repository's test command).","If tests fail, analyze the errors and iterate on the test code until all tests pass.","","Prompt specification:",t].join("\n")}(l?{mode:"directory",outputDir:m,promptContent:i}:{mode:"file",outputFile:m,promptContent:i});await Gi({mode:"build",prompt:y,outputDir:u,customHeader:g});const v=process.exitCode;if("number"==typeof v&&0!==v)throw new Error(`Build generation failed for: ${m}`);if(l&&!f&&h&&(f=(await Ji(s.dirPath)).find(e=>!h.has(e)),!f))throw new Error(`Build finished but no new test file was created in: ${m}`);if(!f)throw new Error(`Build finished but output file was not created: ${m}`);const b=await qi({filePath:f,errorMessage:`Build finished but output file was not created: ${m}`}),w=function(e){return e.replace(Wi,"")}(b),_=b.startsWith(g)?b:`${g}\n\n${w}`;_!==b&&await F.default.writeFile(f,_,"utf8");const E=Ki(D.default.relative(n,f));return H.default.green(`Built: ${E}`),"built"}({force:t.force??!1,input:e,output:t.output})}catch(e){const t=e instanceof Error?e.message:String(e);process.stderr.write(`${t}\n`),process.exitCode=1}}),ya.command("tunnel",{hidden:!0}).description("Expose a local server with a secure tunnel URL").option("-p, --port <number>","Local port to expose","3000").action(async e=>{m.intro(`Starting development server for port ${e.port}...`);const t=await In(),r="oauth"===t.type?`${t.auth.context.orgName}-${t.auth.context.projectName}`.toLowerCase().replace(/[^a-z0-9-]/g,""):`project-${t.auth.projectId}`.toLowerCase(),n=m.spinner();n.start("Starting development server...");const o=await R.startTunnel(`http://localhost:${e.port}`,{subdomain:r});n.stop(`Your local environment is available at: ]8;;${o.url}${H.default.underline(H.default.cyan(o.url))}]8;;`)}),ya.command("create [prompt...]").description("Generate a test from prompt (omit prompt to infer from branch diff)").option("-o, --output <dir>","Output directory for generated test files").action((e,t)=>{const r=e.length>0&&"test"===e[0]?e.slice(1):e;return Gi({mode:"single",prompt:r,outputDir:t.output})}).command("test",{hidden:!0}).description("Generate a Playwright test from a prompt (deprecated: use `stably create <prompt>` directly)").argument("<prompt...>","Prompt describing the test to generate").option("-o, --output <dir>","Output directory for generated test files").action((e,t)=>Gi({mode:"single",prompt:e,outputDir:t.output})),ya.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 o.execSync("git rev-parse --is-inside-work-tree",{cwd:e,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch{return!1}})(process.cwd())||(yn.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 yn.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(Kt))if(Kt[r].detect({env:e,cwd:t}))return{isCi:!0,...Kt[r].configuration({env:e,cwd:t})};return{isCi:Boolean(e.CI),...(r={env:e,cwd:t},{commit:bt(r),branch:wt(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 yn.debug("Run ID detected from CI environment",{runId:r}),t(r);yn.debug("No explicit run ID or CI environment detected, checking last-run.json");const n=await(async()=>{try{const e=await Dr(process.cwd(),".stably/last-run.json");if(!e)return;const t=await g.readFile(e,"utf-8");return{...zi.parse(JSON.parse(t)),filePath:e}}catch{return}})();if(n){const e=(Date.now()-n.timestamp)/36e5;return yn.debug("Run ID found in last-run.json",{runId:n.runId,timestamp:n.timestamp,filePath:n.filePath,ageHours:Math.round(e)}),e>24&&yn.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)}yn.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)),Gi({mode:"fix",runId:t})}),ya.command("init").description("Initialize Playwright and Stably SDK in your project").action(()=>Gi({mode:"init"})),ya.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;ta(H.default.cyan("Checking for updates...\n"));try{r=await async function(){const e=await async function(){const e=new AbortController,t=setTimeout(()=>e.abort(),1e4);t.unref();try{const t=await fetch(oa,{signal:e.signal});if(!t.ok)throw new Error(`Failed to fetch latest version: ${t.statusText}`);return sa.parse(await t.json()).version}finally{clearTimeout(t)}}();return{current:br,latest:e,isOutdated:aa(br,e)}}()}catch(e){return ra(H.default.red("Failed to check for updates:"),e instanceof Error?e.message:e),void(process.exitCode=1)}if(ta(`Current version: ${H.default.yellow(r.current)}`),ta(`Latest version: ${H.default.green(r.latest)}`),ta(),!r.isOutdated)return void ta(H.default.green("✓ You are already on the latest version!"));if(ta(H.default.yellow(`⚠ A new version is available: ${r.current} → ${r.latest}`)),ta(),t)return ta(H.default.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=o.execSync("npm root -g",{encoding:"utf-8"}).trim();if(e.includes(t))return"global-npm"}catch{}if(e.includes("node_modules/stably"))return"global-npm";try{const t=o.execSync("pnpm root -g",{encoding:"utf-8"}).trim();if(e.includes(t))return"global-pnpm"}catch{}try{const t=o.execSync("yarn global dir",{encoding:"utf-8"}).trim();if(e.includes(t))return"global-yarn-classic"}catch{}try{const t=o.execSync("yarn config get globalFolder",{encoding:"utf-8"}).trim();if(e.includes(t))return"global-yarn-berry"}catch{}return"unknown"}(),s=function(e){switch(e){case"global-npm":case"global-yarn-berry":case"unknown":return{command:"npm",args:["install","-g",`${na}@latest`],description:`npm install -g ${na}@latest`};case"global-pnpm":return{command:"pnpm",args:["add","-g",`${na}@latest`],description:`pnpm add -g ${na}@latest`};case"global-yarn-classic":return{command:"yarn",args:["global","add",`${na}@latest`],description:`yarn global add ${na}@latest`};case"npx":return{command:"npx",args:[`${na}@latest`],description:`npx ${na}@latest (always uses latest)`}}}(n);if("npx"===n)return ta(H.default.dim("You are running via npx, which always fetches the latest version.")),void ta(H.default.dim(`Simply run: ${H.default.white("npx stably")} to use the latest version.`));"unknown"===n?(ta(H.default.yellow("Could not detect installation method. Falling back to npm.")),ta()):"global-yarn-berry"===n&&(ta(H.default.yellow("Yarn Berry does not support global packages. Falling back to npm.")),ta()),ta(`Upgrade command: ${H.default.cyan(s.description)}`),ta(),ta(H.default.cyan("Upgrading...")),ta();try{await(i=s.command,a=s.args,new Promise((e,t)=>{const r=o.spawn(i,a,{stdio:"inherit",shell:"win32"===process.platform});r.on("close",r=>{0===r?e():t(new Error(`Upgrade command exited with code ${r}`))}),r.on("error",e=>{t(e)})})),ta(),ta(H.default.green("✓ Upgrade complete!")),ta(H.default.dim(`Run ${H.default.white("stably --version")} to verify.`))}catch(e){ra(H.default.red("Upgrade failed:"),e instanceof Error?e.message:e),ta(),ta(H.default.dim("You can try manually running:")),ta(H.default.cyan(` ${s.description}`)),process.exitCode=1}var i,a}(e)),Xi.forEach(({args:e,description:t,name:r})=>{ya.command(r).description(t).helpOption(!1).helpCommand(!1).allowUnknownOption(!0).allowExcessArguments(!0).passThroughOptions().action(()=>ea({overrideArgs:e,subcommand:r}))});var Ea=()=>{0!==va.length&&(process.stderr.write(va.join("")),va=[])};(async()=>{await(async()=>{if(!fa&&"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":br,"node.version":process.version,"os.platform":process.platform}}),fa=!0}catch{}})();try{await ya.parseAsync(process.argv),yn.info("CLI completed successfully")}catch(e){if(!(e=>!!e&&"object"==typeof e&&"code"in e)(e))throw yn.error("Unexpected CLI error",{error:e instanceof Error?e.message:String(e),stack:e instanceof Error?e.stack:void 0}),Ea(),yn.flush(),yn.printLogFileInfo(),await ha(),e;const t="number"==typeof e.exitCode?e.exitCode:1,r=process.argv.slice(2).find(e=>!e.startsWith("-")),n=!!r&&!!wa(ya,[r]);if(("commander.excessArguments"===e.code||"commander.unknownCommand"===e.code)&&r&&!n)return va=[],yn.warn("Unknown command",{command:r}),process.stderr.write(`command '${r}' not found\n`),_a(),void(process.exitCode=t);yn.debug("Commander error",{code:e.code,exitCode:t}),Ea(),process.exitCode=t}finally{yn.flush(),await ha()}})();