From c6e819b5e5900b056372cfd235547a7b3c1d5a7c Mon Sep 17 00:00:00 2001 From: 732642856 <732642856@qq.com> Date: Fri, 26 Jun 2026 12:09:41 +0800 Subject: [PATCH] feat: expose chara dasha in frontend workbench --- jyotish-app/api-bridge.js | 5 +++++ jyotish-app/public/api-bridge.js | 5 +++++ jyotish-app/skill-map.js | 13 +++++++++++++ tests/test_frontend_productization.py | 3 +++ 4 files changed, 26 insertions(+) diff --git a/jyotish-app/api-bridge.js b/jyotish-app/api-bridge.js index e6fe9b50..c58d1320 100644 --- a/jyotish-app/api-bridge.js +++ b/jyotish-app/api-bridge.js @@ -144,6 +144,10 @@ async function computeDashaSystem(payload) { return postJson('/api/dasha', payload); } +async function computeCharaDasha(payload) { + return postJson('/api/dasha/chara', payload); +} + async function computeRemedies(payload) { return postJson('/api/remedies', payload); } @@ -434,6 +438,7 @@ window.JyotishAPI = { computePrashna, computeKP, computeDashaSystem, + computeCharaDasha, computeRemedies, computeSadeSati, computePanchaMahapurusha, diff --git a/jyotish-app/public/api-bridge.js b/jyotish-app/public/api-bridge.js index e6fe9b50..c58d1320 100644 --- a/jyotish-app/public/api-bridge.js +++ b/jyotish-app/public/api-bridge.js @@ -144,6 +144,10 @@ async function computeDashaSystem(payload) { return postJson('/api/dasha', payload); } +async function computeCharaDasha(payload) { + return postJson('/api/dasha/chara', payload); +} + async function computeRemedies(payload) { return postJson('/api/remedies', payload); } @@ -434,6 +438,7 @@ window.JyotishAPI = { computePrashna, computeKP, computeDashaSystem, + computeCharaDasha, computeRemedies, computeSadeSati, computePanchaMahapurusha, diff --git a/jyotish-app/skill-map.js b/jyotish-app/skill-map.js index c141eca6..63cfcaa0 100644 --- a/jyotish-app/skill-map.js +++ b/jyotish-app/skill-map.js @@ -55,6 +55,7 @@ const TECHNIQUE_API_ENDPOINTS = { synastry: '/api/synastry', ashtakoot: '/api/synastry', dasha: '/api/dasha', + 'chara-dasha': '/api/dasha/chara', remedies: '/api/remedies', sade_sati: '/api/sade_sati', pancha_mahapurusha: '/api/pancha_mahapurusha', @@ -96,6 +97,7 @@ const TECHNIQUE_COMMAND_ACTIONS = { sudarshana: 'sudarshana', 'nakshatra-full': 'nakshatra', jaimini: 'jaimini', + 'chara-dasha': 'charaDasha', ashtakavarga: 'ashtakavarga', shadbala: 'shadbala', yoga: 'yogas', @@ -272,6 +274,7 @@ function renderTechniqueWorkbench(container, context = {}) { ['sudarshana', 'Sudarshana', '三重Lagna'], ['nakshatra', 'Nakshatra+', '星宿深层'], ['jaimini', 'Jaimini', 'Karaka/Arudha'], + ['charaDasha', 'Chara Dasha', 'Jaimini 应期'], ['ashtakavarga', 'Ashtakavarga', 'SAV/BAV'], ['shadbala', 'Shadbala', '六重力量'], ['yogas', 'Yogas', '格局检测'], @@ -387,6 +390,13 @@ async function runTechniqueAction(action, context) { mode: 'all', }); } + if (action === 'charaDasha') { + return window.JyotishAPI.computeCharaDasha({ + ...base, + ...buildBirthPayload(context), + antardasha: true, + }); + } if (action === 'ashtakavarga') { return window.JyotishAPI.computeAshtakavarga(base); } @@ -1935,6 +1945,7 @@ function buildTechniqueExplorerPayload(action, context = {}) { if (action === 'bhava') return { ...base, ...buildBirthPayload(context), mode: 'compare', house_system: resolveBhavaHouseSystem(context) }; if (action === 'nakshatra') return { ...base, age: estimateAge(context) }; if (action === 'jaimini') return { ...base, ...buildBirthPayload(context), mode: 'all' }; + if (action === 'charaDasha') return { ...base, ...buildBirthPayload(context), antardasha: true }; if (action === 'shadbala') return { ...base, ...buildBirthPayload(context) }; if (action === 'yogas') return { ...base, current_dasha: chartData.dasha?.current_md || chartData.dasha_lord || '' }; if (action === 'dasha') return { ...base, ...buildBirthPayload(context), dasha: 'vimshottari' }; @@ -1992,6 +2003,7 @@ function actionForEndpoint(endpoint) { '/api/sudarshana': 'sudarshana', '/api/nakshatra_full': 'nakshatra', '/api/jaimini': 'jaimini', + '/api/dasha/chara': 'charaDasha', '/api/ashtakavarga': 'ashtakavarga', '/api/shadbala': 'shadbala', '/api/yogas': 'yogas', @@ -2025,6 +2037,7 @@ function endpointForAction(action) { sudarshana: '/api/sudarshana', nakshatra: '/api/nakshatra_full', jaimini: '/api/jaimini', + charaDasha: '/api/dasha/chara', ashtakavarga: '/api/ashtakavarga', shadbala: '/api/shadbala', yogas: '/api/yogas', diff --git a/tests/test_frontend_productization.py b/tests/test_frontend_productization.py index afa4a678..e81b4562 100644 --- a/tests/test_frontend_productization.py +++ b/tests/test_frontend_productization.py @@ -1222,6 +1222,7 @@ def test_api_bridge_exports_productized_backend_actions() -> None: "computeKP", "computePrashna", "computeSynastry", + "computeCharaDasha", "computeRemedies", "computeSadeSati", "computePanchaMahapurusha", @@ -2347,8 +2348,10 @@ def test_frontend_backend_contracts_with_api_handler() -> None: assert catalog["summary"]["technique_count"] == audit["registry"]["technique_count"] assert catalog["summary"]["runnable_count"] >= 20 assert "/api/ashtakavarga" in catalog["filters"]["api_endpoints"] + assert "/api/dasha/chara" in catalog["filters"]["api_endpoints"] assert "/api/thematic_report" in catalog["filters"]["api_endpoints"] assert catalog["example_payloads"]["/api/ashtakavarga"]["planets"] + assert catalog["example_payloads"]["/api/dasha/chara"]["antardasha"] is True assert catalog["example_payloads"]["/api/thematic_report"]["theme"] == "marriage" assert catalog["api_docs"]["/api/thematic_report"]["method"] == "POST" assert "curl -sS -X POST" in catalog["api_docs"]["/api/thematic_report"]["curl"]