@skyramp/testbot-core 0.13.0-v3.69 → 0.13.0-v3.70
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/VERSION.json +1 -1
- package/dist/main.js +348 -348
- package/dist/post.js +1 -1
- package/package.json +1 -1
package/dist/post.js
CHANGED
|
@@ -525,7 +525,7 @@ ${jmt(t,e)}`}function jmt(t,e){if(t.inputs.appRunning)return`${t.inputs.appRunni
|
|
|
525
525
|
`)[0].slice(0,600);E&&(c=`${p.slug}: ${b}`),a.push({schemaVersion:1,repository:p.slug,committed:!1,pushed:!1,prAction:"failed",prFailure:"unknown",prDetail:b,unstaged:[]})}}let l=Bn.join(t.outputsDir,"pr-body.md"),u=Bn.join(t.outputsDir,"deliver.json"),d={...a[0],deliveries:a};if(Uc.writeFileSync(u,JSON.stringify(d,null,2)+`
|
|
526
526
|
`),c)throw new Error(`delivery failed in ${c}`);return{deliver:Bn.relative(t.runDir,u),"pr-body":Bn.relative(t.runDir,l)}}async function vgt(t,e,r,n,i,s){let o=n.path,a=ie(t,"finalize.json"),c=Wd(t.inputs.requirementItems),l=ry(a?.commit?.message||r.commitMessage||"Skyramp Testbot: add tests",c),u=ry(r.commitMessage,c)||l,d=t.inputs.deliverRemote||"origin",p=s?s.headBranch||xve(t.inputs.headBranch,t.inputs.baseBranch,o):xve(void 0,void 0,o),f=bgt(p,t.inputs.deliverBranch),E=n.slug,g=Sve(Igt(r,t,n),{audience:"testbot-pr",requestedBy:t.inputs.requestedBy}),b=s?"pr-body.md":`pr-body-${Rve(E)}.md`,C=Bn.join(t.outputsDir,b);Uc.writeFileSync(C,g);let w=_s(o,["rev-parse","HEAD"]);_s(o,["checkout","-B",f]),_s(o,["reset"]);for(let D of i)Cgt(Bn.join(o,D),c);let S=[];for(let D of i)try{_s(o,["--literal-pathspecs","add","--",D])}catch{S.push(D)}let x=!1;try{_s(o,["diff","--cached","--quiet"])}catch{_s(o,["-c",`user.name=${iC}`,"-c",`user.email=${Tj}`,"commit","-m",l]),x=!0}let Q=_s(o,["rev-parse","HEAD"]),P,T=s?.headSha;if(x&&T&&T!==w)try{_s(o,["checkout","-q","-B",f,T]),_s(o,["-c",`user.name=${iC}`,"-c",`user.email=${Tj}`,"cherry-pick","--keep-redundant-commits",Q]),Q=_s(o,["rev-parse","HEAD"])}catch(D){try{_s(o,["cherry-pick","--abort"])}catch{}_s(o,["checkout","-q","-B",f,Q]);let H=String(D.stderr??"").split(`
|
|
527
527
|
`).find(K=>K.trim())||(D instanceof Error?D.message.split(`
|
|
528
|
-
`)[0]:String(D));P=`tests committed on the checkout's merge commit (re-cut onto ${T.slice(0,12)} failed: ${H.trim().slice(0,160)})`}let F=s?{}:{repositoryPath:o,repoSlug:E,devPr:null};if(!x){let D=await e.markTestsPrUnchanged({branch:f,...F});return{schemaVersion:1,repository:E,branch:f,remote:d,base:p,committed:!1,commitSha:Q,pushed:!1,prAction:D.action==="unchanged"?"unchanged":"skipped",prUrl:D.url,prTitle:u,unstaged:S,reason:D.action==="unchanged"?"no test changes to commit \u2014 existing tests PR annotated as unchanged":"no test changes to commit \u2014 nothing pushed, no PR opened"}}let M=await e.publishTestsPr({repositoryPath:o,...F,remote:d,branch:f,base:p,commitSha:Q,title:u,bodyFile:C,mode:t.inputs.deliverMode});return{schemaVersion:1,repository:E,branch:f,remote:d,base:M.base,requestedBase:p,committed:x,commitSha:Q,pushed:M.pushed,...M.pushedCommits?{pushedCommits:M.pushedCommits}:{},prAction:M.action,...M.retargetedAs?{retargetedAs:M.retargetedAs}:{},prUrl:M.url,prTitle:u,...M.failure?{prFailure:M.failure,prDetail:M.detail}:{},...P?{cutNote:P}:{},...M.action==="skipped"&&M.detail?{reason:M.detail}:{},unstaged:S}}var oY={name:"deliver",timeoutMinutes:5,requires:["finalize","report"],validateInput:ygt,execute:xgt},Rgt={...oY,requires:["report"],branchRequires:{runtime:["write"],"no-runtime":["finalize"]}};var Zer={preflight:zwe,onboard:kCe,analyze:aCe,triage:VIe,deploy:wN,recommend:YIe,generate:QSe,"generate-ui":DSe,"generate-unit":SW,"native-run":xW,adapt:ZSe,finalize:qW,report:Yxe,deliver:oY,plan:uve,write:sY};var Xer="two-step",etr=["two-step"];var ttr={preflight:"preflight",analyze:"plan",recommend:"plan",plan:"plan",deploy:"write",generate:"write","generate-ui":"write",adapt:"write",finalize:"write",write:"write",report:"report",deliver:"deliver",triage:"plan",onboard:"onboard","generate-unit":"generate-unit","native-run":"native-run"};var Bve=j(require("path"));var str=Bve.join(".skyramp","sut","get-auth-token.sh");var Ttr=3*6e4;var ktr=`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`;var Bgt="https://testbot.skyramp.dev",oy={attemptId:"v3AttemptId",origin:"v3Origin",deadlineAt:"v3DeadlineAt",reportUploaded:"v3ReportUploaded",recipeUploaded:"v3RecipeUploaded",cause:"v3Cause"};var Tgt=3e4;function kgt(t){let e=t.ACTIONS_ID_TOKEN_REQUEST_URL,r=t.ACTIONS_ID_TOKEN_REQUEST_TOKEN;return delete t.ACTIONS_ID_TOKEN_REQUEST_URL,delete t.ACTIONS_ID_TOKEN_REQUEST_TOKEN,async n=>{if(!e||!r)throw new Error("The job cannot request an OIDC token. Give it the `id-token: write` permission.");let i=new URL(e);i.searchParams.set("audience",n);let s=await fetch(i,{headers:{Authorization:`Bearer ${r}`,Accept:"application/json"},redirect:"error",signal:AbortSignal.timeout(Tgt)});if(!s.ok)throw new Error(`GitHub refused the OIDC token request: ${s.status}`);let o=(await s.json().catch(()=>({}))).value;if(typeof o!="string"||!o)throw new Error("GitHub's OIDC token response carried no token");return zs(o),o}}function Ngt(t,e){return{origin:t,idToken:e,mask:r=>zs(r),log:r=>Te(r)}}var Rrr={cancelled:"Skyramp cancelled this run",expired:"this attempt passed its deadline in Skyramp",ended:"Skyramp already ended this attempt"},Brr={cancelled:"cancelled",expired:"timed_out",ended:"agent_failed"};var
|
|
528
|
+
`)[0]:String(D));P=`tests committed on the checkout's merge commit (re-cut onto ${T.slice(0,12)} failed: ${H.trim().slice(0,160)})`}let F=s?{}:{repositoryPath:o,repoSlug:E,devPr:null};if(!x){let D=await e.markTestsPrUnchanged({branch:f,...F});return{schemaVersion:1,repository:E,branch:f,remote:d,base:p,committed:!1,commitSha:Q,pushed:!1,prAction:D.action==="unchanged"?"unchanged":"skipped",prUrl:D.url,prTitle:u,unstaged:S,reason:D.action==="unchanged"?"no test changes to commit \u2014 existing tests PR annotated as unchanged":"no test changes to commit \u2014 nothing pushed, no PR opened"}}let M=await e.publishTestsPr({repositoryPath:o,...F,remote:d,branch:f,base:p,commitSha:Q,title:u,bodyFile:C,mode:t.inputs.deliverMode});return{schemaVersion:1,repository:E,branch:f,remote:d,base:M.base,requestedBase:p,committed:x,commitSha:Q,pushed:M.pushed,...M.pushedCommits?{pushedCommits:M.pushedCommits}:{},prAction:M.action,...M.retargetedAs?{retargetedAs:M.retargetedAs}:{},prUrl:M.url,prTitle:u,...M.failure?{prFailure:M.failure,prDetail:M.detail}:{},...P?{cutNote:P}:{},...M.action==="skipped"&&M.detail?{reason:M.detail}:{},unstaged:S}}var oY={name:"deliver",timeoutMinutes:5,requires:["finalize","report"],validateInput:ygt,execute:xgt},Rgt={...oY,requires:["report"],branchRequires:{runtime:["write"],"no-runtime":["finalize"]}};var Zer={preflight:zwe,onboard:kCe,analyze:aCe,triage:VIe,deploy:wN,recommend:YIe,generate:QSe,"generate-ui":DSe,"generate-unit":SW,"native-run":xW,adapt:ZSe,finalize:qW,report:Yxe,deliver:oY,plan:uve,write:sY};var Xer="two-step",etr=["two-step"];var ttr={preflight:"preflight",analyze:"plan",recommend:"plan",plan:"plan",deploy:"write",generate:"write","generate-ui":"write",adapt:"write",finalize:"write",write:"write",report:"report",deliver:"deliver",triage:"plan",onboard:"onboard","generate-unit":"generate-unit","native-run":"native-run"};var Bve=j(require("path"));var str=Bve.join(".skyramp","sut","get-auth-token.sh");var Ttr=3*6e4;var ktr=`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`;var Bgt="https://testbot.skyramp.dev",oy={attemptId:"v3AttemptId",origin:"v3Origin",deadlineAt:"v3DeadlineAt",reportUploaded:"v3ReportUploaded",recipeUploaded:"v3RecipeUploaded",cause:"v3Cause"};var Tgt=3e4;function kgt(t){let e=t.ACTIONS_ID_TOKEN_REQUEST_URL,r=t.ACTIONS_ID_TOKEN_REQUEST_TOKEN;return delete t.ACTIONS_ID_TOKEN_REQUEST_URL,delete t.ACTIONS_ID_TOKEN_REQUEST_TOKEN,async n=>{if(!e||!r)throw new Error("The job cannot request an OIDC token. Give it the `id-token: write` permission.");let i=new URL(e);i.searchParams.set("audience",n);let s=await fetch(i,{headers:{Authorization:`Bearer ${r}`,Accept:"application/json"},redirect:"error",signal:AbortSignal.timeout(Tgt)});if(!s.ok)throw new Error(`GitHub refused the OIDC token request: ${s.status}`);let o=(await s.json().catch(()=>({}))).value;if(typeof o!="string"||!o)throw new Error("GitHub's OIDC token response carried no token");return zs(o),o}}function Ngt(t,e){return{origin:t,idToken:e,mask:r=>zs(r),log:r=>Te(r)}}var Rrr={cancelled:"Skyramp cancelled this run",expired:"this attempt passed its deadline in Skyramp",ended:"Skyramp already ended this attempt"},Brr={cancelled:"attempt-cancelled",expired:"attempt-closed",ended:"attempt-closed"},Trr={cancelled:"cancelled",expired:"timed_out",ended:"agent_failed"};var krr={analyze:"analyze",triage:"analyze",recommend:"recommend",generate:"generate","generate-ui":"generate","generate-unit":"generate",adapt:"generate",write:"generate",onboard:"execute",deploy:"execute","native-run":"execute",deliver:"deliver"},Nrr={analyze:"change analysis",recommend:"test recommendations",generate:"test generation",execute:"test execution",deliver:"opening a pull request with the tests"};var _rr={onboard:"onboard",deploy:"deploy"};async function Tve(){let t=ss(oy.attemptId);if(!t)return;let e=ss(oy.reportUploaded)==="true",r=ss(oy.recipeUploaded)==="true",n=ss(oy.deadlineAt),i=ss(oy.cause)||void 0;!i&&!e&&!r&&n&&Ibe(new Date(n),new Date)<=0&&(i="timed_out");let s=kgt(process.env),o=await Sbe({attemptId:t,reportUploaded:e,recipeUploaded:r,cause:i},Ngt(ss(oy.origin)||Bgt,s));Te(`Testbot V3: attempt ended; the run's outcome in Skyramp is ${o.outcome??"not final yet"}.`)}dt();var R_=j(require("crypto"));function aY(t){return Buffer.from(t).toString("base64url")}function _gt(t){return t.replace(/\\r\\n/g,`
|
|
529
529
|
`).replace(/\\n/g,`
|
|
530
530
|
`).trim()}function Qgt(t){return t.includes("-----BEGIN RSA PRIVATE KEY-----")}function Pgt(t){return t.includes("-----BEGIN OPENSSH PRIVATE KEY-----")}function Dgt(t){let e=t.split(`
|
|
531
531
|
`).map(r=>r.trim()).filter(r=>r&&!r.startsWith("-----")).join("");return Buffer.from(e,"base64")}function Ogt(t){let e=_gt(t);if(Pgt(e))throw new Error(`githubAppPrivateKey is in OpenSSH format, but GitHub Apps issue PKCS#1 ("-----BEGIN RSA PRIVATE KEY-----") or PKCS#8 ("-----BEGIN PRIVATE KEY-----") keys. Re-download the .pem from the GitHub App's settings page.`);let r=Qgt(e)?"pkcs1":"pkcs8";try{return R_.createPrivateKey({key:Dgt(e),format:"der",type:r})}catch(n){let i=r==="pkcs1"?"PKCS#1":"PKCS#8";throw new Error(`Failed to parse githubAppPrivateKey as a ${i} private key: ${n instanceof Error?n.message:String(n)}. Ensure the secret contains the full PEM, unmodified from the GitHub App's downloaded .pem file.`)}}function Mgt(t,e,r=Date.now()){let n=Math.floor(r/1e3),i=aY(JSON.stringify({alg:"RS256",typ:"JWT"})),s=aY(JSON.stringify({iat:n-60,exp:n+540,iss:t})),o=`${i}.${s}`,a=Ogt(e),c=R_.createSign("RSA-SHA256").update(o).sign(a);return`${o}.${aY(c)}`}var Fgt=50,v_=class{opts;now;fetchImpl;repositories;installationId;cached;inFlight;scopeGeneration=0;constructor(e){this.opts=e,this.now=e.now??Date.now,this.fetchImpl=e.fetchImpl??fetch,this.repositories=e.repositories}setRepositories(e){this.repositories=e,this.scopeGeneration++,this.cached=void 0,this.inFlight=void 0}async getToken(){if(this.cached&&this.now()-this.cached.mintedAtMs<this.refreshThresholdMs())return this.cached.token;if(!this.inFlight){let e=this.mint().finally(()=>{this.inFlight===e&&(this.inFlight=void 0)});this.inFlight=e}return this.inFlight}refreshThresholdMs(){let e=process.env.SKYRAMP_TOKEN_REFRESH_THRESHOLD_MINUTES;return e!==void 0&&e!==""&&!isNaN(Number(e))?Number(e)*6e4:this.opts.refreshThresholdMs??Fgt*6e4}async mint(){let e=this.scopeGeneration,r=this.now(),n=Mgt(this.opts.appId,this.opts.privateKey,r),i=await this.discoverInstallationId(n),s=await this.request("POST",`/app/installations/${i}/access_tokens`,n,{repositories:this.repositories});return zs(s.token),e===this.scopeGeneration&&(this.cached={token:s.token,mintedAtMs:r}),s.token}async discoverInstallationId(e){if(this.installationId===void 0){let r=await this.request("GET",`/repos/${this.opts.owner}/${this.opts.repo}/installation`,e);this.installationId=r.id}return this.installationId}async request(e,r,n,i){let s=process.env.GITHUB_API_URL??"https://api.github.com",o=await this.fetchImpl(`${s}${r}`,{method:e,headers:{authorization:`Bearer ${n}`,accept:"application/vnd.github+json","user-agent":"skyramp-testbot",...i!==void 0&&{"content-type":"application/json"}},body:i===void 0?void 0:JSON.stringify(i)});if(!o.ok){let a=await o.text().catch(()=>"");throw new Error(`GitHub App installation token request failed: ${e} ${r} returned ${o.status}. Check githubAppId/githubAppPrivateKey and that the App is installed on `+`${this.opts.owner}/${this.opts.repo}. ${a}`.trim())}return o.json()}};Cd();async function kve(){vAe(WT(Me("language")));try{await Tve()}catch(n){Fe(`Testbot V3: could not end the attempt: ${n instanceof Error?n.message:String(n)}`)}try{let n=ck(),i=(ay.existsSync(n)?ay.readdirSync(n):[]).filter(f=>/^agent-log\.attempt-\d+\.ndjson$/.test(f)).sort((f,E)=>f.localeCompare(E,void 0,{numeric:!0})).map(f=>ru.join(n,f)),s=ru.join(n,kj),o=[...i,...ay.existsSync(s)?[s]:[]],a=ru.join(n,"testbot-result.txt"),c=ru.join(n,"combined-result.txt"),l=ru.join(n,"agent-stdout.txt"),u=ru.join(n,MEe),d=new Xg;o.length>0&&await d.uploadArtifact("skyramp-agent-logs",o,n);let p=[a,c,l,u].filter(f=>ay.existsSync(f));p.length>0&&await d.uploadArtifact("skyramp-testbot-report",p,n)}catch(n){Fe(`Failed to upload artifacts in post step: ${n instanceof Error?n.message:String(n)}`)}try{let n=QAe(),i=await SEe(n),s=ru.resolve(n.workingDirectory);await TEe(i,s)}catch(n){Fe(`Service teardown error: ${n instanceof Error?n.message:String(n)}`)}let t=ss("progressCommentId"),e=ss("completed"),r=ss("cancelled")==="true";if(t&&!e&&r)try{let n=Me("githubToken"),i=Me("githubAppId"),s=Me("githubAppPrivateKey");delete process.env.INPUT_GITHUBAPPPRIVATEKEY;let o=n;if(i&&s){let f=Rj(process.env.GITHUB_REPOSITORY??"");if(f){let E=new v_({appId:i,privateKey:s,owner:f.owner,repo:f.repo,repositories:[f.repo]});o=()=>E.getToken()}}if(!o)return;let a=Nj(o);kEe(a);let c=parseInt(t,10),l=ss("steps"),u=l?JSON.parse(l):[],d=a.getRunUrl(),p=NEe(u,d);await a.updateComment({id:c},p),Uo("Progress comment updated with cancellation notice")}catch(n){Fe(`Failed to update progress comment on cancellation: ${n}`)}}process.env.NODE_ENV!=="test"&&(PAe(),kve().catch(t=>{CO(t instanceof Error?t.message:String(t))}));0&&(module.exports={post});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@skyramp/testbot-core",
|
|
3
|
-
"version": "0.13.0-v3.
|
|
3
|
+
"version": "0.13.0-v3.70",
|
|
4
4
|
"description": "Skyramp Testbot engine: AI-powered deterministic test generation, execution and maintenance",
|
|
5
5
|
"main": "dist/main.js",
|
|
6
6
|
"//files": "An explicit allowlist, never a glob. `dist/` is gitignored, so without this key npm's .gitignore fallback would publish a package with no engine in it; with a glob it would publish the sourcemaps, whose sourcesContent embeds every src/*.ts verbatim. eval-entry.js is a development entry and must not ship. dist/VERSION.json exists only in a release-engine.yml build. assets/gen-reference/ is the staged codegen reference corpus, which generate.ts finds at ../assets from dist/.",
|