diff --git a/frontend/src/app/api/synastry/route.ts b/frontend/src/app/api/synastry/route.ts index 4c4ae891..c4cfdf8c 100644 --- a/frontend/src/app/api/synastry/route.ts +++ b/frontend/src/app/api/synastry/route.ts @@ -42,6 +42,32 @@ function moonLongitude(chart: Record) { return numeric; } +function moonSummary(chart: Record) { + const planets = chart.planets && typeof chart.planets === "object" ? chart.planets as Record : {}; + const moon = planets.Moon && typeof planets.Moon === "object" ? planets.Moon as Record : {}; + return { + sign: moon.sign, + nakshatra: moon.nakshatra, + pada: moon.nakshatra_pada, + lord: moon.nakshatra_lord, + longitude: moonLongitude(chart), + }; +} + +function d9Summary(varga: Record) { + const result = varga.result && typeof varga.result === "object" ? varga.result as Record : {}; + const d9 = result.D9_Navamsa && typeof result.D9_Navamsa === "object" ? result.D9_Navamsa as Record : {}; + const ascendant = d9.ascendant && typeof d9.ascendant === "object" ? d9.ascendant as Record : {}; + const planets = d9.planets && typeof d9.planets === "object" ? d9.planets as Record : {}; + return { + ascendant, + moon: planets.Moon, + venus: planets.Venus, + mars: planets.Mars, + source: varga.source, + }; +} + async function postPython(path: string, body: unknown) { const response = await fetch(`${apiBase}${path}`, { method: "POST", @@ -64,15 +90,28 @@ export async function POST(request: Request) { } const selfChart = await postPython("/api/chart", birthPayload(body.selfProfile)); const partnerChart = await postPython("/api/chart", birthPayload(body.partnerProfile)); + const selfD9 = await postPython("/api/varga_full", { + ...birthPayload(body.selfProfile), + planets: selfChart.planets, + ascendant: selfChart.ascendant, + divisions: ["D9"], + }); + const partnerD9 = await postPython("/api/varga_full", { + ...birthPayload(body.partnerProfile), + planets: partnerChart.planets, + ascendant: partnerChart.ascendant, + divisions: ["D9"], + }); const synastry = await postPython("/api/synastry", { male_moon: moonLongitude(selfChart), female_moon: moonLongitude(partnerChart), }); return NextResponse.json({ status: "ok", - method: "ashtakoot_from_computed_moon", - selfChart: { moon: moonLongitude(selfChart) }, - partnerChart: { moon: moonLongitude(partnerChart) }, + method: "ashtakoot_plus_moon_nakshatra_d9", + evidenceLayers: ["ashtakoot", "moon_nakshatra", "d9_navamsa"], + selfChart: { moon: moonSummary(selfChart), d9: d9Summary(selfD9) }, + partnerChart: { moon: moonSummary(partnerChart), d9: d9Summary(partnerD9) }, synastry, }); } catch (error) { diff --git a/frontend/src/app/page.tsx b/frontend/src/app/page.tsx index 7cb0f21a..0999b3ec 100644 --- a/frontend/src/app/page.tsx +++ b/frontend/src/app/page.tsx @@ -1256,15 +1256,16 @@ export default function Home() { headers: { "Content-Type": "application/json" }, body: JSON.stringify({ selfProfile: profile, partnerProfile: record.profile }), }); - const payload = await response.json().catch(() => null) as { status?: string; synastry?: { total_score?: number; max_score?: number; assessment?: string } } | null; + const payload = await response.json().catch(() => null) as { status?: string; evidenceLayers?: string[]; synastry?: { total_score?: number; max_score?: number; assessment?: string } } | null; if (response.ok && payload?.status === "ok") { const score = payload.synastry?.total_score; const max = payload.synastry?.max_score; const assessment = payload.synastry?.assessment; + const layers = (payload.evidenceLayers || []).join(" / ") || "Ashtakoot / Moon / D9"; chooseSuggestedQuestion([ baseQuestion, "", - `已计算基础合盘证据:Ashtakoot ${score ?? "?"}/${max ?? "?"},初步评级:${assessment || "待解释"}。请基于这个证据包继续分析。`, + `已计算基础合盘证据:${layers};Ashtakoot ${score ?? "?"}/${max ?? "?"},初步评级:${assessment || "待解释"}。请基于这个证据包继续分析。`, ].join("\n"), "marriage"); } else { chooseSuggestedQuestion(baseQuestion, "marriage"); diff --git a/tests/test_supabase_user_data_contract.py b/tests/test_supabase_user_data_contract.py index 5c051a4b..0ae206d6 100644 --- a/tests/test_supabase_user_data_contract.py +++ b/tests/test_supabase_user_data_contract.py @@ -163,9 +163,13 @@ def test_synastry_route_orchestrates_python_chart_and_ashtakoot() -> None: 'const apiBase = process.env.JYOTISH_API_BASE ?? "http://127.0.0.1:5200"', 'postPython("/api/chart", birthPayload(body.selfProfile))', 'postPython("/api/chart", birthPayload(body.partnerProfile))', + 'postPython("/api/varga_full"', 'postPython("/api/synastry"', "moonLongitude(selfChart)", - "ashtakoot_from_computed_moon", + "moonSummary(selfChart)", + "d9Summary(selfD9)", + "ashtakoot_plus_moon_nakshatra_d9", + 'evidenceLayers: ["ashtakoot", "moon_nakshatra", "d9_navamsa"]', 'status: "blocked"', ): assert token in route