UNPKG

chess-trainer-mcp

Version:

Chess Trainer MCP Server with Stockfish NNUE engine - Interactive chess training with AI coaching capabilities

27 lines 69.5 kB
import{p as Mt,a as A,o as ta,s as f,b as W,g as e,u as pn,f as T,c as aa,d as i,e as a,i as E,t as $,h as w,j as Ct,k as Na,w as At,l as na,m as v,n as Ne,q as Dt,r as Le,v as Ht,x as et,y as De,z as ht,A as bn,B as _t,C as yn,D as wn,E as Ca,F as La,G as xt,H as xa,I as Lt,J as Rt,K as kn,L as Ga,M as Sn,N as Ft,O as Ze,P as Mn,Q as Cn,R as Jt,S as Bt,T as Ra,U as xn}from"./vendor-B0SF1ZWq.js";import{p as tt,C as ke,c as Gt,a as gt,m as Aa,b as at,d as Rn,e as Ot,f as St}from"./chess-BxNetR-S.js";(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const g of document.querySelectorAll('link[rel="modulepreload"]'))b(g);new MutationObserver(g=>{for(const _ of g)if(_.type==="childList")for(const p of _.addedNodes)p.tagName==="LINK"&&p.rel==="modulepreload"&&b(p)}).observe(document,{childList:!0,subtree:!0});function l(g){const _={};return g.integrity&&(_.integrity=g.integrity),g.referrerPolicy&&(_.referrerPolicy=g.referrerPolicy),g.crossOrigin==="use-credentials"?_.credentials="include":g.crossOrigin==="anonymous"?_.credentials="omit":_.credentials="same-origin",_}function b(g){if(g.ep)return;g.ep=!0;const _=l(g);fetch(g.href,_)}})();const Pn="5";var Ea;typeof window<"u"&&((Ea=window.__svelte??(window.__svelte={})).v??(Ea.v=new Set)).add(Pn);const qn="modulepreload",Tn=function(h){return"/"+h},Pa={},Fa=function(t,l,b){let g=Promise.resolve();if(l&&l.length>0){document.getElementsByTagName("link");const p=document.querySelector("meta[property=csp-nonce]"),R=(p==null?void 0:p.nonce)||(p==null?void 0:p.getAttribute("nonce"));g=Promise.allSettled(l.map(y=>{if(y=Tn(y),y in Pa)return;Pa[y]=!0;const G=y.endsWith(".css"),N=G?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${y}"]${N}`))return;const C=document.createElement("link");if(C.rel=G?"stylesheet":qn,G||(C.as="script"),C.crossOrigin="",C.href=y,R&&C.setAttribute("nonce",R),document.head.appendChild(C),G)return new Promise((O,Y)=>{C.addEventListener("load",O),C.addEventListener("error",()=>Y(new Error(`Unable to preload CSS for ${y}`)))})}))}function _(p){const R=new Event("vite:preloadError",{cancelable:!0});if(R.payload=p,window.dispatchEvent(R),!R.defaultPrevented)throw p}return g.then(p=>{for(const R of p||[])R.status==="rejected"&&_(R.reason);return t().catch(_)})};var In=T('<div class="ai-thinking-overlay svelte-br284s"><div class="thinking-indicator svelte-br284s"><div class="spinner svelte-br284s"></div> <span class="svelte-br284s">AI thinking...</span></div></div>'),En=T('<div class="chess-board-container svelte-br284s"><div class="board-wrapper svelte-br284s"><div class="chess-board svelte-br284s"></div> <!></div></div>');function Nn(h,t){Mt(t,!0);let l=A(t,"fen",11,"rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"),b=A(t,"turn",3,"white"),g=A(t,"highlightedSquares",19,()=>[]),_=A(t,"disabled",3,!1),p=A(t,"gameMode",3,"human_vs_human"),R=A(t,"playerColor",3,"white"),y=A(t,"aiThinking",3,!1),G=A(t,"gameStatus",3,"playing"),N=A(t,"replayMode",3,!1),C=A(t,"boardWidth",3,512),O=A(t,"boardHeight",3,512),Y=A(t,"onmove",3,()=>{}),P=W(void 0),H=W(void 0),z=W(void 0);function J(){if(!(_()||y()||G()!=="playing"||N()))return p()==="human_vs_human"?b()==="white"?"white":"black":p()==="human_vs_ai"?b()===R()?R()==="white"?"white":"black":void 0:b()==="white"?"white":"black"}ta(async()=>{try{const{Chessground:I}=await Fa(async()=>{const{Chessground:K}=await import("./chess-BxNetR-S.js").then(ee=>ee.g);return{Chessground:K}},[]),Z=tt(l()).unwrap();f(z,ke.fromSetup(Z).unwrap(),!0),f(H,I(e(P),{fen:l(),turnColor:b()==="white"?"white":"black",movable:{free:!1,color:J(),dests:Gt(e(z))},events:{move:k},lastMove:g().length>=2?[g()[0],g()[1]]:void 0}),!0);const se=e(P).querySelector(".cg-wrap");se&&se.classList.add("brown")}catch(I){console.error("Failed to load Chessground:",I),S()}return()=>{e(H)&&e(H).destroy()}});let oe=W("");pn(()=>{if(e(H)&&l()&&l()!==e(oe))try{const I=tt(l()).unwrap();f(z,ke.fromSetup(I).unwrap(),!0);const Z=J();e(H).set({fen:l(),turnColor:b()==="white"?"white":"black",movable:{color:Z,dests:Gt(e(z))},lastMove:g().length>=2?[g()[0],g()[1]]:void 0}),f(oe,l())}catch(I){console.error("Error updating board:",I)}else if(e(H)&&l()===e(oe)){const I=J();e(H).state.movable.color!==I&&e(H).set({movable:{color:I,dests:e(z)?Gt(e(z)):new Map}})}});function k(I,Z,se){try{let K=I+Z;q(I,Z)&&(K+="q");const ee=gt(K);if(!ee){console.error("Failed to parse UCI move:",K),r();return}if(e(z).isLegal(ee)){const pe=Aa(e(z),ee);e(z).play(ee);const Fe=at(e(z).toSetup()),Ge={from:I,to:Z,san:pe,uci:K,after:Fe,promotion:ee.promotion||null};Y()(Ge)}else r()}catch(K){console.error("Error handling move:",K),r()}}function q(I,Z){try{const se=parseInt(I[1]),K=parseInt(Z[1]),ee=Rn(I);if(ee===void 0)return!1;const pe=e(z).board.get(ee);return!pe||pe.role!=="pawn"?!1:pe.color==="white"&&se===7&&K===8||pe.color==="black"&&se===2&&K===1}catch(se){return console.error("Error in needsPromotion:",se),!1}}function r(){if(!e(H)||!e(z))return;const I=e(z).toSetup(),Z=at(I);e(H).set({fen:Z,turnColor:I.turn==="white"?"white":"black",movable:{color:J(),dests:Gt(e(z))}})}function S(){e(P)&&(e(P).innerHTML=` <div style="font-family: monospace; font-size: 14px; line-height: 1.2;"> <p>Chess board (text representation):</p> <pre>${l()}</pre> <p>Turn: ${b()}</p> <p>Chessground failed to load. Please refresh the page.</p> </div> `)}var j=En(),Se=a(j),ve=a(Se);aa(ve,I=>f(P,I),()=>e(P));var Te=i(ve,2);{var te=I=>{var Z=In();w(I,Z)};E(Te,I=>{y()&&I(te)})}$(()=>Na(Se,`width: ${C()??""}px; height: ${O()??""}px; --board-size: ${C()??""}px;`)),w(h,j),Ct()}const qa={zh:{gameInfo:"游戏信息",mode:"模式",status:"状态",turn:"轮次",yourColor:"你的颜色",aiLevel:"AI等级",thinkingTime:"思考时间",aiStatus:"AI状态",moves:"移动数",humanVsHuman:"人vs人",humanVsAi:"人vs电脑",playing:"进行中",ended:"已结束",analysis:"分析中",white:"白方",black:"黑方",whiteFirst:"白方 (先手)",blackSecond:"黑方 (后手)",aiThinking:"思考中...",newGame:"新游戏",resign:"认输",analyzePosition:"分析局面",cancel:"取消",startGame:"开始游戏",selectGameMode:"选择游戏模式",twoPlayersAlternate:"两个玩家轮流下棋",playAgainstAi:"与AI对弈,可设置AI强度和思考时间",selectYourColor:"选择你的颜色",aiSettings:"AI强度设置",eloRating:"ELO等级",thinkingTimeLabel:"思考时间",seconds:"秒",beginner:"初学者",master:"大师级",fast:"快速",deepThinking:"深度思考",connectionStatus:"连接状态",engineReady:"引擎就绪",sessionActive:"会话活跃",settings:"设置",language:"语言",chinese:"中文",english:"English",gameReplay:"游戏复盘",replayCurrentGame:"复盘当前游戏",sampleGames:"示例游戏",scholarsMate:"学者将死",italianGame:"意大利开局",sicilianDefense:"西西里防御",loadPgnFile:"加载PGN文件",moveHistory:"移动历史",startingPosition:"起始位置",move:"移动",playSpeed:"播放速度",gameInformation:"游戏信息",result:"结果",date:"日期",event:"赛事",site:"地点",round:"轮次"},en:{gameInfo:"Game Info",mode:"Mode",status:"Status",turn:"Turn",yourColor:"Your Color",aiLevel:"AI Level",thinkingTime:"Thinking Time",aiStatus:"AI Status",moves:"Moves",humanVsHuman:"Human vs Human",humanVsAi:"Human vs AI",playing:"Playing",ended:"Ended",analysis:"Analysis",white:"White",black:"Black",whiteFirst:"White (First)",blackSecond:"Black (Second)",aiThinking:"AI Thinking...",newGame:"New Game",resign:"Resign",analyzePosition:"Analyze Position",cancel:"Cancel",startGame:"Start Game",selectGameMode:"Select Game Mode",twoPlayersAlternate:"Two players take turns",playAgainstAi:"Play against AI with customizable strength and thinking time",selectYourColor:"Select Your Color",aiSettings:"AI Strength Settings",eloRating:"ELO Rating",thinkingTimeLabel:"Thinking Time",seconds:"seconds",beginner:"Beginner",master:"Master",fast:"Fast",deepThinking:"Deep Thinking",connectionStatus:"Connection Status",engineReady:"Engine Ready",sessionActive:"Session Active",settings:"Settings",language:"Language",chinese:"中文",english:"English",gameReplay:"Game Replay",replayCurrentGame:"Replay Current Game",sampleGames:"Sample Games",scholarsMate:"Scholar's Mate",italianGame:"Italian Game",sicilianDefense:"Sicilian Defense",loadPgnFile:"Load PGN File",moveHistory:"Move History",startingPosition:"Starting Position",move:"Move",playSpeed:"Play Speed",gameInformation:"Game Information",result:"Result",date:"Date",event:"Event",site:"Site",round:"Round"}};function Ln(){let t="zh";if(typeof window<"u"){const y=localStorage.getItem("chess-trainer-language");y&&(y==="zh"||y==="en")&&(t=y)}const{subscribe:l,set:b,update:g}=At(t);function _(y){(y==="zh"||y==="en")&&(b(y),typeof window<"u"&&localStorage.setItem("chess-trainer-language",y))}function p(){g(y=>{const G=y==="zh"?"en":"zh";return typeof window<"u"&&localStorage.setItem("chess-trainer-language",G),G})}function R(y,G=null){var C;let N=G;return N||l(Y=>{N=Y})(),((C=qa[N])==null?void 0:C[y])||y}return{subscribe:l,setLanguage:_,toggleLanguage:p,getTranslation:R,translations:qa}}const Ke=Ln(),Gn=typeof window<"u"?localStorage.getItem("theme"):null,An=Gn||"dark",sa=At(An);sa.subscribe(h=>{if(typeof window<"u"){localStorage.setItem("theme",h),document.documentElement.classList.remove("light","dark"),document.documentElement.classList.add(h);const t=document.querySelector('meta[name="theme-color"]');t&&(t.content=h==="dark"?"#1a1a1a":"#ffffff")}});function Xt(){sa.update(h=>h==="dark"?"light":"dark")}function Fn(h,t){t()()}function $n(h,t){f(t,!e(t))}function zn(h,t){f(t,!e(t))}function Wn(h,t){e(t).click()}var Bn=T('<div class="language-settings svelte-1r3n47f"><div class="language-options svelte-1r3n47f"><button> </button> <button> </button></div></div>'),On=T('<div class="info-item winner svelte-1r3n47f"><span class="label svelte-1r3n47f"> </span> <span class="value winner-text svelte-1r3n47f"> </span></div>'),Dn=T('<div class="info-item svelte-1r3n47f"><span class="label svelte-1r3n47f"> </span> <span class="value svelte-1r3n47f"> </span></div> <div class="info-item svelte-1r3n47f"><span class="label svelte-1r3n47f"> </span> <span class="value svelte-1r3n47f"> </span></div> <div class="info-item svelte-1r3n47f"><span class="label svelte-1r3n47f"> </span> <span class="value svelte-1r3n47f"> </span></div>',1),Hn=T('<div class="info-item svelte-1r3n47f"><span class="label svelte-1r3n47f"> </span> <span class="value thinking svelte-1r3n47f"> </span></div>'),Un=(h,t,l)=>{console.log("🔴 Resign button clicked"),console.log("🔴 onEndGame prop type:",typeof t()),console.log("🔴 onEndGame prop value:",t()),console.log("🔴 gameState.status:",l.gameState.status),typeof t()=="function"?(console.log('🔴 Calling onEndGame("resign")'),t()("resign")):console.error("🔴 onEndGame is not a function!")},jn=T('<button class="btn btn-secondary resign-button svelte-1r3n47f" style="position: relative; z-index: 1000;"> </button>'),Kn=T('<div style="font-size: 0.9em; margin-top: 4px;" class="svelte-1r3n47f"> </div>'),Qn=T(" <!>",1),Vn=T('<div class="game-over-message svelte-1r3n47f"><!></div>'),Yn=T('<button class="btn btn-warning svelte-1r3n47f" title="AI思考时间过长时使用">🔄 重置AI</button>'),Jn=T('<div class="analysis-error svelte-1r3n47f"> </div>'),Xn=T('<div class="analysis-content svelte-1r3n47f"><div class="best-move svelte-1r3n47f"><span class="label svelte-1r3n47f"> </span> <span class="move-notation svelte-1r3n47f"> </span> <span class="move-uci svelte-1r3n47f"> </span></div> <div class="analysis-meta svelte-1r3n47f"><span class="timestamp svelte-1r3n47f"> </span></div></div>'),Zn=T('<div class="analysis-result svelte-1r3n47f"><h4 class="svelte-1r3n47f"> </h4> <!></div>'),es=(h,t)=>t()("scholarsMate"),ts=(h,t)=>t()("italianGame"),as=(h,t)=>t()("sicilianDefense"),ns=T('<div class="replay-menu svelte-1r3n47f"><button class="replay-btn svelte-1r3n47f"> </button> <div class="sample-games svelte-1r3n47f"><p class="menu-label svelte-1r3n47f"> </p> <button class="replay-btn svelte-1r3n47f"> </button> <button class="replay-btn svelte-1r3n47f"> </button> <button class="replay-btn svelte-1r3n47f"> </button></div> <button class="replay-btn file-upload-btn svelte-1r3n47f"> </button> <input type="file" accept=".pgn,.txt" style="display: none;" class="svelte-1r3n47f"/></div>'),ss=T('<div class="control-panel svelte-1r3n47f"><div class="panel-header svelte-1r3n47f"><h3 class="svelte-1r3n47f"> </h3> <div class="header-buttons svelte-1r3n47f"><button class="theme-btn svelte-1r3n47f"> </button> <button class="language-btn svelte-1r3n47f">🌐</button></div></div> <!> <div class="game-info svelte-1r3n47f"><div class="info-item svelte-1r3n47f"><span class="label svelte-1r3n47f"> </span> <span class="value svelte-1r3n47f"> </span></div> <div class="info-item svelte-1r3n47f"><span class="label svelte-1r3n47f"> </span> <span> </span></div> <!> <div class="info-item svelte-1r3n47f"><span class="label svelte-1r3n47f"> </span> <span> </span></div> <!> <!> <div class="info-item svelte-1r3n47f"><span class="label svelte-1r3n47f"> </span> <span class="value svelte-1r3n47f"> </span></div></div> <div class="controls svelte-1r3n47f"><button class="btn btn-primary svelte-1r3n47f"> </button> <!> <button class="btn btn-secondary svelte-1r3n47f"> </button> <!> <!> <button class="btn btn-secondary svelte-1r3n47f"> </button> <!></div></div>');function rs(h,t){Mt(t,!0);const[l,b]=Ht(),g=()=>et(Ke,"$languageStore",l),_=()=>et(sa,"$themeStore",l);let p=A(t,"analysisResult",3,null),R=A(t,"isAnalyzing",3,!1);A(t,"onNewGame",3,()=>{});let y=A(t,"onEndGame",3,()=>{}),G=A(t,"onRequestAnalysis",3,()=>{}),N=A(t,"onLoadCurrentGame",3,()=>{}),C=A(t,"onLoadSampleGame",3,()=>{}),O=A(t,"onFileUpload",3,()=>{}),Y=A(t,"onResetAI",3,()=>{}),P=A(t,"onShowNewGameModal",3,()=>{}),H=W(!1),z=W(!1),J=W(void 0),oe=Ne(g),k=Ne(()=>Ke.translations[e(oe)]),q=Ne(_);function r(M){switch(M){case"human_vs_human":return e(k).humanVsHuman;case"human_vs_ai":return e(k).humanVsAi;default:return M}}function S(M){switch(M){case"playing":return e(k).playing;case"ended":return e(k).ended;case"analysis":return e(k).analysis;case"checkmate":return e(k).checkmate||"Checkmate";case"stalemate":return e(k).stalemate||"Stalemate";case"draw":return e(k).draw||"Draw";case"resigned":return e(k).resigned||"Resigned";default:return M}}function j(M){return M==="white"?e(k).white:e(k).black}var Se=ss(),ve=a(Se),Te=a(ve),te=a(Te),I=i(Te,2),Z=a(I);Z.__click=function(...M){Xt==null||Xt.apply(this,M)};var se=a(Z),K=i(Z,2);K.__click=[$n,H];var ee=i(ve,2);{var pe=M=>{var B=Bn(),V=a(B),X=a(V);X.__click=()=>Ke.setLanguage("zh");var ue=a(X),ce=i(X,2);ce.__click=()=>Ke.setLanguage("en");var Re=a(ce);$(()=>{Le(X,1,`lang-option ${e(oe)==="zh"?"active":""}`,"svelte-1r3n47f"),v(ue,e(k).chinese),Le(ce,1,`lang-option ${e(oe)==="en"?"active":""}`,"svelte-1r3n47f"),v(Re,e(k).english)}),w(M,B)};E(ee,M=>{e(H)&&M(pe)})}var Fe=i(ee,2),Ge=a(Fe),He=a(Ge),$e=a(He),Qe=i(He,2),D=a(Qe),ae=i(Ge,2),de=a(ae),Me=a(de),ne=i(de,2),be=a(ne),Ce=i(ae,2);{var re=M=>{var B=On(),V=a(B),X=a(V),ue=i(V,2),ce=a(ue);$(Re=>{v(X,`${e(k).winner||"Winner"}:`),v(ce,Re)},[()=>j(t.gameState.winner)]),w(M,B)};E(Ce,M=>{t.gameState.status==="checkmate"&&t.gameState.winner&&M(re)})}var xe=i(Ce,2),Pe=a(xe),Pt=a(Pe),nt=i(Pe,2),st=a(nt),Ve=i(xe,2);{var Ye=M=>{var B=Dn(),V=De(B),X=a(V),ue=a(X),ce=i(X,2),Re=a(ce),n=i(V,2),s=a(n),o=a(s),c=i(s,2),d=a(c),u=i(n,2),m=a(u),x=a(m),F=i(m,2),L=a(F);$(U=>{v(ue,`${e(k).yourColor??""}:`),v(Re,U),v(o,`${e(k).aiStrength||"AI Strength"}:`),v(d,`${t.gameState.aiEloRating??""} ELO`),v(x,`${e(k).responseTime||"Response Time"}:`),v(L,`${t.gameState.aiTimeLimit/1e3}${e(k).seconds??""}`)},[()=>j(t.gameState.playerColor)]),w(M,B)};E(Ve,M=>{t.gameState.mode==="human_vs_ai"&&M(Ye)})}var rt=i(Ve,2);{var it=M=>{var B=Hn(),V=a(B),X=a(V),ue=i(V,2),ce=a(ue);$(()=>{v(X,`${e(k).aiStatus??""}:`),v(ce,e(k).aiThinking)}),w(M,B)};E(rt,M=>{t.gameState.aiThinking&&M(it)})}var ot=i(rt,2),Je=a(ot),pt=a(Je),qt=i(Je,2),ze=a(qt),We=i(Fe,2),Be=a(We);Be.__click=[Fn,P];var Xe=a(Be),lt=i(Be,2);{var Tt=M=>{var B=jn();B.__click=[Un,y,t];var V=a(B);$(()=>v(V,e(k).resign)),w(M,B)},bt=(M,B)=>{{var V=X=>{var ue=Vn(),ce=a(ue);{var Re=s=>{var o=Qn(),c=De(o),d=i(c);{var u=m=>{var x=Kn(),F=a(x);$(L=>v(F,`(${L??""} ${e(k).resigned||"resigned"})`),[()=>j(t.gameState.winner==="white"?"black":"white")]),w(m,x)};E(d,m=>{t.gameState.status==="resigned"&&m(u)})}$(m=>v(c,`🏆 ${m??""} ${e(k).wins||"wins"}! `),[()=>j(t.gameState.winner)]),w(s,o)},n=(s,o)=>{{var c=u=>{var m=ht();$(()=>v(m,`🤝 ${e(k).stalemate||"Stalemate"} - ${e(k).draw||"Draw"}!`)),w(u,m)},d=u=>{var m=ht();$(()=>v(m,`🤝 ${e(k).draw||"Draw"}!`)),w(u,m)};E(s,u=>{t.gameState.status==="stalemate"?u(c):u(d,!1)},o)}};E(ce,s=>{t.gameState.status==="checkmate"||t.gameState.status==="resigned"?s(Re):s(n,!1)})}w(X,ue)};E(M,X=>{(t.gameState.status==="checkmate"||t.gameState.status==="stalemate"||t.gameState.status==="draw"||t.gameState.status==="resigned")&&X(V)},B)}};E(lt,M=>{t.gameState.status==="playing"||t.gameState.status!=="checkmate"&&t.gameState.status!=="stalemate"&&t.gameState.status!=="draw"&&t.gameState.status!=="ended"&&t.gameState.status!=="resigned"?M(Tt):M(bt,!1)})}var Ue=i(lt,2);Ue.__click=function(...M){var B;(B=G())==null||B.apply(this,M)};var ct=a(Ue),vt=i(Ue,2);{var It=M=>{var B=Yn();B.__click=function(...V){var X;(X=Y())==null||X.apply(this,V)},w(M,B)};E(vt,M=>{t.gameState.mode==="human_vs_ai"&&t.gameState.aiThinking&&M(It)})}var dt=i(vt,2);{var yt=M=>{var B=Zn(),V=a(B),X=a(V),ue=i(V,2);{var ce=n=>{var s=Jn(),o=a(s);$(()=>v(o,`❌ ${e(k).error||"Error"}: ${p().error??""}`)),w(n,s)},Re=n=>{var s=Xn(),o=a(s),c=a(o),d=a(c),u=i(c,2),m=a(u),x=i(u,2),F=a(x),L=i(o,2),U=a(L),le=a(U);$(()=>{v(d,`${e(k).bestMove||"Best Move"}:`),v(m,p().bestMoveSan),v(F,`(${p().bestMove??""})`),v(le,`${e(k).analyzedAt||"Analyzed at"}: ${p().timestamp??""}`)}),w(n,s)};E(ue,n=>{p().error?n(ce):n(Re,!1)})}$(()=>v(X,e(k).analysisResult||"Analysis Result")),w(M,B)};E(dt,M=>{p()&&M(yt)})}var ut=i(dt,2);ut.__click=[zn,z];var wt=a(ut),Et=i(ut,2);{var Nt=M=>{var B=ns(),V=a(B);V.__click=function(...L){var U;(U=N())==null||U.apply(this,L)};var X=a(V),ue=i(V,2),ce=a(ue),Re=a(ce),n=i(ce,2);n.__click=[es,C];var s=a(n),o=i(n,2);o.__click=[ts,C];var c=a(o),d=i(o,2);d.__click=[as,C];var u=a(d),m=i(ue,2);m.__click=[Wn,J];var x=a(m),F=i(m,2);F.__change=function(...L){var U;(U=O())==null||U.apply(this,L)},aa(F,L=>f(J,L),()=>e(J)),$(()=>{V.disabled=t.gameState.moves.length===0,v(X,e(k).replayCurrentGame||"Replay Current Game"),v(Re,`${e(k).sampleGames||"Sample Games"}:`),v(s,e(k).scholarsMate||"Scholar's Mate"),v(c,e(k).italianGame||"Italian Game"),v(u,e(k).sicilianDefense||"Sicilian Defense"),v(x,`${e(k).loadPgnFile||"Load PGN File"} 📁`)}),w(M,B)};E(Et,M=>{e(z)&&M(Nt)})}$((M,B,V)=>{v(te,e(k).gameInfo),Dt(Z,"title",e(q)==="dark"?"Switch to light theme":"Switch to dark theme"),v(se,e(q)==="dark"?"☀️":"🌙"),Dt(K,"title",e(k).language),v($e,`${e(k).mode??""}:`),v(D,M),v(Me,`${e(k).status??""}:`),Le(ne,1,`value ${t.gameState.status==="checkmate"?"checkmate":t.gameState.status==="stalemate"||t.gameState.status==="draw"?"draw":""}`,"svelte-1r3n47f"),v(be,B),v(Pt,`${e(k).turn??""}:`),Le(nt,1,`value ${t.gameState.inCheck?"in-check":""}`,"svelte-1r3n47f"),v(st,`${V??""}${t.gameState.inCheck?" (Check!)":""}`),v(pt,`${e(k).moves??""}:`),v(ze,t.gameState.moves.length),v(Xe,e(k).newGame),Ue.disabled=R(),v(ct,R()?e(k).analyzing||"Analyzing...":e(k).analyzePosition),v(wt,`${e(k).gameReplay||"Game Replay"} 📺`)},[()=>r(t.gameState.mode),()=>S(t.gameState.status),()=>j(t.gameState.turn)]),w(h,Se),Ct(),b()}na(["click","change"]);bn();/** * @license lucide-svelte v0.519.0 - ISC * * ISC License * * Copyright (c) for portions of Lucide are held by Cole Bemis 2013-2022 as part of Feather (MIT). All other copyright (c) for Lucide are held by Lucide Contributors 2022. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * */const is={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":2,"stroke-linecap":"round","stroke-linejoin":"round"};var os=wn("<svg><!><!></svg>");function $t(h,t){const l=_t(t,["children","$$slots","$$events","$$legacy"]),b=_t(l,["name","color","size","strokeWidth","absoluteStrokeWidth","iconNode"]);Mt(t,!1);let g=A(t,"name",8,void 0),_=A(t,"color",8,"currentColor"),p=A(t,"size",8,24),R=A(t,"strokeWidth",8,2),y=A(t,"absoluteStrokeWidth",8,!1),G=A(t,"iconNode",24,()=>[]);const N=(...P)=>P.filter((H,z,J)=>!!H&&J.indexOf(H)===z).join(" ");yn();var C=os();Ca(C,(P,H)=>({...is,...b,width:p(),height:p(),stroke:_(),"stroke-width":P,class:H}),[()=>(Lt(y()),Lt(R()),Lt(p()),xa(()=>y()?Number(R())*24/Number(p()):R())),()=>(Lt(g()),Lt(l),xa(()=>N("lucide-icon","lucide",g()?`lucide-${g()}`:"",l.class)))]);var O=a(C);La(O,1,G,Ga,(P,H)=>{var z=Ne(()=>Sn(e(H),2));let J=()=>e(z)[0],oe=()=>e(z)[1];var k=Rt(),q=De(k);kn(q,J,!0,(r,S)=>{Ca(r,()=>({...oe()}))}),w(P,k)});var Y=i(O);xt(Y,t,"default",{}),w(h,C),Ct()}function ls(h,t){const l=_t(t,["children","$$slots","$$events","$$legacy"]),b=[["path",{d:"M12 20v2"}],["path",{d:"M12 2v2"}],["path",{d:"M17 20v2"}],["path",{d:"M17 2v2"}],["path",{d:"M2 12h2"}],["path",{d:"M2 17h2"}],["path",{d:"M2 7h2"}],["path",{d:"M20 12h2"}],["path",{d:"M20 17h2"}],["path",{d:"M20 7h2"}],["path",{d:"M7 20v2"}],["path",{d:"M7 2v2"}],["rect",{x:"4",y:"4",width:"16",height:"16",rx:"2"}],["rect",{x:"8",y:"8",width:"8",height:"8",rx:"1"}]];$t(h,Ft({name:"cpu"},()=>l,{get iconNode(){return b},children:(g,_)=>{var p=Rt(),R=De(p);xt(R,t,"default",{}),w(g,p)},$$slots:{default:!0}}))}function cs(h,t){const l=_t(t,["children","$$slots","$$events","$$legacy"]),b=[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"}],["path",{d:"M12 9v4"}],["path",{d:"M12 17h.01"}]];$t(h,Ft({name:"triangle-alert"},()=>l,{get iconNode(){return b},children:(g,_)=>{var p=Rt(),R=De(p);xt(R,t,"default",{}),w(g,p)},$$slots:{default:!0}}))}function vs(h,t){const l=_t(t,["children","$$slots","$$events","$$legacy"]),b=[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2"}],["path",{d:"M16 3.128a4 4 0 0 1 0 7.744"}],["path",{d:"M22 21v-2a4 4 0 0 0-3-3.87"}],["circle",{cx:"9",cy:"7",r:"4"}]];$t(h,Ft({name:"users"},()=>l,{get iconNode(){return b},children:(g,_)=>{var p=Rt(),R=De(p);xt(R,t,"default",{}),w(g,p)},$$slots:{default:!0}}))}function ds(h,t){const l=_t(t,["children","$$slots","$$events","$$legacy"]),b=[["path",{d:"M12 20h.01"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0"}],["path",{d:"M5 12.859a10 10 0 0 1 5.17-2.69"}],["path",{d:"M19 12.859a10 10 0 0 0-2.007-1.523"}],["path",{d:"M2 8.82a15 15 0 0 1 4.177-2.643"}],["path",{d:"M22 8.82a15 15 0 0 0-11.288-3.764"}],["path",{d:"m2 2 20 20"}]];$t(h,Ft({name:"wifi-off"},()=>l,{get iconNode(){return b},children:(g,_)=>{var p=Rt(),R=De(p);xt(R,t,"default",{}),w(g,p)},$$slots:{default:!0}}))}function Ta(h,t){const l=_t(t,["children","$$slots","$$events","$$legacy"]),b=[["path",{d:"M12 20h.01"}],["path",{d:"M2 8.82a15 15 0 0 1 20 0"}],["path",{d:"M5 12.859a10 10 0 0 1 14 0"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0"}]];$t(h,Ft({name:"wifi"},()=>l,{get iconNode(){return b},children:(g,_)=>{var p=Rt(),R=De(p);xt(R,t,"default",{}),w(g,p)},$$slots:{default:!0}}))}var us=T('<div class="status-indicator status-connected svelte-99dd7n" title="WebSocket Connection"><!></div>'),fs=T('<div class="status-indicator status-disconnected svelte-99dd7n" title="WebSocket Connection"><!></div>'),ms=T('<div class="status-indicator status-analyzing svelte-99dd7n" title="WebSocket Connection"><!></div>'),hs=T('<div class="status-indicator status-connected svelte-99dd7n"><!> <span class="status-count svelte-99dd7n"> </span></div>'),gs=T('<div class="ai-thinking svelte-99dd7n"><div class="thinking-spinner svelte-99dd7n"></div> <span class="thinking-text svelte-99dd7n"> </span></div>'),_s=T('<div class="status-bar-compact svelte-99dd7n"><div class="status-indicators svelte-99dd7n"><!> <div title="Chess Engine"><!></div> <!></div> <div class="game-status svelte-99dd7n"><div title="Current Turn"><span class="turn-text svelte-99dd7n"> </span> <!></div> <div><!></div> <!></div> <div class="client-info-compact svelte-99dd7n"><div class="client-name-compact svelte-99dd7n"> </div></div></div>');function ps(h,t){Mt(t,!0);const[l,b]=Ht(),g=()=>et(Ke,"$languageStore",l);let _=A(t,"connectionStatus",3,"disconnected"),p=A(t,"engineReady",3,!1);A(t,"engineStatus",3,"loading"),A(t,"session",3,null);let R=A(t,"gameStatus",3,"playing"),y=A(t,"turn",3,"white"),G=A(t,"aiThinking",3,!1),N=A(t,"inCheck",3,!1),C=A(t,"clientName",3,"Player"),O=A(t,"connectedClients",19,()=>[]),Y=A(t,"clientId",3,"..."),P=Ne(g);var H=_s(),z=a(H),J=a(z);{var oe=D=>{var ae=us(),de=a(ae);Ta(de,{size:14}),w(D,ae)},k=(D,ae)=>{{var de=ne=>{var be=fs(),Ce=a(be);ds(Ce,{size:14}),w(ne,be)},Me=ne=>{var be=ms(),Ce=a(be);Ta(Ce,{size:14}),w(ne,be)};E(D,ne=>{_()==="disconnected"||_()==="error"||_()==="failed"?ne(de):ne(Me,!1)},ae)}};E(J,D=>{_()==="connected"?D(oe):D(k,!1)})}var q=i(J,2),r=a(q);ls(r,{size:"14"});var S=i(q,2);{var j=D=>{var ae=hs(),de=a(ae);vs(de,{size:"14"});var Me=i(de,2),ne=a(Me);$(()=>{Dt(ae,"title",`${O().length??""} clients connected`),v(ne,O().length)}),w(D,ae)};E(S,D=>{O().length>0&&D(j)})}var Se=i(z,2),ve=a(Se),Te=a(ve),te=a(Te),I=i(Te,2);{var Z=D=>{cs(D,{size:"12",class:"check-icon"})};E(I,D=>{N()&&D(Z)})}var se=i(ve,2),K=a(se);{var ee=D=>{var ae=ht();$(()=>v(ae,e(P)==="zh"?"将死":"Mate")),w(D,ae)},pe=(D,ae)=>{{var de=ne=>{var be=ht();$(()=>v(be,e(P)==="zh"?"逼和":"Stale")),w(ne,be)},Me=(ne,be)=>{{var Ce=xe=>{var Pe=ht();$(()=>v(Pe,e(P)==="zh"?"和局":"Draw")),w(xe,Pe)},re=xe=>{var Pe=ht();$(()=>v(Pe,e(P)==="zh"?"进行中":"Playing")),w(xe,Pe)};E(ne,xe=>{R()==="draw"?xe(Ce):xe(re,!1)},be)}};E(D,ne=>{R()==="stalemate"?ne(de):ne(Me,!1)},ae)}};E(K,D=>{R()==="checkmate"?D(ee):D(pe,!1)})}var Fe=i(se,2);{var Ge=D=>{var ae=gs(),de=i(a(ae),2),Me=a(de);Me.nodeValue="AI",w(D,ae)};E(Fe,D=>{G()&&D(Ge)})}var He=i(Se,2),$e=a(He),Qe=a($e);$(D=>{Le(q,1,`status-indicator ${p()?"status-connected":"status-analyzing"}`,"svelte-99dd7n"),Le(ve,1,`turn-indicator ${y()==="white"?"turn-white":"turn-black"}`,"svelte-99dd7n"),v(te,e(P)==="zh"?y()==="white"?"白":"黑":y()==="white"?"W":"B"),Le(se,1,`game-state ${R()==="playing"?"state-playing":R()==="checkmate"?"state-checkmate":"state-draw"}`,"svelte-99dd7n"),Dt($e,"title",`${C()??""} (${D??""})`),v(Qe,C())},[()=>Y().slice(-8)]),w(h,H),Ct(),b()}function bs(h,t){t(-1)}function ys(h,t,l){e(t)>-1&&l(e(t)-1)}function ws(h,t,l){e(t).length>0&&l(e(t).length-1)}function ks(h,t,l){f(t,e(t)==="white"?"black":"white",!0),e(l)&&e(l).set({orientation:e(t)})}function Ss(h,t,l,b,g,_){f(t,!e(t)),e(l)&&e(l).set({highlight:{lastMove:e(t),check:e(b)}}),g(e(_))}function Ms(h,t,l,b,g,_){f(t,!e(t)),e(l)&&e(l).set({highlight:{lastMove:e(b),check:e(t)}}),g(e(_))}function Cs(h,t,l){f(t,!e(t)),e(l)&&e(l).set({animation:{enabled:e(t),duration:200}})}function xs(h,t,l,b,g){f(t,!e(t)),e(l)&&(e(l).set({drawable:{enabled:!0,visible:e(t)}}),e(t)?b(e(g)):e(l).setShapes([]))}var Rs=(h,t,l)=>t(e(l)),Ps=T('<div class="current-move svelte-d1q6fc"> </div>'),qs=T('<div class="current-move svelte-d1q6fc"> </div>'),Ts=(h,t)=>t(-1),Is=T('<span class="move-comment svelte-d1q6fc"> </span>'),Es=T('<span class="move-symbol check svelte-d1q6fc">+</span>'),Ns=T('<span class="move-symbol mate svelte-d1q6fc">#</span>'),Ls=T('<span class="move-symbol castle svelte-d1q6fc">♜</span>'),Gs=T('<span class="move-symbol promotion svelte-d1q6fc">♕</span>'),As=T("<!> <!> <!> <!>",1),Fs=T('<div><span class="move-number svelte-d1q6fc"><!></span> <span class="move-notation svelte-d1q6fc"> </span> <!> <!></div>'),$s=T('<div class="info-item svelte-d1q6fc"><span class="info-label svelte-d1q6fc"> </span> <span class="info-value svelte-d1q6fc"> </span></div>'),zs=T('<div class="info-item svelte-d1q6fc"><span class="info-label svelte-d1q6fc"> </span> <span class="info-value svelte-d1q6fc"> </span></div>'),Ws=T('<div class="info-item svelte-d1q6fc"><span class="info-label svelte-d1q6fc"> </span> <span class="info-value svelte-d1q6fc"> </span></div>'),Bs=T('<div class="info-item svelte-d1q6fc"><span class="info-label svelte-d1q6fc"> </span> <span class="info-value svelte-d1q6fc"> </span></div>'),Os=T('<div class="info-item svelte-d1q6fc"><span class="info-label svelte-d1q6fc"> </span> <span class="info-value svelte-d1q6fc"> </span></div>'),Ds=T('<div class="game-info svelte-d1q6fc"><div class="game-header svelte-d1q6fc"><h4 class="svelte-d1q6fc"> </h4></div> <div class="info-grid svelte-d1q6fc"><!> <!> <!> <!> <!></div></div>'),Hs=T('<div class="game-replay svelte-d1q6fc"><div class="replay-header svelte-d1q6fc"><h3 class="svelte-d1q6fc"> </h3> <div class="header-controls svelte-d1q6fc"><div class="visual-controls svelte-d1q6fc"><button class="control-btn small svelte-d1q6fc" title="翻转棋盘 / Flip Board">🔄</button> <button title="显示/隐藏箭头 / Show/Hide Arrows">🎯</button> <button title="开启/关闭动画 / Toggle Animation">✨</button> <button title="显示/隐藏最后一步 / Show/Hide Last Move">📍</button> <button title="显示/隐藏将军 / Show/Hide Check">👑</button></div> <button class="close-btn svelte-d1q6fc">✕</button></div></div> <div class="replay-content svelte-d1q6fc"><div class="board-section svelte-d1q6fc"><div class="board-container svelte-d1q6fc"><div class="chess-board svelte-d1q6fc"></div></div> <div class="playback-controls svelte-d1q6fc"><button class="control-btn svelte-d1q6fc">⏮</button> <button class="control-btn svelte-d1q6fc">⏪</button> <button class="control-btn play-btn svelte-d1q6fc"> </button> <button class="control-btn svelte-d1q6fc">⏩</button> <button class="control-btn svelte-d1q6fc">⏭</button></div> <div class="speed-controls svelte-d1q6fc"><label for="speed-select"> </label> <select id="speed-select" class="svelte-d1q6fc"><option>0.5x</option><option>1x</option><option>2x</option><option>4x</option></select></div> <div class="position-info svelte-d1q6fc"><div class="move-counter svelte-d1q6fc"> </div> <!> <div class="board-orientation svelte-d1q6fc"> </div></div></div> <div class="moves-section svelte-d1q6fc"><h4 class="svelte-d1q6fc"> </h4> <div class="moves-list svelte-d1q6fc"><div><span class="move-number svelte-d1q6fc">0.</span> <span class="move-notation svelte-d1q6fc"> </span></div> <!></div></div></div> <!></div>');function Us(h,t){var n;Mt(t,!0);const[l,b]=Ht(),g=()=>et(Ke,"$languageStore",l);let _=A(t,"gameData",3,null),p=A(t,"onClose",3,()=>{}),R=W(void 0),y=W(-1),G=W(Ze([])),N=W(Ze([])),C=W(!1),O=W(null),Y=W(Ze(((n=_())==null?void 0:n.delayMs)||1e3)),P=W(void 0),H=W(void 0),z=W(!0),J=W(!0),oe=W(!0),k=W(!0),q=W("white"),r=Ne(g),S=Ne(()=>Ke.translations[e(r)]);ta(async()=>{var c;const s="rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1",o=tt(s).unwrap();if(f(R,ke.fromSetup(o).unwrap(),!0),_()&&_().moves){f(G,_().moves,!0),f(N,[s],!0);const d=ke.fromSetup(o).unwrap();for(let u=0;u<e(G).length;u++){const m=e(G)[u];try{let x;if(m.uci?x=gt(m.uci):m.from&&m.to?x=gt(m.from+m.to+(m.promotion||"")):m.san&&(x=Ot(d,m.san)),x&&d.isLegal(x)){d.play(x);const F=at(d.toSetup());e(N).push(F)}else e(N).push(at(d.toSetup()))}catch(x){console.error("Error replaying move:",m,x),e(N).push(at(d.toSetup()))}}}try{const{Chessground:d}=await Fa(async()=>{const{Chessground:u}=await import("./chess-BxNetR-S.js").then(m=>m.g);return{Chessground:u}},[]);f(P,d(e(H),{fen:s,orientation:e(q),turnColor:"white",movable:{free:!1,color:void 0,dests:new Map},viewOnly:!0,coordinates:!0,drawable:{enabled:!0,visible:e(k)},animation:{enabled:e(oe),duration:200},highlight:{lastMove:e(z),check:e(J)},check:!1}),!0),(c=_())!=null&&c.autoPlay&&e(G).length>0&&setTimeout(()=>{ve()},100)}catch(d){console.error("Failed to load Chessground:",d)}return()=>{e(O)&&clearInterval(e(O)),e(P)&&e(P).destroy()}});function j(s){if(s<-1||s>=e(G).length)return;f(y,s,!0);const o=e(N)[s+1]||e(N)[0];try{const c=tt(o).unwrap();f(R,ke.fromSetup(c).unwrap(),!0);const d=e(R).isCheck();if(e(P)&&e(P).set({fen:o,turnColor:c.turn==="white"?"white":"black",check:e(J)&&d,movable:{free:!1,color:void 0,dests:Gt(e(R))}}),s>=0&&e(z)&&e(G)[s]){const u=e(G)[s];if(u.uci&&typeof u.uci=="string"&&u.uci.length>=4)try{const m=u.uci.substring(0,2),x=u.uci.substring(2,4);/^[a-h][1-8]$/.test(m)&&/^[a-h][1-8]$/.test(x)&&e(P)&&e(P).set({lastMove:[m,x]})}catch(m){console.error("Error parsing UCI for lastMove:",m)}else u.from&&u.to&&typeof u.from=="string"&&typeof u.to=="string"&&/^[a-h][1-8]$/.test(u.from)&&/^[a-h][1-8]$/.test(u.to)&&e(P)&&e(P).set({lastMove:[u.from,u.to]})}else e(P)&&e(P).set({lastMove:void 0});e(k)&&te(s)}catch(c){console.error("Error going to move:",c)}}function Se(){e(y)<e(G).length-1&&j(e(y)+1)}function ve(){e(C)?(clearInterval(e(O)),f(C,!1)):(f(C,!0),f(O,setInterval(()=>{e(y)<e(G).length-1?Se():(clearInterval(e(O)),f(C,!1))},e(Y)),!0))}function Te(s){f(Y,s,!0),e(C)&&(clearInterval(e(O)),ve())}function te(s){if(!e(k)||s<0)return;const o=[],c=e(G)[s];if(c){let d,u;c.uci&&typeof c.uci=="string"&&c.uci.length>=4?(d=c.uci.substring(0,2),u=c.uci.substring(2,4)):c.from&&c.to&&(d=c.from,u=c.to),d&&u&&typeof d=="string"&&typeof u=="string"&&/^[a-h][1-8]$/.test(d)&&/^[a-h][1-8]$/.test(u)&&(o.push({orig:d,dest:u,brush:"green"}),c.captured&&o.push({orig:u,brush:"red"}))}e(P)&&e(P).setShapes(o)}function I(s,o){const c=Math.floor(o/2)+1;return o%2===0?`${c}.${s.san||s.uci}`:s.san||s.uci}function Z(){var s,o,c,d,u,m;if(!_()||!_().result)return"";switch(_().result){case"1-0":return((o=(s=e(S))==null?void 0:s.gameResult)==null?void 0:o.whiteWins)||"White wins";case"0-1":return((d=(c=e(S))==null?void 0:c.gameResult)==null?void 0:d.blackWins)||"Black wins";case"1/2-1/2":return((m=(u=e(S))==null?void 0:u.gameResult)==null?void 0:m.draw)||"Draw";default:return _().result}}var se=Hs(),K=a(se),ee=a(K),pe=a(ee),Fe=i(ee,2),Ge=a(Fe),He=a(Ge);He.__click=[ks,q,P];var $e=i(He,2);let Qe;$e.__click=[xs,k,P,te,y];var D=i($e,2);let ae;D.__click=[Cs,oe,P];var de=i(D,2);let Me;de.__click=[Ss,z,P,J,j,y];var ne=i(de,2);let be;ne.__click=[Ms,J,P,z,j,y];var Ce=i(Ge,2);Ce.__click=function(...s){var o;(o=p())==null||o.apply(this,s)};var re=i(K,2),xe=a(re),Pe=a(xe),Pt=a(Pe);aa(Pt,s=>f(H,s),()=>e(H));var nt=i(Pe,2),st=a(nt);st.__click=[bs,j];var Ve=i(st,2);Ve.__click=[ys,y,j];var Ye=i(Ve,2);Ye.__click=ve;var rt=a(Ye),it=i(Ye,2);it.__click=Se;var ot=i(it,2);ot.__click=[ws,G,j];var Je=i(nt,2),pt=a(Je),qt=a(pt),ze=i(pt,2);ze.__change=[Rs,Te,Y];var We=a(ze);We.value=We.__value=2e3;var Be=i(We);Be.value=Be.__value=1e3;var Xe=i(Be);Xe.value=Xe.__value=500;var lt=i(Xe);lt.value=lt.__value=250;var Tt=i(Je,2),bt=a(Tt),Ue=a(bt),ct=i(bt,2);{var vt=s=>{var o=Ps(),c=a(o);$(d=>v(c,d),[()=>I(e(G)[e(y)],e(y))]),w(s,o)},It=s=>{var o=qs(),c=a(o);$(()=>{var d;return v(c,((d=e(S))==null?void 0:d.startingPosition)||"Starting Position")}),w(s,o)};E(ct,s=>{e(y)>=0?s(vt):s(It,!1)})}var dt=i(ct,2),yt=a(dt),ut=i(xe,2),wt=a(ut),Et=a(wt),Nt=i(wt,2),M=a(Nt);let B;M.__click=[Ts,j];var V=i(a(M),2),X=a(V),ue=i(M,2);La(ue,17,()=>e(G),Ga,(s,o,c)=>{var d=Fs();let u;d.__click=()=>j(c);var m=a(d),x=a(m);{var F=fe=>{var ye=ht();$(Q=>v(ye,`${Q??""}.`),[()=>Math.floor(c/2)+1]),w(fe,ye)};E(x,fe=>{c%2===0&&fe(F)})}var L=i(m,2),U=a(L),le=i(L,2);{var qe=fe=>{var ye=Is(),Q=a(ye);$(()=>v(Q,e(o).comments[0])),w(fe,ye)};E(le,fe=>{e(o).comments&&e(o).comments.length>0&&fe(qe)})}var ge=i(le,2);{var je=fe=>{var ye=As(),Q=De(ye);{var me=ie=>{var Oe=Es();w(ie,Oe)};E(Q,ie=>{e(o).san.includes("+")&&ie(me)})}var he=i(Q,2);{var Ie=ie=>{var Oe=Ns();w(ie,Oe)};E(he,ie=>{e(o).san.includes("#")&&ie(Ie)})}var we=i(he,2);{var Ee=ie=>{var Oe=Ls();w(ie,Oe)};E(we,ie=>{e(o).san.includes("O-O")&&ie(Ee)})}var _e=i(we,2);{var kt=ie=>{var Oe=Gs();w(ie,Oe)};E(_e,ie=>{e(o).san.includes("=")&&ie(kt)})}w(fe,ye)};E(ge,fe=>{e(o).san&&fe(je)})}$((fe,ye)=>{u=Le(d,1,"move-item svelte-d1q6fc",null,u,fe),v(U,ye)},[()=>({active:e(y)===c,white:c%2===0,black:c%2===1}),()=>I(e(o),c)]),w(s,d)});var ce=i(re,2);{var Re=s=>{var o=Ds(),c=a(o),d=a(c),u=a(d),m=i(c,2),x=a(m);{var F=Q=>{var me=$s(),he=a(me),Ie=a(he),we=i(he,2),Ee=a(we);$(()=>{var _e;v(Ie,`${((_e=e(S))==null?void 0:_e.white)||"White"}:`),v(Ee,_().white)}),w(Q,me)};E(x,Q=>{_().white&&Q(F)})}var L=i(x,2);{var U=Q=>{var me=zs(),he=a(me),Ie=a(he),we=i(he,2),Ee=a(we);$(()=>{var _e;v(Ie,`${((_e=e(S))==null?void 0:_e.black)||"Black"}:`),v(Ee,_().black)}),w(Q,me)};E(L,Q=>{_().black&&Q(U)})}var le=i(L,2);{var qe=Q=>{var me=Ws(),he=a(me),Ie=a(he),we=i(he,2),Ee=a(we);$(_e=>{var kt;v(Ie,`${((kt=e(S))==null?void 0:kt.result)||"Result"}:`),v(Ee,_e)},[Z]),w(Q,me)};E(le,Q=>{_().result&&Q(qe)})}var ge=i(le,2);{var je=Q=>{var me=Bs(),he=a(me),Ie=a(he),we=i(he,2),Ee=a(we);$(()=>{var _e;v(Ie,`${((_e=e(S))==null?void 0:_e.date)||"Date"}:`),v(Ee,_().date)}),w(Q,me)};E(ge,Q=>{_().date&&Q(je)})}var fe=i(ge,2);{var ye=Q=>{var me=Os(),he=a(me),Ie=a(he),we=i(he,2),Ee=a(we);$(()=>{var _e;v(Ie,`${((_e=e(S))==null?void 0:_e.event)||"Event"}:`),v(Ee,_().event)}),w(Q,me)};E(fe,Q=>{_().event&&Q(ye)})}$(()=>{var Q;return v(u,((Q=e(S))==null?void 0:Q.gameInformation)||"Game Information")}),w(s,o)};E(ce,s=>{_()&&s(Re)})}$((s,o,c,d,u)=>{var m,x,F,L,U,le,qe,ge;v(pe,((m=e(S))==null?void 0:m.gameReplay)||"Game Replay"),Qe=Le($e,1,"control-btn small svelte-d1q6fc",null,Qe,s),ae=Le(D,1,"control-btn small svelte-d1q6fc",null,ae,o),Me=Le(de,1,"control-btn small svelte-d1q6fc",null,Me,c),be=Le(ne,1,"control-btn small svelte-d1q6fc",null,be,d),st.disabled=e(y)===-1,Ve.disabled=e(y)===-1,v(rt,e(C)?"⏸":"▶"),it.disabled=e(y)>=e(G).length-1,ot.disabled=e(y)>=e(G).length-1,v(qt,`${((x=e(S))==null?void 0:x.playSpeed)||"Speed"}:`),v(Ue,`${((F=e(S))==null?void 0:F.move)||"Move"}: ${e(y)+1} / ${e(G).length??""}`),v(yt,`${((L=e(S))==null?void 0:L.viewing)||"Viewing"}: ${(e(q)==="white"?((U=e(S))==null?void 0:U.white)||"White":((le=e(S))==null?void 0:le.black)||"Black")??""}`),v(Et,((qe=e(S))==null?void 0:qe.moveHistory)||"Move History"),B=Le(M,1,"move-item starting-position svelte-d1q6fc",null,B,u),v(X,((ge=e(S))==null?void 0:ge.startingPosition)||"Starting Position")},[()=>({active:e(k)}),()=>({active:e(oe)}),()=>({active:e(z)}),()=>({active:e(J)}),()=>({active:e(y)===-1})]),Mn(ze,()=>e(Y),s=>f(Y,s)),w(h,se),Ct(),b()}na(["click","change"]);function js(){const{subscribe:h,set:t,update:l}=At({isConnected:!1,connectionStatus:"disconnected",lastMessage:null,socket:null});let b=0;const g=5,_=3e3;function p(N){if(!(typeof window>"u"))try{const C=new WebSocket(N);C.onopen=()=>{b=0,l(O=>({...O,isConnected:!0,connectionStatus:"connected",socket:C}))},C.onmessage=O=>{try{const Y=JSON.parse(O.data);l(P=>({...P,lastMessage:Y}))}catch(Y){console.error("Failed to parse WebSocket message:",Y,"Raw data:",O.data)}},C.onclose=O=>{l(Y=>({...Y,isConnected:!1,connectionStatus:"disconnected",socket:null})),b<g?(b++,l(Y=>({...Y,connectionStatus:"reconnecting"})),setTimeout(()=>{p(N)},_*b)):(l(Y=>({...Y,connectionStatus:"failed"})),console.error("Max reconnection attempts reached"))},C.onerror=O=>{}}catch(C){console.error("Failed to create WebSocket connection:",C),l(O=>({...O,connectionStatus:"error"}))}}function R(){l(N=>(N.socket&&N.socket.close(),{...N,isConnected:!1,connectionStatus:"disconnected",socket:null}))}function y(N){l(C=>{if(C.socket&&C.isConnected)try{const O=JSON.stringify(N);C.socket.send(O)}catch(O){console.error("❌ Failed to send WebSocket message:",O,"Message:",N)}return C})}function G(){let N=!1;return h(C=>{N=C.isConnected})(),N}return{subscribe:h,connect:p,disconnect:R,sendMessage:y,isConnected:G}}const Ae=js(),Ia={800:1,1e3:2,1200:4,1400:6,1500:7,1600:8,1800:10,2e3:12,2200:13,2400:14,2600:15};function Ks(h){const l=Object.keys(Ia).map(Number).reduce((b,g)=>Math.abs(g-h)<Math.abs(b-h)?g:b);return Ia[l]}const ea=At(!1),mt=At("loading");class Qs{constructor(){this.engine=null,this.isReady=!1,this.currentRequest=null,this.lastEvaluation={cp:0,mate:null},this._init()}async _init(){try{mt.set("loading");const t=typeof SharedArrayBuffer<"u";window.Stockfish||await this._loadStockfishScript(),mt.set("initializing");try{this.engine=await window.Stockfish()}catch(l){throw console.error("❌ Failed to create Stockfish engine:",l),t?l:new Error("Stockfish requires SharedArrayBuffer which is not available. AI play is disabled.")}this.engine.addMessageListener(l=>{this._handleMessage(l)}),mt.set("starting"),this.engine.postMessage("uci"),await this._waitForUCI()}catch(t){console.error("❌ Failed to initialize Stockfish:",t),console.error("Error details:",t.message,t.stack),this.isReady=!1,ea.set(!1),mt.set("error")}}async _waitForUCI(){return new Promise((t,l)=>{const b=setTimeout(()=>{l(new Error("UCI initialization timeout"))},1e4),g=this._handleMessage.bind(this);this._handleMessage=_=>{g(_),_==="readyok"&&(clearTimeout(b),t())}})}async _loadStockfishScript(){return new Promise((t,l)=>{const b=document.createElement("script");b.src="/nnue/stockfish.js",b.onload=()=>{t()},b.onerror=g=>{console.error("❌ Failed to load Stockfish script:",g),l(g)},document.head.appendChild(b)})}_handleMessage(t){if(t==="uciok"){mt.set("initializing"),this.engine.postMessage("isready");return}if(t==="readyok"){this.isReady=!0,ea.set(!0),mt.set("ready");return}if(t.startsWith("bestmove")){const l=t.match(/^bestmove\s+(\S+)/);if(l){const b=l[1];this.currentRequest&&(this.currentRequest.resolve({move:b,evaluation:this.lastEvaluation}),this.currentRequest=null)}else console.error("❌ Failed to parse bestmove message:",t),this.currentRequest&&(this.currentRequest.reject(new Error("Failed to parse bestmove")),this.currentRequest=null);return}if(t.startsWith("info")){this._parseInfoMessage(t);return}}_parseInfoMessage(t){let l={};const b=t.match(/score cp (-?\d+)/);b&&(l.cp=parseInt(b[1]));const g=t.match(/score mate (-?\d+)/);g&&(l.mate=parseInt(g[1]));const _=t.match(/depth (\d+)/);_&&(l.depth=parseInt(_[1]));const p=t.match(/pv (.+?)(?:\s|$)/);p&&(l.pv=p[1].split(" ")),(l.cp!==void 0||l.mate!==void 0)&&(this.lastEvaluation=l)}async _waitForReady(){if(!this.isReady)return new Promise(t=>{const l=()=>{this.isReady?t():setTimeout(l,100)};l()})}async getBestMove(t,l=1500,b=null){if(!t||typeof t!="string"||t.trim()==="")throw new Error("Invalid FEN position provided");this.currentRequest&&(this.currentRequest.reject(new Error("Request cancelled by new request")),this.currentRequest=null),await this._waitForReady();const g=Ks(l);this.engine.postMessage(`setoption name Skill Level value ${g}`),await new Promise(p=>setTimeout(p,100)),this.engine.postMessage(`position fen ${t}`),await new Promise(p=>setTimeout(p,100));const _=b||1e3;return new Promise((p,R)=>{this.currentRequest={resolve:p,reject:R};const y=setTimeout(()=>{this.currentRequest&&(console.error("❌ Move search timed out after",_+3e3,"ms"),this.currentRequest.reject(new Error("Move search timed out")),this.currentRequest=null)},_+3e3),G=this.currentRequest.resolve,N=this.currentRequest.reject;this.currentRequest.resolve=C=>{clearTimeout(y),G(C)},this.currentRequest.reject=C=>{clearTimeout(y),N(C)},this.engine.postMessage(`go movetime ${_}`)})}async testEngine(){try{return await this.getBestMove("rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1",1500,2e3)}catch(t){throw console.error("🧪 Engine test failed:",t),t}}destroy(){this.engine&&(this.engine.postMessage("quit"),this.engine.terminate(),this.engine=null,this.isReady=!1)}}const Zt=new Qs;function Vs(h,t,l,b,g,_,p,R,y){console.log("🚀 CLIENT: startNewGame called"),console.log("🚀 CLIENT: Modal settings:",{selectedMode:e(t),selectedPlayerColor:e(l),aiEloRating:e(b),aiTimeLimit:e(g)}),e(_).selectedSquare=null,e(_).highlightedSquares=[],f(p,!1),e(R).status="playing",e(R).winner=null,console.log("🚀 CLIENT: Calling handleNewGame with:",e(t),e(l),e(b),e(g)),y(e(t),e(l),e(b),e(g))}function Ys(h,t){h.target.classList.contains("modal-overlay")&&f(t,!1)}function Js(h){h.stopPropagation()}var Xs=T('<div class="ai-thinking-overlay"><div class="ai-thinking-message"><div class="ai-thinking-spinner"></div> <span>AI正在思考...</span></div></div>'),Zs=T('<p class="resign-info"> </p>'),er=T("<h2>🏆 游戏结束</h2> <p> </p> <!>",1),tr=T("<h2>🤝 和棋</h2> <p>逼和 - 没有合法着法</p>",1),ar=T("<h2>🤝 和棋</h2> <p>游戏以平局结束</p>",1),nr=T('<div class="game-over-overlay"><div class="game-over-message"><!> <button class="btn btn-primary">开始新游戏</button></div></div>'),sr=T('<div class="replay-info"><h3>🎬 复盘模式</h3> <p> </p> <button class="btn btn-secondary">返回游戏</button></div>'),rr=(h,t)=>t(200),ir=(h,t)=>t(500),or=(h,t)=>t(1e3),lr=(h,t)=>t(3e3),cr=(h,t)=>t(1e3,200),vr=(h,t)=>t(1500,500),dr=(h,t)=>t(2e3,1e3),ur=(h,t)=>t(2500,3e3),fr=T('<div class="ai-settings"><div class="color-selection"><h4> </h4> <label class="color-option"><input type="radio"/> <span> </span></label> <label class="color-option"><input type="radio"/> <span> </span></label></div> <div class="ai-strength"><h4> </h4> <div class="setting-item"><label for="elo-range"><strong> </strong> </label> <input id="elo-range" type="range" min="800" max="2800" step="100" class="slider"/> <div class="elo-labels"><span> </span> <span> </span></div> <div class="setting-description"> </div></div> <div class="setting-item"><label for="time-range"><strong> </strong> </label> <input id="time-range" type="range" min="200" max="5000" step="200" class="slider"/> <div class="time-labels"><span> </span> <span> </span></div> <div class="quick-presets"><button type="button" class="preset-btn"> </button> <button type="button" class="preset-btn"> </button> <button type="button" class="preset-btn"> </button> <button type="button" class="preset-btn"> </button></div> <div class="setting-description"> </div></div> <div class="setting-item"><h5> </h5> <div class="combo-presets"><button type="button" class="combo-btn"> <br/> <small>1000 ELO • 0.2s</small></button> <button type="button" class="combo-btn"> <br/> <small>1500 ELO • 0.5s</small></button> <button type="button" class="combo-btn"> <br/> <small>2000 ELO • 1s</small></button> <button type="button" class="combo-btn"> <br/> <small>2500 ELO • 3s</small></button></div></div></div></div>'),mr=(h,t)=>f(t,!1),hr=T('<div class="modal-overlay"><div class="modal"><h3> </h3> <div class="mode-selection"><label class="mode-option"><input type="radio"/> <span> </span> <small> </small></label> <label class="mode-option"><input type="radio"/> <span> </span> <small> </small></label></div> <!> <div class="modal-actions"><button class="btn btn-secondary"> </button> <button class="btn btn-primary"> </button></div></div></div>'),gr=T('<div class="app-container"><header class="app-header"><div class="header-content"><h1 class="app-title">Chess Trainer MCP</h1> <div class="header-status"><!></div></div></header> <main class="main-content"><div class="board-and-moves"><div class="board-container"><div class="chess-board-wrapper"><!> <!> <!></div></div> <div class="side-panel"><!></div></div></main> <!> <!></div>');function _r(h,t){Mt(t,!0);const[l,b]=Ht(),g=()=>et(Ke,"$languageStore",l),_=()=>et(ea,"$engineReady",l),p=()=>et(Ae,"$webSocketStore",l),R=()=>et(mt,"$engineStatus",l),y=[],G=[];let N=W(Ze(typeof window<"u"?window.innerWidth:1024)),C=Ne(()=>e(N)<768?Math.min(e(N)-32,400):e(N)<1024?Math.min(e(N)*.6,500):512),O=Ne(()=>e(C)),Y=Ne(()=>e(N)<768?"grid-template-columns: 1fr; gap: 1.5rem;":e(N)<1024?"grid-template-columns: minmax(300px, 1fr) 280px; gap: 1.5rem;":"grid-template-columns: minmax(320px, 1fr) 350px; gap: 2rem;"),P=W(!1),H=W("human_vs_human"),z=W("white"),J=W(1500),oe=W(500),k=Ne(g),q=Ne(()=>Ke.translations[e(k)]),r=W(Ze({fen:"rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1",moves:[],currentMoveIndex:-1,turn:"white",status:"playing",mode:"human_vs_human",playerColor:"white",aiThinking:!1,aiEloRating:1500,aiTimeLimit:500,inCheck:!1,winner:null})),S=W(null);try{const n=tt(e(r).fen).unwrap();f(S,ke.fromSetup(n).unwrap(),!0)}catch(n){console.error("Failed to initialize chess game:",n),f(S,ke.default(),!0)}let j=W(Ze({selectedSquare:null,highlightedSquares:[]})),Se=W(Ze({cp:0,mate:null,bestMove:null})),ve=W(null),Te=W(!1),te=W(!1),I=W(null),Z=null,se=Fe(),K=Ge(),ee=W(Ze([])),pe=W(0);function Fe(){return"client_"+Math.random().toString(36).substr(2,9)+"_"+Date.now().toString(36)}function Ge(){const n=["Swift","Clever","Bold","Wise","Quick","Sharp","Bright","Noble","Brave","Smart"],s=["Knight","Bishop","Rook","Queen","King","Pawn","Player","Master","Champion","Warrior"],o=n[Math.floor(Math.random()*n.length)],c=s[Math.floor(Math.random()*s.length)];return`${o}${c}`}ta(()=>{const n=()=>{f(N,window.innerWidth,!0)};window.addEventListener("resize",n);const s=localStorage.getItem("theme")||"dark";document.documentElement.classList.add(s),Z=Ae.subscribe(({lastMessage:m})=>{m&&He(m)});const o=window.location.href.includes("file://")?2e3:500;setTimeout(()=>{const m=window.location.hostname||"localhost",x=window.location.port||"3456",F=`ws://${m}:${x}/ws`;console.log("🔌 Connecting to WebSocket:",F);try{Ae.connect(F)}catch(L){console.error("❌ Failed to connect WebSocket:",L)}},o);let c,d=0;const u=50;return c=setInterval(()=>{d++,Jt(Ae).isConnected?(Ae.sendMessage({type:"join_session",clientId:se,clientName:K}),ae(),clearInterval(c)):d>=u&&(console.error("❌ WebSocket connection timeout after 5 seconds"),clearInterval(c))},100),()=>{window.removeEventListener("resize",n),Z&&Z(),Zt.destroy()}});function He(n){if(!(!n||typeof n!="object"||!n.type))switch(n.type){case"mcp_move":Qe(n);break;case"mcp_game_reset":console.log("🎮 CLIENT: Received mcp_game_reset message:",n),$e(n);break;case"client_joined":e(ee).find(s=>s.clientId===n.clientId)||f(ee,[...e(ee),{client