@skyramp/testbot-core 0.12.0-v3.28 → 0.12.0-v3.29

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 (3) hide show
  1. package/dist/main.js +165 -165
  2. package/dist/post.js +1 -1
  3. package/package.json +1 -1
package/dist/post.js CHANGED
@@ -216,7 +216,7 @@ ${s.join(`
216
216
  `+" ".repeat(e)),"\r":new Array(ch).fill(0).map((t,e)=>"\r"+" ".repeat(e)),"\r\n":new Array(ch).fill(0).map((t,e)=>`\r
217
217
  `+" ".repeat(e))}," ":{"\n":new Array(ch).fill(0).map((t,e)=>`
218
218
  `+" ".repeat(e)),"\r":new Array(ch).fill(0).map((t,e)=>"\r"+" ".repeat(e)),"\r\n":new Array(ch).fill(0).map((t,e)=>`\r
219
- `+" ".repeat(e))}};var yue;(function(t){t.DEFAULT={allowTrailingComma:!1}})(yue||(yue={}));var Eue;(function(t){t[t.None=0]="None",t[t.UnexpectedEndOfComment=1]="UnexpectedEndOfComment",t[t.UnexpectedEndOfString=2]="UnexpectedEndOfString",t[t.UnexpectedEndOfNumber=3]="UnexpectedEndOfNumber",t[t.InvalidUnicode=4]="InvalidUnicode",t[t.InvalidEscapeCharacter=5]="InvalidEscapeCharacter",t[t.InvalidCharacter=6]="InvalidCharacter"})(Eue||(Eue={}));var bue;(function(t){t[t.OpenBraceToken=1]="OpenBraceToken",t[t.CloseBraceToken=2]="CloseBraceToken",t[t.OpenBracketToken=3]="OpenBracketToken",t[t.CloseBracketToken=4]="CloseBracketToken",t[t.CommaToken=5]="CommaToken",t[t.ColonToken=6]="ColonToken",t[t.NullKeyword=7]="NullKeyword",t[t.TrueKeyword=8]="TrueKeyword",t[t.FalseKeyword=9]="FalseKeyword",t[t.StringLiteral=10]="StringLiteral",t[t.NumericLiteral=11]="NumericLiteral",t[t.LineCommentTrivia=12]="LineCommentTrivia",t[t.BlockCommentTrivia=13]="BlockCommentTrivia",t[t.LineBreakTrivia=14]="LineBreakTrivia",t[t.Trivia=15]="Trivia",t[t.Unknown=16]="Unknown",t[t.EOF=17]="EOF"})(bue||(bue={}));var Cue;(function(t){t[t.InvalidSymbol=1]="InvalidSymbol",t[t.InvalidNumberFormat=2]="InvalidNumberFormat",t[t.PropertyNameExpected=3]="PropertyNameExpected",t[t.ValueExpected=4]="ValueExpected",t[t.ColonExpected=5]="ColonExpected",t[t.CommaExpected=6]="CommaExpected",t[t.CloseBraceExpected=7]="CloseBraceExpected",t[t.CloseBracketExpected=8]="CloseBracketExpected",t[t.EndOfFileExpected=9]="EndOfFileExpected",t[t.InvalidCommentToken=10]="InvalidCommentToken",t[t.UnexpectedEndOfComment=11]="UnexpectedEndOfComment",t[t.UnexpectedEndOfString=12]="UnexpectedEndOfString",t[t.UnexpectedEndOfNumber=13]="UnexpectedEndOfNumber",t[t.InvalidUnicode=14]="InvalidUnicode",t[t.InvalidEscapeCharacter=15]="InvalidEscapeCharacter",t[t.InvalidCharacter=16]="InvalidCharacter"})(Cue||(Cue={}));at();ay();var a5e=900*1e3;at();var c5e=`http.${(process.env.GITHUB_SERVER_URL||"https://github.com").replace(/\/+$/,"")}/.extraheader`,l5e=t=>t.replace(/[.[\]^$*+?(){}|\\]/g,"\\$&"),XSt=`^${l5e(c5e)}$`;var u5e=".skyramp/videos",eRt=`:(exclude)${u5e}/`;var p5e=10*6e4;function wue(t,e){return t.getTime()-e.getTime()-p5e}var CRt=10*6e4,f5e=3e4,h5e=3,A5e=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;var py=class extends Error{constructor(r,n){super(r);this.status=n}status};function m5e(t){let e;try{e=new URL(t)}catch{throw new Error(`skyrampAppOrigin "${t}" is not a URL`)}if(e.protocol!=="https:"||e.origin!==t.replace(/\/+$/,""))throw new Error(`skyrampAppOrigin must be an https origin, got "${t}"`);return e.origin}function g5e(t,e){if(!A5e.test(t))throw new Error(`The ${e} "${t}" is not a uuid`);return t}async function y5e(t,e,r,n){let i=m5e(t.origin),s;for(let o=1;o<=h5e;o+=1){o>1&&await new Promise(a=>setTimeout(a,(t.retryDelayMs??2e3)*(o-1)));try{let a=await t.idToken(i),c=await(t.fetch??fetch)(new URL(r,i).toString(),{method:e,headers:{Authorization:`Bearer ${a}`,"Content-Type":"application/json",Accept:"application/json"},body:e==="GET"?void 0:JSON.stringify(n),redirect:"error",signal:AbortSignal.timeout(f5e)}),l=await c.json().catch(()=>({}));if(c.ok)return l.data;let u=`The Skyramp app refused ${e} ${r}: ${c.status} ${l.error?.code??"no error code"}`;if(c.status<500&&c.status!==429)throw new py(u,c.status);s=new Error(u)}catch(a){if(a instanceof py)throw a;s=a}}throw s}var wRt=10*6e4;var IRt=["TRIGGER","AUTHORITATIVE_RELATED_CHANGE"];var BRt=S.object({tests:S.object({placements:S.array(S.unknown()).optional()}).passthrough().optional()}).passthrough(),xRt=S.object({repository:Ls.passthrough(),testType:S.nativeEnum(vU),directory:S.string()}).passthrough();var SRt=S.object({environment:S.object({components:S.array(S.unknown()).optional(),dependencies:S.array(S.unknown()).optional()}).passthrough()}).passthrough(),RRt=S.object({name:S.string().min(1),provision:S.literal("existing"),url:S.string().min(1),repository:Ls.passthrough().optional(),revisionUrl:S.string().min(1).optional()}).passthrough(),TRt=S.object({name:S.string().min(1),url:S.string().nullable(),versionUrl:S.string().nullable(),notes:S.string().nullable()}).passthrough();async function Iue(t,e){return g5e(t.attemptId,"attempt id"),y5e(e,"POST",`/api/v1/runner/attempts/${t.attemptId}/end`,Aue({reportUploaded:t.reportUploaded,recipeUploaded:t.recipeUploaded,cancelled:t.cause==="cancelled",timedOut:t.cause==="timed_out",setupFailed:t.cause==="setup_failed",credentialMissing:t.cause==="credential_missing"}))}var QRt=new RegExp("(^|/)("+["test_[^/]+\\.py","[^/]+_test\\.py","[^/]+\\.(spec|test)\\.[cm]?[jt]sx?","[^/]+_test\\.go","[^/]+Tests?\\.(java|kts?)","[^/]+_(test|spec)\\.rb","[^/]+\\.feature","[^/]+Tests?\\.cs","[^/]+_test\\.rs","tests/[^/]+\\.rs","[^/]+Test\\.php","[^/]+(Test|Spec|Suite)\\.scala","[^/]+Tests?\\.swift","[^/]+_test\\.exs","[^/]+_test\\.dart","[^/]+_test\\.(c|cc|cpp|cxx)","test_[^/]+\\.(c|cc|cpp|cxx)","[^/]+(Spec|Test)\\.groovy"].join("|")+")$","i");var ORt={focused:"Focused",impacted_critical:"Impacted and critical",broad:"Broad"};var d0=Ae(require("path")),HRt=d0.join(".skyramp","sut"),zRt=d0.join(".skyramp","workspace.yml");var Bue=".skyramp/sut/health.json",fTt={[Bue]:`${Bue} (with a url or command)`,".skyramp/workspace.yml":".skyramp/workspace.yml (create it with skyramp_init_scan and skyramp_init_workspace)"};var I5e=50,B5e=50,x5e=4096,S5e=8e3,R5e=2048,T5e=/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f-\u009f]/,N5e=/^(?!\/)(?!.*(?:^|\/)\.\.?(?:\/|$))[A-Za-z0-9._/ -]{1,255}$/,Q5e=/^\.github\/workflows\/[A-Za-z0-9._-]+\.ya?ml$/,v5e=/^(?!GITHUB_)(?!SKYRAMP_RUNNER_)[A-Z][A-Z0-9_]{0,99}$/,Sue=(s=>(s.Command="command",s.ComposeFile="compose_file",s.DeploymentWorkflow="deployment_workflow",s.Url="url",s.Guidance="guidance",s))(Sue||{}),k5e={command:"optional",compose_file:"required",deployment_workflow:"required",url:"none",guidance:"none"},xue=t=>S.string().max(t).refine(e=>e.trim().length>0&&!T5e.test(e),"must be non-blank text with no control characters other than tab, LF and CR");function _5e(t){let e;try{e=new URL(t)}catch{return"invalid URL"}if(e.protocol!=="https:"&&e.protocol!=="http:")return"only http and https URLs";if(e.username||e.password)return"a URL cannot carry a login"}var P5e={command:xue(x5e),compose_file:S.string().regex(N5e,"must be a relative path inside the repository"),deployment_workflow:S.string().regex(Q5e,"must be a .github/workflows/*.yml path"),url:S.string().max(R5e).superRefine((t,e)=>{let r=_5e(t);r&&e.addIssue({code:S.ZodIssueCode.custom,message:r})}),guidance:xue(S5e)},D5e=S.object({kind:S.nativeEnum(Sue),value:S.string(),repository:Ls.nullable()}).strict().superRefine((t,e)=>{let r=k5e[t.kind];r==="required"&&!t.repository&&e.addIssue({code:S.ZodIssueCode.custom,path:["repository"],message:"a file belongs to a repository"}),r==="none"&&t.repository&&e.addIssue({code:S.ZodIssueCode.custom,path:["repository"],message:`a ${t.kind} names no repository`});let n=P5e[t.kind].safeParse(t.value);if(!n.success)for(let i of n.error.issues)e.addIssue({code:S.ZodIssueCode.custom,path:["value"],message:i.message})}),M5e=S.object({name:S.string().regex(v5e,"must be a GitHub Actions secret name (A-Z, 0-9, _; not GITHUB_ or SKYRAMP_RUNNER_)"),purpose:S.nativeEnum(c0),required:S.boolean()}).strict(),bTt=S.object({knowledge:S.array(D5e).max(I5e),credentials:S.array(M5e).max(B5e)}).strict().superRefine((t,e)=>{let r=new Set;t.credentials.forEach((n,i)=>{r.has(n.name)&&e.addIssue({code:S.ZodIssueCode.custom,path:["credentials",i,"name"],message:"named twice"}),r.add(n.name)})});var CTt={model_provider:"model provider",sut_access:"SUT access",skyramp:"Skyramp",other:"other"};var F5e="https://testbot.skyramp.dev",lh={attemptId:"v3AttemptId",origin:"v3Origin",deadlineAt:"v3DeadlineAt",reportUploaded:"v3ReportUploaded",recipeUploaded:"v3RecipeUploaded",cause:"v3Cause"};var L5e=3e4;function O5e(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(L5e)});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 Oi(o),o}}function U5e(t,e){return{origin:t,idToken:e,mask:r=>Oi(r),log:r=>we(r)}}var oNt={cancelled:"Skyramp cancelled this run",expired:"this attempt passed its deadline in Skyramp",ended:"Skyramp already ended this attempt"},aNt={cancelled:"cancelled",expired:"timed_out",ended:"agent_failed"};var cNt={analyze:"analyze",triage:"analyze",recommend:"recommend",generate:"generate","generate-ui":"generate","generate-unit":"generate",adapt:"generate",onboard:"execute",deploy:"execute","native-run":"execute",deliver:"deliver"},lNt={analyze:"change analysis",recommend:"test recommendations",generate:"test generation",execute:"test execution",deliver:"opening a pull request with the tests"};var uNt={onboard:"onboard",deploy:"deploy"};async function Rue(){let t=di(lh.attemptId);if(!t)return;let e=di(lh.reportUploaded)==="true",r=di(lh.recipeUploaded)==="true",n=di(lh.deadlineAt),i=di(lh.cause)||void 0;!i&&!e&&!r&&n&&wue(new Date(n),new Date)<=0&&(i="timed_out");let s=O5e(process.env),o=await Iue({attemptId:t,reportUploaded:e,recipeUploaded:r,cause:i},U5e(di(lh.origin)||F5e,s));we(`Testbot V3: attempt ended; the run's outcome in Skyramp is ${o.outcome??"not final yet"}.`)}at();var f0=Ae(require("crypto"));function kU(t){return Buffer.from(t).toString("base64url")}function q5e(t){return t.replace(/\\r\\n/g,`
219
+ `+" ".repeat(e))}};var yue;(function(t){t.DEFAULT={allowTrailingComma:!1}})(yue||(yue={}));var Eue;(function(t){t[t.None=0]="None",t[t.UnexpectedEndOfComment=1]="UnexpectedEndOfComment",t[t.UnexpectedEndOfString=2]="UnexpectedEndOfString",t[t.UnexpectedEndOfNumber=3]="UnexpectedEndOfNumber",t[t.InvalidUnicode=4]="InvalidUnicode",t[t.InvalidEscapeCharacter=5]="InvalidEscapeCharacter",t[t.InvalidCharacter=6]="InvalidCharacter"})(Eue||(Eue={}));var bue;(function(t){t[t.OpenBraceToken=1]="OpenBraceToken",t[t.CloseBraceToken=2]="CloseBraceToken",t[t.OpenBracketToken=3]="OpenBracketToken",t[t.CloseBracketToken=4]="CloseBracketToken",t[t.CommaToken=5]="CommaToken",t[t.ColonToken=6]="ColonToken",t[t.NullKeyword=7]="NullKeyword",t[t.TrueKeyword=8]="TrueKeyword",t[t.FalseKeyword=9]="FalseKeyword",t[t.StringLiteral=10]="StringLiteral",t[t.NumericLiteral=11]="NumericLiteral",t[t.LineCommentTrivia=12]="LineCommentTrivia",t[t.BlockCommentTrivia=13]="BlockCommentTrivia",t[t.LineBreakTrivia=14]="LineBreakTrivia",t[t.Trivia=15]="Trivia",t[t.Unknown=16]="Unknown",t[t.EOF=17]="EOF"})(bue||(bue={}));var Cue;(function(t){t[t.InvalidSymbol=1]="InvalidSymbol",t[t.InvalidNumberFormat=2]="InvalidNumberFormat",t[t.PropertyNameExpected=3]="PropertyNameExpected",t[t.ValueExpected=4]="ValueExpected",t[t.ColonExpected=5]="ColonExpected",t[t.CommaExpected=6]="CommaExpected",t[t.CloseBraceExpected=7]="CloseBraceExpected",t[t.CloseBracketExpected=8]="CloseBracketExpected",t[t.EndOfFileExpected=9]="EndOfFileExpected",t[t.InvalidCommentToken=10]="InvalidCommentToken",t[t.UnexpectedEndOfComment=11]="UnexpectedEndOfComment",t[t.UnexpectedEndOfString=12]="UnexpectedEndOfString",t[t.UnexpectedEndOfNumber=13]="UnexpectedEndOfNumber",t[t.InvalidUnicode=14]="InvalidUnicode",t[t.InvalidEscapeCharacter=15]="InvalidEscapeCharacter",t[t.InvalidCharacter=16]="InvalidCharacter"})(Cue||(Cue={}));at();ay();var a5e=900*1e3;at();var c5e=`http.${(process.env.GITHUB_SERVER_URL||"https://github.com").replace(/\/+$/,"")}/.extraheader`,l5e=t=>t.replace(/[.[\]^$*+?(){}|\\]/g,"\\$&"),XSt=`^${l5e(c5e)}$`;var u5e=".skyramp/videos",eRt=`:(exclude)${u5e}/`;var p5e=10*6e4;function wue(t,e){return t.getTime()-e.getTime()-p5e}var CRt=10*6e4,f5e=3e4,h5e=3,A5e=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;var py=class extends Error{constructor(r,n,i){super(r);this.status=n;this.code=i}status;code};function m5e(t){let e;try{e=new URL(t)}catch{throw new Error(`skyrampAppOrigin "${t}" is not a URL`)}if(e.protocol!=="https:"||e.origin!==t.replace(/\/+$/,""))throw new Error(`skyrampAppOrigin must be an https origin, got "${t}"`);return e.origin}function g5e(t,e){if(!A5e.test(t))throw new Error(`The ${e} "${t}" is not a uuid`);return t}async function y5e(t,e,r,n){let i=m5e(t.origin),s;for(let o=1;o<=h5e;o+=1){o>1&&await new Promise(a=>setTimeout(a,(t.retryDelayMs??2e3)*(o-1)));try{let a=await t.idToken(i),c=await(t.fetch??fetch)(new URL(r,i).toString(),{method:e,headers:{Authorization:`Bearer ${a}`,"Content-Type":"application/json",Accept:"application/json"},body:e==="GET"?void 0:JSON.stringify(n),redirect:"error",signal:AbortSignal.timeout(f5e)}),l=await c.json().catch(()=>({}));if(c.ok)return l.data;let u=`The Skyramp app refused ${e} ${r}: ${c.status} ${l.error?.code??"no error code"}`;if(c.status<500&&c.status!==429)throw new py(u,c.status,l.error?.code);s=new Error(u)}catch(a){if(a instanceof py)throw a;s=a}}throw s}var wRt=10*6e4;var IRt=["TRIGGER","AUTHORITATIVE_RELATED_CHANGE"];var BRt=S.object({tests:S.object({placements:S.array(S.unknown()).optional()}).passthrough().optional()}).passthrough(),xRt=S.object({repository:Ls.passthrough(),testType:S.nativeEnum(vU),directory:S.string()}).passthrough();var SRt=S.object({environment:S.object({components:S.array(S.unknown()).optional(),dependencies:S.array(S.unknown()).optional()}).passthrough()}).passthrough(),RRt=S.object({name:S.string().min(1),provision:S.literal("existing"),url:S.string().min(1),repository:Ls.passthrough().optional(),revisionUrl:S.string().min(1).optional()}).passthrough(),TRt=S.object({name:S.string().min(1),url:S.string().nullable(),versionUrl:S.string().nullable(),notes:S.string().nullable()}).passthrough();async function Iue(t,e){return g5e(t.attemptId,"attempt id"),y5e(e,"POST",`/api/v1/runner/attempts/${t.attemptId}/end`,Aue({reportUploaded:t.reportUploaded,recipeUploaded:t.recipeUploaded,cancelled:t.cause==="cancelled",timedOut:t.cause==="timed_out",setupFailed:t.cause==="setup_failed",credentialMissing:t.cause==="credential_missing"}))}var QRt=new RegExp("(^|/)("+["test_[^/]+\\.py","[^/]+_test\\.py","[^/]+\\.(spec|test)\\.[cm]?[jt]sx?","[^/]+_test\\.go","[^/]+Tests?\\.(java|kts?)","[^/]+_(test|spec)\\.rb","[^/]+\\.feature","[^/]+Tests?\\.cs","[^/]+_test\\.rs","tests/[^/]+\\.rs","[^/]+Test\\.php","[^/]+(Test|Spec|Suite)\\.scala","[^/]+Tests?\\.swift","[^/]+_test\\.exs","[^/]+_test\\.dart","[^/]+_test\\.(c|cc|cpp|cxx)","test_[^/]+\\.(c|cc|cpp|cxx)","[^/]+(Spec|Test)\\.groovy"].join("|")+")$","i");var ORt={focused:"Focused",impacted_critical:"Impacted and critical",broad:"Broad"};var d0=Ae(require("path")),HRt=d0.join(".skyramp","sut"),zRt=d0.join(".skyramp","workspace.yml");var Bue=".skyramp/sut/health.json",fTt={[Bue]:`${Bue} (with a url or command)`,".skyramp/workspace.yml":".skyramp/workspace.yml (create it with skyramp_init_scan and skyramp_init_workspace)"};var I5e=50,B5e=50,x5e=4096,S5e=8e3,R5e=2048,T5e=/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f-\u009f]/,N5e=/^(?!\/)(?!.*(?:^|\/)\.\.?(?:\/|$))[A-Za-z0-9._/ -]{1,255}$/,Q5e=/^\.github\/workflows\/[A-Za-z0-9._-]+\.ya?ml$/,v5e=/^(?!GITHUB_)(?!SKYRAMP_RUNNER_)[A-Z][A-Z0-9_]{0,99}$/,Sue=(s=>(s.Command="command",s.ComposeFile="compose_file",s.DeploymentWorkflow="deployment_workflow",s.Url="url",s.Guidance="guidance",s))(Sue||{}),k5e={command:"optional",compose_file:"required",deployment_workflow:"required",url:"none",guidance:"none"},xue=t=>S.string().max(t).refine(e=>e.trim().length>0&&!T5e.test(e),"must be non-blank text with no control characters other than tab, LF and CR");function _5e(t){let e;try{e=new URL(t)}catch{return"invalid URL"}if(e.protocol!=="https:"&&e.protocol!=="http:")return"only http and https URLs";if(e.username||e.password)return"a URL cannot carry a login"}var P5e={command:xue(x5e),compose_file:S.string().regex(N5e,"must be a relative path inside the repository"),deployment_workflow:S.string().regex(Q5e,"must be a .github/workflows/*.yml path"),url:S.string().max(R5e).superRefine((t,e)=>{let r=_5e(t);r&&e.addIssue({code:S.ZodIssueCode.custom,message:r})}),guidance:xue(S5e)},D5e=S.object({kind:S.nativeEnum(Sue),value:S.string(),repository:Ls.nullable()}).strict().superRefine((t,e)=>{let r=k5e[t.kind];r==="required"&&!t.repository&&e.addIssue({code:S.ZodIssueCode.custom,path:["repository"],message:"a file belongs to a repository"}),r==="none"&&t.repository&&e.addIssue({code:S.ZodIssueCode.custom,path:["repository"],message:`a ${t.kind} names no repository`});let n=P5e[t.kind].safeParse(t.value);if(!n.success)for(let i of n.error.issues)e.addIssue({code:S.ZodIssueCode.custom,path:["value"],message:i.message})}),M5e=S.object({name:S.string().regex(v5e,"must be a GitHub Actions secret name (A-Z, 0-9, _; not GITHUB_ or SKYRAMP_RUNNER_)"),purpose:S.nativeEnum(c0),required:S.boolean()}).strict(),bTt=S.object({knowledge:S.array(D5e).max(I5e),credentials:S.array(M5e).max(B5e)}).strict().superRefine((t,e)=>{let r=new Set;t.credentials.forEach((n,i)=>{r.has(n.name)&&e.addIssue({code:S.ZodIssueCode.custom,path:["credentials",i,"name"],message:"named twice"}),r.add(n.name)})});var CTt={model_provider:"model provider",sut_access:"SUT access",skyramp:"Skyramp",other:"other"};var F5e="https://testbot.skyramp.dev",lh={attemptId:"v3AttemptId",origin:"v3Origin",deadlineAt:"v3DeadlineAt",reportUploaded:"v3ReportUploaded",recipeUploaded:"v3RecipeUploaded",cause:"v3Cause"};var L5e=3e4;function O5e(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(L5e)});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 Oi(o),o}}function U5e(t,e){return{origin:t,idToken:e,mask:r=>Oi(r),log:r=>we(r)}}var oNt={cancelled:"Skyramp cancelled this run",expired:"this attempt passed its deadline in Skyramp",ended:"Skyramp already ended this attempt"},aNt={cancelled:"cancelled",expired:"timed_out",ended:"agent_failed"};var cNt={analyze:"analyze",triage:"analyze",recommend:"recommend",generate:"generate","generate-ui":"generate","generate-unit":"generate",adapt:"generate",onboard:"execute",deploy:"execute","native-run":"execute",deliver:"deliver"},lNt={analyze:"change analysis",recommend:"test recommendations",generate:"test generation",execute:"test execution",deliver:"opening a pull request with the tests"};var uNt={onboard:"onboard",deploy:"deploy"};async function Rue(){let t=di(lh.attemptId);if(!t)return;let e=di(lh.reportUploaded)==="true",r=di(lh.recipeUploaded)==="true",n=di(lh.deadlineAt),i=di(lh.cause)||void 0;!i&&!e&&!r&&n&&wue(new Date(n),new Date)<=0&&(i="timed_out");let s=O5e(process.env),o=await Iue({attemptId:t,reportUploaded:e,recipeUploaded:r,cause:i},U5e(di(lh.origin)||F5e,s));we(`Testbot V3: attempt ended; the run's outcome in Skyramp is ${o.outcome??"not final yet"}.`)}at();var f0=Ae(require("crypto"));function kU(t){return Buffer.from(t).toString("base64url")}function q5e(t){return t.replace(/\\r\\n/g,`
220
220
  `).replace(/\\n/g,`
221
221
  `).trim()}function G5e(t){return t.includes("-----BEGIN RSA PRIVATE KEY-----")}function H5e(t){return t.includes("-----BEGIN OPENSSH PRIVATE KEY-----")}function z5e(t){let e=t.split(`
222
222
  `).map(r=>r.trim()).filter(r=>r&&!r.startsWith("-----")).join("");return Buffer.from(e,"base64")}function V5e(t){let e=q5e(t);if(H5e(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=G5e(e)?"pkcs1":"pkcs8";try{return f0.createPrivateKey({key:z5e(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 Y5e(t,e,r=Date.now()){let n=Math.floor(r/1e3),i=kU(JSON.stringify({alg:"RS256",typ:"JWT"})),s=kU(JSON.stringify({iat:n-60,exp:n+540,iss:t})),o=`${i}.${s}`,a=V5e(e),c=f0.createSign("RSA-SHA256").update(o).sign(a);return`${o}.${kU(c)}`}var $5e=50,p0=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??$5e*6e4}async mint(){let e=this.scopeGeneration,r=this.now(),n=Y5e(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 Oi(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()}};ay();async function Tue(){Zae(zx(Qe("language")));try{await Rue()}catch(n){ve(`Testbot V3: could not end the attempt: ${n instanceof Error?n.message:String(n)}`)}try{let n=AU(),i=(uh.existsSync(n)?uh.readdirSync(n):[]).filter(m=>/^agent-log\.attempt-\d+\.ndjson$/.test(m)).sort((m,E)=>m.localeCompare(E,void 0,{numeric:!0})).map(m=>ja.join(n,m)),s=ja.join(n,mU),o=[...i,...uh.existsSync(s)?[s]:[]],a=ja.join(n,"testbot-result.txt"),c=ja.join(n,"combined-result.txt"),l=ja.join(n,"agent-stdout.txt"),u=ja.join(n,cue),d=new jf;o.length>0&&await d.uploadArtifact("skyramp-agent-logs",o,n);let f=[a,c,l,u].filter(m=>uh.existsSync(m));f.length>0&&await d.uploadArtifact("skyramp-testbot-report",f,n)}catch(n){ve(`Failed to upload artifacts in post step: ${n instanceof Error?n.message:String(n)}`)}try{let n=sce(),i=await jle(n),s=ja.resolve(n.workingDirectory);await eue(i,s)}catch(n){ve(`Service teardown error: ${n instanceof Error?n.message:String(n)}`)}let t=di("progressCommentId"),e=di("completed"),r=di("cancelled")==="true";if(t&&!e&&r)try{let n=Qe("githubToken"),i=Qe("githubAppId"),s=Qe("githubAppPrivateKey");delete process.env.INPUT_GITHUBAPPPRIVATEKEY;let o=n;if(i&&s){let m=fU(process.env.GITHUB_REPOSITORY??"");if(m){let E=new p0({appId:i,privateKey:s,owner:m.owner,repo:m.repo,repositories:[m.repo]});o=()=>E.getToken()}}if(!o)return;let a=gU(o);tue(a);let c=parseInt(t,10),l=di("steps"),u=l?JSON.parse(l):[],d=a.getRunUrl(),f=rue(u,d);await a.updateComment({id:c},f),Cs("Progress comment updated with cancellation notice")}catch(n){ve(`Failed to update progress comment on cancellation: ${n}`)}}process.env.NODE_ENV!=="test"&&Tue().catch(t=>{cN(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.12.0-v3.28",
3
+ "version": "0.12.0-v3.29",
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.",