@skyramp/testbot-core 0.12.0-v3.17 → 0.12.0-v3.18
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/main.js +378 -377
- package/dist/post.js +1 -1
- package/package.json +1 -1
package/dist/post.js
CHANGED
|
@@ -216,7 +216,7 @@ ${s.join(`
|
|
|
216
216
|
`+" ".repeat(e)),"\r":new Array(ah).fill(0).map((t,e)=>"\r"+" ".repeat(e)),"\r\n":new Array(ah).fill(0).map((t,e)=>`\r
|
|
217
217
|
`+" ".repeat(e))}," ":{"\n":new Array(ah).fill(0).map((t,e)=>`
|
|
218
218
|
`+" ".repeat(e)),"\r":new Array(ah).fill(0).map((t,e)=>"\r"+" ".repeat(e)),"\r\n":new Array(ah).fill(0).map((t,e)=>`\r
|
|
219
|
-
`+" ".repeat(e))}};var hue;(function(t){t.DEFAULT={allowTrailingComma:!1}})(hue||(hue={}));var Aue;(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"})(Aue||(Aue={}));var mue;(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"})(mue||(mue={}));var gue;(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"})(gue||(gue={}));at();oy();var e8e=900*1e3;at();var t8e=`http.${(process.env.GITHUB_SERVER_URL||"https://github.com").replace(/\/+$/,"")}/.extraheader`,r8e=t=>t.replace(/[.[\]^$*+?(){}|\\]/g,"\\$&"),VSt=`^${r8e(t8e)}$`;var n8e=".skyramp/videos",YSt=`:(exclude)${n8e}/`;var s8e=10*6e4;function yue(t,e){return t.getTime()-e.getTime()-s8e}var fRt=10*6e4,o8e=3e4,a8e=3,c8e=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;var dy=class extends Error{constructor(r,n){super(r);this.status=n}status};function l8e(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 u8e(t,e){if(!c8e.test(t))throw new Error(`The ${e} "${t}" is not a uuid`);return t}async function d8e(t,e,r,n){let i=l8e(t.origin),s;for(let o=1;o<=a8e;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(o8e)}),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 dy(u,c.status);s=new Error(u)}catch(a){if(a instanceof dy)throw a;s=a}}throw s}var hRt=10*6e4;var ARt=["TRIGGER","AUTHORITATIVE_RELATED_CHANGE"];var mRt=T.object({tests:T.object({placements:T.array(T.unknown()).optional()}).passthrough().optional()}).passthrough(),gRt=T.object({repository:$a.passthrough(),testType:T.nativeEnum(RU),directory:T.string()}).passthrough();async function Eue(t,e){return u8e(t.attemptId,"attempt id"),d8e(e,"POST",`/api/v1/runner/attempts/${t.attemptId}/end`,due({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 u0=Ae(require("path")),bRt=u0.join(".skyramp","sut"),CRt=u0.join(".skyramp","workspace.yml");var SRt=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 bue=".skyramp/sut/health.json",YRt={[bue]:`${bue} (with a url or command)`,".skyramp/workspace.yml":".skyramp/workspace.yml (create it with skyramp_init_scan and skyramp_init_workspace)"};var A8e=50,m8e=50,g8e=4096,y8e=8e3,E8e=2048,b8e=/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f-\u009f]/,C8e=/^(?!\/)(?!.*(?:^|\/)\.\.?(?:\/|$))[A-Za-z0-9._/ -]{1,255}$/,w8e=/^\.github\/workflows\/[A-Za-z0-9._-]+\.ya?ml$/,I8e=/^(?!GITHUB_)(?!SKYRAMP_RUNNER_)[A-Z][A-Z0-9_]{0,99}$/,wue=(s=>(s.Command="command",s.ComposeFile="compose_file",s.DeploymentWorkflow="deployment_workflow",s.Url="url",s.Guidance="guidance",s))(wue||{}),B8e={command:"optional",compose_file:"required",deployment_workflow:"required",url:"none",guidance:"none"},Cue=t=>T.string().max(t).refine(e=>e.trim().length>0&&!b8e.test(e),"must be non-blank text with no control characters other than tab, LF and CR");function x8e(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 S8e={command:Cue(g8e),compose_file:T.string().regex(C8e,"must be a relative path inside the repository"),deployment_workflow:T.string().regex(w8e,"must be a .github/workflows/*.yml path"),url:T.string().max(E8e).superRefine((t,e)=>{let r=x8e(t);r&&e.addIssue({code:T.ZodIssueCode.custom,message:r})}),guidance:Cue(y8e)},R8e=T.object({kind:T.nativeEnum(wue),value:T.string(),repository:$a.nullable()}).strict().superRefine((t,e)=>{let r=B8e[t.kind];r==="required"&&!t.repository&&e.addIssue({code:T.ZodIssueCode.custom,path:["repository"],message:"a file belongs to a repository"}),r==="none"&&t.repository&&e.addIssue({code:T.ZodIssueCode.custom,path:["repository"],message:`a ${t.kind} names no repository`});let n=S8e[t.kind].safeParse(t.value);if(!n.success)for(let i of n.error.issues)e.addIssue({code:T.ZodIssueCode.custom,path:["value"],message:i.message})}),T8e=T.object({name:T.string().regex(I8e,"must be a GitHub Actions secret name (A-Z, 0-9, _; not GITHUB_ or SKYRAMP_RUNNER_)"),purpose:T.nativeEnum(a0),required:T.boolean()}).strict(),XRt=T.object({knowledge:T.array(R8e).max(A8e),credentials:T.array(T8e).max(m8e)}).strict().superRefine((t,e)=>{let r=new Set;t.credentials.forEach((n,i)=>{r.has(n.name)&&e.addIssue({code:T.ZodIssueCode.custom,path:["credentials",i,"name"],message:"named twice"}),r.add(n.name)})});var eTt={model_provider:"model provider",sut_access:"SUT access",skyramp:"Skyramp",other:"other"};var N8e="https://testbot.skyramp.dev",ch={attemptId:"v3AttemptId",origin:"v3Origin",deadlineAt:"v3DeadlineAt",reportUploaded:"v3ReportUploaded",recipeUploaded:"v3RecipeUploaded",cause:"v3Cause"};var Q8e=3e4;function v8e(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(Q8e)});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 k8e(t,e){return{origin:t,idToken:e,mask:r=>Oi(r),log:r=>we(r)}}var DTt={cancelled:"Skyramp cancelled this run",expired:"this attempt passed its deadline in Skyramp",ended:"Skyramp already ended this attempt"},MTt={cancelled:"cancelled",expired:"timed_out",ended:"agent_failed"};var FTt={onboard:"onboard",deploy:"deploy"};async function Iue(){let t=di(ch.attemptId);if(!t)return;let e=di(ch.reportUploaded)==="true",r=di(ch.recipeUploaded)==="true",n=di(ch.deadlineAt),i=di(ch.cause)||void 0;!i&&!e&&!r&&n&&yue(new Date(n),new Date)<=0&&(i="timed_out");let s=v8e(process.env),o=await Eue({attemptId:t,reportUploaded:e,recipeUploaded:r,cause:i},k8e(di(ch.origin)||N8e,s));we(`Testbot V3: attempt ended; the run's outcome in Skyramp is ${o.outcome??"not final yet"}.`)}at();var p0=Ae(require("crypto"));function TU(t){return Buffer.from(t).toString("base64url")}function _8e(t){return t.replace(/\\r\\n/g,`
|
|
219
|
+
`+" ".repeat(e))}};var hue;(function(t){t.DEFAULT={allowTrailingComma:!1}})(hue||(hue={}));var Aue;(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"})(Aue||(Aue={}));var mue;(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"})(mue||(mue={}));var gue;(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"})(gue||(gue={}));at();oy();var e8e=900*1e3;at();var t8e=`http.${(process.env.GITHUB_SERVER_URL||"https://github.com").replace(/\/+$/,"")}/.extraheader`,r8e=t=>t.replace(/[.[\]^$*+?(){}|\\]/g,"\\$&"),VSt=`^${r8e(t8e)}$`;var n8e=".skyramp/videos",YSt=`:(exclude)${n8e}/`;var s8e=10*6e4;function yue(t,e){return t.getTime()-e.getTime()-s8e}var fRt=10*6e4,o8e=3e4,a8e=3,c8e=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;var dy=class extends Error{constructor(r,n){super(r);this.status=n}status};function l8e(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 u8e(t,e){if(!c8e.test(t))throw new Error(`The ${e} "${t}" is not a uuid`);return t}async function d8e(t,e,r,n){let i=l8e(t.origin),s;for(let o=1;o<=a8e;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(o8e)}),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 dy(u,c.status);s=new Error(u)}catch(a){if(a instanceof dy)throw a;s=a}}throw s}var hRt=10*6e4;var ARt=["TRIGGER","AUTHORITATIVE_RELATED_CHANGE"];var mRt=T.object({tests:T.object({placements:T.array(T.unknown()).optional()}).passthrough().optional()}).passthrough(),gRt=T.object({repository:$a.passthrough(),testType:T.nativeEnum(RU),directory:T.string()}).passthrough();async function Eue(t,e){return u8e(t.attemptId,"attempt id"),d8e(e,"POST",`/api/v1/runner/attempts/${t.attemptId}/end`,due({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 u0=Ae(require("path")),bRt=u0.join(".skyramp","sut"),CRt=u0.join(".skyramp","workspace.yml");var SRt=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 bue=".skyramp/sut/health.json",YRt={[bue]:`${bue} (with a url or command)`,".skyramp/workspace.yml":".skyramp/workspace.yml (create it with skyramp_init_scan and skyramp_init_workspace)"};var A8e=50,m8e=50,g8e=4096,y8e=8e3,E8e=2048,b8e=/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f-\u009f]/,C8e=/^(?!\/)(?!.*(?:^|\/)\.\.?(?:\/|$))[A-Za-z0-9._/ -]{1,255}$/,w8e=/^\.github\/workflows\/[A-Za-z0-9._-]+\.ya?ml$/,I8e=/^(?!GITHUB_)(?!SKYRAMP_RUNNER_)[A-Z][A-Z0-9_]{0,99}$/,wue=(s=>(s.Command="command",s.ComposeFile="compose_file",s.DeploymentWorkflow="deployment_workflow",s.Url="url",s.Guidance="guidance",s))(wue||{}),B8e={command:"optional",compose_file:"required",deployment_workflow:"required",url:"none",guidance:"none"},Cue=t=>T.string().max(t).refine(e=>e.trim().length>0&&!b8e.test(e),"must be non-blank text with no control characters other than tab, LF and CR");function x8e(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 S8e={command:Cue(g8e),compose_file:T.string().regex(C8e,"must be a relative path inside the repository"),deployment_workflow:T.string().regex(w8e,"must be a .github/workflows/*.yml path"),url:T.string().max(E8e).superRefine((t,e)=>{let r=x8e(t);r&&e.addIssue({code:T.ZodIssueCode.custom,message:r})}),guidance:Cue(y8e)},R8e=T.object({kind:T.nativeEnum(wue),value:T.string(),repository:$a.nullable()}).strict().superRefine((t,e)=>{let r=B8e[t.kind];r==="required"&&!t.repository&&e.addIssue({code:T.ZodIssueCode.custom,path:["repository"],message:"a file belongs to a repository"}),r==="none"&&t.repository&&e.addIssue({code:T.ZodIssueCode.custom,path:["repository"],message:`a ${t.kind} names no repository`});let n=S8e[t.kind].safeParse(t.value);if(!n.success)for(let i of n.error.issues)e.addIssue({code:T.ZodIssueCode.custom,path:["value"],message:i.message})}),T8e=T.object({name:T.string().regex(I8e,"must be a GitHub Actions secret name (A-Z, 0-9, _; not GITHUB_ or SKYRAMP_RUNNER_)"),purpose:T.nativeEnum(a0),required:T.boolean()}).strict(),XRt=T.object({knowledge:T.array(R8e).max(A8e),credentials:T.array(T8e).max(m8e)}).strict().superRefine((t,e)=>{let r=new Set;t.credentials.forEach((n,i)=>{r.has(n.name)&&e.addIssue({code:T.ZodIssueCode.custom,path:["credentials",i,"name"],message:"named twice"}),r.add(n.name)})});var eTt={model_provider:"model provider",sut_access:"SUT access",skyramp:"Skyramp",other:"other"};var N8e="https://testbot.skyramp.dev",ch={attemptId:"v3AttemptId",origin:"v3Origin",deadlineAt:"v3DeadlineAt",reportUploaded:"v3ReportUploaded",recipeUploaded:"v3RecipeUploaded",cause:"v3Cause"};var Q8e=3e4;function v8e(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(Q8e)});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 k8e(t,e){return{origin:t,idToken:e,mask:r=>Oi(r),log:r=>we(r)}}var DTt={cancelled:"Skyramp cancelled this run",expired:"this attempt passed its deadline in Skyramp",ended:"Skyramp already ended this attempt"},MTt={cancelled:"cancelled",expired:"timed_out",ended:"agent_failed"};var FTt={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"},LTt={analyze:"change analysis",recommend:"test recommendations",generate:"test generation",execute:"test execution",deliver:"opening a pull request with the tests"};var OTt={onboard:"onboard",deploy:"deploy"};async function Iue(){let t=di(ch.attemptId);if(!t)return;let e=di(ch.reportUploaded)==="true",r=di(ch.recipeUploaded)==="true",n=di(ch.deadlineAt),i=di(ch.cause)||void 0;!i&&!e&&!r&&n&&yue(new Date(n),new Date)<=0&&(i="timed_out");let s=v8e(process.env),o=await Eue({attemptId:t,reportUploaded:e,recipeUploaded:r,cause:i},k8e(di(ch.origin)||N8e,s));we(`Testbot V3: attempt ended; the run's outcome in Skyramp is ${o.outcome??"not final yet"}.`)}at();var p0=Ae(require("crypto"));function TU(t){return Buffer.from(t).toString("base64url")}function _8e(t){return t.replace(/\\r\\n/g,`
|
|
220
220
|
`).replace(/\\n/g,`
|
|
221
221
|
`).trim()}function P8e(t){return t.includes("-----BEGIN RSA PRIVATE KEY-----")}function D8e(t){return t.includes("-----BEGIN OPENSSH PRIVATE KEY-----")}function M8e(t){let e=t.split(`
|
|
222
222
|
`).map(r=>r.trim()).filter(r=>r&&!r.startsWith("-----")).join("");return Buffer.from(e,"base64")}function F8e(t){let e=_8e(t);if(D8e(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=P8e(e)?"pkcs1":"pkcs8";try{return p0.createPrivateKey({key:M8e(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 L8e(t,e,r=Date.now()){let n=Math.floor(r/1e3),i=TU(JSON.stringify({alg:"RS256",typ:"JWT"})),s=TU(JSON.stringify({iat:n-60,exp:n+540,iss:t})),o=`${i}.${s}`,a=F8e(e),c=p0.createSign("RSA-SHA256").update(o).sign(a);return`${o}.${TU(c)}`}var O8e=50,d0=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??O8e*6e4}async mint(){let e=this.scopeGeneration,r=this.now(),n=L8e(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()}};oy();async function Bue(){$ae(Hx(Qe("language")));try{await Iue()}catch(n){ve(`Testbot V3: could not end the attempt: ${n instanceof Error?n.message:String(n)}`)}try{let n=hU(),i=(lh.existsSync(n)?lh.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,AU),o=[...i,...lh.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,iue),d=new $f;o.length>0&&await d.uploadArtifact("skyramp-agent-logs",o,n);let f=[a,c,l,u].filter(m=>lh.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=tce(),i=await Vle(n),s=ja.resolve(n.workingDirectory);await Jle(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=pU(process.env.GITHUB_REPOSITORY??"");if(m){let E=new d0({appId:i,privateKey:s,owner:m.owner,repo:m.repo,repositories:[m.repo]});o=()=>E.getToken()}}if(!o)return;let a=mU(o);Kle(a);let c=parseInt(t,10),l=di("steps"),u=l?JSON.parse(l):[],d=a.getRunUrl(),f=Zle(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"&&Bue().catch(t=>{aN(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.
|
|
3
|
+
"version": "0.12.0-v3.18",
|
|
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.",
|