@openephemeris/mcp-server 3.13.9 → 3.13.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/README.md +2 -2
  2. package/config/dev-allowlist.json +28 -4
  3. package/dist/index.js +45 -0
  4. package/dist/oauth/dcr.d.ts +11 -0
  5. package/dist/oauth/dcr.js +49 -0
  6. package/dist/oauth/discovery.d.ts +11 -0
  7. package/dist/oauth/discovery.js +40 -0
  8. package/dist/oauth/pkce.d.ts +18 -0
  9. package/dist/oauth/pkce.js +34 -0
  10. package/dist/oauth/rate-limit.d.ts +20 -0
  11. package/dist/oauth/rate-limit.js +65 -0
  12. package/dist/oauth/store.d.ts +68 -0
  13. package/dist/oauth/store.js +247 -0
  14. package/dist/oauth/supabase-jwt.d.ts +39 -0
  15. package/dist/oauth/supabase-jwt.js +194 -0
  16. package/dist/oauth/token.d.ts +21 -0
  17. package/dist/oauth/token.js +213 -0
  18. package/dist/prompts.js +171 -159
  19. package/dist/server-sse.js +134 -36
  20. package/dist/tools/apps/bazi-app.d.ts +23 -0
  21. package/dist/tools/apps/bazi-app.js +224 -0
  22. package/dist/tools/apps/bi-wheel-app.d.ts +14 -7
  23. package/dist/tools/apps/bi-wheel-app.js +293 -108
  24. package/dist/tools/apps/bodygraph-app.js +38 -3
  25. package/dist/tools/apps/moon-phase-app.d.ts +19 -0
  26. package/dist/tools/apps/moon-phase-app.js +190 -0
  27. package/dist/tools/apps/transit-timeline-app.d.ts +20 -0
  28. package/dist/tools/apps/transit-timeline-app.js +243 -0
  29. package/dist/tools/apps/vedic-chart-app.d.ts +17 -0
  30. package/dist/tools/apps/vedic-chart-app.js +226 -0
  31. package/dist/tools/index.js +4 -0
  32. package/dist/tools/specialized/acg.js +2 -2
  33. package/dist/tools/specialized/bazi.js +367 -44
  34. package/dist/tools/specialized/bi_wheel.js +1 -1
  35. package/dist/tools/specialized/chart_wheel.js +1 -1
  36. package/dist/tools/specialized/comparative.js +4 -4
  37. package/dist/tools/specialized/eclipse.js +1 -1
  38. package/dist/tools/specialized/electional.js +4 -4
  39. package/dist/tools/specialized/ephemeris_core.js +2 -2
  40. package/dist/tools/specialized/ephemeris_extended.js +8 -8
  41. package/dist/tools/specialized/hd_bodygraph.js +1 -1
  42. package/dist/tools/specialized/hd_cycles.js +2 -2
  43. package/dist/tools/specialized/hd_group.js +2 -2
  44. package/dist/tools/specialized/human_design.js +1 -1
  45. package/dist/tools/specialized/moon.js +2 -2
  46. package/dist/tools/specialized/natal.js +1 -1
  47. package/dist/tools/specialized/progressed.js +1 -1
  48. package/dist/tools/specialized/relocation.js +1 -1
  49. package/dist/tools/specialized/returns.js +3 -3
  50. package/dist/tools/specialized/synastry.js +1 -1
  51. package/dist/tools/specialized/transits.js +1 -1
  52. package/dist/tools/specialized/vedic.js +1 -1
  53. package/dist/tools/specialized/venus_star_points.js +6 -6
  54. package/dist/ui/bazi.html +213 -0
  55. package/dist/ui/bi-wheel.html +762 -489
  56. package/dist/ui/bodygraph.html +1788 -1649
  57. package/dist/ui/chart-wheel.html +1772 -1593
  58. package/dist/ui/moon-phase.html +6758 -0
  59. package/dist/ui/transit-timeline.html +6835 -0
  60. package/dist/ui/vedic-chart.html +210 -0
  61. package/package.json +2 -2
