@checksum-ai/runtime 4.4.1-beta.1 → 4.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/cli.js CHANGED
@@ -794,7 +794,7 @@ export default {
794
794
  export default getChecksumConfig(${JSON.stringify(this.config,null,2)});
795
795
  `;(0,M_.writeFileSync)(n,s)}async cleanup(){this.runtimeAnalytics&&(Lc("Flushing events..."),await Wp(this.runtimeAnalytics.close(),2e4)),this.deleteVolatileConfig(),this.deleteWrappedPlaywrightConfig(),this.childProcesses.forEach(n=>{n.kill("SIGTERM")})}async getEnvInfo(){let n={commitHash:"",branch:"branch",environment:process.env.CI?"CI":"local",name:"name",startedAt:Date.now(),runtimeVersion:this.checksumRuntimeVersion,request:tc.testRun.request,platform:tc.testRun.platform,runType:tc.testRun.runType};try{n.commitHash=await this.getCmdOutput("git rev-parse HEAD")}catch(s){console.log("Error getting git hash",s.message)}try{n.branch=await this.getCmdOutput("git rev-parse --abbrev-ref HEAD")}catch(s){console.log("Error getting branch",s.message)}return n.name=await this.getEnvName(),n}async getEnvName(){let n=this.getChecksumArg("title");if(typeof n=="string"&&(n==null?void 0:n.length)>0)return n;try{return await this.getCmdOutput("git log -1 --pretty=%B")}catch(s){console.log("Error getting name",s.message);return}}getVolatileConfigPath(){return(0,Jm.join)(this.checksumRoot??"","checksum.config.tmp.ts")}deleteVolatileConfig(){let n=this.getVolatileConfigPath();(0,M_.existsSync)(n)&&(0,M_.rmSync)(n)}loadChecksumConfig(n={}){let s={...this.readChecksumConfigFile(n),...this.volatileChecksumConfig??{}};if(this.debugMode){if(!s.options)throw new Error("Checksum config options are not initialized");s.options.printLogs=!0}this.config=s,this.traceChecksumConfig()}readChecksumConfigFile(n={}){let s=(0,Jm.join)(this.checksumRoot,"checksum.config.ts");if(!(0,M_.existsSync)(s))return n.muteChecksumConfigMissingError||console.warn(`No checksum.config.ts found at ${s}. Continuing with default configuration.`),{};try{return JRe(s)}catch(c){console.log(`Failed to load checksum.config.ts at ${s}:
796
796
  ${c.message||c}`),process.exit(1)}}traceChecksumConfig(){!this.runtimeAnalytics||!this.config||this.runtimeAnalytics.checksumConfig(this.config)}processConfigArg(){this.deleteVolatileConfig();let n=this.getChecksumArg("config");if(n)try{this.volatileChecksumConfig=JSON.parse(n)}catch(s){this.volatileChecksumConfig=void 0,console.log("Error parsing cksm config",s.message)}}getNonChecksumArgs(){return this.args.filter(n=>!this.isChecksumArg(n))}getArg(n){var l;let s=this.args.find(d=>d.startsWith(`${n}`)),c=(l=s==null?void 0:s.split("=")[1])==null?void 0:l.trim();return c||!!s}getChecksumArg(n){return this.getArg(`--cksm-${n}`)}getChecksumRootOrigin(){return(0,Jm.join)(this.projectRootDirectory,"node_modules","@checksum-ai","runtime","checksum-root")}locateChecksumLibs(){try{this.findProjectRoot(),this.findChecksumRoot()}catch(n){console.log(n.message),process.exit(1)}}findProjectRoot(){let n=process.cwd(),s=n;for(let c=0;c<10;c++){if((0,M_.existsSync)((0,Jm.join)(s,".git"))){if(this.absoluteProjectRootDirectory)break;this.absoluteProjectRootDirectory=s,Lc("Project root directory found at (git root)",this.absoluteProjectRootDirectory)}if((0,Jm.parse)(s).root===s)break;s=(0,Jm.join)(s,"..")}n=process.cwd();for(let c=0;c<6;c++){let l=(0,Jm.join)(n,"node_modules","@checksum-ai","runtime");if((0,M_.existsSync)(l)){this.projectRootDirectory=n,this.absoluteProjectRootDirectory||(this.absoluteProjectRootDirectory=n),Lc("Project root directory found at (node_modules fallback)",this.projectRootDirectory);return}if((0,Jm.parse)(n).root===n)break;n=(0,Jm.join)(n,"..")}if(this.absoluteProjectRootDirectory){this.projectRootDirectory=this.absoluteProjectRootDirectory;return}throw new Error(process.env.CHECKSUM_RUNTIME_DEV_MODE?"Could not resolve checksum root origins, tried to look in .git and node modules. please build the runtime":"Could not resolve checksum root origins")}setChecksumRoot(n){this.checksumRoot=n,Lc("Checksum root directory found at",this.checksumRoot),this.createInternalFilesDir()}findChecksumRoot(){if(tc.checksumRootFolderBypass){let c=(0,Jm.isAbsolute)(tc.checksumRootFolderBypass)?tc.checksumRootFolderBypass:(0,Jm.join)(this.projectRootDirectory,tc.checksumRootFolderBypass);this.setChecksumRoot(c);return}let n=t(c=>{try{return(0,M_.readdirSync)(c).includes("checksum.config.ts")}catch{return!1}},"containsChecksumConfig"),s=[this.projectRootDirectory];for(;s.length;){let c=s.pop();if(c===void 0)break;let l=(0,M_.readdirSync)(c,{withFileTypes:!0});for(let d of l){let h=(0,Jm.join)(c,d.name),b=h;if(d.isSymbolicLink())try{let T=(0,M_.readlinkSync)(h);if(!(0,M_.lstatSync)(T).isDirectory())continue;b=T}catch{continue}else if(!d.isDirectory())continue;if(d.name===hIe){if(n(b)){this.setChecksumRoot(b);return}}else s.push(h)}}throw new Error("Could not find checksum root folder. Run `npx checksumai init` to create one.")}log(n,s=!1){s?this.printError(n):console.log(n)}runtimeTrace(n,s){var c;(c=this.runtimeAnalytics)==null||c.eventWithMessage(s,n)}isChecksumArg(n){return n.startsWith("--cksm-")}};t(T_t,"CLICommandBase");var $0=T_t;function QQ(i,n){for(let s of i){if(s===n)return"";if(s.startsWith(`${n}=`))return s.slice(n.length+1).trim()}}t(QQ,"findFlagValue");function GRe(i,n){return QQ(i,n)!==void 0}t(GRe,"findFlag");var kme="--cksm-auto-heal",_B={enable:`${kme}`,createPr:`${kme}-create-pr`,repoName:`${kme}-repo-name`,prNumber:`${kme}-pr-number`,branch:`${kme}-branch`};function Yar(i){if(!GRe(i.args,_B.enable))return{kind:"disabled"};let n=QQ(i.args,_B.createPr),s=QQ(i.args,_B.repoName),c=QQ(i.args,_B.prNumber),l=QQ(i.args,_B.branch),d=ICn(n,!0);if(d===void 0)return{kind:"error",message:`${_B.createPr}: expected "true" or "false" (or omit a value), got "${n}"`};let h;if(c!==void 0&&c!==""){let j=Number(c);if(!Number.isInteger(j)||j<=0)return{kind:"error",message:`${_B.prNumber}: expected a positive integer, got "${c}"`};h=j}let b=SCn(i.env),T=typeof s=="string"&&s!==""?s:b.repoName,k=typeof l=="string"&&l!==""?l:b.branch,F=h??b.prNumber;if(d&&!T)return{kind:"error",message:`${_B.repoName} is required when auto-create-pr is enabled \u2014 pass --cksm-auto-heal-repo-name=owner/repo or set GITHUB_REPOSITORY / CI_PROJECT_PATH`};if(F!==void 0&&!T)return{kind:"error",message:`${_B.repoName} is required when ${_B.prNumber} is set`};let H={autoCreatePR:d};return k&&(H.branch=k),F!==void 0&&(H.prNumber=F),T&&(H.repoName=T),{kind:"enabled",options:H}}t(Yar,"resolveAutoHealOptions");function SCn(i){var n;if(i.GITHUB_ACTIONS==="true"){let s=i.GITHUB_REPOSITORY||void 0,c=i.GITHUB_HEAD_REF||i.GITHUB_REF_NAME||void 0,l;if(i.GITHUB_EVENT_NAME==="pull_request"){let h=(n=i.GITHUB_REF)==null?void 0:n.match(/^refs\/pull\/(\d+)\//);if(h){let b=Number(h[1]);Number.isInteger(b)&&b>0&&(l=b)}}let d={};return s&&(d.repoName=s),c&&(d.branch=c),l!==void 0&&(d.prNumber=l),d}if(i.GITLAB_CI==="true"){let s=i.CI_PROJECT_PATH||void 0,c=i.CI_MERGE_REQUEST_SOURCE_BRANCH_NAME||i.CI_COMMIT_REF_NAME||void 0,l;if(i.CI_MERGE_REQUEST_IID){let h=Number(i.CI_MERGE_REQUEST_IID);Number.isInteger(h)&&h>0&&(l=h)}let d={};return s&&(d.repoName=s),c&&(d.branch=c),l!==void 0&&(d.prNumber=l),d}return{}}t(SCn,"detectCiContext");function ICn(i,n){if(i===void 0)return n;if(i===""||i==="true")return!0;if(i==="false")return!1}t(ICn,"parseBoolFlag");function Zar(i){let n=i.body&&typeof i.body=="object"?i.body:{};if(!i.ok){let s=TCn(n.message);return{kind:"fatal",message:`Checksum could not create the test run (HTTP ${i.status})`+(s?`: ${s}`:".")}}return n.uuid?{kind:"success",uuid:n.uuid,...n.appName!==void 0?{appName:n.appName}:{}}:{kind:"fatal",message:`Checksum test-run creation (HTTP ${i.status}) returned no session id; the report cannot be hosted.`}}t(Zar,"decideSessionCreateOutcome");function TCn(i){return typeof i=="string"?i:Array.isArray(i)?i.filter(n=>typeof n=="string").join("; "):""}t(TCn,"extractMessage");var xCn="--cksm-affected",wCn="--cksm-affected-dry-run";function Kar(i){let n=QQ(i.args,xCn),s=GRe(i.args,wCn);return n===void 0&&!s?{kind:"disabled"}:{kind:"enabled",baseRef:(n==null?void 0:n.trim())||kCn(i.env),dryRun:s}}t(Kar,"resolveAffectedTestsOptions");function kCn(i){var c,l;let n=(c=i.GITHUB_BASE_REF)==null?void 0:c.trim();if(n)return`origin/${n}`;let s=(l=i.CI_MERGE_REQUEST_TARGET_BRANCH_NAME)==null?void 0:l.trim();if(s)return`origin/${s}`}t(kCn,"detectCiBaseRef");var DCn=/^[A-Za-z0-9._/~^@-]+$/,NCn=/^[0-9a-fA-F]{4,40}$/;function Xar(i){if(!DCn.test(i))throw new Error(`Unsafe git ref for --cksm-affected: "${i}". Only letters, digits and . _ / - are allowed.`);return i}t(Xar,"assertSafeRef");async function PCn(i,n){let s=i==null?void 0:i.trim();if(s)return Xar(s);try{let c=(await n("git symbolic-ref --short refs/remotes/origin/HEAD")).trim();if(c)return Xar(c)}catch{}for(let c of["origin/main","origin/master"])try{return await n(`git rev-parse --verify --quiet ${c}`),c}catch{}throw new Error("Could not resolve a base git ref for --cksm-affected. Pass one explicitly, e.g. --cksm-affected=origin/main")}t(PCn,"resolveBaseRef");async function ecr(i,n){let s=await PCn(i,n),c="false";try{c=(await n("git rev-parse --is-shallow-repository")).trim()}catch{}if(c==="true")throw new Error("--cksm-affected needs full git history but this is a shallow clone. In GitHub Actions set `fetch-depth: 0` on actions/checkout (or `GIT_DEPTH: 0` / `git fetch --unshallow` in GitLab CI).");let l=(await n(`git merge-base "${s}" HEAD`)).trim();if(!NCn.test(l))throw new Error(`Unexpected merge-base output for --cksm-affected: "${l}"`);return(await n(`git diff --name-only "${l}"`)).split(`
797
- `).map(h=>h.trim()).filter(Boolean)}t(ecr,"computeAffectedChangedFiles");var x_t=require("crypto");function tcr(i,n){return{testSuiteRunId:n,appName:"generic-app",commitHash:"generic-commit-hash",envName:"generic-env-name",branch:"generic-branch",checksumRuntimeVersion:i}}t(tcr,"createDefaultTestSuiteRunInfo");function rcr(i,n,s={}){let c=["mock-app","mock-app-2","mock-app-3"];return{...{appName:c[Math.floor(Math.random()*c.length)]??c[0],commitHash:(0,x_t.randomUUID)(),envName:"test-environment",branch:(0,x_t.randomUUID)(),testSuiteRunId:n,checksumRuntimeVersion:i},...s}}t(rcr,"createMockTestSuiteRunInfo");var Rte=require("fs"),Bte=require("path");var YRe=require("fs"),wA=Na(uZe());var RCn=/^[0-9a-zA-Z]+$/,BCn=5;function ncr(i){return i?i.length===BCn&&RCn.test(i):!1}t(ncr,"isValidChecksumTestId");var N_t=class N_t{extract(n,s){if(!n)return;let c=n.split("/"),l=c[c.length-1];if(!l||!l.endsWith(".checksum.spec.ts"))return;let h=l.replace(".checksum.spec.ts","").split(" - ").pop();return ncr(h)?h:void 0}};t(N_t,"FileNameExtractionStrategy");var w_t=N_t,P_t=class P_t{extract(n,s){if(!(!n||!(0,YRe.existsSync)(n)))try{let c=(0,YRe.readFileSync)(n,"utf-8"),l=wA.createSourceFile(n,c,wA.ScriptTarget.Latest,!0),d=new Map,h=t(b=>{if(wA.isCallExpression(b)){let T=b;if(this.isTestCall(T.expression)){let k=T.arguments[0];if(k&&wA.isCallExpression(k)&&wA.isIdentifier(k.expression)&&k.expression.text==="defineChecksumTest"){let F=this.extractDefineChecksumTestArgs(k);F&&ncr(F.checksumTestId)&&d.set(F.testTitle,F.checksumTestId)}}}wA.forEachChild(b,h)},"visit");return h(l),s&&d.has(s)?d.get(s):d.size>0?Array.from(d.values())[0]:void 0}catch{return}}isTestCall(n){return wA.isIdentifier(n)&&n.text==="test"?!0:wA.isPropertyAccessExpression(n)?wA.isIdentifier(n.expression)&&n.expression.text==="test":!1}extractDefineChecksumTestArgs(n){let s=n.arguments;if(s.length<2)return;let c=s[0],l=s[1];if(!c||!l)return;let d=this.extractStringLiteral(c),h=this.extractStringLiteral(l);if(d&&h)return{testTitle:d,checksumTestId:h}}extractStringLiteral(n){if(wA.isStringLiteral(n)||wA.isNoSubstitutionTemplateLiteral(n))return n.text}};t(P_t,"FileContentExtractionStrategy");var k_t=P_t,R_t=class R_t{constructor(n){this.strategies=n??[new k_t,new w_t]}extract(n,s){for(let c of this.strategies){let l=c.extract(n,s);if(l)return l}}};t(R_t,"ChecksumTestIdExtractor");var D_t=R_t;var icr=new D_t;function F_t(i,n){return n.pwTestIdToChecksumTestId[i.playwrightTestId]||(i.filePath!==void 0?icr.extract(i.filePath,i.title):void 0)}t(F_t,"resolveChecksumTestId");var ZRe=t((i,n)=>Object.values(n[i]??{}).some(s=>{var c,l;return(l=(c=s.autoRecoveryMetadata)==null?void 0:c.data)==null?void 0:l.autoRecovered}),"isAutoRecovered"),B_t=t(i=>typeof i=="number"&&!isNaN(i)?i:0,"getStat");function KRe(i,n,s){let c=[],l=0,d=0,h=B_t(n.expected)+B_t(n.flaky),b=B_t(n.unexpected);for(let T of i){let k=FCn(T,s);c.push(k),k.recovered&&d++,k.bug&&(l++,k.outcome==="expected"||k.outcome==="flaky"?h--:k.outcome==="unexpected"&&b--)}return{passed:h,failed:b,bug:l,recovered:d,tests:c}}t(KRe,"computeReportStats");function FCn(i,n){let s=F_t({playwrightTestId:i.playwrightTestId,filePath:i.filePath,title:i.title},n),c=OCn(i),l=MCn(i.annotations),d=ZRe(i.playwrightTestId,n.playwrightIdToMetadata),h=LCn(s,i,n),b=n.toRelativeFilePath(i.filePath);return{checksumTestId:s,playwrightTestId:i.playwrightTestId,success:i.ok,recovered:d,bug:c,annotations:l,tags:i.tags,outcome:i.outcome,...i.filePath!==void 0?{filePath:i.filePath}:{},...b!==void 0?{relativeFilePath:b}:{},...i.projectName?{project:i.projectName}:{},...h!==void 0?{usingChecksumTestIdPlaceholder:h}:{}}}t(FCn,"rowToTestWithMetadata");var OCn=t(i=>i.tags.includes("bug")||i.annotations.some(n=>n.type==="bug")||i.title.includes("@bug"),"detectBug"),MCn=t(i=>i.filter(n=>!!(n!=null&&n.type)).map(n=>({type:n.type,description:n.description||""})),"normalizeAnnotations"),LCn=t((i,n,s)=>{if(s.checksumTestIdToUsingPlaceholder)return s.pwTestIdToChecksumTestId[n.playwrightTestId]&&s.checksumTestIdToUsingPlaceholder[i]||!1},"computeUsingPlaceholder");var O_t=t((i,n,s)=>{if(!i)return;let c=s||n,l;if((0,Bte.isAbsolute)(i))l=i;else{let h=(0,Bte.dirname)(n);l=(0,Bte.resolve)(h,i)}return l.replace(c+"/","")},"toRelativeFilePath"),scr=t(i=>{let n=[];if(i.specs&&n.push(...i.specs),i.suites)for(let s of i.suites)n.push(...scr(s));return n},"extractSpecsFromSuite"),ocr=t(i=>{let n=[];for(let s of i.suites)n.push(...scr(s));return n},"extractFlatSpecsMap"),QCn=t(i=>ocr(i).map(n=>{var c;let s=(c=n.tests)==null?void 0:c[0];return{playwrightTestId:n.id,ok:!!n.ok,outcome:(s==null?void 0:s.status)??"skipped",title:n.title,filePath:n.file,tags:n.tags??[],annotations:(s==null?void 0:s.annotations)??[]}}),"jsonReportToRows"),UCn=t((i,n,s,c,l)=>(jCn(i,n),KRe(QCn(i),i.stats,{pwTestIdToChecksumTestId:s,playwrightIdToMetadata:n,toRelativeFilePath:t(d=>c?O_t(d,c,l):d,"toRelativeFilePath")})),"modifyStatsPerTestFile"),jCn=t((i,n)=>{for(let s of ocr(i))ZRe(s.id,n)&&(s.recovered=!0)},"markRecoveredSpecs"),acr=t((i,n,s,c,l)=>{(0,Rte.cpSync)(i,i+".backup");try{let d=JSON.parse((0,Rte.readFileSync)(i,"utf-8")),h=UCn(d,n,s,c,l);return d.checksumMetadata=h,(0,Rte.writeFileSync)(i,JSON.stringify(d,null,2)),d}catch(d){return console.log("Error processing JSON report",d.message),null}},"processJSONReport");var x6,Dme=!1,ccr=!1,$Cn=t(i=>{if(!x6||Dme)return;Dme=!0;let n={...x6,exit_code:i,duration_ms:Date.now()-x6._startedAtMs};if(delete n._startedAtMs,!!URe())try{Pte({severity:LRe(n),message:`cli ${n.command} exit=${i} ${n.duration_ms}ms`,...n})}catch(s){try{QRe(`[wide-event] cli emit failed: ${String(s)}`)}catch{}}},"emitCliInvocation"),lcr=t(i=>{x6={timestamp:new Date().toISOString(),_startedAtMs:Date.now(),kind:"cli_invocation",command:i,pid:process.pid,node_version:process.version,platform:process.platform,ci:process.env.CI==="true"||process.env.CI==="1"},Dme=!1,ccr||(ccr=!0,process.on("exit",$Cn),process.on("uncaughtException",n=>{throw x6&&!Dme&&(x6.error={type:n.name,message:n.message,source:"uncaughtException"}),n}),process.on("unhandledRejection",n=>{if(x6&&!Dme){let s=n instanceof Error?n:new Error(String(n));x6.error={type:s.name,message:s.message,source:"unhandledRejection"}}}))},"startCliInvocation"),Fte=t(()=>x6,"getCliInvocation");var Ote=class Ote extends $0{constructor(s,c=!1){super(s,c);this.MAX_COMPLETION_WAIT=2*3600*1e3;this.testSuiteRunId="";this.didFail=!1;this.reportUploadFailed=!1;this.isolationMode=!1;this.isUploadReportMode=!1;this.reportUploadSucceeded=!1;this.trmMessagesBuffer="";this.completeIndicators={upload:!1,tests:!1,report:!1};this.uploadProgress=0;this.playwrightIdToReportMetadata={};this.pwTestIdToChecksumTestId={};this.logFilter={"upload-progress":{logEveryMS:1e3*30,lastLogTimestamp:0,logOnValueChange:!0,value:""}}}get replMode(){return this.getChecksumArg("repl")??!1}getTestSuiteRunInfo(){if(!this.testSuiteRunInfo)throw new Error("Test suite run info is not initialized");return this.testSuiteRunInfo}getTestRunMonitorProcess(){if(!this.testRunMonitorProcess)throw new Error("Test run monitor process is not initialized");return this.testRunMonitorProcess}getConfig(){if(!this.config)throw new Error("Checksum config is not initialized");return this.config}getConfigOptions(){let s=this.getConfig().options;if(!s)throw new Error("Checksum config options are not initialized");return s}async run(){var F,H,j,X,se;this.loadTracer(),this.validateAuthExists(),this.buildVolatileChecksumConfig();let s=Fte();if(s&&(s.shard_mode=process.env.CHECKSUM_SHARD_MODE==="true",s.repl_mode=!!this.replMode,s.isolation_mode=!!this.isolationMode,s.runtime_version=this.checksumRuntimeVersion,s.app_name=((F=this.config)==null?void 0:F.appName)??null,s.env_override_name=process.env.CHECKSUM_RUNTIME_ENV_OVERRIDE_NAME??null,s.env_override_role=process.env.CHECKSUM_RUNTIME_ENV_OVERRIDE_ROLE??null),process.env.CHECKSUM_SHARD_MODE==="true"){await this.runShardMode();return}if(!await this.getSession())return;s&&(s.test_suite_run_id=this.testSuiteRunId),this.testSuiteAnalytics=xme.getInstance(this.getTestSuiteRunInfo(),this.isolationMode),(H=this.testSuiteAnalytics)==null||H.genericEvent(`Project root found at ${this.projectRootDirectory}`,{message:`Checksum root found at ${this.checksumRoot}`});let c={CHECKSUM_ROOT_FOLDER:this.checksumRoot,CHECKSUM_TEST_SUITE_INFO:JSON.stringify(this.getTestSuiteRunInfo())},l;try{l=await Wp(this.startTestRunMonitor(this.testSuiteRunId),1e4,"test run monitor timeout"),c.CHECKSUM_UPLOAD_AGENT_PORT=l}catch{let pe="Error starting test run monitor. Test results will not be available on checksum.";(j=this.testSuiteAnalytics)==null||j.testRunMonitorError({error:pe}),this.log(pe)}c.PW_TEST_HTML_REPORT_OPEN="never",this.isolationMode&&(c.CHECKSUM_ISOLATED_MODE="true"),this.testSuiteRunId&&(c.CHECKSUM_TEST_SUITE_ID=this.testSuiteRunId),this.replMode&&(c.CHECKSUM_REPL="true"),this.getChecksumArg("tm")&&(c.CHECKSUM_SHOW_TIME_MACHINE="true");let d=this.getNonChecksumArgs(),h=this.getChecksumArg("rerun-failed"),b=Kar({args:this.args,env:process.env});if(b.kind==="enabled"&&h){this.printError("--cksm-affected cannot be combined with --cksm-rerun-failed."),await this.shutdown(1);return}if(h)try{let pe=await this.fetchFailedTestPaths(typeof h=="string"?h:void 0);if(pe.length===0){console.log("No non-passing tests found \u2014 nothing to rerun."),await this.shutdown(0);return}console.log(`Re-running ${pe.length} non-passing test file(s)`),d.unshift(...pe)}catch(pe){this.printError(`Failed to fetch failed tests: ${pe.message}`),await this.shutdown(1);return}if(b.kind==="enabled"){if(d.some(Ke=>Ke==="--grep"||Ke==="-g"||Ke.startsWith("--grep=")||Ke.startsWith("-g="))){this.printError("--cksm-affected cannot be combined with a manual --grep argument."),await this.shutdown(1);return}try{let Ke=await ecr(b.baseRef,gt=>this.getCmdOutput(gt));if(Ke.length===0){console.log("No changed files detected for --cksm-affected \u2014 nothing to run."),await this.shutdown(0);return}let qe=await this.fetchAffectedTestIds(Ke);if(qe.length===0){console.log("No tests affected by the current changes \u2014 nothing to run."),await this.shutdown(0);return}let Ue=`(${qe.sort().map(gt=>gt.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|")})`;if(b.dryRun){console.log("[--cksm-affected-dry-run] "+JSON.stringify({baseRef:b.baseRef??null,changedFiles:Ke,affectedTestIds:qe,playwrightArg:`--grep=${Ue}`},null,2)),await this.shutdown(0);return}console.log(`Running ${qe.length} affected test(s) from ${Ke.length} changed file(s)`),d.push(`--grep=${Ue}`)}catch(Ke){this.printError(`Failed to determine affected tests: ${Ke.message}`),await this.shutdown(1);return}}this.replMode&&d.push("--debug");let k=["test","--config",this.isolationMode||this.replMode?this.getPlaywrightConfigFilePath():this.buildRunPlaywrightConfig(),...d];await this.patchPlaywright();try{console.log(`Tests running with @checksum-ai/runtime version ${this.checksumRuntimeVersion}`),this.replMode?(console.log("Running in REPL mode"),this.runPlaywright(k,c),await this.execFile("node",[`${__dirname}/repl.js`],c)):((X=this.testSuiteAnalytics)==null||X.testSuiteStart(),await this.runPlaywright(k,c)),console.log(`Tests execution finished. Checksum is finalizing${this.isolationMode?"":" and uploading"} the report, please wait...`)}catch{this.didFail=!0,console.log("Error during test execution: Failed passing test"),(se=this.testSuiteAnalytics)==null||se.testsFailed()}finally{this.isolationMode||console.log("Waiting for test files to upload to Checksum..."),await this.sendReportUploadRequest(),await this.patchPlaywright(!0),this.completeIndicators.tests=!0,await this.handleCompleteMessage()}}async runShardMode(){console.log(`[shard-mode] Running shard ${process.env.SHARD_INDEX}/${process.env.SHARD_TOTAL} (batch: ${process.env.BATCH_ID})`);let s=this.getNonChecksumArgs(),c=process.env.SHARD_INDEX,l=process.env.SHARD_TOTAL;c&&l&&s.push(`--shard=${c}/${l}`),s.push("--reporter=blob,line");let d={CHECKSUM_ROOT_FOLDER:this.checksumRoot,PW_TEST_HTML_REPORT_OPEN:"never"},h=["test","--config",this.getPlaywrightConfigFilePath(),...s];await this.patchPlaywright();let b=S6("shard_run",{runtime_version:this.checksumRuntimeVersion,shard_index:process.env.SHARD_INDEX,shard_total:process.env.SHARD_TOTAL,batch_id:process.env.BATCH_ID}),T=0;try{console.log(`[shard-mode] Tests running with @checksum-ai/runtime version ${this.checksumRuntimeVersion}`),await this.runPlaywright(h,d),console.log("[shard-mode] Tests execution finished.")}catch{T=1,console.log("[shard-mode] Tests finished with failures.")}finally{await this.patchPlaywright(!0)}b.emit({outcome:T===0?"success":"error",exit_code:T}),process.exitCode=T}async uploadReport(){var l;this.loadTracer(),this.validateAuthExists(),this.buildVolatileChecksumConfig(),this.isUploadReportMode=!0,this.getConfigOptions().hostReports=!0,this.tryLoadPlaywrightConfigFromFile(),this.loadPlaywrightConfigOptions();let s=this.resolveUserReportPathArg();s&&this.playwrightConfigOptions&&(this.playwrightConfigOptions.reportPath=s);let c=(l=this.playwrightConfigOptions)==null?void 0:l.reportPath;if(!c||!(0,X1.existsSync)(c)){this.printError(`Could not find report at ${c??"(unresolved)"}. Pass an explicit path: npx checksumai upload-report <path>`),await this.shutdown(1);return}if(await this.getSession()){this.testSuiteAnalytics=xme.getInstance(this.getTestSuiteRunInfo(),this.isolationMode);try{await Wp(this.startTestRunMonitor(this.testSuiteRunId),1e4,"test run monitor timeout")}catch(d){this.printError(`Failed to start test run monitor: ${d.message}. Report will not be uploaded.`),await this.shutdown(1);return}console.log(`Uploading report from ${c} to Checksum...`),await this.sendReportUploadRequest(),this.completeIndicators.tests=!0,await this.handleCompleteMessage()}}tryLoadPlaywrightConfigFromFile(){if(!this.playwrightConfig)try{let s=this.getPlaywrightConfigFilePath();if((0,X1.existsSync)(s)){let c=(0,fcr.createRequire)(__filename)(s),l=(c==null?void 0:c.default)??c;l&&(this.playwrightConfig=l)}}catch(s){Lc("Could not load playwright config from file, falling back to defaults: "+s.message)}}resolveUserReportPathArg(){let s=this.args.find(l=>!l.startsWith("-")&&!l.includes("="));if(!s)return;let c=(0,kA.isAbsolute)(s)?s:(0,kA.resolve)(process.cwd(),s);if(!(0,X1.existsSync)(c))return c;try{if((0,X1.statSync)(c).isDirectory())return(0,kA.join)(c,"index.html")}catch{}return c}loadPlaywrightConfigOptions(){var k,F;let s=t(H=>(Lc("Using report folder",H),(0,kA.join)(H,"index.html")),"makeFilePath"),c=t(H=>(Lc("Using JSON report folder",H),(0,kA.join)(H,"report.json")),"makeJsonFilePath"),l="",d="",h=!1,b="never";process.env.PLAYWRIGHT_HTML_OUTPUT_DIR&&(l=s(process.env.PLAYWRIGHT_HTML_OUTPUT_DIR));let T=(k=this.playwrightConfig)==null?void 0:k.reporter;if(T instanceof Array){let H=T.filter(se=>se instanceof Array&&se[0]==="html"),j=T.filter(se=>se instanceof Array&&se[0]==="json");if(!process.env.PLAYWRIGHT_HTML_OUTPUT_DIR){let se=H.find(pe=>{var Ke;return(Ke=pe[1])==null?void 0:Ke.outputFolder});se&&(l=s((0,kA.join)(this.checksumRoot,se[1].outputFolder)))}let X=j.find(se=>{var pe;return(pe=se[1])==null?void 0:pe.outputFile});X&&(h=!0,d=(0,kA.join)(this.checksumRoot,X[1].outputFile));for(let se of H){let pe=(F=se[1])==null?void 0:F.open;if(pe==="always"||pe==="on-failure"){b=pe;break}}}l||(tc.isRepoMode?l=s((0,kA.join)(tc.runtimeRoot,"playwright-report")):l=s((0,kA.join)(this.projectRootDirectory,"playwright-report"))),d||(tc.isRepoMode?d=c((0,kA.join)(tc.runtimeRoot,"playwright-report")):d=c((0,kA.join)(this.projectRootDirectory,"playwright-report"))),this.playwrightConfigOptions={openReportCriteria:b,reportPath:l,jsonReportPath:d,hasJsonReporter:h}}async sendReportUploadRequest(){let s=t(async F=>{var H;(H=this.testSuiteAnalytics)==null||H.testSuiteError({error:F}),this.log(F),this.reportUploadFailed=!0,this.completeIndicators.report=!0,this.getTestRunMonitorProcess().stdin.write("cli:report=false"),await this.sendProcessingError(this.buildProcessErrorPayload({stage:"report-upload",reason:"Required Playwright HTML report could not be produced for upload",reportUploaded:!1,evidence:{detail:F}}))},"makeError");if(!this.playwrightConfigOptions)return s("No playwright config options");let{reportPath:c,openReportCriteria:l,jsonReportPath:d,hasJsonReporter:h}=this.playwrightConfigOptions;if(h&&d!==void 0&&((0,X1.existsSync)(d)?acr(d,this.playwrightIdToReportMetadata,this.pwTestIdToChecksumTestId,this.checksumRoot,this.absoluteProjectRootDirectory):console.warn(`Could not find JSON report file at ${d}`)),!(0,X1.existsSync)(c))return s(`Could not find report file at ${c}`);Lc("Sending report upload request",c);let b=this.saveMetadataToFile((0,kA.dirname)(c)),T={reportPath:c,pathToChecksumMetadata:b,openReportCriteria:l,didFail:this.didFail,checksumRoot:this.checksumRoot,projectRoot:this.absoluteProjectRootDirectory,isUploadReport:this.isUploadReportMode},k=Buffer.from(JSON.stringify(T)).toString("base64");this.getTestRunMonitorProcess().stdin.write(`cli:report=${k}`)}saveMetadataToFile(s){var c;try{let l=(0,kA.join)(s,`checksum-metadata-${(0,M_t.randomUUID)()}.json`);return(0,X1.writeFileSync)(l,JSON.stringify(this.playwrightIdToReportMetadata,null,2)),l}catch(l){let d=`Error saving metadata to file - ${l.message}`;(c=this.testSuiteAnalytics)==null||c.testSuiteError({error:d}),this.log(d);return}}startTestMonitorProcess(s){let l=[JSON.stringify({sessionId:s,apiURL:this.getConfig().apiURL,apiKey:this.getConfig().apiKey}),...this.isolationMode?["isolated"]:[]],d={command:"node",args:[(0,kA.join)(__dirname,"test-run-monitor.js"),...l]};return tc.isRepoMode&&(d.command="yarn",d.args=["test-run-monitor",...l]),ucr.spawn(d.command,d.args)}startTestRunMonitor(s){return new Promise(c=>{console.log("Starting test run monitor");let l=this.startTestMonitorProcess(s);this.testRunMonitorProcess=l,l.stdout.on("data",d=>{let h=this.parseTRMMessages(d.toString().trim());if(h.length)for(let b of h){if(b.startsWith("trace")){this.logTRMMessage(b),this.handleTestRunMonitorTrace(b.substring("trace".length+1));continue}if(b.startsWith("wideevent")){this.reEmitMonitorWideEvent(b.substring("wideevent".length+1));continue}if(!b.startsWith("monitor")){this.logTRMMessage(b);continue}let T=t(()=>{let j=b.substring("monitor".length+1),X=j.indexOf("=");if(X===-1)return{key:j,value:""};let[se,pe]=[j.substring(0,X),j.substring(X+1)];return{key:se,value:pe}},"getKeyAndValue"),{key:k,value:F}=T();if(!Object.values(qze).includes(k)){this.logTRMMessage(`Received unknown monitor message: "${b}"`);continue}let H=k;this.logInterProcessEventMessage(H,F),k==="port"?c(F):this.handleTestRunMonitorMessage(H,F)}}),l.on("exit",(d,h)=>{var T;let b=`test run monitor process exited with code ${d} and signal ${h}`;(T=this.testSuiteAnalytics)==null||T.testRunMonitorError({error:b}),this.log(b)}),l.stderr.on("data",d=>{var b;let h=`TRM Error: ${d.toString().substring(0,300)}`;(b=this.testSuiteAnalytics)==null||b.testRunMonitorError({error:h}),this.log(h)}),l.on("error",d=>{var b;let h=`Error starting test run monitor: ${d.message}`;(b=this.testSuiteAnalytics)==null||b.testRunMonitorError({error:h}),this.log(h)})})}logInterProcessEventMessage(s,c){t(()=>{let d=this.logFilter[s];if(!d)return!0;if(d.logOnValueChange&&d.value!==c)return d.value=c,!0;if(d.logEveryMS){let h=Date.now();if(h-d.lastLogTimestamp>=d.logEveryMS)return d.lastLogTimestamp=h,!0}return!1},"shouldLog")()&&this.logTRMMessage(`Received monitor message: "${s}${c?`=${c}`:""}"`)}parseTRMMessages(s){let c=this.trmMessagesBuffer+s,l=-1,d=-1,h=t(()=>{l=c.indexOf("{trm}"),d=c.indexOf("{/trm}")},"findIndexes");h();let b=[];for(;l!==-1&&d!==-1&&d>l;){if(b.push(c.substring(l+"{trm}".length,d)),c=c.slice(d+"{/trm}".length).trim(),c.length&&!c.startsWith("{trm}"))return console.warn("Buffered data does not start with start delimiter",c),this.trmMessagesBuffer="",b;this.trmMessagesBuffer=c,h()}return b}setChecksumTestMetadata(s){var b,T;let{retry:c,type:l,pwTestId:d,checksumTestId:h}=s;(b=this.playwrightIdToReportMetadata)[d]??(b[d]={}),(T=this.playwrightIdToReportMetadata[d])[c]??(T[c]={}),this.playwrightIdToReportMetadata[d][c][l]=s,this.pwTestIdToChecksumTestId[d]=h}async handleTestRunMonitorTrace(s){var h,b,T,k;let c=s.indexOf("="),[l,d]=c>-1?[s.substring(0,c),s.substring(c+1)]:[s,""];if(!Object.values(VRe).includes(l)){Lc("Unknown trace event",l);return}try{let F=d?JSON.parse(d):{};switch(l){case"Upload Start":(h=this.testSuiteAnalytics)==null||h.uploadStart({filename:F.filename});break;case"Upload Complete":(b=this.testSuiteAnalytics)==null||b.uploadComplete({filename:F.filename});break;case"Upload Failed":(T=this.testSuiteAnalytics)==null||T.uploadFailed({filename:F.filename,error:F.error??""});break;case"Trace Processing Error":(k=this.testSuiteAnalytics)==null||k.traceProcessingError({error:F.error??""});break}}catch(F){Lc(`Error parsing trace payload, ${F.message}`)}}async handleTestRunMonitorMessage(s,c){var l,d,h,b,T,k,F,H,j,X,se,pe,Ke;switch(s){case"uploads-complete-with-errors":console.log("Error uploading test files to Checksum");try{let qe=JSON.parse(c);(l=this.testSuiteAnalytics)==null||l.uploadsCompleteWithErrors(qe);let lt=Fte();lt&&(lt.uploads_outcome="complete_with_errors",lt.uploads_errored=Array.isArray(qe==null?void 0:qe.uploadErrors)?qe.uploadErrors.length:void 0)}catch{}this.completeIndicators.upload=!0;break;case"checksumTestMetadata":try{let qe=JSON.parse(c);this.setChecksumTestMetadata(qe)}catch(qe){let lt=`Error parsing test metadata event - ${qe.message}`;(d=this.testSuiteAnalytics)==null||d.testSuiteError({error:lt}),this.log(lt)}break;case"uploads-complete":this.isolationMode||console.log("Test files uploaded successfully"),(h=this.testSuiteAnalytics)==null||h.allUploadsComplete();{let qe=Fte();qe&&(qe.uploads_outcome="complete",qe.uploads_errored=0)}this.sendUploadsComplete().then(()=>{this.completeIndicators.upload=!0});break;case"report-complete":{if(this.isolationMode){this.completeIndicators.report=!0;break}let qe=c.slice(0,c.indexOf(":"))==="true",lt=c.slice(c.indexOf(":")+1),Ue="{}";try{if(lt&&(0,X1.existsSync)(lt)){Ue=(0,X1.readFileSync)(lt,"utf-8");try{(0,X1.unlinkSync)(lt)}catch{console.warn(`Failed to delete temporary stats file: ${lt}`)}}else console.warn(`Stats file not found at: ${lt}`)}catch(Dt){console.error(`Error reading stats file: ${Dt.message}`)}let gt=this.handleStats(Ue);(T=this.testSuiteAnalytics)==null||T.testSuiteEnd({passed:gt.passed,failed:gt.failed,bug:gt.bug,total:((b=gt.tests)==null?void 0:b.length)||0});let Ot=Fte();Ot&&(Ot.tests_total=((k=gt.tests)==null?void 0:k.length)??0,Ot.tests_passed=gt.passed,Ot.tests_failed=gt.failed,Ot.tests_bug=gt.bug,Ot.tests_recovered=gt.recovered,Ot.report_uploaded=qe);let Jt=qe?void 0:this.buildReportUploadProcessErrorPayload(gt,lt);if(await this.sendTestRunEnd(gt,qe,Jt),this.completeIndicators.report=!0,this.reportUploadSucceeded=qe,qe){let Dt=`${this.checksumAppUrl}/#/test-runs/${this.testSuiteRunId}`,fn=`Checksum report URL: ${Dt}`,$r="*".repeat(fn.length);console.log(`${$r}
797
+ `).map(h=>h.trim()).filter(Boolean)}t(ecr,"computeAffectedChangedFiles");var x_t=require("crypto");function tcr(i,n){return{testSuiteRunId:n,appName:"generic-app",commitHash:"generic-commit-hash",envName:"generic-env-name",branch:"generic-branch",checksumRuntimeVersion:i}}t(tcr,"createDefaultTestSuiteRunInfo");function rcr(i,n,s={}){let c=["mock-app","mock-app-2","mock-app-3"];return{...{appName:c[Math.floor(Math.random()*c.length)]??c[0],commitHash:(0,x_t.randomUUID)(),envName:"test-environment",branch:(0,x_t.randomUUID)(),testSuiteRunId:n,checksumRuntimeVersion:i},...s}}t(rcr,"createMockTestSuiteRunInfo");var Rte=require("fs"),Bte=require("path");var YRe=require("fs"),wA=Na(uZe());var RCn=/^[0-9a-zA-Z]+$/,BCn=5;function ncr(i){return i?i.length===BCn&&RCn.test(i):!1}t(ncr,"isValidChecksumTestId");var N_t=class N_t{extract(n,s){if(!n)return;let c=n.split("/"),l=c[c.length-1];if(!l||!l.endsWith(".checksum.spec.ts"))return;let h=l.replace(".checksum.spec.ts","").split(" - ").pop();return ncr(h)?h:void 0}};t(N_t,"FileNameExtractionStrategy");var w_t=N_t,P_t=class P_t{extract(n,s){if(!(!n||!(0,YRe.existsSync)(n)))try{let c=(0,YRe.readFileSync)(n,"utf-8"),l=wA.createSourceFile(n,c,wA.ScriptTarget.Latest,!0),d=new Map,h=t(b=>{if(wA.isCallExpression(b)){let T=b;if(this.isTestCall(T.expression)){let k=T.arguments[0];if(k&&wA.isCallExpression(k)&&wA.isIdentifier(k.expression)&&k.expression.text==="defineChecksumTest"){let F=this.extractDefineChecksumTestArgs(k);F&&ncr(F.checksumTestId)&&d.set(F.testTitle,F.checksumTestId)}}}wA.forEachChild(b,h)},"visit");return h(l),s&&d.has(s)?d.get(s):d.size>0?Array.from(d.values())[0]:void 0}catch{return}}isTestCall(n){return wA.isIdentifier(n)&&n.text==="test"?!0:wA.isPropertyAccessExpression(n)?wA.isIdentifier(n.expression)&&n.expression.text==="test":!1}extractDefineChecksumTestArgs(n){let s=n.arguments;if(s.length<2)return;let c=s[0],l=s[1];if(!c||!l)return;let d=this.extractStringLiteral(c),h=this.extractStringLiteral(l);if(d&&h)return{testTitle:d,checksumTestId:h}}extractStringLiteral(n){if(wA.isStringLiteral(n)||wA.isNoSubstitutionTemplateLiteral(n))return n.text}};t(P_t,"FileContentExtractionStrategy");var k_t=P_t,R_t=class R_t{constructor(n){this.strategies=n??[new k_t,new w_t]}extract(n,s){for(let c of this.strategies){let l=c.extract(n,s);if(l)return l}}};t(R_t,"ChecksumTestIdExtractor");var D_t=R_t;var icr=new D_t;function F_t(i,n){return n.pwTestIdToChecksumTestId[i.playwrightTestId]||(i.filePath!==void 0?icr.extract(i.filePath,i.title):void 0)}t(F_t,"resolveChecksumTestId");var ZRe=t((i,n)=>Object.values(n[i]??{}).some(s=>{var c,l;return(l=(c=s.autoRecoveryMetadata)==null?void 0:c.data)==null?void 0:l.autoRecovered}),"isAutoRecovered"),B_t=t(i=>typeof i=="number"&&!isNaN(i)?i:0,"getStat");function KRe(i,n,s){let c=[],l=0,d=0,h=B_t(n.expected)+B_t(n.flaky),b=B_t(n.unexpected);for(let T of i){let k=FCn(T,s);c.push(k),k.recovered&&d++,k.bug&&(l++,k.outcome==="expected"||k.outcome==="flaky"?h--:k.outcome==="unexpected"&&b--)}return{passed:h,failed:b,bug:l,recovered:d,tests:c}}t(KRe,"computeReportStats");function FCn(i,n){let s=F_t({playwrightTestId:i.playwrightTestId,filePath:i.filePath,title:i.title},n),c=OCn(i),l=MCn(i.annotations),d=ZRe(i.playwrightTestId,n.playwrightIdToMetadata),h=LCn(s,i,n),b=n.toRelativeFilePath(i.filePath);return{checksumTestId:s,playwrightTestId:i.playwrightTestId,success:i.ok,recovered:d,bug:c,annotations:l,tags:i.tags,outcome:i.outcome,...i.filePath!==void 0?{filePath:i.filePath}:{},...b!==void 0?{relativeFilePath:b}:{},...i.projectName?{project:i.projectName}:{},...h!==void 0?{usingChecksumTestIdPlaceholder:h}:{}}}t(FCn,"rowToTestWithMetadata");var OCn=t(i=>i.tags.includes("bug")||i.annotations.some(n=>n.type==="bug")||i.title.includes("@bug"),"detectBug"),MCn=t(i=>i.filter(n=>!!(n!=null&&n.type)).map(n=>({type:n.type,description:n.description||""})),"normalizeAnnotations"),LCn=t((i,n,s)=>{if(s.checksumTestIdToUsingPlaceholder)return s.pwTestIdToChecksumTestId[n.playwrightTestId]&&s.checksumTestIdToUsingPlaceholder[i]||!1},"computeUsingPlaceholder");var O_t=t((i,n,s)=>{if(!i)return;let c=s||n,l;if((0,Bte.isAbsolute)(i))l=i;else{let h=(0,Bte.dirname)(n);l=(0,Bte.resolve)(h,i)}return l.replace(c+"/","")},"toRelativeFilePath"),scr=t(i=>{let n=[];if(i.specs&&n.push(...i.specs),i.suites)for(let s of i.suites)n.push(...scr(s));return n},"extractSpecsFromSuite"),ocr=t(i=>{let n=[];for(let s of i.suites)n.push(...scr(s));return n},"extractFlatSpecsMap"),QCn=t(i=>ocr(i).map(n=>{var c;let s=(c=n.tests)==null?void 0:c[0];return{playwrightTestId:n.id,ok:!!n.ok,outcome:(s==null?void 0:s.status)??"skipped",title:n.title,filePath:n.file,tags:n.tags??[],annotations:(s==null?void 0:s.annotations)??[]}}),"jsonReportToRows"),UCn=t((i,n,s,c,l)=>(jCn(i,n),KRe(QCn(i),i.stats,{pwTestIdToChecksumTestId:s,playwrightIdToMetadata:n,toRelativeFilePath:t(d=>c?O_t(d,c,l):d,"toRelativeFilePath")})),"modifyStatsPerTestFile"),jCn=t((i,n)=>{for(let s of ocr(i))ZRe(s.id,n)&&(s.recovered=!0)},"markRecoveredSpecs"),acr=t((i,n,s,c,l)=>{(0,Rte.cpSync)(i,i+".backup");try{let d=JSON.parse((0,Rte.readFileSync)(i,"utf-8")),h=UCn(d,n,s,c,l);return d.checksumMetadata=h,(0,Rte.writeFileSync)(i,JSON.stringify(d,null,2)),d}catch(d){return console.log("Error processing JSON report",d.message),null}},"processJSONReport");var x6,Dme=!1,ccr=!1,$Cn=t(i=>{if(!x6||Dme)return;Dme=!0;let n={...x6,exit_code:i,duration_ms:Date.now()-x6._startedAtMs};if(delete n._startedAtMs,!!URe())try{Pte({severity:LRe(n),message:`cli ${n.command} exit=${i} ${n.duration_ms}ms`,...n})}catch(s){try{QRe(`[wide-event] cli emit failed: ${String(s)}`)}catch{}}},"emitCliInvocation"),lcr=t(i=>{x6={timestamp:new Date().toISOString(),_startedAtMs:Date.now(),kind:"cli_invocation",command:i,pid:process.pid,node_version:process.version,platform:process.platform,ci:process.env.CI==="true"||process.env.CI==="1"},Dme=!1,ccr||(ccr=!0,process.on("exit",$Cn),process.on("uncaughtException",n=>{throw x6&&!Dme&&(x6.error={type:n.name,message:n.message,source:"uncaughtException"}),n}),process.on("unhandledRejection",n=>{if(x6&&!Dme){let s=n instanceof Error?n:new Error(String(n));x6.error={type:s.name,message:s.message,source:"unhandledRejection"}}}))},"startCliInvocation"),Fte=t(()=>x6,"getCliInvocation");var Ote=class Ote extends $0{constructor(s,c=!1){super(s,c);this.MAX_COMPLETION_WAIT=2*3600*1e3;this.testSuiteRunId="";this.didFail=!1;this.reportUploadFailed=!1;this.isolationMode=!1;this.isUploadReportMode=!1;this.reportUploadSucceeded=!1;this.trmMessagesBuffer="";this.completeIndicators={upload:!1,tests:!1,report:!1};this.uploadProgress=0;this.playwrightIdToReportMetadata={};this.pwTestIdToChecksumTestId={};this.logFilter={"upload-progress":{logEveryMS:1e3*30,lastLogTimestamp:0,logOnValueChange:!0,value:""}}}get replMode(){return this.getChecksumArg("repl")??!1}get listMode(){return this.args.includes("--list")}getTestSuiteRunInfo(){if(!this.testSuiteRunInfo)throw new Error("Test suite run info is not initialized");return this.testSuiteRunInfo}getTestRunMonitorProcess(){if(!this.testRunMonitorProcess)throw new Error("Test run monitor process is not initialized");return this.testRunMonitorProcess}getConfig(){if(!this.config)throw new Error("Checksum config is not initialized");return this.config}getConfigOptions(){let s=this.getConfig().options;if(!s)throw new Error("Checksum config options are not initialized");return s}async run(){var F,H,j,X,se;this.loadTracer(),this.validateAuthExists(),this.buildVolatileChecksumConfig();let s=Fte();if(s&&(s.shard_mode=process.env.CHECKSUM_SHARD_MODE==="true",s.list_mode=this.listMode,s.repl_mode=!!this.replMode,s.isolation_mode=!!this.isolationMode,s.runtime_version=this.checksumRuntimeVersion,s.app_name=((F=this.config)==null?void 0:F.appName)??null,s.env_override_name=process.env.CHECKSUM_RUNTIME_ENV_OVERRIDE_NAME??null,s.env_override_role=process.env.CHECKSUM_RUNTIME_ENV_OVERRIDE_ROLE??null),process.env.CHECKSUM_SHARD_MODE==="true"){await this.runShardMode();return}if(this.listMode){await this.runListMode();return}if(!await this.getSession())return;s&&(s.test_suite_run_id=this.testSuiteRunId),this.testSuiteAnalytics=xme.getInstance(this.getTestSuiteRunInfo(),this.isolationMode),(H=this.testSuiteAnalytics)==null||H.genericEvent(`Project root found at ${this.projectRootDirectory}`,{message:`Checksum root found at ${this.checksumRoot}`});let c={CHECKSUM_ROOT_FOLDER:this.checksumRoot,CHECKSUM_TEST_SUITE_INFO:JSON.stringify(this.getTestSuiteRunInfo())},l;try{l=await Wp(this.startTestRunMonitor(this.testSuiteRunId),1e4,"test run monitor timeout"),c.CHECKSUM_UPLOAD_AGENT_PORT=l}catch{let pe="Error starting test run monitor. Test results will not be available on checksum.";(j=this.testSuiteAnalytics)==null||j.testRunMonitorError({error:pe}),this.log(pe)}c.PW_TEST_HTML_REPORT_OPEN="never",this.isolationMode&&(c.CHECKSUM_ISOLATED_MODE="true"),this.testSuiteRunId&&(c.CHECKSUM_TEST_SUITE_ID=this.testSuiteRunId),this.replMode&&(c.CHECKSUM_REPL="true"),this.getChecksumArg("tm")&&(c.CHECKSUM_SHOW_TIME_MACHINE="true");let d=this.getNonChecksumArgs(),h=this.getChecksumArg("rerun-failed"),b=Kar({args:this.args,env:process.env});if(b.kind==="enabled"&&h){this.printError("--cksm-affected cannot be combined with --cksm-rerun-failed."),await this.shutdown(1);return}if(h)try{let pe=await this.fetchFailedTestPaths(typeof h=="string"?h:void 0);if(pe.length===0){console.log("No non-passing tests found \u2014 nothing to rerun."),await this.shutdown(0);return}console.log(`Re-running ${pe.length} non-passing test file(s)`),d.unshift(...pe)}catch(pe){this.printError(`Failed to fetch failed tests: ${pe.message}`),await this.shutdown(1);return}if(b.kind==="enabled"){if(d.some(Ke=>Ke==="--grep"||Ke==="-g"||Ke.startsWith("--grep=")||Ke.startsWith("-g="))){this.printError("--cksm-affected cannot be combined with a manual --grep argument."),await this.shutdown(1);return}try{let Ke=await ecr(b.baseRef,gt=>this.getCmdOutput(gt));if(Ke.length===0){console.log("No changed files detected for --cksm-affected \u2014 nothing to run."),await this.shutdown(0);return}let qe=await this.fetchAffectedTestIds(Ke);if(qe.length===0){console.log("No tests affected by the current changes \u2014 nothing to run."),await this.shutdown(0);return}let Ue=`(${qe.sort().map(gt=>gt.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|")})`;if(b.dryRun){console.log("[--cksm-affected-dry-run] "+JSON.stringify({baseRef:b.baseRef??null,changedFiles:Ke,affectedTestIds:qe,playwrightArg:`--grep=${Ue}`},null,2)),await this.shutdown(0);return}console.log(`Running ${qe.length} affected test(s) from ${Ke.length} changed file(s)`),d.push(`--grep=${Ue}`)}catch(Ke){this.printError(`Failed to determine affected tests: ${Ke.message}`),await this.shutdown(1);return}}this.replMode&&d.push("--debug");let k=["test","--config",this.isolationMode||this.replMode?this.getPlaywrightConfigFilePath():this.buildRunPlaywrightConfig(),...d];await this.patchPlaywright();try{console.log(`Tests running with @checksum-ai/runtime version ${this.checksumRuntimeVersion}`),this.replMode?(console.log("Running in REPL mode"),this.runPlaywright(k,c),await this.execFile("node",[`${__dirname}/repl.js`],c)):((X=this.testSuiteAnalytics)==null||X.testSuiteStart(),await this.runPlaywright(k,c)),console.log(`Tests execution finished. Checksum is finalizing${this.isolationMode?"":" and uploading"} the report, please wait...`)}catch{this.didFail=!0,console.log("Error during test execution: Failed passing test"),(se=this.testSuiteAnalytics)==null||se.testsFailed()}finally{this.isolationMode||console.log("Waiting for test files to upload to Checksum..."),await this.sendReportUploadRequest(),await this.patchPlaywright(!0),this.completeIndicators.tests=!0,await this.handleCompleteMessage()}}async runShardMode(){console.log(`[shard-mode] Running shard ${process.env.SHARD_INDEX}/${process.env.SHARD_TOTAL} (batch: ${process.env.BATCH_ID})`);let s=this.getNonChecksumArgs(),c=process.env.SHARD_INDEX,l=process.env.SHARD_TOTAL;c&&l&&s.push(`--shard=${c}/${l}`),s.push("--reporter=blob,line");let d={CHECKSUM_ROOT_FOLDER:this.checksumRoot,PW_TEST_HTML_REPORT_OPEN:"never"},h=["test","--config",this.getPlaywrightConfigFilePath(),...s];await this.patchPlaywright();let b=S6("shard_run",{runtime_version:this.checksumRuntimeVersion,shard_index:process.env.SHARD_INDEX,shard_total:process.env.SHARD_TOTAL,batch_id:process.env.BATCH_ID}),T=0;try{console.log(`[shard-mode] Tests running with @checksum-ai/runtime version ${this.checksumRuntimeVersion}`),await this.runPlaywright(h,d),console.log("[shard-mode] Tests execution finished.")}catch{T=1,console.log("[shard-mode] Tests finished with failures.")}finally{await this.patchPlaywright(!0)}b.emit({outcome:T===0?"success":"error",exit_code:T}),process.exitCode=T}async runListMode(){let s=this.getNonChecksumArgs(),c={CHECKSUM_ROOT_FOLDER:this.checksumRoot,PW_TEST_HTML_REPORT_OPEN:"never"},l=["test","--config",this.getPlaywrightConfigFilePath(),...s];await this.patchPlaywright();let d=0;try{await this.runPlaywright(l,c)}catch{d=1}finally{await this.patchPlaywright(!0)}process.exitCode=d}async uploadReport(){var l;this.loadTracer(),this.validateAuthExists(),this.buildVolatileChecksumConfig(),this.isUploadReportMode=!0,this.getConfigOptions().hostReports=!0,this.tryLoadPlaywrightConfigFromFile(),this.loadPlaywrightConfigOptions();let s=this.resolveUserReportPathArg();s&&this.playwrightConfigOptions&&(this.playwrightConfigOptions.reportPath=s);let c=(l=this.playwrightConfigOptions)==null?void 0:l.reportPath;if(!c||!(0,X1.existsSync)(c)){this.printError(`Could not find report at ${c??"(unresolved)"}. Pass an explicit path: npx checksumai upload-report <path>`),await this.shutdown(1);return}if(await this.getSession()){this.testSuiteAnalytics=xme.getInstance(this.getTestSuiteRunInfo(),this.isolationMode);try{await Wp(this.startTestRunMonitor(this.testSuiteRunId),1e4,"test run monitor timeout")}catch(d){this.printError(`Failed to start test run monitor: ${d.message}. Report will not be uploaded.`),await this.shutdown(1);return}console.log(`Uploading report from ${c} to Checksum...`),await this.sendReportUploadRequest(),this.completeIndicators.tests=!0,await this.handleCompleteMessage()}}tryLoadPlaywrightConfigFromFile(){if(!this.playwrightConfig)try{let s=this.getPlaywrightConfigFilePath();if((0,X1.existsSync)(s)){let c=(0,fcr.createRequire)(__filename)(s),l=(c==null?void 0:c.default)??c;l&&(this.playwrightConfig=l)}}catch(s){Lc("Could not load playwright config from file, falling back to defaults: "+s.message)}}resolveUserReportPathArg(){let s=this.args.find(l=>!l.startsWith("-")&&!l.includes("="));if(!s)return;let c=(0,kA.isAbsolute)(s)?s:(0,kA.resolve)(process.cwd(),s);if(!(0,X1.existsSync)(c))return c;try{if((0,X1.statSync)(c).isDirectory())return(0,kA.join)(c,"index.html")}catch{}return c}loadPlaywrightConfigOptions(){var k,F;let s=t(H=>(Lc("Using report folder",H),(0,kA.join)(H,"index.html")),"makeFilePath"),c=t(H=>(Lc("Using JSON report folder",H),(0,kA.join)(H,"report.json")),"makeJsonFilePath"),l="",d="",h=!1,b="never";process.env.PLAYWRIGHT_HTML_OUTPUT_DIR&&(l=s(process.env.PLAYWRIGHT_HTML_OUTPUT_DIR));let T=(k=this.playwrightConfig)==null?void 0:k.reporter;if(T instanceof Array){let H=T.filter(se=>se instanceof Array&&se[0]==="html"),j=T.filter(se=>se instanceof Array&&se[0]==="json");if(!process.env.PLAYWRIGHT_HTML_OUTPUT_DIR){let se=H.find(pe=>{var Ke;return(Ke=pe[1])==null?void 0:Ke.outputFolder});se&&(l=s((0,kA.join)(this.checksumRoot,se[1].outputFolder)))}let X=j.find(se=>{var pe;return(pe=se[1])==null?void 0:pe.outputFile});X&&(h=!0,d=(0,kA.join)(this.checksumRoot,X[1].outputFile));for(let se of H){let pe=(F=se[1])==null?void 0:F.open;if(pe==="always"||pe==="on-failure"){b=pe;break}}}l||(tc.isRepoMode?l=s((0,kA.join)(tc.runtimeRoot,"playwright-report")):l=s((0,kA.join)(this.projectRootDirectory,"playwright-report"))),d||(tc.isRepoMode?d=c((0,kA.join)(tc.runtimeRoot,"playwright-report")):d=c((0,kA.join)(this.projectRootDirectory,"playwright-report"))),this.playwrightConfigOptions={openReportCriteria:b,reportPath:l,jsonReportPath:d,hasJsonReporter:h}}async sendReportUploadRequest(){let s=t(async F=>{var H;(H=this.testSuiteAnalytics)==null||H.testSuiteError({error:F}),this.log(F),this.reportUploadFailed=!0,this.completeIndicators.report=!0,this.getTestRunMonitorProcess().stdin.write("cli:report=false"),await this.sendProcessingError(this.buildProcessErrorPayload({stage:"report-upload",reason:"Required Playwright HTML report could not be produced for upload",reportUploaded:!1,evidence:{detail:F}}))},"makeError");if(!this.playwrightConfigOptions)return s("No playwright config options");let{reportPath:c,openReportCriteria:l,jsonReportPath:d,hasJsonReporter:h}=this.playwrightConfigOptions;if(h&&d!==void 0&&((0,X1.existsSync)(d)?acr(d,this.playwrightIdToReportMetadata,this.pwTestIdToChecksumTestId,this.checksumRoot,this.absoluteProjectRootDirectory):console.warn(`Could not find JSON report file at ${d}`)),!(0,X1.existsSync)(c))return s(`Could not find report file at ${c}`);Lc("Sending report upload request",c);let b=this.saveMetadataToFile((0,kA.dirname)(c)),T={reportPath:c,pathToChecksumMetadata:b,openReportCriteria:l,didFail:this.didFail,checksumRoot:this.checksumRoot,projectRoot:this.absoluteProjectRootDirectory,isUploadReport:this.isUploadReportMode},k=Buffer.from(JSON.stringify(T)).toString("base64");this.getTestRunMonitorProcess().stdin.write(`cli:report=${k}`)}saveMetadataToFile(s){var c;try{let l=(0,kA.join)(s,`checksum-metadata-${(0,M_t.randomUUID)()}.json`);return(0,X1.writeFileSync)(l,JSON.stringify(this.playwrightIdToReportMetadata,null,2)),l}catch(l){let d=`Error saving metadata to file - ${l.message}`;(c=this.testSuiteAnalytics)==null||c.testSuiteError({error:d}),this.log(d);return}}startTestMonitorProcess(s){let l=[JSON.stringify({sessionId:s,apiURL:this.getConfig().apiURL,apiKey:this.getConfig().apiKey}),...this.isolationMode?["isolated"]:[]],d={command:"node",args:[(0,kA.join)(__dirname,"test-run-monitor.js"),...l]};return tc.isRepoMode&&(d.command="yarn",d.args=["test-run-monitor",...l]),ucr.spawn(d.command,d.args)}startTestRunMonitor(s){return new Promise(c=>{console.log("Starting test run monitor");let l=this.startTestMonitorProcess(s);this.testRunMonitorProcess=l,l.stdout.on("data",d=>{let h=this.parseTRMMessages(d.toString().trim());if(h.length)for(let b of h){if(b.startsWith("trace")){this.logTRMMessage(b),this.handleTestRunMonitorTrace(b.substring("trace".length+1));continue}if(b.startsWith("wideevent")){this.reEmitMonitorWideEvent(b.substring("wideevent".length+1));continue}if(!b.startsWith("monitor")){this.logTRMMessage(b);continue}let T=t(()=>{let j=b.substring("monitor".length+1),X=j.indexOf("=");if(X===-1)return{key:j,value:""};let[se,pe]=[j.substring(0,X),j.substring(X+1)];return{key:se,value:pe}},"getKeyAndValue"),{key:k,value:F}=T();if(!Object.values(qze).includes(k)){this.logTRMMessage(`Received unknown monitor message: "${b}"`);continue}let H=k;this.logInterProcessEventMessage(H,F),k==="port"?c(F):this.handleTestRunMonitorMessage(H,F)}}),l.on("exit",(d,h)=>{var T;let b=`test run monitor process exited with code ${d} and signal ${h}`;(T=this.testSuiteAnalytics)==null||T.testRunMonitorError({error:b}),this.log(b)}),l.stderr.on("data",d=>{var b;let h=`TRM Error: ${d.toString().substring(0,300)}`;(b=this.testSuiteAnalytics)==null||b.testRunMonitorError({error:h}),this.log(h)}),l.on("error",d=>{var b;let h=`Error starting test run monitor: ${d.message}`;(b=this.testSuiteAnalytics)==null||b.testRunMonitorError({error:h}),this.log(h)})})}logInterProcessEventMessage(s,c){t(()=>{let d=this.logFilter[s];if(!d)return!0;if(d.logOnValueChange&&d.value!==c)return d.value=c,!0;if(d.logEveryMS){let h=Date.now();if(h-d.lastLogTimestamp>=d.logEveryMS)return d.lastLogTimestamp=h,!0}return!1},"shouldLog")()&&this.logTRMMessage(`Received monitor message: "${s}${c?`=${c}`:""}"`)}parseTRMMessages(s){let c=this.trmMessagesBuffer+s,l=-1,d=-1,h=t(()=>{l=c.indexOf("{trm}"),d=c.indexOf("{/trm}")},"findIndexes");h();let b=[];for(;l!==-1&&d!==-1&&d>l;){if(b.push(c.substring(l+"{trm}".length,d)),c=c.slice(d+"{/trm}".length).trim(),c.length&&!c.startsWith("{trm}"))return console.warn("Buffered data does not start with start delimiter",c),this.trmMessagesBuffer="",b;this.trmMessagesBuffer=c,h()}return b}setChecksumTestMetadata(s){var b,T;let{retry:c,type:l,pwTestId:d,checksumTestId:h}=s;(b=this.playwrightIdToReportMetadata)[d]??(b[d]={}),(T=this.playwrightIdToReportMetadata[d])[c]??(T[c]={}),this.playwrightIdToReportMetadata[d][c][l]=s,this.pwTestIdToChecksumTestId[d]=h}async handleTestRunMonitorTrace(s){var h,b,T,k;let c=s.indexOf("="),[l,d]=c>-1?[s.substring(0,c),s.substring(c+1)]:[s,""];if(!Object.values(VRe).includes(l)){Lc("Unknown trace event",l);return}try{let F=d?JSON.parse(d):{};switch(l){case"Upload Start":(h=this.testSuiteAnalytics)==null||h.uploadStart({filename:F.filename});break;case"Upload Complete":(b=this.testSuiteAnalytics)==null||b.uploadComplete({filename:F.filename});break;case"Upload Failed":(T=this.testSuiteAnalytics)==null||T.uploadFailed({filename:F.filename,error:F.error??""});break;case"Trace Processing Error":(k=this.testSuiteAnalytics)==null||k.traceProcessingError({error:F.error??""});break}}catch(F){Lc(`Error parsing trace payload, ${F.message}`)}}async handleTestRunMonitorMessage(s,c){var l,d,h,b,T,k,F,H,j,X,se,pe,Ke;switch(s){case"uploads-complete-with-errors":console.log("Error uploading test files to Checksum");try{let qe=JSON.parse(c);(l=this.testSuiteAnalytics)==null||l.uploadsCompleteWithErrors(qe);let lt=Fte();lt&&(lt.uploads_outcome="complete_with_errors",lt.uploads_errored=Array.isArray(qe==null?void 0:qe.uploadErrors)?qe.uploadErrors.length:void 0)}catch{}this.completeIndicators.upload=!0;break;case"checksumTestMetadata":try{let qe=JSON.parse(c);this.setChecksumTestMetadata(qe)}catch(qe){let lt=`Error parsing test metadata event - ${qe.message}`;(d=this.testSuiteAnalytics)==null||d.testSuiteError({error:lt}),this.log(lt)}break;case"uploads-complete":this.isolationMode||console.log("Test files uploaded successfully"),(h=this.testSuiteAnalytics)==null||h.allUploadsComplete();{let qe=Fte();qe&&(qe.uploads_outcome="complete",qe.uploads_errored=0)}this.sendUploadsComplete().then(()=>{this.completeIndicators.upload=!0});break;case"report-complete":{if(this.isolationMode){this.completeIndicators.report=!0;break}let qe=c.slice(0,c.indexOf(":"))==="true",lt=c.slice(c.indexOf(":")+1),Ue="{}";try{if(lt&&(0,X1.existsSync)(lt)){Ue=(0,X1.readFileSync)(lt,"utf-8");try{(0,X1.unlinkSync)(lt)}catch{console.warn(`Failed to delete temporary stats file: ${lt}`)}}else console.warn(`Stats file not found at: ${lt}`)}catch(Dt){console.error(`Error reading stats file: ${Dt.message}`)}let gt=this.handleStats(Ue);(T=this.testSuiteAnalytics)==null||T.testSuiteEnd({passed:gt.passed,failed:gt.failed,bug:gt.bug,total:((b=gt.tests)==null?void 0:b.length)||0});let Ot=Fte();Ot&&(Ot.tests_total=((k=gt.tests)==null?void 0:k.length)??0,Ot.tests_passed=gt.passed,Ot.tests_failed=gt.failed,Ot.tests_bug=gt.bug,Ot.tests_recovered=gt.recovered,Ot.report_uploaded=qe);let Jt=qe?void 0:this.buildReportUploadProcessErrorPayload(gt,lt);if(await this.sendTestRunEnd(gt,qe,Jt),this.completeIndicators.report=!0,this.reportUploadSucceeded=qe,qe){let Dt=`${this.checksumAppUrl}/#/test-runs/${this.testSuiteRunId}`,fn=`Checksum report URL: ${Dt}`,$r="*".repeat(fn.length);console.log(`${$r}
798
798
  ${fn}
799
799
  ${$r}`),(F=this.testSuiteAnalytics)==null||F.reportComplete({stats:gt,reportUrl:Dt})}else(H=this.testSuiteAnalytics)==null||H.testSuiteError({error:"An error occurred while uploading the test report to Checksum"}),this.reportUploadFailed=!0,(j=this.testSuiteAnalytics)==null||j.reportUploadError(),console.log("An error occurred while uploading the test report to Checksum"),await this.sendProcessingError(Jt);break}case"upload-progress":{if(this.isolationMode)break;let qe=parseInt(c);(qe<this.uploadProgress||qe>=this.uploadProgress+10||qe===100&&this.uploadProgress!==100)&&(this.uploadProgress=qe,console.log(`[ Uploads progress: ${this.uploadProgress}% ]`))}break;case"log":console.log(c);break;case"trace":{let qe=c;if(!Object.values(VRe).includes(qe))return;(X=this.testSuiteAnalytics)==null||X.genericEvent(qe);break}case"playwrightConfig":try{this.playwrightConfig||(this.playwrightConfig=JSON.parse(c),(se=this.testSuiteAnalytics)==null||se.playwrightConfig({config:this.playwrightConfig}),this.loadPlaywrightConfigOptions())}catch(qe){let lt=`Error parsing playwright config - ${qe.message}`;(pe=this.testSuiteAnalytics)==null||pe.playwrightConfigError({error:lt}),this.log(lt)}break;default:(Ke=this.testSuiteAnalytics)==null||Ke.testRunMonitorError({error:`Unhandled test run monitor message: ${s}=${c}`}),this.log(`Unhandled test run monitor message: ${s}=${c}`)}}handleStats(s){var l,d;let c={};try{s&&s.length>0?(c=JSON.parse(s),c.tests=(c.tests??[]).map(h=>{let b=this.playwrightIdToReportMetadata[h.playwrightTestId];if(!b)return h;let T=Object.keys(b??{}),k=!1,F=!1,H=[];T.forEach(se=>{var Ke;let pe=b[Number(se)];if(pe){let qe=pe.autoRecoverySummaries;(Ke=qe==null?void 0:qe.data)!=null&&Ke.length&&H.push(...qe.data)}});let j=T[T.length-1],X=j!==void 0?b[Number(j)]:void 0;if(X){let se=X.autoRecoveryMetadata;k=(se==null?void 0:se.data.autoRecoveryTriggered)??!1,F=(se==null?void 0:se.data.autoRecovered)??!1}return{...h,recovered:F,autoRecoveryTriggered:k,autoRecoverySummaries:H}})):((l=this.testSuiteAnalytics)==null||l.testSuiteError({error:"No stats received from test run monitor"}),Lc("No stats received from test run monitor"))}catch(h){(d=this.testSuiteAnalytics)==null||d.testSuiteError({error:`Error parsing stats - ${h.message}`}),this.log(`Error parsing stats - ${h.message}`)}return c}buildProcessErrorPayload(s){return{...s,runtimeVersion:this.checksumRuntimeVersion}}buildReportUploadProcessErrorPayload(s,c){var l;return this.buildProcessErrorPayload({stage:"report-upload",reason:"Required Playwright HTML report failed to upload",reportUploaded:!1,evidence:{monitorEvent:"report-complete",statsFilePath:c||void 0,testsTotal:((l=s.tests)==null?void 0:l.length)??0,testsPassed:s.passed??0,testsFailed:s.failed??0,testsBug:s.bug??0,testsRecovered:s.recovered??0}})}hasTerminalFailure(){return this.didFail||this.reportUploadFailed}async handleCompleteMessage(){var l,d,h;let s=Date.now(),c=12;for(;;){if(Date.now()-s>this.MAX_COMPLETION_WAIT){console.log("Warning: Checksum wasn't able to upload all test assets or expected a file the couldn't be found. This might cause issues when viewing the report/trace."),(l=this.testSuiteAnalytics)==null||l.runtimeTimeout(),jRe("uploads_completion_wait",{test_suite_run_id:this.testSuiteRunId,outcome:"error",timed_out:!0,waited_ms:Date.now()-s,indicators:{...this.completeIndicators},pending:Object.entries(this.completeIndicators).filter(([,b])=>!b).map(([b])=>b)}),this.shutdown(1);return}if(Object.values(this.completeIndicators).some(b=>!b))Lc(this.completeIndicators),--c===0&&((d=this.testSuiteAnalytics)==null||d.completionStatus({stats:this.completeIndicators}),c=12),await Fh(5e3);else{let b=this.hasTerminalFailure();(h=this.testSuiteAnalytics)==null||h.runtimeComplete(),this.writeOutputFile(),console.log("Checksum test suite run has completed"),jRe("uploads_completion_wait",{test_suite_run_id:this.testSuiteRunId,outcome:"success",timed_out:!1,waited_ms:Date.now()-s,indicators:{...this.completeIndicators},did_fail:b,report_uploaded:this.reportUploadSucceeded});let T=Fte();T&&(T.did_fail=b),await this.shutdown(b?1:0);return}}}writeOutputFile(){try{let s=(0,kA.join)(this.getInternalFilesDirPath(),"output.json"),c={testRunId:this.testSuiteRunId,...this.reportUploadSucceeded&&{reportUrl:`${this.checksumAppUrl}/#/test-runs/${this.testSuiteRunId}`},failed:this.hasTerminalFailure()};(0,X1.writeFileSync)(s,JSON.stringify(c,null,2)),console.log(`Checksum output written to ${s}`)}catch(s){this.log(`Error writing output file: ${s.message}`)}}async fetchWithTimeout(s,c,l=3e4){let d=new AbortController,h=setTimeout(()=>d.abort(),l);try{return await fetch(s,{...c,signal:d.signal})}finally{clearTimeout(h)}}async fetchFailedTestPaths(s){let c=S6("api_call",{endpoint:"/public-api/v1/test-runs/results",method:"GET",purpose:"rerun_failed"});try{let l=await this.fetchFailedTestPathsInner(s);return c.emit({outcome:"success",failed_path_count:l.length}),l}catch(l){throw c.emit({outcome:"error",error:MQ(l)}),l}}async fetchFailedTestPathsInner(s){let c=this.getConfig().apiKey,l=this.getConfig().apiURL,d={Accept:"application/json",ChecksumAppCode:c};if(!s){let F=await this.fetchWithTimeout(`${l}/public-api/v1/test-runs/latest`,{headers:d});if(!F.ok){let j=await F.text();throw new Error(`Failed to fetch latest test run: ${F.status} ${j}`)}let H=await F.json();s=H.id,console.log(`Using latest test run: ${s} (branch: ${H.branch})`)}let h=await this.fetchWithTimeout(`${l}/public-api/v1/test-runs/${s}/results`,{headers:d});if(!h.ok){let F=await h.text();throw new Error(`Failed to fetch test run results: ${h.status} ${F}`)}let T=((await h.json()).tests??[]).filter(F=>F.status!=="passed"&&F.status!=="skipped");return[...new Set(T.map(F=>F.testFilePath).filter(Boolean))]}async fetchAffectedTestIds(s){let c=S6("api_call",{endpoint:"/public-api/v1/affected-tests",method:"POST",changed_files_count:s.length}),l;try{l=await this.fetchWithTimeout(`${this.getConfig().apiURL}/public-api/v1/affected-tests`,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json",ChecksumAppCode:this.getConfig().apiKey},body:JSON.stringify({changedFiles:s})},Ote.AFFECTED_TIMEOUT_MS)}catch(b){if(c.emit({outcome:"error",failure_reason:(b==null?void 0:b.name)==="AbortError"?"timeout":"network_error",error:MQ(b)}),(b==null?void 0:b.name)==="AbortError"){let T=Ote.AFFECTED_TIMEOUT_MS/1e3;throw new Error(`Affected-tests request timed out after ${T}s. If your diff is very large, pass a closer base ref (e.g. --cksm-affected=<recent-commit>) to shrink it, or run the full suite.`)}throw b}if(!l.ok){let b=await l.text();throw c.emit({outcome:"error",status_code:l.status,failure_reason:"http_error"}),new Error(`Failed to fetch affected tests: ${l.status} ${b}`)}let h=(await l.json()).affectedTestIds??[];return c.emit({outcome:"success",status_code:l.status,affected_count:h.length}),h}async shutdown(s=0){await this.cleanup(),process.exit(s)}async cleanup(){await super.cleanup(),this.testRunMonitorProcess&&(this.testRunMonitorProcess.stdin.write("cli:shutdown"),this.testRunMonitorProcess.kill())}async getSession(){let s,c=S6("session_create",{runtime_version:this.checksumRuntimeVersion});try{if(!this.getConfigOptions().hostReports)return this.setIsolatedMode(),c.emit({outcome:"success",test_suite_run_id:this.testSuiteRunId,isolation_mode:!0,isolation_reason:"host_reports_disabled"}),!0;if(s=this.getConfig().apiKey,!s||s==="<API key>"){let X="No API key found in checksum config - please set it in the config file - checksum.config.ts";return this.runtimeTrace(X,"Checksum Config Error"),this.log(X,!0),c.emit({outcome:"error",failure_reason:"missing_api_key"}),this.shutdown(1),!1}let l=await this.getEnvInfo(),d=Yar({args:this.args,env:process.env});if(d.kind==="error"){let X=`Invalid --cksm-auto-heal* configuration: ${d.message}`;return this.runtimeTrace(X,"Checksum Config Error"),this.log(X,!0),c.emit({outcome:"error",failure_reason:"invalid_auto_heal"}),this.shutdown(1),!1}let h=d.kind==="enabled"?d.options:void 0,b=JSON.stringify({...l,isHidden:!!this.getConfigOptions().hideReports,...h?{autoHealConfig:h}:{}}),T=await fetch(`${this.getConfig().apiURL}/client-api/test-runs`,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json",ChecksumAppCode:s},body:b}),k;try{k=await T.json()}catch{k=void 0}let F=Zar({ok:T.ok,status:T.status,body:k});if(F.kind==="fatal")return this.runtimeTrace(F.message,"Test Suite Init Error"),this.log(F.message,!0),c.emit({outcome:"error",failure_reason:"session_create_rejected",status_code:T.status,error:{type:"TestRunCreateRejected",message:F.message}}),this.shutdown(1),!1;let{uuid:H,appName:j}=F;return this.testSuiteRunId=H,l.commit=l.name,l.name=j,this.testSuiteRunInfo={appName:j??"",commitHash:l.commitHash,envName:l.name??"",branch:l.branch,testSuiteRunId:H,checksumRuntimeVersion:this.checksumRuntimeVersion},c.emit({outcome:"success",test_suite_run_id:H,app_name:j,environment:l.name,branch:l.branch,status_code:T.status}),!0}catch(l){let d=`Error connecting to Checksum, the report will not be hosted - ${l.message}`;return this.runtimeTrace(d,"Test Suite Init Error"),this.log(d),c.emit({outcome:"error",failure_reason:"init_request_failed",isolation_mode:!0,error:MQ(l)}),this.setIsolatedMode(),!0}}setIsolatedMode(){this.testSuiteRunId=process.env.CHECKSUM_TEST_SUITE_ID||(0,M_t.randomUUID)(),this.isolationMode=!0,this.completeIndicators.upload=!0,tc.testRun.monitoring.debugAnalytics?this.testSuiteRunInfo=rcr(this.checksumRuntimeVersion,this.testSuiteRunId):this.testSuiteRunInfo=tcr(this.checksumRuntimeVersion,this.testSuiteRunId)}async sendTestRunEnd(s,c,l){var d,h;if(!this.isolationMode)try{let b="{}";try{b=JSON.stringify({...s,endedAt:Date.now(),reportSchemaVersion:c?1:null,reportUploaded:c,processError:l})}catch(T){(d=this.testSuiteAnalytics)==null||d.testSuiteError({error:`Error stringifying stats ${T.message}`}),this.log(`Error stringifying stats ${T.message}`,!0)}await this.updateTestRun(`${this.getConfig().apiURL}/client-api/test-runs/${this.testSuiteRunId}`,"PATCH",b);return}catch(b){return(h=this.testSuiteAnalytics)==null||h.testSuiteError({error:`Error sending test run end ${b.message}`}),this.log(`Error sending test run end ${b.message}`,!0),null}}async sendUploadsComplete(){var s;if(!this.isolationMode)try{await this.updateTestRun(`${this.getConfig().apiURL}/client-api/test-runs/${this.testSuiteRunId}/uploads-completed`,"PATCH")}catch(c){(s=this.testSuiteAnalytics)==null||s.testSuiteError({error:`Error sending test run uploads complete - ${c.message}`}),this.log(`Error sending test run uploads complete - ${c.message}`,!0)}}async sendProcessingError(s){var c;if(!this.isolationMode)try{await this.updateTestRun(`${this.getConfig().apiURL}/client-api/test-runs/${this.testSuiteRunId}/process-error`,"PATCH",s?JSON.stringify(s):void 0)}catch(l){(c=this.testSuiteAnalytics)==null||c.testSuiteError({error:`Error sending test run processing error - ${l.message}`}),this.log(`Error sending test run processing error - ${l.message}`,!0)}}async updateTestRun(s,c,l=void 0){let d=S6("api_call",{method:c,endpoint:this.apiEndpointLabel(s),test_suite_run_id:this.testSuiteRunId});try{let h=await fetch(s,{method:c,headers:{Accept:"application/json","Content-Type":"application/json",ChecksumAppCode:this.getConfig().apiKey},...l!==void 0?{body:l}:{}});return Lc("Received update test run response from url:",s),await this.logApiResponse(h),d.emit({outcome:h.ok?"success":"error",status_code:h.status}),h}catch(h){throw d.emit({outcome:"error",error:MQ(h)}),h}}apiEndpointLabel(s){try{let c=new URL(s).pathname;return this.testSuiteRunId?c.replace(this.testSuiteRunId,":id"):c}catch{return s}}async logApiResponse(s){var c,l;try{if(!s.ok){let{status:h,statusText:b}=s,T=await s.text();(c=this.testSuiteAnalytics)==null||c.testSuiteError({status:h,statusText:b,error:T});return}let d=s.headers.get("Content-Type");d!=null&&d.includes("application/json")?s.json().then(h=>{Lc("API Response:",h)}):s.text().then(h=>{Lc("API Response:",h)})}catch(d){(l=this.testSuiteAnalytics)==null||l.testSuiteError({error:`Error logging API response - ${d.message}`})}}logTRMMessage(s){(Array.isArray(s)?s:[s]).forEach(c=>{Lc("[trm]",c)})}reEmitMonitorWideEvent(s){try{let c=Buffer.from(s,"base64").toString("utf-8");Pte(JSON.parse(c))}catch{this.logTRMMessage(`Unparseable wide event: "${s}"`)}}};t(Ote,"TestsRunner"),Ote.AFFECTED_TIMEOUT_MS=3e5;var Nme=Ote;var L_t=class L_t extends $0{constructor(n,s=!1){super(n,s)}async run(n){switch(n){default:console.log(`
800
800
  Checksum CLI
package/package.json CHANGED
@@ -42,5 +42,5 @@
42
42
  "url": "https://github.com/checksum-ai/checksum-ai-monorepo/issues"
43
43
  },
44
44
  "homepage": "https://github.com/checksum-ai/checksum-ai-monorepo/tree/main/packages/runtime#readme",
45
- "version": "4.4.1-beta.1"
45
+ "version": "4.4.2"
46
46
  }