diff --git a/tests/runner-e2e/chat-catalog-domains/external-secret-proposal.ts b/tests/runner-e2e/chat-catalog-domains/external-secret-proposal.ts index f0d819de229..41171ebeb2d 100644 --- a/tests/runner-e2e/chat-catalog-domains/external-secret-proposal.ts +++ b/tests/runner-e2e/chat-catalog-domains/external-secret-proposal.ts @@ -89,12 +89,19 @@ async function review(ctx:ChatCatalogContext,row:SecretProposalView,cardId:strin else{await card.getByRole("button",{name:"Reject",exact:true}).click();await expect(card.getByText("Why should this binding not be created?",{exact:true})).toBeVisible();await card.getByRole("textbox").fill("Do not grant this publishing binding yet.");await card.getByRole("button",{name:"Reject",exact:true}).click(secretProposalDecisionClickOptions(ctx));} await pollUntil({label:"human secret proposal decision",deadlineAt:chatCatalogNativePhaseDeadline(ctx,Date.now()+30000),intervalMs:500,load:()=>proposals(ctx),accept:rows=>rows.find(item=>item.id===row.id)?.status===(approve?"approved":"rejected")}); } +const SECRET_PROPOSAL_LEAD_TURNS=4; export const secretProposalExternalCases=[definition("secrets.secret-proposal",async ctx=>{ if(!ctx.input.privateSecrets)throw new Error("Secret proposal requires private synthetic-value ownership");const value=`synthetic-publishing-${randomBytes(32).toString("hex")}`;ctx.input.privateSecrets.push(value);privateValues.set(ctx,value); + // The journey takes four lead turns (request, rejection reply, repeated request, + // approval reply). The shared chat fixture allows three per day, which made the + // product correctly skip the approval continuation as heartbeat.daily_run_limit. + const leadPath=`/api/agents/${ctx.input.fixtures.agent.id}`,lead=await ctx.input.api.get<{runtimeConfig:{heartbeat?:Record;[key:string]:unknown}}>(leadPath); + await ctx.input.api.patch(leadPath,{runtimeConfig:{...lead.runtimeConfig,heartbeat:{...lead.runtimeConfig.heartbeat,maxDailyRuns:SECRET_PROPOSAL_LEAD_TURNS}}}); + if((await ctx.input.api.get(leadPath)).runtimeConfig.heartbeat?.maxDailyRuns!==SECRET_PROPOSAL_LEAD_TURNS)throw new Error("Secret proposal fixture requires its declared four-turn daily allowance"); const worker=await identityWorker(ctx,"Morgan"),secret=await ctx.input.api.postSensitive(`${root(ctx)}/secrets`,{name:"Deployment publishing key",key:"deployment-publishing",provider:"local_encrypted",value}); try{const source=await openStandingChat(ctx),session=await ctx.input.api.get<{user:{id:string}}>("/api/auth/get-session");if(!session.user.id||session.user.id==="local-board")throw new Error("Actual authorized human review identity is required");await ctx.input.api.patch(`/api/issues/${source.id}`,{description:`The publishing credential already exists as company secret ${secret.id}, Deployment publishing key. Morgan (${worker.id}) needs the environment reference PUBLISHING_API_KEY to publish the site. No value is supplied in chat and no binding exists yet.`});return {companyId:ctx.input.fixtures.company.id,leadId:ctx.input.fixtures.agent.id,morganId:worker.id,secretId:secret.id,secretBefore:secret,sourceId:source.id,personId:session.user.id,originalQuery:ctx.scenario.query};}catch(error){await ctx.input.api.delete(`/api/secrets/${secret.id}`,{allowNotFound:true});privateValues.delete(ctx);throw error;} },gradeSecretProposal,{ - oracleVersion: "paperclip.chat-catalog.external.v8", authentication:"human-session",expectedRunCount:4,minimumRunCount:4,expectedHumanMessageCount:4,attemptTimeoutMs:840000, + oracleVersion: "paperclip.chat-catalog.external.v8", authentication:"human-session",expectedRunCount:SECRET_PROPOSAL_LEAD_TURNS,minimumRunCount:SECRET_PROPOSAL_LEAD_TURNS,expectedHumanMessageCount:4,attemptTimeoutMs:840000, sourceFiles:["chat-catalog-domains/external-secret-proposal.ts","chat-catalog-domains/external-secret-scan.ts","chat-catalog-domains/external-credential-language.ts","chat-catalog-domains/identity-support.ts","chat-catalog-domains/external-support.ts","chat-catalog-domains/internal-support.ts","chat-flow.ts","run-observations.ts","../../server/src/routes/secrets.ts","../../server/src/services/secret-proposals.ts","../../server/src/services/secret-proposal-notifications.ts","chat-scenarios/secrets.yaml"], async act(ctx,state){ const initial=await settled(ctx,1),pending=(await proposals(ctx)).filter(row=>row.status==="pending");if(pending.length!==1||!requested(pending[0]!,state,ctx.issue()!.id)||pending[0]!.originRunId!==initial[0]!.id)throw new Error("Actual model must request exactly the intended reference binding before human review");