@@ -0,0 +1,210 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <meta name="color-scheme" content="dark light" />
7
+ <title>Vedic Jyotish Chart</title>
8
+
9
+
10
+ <style>*,:before,:after{box-sizing:border-box;margin:0;padding:0}:root{--bg-primary:#05070c;--bg-secondary:#0d1219;--bg-tertiary:#171d26;--bg-hover:#222935;--border:#2c333e;--border-subtle:#1b1f27;--text-primary:#e1e5eb;--text-secondary:#979fab;--text-muted:#646972;--gold:#eaab05;--gold-dim:#aa7e1a;--gold-glow:rgba(234,171,5,.25);--gold-subtle:rgba(234,171,5,.08);--planet-sun:#ffa837;--planet-moon:#a1cae8;--planet-mercury:#6ec272;--planet-venus:#f18ac1;--planet-mars:#fc5855;--planet-jupiter:#eaab05;--planet-saturn:#8fa6cb;--planet-rahu:#8186d7;--planet-ketu:#da8659;--dignity-exalted:#eaab05;--dignity-debilitated:#f3625d;--dignity-own:#6ec272;--radius:6px;--radius-sm:3px;--radius-lg:10px;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}@supports (color:color(display-p3 0 0 0)){:root{--bg-primary:color(display-p3 .0216652 .0286234 .0452973);--bg-secondary:color(display-p3 .0560261 .0691379 .0946654);--bg-tertiary:color(display-p3 .096217 .113655 .147573);--bg-hover:color(display-p3 .137776 .160653 .2052);--border:color(display-p3 .178937 .199903 .240355);--border-subtle:color(display-p3 .108709 .122909 .150282);--text-primary:color(display-p3 .883958 .896627 .920543);--text-secondary:color(display-p3 .598684 .622198 .66685);--text-muted:color(display-p3 .39567 .412041 .443131);--gold:color(display-p3 .879508 .6816 .234703);--gold-dim:color(display-p3 .639817 .500341 .194357);--gold-glow:color(display-p3 .879508 .6816 .234703/.25);--gold-subtle:color(display-p3 .879508 .6816 .234703/.08);--planet-sun:color(display-p3 .979154 .659227 .21215);--planet-moon:color(display-p3 .664971 .787746 .896611);--planet-mercury:color(display-p3 .509102 .751692 .477144);--planet-venus:color(display-p3 .89124 .561977 .746576);--planet-mars:color(display-p3 .913707 .390639 .360361);--planet-jupiter:color(display-p3 .879508 .6816 .234703);--planet-saturn:color(display-p3 .57766 .647332 .78263);--planet-rahu:color(display-p3 .510127 .524428 .81989);--planet-ketu:color(display-p3 .810621 .541171 .382256);--dignity-exalted:color(display-p3 .879508 .6816 .234703);--dignity-debilitated:color(display-p3 .885816 .42028 .386667);--dignity-own:color(display-p3 .509102 .751692 .477144)}}@supports (color:lab(0% 0 0)){:root{--bg-primary:lab(1.96267% -.122614 -2.00764);--bg-secondary:lab(5.21286% -.326827 -5.10724);--bg-tertiary:lab(10.5893% -.558816 -7.26317);--bg-hover:lab(16.3655% -.679582 -9.07274);--border:lab(21.0274% -.743657 -8.03484);--border-subtle:lab(11.7732% -.55144 -5.84751);--text-primary:lab(90.6878% -.517368 -3.73452);--text-secondary:lab(65.1297% -.927329 -7.41251);--text-muted:lab(44.2672% -.694215 -5.55873);--gold:lab(74.5441% 15.4997 76.437);--gold-dim:lab(55.9871% 11.3091 55.5836);--gold-glow:lab(74.5441% 15.4997 76.437/.25);--gold-subtle:lab(74.5441% 15.4997 76.437/.08);--planet-sun:lab(76.3024% 31.6825 83.6057);--planet-moon:lab(79.1643% -8.79321 -19.3308);--planet-mercury:lab(71.5613% -39.2213 32.0347);--planet-venus:lab(70.2618% 44.9914 -10.5022);--planet-mars:lab(60.882% 63.057 37.6481);--planet-jupiter:lab(74.5441% 15.4997 76.437);--planet-saturn:lab(67.2517% -1.74686 -21.8131);--planet-rahu:lab(58.1033% 13.5385 -42.6181);--planet-ketu:lab(64.4827% 30.1677 38.2587);--dignity-exalted:lab(74.5441% 15.4997 76.437);--dignity-debilitated:lab(61.0965% 56.6147 33.1618);--dignity-own:lab(71.5613% -39.2213 32.0347)}}@media (prefers-color-scheme:light){:root{--bg-primary:#f3f5f8;--bg-secondary:#e5e8ed;--bg-tertiary:#d3d8e0;--bg-hover:#c4cbd7;--border:#b1b8c3;--border-subtle:#ccd1d9;--text-primary:#0b0d12;--text-secondary:#3d434c;--text-muted:#646971;--gold:#896100;--gold-dim:#6f4b00;--gold-glow:rgba(137,97,0,.2);--gold-subtle:rgba(137,97,0,.07);--planet-sun:#a45f00;--planet-moon:#1b5274;--planet-mercury:#006c15;--planet-venus:#a03273;--planet-mars:#bd001b;--planet-jupiter:#896100;--planet-saturn:#3f5374;--planet-rahu:#413e96;--planet-ketu:#964100;--dignity-exalted:#896100;--dignity-debilitated:#bd001b;--dignity-own:#006c15;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}@supports (color:color(display-p3 0 0 0)){:root{--bg-primary:color(display-p3 .955887 .961034 .970732);--bg-secondary:color(display-p3 .899196 .909367 .928554);--bg-tertiary:color(display-p3 .8304 .845419 .873798);--bg-hover:color(display-p3 .772896 .795102 .837167);--border:color(display-p3 .698201 .719987 .761278);--border-subtle:color(display-p3 .805005 .819937 .848152);--text-primary:color(display-p3 .0441372 .0521689 .0676233);--text-secondary:color(display-p3 .242812 .260856 .295362);--text-muted:color(display-p3 .396691 .411981 .440999);--gold:color(display-p3 .57038 .356834 -.203198);--gold-dim:color(display-p3 .442672 .285282 -.134595);--gold-glow:color(display-p3 .57038 .356834 -.203198/.2);--gold-subtle:color(display-p3 .57038 .356834 -.203198/.07);--planet-sun:color(display-p3 .652927 .351579 -.183632);--planet-moon:color(display-p3 .168375 .317534 .44376);--planet-mercury:color(display-p3 .148908 .420483 .120432);--planet-venus:color(display-p3 .579328 .227384 .442243);--planet-mars:color(display-p3 .694209 .0659429 .120262);--planet-jupiter:color(display-p3 .57038 .356834 -.203198);--planet-saturn:color(display-p3 .262684 .323159 .443709);--planet-rahu:color(display-p3 .254224 .245063 .569023);--planet-ketu:color(display-p3 .557919 .263616 .052663);--dignity-exalted:color(display-p3 .57038 .356834 -.203198);--dignity-debilitated:color(display-p3 .694209 .0659429 .120262);--dignity-own:color(display-p3 .148908 .420483 .120432)}}@supports (color:lab(0% 0 0)){:root{--bg-primary:lab(96.5076% -.214994 -1.49846);--bg-secondary:lab(91.8546% -.419319 -2.9907);--bg-tertiary:lab(86.0409% -.610828 -4.47587);--bg-hover:lab(81.3789% -.873804 -6.69111);--border:lab(74.4184% -.864774 -6.68644);--border-subtle:lab(83.7208% -.609636 -4.47524);--text-primary:lab(3.67543% -.212148 -2.43837);--text-secondary:lab(28.0109% -.729963 -6.62285);--text-muted:lab(44.2712% -.656128 -5.19227);--gold:lab(44.0736% 22.5353 118.781);--gold-dim:lab(34.8944% 16.8155 79.322);--gold-glow:lab(44.0736% 22.5353 118.781/.2);--gold-subtle:lab(44.0736% 22.5353 118.781/.07);--planet-sun:lab(47.0942% 34.9095 115.734);--planet-moon:lab(32.6468% -8.89629 -25.0579);--planet-mercury:lab(39.2064% -45.2416 40.6297);--planet-venus:lab(39.8088% 50.4598 -11.9132);--planet-mars:lab(39.7145% 70.0599 49.6254);--planet-jupiter:lab(44.0736% 22.5353 118.781);--planet-saturn:lab(34.713% -.692427 -21.5121);--planet-rahu:lab(30.7426% 21.8588 -48.9882);--planet-ketu:lab(38.7083% 37.2573 56.6234);--dignity-exalted:lab(44.0736% 22.5353 118.781);--dignity-debilitated:lab(39.7145% 70.0599 49.6254);--dignity-own:lab(39.2064% -45.2416 40.6297)}}}html,body{background:var(--bg-primary);width:100%;height:100%;color:var(--text-primary);font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;line-height:1.5;overflow:hidden}body{flex-direction:column;display:flex}#app{flex-direction:column;flex:1;display:flex;overflow:hidden}#loading-state{color:var(--text-secondary);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:12px;display:flex}#loading-state[hidden]{display:none}.oe-loader{width:48px;height:48px;animation:1.4s linear infinite spin}.oe-loader circle{fill:none;stroke:var(--gold);stroke-width:3px;stroke-dasharray:200;stroke-dashoffset:80px;stroke-linecap:round}@keyframes spin{to{transform:rotate(360deg)}}.chart-status{background:var(--bg-secondary);border-top:1px solid var(--border-subtle);color:var(--text-muted);opacity:0;z-index:50;padding:6px 14px;font-size:11px;transition:opacity .2s,transform .2s;position:fixed;bottom:0;left:0;right:0;transform:translateY(100%)}.chart-status.visible{opacity:1;transform:translateY(0)}#vedic-container{flex-direction:column;flex:1;align-items:center;gap:12px;padding:12px;display:flex;overflow-y:auto}#vedic-container[hidden]{display:none}.vedic-header{justify-content:space-between;align-items:center;gap:8px;width:100%;max-width:540px;animation:.5s ease-out vedic-fade-in;display:flex}.vedic-title{text-transform:uppercase;letter-spacing:.08em;color:var(--text-muted);font-size:12px;font-weight:700}.vedic-header-meta{align-items:center;gap:8px;display:flex}.vedic-ayanamsa-badge{border-radius:var(--radius-sm);background:var(--bg-tertiary);border:1px solid var(--border-subtle);color:var(--text-secondary);font-variant-numeric:tabular-nums;padding:2px 8px;font-size:10px;font-weight:600}.vedic-toggle-btn{border-radius:var(--radius-sm);border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-secondary);cursor:pointer;padding:3px 8px;font-size:10px;font-weight:600;transition:background .15s,color .15s}.vedic-toggle-btn:hover{background:var(--bg-hover);color:var(--text-primary)}.vedic-toggle-btn.active{border-color:var(--gold-dim);color:var(--gold);background:var(--gold-subtle)}.rashi-grid{aspect-ratio:1;border:1px solid var(--border);border-radius:var(--radius);width:min(100%,540px);box-shadow:0 0 0 1px var(--border-subtle), 0 4px 32px rgba(0,0,0,.3);grid-template-rows:repeat(4,1fr);grid-template-columns:repeat(4,1fr);animation:.6s ease-out vedic-fade-in;display:grid;overflow:hidden}@supports (color:color(display-p3 0 0 0)){.rashi-grid{box-shadow:0 0 0 1px var(--border-subtle), 0 4px 32px color(display-p3 0 0 0/.3)}}@supports (color:lab(0% 0 0)){.rashi-grid{box-shadow:0 0 0 1px var(--border-subtle), 0 4px 32px lab(0% 0 0/.3)}}@keyframes vedic-fade-in{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}.rashi-cell{background:var(--bg-secondary);border:1px solid var(--border-subtle);cursor:pointer;flex-direction:column;min-width:0;min-height:0;padding:4px 5px;transition:background .12s,box-shadow .12s;display:flex;position:relative;overflow:hidden}.rashi-cell.occupied:hover{background:var(--bg-hover);box-shadow:inset 0 0 0 1px var(--gold-glow), 0 0 12px var(--gold-glow);z-index:2}.rashi-cell.lagna{border-color:var(--gold-dim);background:#110d05;background:color(display-p3 .0641956 .0497811 .0230015);background:lab(3.71843% .818238 3.47664)}.rashi-cell.lagna:hover{box-shadow:inset 0 0 0 1px var(--gold), 0 0 18px var(--gold-glow)}.rashi-cell.center{background:var(--bg-primary);border-color:var(--border-subtle);cursor:default;text-align:center;justify-content:center;align-items:center;gap:2px}.rashi-cell.center:hover{background:var(--bg-primary);box-shadow:none}.cell-sign{text-transform:uppercase;letter-spacing:.05em;color:var(--text-muted);white-space:nowrap;text-overflow:ellipsis;flex-shrink:0;font-size:9px;font-weight:700;line-height:1.2;overflow:hidden}.cell-sign-devanagari{color:var(--text-muted);flex-shrink:0;font-family:Noto Sans Devanagari,Mangal,sans-serif;font-size:10px;line-height:1.2;display:none}#vedic-container.show-devanagari .cell-sign-devanagari{display:block}#vedic-container.show-devanagari .cell-sign{display:none}.cell-top-row{flex-shrink:0;justify-content:space-between;align-items:baseline;gap:2px;min-width:0;display:flex}.cell-house-num{color:var(--text-muted);opacity:.5;font-variant-numeric:tabular-nums;flex-shrink:0;font-size:8px;font-weight:700;line-height:1}.rashi-cell.lagna .cell-house-num{color:var(--gold-dim);opacity:1}.cell-planets{flex-wrap:wrap;gap:2px;min-height:0;margin-top:auto;padding-top:2px;display:flex;overflow:hidden}.planet-badge{white-space:nowrap;font-variant-numeric:tabular-nums;background:rgba(0,0,0,.2);background:color(display-p3 0 0 0/.2);background:lab(0% 0 0/.2);border-radius:2px;padding:1px 3px;font-size:10px;font-weight:700;line-height:1}.planet-badge[data-planet=sun]{color:var(--planet-sun)}.planet-badge[data-planet=moon]{color:var(--planet-moon)}.planet-badge[data-planet=mercury]{color:var(--planet-mercury)}.planet-badge[data-planet=venus]{color:var(--planet-venus)}.planet-badge[data-planet=mars]{color:var(--planet-mars)}.planet-badge[data-planet=jupiter]{color:var(--planet-jupiter)}.planet-badge[data-planet=saturn]{color:var(--planet-saturn)}.planet-badge[data-planet=rahu]{color:var(--planet-rahu)}.planet-badge[data-planet=ketu]{color:var(--planet-ketu)}.planet-badge .retro{opacity:.75;font-size:8px}.planet-badge .dignity-ex{color:var(--dignity-exalted);font-size:7px}.planet-badge .dignity-db{color:var(--dignity-debilitated);font-size:7px}@media (max-width:420px){.planet-label-full{display:none}.planet-label-short{display:inline}}@media (min-width:421px){.planet-label-full{display:inline}.planet-label-short{display:none}}.lagna-diagonal{pointer-events:none;width:100%;height:100%;position:absolute;top:0;left:0}.lagna-diagonal line{stroke:var(--gold);stroke-width:1.5px;stroke-linecap:round;opacity:.7}.center-label{text-transform:uppercase;letter-spacing:.07em;color:var(--text-muted);font-size:9px;font-weight:700}.center-ayanamsa{color:var(--gold-dim);font-family:JetBrains Mono,Fira Mono,ui-monospace,monospace;font-size:10px;font-weight:600}.center-lagna{color:var(--text-secondary);font-family:Noto Sans Devanagari,Mangal,sans-serif;font-size:11px;font-weight:700}.vedic-legend{flex-wrap:wrap;justify-content:center;gap:6px 12px;width:100%;max-width:540px;animation:.8s ease-out .2s both vedic-fade-in;display:flex}.legend-item{color:var(--text-muted);align-items:center;gap:4px;font-size:10px;display:flex}.legend-dot{border-radius:50%;flex-shrink:0;width:7px;height:7px}.vedic-actions{flex-wrap:wrap;gap:6px;width:100%;max-width:540px;animation:.8s ease-out .3s both vedic-fade-in;display:flex}.action-btn{border-radius:var(--radius);border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-secondary);cursor:pointer;align-items:center;gap:4px;padding:7px 12px;font-size:11px;font-weight:600;transition:background .15s,color .15s,box-shadow .15s;display:inline-flex}.action-btn:hover{background:var(--bg-hover);color:var(--text-primary)}.action-btn--primary{color:#cbdfff;color:color(display-p3 .811259 .873257 .992208);color:lab(88.2011% -1.89927 -18.3428);background:linear-gradient(135deg,#1d4587,#32326d);background:linear-gradient(135deg,color(display-p3 .153533 .2659 .511983),color(display-p3 .195291 .194916 .412031));background:linear-gradient(135deg,lab(29.3399% 5.63866 -42.0206),lab(23.3003% 14.2058 -35.0966));border-color:#33548c;border-color:color(display-p3 .229049 .327581 .533696);border-color:lab(35.4848% 1.84765 -35.3079)}.action-btn--primary:hover{background:linear-gradient(135deg,#2151a1,#3d3c86);background:linear-gradient(135deg,color(display-p3 .180134 .31482 .611657),color(display-p3 .239239 .236673 .50744));background:linear-gradient(135deg,lab(34.9279% 7.15981 -48.9835),lab(28.8006% 17.5515 -42.0715));box-shadow:0 2px 12px rgba(29,69,135,.3);box-shadow:0 2px 12px color(display-p3 .153533 .2659 .511983/.3);box-shadow:0 2px 12px lab(29.3399% 5.63866 -42.0206/.3)}.vedic-drawer-overlay{z-index:60;opacity:0;background:rgba(0,0,0,.45);background:color(display-p3 0 0 0/.45);background:lab(0% 0 0/.45);transition:opacity .2s;position:fixed;top:0;bottom:0;left:0;right:0}.vedic-drawer-overlay.visible{opacity:1}.vedic-drawer{background:var(--bg-secondary);border-top:1px solid var(--border);border-radius:var(--radius-lg) var(--radius-lg) 0 0;z-index:61;max-height:65vh;padding:16px;transition:transform .25s ease-out;position:fixed;bottom:0;left:0;right:0;overflow-y:auto;transform:translateY(100%)}.vedic-drawer.visible{transform:translateY(0)}.drawer-handle{background:var(--border);border-radius:2px;width:36px;height:4px;margin:0 auto 14px}.drawer-sign-title{align-items:center;gap:8px;margin-bottom:4px;font-size:16px;font-weight:700;display:flex}.drawer-sign-devanagari{color:var(--text-secondary);font-family:Noto Sans Devanagari,Mangal,sans-serif;font-size:14px;font-weight:400}.drawer-sign-element{border-radius:var(--radius-sm);background:var(--bg-tertiary);color:var(--text-muted);text-transform:uppercase;letter-spacing:.05em;padding:2px 7px;font-size:10px;font-weight:600}.drawer-section{margin-top:14px}.drawer-section-title{text-transform:uppercase;letter-spacing:.07em;color:var(--text-muted);margin-bottom:8px;font-size:10px;font-weight:700}.drawer-planet-row{background:var(--bg-tertiary);border-radius:var(--radius-sm);align-items:flex-start;gap:10px;margin-bottom:5px;padding:8px 10px;display:flex}.drawer-planet-abbr{min-width:22px;font-size:14px;font-weight:700}.drawer-planet-info{flex-direction:column;flex:1;gap:1px;display:flex}.drawer-planet-name{color:var(--text-primary);font-size:12px;font-weight:600}.drawer-planet-meta{color:var(--text-secondary);font-size:11px}.drawer-planet-nakshatra{color:var(--text-muted);font-size:10px}.drawer-planet-dignity{border-radius:10px;align-self:center;margin-left:auto;padding:1px 5px;font-size:9px;font-weight:700}.drawer-planet-dignity.exalted{background:var(--gold-subtle);color:var(--gold)}.drawer-planet-dignity.debilitated{color:var(--planet-mars);background:rgba(243,98,93,.12);background:color(display-p3 .885816 .42028 .386667/.12);background:lab(61.0965% 56.6147 33.1618/.12)}.drawer-planet-dignity.own{color:var(--planet-mercury);background:rgba(110,194,114,.1);background:color(display-p3 .509102 .751692 .477144/.1);background:lab(71.5613% -39.2213 32.0347/.1)}.error-state,.empty-state{text-align:center;flex-direction:column;flex:1;justify-content:center;align-items:center;gap:8px;padding:32px;display:flex}.error-icon,.empty-icon{font-size:32px}.tooltip{z-index:100;border-radius:var(--radius-sm);background:var(--bg-tertiary);border:1px solid var(--border);color:var(--text-primary);pointer-events:none;opacity:0;white-space:pre-line;max-width:220px;padding:5px 9px;font-size:11px;transition:opacity .15s;position:fixed}.tooltip.visible{opacity:1}@media (max-width:360px){.cell-sign{font-size:7px}.planet-badge{padding:1px 2px;font-size:8px}#vedic-container{gap:8px;padding:8px}.vedic-legend{display:none}}@media (max-width:420px){.cell-sign{font-size:8px}.center-ayanamsa{font-size:9px}}.chart-layer{opacity:0;transform-origin:310px 310px;will-change:opacity, transform;transform:scale(.98)translateZ(0)}#chart-container.chart-visible .chart-layer{animation:.6s cubic-bezier(.16,1,.3,1) forwards svgLayerAssemble;animation-delay:calc(var(--layer-index,1) * .1s + .1s)}@keyframes svgLayerAssemble{0%{opacity:0;transform:scale(.97)}to{opacity:1;transform:scale(1)}}.floating-action-btn:after{content:"";background:linear-gradient(90deg,transparent,rgba(255,255,255,.2),transparent);width:50%;height:100%;animation:3s 2s infinite shimmer;position:absolute;top:0;left:-100%;transform:skew(-20deg)}@keyframes shimmer{0%{left:-100%}20%{left:200%}to{left:200%}}@keyframes slideUpFadeIn{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}@keyframes slideUpFadeInPanel{0%{opacity:0;transform:translateY(12px)scale(.98)}to{opacity:1;transform:translateY(0)scale(1)}}
11
+ /*$vite$:1*/</style>
12
+ </head>
13
+ <body>
14
+ <div id="app">
15
+ <div id="loading-state">
16
+ <svg class="oe-loader" viewBox="0 0 100 100"><circle cx="50" cy="50" r="45"/></svg>
17
+ <p>Computing Vedic chart…</p>
18
+ </div>
19
+ <div id="chart-status" class="chart-status" role="status" aria-live="polite"></div>
20
+ <div id="vedic-container" hidden></div>
21
+ <div id="tooltip" class="tooltip" role="tooltip"></div>
22
+ </div>
23
+
24
+ <script type="module">(function() {
25
+ let e2 = document.createElement("link").relList;
26
+ if (e2 && e2.supports && e2.supports("modulepreload")) return;
27
+ for (let e3 of document.querySelectorAll('link[rel="modulepreload"]')) n2(e3);
28
+ new MutationObserver((e3) => {
29
+ for (let t3 of e3) if (t3.type === "childList") for (let e4 of t3.addedNodes) e4.tagName === "LINK" && e4.rel === "modulepreload" && n2(e4);
30
+ }).observe(document, { childList: true, subtree: true });
31
+ function t2(e3) {
32
+ let t3 = {};
33
+ return e3.integrity && (t3.integrity = e3.integrity), e3.referrerPolicy && (t3.referrerPolicy = e3.referrerPolicy), e3.crossOrigin === "use-credentials" ? t3.credentials = "include" : e3.crossOrigin === "anonymous" ? t3.credentials = "omit" : t3.credentials = "same-origin", t3;
34
+ }
35
+ function n2(e3) {
36
+ if (e3.ep) return;
37
+ e3.ep = true;
38
+ let n3 = t2(e3);
39
+ fetch(e3.href, n3);
40
+ }
41
+ })();
42
+ var e = { Pisces: [1, 1], Aries: [2, 1], Taurus: [3, 1], Gemini: [4, 1], Aquarius: [1, 2], Cancer: [4, 2], Capricorn: [1, 3], Leo: [4, 3], Sagittarius: [1, 4], Scorpio: [2, 4], Libra: [3, 4], Virgo: [4, 4] }, t = ["Aries", "Taurus", "Gemini", "Cancer", "Leo", "Virgo", "Libra", "Scorpio", "Sagittarius", "Capricorn", "Aquarius", "Pisces"];
43
+ function n(e2, n2) {
44
+ let r2 = t.indexOf(e2), i2 = t.indexOf(n2);
45
+ return r2 < 0 || i2 < 0 ? 0 : (r2 - i2 + 12) % 12 + 1;
46
+ }
47
+ var r = { Aries: "\u092E\u0947\u0937", Taurus: "\u0935\u0943\u0937\u092D", Gemini: "\u092E\u093F\u0925\u0941\u0928", Cancer: "\u0915\u0930\u094D\u0915", Leo: "\u0938\u093F\u0902\u0939", Virgo: "\u0915\u0928\u094D\u092F\u093E", Libra: "\u0924\u0941\u0932\u093E", Scorpio: "\u0935\u0943\u0936\u094D\u091A\u093F\u0915", Sagittarius: "\u0927\u0928\u0941", Capricorn: "\u092E\u0915\u0930", Aquarius: "\u0915\u0941\u0902\u092D", Pisces: "\u092E\u0940\u0928" }, i = { sun: "Su", moon: "Mo", mercury: "Me", venus: "Ve", mars: "Ma", jupiter: "Ju", saturn: "Sa", rahu: "Ra", ketu: "Ke" }, a = { sun: "S", moon: "M", mercury: "Mc", venus: "V", mars: "Ma", jupiter: "J", saturn: "Sa", rahu: "R", ketu: "K" }, o = { sun: "--planet-sun", moon: "--planet-moon", mercury: "--planet-mercury", venus: "--planet-venus", mars: "--planet-mars", jupiter: "--planet-jupiter", saturn: "--planet-saturn", rahu: "--planet-rahu", ketu: "--planet-ketu" }, s = { Aries: "Fire", Leo: "Fire", Sagittarius: "Fire", Taurus: "Earth", Virgo: "Earth", Capricorn: "Earth", Gemini: "Air", Libra: "Air", Aquarius: "Air", Cancer: "Water", Scorpio: "Water", Pisces: "Water" };
48
+ function c(e2) {
49
+ let t2 = {};
50
+ for (let n2 of e2) {
51
+ let e3 = n2.rashi_western;
52
+ t2[e3] || (t2[e3] = []), t2[e3].push(n2);
53
+ }
54
+ return t2;
55
+ }
56
+ function l(e2) {
57
+ let t2 = e2.planet.toLowerCase(), n2 = o[t2] || "--text-secondary", r2 = i[t2] || e2.planet.slice(0, 2), s2 = a[t2] || e2.planet.charAt(0), c2 = e2.is_retrograde ? '<span class="retro">\u211E</span>' : "", l2 = "";
58
+ return e2.dignity === "exalted" ? l2 = '<span class="dignity-ex">\u25B2</span>' : e2.dignity === "debilitated" && (l2 = '<span class="dignity-db">\u25BC</span>'), '<span class="planet-badge" data-planet="' + t2 + '" style="color:var(' + n2 + ')" title="' + h(e2.planet) + " \u2014 " + e2.rashi_degree.toFixed(1) + "\xB0 " + e2.rashi + " | " + e2.nakshatra.name + " pada " + e2.nakshatra.pada + (e2.is_retrograde ? " \u211E" : "") + '"><span class="planet-label-full">' + r2 + c2 + l2 + '</span><span class="planet-label-short">' + s2 + "</span></span>";
59
+ }
60
+ function u(e2, t2, i2, a2, o2, s2) {
61
+ let c2 = t2 || [], u2 = ["rashi-cell", c2.length > 0 ? "occupied" : "", i2 ? "lagna" : ""].filter(Boolean).join(" "), d2 = r[e2] || e2, f2 = s2 ? n(e2, s2) : 0, p2 = f2 > 0 ? '<span class="cell-house-num">' + f2 + "</span>" : "", m2 = i2 ? '<svg class="lagna-diagonal" viewBox="0 0 100 100" preserveAspectRatio="none" aria-hidden="true"><line x1="0" y1="0" x2="100" y2="100"/></svg>' : "", h2 = c2.map(l).join("");
62
+ return '<div class="' + u2 + '" data-sign="' + e2 + '" data-col="' + a2 + '" data-row="' + o2 + '" style="grid-column-start:' + a2 + ";grid-row-start:" + o2 + '">' + m2 + '<div class="cell-top-row"><span class="cell-sign">' + e2.slice(0, 3).toUpperCase() + '</span><span class="cell-sign-devanagari">' + d2 + "</span>" + p2 + '</div><div class="cell-planets">' + h2 + "</div></div>";
63
+ }
64
+ function d(e2) {
65
+ let t2 = e2.metadata.lagna || "", n2 = r[t2] || t2, i2 = e2.metadata.ayanamsa || "Lahiri", a2 = e2.metadata.ayanamsa_value == null ? "" : e2.metadata.ayanamsa_value.toFixed(2) + "\xB0";
66
+ return '<div class="rashi-cell center" style="grid-column:2/4;grid-row:2/4" data-sign="center"><span class="center-label">Jyotish</span>' + (n2 ? '<span class="center-lagna">' + n2 + "</span>" : "") + (i2 ? '<span class="center-ayanamsa">' + i2 + "</span>" : "") + (a2 ? '<span class="center-ayanamsa">' + a2 + "</span>" : "") + "</div>";
67
+ }
68
+ function f(t2) {
69
+ let n2 = c(t2.planets), r2 = t2.metadata.lagna || "";
70
+ return '<div class="rashi-grid" role="grid" aria-label="South Indian Rashi Chart">' + Object.keys(e).map(function(t3) {
71
+ let [i2, a2] = e[t3];
72
+ return u(t3, n2[t3] || [], t3 === r2, i2, a2, r2);
73
+ }).join("") + d(t2) + "</div>";
74
+ }
75
+ function p(e2, t2) {
76
+ let n2 = r[e2] || "", a2 = s[e2] || "", c2 = t2.map(function(e3) {
77
+ let t3 = e3.planet.toLowerCase(), n3 = o[t3] || "--text-secondary", r2 = h(e3.planet), a3 = i[t3] || e3.planet.slice(0, 2), s2 = "";
78
+ return e3.dignity === "exalted" ? s2 = '<span class="drawer-planet-dignity exalted">Exalted</span>' : e3.dignity === "debilitated" ? s2 = '<span class="drawer-planet-dignity debilitated">Fallen</span>' : e3.dignity === "own" && (s2 = '<span class="drawer-planet-dignity own">Own</span>'), '<div class="drawer-planet-row"><span class="drawer-planet-abbr" style="color:var(' + n3 + ')">' + a3 + '</span><div class="drawer-planet-info"><span class="drawer-planet-name">' + r2 + (e3.is_retrograde ? " \u211E" : "") + '</span><span class="drawer-planet-meta">' + e3.rashi_degree.toFixed(2) + "\xB0 " + e3.rashi + " / " + (e3.navamsa_sign || "\u2014") + ' D9</span><span class="drawer-planet-nakshatra">' + e3.nakshatra.name + " pada " + e3.nakshatra.pada + (e3.nakshatra.lord ? " \xB7 lord: " + e3.nakshatra.lord : "") + "</span></div>" + s2 + "</div>";
79
+ }).join(""), l2 = t2.length === 0 ? '<p style="color:var(--text-muted);font-size:12px">No planets in this rashi.</p>' : "";
80
+ return '<div class="drawer-handle"></div><div class="drawer-sign-title">' + e2 + (n2 ? '<span class="drawer-sign-devanagari">' + n2 + "</span>" : "") + (a2 ? '<span class="drawer-sign-element">' + a2 + "</span>" : "") + '</div><div class="drawer-section"><div class="drawer-section-title">Planets in this Rashi</div>' + c2 + l2 + '</div><div class="drawer-section" style="margin-top:12px"><button class="action-btn action-btn--primary" data-action="ask-claude" data-query="sign-' + e2.toLowerCase() + '">\u2726 Ask Claude about ' + e2 + "</button></div>";
81
+ }
82
+ function m() {
83
+ return [{ key: "sun", label: "Sun" }, { key: "moon", label: "Moon" }, { key: "mercury", label: "Me" }, { key: "venus", label: "Ve" }, { key: "mars", label: "Ma" }, { key: "jupiter", label: "Ju" }, { key: "saturn", label: "Sa" }, { key: "rahu", label: "Ra" }, { key: "ketu", label: "Ke" }].map(function(e2) {
84
+ return '<span class="legend-item"><span class="legend-dot" style="background:var(' + (o[e2.key] || "--text-secondary") + ')"></span>' + e2.label + "</span>";
85
+ }).join("");
86
+ }
87
+ function h(e2) {
88
+ return e2.charAt(0).toUpperCase() + e2.slice(1);
89
+ }
90
+ var g = null, _ = false, v = false, y = document.getElementById("loading-state"), b = document.getElementById("vedic-container"), x = document.getElementById("chart-status"), S = document.getElementById("tooltip");
91
+ function C() {
92
+ let e2 = window.__VEDIC_CHART_DATA__;
93
+ if (!e2 || !e2.planets) {
94
+ F("No Vedic chart data was provided.");
95
+ return;
96
+ }
97
+ g = e2;
98
+ let t2 = w(e2), n2 = f(e2), r2 = '<div class="vedic-legend">' + m() + "</div>", i2 = T();
99
+ b.innerHTML = t2 + n2 + r2 + i2, y.hidden = true, b.hidden = false;
100
+ let a2 = e2.metadata.lagna || "";
101
+ a2 && P("Lagna: " + a2 + (e2.metadata.ayanamsa ? " \xB7 " + e2.metadata.ayanamsa : "")), E(), document.addEventListener("keydown", function(e3) {
102
+ e3.key === "Escape" && _ && j();
103
+ });
104
+ }
105
+ function w(e2) {
106
+ let t2 = e2.metadata.ayanamsa || "Lahiri", n2 = e2.metadata.ayanamsa_value == null ? "" : " " + e2.metadata.ayanamsa_value.toFixed(2) + "\xB0";
107
+ return '<div class="vedic-header"><span class="vedic-title">Jyotish Rashi Chart</span><div class="vedic-header-meta"><span class="vedic-ayanamsa-badge">' + t2 + n2 + '</span><button id="btn-devanagari" class="vedic-toggle-btn" title="Toggle Sanskrit labels">\u0905</button></div></div>';
108
+ }
109
+ function T() {
110
+ return '<div class="vedic-actions"><button class="action-btn action-btn--primary" data-action="ask-claude" data-query="overview">\u2726 Ask Claude to interpret this chart</button><button class="action-btn" data-action="ask-claude" data-query="lagna">Lagna &amp; Ascendant</button><button class="action-btn" data-action="ask-claude" data-query="moon">Moon &amp; Nakshatra</button></div>';
111
+ }
112
+ function E() {
113
+ b.addEventListener("click", function(e2) {
114
+ let t2 = e2.target, n2 = t2.closest("#btn-devanagari");
115
+ if (n2) {
116
+ v = !v, b.classList.toggle("show-devanagari", v), n2.classList.toggle("active", v);
117
+ return;
118
+ }
119
+ let r2 = t2.closest("[data-action]");
120
+ if (r2) {
121
+ M(r2);
122
+ return;
123
+ }
124
+ let i2 = t2.closest("[data-sign]");
125
+ if (i2 && g) {
126
+ let e3 = i2.getAttribute("data-sign");
127
+ e3 && e3 !== "center" && A(e3);
128
+ }
129
+ }), b.addEventListener("mouseover", function(e2) {
130
+ let t2 = e2.target.closest(".planet-badge");
131
+ if (t2) {
132
+ let n2 = t2.getAttribute("title");
133
+ n2 && (S.textContent = n2, S.classList.add("visible"), D(e2));
134
+ }
135
+ }), b.addEventListener("mouseout", function(e2) {
136
+ let t2 = e2.target.closest(".planet-badge"), n2 = e2.relatedTarget;
137
+ t2 && (!n2 || !t2.contains(n2)) && S.classList.remove("visible");
138
+ }), b.addEventListener("mousemove", function(e2) {
139
+ S.classList.contains("visible") && D(e2);
140
+ });
141
+ }
142
+ function D(e2) {
143
+ S.style.left = e2.clientX + 14 + "px", S.style.top = e2.clientY - 36 + "px";
144
+ }
145
+ var O = null, k = null;
146
+ function A(e2) {
147
+ if (!g || _) return;
148
+ _ = true;
149
+ let t2 = g.planets.filter(function(t3) {
150
+ return t3.rashi_western === e2;
151
+ }), n2 = document.createElement("div");
152
+ n2.className = "vedic-drawer-overlay";
153
+ let r2 = document.createElement("div");
154
+ r2.className = "vedic-drawer", r2.innerHTML = p(e2, t2), r2.addEventListener("click", function(e3) {
155
+ let t3 = e3.target.closest("[data-action]");
156
+ t3 && (M(t3), j());
157
+ }), O = n2, k = r2, document.body.appendChild(n2), document.body.appendChild(r2), requestAnimationFrame(function() {
158
+ n2.classList.add("visible"), r2.classList.add("visible");
159
+ }), n2.addEventListener("click", j);
160
+ }
161
+ function j() {
162
+ if (!O || !k) return;
163
+ _ = false, O.classList.remove("visible"), k.classList.remove("visible");
164
+ let e2 = O, t2 = k;
165
+ O = null, k = null, setTimeout(function() {
166
+ e2.remove(), t2.remove();
167
+ }, 250);
168
+ }
169
+ function M(e2) {
170
+ let t2 = e2.getAttribute("data-action"), n2 = e2.getAttribute("data-query") || "";
171
+ if (t2 === "ask-claude" && g) {
172
+ var r2;
173
+ let e3 = N(n2, g);
174
+ (r2 = window.__mcp_host__) != null && r2.askClaude && window.__mcp_host__.askClaude(e3);
175
+ }
176
+ }
177
+ function N(e2, t2) {
178
+ let n2 = t2.metadata.lagna || "unknown", r2 = t2.metadata.ayanamsa || "Lahiri", i2 = t2.planets.map(function(e3) {
179
+ return e3.planet + " in " + e3.rashi_western + " " + e3.rashi_degree.toFixed(1) + "\xB0 (" + e3.nakshatra.name + " pada " + e3.nakshatra.pada + ")" + (e3.is_retrograde ? " \u211E" : "");
180
+ }).join(", "), a2 = "Vedic chart \u2014 Ayanamsa: " + r2 + ". Lagna: " + n2 + ". Planets: " + i2 + ". ";
181
+ if (e2 === "overview") return a2 + "Please give a comprehensive interpretation of this Jyotish birth chart, covering the Lagna, chart lord, key planetary placements, and overall life themes.";
182
+ if (e2 === "lagna") return a2 + "Focus on the Lagna (" + n2 + ") and its lord. What does the Ascendant reveal about this person's identity, physical constitution, and life path? How does the Lagna lord's placement influence the chart?";
183
+ if (e2 === "moon") {
184
+ let e3 = t2.planets.find(function(e4) {
185
+ return e4.planet === "moon";
186
+ });
187
+ return e3 ? a2 + "Focus on the Moon in " + e3.rashi_western + " (" + e3.rashi + "), " + e3.rashi_degree.toFixed(2) + "\xB0, in Nakshatra " + e3.nakshatra.name + " (lord: " + e3.nakshatra.lord + ", pada " + e3.nakshatra.pada + "). Interpret the Moon's placement for emotional nature, mind, mother, and public life. Include the Nakshatra's influence." : a2 + "Interpret the Moon's placement in this Vedic chart, including Nakshatra detail.";
188
+ }
189
+ if (e2.startsWith("sign-")) {
190
+ let r3 = e2.replace("sign-", ""), i3 = r3.charAt(0).toUpperCase() + r3.slice(1), o2 = t2.planets.filter(function(e3) {
191
+ return e3.rashi_western.toLowerCase() === r3;
192
+ }).map(function(e3) {
193
+ return e3.planet + " " + e3.rashi_degree.toFixed(1) + "\xB0" + (e3.is_retrograde ? " \u211E" : "");
194
+ }).join(", ");
195
+ return a2 + "Interpret the Rashi " + i3 + " in this chart. " + (o2 ? "Planets here: " + o2 + ". " : "This rashi is unoccupied. ") + "What house does this correspond to given the Lagna " + n2 + "? What themes does this rashi/house govern for this chart?";
196
+ }
197
+ return a2 + "Please interpret this Vedic birth chart.";
198
+ }
199
+ function P(e2) {
200
+ x.textContent = e2, x.classList.add("visible"), setTimeout(function() {
201
+ x.classList.remove("visible");
202
+ }, 4500);
203
+ }
204
+ function F(e2) {
205
+ y.hidden = true, b.hidden = false, b.innerHTML = '<div class="error-state"><span class="error-icon">\u26A0\uFE0F</span><p>' + e2 + "</p></div>";
206
+ }
207
+ document.readyState === "loading" ? document.addEventListener("DOMContentLoaded", C) : C();
208
+ </script>
209
+ </body>
210
+ </html>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openephemeris/mcp-server",
3
- "version": "3.13.9",
3
+ "version": "3.13.10",
4
4
  "description": "Model Context Protocol server for the Open Ephemeris astronomical computation API",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -20,7 +20,7 @@
20
20
  "test": "test"
21
21
  },
22
22
  "scripts": {
23
- "build:ui": "cd src/ui/chart-wheel && npx vite build && cd ../../.. && cd src/ui/bodygraph && npx vite build && cd ../../.. && cd src/ui/bi-wheel && npx vite build",
23
+ "build:ui": "cd src/ui/chart-wheel && npx vite build && cd ../../.. && cd src/ui/bodygraph && npx vite build && cd ../../.. && cd src/ui/bi-wheel && npx vite build && cd ../../.. && cd src/ui/transit-timeline && npx vite build && cd ../../.. && cd src/ui/moon-phase && npx vite build && cd ../../.. && cd src/ui/bazi && npx vite build && cd ../../.. && cd src/ui/vedic-chart && npx vite build",
24
24
  "build": "npm run build:ui && tsc -p tsconfig.build.json",
25
25
  "prebuild": "node -e \"const fs=require('fs');fs.rmSync('dist',{recursive:true,force:true})\"",
26
26
  "dev": "tsx watch src/index.ts",