/** * A verified route context for calling the branch handlers split out of * POST /api/rectification/agent (TASK-rectification-code-split-20260926) * directly, with a recording persistence client instead of Supabase. */ import type { RectificationAgentRequest, RectificationAgentRouteContext, } from "../src/lib/rectification-agentic/v9/agent-route-support.ts"; export const ROUTE_CASE_ID = "44444444-4444-4444-8444-444444444444"; export const ROUTE_SESSION_ID = "33333333-3333-4333-8333-333333333333"; export const ROUTE_REQUEST_ID = "55555555-5555-4555-8555-555555555555"; export const ROUTE_TURN_ID = "66666666-6666-4666-8666-666666666666"; export type RecordedRpc = Readonly<{ fn: string; args: Record }>; export function routeContextFixture( data: Partial, rpcData: (fn: string) => unknown = () => ({ turn_id: ROUTE_TURN_ID, idempotent: false }), ) { const rpcCalls: RecordedRpc[] = []; const accounting = { rpc: async (fn: string, args: Record = {}) => { rpcCalls.push({ fn, args }); return { data: rpcData(fn), error: null }; }, from: () => { throw new Error("no table access expected"); }, }; const request: RectificationAgentRequest = { caseId: ROUTE_CASE_ID, sessionId: ROUTE_SESSION_ID, requestId: ROUTE_REQUEST_ID, action: "message", ...data, }; const context = { request: new Request("https://staging.jyotisha.chat/api/rectification/agent", { method: "POST" }), turnStartedAt: Date.now(), supabase: {}, accounting, userId: "77777777-7777-4777-8777-777777777777", parsed: { data: request }, caseId: request.caseId, sessionId: request.sessionId, requestId: request.requestId, action: request.action, isStructuredChoice: request.action === "answer_choice" || request.action === "stop_and_review" || request.action === "skip_probe", caseStatus: "collecting_evidence", skillVersion: "", chatSession: { id: request.sessionId, session_type: "birth_time_rectification", model_id: "model-a", model_config_version: 1, agentic_rectification_case_id: request.caseId, }, } as unknown as RectificationAgentRouteContext; return { context, rpcCalls }; } export async function ndjsonEvents(response: Response): Promise>> { return (await response.text()) .split("\n") .filter((line) => line.trim()) .map((line) => JSON.parse(line) as Record); }