| 1 | import assert from "node:assert/strict"; |
| 2 | import { appliedOnce, definitelyNotAccepted, modelApplicationError, type ModelApplicationDetails } from "../lib/modelApplication"; |
| 3 | import { isUnknownSubmissionError } from "../lib/localSubmissionState"; |
| 4 | import { submitTurn } from "../lib/turnSubmit"; |
| 5 | import { followupNotSubmitted } from "../lib/pendingFollowup"; |
| 6 | import type { AppBindings } from "../lib/bridge"; |
| 7 | |
| 8 | const details:ModelApplicationDetails={code:"model_settings_pending",runtimeIdentity:"runtime-a",appliedRevision:"a",desiredRevision:"b",model:"p/m",blockingJobs:[],canUseApplied:true}; |
| 9 | const error=Object.assign(new Error("network settings could not apply"),{data:{submissionOutcome:"not_accepted",modelApplication:details}}); |
| 10 | assert.equal(modelApplicationError(error),details); |
| 11 | assert.equal(definitelyNotAccepted(error),true); |
| 12 | assert.equal(isUnknownSubmissionError(error),false,"structured outcome wins over English error text"); |
| 13 | assert.equal(isUnknownSubmissionError(Object.assign(new Error("settlement failed"),{data:{submissionOutcome:"unknown"}})),true); |
| 14 | assert.equal(followupNotSubmitted(Object.assign(new Error("reasonix_error:channel_read_only"), {data:{submissionOutcome:"unknown"}})), false, "structured uncertainty overrides legacy rejection text"); |
| 15 | const calls:unknown[]=[]; |
| 16 | const bindings={ |
| 17 | StartTurnWithModelApplication:async(...args:unknown[])=>{calls.push(args);return {turnId:"turn"};}, |
| 18 | SubmitInvocationsToTabWithID:async(...args:unknown[])=>{calls.push(args);return {turnId:"next"};}, |
| 19 | } as unknown as AppBindings; |
| 20 | const structured={input:"exact model input",display:"shown input",invocations:[],modelApplicationChoice:appliedOnce(details)}; |
| 21 | assert.deepEqual(await submitTurn(bindings,"tab","first","shown input","exact model input","",structured),[3,"turn"]); |
| 22 | const first=calls[0] as unknown[]; |
| 23 | assert.equal((first[2] as {input:string}).input,"exact model input"); |
| 24 | assert.equal((first[2] as Record<string,unknown>).modelApplicationChoice,undefined,"choice stays outside model input"); |
| 25 | assert.deepEqual(first[3],appliedOnce(details)); |
| 26 | await submitTurn(bindings,"tab","second","next","next","",{input:"next",display:"next",invocations:[]}); |
| 27 | assert.deepEqual(calls[1],["tab","next","next",[],"second"],"the next submit uses default latest admission"); |
| 28 | console.log("model application: structured rejection and submission-scoped choice passed"); |
| 29 |