@guandata/guanbi-mcp-server 0.1.23 → 0.1.24

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 (2) hide show
  1. package/dist/index.js +9 -9
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
- import"dotenv/config";import{createRequire as Oo}from"module";import{z as C}from"zod";var yr="http://guandata-web:8088",Tr=C.object({BI_BASE_URL:C.string().url().optional().default(yr),BI_PUBLIC_PATH:C.string().optional().default(""),BI_PAT:C.string().optional(),BI_PAT_CLIENT:C.string().optional(),BI_UID_TOKEN:C.string().optional(),BI_LOGIN_DOMAIN:C.string().optional().default("guanbi"),BI_LOGIN_ID:C.string().optional(),BI_LOGIN_PASSWORD:C.string().optional(),BI_APP_TOKEN:C.string().optional(),BI_LOGIN_ID_HEADER:C.string().optional(),BI_USER_PROPERTY_HEADER:C.string().optional(),BI_USER_PROPERTY_KEY:C.string().optional(),BI_IDENTITY_DEBUG:C.string().optional(),BI_IDENTITY_TOKEN_CACHE_TTL_MS:C.coerce.number().int().positive().default(6e5),BI_REQUEST_TIMEOUT_MS:C.coerce.number().int().positive().default(12e4),BI_MAX_ROWS:C.coerce.number().int().positive().default(1e3),BI_DATA_VERSION:C.string().optional(),GUANBI_MCP_USAGE_STATS:C.string().optional(),MCP_TRANSPORT:C.enum(["stdio","streamable-http"]).optional().default("stdio"),MCP_HTTP_HOST:C.string().optional().default("127.0.0.1"),MCP_HTTP_PORT:C.coerce.number().int().nonnegative().optional().default(9090),MCP_ENTRYPOINT_TOKEN:C.string().optional(),MCP_TRUSTED_GATEWAY:C.string().optional()});function yt(e=process.env){let t=Tr.parse(e),n=t.MCP_TRANSPORT==="streamable-http";return{...t,BI_BASE_URL:t.BI_BASE_URL?.replace(/\/+$/,""),BI_PUBLIC_PATH:Cr(t.BI_PUBLIC_PATH),BI_PAT:n?void 0:t.BI_PAT?.trim()||void 0,BI_PAT_CLIENT:t.BI_PAT_CLIENT?.trim()||"mcp",BI_UID_TOKEN:t.BI_UID_TOKEN?.trim()||void 0,BI_LOGIN_DOMAIN:t.BI_LOGIN_DOMAIN?.trim()||"guanbi",BI_LOGIN_ID:t.BI_LOGIN_ID?.trim()||void 0,BI_LOGIN_PASSWORD:t.BI_LOGIN_PASSWORD?.trim()||void 0,BI_APP_TOKEN:t.BI_APP_TOKEN?.trim()||void 0,BI_LOGIN_ID_HEADER:t.BI_LOGIN_ID_HEADER===void 0?"x-guanbi-login-id":bt(t.BI_LOGIN_ID_HEADER),BI_USER_PROPERTY_HEADER:bt(t.BI_USER_PROPERTY_HEADER),BI_USER_PROPERTY_KEY:t.BI_USER_PROPERTY_KEY?.trim()||void 0,BI_IDENTITY_DEBUG:t.BI_IDENTITY_DEBUG?.trim()||void 0,BI_DATA_VERSION:t.BI_DATA_VERSION?.trim()||void 0,GUANBI_MCP_USAGE_STATS:t.GUANBI_MCP_USAGE_STATS?.trim()||void 0,MCP_ENTRYPOINT_TOKEN:t.MCP_ENTRYPOINT_TOKEN?.trim()||void 0,MCP_TRUSTED_GATEWAY:t.MCP_TRUSTED_GATEWAY?.trim()||void 0}}function Cr(e){let t=e?.trim().replace(/^\/+|\/+$/g,"")??"";return t?`/${t}`:""}function bt(e){return e?.trim().toLowerCase()||void 0}import{createRequire as po}from"module";import{createHash as mo,randomUUID as fo}from"crypto";import{createServer as go}from"http";import{McpServer as _o}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as ho}from"@modelcontextprotocol/sdk/server/stdio.js";import{StreamableHTTPServerTransport as Io}from"@modelcontextprotocol/sdk/server/streamableHttp.js";var ce=class{record(t){console.error(JSON.stringify({audit:Er({...t})}))}},ue=class{record(){}};function Pe(e,t,n,r,i){return{transport:t.transport,tool:e,tenantId:t.audit.tenantId,endUserId:t.audit.endUserId,traceId:t.audit.traceId,status:r,durationMs:Math.max(0,Date.now()-n),failureType:r==="error"?Br(i):void 0}}function Br(e){return e instanceof Error?e.name||"Error":typeof e}function Er(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}async function de(e){if(!e.BI_LOGIN_ID||!e.BI_LOGIN_PASSWORD||!e.BI_LOGIN_DOMAIN)throw new Error("\u5BC6\u7801\u767B\u5F55\u9700\u8981\u914D\u7F6E BI_LOGIN_DOMAIN\u3001BI_LOGIN_ID\u3001BI_LOGIN_PASSWORD\u3002");let t=await fetch(wr(e,"/api/user/sign-in"),{method:"POST",headers:{"Content-Type":"application/json","raw-backend-response":"TRUE"},body:JSON.stringify({domain:e.BI_LOGIN_DOMAIN,loginId:e.BI_LOGIN_ID,password:Buffer.from(e.BI_LOGIN_PASSWORD,"utf8").toString("base64")}),signal:AbortSignal.timeout(e.BI_REQUEST_TIMEOUT_MS)}),n=await t.text();if(!t.ok)throw new Error(`BI \u767B\u5F55\u5931\u8D25\uFF1AHTTP ${t.status} ${vr(n)}`);let r=Sr(t,n);if(!r)throw new Error("BI \u767B\u5F55\u54CD\u5E94\u4E2D\u672A\u627E\u5230 X-Auth-Token/Authorization/uIdToken/authToken/token\u3002");return{token:r}}function wr(e,t){return`${e.BI_BASE_URL}${e.BI_PUBLIC_PATH}${t}`}function Sr(e,t){let n=Rr(e.headers);if(n)return n;let r=Or(t);return r||Ar(e.headers)}function Rr(e){let t=e.get("x-auth-token")?.trim();if(t)return t;let n=e.get("authorization")?.trim();return n&&(n.match(/^Bearer\s+(.+)$/i)?.[1]??n).trim()||void 0}function Or(e){try{let t=JSON.parse(e);return Tt(t)??Tt(Pr(t.response))}catch{return}}function Ar(e){return[...e.getSetCookie?.()??[],...kr(e.get("set-cookie"))].map(n=>n.trim().match(/(?:^|;\s*)uIdToken=([^;]+)/)?.[1]).find(Boolean)}function kr(e){return e?e.split(/,(?=\s*[^;,]+=)/):[]}function Tt(e){if(e)for(let t of["uIdToken","authToken","token"]){let n=e[t];if(typeof n=="string"&&n)return n}}function Pr(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function vr(e,t=500){return e.length>t?`${e.slice(0,t)}...`:e}var xr="guanbi_mcp_chatbi",O=class extends Error{detail;retryableForBaseUrl;authExpired;constructor(t,n,r={}){super(t),this.name="ChatBIRequestError",this.detail=n,this.retryableForBaseUrl=!!r.retryableForBaseUrl,this.authExpired=!!r.authExpired}},v=class{constructor(t){this.config=t;this.token=t.BI_UID_TOKEN,this.candidates=t.BI_BASE_URL?Mr(`${t.BI_BASE_URL}${t.BI_PUBLIC_PATH}`):[]}config;token;resolvedBaseUrl;candidates;triedBaseUrls=new Set;lastError;loginPromise;refreshPromise;getRegisteredTools(){return["chatbi_list_themes","chatbi_query","chatbi_insight_start","chatbi_insight_poll"]}getResolvedBaseUrl(){return this.resolvedBaseUrl}getTriedBaseUrls(){return[...this.triedBaseUrls]}getLastError(){return this.lastError}async probe(){try{return await this.listThemes(),{available:!0,resolvedBaseUrl:this.resolvedBaseUrl,triedBaseUrls:this.getTriedBaseUrls(),registeredTools:this.getRegisteredTools()}}catch(t){let n=Ct(t,"probe");return{available:!1,lastError:n,failureType:Kr(n),triedBaseUrls:this.getTriedBaseUrls(),registeredTools:this.getRegisteredTools()}}}async listThemes(t={}){let n={filter_enable:!0,list_type:"CHAT"};return typeof t.isInsight=="boolean"&&(n.is_insight=t.isInsight),(await this.request("/theme/list-theme",{operation:"listThemes",body:n,retrySafeBaseUrlFallback:!0,validateResponse:Vr})).themes}async query(t){let n=await this.resolveThemeId(t.themeId,t.themeName,!1),r={attachments:[],theme_id:n,message:t.message,config:Bt({fast_mode:t.fastMode??!0,n_samples:t.nSamples})};t.sessionId&&(r.session_id=t.sessionId),t.externalContext&&(r.external_context=t.externalContext);let i=await this.request("/chat/send-message-sync",{operation:"query",body:r,includeDeviceId:!0});try{Yr(i)}catch(s){throw this.operationError("query","/chat/send-message-sync",s)}return i}async insight(t){let n=t.timeoutMs??3e5,r=t.pollIntervalMs??2e3,i=Date.now()+n,s=await this.startInsight({...t,requestTimeoutMs:Et(i)});if(!s.theme_id)throw this.operationError("insight.send","/chat/send-message","ChatBI insight response missing theme_id");if(!s.message_id?.trim())throw this.operationError("insight.send","/chat/send-message","ChatBI insight response missing message_id");for(;;){let o=await this.getAgentAnswer(s.theme_id,s.message_id,Et(i));switch(o.message_id??=s.message_id,o.session_id??=s.session_id,o.status){case"success":return o;case"failure":case"stopped":throw this.operationError("insight.poll","/chat/get-agent-answer",o.detail?.trim()||"Insight request failed")}await ei(i,r,n)}}async startInsight(t){let n=await this.resolveThemeId(t.themeId,t.themeName,!0),r={attachments:[],theme_id:n,message:t.message,is_insight:1};t.sessionId&&(r.session_id=t.sessionId),t.externalContext&&(r.external_context=t.externalContext);let i=Bt({analysis_expert_id:t.analysisExpertId,agent_mode:t.agentMode,analysis_confirmation_enabled:t.analysisConfirmationEnabled});Object.keys(i).length&&(r.config=i);let s=await this.request("/chat/send-message",{operation:"insight.send",body:r,includeDeviceId:!0,requestTimeoutMs:t.requestTimeoutMs});if(!s.message_id?.trim())throw this.operationError("insight.send","/chat/send-message","ChatBI insight response missing message_id");return s.theme_id=n,s}async pollInsight(t){let n=await this.resolveThemeId(t.themeId,t.themeName,!0),r=await this.getAgentAnswer(n,t.messageId,t.requestTimeoutMs);return r.message_id||(r.message_id=t.messageId),r}async getAgentAnswer(t,n,r){let i=new URLSearchParams({theme_id:t,message_id:n});try{return await this.request(`/chat/get-agent-answer?${i.toString()}`,{operation:"insight.poll",retrySafeBaseUrlFallback:!0,requestTimeoutMs:r})}catch(s){if(Jr(s))return{status:"waiting",message_id:n};throw s}}async resolveThemeId(t,n,r){let i=t?.trim();if(i)return i;let s=n?.trim();if(!s)throw new Error("\u7F3A\u5C11\u4E3B\u9898\u9009\u62E9\uFF0C\u8BF7\u4F20 theme_id \u6216 theme_name\u3002");let o=await this.listThemes({isInsight:r?!0:void 0});return Wr(o,s)}async request(t,n){this.assertUsableConfig();let r=this.resolvedBaseUrl?[this.resolvedBaseUrl]:this.candidates,i;for(let s of r){this.triedBaseUrls.add(s);try{let o=await this.requestToBaseUrlWithAuthRetry(s,t,n);return n.validateResponse?.(o,{operation:n.operation,baseUrl:s,path:t}),this.resolvedBaseUrl=s,this.lastError=void 0,o}catch(o){if(i=o,this.lastError=Ct(o,n.operation),!Lr(o,n.retrySafeBaseUrlFallback))throw this.withTriedBaseUrls(o)}}throw this.withTriedBaseUrls(i??new Error("\u65E0\u6CD5\u5B9A\u4F4D ChatBI Public API\u3002"))}withTriedBaseUrls(t){return t instanceof O&&(t.detail.tried_base_urls=this.getTriedBaseUrls(),this.lastError=t.detail),t}operationError(t,n,r){let i=r instanceof Error?r.message:String(r);return new O(i,{operation:t,base_url:this.resolvedBaseUrl,path:n,chatbi_message:i,tried_base_urls:this.getTriedBaseUrls(),detail:i})}async requestToBaseUrlWithAuthRetry(t,n,r){if(this.config.BI_PAT)return this.requestToBaseUrl(t,n,{type:"pat",token:this.config.BI_PAT},r,{operation:r.operation,baseUrl:t,path:n});let i=await this.ensureToken(),s={operation:r.operation,baseUrl:t,path:n};try{return await this.requestToBaseUrl(t,n,{type:"uid",token:i},r,s)}catch(o){if(!qr(o)||!this.canRefreshToken())throw o;let a=await this.refreshToken();return this.requestToBaseUrl(t,n,{type:"uid",token:a},r,{...s,tokenRefreshed:!0})}}async requestToBaseUrl(t,n,r,i,s){let o=i.body===void 0?"GET":"POST",a;try{a=await fetch(`${t}${n}`,{method:o,headers:Dr(r,i),body:i.body===void 0?void 0:JSON.stringify(i.body),signal:AbortSignal.timeout(i.requestTimeoutMs??this.config.BI_REQUEST_TIMEOUT_MS)})}catch(d){throw new O(d instanceof Error?d.message:String(d),{operation:s.operation,base_url:s.baseUrl,path:s.path,token_refreshed:s.tokenRefreshed,detail:d instanceof Error?d.message:String(d)})}let c=await a.text(),u=Ur(c,a,s);if(!a.ok||jr(u))throw Nr(u,c,a,s);return r.type==="uid"&&this.refreshTokenFromResponse(a,u),u.data}async ensureToken(){return this.token?this.token:(this.loginPromise??=this.signInForToken().finally(()=>{this.loginPromise=void 0}),this.loginPromise)}async refreshToken(){return this.refreshPromise??=this.refreshTokenOnce().finally(()=>{this.refreshPromise=void 0}),this.refreshPromise}async refreshTokenOnce(){if(this.config.BI_UID_TOKEN_REFRESH){let t=await this.config.BI_UID_TOKEN_REFRESH();return this.token=t,t}return this.signInForToken()}async signInForToken(){this.token=void 0;let t=await de(this.config);return this.token=t.token,t.token}refreshTokenFromResponse(t,n){let r=zr(t,n);!r||r===this.token||(this.token=r)}hasPasswordLogin(){return!!(this.config.BI_LOGIN_DOMAIN&&this.config.BI_LOGIN_ID&&this.config.BI_LOGIN_PASSWORD)}canRefreshToken(){return!!this.config.BI_UID_TOKEN_REFRESH||this.hasPasswordLogin()}assertUsableConfig(){if(!this.config.BI_BASE_URL)throw new Error("\u7F3A\u5C11 BI_BASE_URL\uFF0C\u65E0\u6CD5\u63A8\u5BFC ChatBI Public API \u5730\u5740\u3002")}};function Mr(e){let t=new URL(e),n=[],r=s=>{let o=new URL(t.toString());o.pathname=s,o.search="",o.hash="";let a=o.toString().replace(/\/+$/,"");n.includes(a)||n.push(a)},i=t.pathname.replace(/\/+$/,"");return r("/api/chat/public-api"),i&&r(`${i}/api/chat/public-api`),r(i?`${i}/public-api`:"/public-api"),r("/public-api"),n}function le(e){return e.BI_BASE_URL?e.BI_PAT||e.BI_UID_TOKEN?!0:!!(e.BI_LOGIN_DOMAIN&&e.BI_LOGIN_ID&&e.BI_LOGIN_PASSWORD):!1}function Dr(e,t){let n={"User-Agent":"guanbi-mcp-server",...e.type==="pat"?{"X-Personal-Token":e.token}:{Cookie:`uIdToken=${e.token}`}};return t.body!==void 0&&(n["Content-Type"]="application/json"),t.includeDeviceId&&(n["Device-ID"]=xr),n}function Ur(e,t,n){if(!e)return{};try{return JSON.parse(e)}catch{throw new O("ChatBI response is not valid JSON",{operation:n.operation,base_url:n.baseUrl,path:n.path,http_status:t.status,token_refreshed:n.tokenRefreshed,detail:Rt(e)},{retryableForBaseUrl:!0})}}function jr(e){let t=wt(e);return typeof t=="number"&&![0,200].includes(t)||e.result==="fail"||e.success===!1}function Nr(e,t,n,r){let i=wt(e),s=$r(e),o=s||t||`ChatBI request failed with status ${n.status}`,a={operation:r.operation,base_url:r.baseUrl,path:r.path,http_status:n.status,chatbi_code:i,chatbi_message:s,token_refreshed:r.tokenRefreshed,detail:Rt(t)},c=Fr(o),u=!c&&Gr(n.status,i);return new O(o,a,{authExpired:u,retryableForBaseUrl:c||Hr(n.status,i)})}function Lr(e,t){return!!(t&&e instanceof O&&e.retryableForBaseUrl)}function qr(e){return e instanceof O&&e.authExpired}function Gr(e,t){return e===401||e===403||t===401||t===403||t===5001}function Hr(e,t){return[401,403,404,405].includes(e)||typeof t=="number"&&[401,403,404,405].includes(t)}function Jr(e){return e instanceof O&&e.detail.http_status===200&&e.detail.chatbi_code===404&&e.detail.chatbi_message==="Message not found."}function wt(e){if(typeof e.code=="number")return e.code;let t=pe(e.error);return typeof t?.status=="number"?t.status:void 0}function $r(e){if(typeof e.message=="string"&&e.message.trim())return e.message;let t=pe(e.error);return typeof t?.message=="string"&&t.message.trim()?t.message:void 0}function Fr(e){return/No static resource/i.test(e)}function pe(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function Vr(e,t){let n=pe(e);if(!Array.isArray(n?.themes))throw new O("ChatBI list-theme response missing themes",{operation:t.operation,base_url:t.baseUrl,path:t.path,detail:"missing themes"},{retryableForBaseUrl:!0})}function zr(e,t){let r=[...e.headers.getSetCookie?.()??[],...Qr(e.headers.get("set-cookie"))].map(s=>ve(s.trim().match(/(?:^|;\s*)uIdToken=([^;]+)/)?.[1])).find(Boolean);if(r)return r;let i=ve(e.headers.get("x-auth-token"));return i||St(t)}function Qr(e){return e?e.split(/,(?=\s*[^;,]+=)/):[]}function ve(e){if(typeof e!="string")return;let t=e.trim();return t&&!/\s/.test(t)?t:void 0}function St(e){let t=pe(e);if(t){for(let n of["uIdToken","authToken"]){let r=ve(t[n]);if(r)return r}for(let n of["data","response"]){let r=St(t[n]);if(r)return r}}}function Ct(e,t){return e instanceof O?e.detail:{operation:t,detail:e instanceof Error?e.message:String(e)}}function Rt(e,t=1e3){return e.length>t?`${e.slice(0,t)}...`:e}function Kr(e){let t=`${e.chatbi_message??""} ${e.detail??""}`;return/BI 登录失败|密码登录|sign-?in|login/i.test(t)?"login_failed":e.http_status===401||e.http_status===403||e.chatbi_code===401||e.chatbi_code===403?"permission_denied":/No static resource|not valid JSON/i.test(t)||e.http_status===404||e.http_status===405||e.chatbi_code===404||e.chatbi_code===405?"public_api_unreachable":"unknown"}function Wr(e,t){let n=t.trim().toLowerCase(),r,i=[];for(let s of e){let o=s.theme_name.trim().toLowerCase();o===n?r=s:o.includes(n)&&i.push(s)}if(r)return r.theme_id;if(i.length===1)return i[0].theme_id;throw i.length>1?new Error(`\u4E3B\u9898\u540D\u5339\u914D\u5230\u591A\u4E2A\u7ED3\u679C\uFF1A${t}`):new Error(`\u672A\u627E\u5230\u4E3B\u9898\uFF1A${t}`)}function Bt(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>typeof t<"u"))}function Yr(e){if([e.final_status,e.answer_status,e.query_status].some(Zr))throw new Error(`ChatBI query failed: ${Xr(e.query_context?.err_msg,e.query_context?.detail,e.query_context?.msg,e.answer_context?.detail,e.answer_context?.msg,"unknown failure")}`);if(!e.answer?.explain?.trim()&&!(e.query_result?.columns?.length||e.query_result?.preview?.length))throw new Error("ChatBI response missing query content")}function Xr(...e){return e.find(t=>typeof t=="string"&&t.trim())?.trim()}function Zr(e){return typeof e=="string"&&e.trim().toLowerCase()==="failure"}function Et(e){let t=e-Date.now();if(t<=0)throw new Error("Insight request timed out");return t}async function ei(e,t,n){let r=e-Date.now();if(r<=0)throw new Error(`Insight request timed out after ${n}ms`);await new Promise(i=>setTimeout(i,Math.min(t,r)))}var ne="8.2.0",Me=["search_metrics","list_metric_catalog","get_metric_detail","query_metric_data","search_metric_trees","get_metric_tree_detail","query_metric_tree_attribution"],ti=["get_bi_capabilities","global_search",...Me,"execute_sql_query","get_dataset_detail","get_card_info","query_card_data","get_page_info"],ni=6e4,ri="PAT \u6A21\u5F0F\u4EC5\u652F\u6301\u666E\u901A BI \u63A5\u53E3\uFF0C\u4E0D\u652F\u6301 ChatBI public-api\u3002",xe=new WeakMap;async function re(e,t){let n=xe.get(e);return(!n||n.expiresAt<=Date.now())&&xe.set(e,{expiresAt:Date.now()+ni,promise:si(e,t).catch(r=>ii(r,t))}),xe.get(e).promise}function kt(e){let t=!e.BI_BASE_URL,n="HTTP \u6A21\u5F0F\u4E0B execute_sql_query \u4F1A\u5728\u8C03\u7528\u65F6\u4F7F\u7528\u5F53\u524D\u7528\u6237 token \u5224\u65AD BI \u7248\u672C/\u80FD\u529B\u3002",r="HTTP \u6A21\u5F0F\u542F\u52A8\u671F\u5C1A\u672A\u89E3\u6790\u8BF7\u6C42\u8C03\u7528\u8005\u3002";return{ok:!t,error:t?"\u914D\u7F6E\u4E0D\u5B8C\u6574\uFF1A\u7F3A\u5C11 BI_BASE_URL\u3002":void 0,versionSource:"api",dataVersion:e.BI_DATA_VERSION,service:Ue(e,t?["get_bi_capabilities"]:De(e)),caller:{ok:!1,error:r,features:{executeSqlQuery:{enabled:!1,minVersion:ne,reason:r}},chatbi:Q(e,r)},features:{executeSqlQuery:{enabled:!t,minVersion:ne,reason:t?"\u914D\u7F6E\u4E0D\u5B8C\u6574\uFF1A\u7F3A\u5C11 BI_BASE_URL\u3002":n}},metricPlatform:{registeredTools:t?[]:Me,readOnly:!0,lastError:t?"\u914D\u7F6E\u4E0D\u5B8C\u6574\uFF1A\u7F3A\u5C11 BI_BASE_URL\u3002":void 0},chatbi:Q(e,"HTTP \u6A21\u5F0F\u542F\u52A8\u671F\u4E0D\u4F7F\u7528\u67D0\u4E2A\u7528\u6237 token \u63A2\u6D4B ChatBI \u80FD\u529B\u3002")}}async function Pt(e,t,n){let i=(await re(e,t)).features[n];if(!i.enabled)throw new Error(`\u5F53\u524D BI \u73AF\u5883\u4E0D\u652F\u6301 ${n}\uFF1A${i.reason??"\u80FD\u529B\u672A\u542F\u7528"}`)}function ii(e,t){let n=e instanceof Error?e.message:String(e);return{ok:!1,error:n,versionSource:"api",features:{executeSqlQuery:{enabled:!1,minVersion:ne,reason:`\u65E0\u6CD5\u786E\u8BA4 BI \u80FD\u529B\uFF1A${n}`}},metricPlatform:{registeredTools:[],readOnly:!0,lastError:n},chatbi:Q(t,n),service:Ue(t,De(t)),caller:{ok:!1,error:n,features:{executeSqlQuery:{enabled:!1,minVersion:ne,reason:`\u65E0\u6CD5\u786E\u8BA4 BI \u80FD\u529B\uFF1A${n}`}},chatbi:Q(t,n)}}}async function si(e,t){let n=ai(t);if(n.length)throw new Error(`\u914D\u7F6E\u4E0D\u5B8C\u6574\uFF1A${n.join("\uFF1B")}\u3002`);let r=t.BI_DATA_VERSION?"env":"api",i=t.BI_DATA_VERSION?{dataVersion:t.BI_DATA_VERSION,capabilityVersion:t.BI_DATA_VERSION}:await ci(e),s=ui(i.capabilityVersion,ne),o=await oi(t);return{ok:!0,appVersion:i.appVersion,dataVersion:i.dataVersion,versionSource:r,service:Ue(t,De(t)),caller:{ok:!0,features:{executeSqlQuery:s},chatbi:o},features:{executeSqlQuery:s},metricPlatform:{registeredTools:Me,readOnly:!0},chatbi:o}}function De(e){let t=new Set(ti);if(!e.BI_PAT&&(le(e)||e.MCP_TRANSPORT==="streamable-http"))for(let n of new v(e).getRegisteredTools())t.add(n);return[...t]}function Ue(e,t){return{mode:e.MCP_TRANSPORT??"stdio",toolList:t,boundBISite:{configured:!!e.BI_BASE_URL,baseUrl:e.BI_BASE_URL,publicPath:e.BI_PUBLIC_PATH}}}async function oi(e){if(e.BI_PAT)return Q(e,ri);let t=new v(e);return le(e)?t.probe():Q(e,"\u7F3A\u5C11 BI_BASE_URL \u6216\u9274\u6743\u914D\u7F6E\u3002")}function Q(e,t){return{available:!1,registeredTools:e.BI_PAT||!le(e)?[]:new v(e).getRegisteredTools(),failureType:"unknown",triedBaseUrls:[],lastError:{operation:"probe",chatbi_message:t,detail:t}}}function ai(e){let t=[];if(e.BI_BASE_URL||t.push("\u7F3A\u5C11 BI_BASE_URL"),!e.BI_PAT&&!e.BI_UID_TOKEN){let n=[["BI_LOGIN_DOMAIN",e.BI_LOGIN_DOMAIN],["BI_LOGIN_ID",e.BI_LOGIN_ID],["BI_LOGIN_PASSWORD",e.BI_LOGIN_PASSWORD]].filter(([,r])=>!r).map(([r])=>r);n.length&&t.push(`\u7F3A\u5C11\u9274\u6743\u914D\u7F6E\uFF1A\u8BF7\u914D\u7F6E BI_PAT\u3001BI_UID_TOKEN\uFF0C\u6216\u8865\u5168\u8D26\u53F7\u5BC6\u7801\u767B\u5F55\u914D\u7F6E\uFF08\u7F3A\u5C11 ${n.join("\u3001")}\uFF09`)}return t}async function ci(e){let t=await e.get("/api/server-version"),n=At(t.version),r=At(t.dataVersion)??n;if(!r)throw new Error("BI \u7248\u672C\u63A5\u53E3\u672A\u8FD4\u56DE version \u6216 dataVersion\u3002");return{appVersion:n,dataVersion:r,capabilityVersion:r}}function ui(e,t){let n=Ot(e),r=Ot(t);if(!r)throw new Error(`\u5185\u90E8\u914D\u7F6E\u9519\u8BEF\uFF1A\u65E0\u6CD5\u89E3\u6790\u6700\u4F4E\u7248\u672C ${t}\u3002`);if(!n)return{enabled:!1,minVersion:t,reason:`\u65E0\u6CD5\u4ECE\u7248\u672C\u5B57\u7B26\u4E32 "${e}" \u4E2D\u89E3\u6790\u4EA7\u54C1\u7248\u672C\uFF0C\u8BF7\u914D\u7F6E BI_DATA_VERSION\u3002`};let i=di(n,r)>=0;return{enabled:i,minVersion:t,reason:i?void 0:`\u9700\u8981 BI ${t}+\uFF0C\u5F53\u524D\u7248\u672C\u4E3A ${e}\u3002`}}function Ot(e){let t=e.match(/(\d+)\.(\d+)\.(\d+)/);if(t)return[Number(t[1]),Number(t[2]),Number(t[3])]}function di(e,t){for(let n=0;n<e.length;n+=1){let r=e[n]-t[n];if(r!==0)return r}return 0}function At(e){return typeof e=="string"&&e.trim()?e.trim():void 0}var me=class{constructor(t){this.config=t}config;cache=new Map;async exchange(t){let n=vt(t),r=this.cache.get(this.cacheKey(n));if(r&&r.expiresAtMs>Date.now())return this.result(n,r.token,r.biExpireAt);let i=await this.fetchLoginIdToken(n);return this.cache.set(this.cacheKey(n),{token:i.token,expiresAtMs:this.resolveCacheExpiresAt(i.expireAt),biExpireAt:i.expireAt}),this.result(n,i.token,i.expireAt)}async exchangeUserProperty(t){let n=await this.fetchLoginIdByUserProperty(t);return this.exchange(n)}async refresh(t){return this.cache.delete(this.cacheKey(t)),(await this.exchange(t)).token}result(t,n,r){return{token:n,expireAt:r,refresh:()=>this.refresh(t)}}async fetchLoginIdByUserProperty(t){let n=li(t);if(!this.config.BI_BASE_URL)throw this.debugError("BI_BASE_URL is required for user property identity exchange.",{operation:"userPropertyLookup",request:{userPropertyValue:n}});if(!this.config.BI_APP_TOKEN)throw this.debugError("BI_APP_TOKEN is required for user property identity exchange.",{operation:"userPropertyLookup",request:{userPropertyValue:n}});let r=this.config.BI_USER_PROPERTY_KEY?.trim();if(!r)throw this.debugError("BI_USER_PROPERTY_KEY is required for user property identity exchange.",{operation:"userPropertyLookup",request:{userPropertyValue:n}});let i=this.buildUrl("/public-api/user/properties/list"),s={token:this.config.BI_APP_TOKEN,userPropertyKey:r,userPropertyValue:n,enabled:!0,offset:0,limit:2},o;try{o=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json","raw-backend-response":"TRUE"},body:JSON.stringify(s),signal:AbortSignal.timeout(this.config.BI_REQUEST_TIMEOUT_MS)})}catch(p){throw this.debugError(`BI user property lookup request failed: ${p instanceof Error?p.message:String(p)}`,{operation:"userPropertyLookup",request:{method:"POST",url:i,body:s},error:p instanceof Error?p.message:String(p)},[this.config.BI_APP_TOKEN])}let a=await o.text(),c=xt(a);if(!o.ok||Mt(c))throw this.debugError(`BI user property lookup failed: HTTP ${o.status} ${je(a,[this.config.BI_APP_TOKEN,r,n])}`,{operation:"userPropertyLookup",request:{method:"POST",url:i,body:s},response:{status:o.status,body:a}},[this.config.BI_APP_TOKEN]);let u=c?.response?.list??[],d=c?.response?.total??u.length;if(d!==1||u.length!==1)throw this.debugError(`BI user property lookup must match exactly one user: matched ${d} user(s) for ${r}.`,{operation:"userPropertyLookup",request:{method:"POST",url:i,body:s},response:{status:o.status,total:d,listCount:u.length,matchedLoginIds:u.map(p=>p.loginId).filter(Boolean)}},[this.config.BI_APP_TOKEN]);return vt(u[0]?.loginId??"")}async fetchLoginIdToken(t){if(!this.config.BI_BASE_URL)throw this.debugError("BI_BASE_URL is required for loginId identity exchange.",{operation:"loginIdSignIn",request:{loginId:t}});if(!this.config.BI_APP_TOKEN)throw this.debugError("BI_APP_TOKEN is required for loginId identity exchange.",{operation:"loginIdSignIn",request:{loginId:t}});let n=this.buildUrl("/public-api/user/loginId/sign-in"),r={token:this.config.BI_APP_TOKEN,loginId:t},i;try{i=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json","raw-backend-response":"TRUE"},body:JSON.stringify(r),signal:AbortSignal.timeout(this.config.BI_REQUEST_TIMEOUT_MS)})}catch(c){throw this.debugError(`BI loginId token exchange request failed: ${c instanceof Error?c.message:String(c)}`,{operation:"loginIdSignIn",request:{method:"POST",url:n,body:r},error:c instanceof Error?c.message:String(c)},[this.config.BI_APP_TOKEN])}let s=await i.text(),o=xt(s),a=o?.response?.token?.trim();if(!i.ok||Mt(o)||!a)throw this.debugError(`BI loginId token exchange failed: HTTP ${i.status} ${je(s,[this.config.BI_APP_TOKEN,a,t])}`,{operation:"loginIdSignIn",request:{method:"POST",url:n,body:r},response:{status:i.status,body:s}},[this.config.BI_APP_TOKEN,a]);return{token:a,expireAt:o?.response?.expireAt}}buildUrl(t){let n=t.startsWith("/")?t:`/${t}`;return`${this.config.BI_BASE_URL}${this.config.BI_PUBLIC_PATH}${n}`}cacheKey(t){return`${this.config.BI_BASE_URL??""}${this.config.BI_PUBLIC_PATH}\0${t}`}resolveCacheExpiresAt(t){let n=Date.now()+this.config.BI_IDENTITY_TOKEN_CACHE_TTL_MS,r=pi(t);return r?Math.min(n,r):n}debugError(t,n,r=[]){if(!fi(this.config))return new Error(t);let i=Ne(n,[this.config.BI_APP_TOKEN,...r]);return console.error(JSON.stringify({identityExchangeDebug:i})),new Error(`${t}
3
- identity_debug=${JSON.stringify(i,null,2)}`)}};function vt(e){let t=e.trim();if(!t)throw new Error("GuanBI loginId is required for loginId identity exchange.");return t}function li(e){let t=e.trim();if(!t)throw new Error("BI user property value is required for user property identity exchange.");return t}function xt(e){if(e.trim())try{return JSON.parse(e)}catch{return}}function Mt(e){return!e||e.result&&!["ok","success"].includes(e.result.toLowerCase())?!0:e.success===!1}function pi(e){if(!e)return;let t=e.replace(" ","T"),n=Date.parse(t);return Number.isFinite(n)?n:void 0}function je(e,t){let n=t.filter(r=>!!r).reduce((r,i)=>r.split(i).join("[redacted]"),e);return gi(n)}function Ne(e,t){let n=t.filter(r=>!!r);return typeof e=="string"?je(e,n):Array.isArray(e)?e.map(r=>Ne(r,n)):!e||typeof e!="object"?e:Object.fromEntries(Object.entries(e).map(([r,i])=>[r,mi(r)?"[redacted]":Ne(i,n)]))}function mi(e){return["token","authorization","cookie","uidtoken","uIdToken".toLowerCase()].includes(e.toLowerCase())}function fi(e){return["1","true","yes","on"].includes(e.BI_IDENTITY_DEBUG?.trim().toLowerCase()??"")}function gi(e,t=1e3){return e.length>t?`${e.slice(0,t)}\u2026`:e}var Y="x-personal-token";function _i(e){return{transport:"stdio",...e.BI_PAT?{biPatToken:e.BI_PAT}:{},biUidToken:e.BI_UID_TOKEN,audit:{}}}function Ut(e){return{resolve:()=>_i(e)}}function fe(e){let t=ie(e);if(t)return{transport:"streamable-http",biPatToken:t,audit:K(e)};let n=j(e,"x-guanbi-uid-token")?.trim();if(!n)throw new Error("\u7F3A\u5C11 GuanBI \u7528\u6237\u4EE4\u724C\uFF1A\u8BF7\u901A\u8FC7 X-GuanBI-Uid-Token \u4F20\u5165\u5F53\u524D\u7528\u6237 uIdToken\u3002");return{transport:"streamable-http",biUidToken:n,audit:K(e)}}function jt(e,t={}){let n=e?new me(e):void 0,r=t.exchangeLoginId??t.exchange??(n?n.exchange.bind(n):void 0),i=t.exchangeUserProperty??(n?n.exchangeUserProperty.bind(n):void 0);return{resolve:async s=>{if(!s?.requestInfo?.headers)return e?.BI_PAT?{transport:"streamable-http",biPatToken:e.BI_PAT,audit:{}}:{transport:"streamable-http",audit:{}};let o=s.requestInfo.headers,a=ie(o);if(a)return{transport:"streamable-http",biPatToken:a,audit:K(o)};if(e?.BI_PAT)return{transport:"streamable-http",biPatToken:e.BI_PAT,audit:K(o)};if(j(o,"x-guanbi-uid-token")?.trim()||!e)return fe(o);let u=e.BI_LOGIN_ID_HEADER,d=u?W(j(o,u)):void 0;if(d){let I=await r?.(d);return I?{transport:"streamable-http",biUidToken:I.token,biUidTokenRefresh:I.refresh,loginId:d,audit:K(o)}:fe(o)}let p=e.BI_USER_PROPERTY_HEADER,_=p?W(j(o,p)):void 0;if(_){let I=await i?.(_);return I?{transport:"streamable-http",biUidToken:I.token,biUidTokenRefresh:I.refresh,audit:K(o)}:fe(o)}throw hi(o,e)}}}function ie(e){return W(j(e,Y))}function j(e,t){if(e instanceof Headers)return e.get(t)??void 0;let n=e.get;if(typeof n=="function")return n.call(e,t)??void 0;let r=t.toLowerCase();for(let[i,s]of Object.entries(e))if(i.toLowerCase()===r)return Array.isArray(s)?s[0]:s}function W(e){return e?.trim()||void 0}function K(e){return{tenantId:W(j(e,"x-tenant-id")),endUserId:W(j(e,"x-end-user-id")),traceId:W(j(e,"x-trace-id"))}}function hi(e,t){let n="\u7F3A\u5C11 GuanBI \u7528\u6237\u4EE4\u724C\uFF1A\u8BF7\u901A\u8FC7 X-GuanBI-Uid-Token \u4F20\u5165\u5F53\u524D\u7528\u6237 uIdToken\u3002";if(!Ci(t))return new Error(n);let r={operation:"resolveHttpCallerContext",expectedIdentityHeaders:Ii(e,t),receivedHeaderNames:bi(e),receivedIdentityLikeHeaders:Dt(Object.fromEntries(Le(e).filter(([i])=>Ti(i.toLowerCase()))),[Y,"x-guanbi-uid-token",t.BI_LOGIN_ID_HEADER,t.BI_USER_PROPERTY_HEADER]),receivedHeaders:Dt(e,[Y,"x-guanbi-uid-token",t.BI_LOGIN_ID_HEADER,t.BI_USER_PROPERTY_HEADER])};return console.error(JSON.stringify({identityExchangeDebug:r})),new Error(`${n}
4
- identity_debug=${JSON.stringify(r,null,2)}`)}function Ii(e,t){return[{source:"pat",name:Y,present:ge(e,Y)},{source:"uidToken",name:"x-guanbi-uid-token",present:ge(e,"x-guanbi-uid-token")},...t.BI_LOGIN_ID_HEADER?[{source:"loginId",name:t.BI_LOGIN_ID_HEADER,present:ge(e,t.BI_LOGIN_ID_HEADER)}]:[],...t.BI_USER_PROPERTY_HEADER?[{source:"userProperty",name:t.BI_USER_PROPERTY_HEADER,present:ge(e,t.BI_USER_PROPERTY_HEADER),userPropertyKey:t.BI_USER_PROPERTY_KEY}]:[]]}function ge(e,t){return j(e,t)!==void 0}function bi(e){return[...new Set(Le(e).map(([t])=>t.toLowerCase()))].sort()}function Dt(e,t){let n=new Set(t.filter(r=>!!r).map(r=>r.toLowerCase()));return Object.fromEntries(Le(e).map(([r,i])=>{let s=r.toLowerCase();return yi(s)?[s,"<redacted>"]:[s,n.has(s)?i:"<present>"]}))}function Le(e){if(e instanceof Headers)return[...e.entries()];let t=e.entries;return typeof t=="function"?[...t.call(e)]:Object.entries(e).filter(([,n])=>n!==void 0).map(([n,r])=>[n,Array.isArray(r)?r.join(","):String(r)])}function yi(e){return["authorization","cookie","set-cookie","x-guanbi-uid-token",Y].includes(e)}function Ti(e){return e.startsWith("x-")||e.includes("auth")||e.includes("login")||e.includes("token")||e.includes("uid")||e.includes("user")}function Ci(e){return["1","true","yes","on"].includes(e.BI_IDENTITY_DEBUG?.trim().toLowerCase()??"")}import{AsyncLocalStorage as Bi}from"async_hooks";var X={client:"X-Guandata-Client",clientVersion:"X-Guandata-Client-Version",command:"X-Guandata-Command"},Ei=new Set(Object.values(X).map(e=>e.toLowerCase())),Nt=new Bi;function Lt(e,t){return Nt.run(e,t)}function wi(e,t="mcp"){e=Nt.getStore()??e;let n={};n[X.client]=e?.client.trim()||t.trim()||"mcp";let r=e?.clientVersion?.trim();r&&(n[X.clientVersion]=r);let i=e?.command?.trim();return i&&(n[X.command]=i),n}function qt(e,t,n="mcp"){let r=wi(t,n);return{...qe(e),...r}}function qe(e){return Object.fromEntries(Object.entries(e).filter(([t])=>!Ei.has(t.toLowerCase())))}var he=class{constructor(t){this.config=t;this.token=t.BI_UID_TOKEN}config;token;async get(t,n){return this.request("GET",t,void 0,n)}async post(t,n,r){return this.request("POST",t,n,r)}async put(t,n,r){return this.request("PUT",t,n,r)}async getText(t){if(this.config.BI_PAT){let s=await fetch(this.buildUrl(t),{method:"GET",headers:this.patHeaders(this.config.BI_PAT,{"raw-backend-response":"TRUE"}),signal:AbortSignal.timeout(this.config.BI_REQUEST_TIMEOUT_MS)}),o=await s.text();if(!s.ok)throw new Error(`BI \u8BF7\u6C42\u5931\u8D25\uFF1AGET ${t} HTTP ${s.status} ${_e(o)}`);return o}let n=await this.ensureToken(),r=await fetch(this.buildUrl(t),{method:"GET",headers:this.uidHeaders(n,{"raw-backend-response":"TRUE"}),signal:AbortSignal.timeout(this.config.BI_REQUEST_TIMEOUT_MS)});if(this.shouldRefreshToken(r)){let s=await this.refreshToken();r=await fetch(this.buildUrl(t),{method:"GET",headers:this.uidHeaders(s,{"raw-backend-response":"TRUE"}),signal:AbortSignal.timeout(this.config.BI_REQUEST_TIMEOUT_MS)})}let i=await r.text();if(!r.ok)throw new Error(`BI \u8BF7\u6C42\u5931\u8D25\uFF1AGET ${t} HTTP ${r.status} ${_e(i)}`);return this.refreshTokenFromResponse(r),i}async request(t,n,r,i){if(this.config.BI_PAT){let c=await this.fetchWithPat(t,n,this.config.BI_PAT,r,i),u=await c.text();if(!c.ok)throw new Error(`BI \u8BF7\u6C42\u5931\u8D25\uFF1A${t} ${n} HTTP ${c.status} ${_e(u)}`);return Gt(u)}let s=await this.ensureToken(),o=await this.fetchWithToken(t,n,s,r,i);if(this.shouldRefreshToken(o)){let c=await this.refreshToken();o=await this.fetchWithToken(t,n,c,r,i)}let a=await o.text();if(!o.ok)throw new Error(`BI \u8BF7\u6C42\u5931\u8D25\uFF1A${t} ${n} HTTP ${o.status} ${_e(a)}`);return this.refreshTokenFromResponse(o),Gt(a)}async fetchWithToken(t,n,r,i,s){return fetch(this.buildUrl(n),{method:t,headers:this.uidHeaders(r,{"Content-Type":"application/json","raw-backend-response":"TRUE",...s?.headers}),body:t==="POST"||t==="PUT"?JSON.stringify(i??{}):void 0,signal:AbortSignal.timeout(this.config.BI_REQUEST_TIMEOUT_MS)})}async fetchWithPat(t,n,r,i,s){return fetch(this.buildUrl(n),{method:t,headers:this.patHeaders(r,{"Content-Type":"application/json","raw-backend-response":"TRUE",...s?.headers}),body:t==="POST"||t==="PUT"?JSON.stringify(i??{}):void 0,signal:AbortSignal.timeout(this.config.BI_REQUEST_TIMEOUT_MS)})}async ensureToken(){if(this.token)return this.token;let t=await de(this.config);return this.token=t.token,t.token}async refreshToken(){if(this.config.BI_UID_TOKEN_REFRESH){let t=await this.config.BI_UID_TOKEN_REFRESH();return this.token=t,t}return this.token=void 0,this.ensureToken()}refreshTokenFromResponse(t){let n=Ri(t);!n||n===this.token||(this.token=n)}shouldRefreshToken(t){return(!!this.config.BI_UID_TOKEN_REFRESH||this.hasPasswordLogin())&&t.status===401}hasPasswordLogin(){return!!(this.config.BI_LOGIN_DOMAIN&&this.config.BI_LOGIN_ID&&this.config.BI_LOGIN_PASSWORD)}uidHeaders(t,n){return{...qe(n),Cookie:`uIdToken=${t}`}}patHeaders(t,n){return qt({...n,"X-Personal-Token":t},this.config.BI_REQUEST_METADATA,this.config.BI_PAT_CLIENT)}buildUrl(t){let n=t.startsWith("/")?t:`/${t}`;return`${this.config.BI_BASE_URL}${this.config.BI_PUBLIC_PATH}${n}`}};function Gt(e){if(!e)return;let t=JSON.parse(e);if(!Si(t))return t;if(t.result&&!["ok","success"].includes(t.result.toLowerCase()))throw new Error(`BI \u8FD4\u56DE\u9519\u8BEF\uFF1A${t.message??JSON.stringify(t.error??t)}`);if(t.success===!1)throw new Error(`BI \u8FD4\u56DE\u9519\u8BEF\uFF1A${t.message??JSON.stringify(t.error??t)}`);return"response"in t?t.response:t}function Si(e){return!e||typeof e!="object"||Array.isArray(e)?!1:"response"in e||"result"in e||"success"in e}function Ri(e){return Oi(e.headers)??ki(e.headers)}function Oi(e){return[...e.getSetCookie?.()??[],...Ai(e.get("set-cookie"))].map(n=>Ht(n.trim().match(/(?:^|;\s*)uIdToken=([^;]+)/)?.[1])).find(Boolean)}function Ai(e){return e?e.split(/,(?=\s*[^;,]+=)/):[]}function ki(e){return Ht(e.get("x-auth-token"))}function Ht(e){if(typeof e!="string")return;let t=e.trim();return t&&!/\s/.test(t)?t:void 0}function _e(e,t=1e3){return e.length>t?`${e.slice(0,t)}...`:e}var Ie=class{constructor(t,n={}){this.baseConfig=t;this.options=n}baseConfig;options;stdioClient;create(t,n){let r=this.resolveRequestMetadata(n);if(t.transport==="stdio"&&this.stdioClient)return{...this.stdioClient,config:{...this.stdioClient.config,BI_REQUEST_METADATA:r}};let i=this.resolveConfig(t,t.transport==="stdio"?this.resolveRequestMetadata(void 0):r),s={client:this.options.clientFactory?.(i)??new he(i),config:{...i,BI_REQUEST_METADATA:r},context:t};return t.transport==="stdio"&&(this.stdioClient={...s,config:i}),s}resolveConfig(t,n){let r=t.biPatToken??this.baseConfig.BI_PAT,i=t.biUidToken??(t.transport==="stdio"?this.baseConfig.BI_UID_TOKEN:void 0),s=!!r;return{...this.baseConfig,BI_PAT:r,BI_UID_TOKEN:s?void 0:i,BI_UID_TOKEN_REFRESH:!s&&t.transport==="streamable-http"?t.biUidTokenRefresh:void 0,BI_LOGIN_DOMAIN:!s&&t.transport==="stdio"?this.baseConfig.BI_LOGIN_DOMAIN:"",BI_LOGIN_ID:!s&&t.transport==="stdio"?this.baseConfig.BI_LOGIN_ID:void 0,BI_LOGIN_PASSWORD:!s&&t.transport==="stdio"?this.baseConfig.BI_LOGIN_PASSWORD:void 0,BI_REQUEST_METADATA:n}}resolveRequestMetadata(t){let n=this.options.requestMetadata;if(n)return t?{...n,command:t}:{...n}}};var Jt={endpoint:"https://www.google-analytics.com/mp/collect",measurementId:"G-800H8JWDPP",apiSecret:"poAwpMEhQteDl1rXKtNIqg",eventName:"guanbi_mcp_tool_call",clientId:"0000000000.0000000000",sessionId:1,engagementTimeMsec:1,timeoutMs:3e3,maxResponseBytes:1024},be=class{serviceDomain;appVersion;enabled;sender;now;constructor({config:t,appVersion:n,sender:r=xi(),now:i=Date.now}){this.serviceDomain=Di(t.BI_BASE_URL),this.appVersion=n,this.enabled=Mi(t),this.sender=r,this.now=i}observeToolCallStart(t){return{toolName:t,startedAtMs:this.now()}}observeToolCallEnd(t,n){if(!this.enabled||!this.serviceDomain)return;let r={service_domain:this.serviceDomain,app_version:this.appVersion,tool:t.toolName,success:n.success,duration_ms_bucket:Ui(this.now()-t.startedAtMs),error_type:n.success?"none":Ni(n.error)};try{Promise.resolve(this.sender(r)).catch(()=>{})}catch{}}};function Pi(e=Jt){return t=>vi(t,e)}async function vi(e,t=Jt){try{if(!t.endpoint||!t.measurementId||!t.apiSecret||!e.tool)return;let n=new URL(t.endpoint);n.searchParams.set("measurement_id",t.measurementId),n.searchParams.set("api_secret",t.apiSecret);let r=JSON.stringify({client_id:t.clientId,events:[{name:t.eventName,params:{service_domain:e.service_domain,app_version:e.app_version,tool:e.tool,success:e.success,duration_ms_bucket:e.duration_ms_bucket,error_type:e.error_type,session_id:t.sessionId,engagement_time_msec:t.engagementTimeMsec}}]}),i=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:r,signal:AbortSignal.timeout(t.timeoutMs)});await ji(i,t.maxResponseBytes)}catch{}}function xi(){return Li(process.env)?()=>{}:Pi()}function Mi(e){let t=e.GUANBI_MCP_USAGE_STATS?.trim().toLowerCase();return t?["0","false","off","no"].includes(t)?!1:(["1","true","on","yes"].includes(t),!0):!0}function $t(e,t,n){return(async(...r)=>{let i=n.observeToolCallStart(e);try{let s=await t(...r);return n.observeToolCallEnd(i,{success:!0}),s}catch(s){throw n.observeToolCallEnd(i,{success:!1,error:s}),s}})}function Di(e){if(e)try{return new URL(e).hostname}catch{return}}function Ui(e){return e<1e3?"<1s":e<5e3?"1-5s":e<3e4?"5-30s":e<12e4?"30-120s":">120s"}async function ji(e,t){let n=e.body?.getReader();if(!n)return;let r=0;try{for(;r<t;){let{done:i,value:s}=await n.read();if(i)return;r+=s.byteLength}}finally{await n.cancel().catch(()=>{})}}function Ni(e){let t=e instanceof Error?e.message:String(e);return/校验|验证|validation|invalid|schema|zod/i.test(t)?"validation":/鉴权|登录|认证|unauthorized|unauthenticated|401|auth/i.test(t)?"auth":/权限|forbidden|permission|403/i.test(t)?"permission":/timeout|network|fetch|econn|enotfound|socket/i.test(t)?"network":/BI 请求失败|BI 返回错误|HTTP \d{3}/i.test(t)?"bi_error":"unknown"}function Li(e){return e.NODE_ENV==="test"||e.VITEST==="true"}var ye=class{constructor(t,n,r=new ue){this.callerContextResolver=t;this.clientFactory=n;this.auditLogger=r}callerContextResolver;clientFactory;auditLogger;async run(t,n,r){let i=Date.now(),s=await this.callerContextResolver.resolve(n),o=this.clientFactory.create(s,r);try{let a=await Lt(o.config.BI_REQUEST_METADATA,()=>t(o));if(r){let c=qi(a)?"error":"success";this.auditLogger.record(Pe(r,s,i,c,a))}return a}catch(a){throw r&&this.auditLogger.record(Pe(r,s,i,"error",a)),a}}};function qi(e){return!!(e&&typeof e=="object"&&e.isError===!0)}function M(e){return{content:[{type:"text",text:JSON.stringify(e,null,2)}]}}function B(e){let t=He(e);return{content:[{type:"text",text:JSON.stringify(t,null,2)}],structuredContent:t}}function q(e){let t=He(e);return{content:[{type:"text",text:JSON.stringify(t,null,2)}],isError:!0}}function Te(e,t,n={}){return q({status:"error",diagnostic:Ge(e,t,n)})}function Ge(e,t,n={}){let r=t instanceof Error?t.message:String(t),i=r.match(/BI 请求失败:(?<method>[A-Z]+) (?<path>\S+) HTTP (?<status>\d+)/);return He({operation:e,path:i?.groups?.path,status:i?.groups?.status?Number(i.groups.status):void 0,message:r,...n})}function He(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}var Ft={};async function Vt(e,t){return M(await re(e,t))}import{z as T}from"zod";var H=class extends Error{constructor(n,r){super(n.message,{cause:r});this.detail=n;this.name="MetricPlatformRequestError"}detail},D=class{constructor(t,n){this.client=t;this.config=n}client;config;contextHeadersPromise;listProjects(){return this.get("listProjects","/api/metric-platform/projects")}searchMetrics(t){let n=h({projectId:t.projectId,dirId:t.dirId,status:t.status,nameLike:t.keyword,subTypes:t.subTypes?.join(","),orderBy:t.orderBy});return this.post("searchMetrics","/api/metric-platform/metrics",n)}listMetricFullTree(t){return this.get("listMetricFullTree",$e("/api/metric-platform/metrics/full-tree",{projectId:t.projectId,nameLike:t.keyword}))}listMetricDirectoryTree(t){return this.get("listMetricDirectoryTree",$e("/api/directory/METRIC_PLATFORM/unauthorized-tree",{projectId:t}))}getMetricDetail(t){return this.get("getMetricDetail",`/api/metric-platform/metrics/${encodeURIComponent(t)}`)}getMetricLineage(t,n){return this.post("getMetricLineage",`/api/resource-atlas/${encodeURIComponent(t)}`,{resourceTypeName:n})}queryMetricData(t){let{metricId:n,metricName:r,...i}=t;return this.post("queryMetricData","/api/metric-platform/metric-data/v2",h(i))}getCardEditSession(t){return this.get("getCardEditSession",`/api/card/${encodeURIComponent(t)}/edit/session`)}getCardEditMeta(t){return this.get("getCardEditMeta",`/api/card/${encodeURIComponent(t)}/edit`)}modifyCardEditMeta(t,n,r){return this.put("modifyCardEditMeta",`/api/oriput/card/${encodeURIComponent(t)}/edit/${encodeURIComponent(n)}/modify`,r)}queryCardEditData(t,n,r){return this.post("queryCardEditData",`/api/card/${encodeURIComponent(t)}/edit/${encodeURIComponent(n)}/data`,r)}searchMetricTrees(t){return this.get("searchMetricTrees",$e("/api/metric-platform/metric-tree/search",{nameLike:t.keyword,projectId:t.projectId,parentDirId:t.parentDirId,orderBy:t.orderBy}))}async getMetricTreeDetail(t){return this.get("getMetricTreeDetail",`/api/metric-platform/metric-tree/${encodeURIComponent(t)}`,await this.metricTreeHeaders(t,"dimension"))}async queryMetricTreeDrill(t,n){return this.post("queryMetricTreeDrill",`/api/metric-platform/metric-tree/${encodeURIComponent(t)}/drill`,n,await this.metricTreeHeaders(t,"dimension"))}async queryMetricTreeDecompose(t,n){return this.post("queryMetricTreeDecompose",`/api/metric-platform/metric-tree/${encodeURIComponent(t)}/metric-decompose`,n,await this.metricTreeHeaders(t,"metric"))}async put(t,n,r,i){try{return await this.client.put(n,r,i?{headers:i}:void 0)}catch(s){throw Je(t,n,s)}}async get(t,n,r){try{return await this.client.get(n,r?{headers:r}:void 0)}catch(i){throw Je(t,n,i)}}async post(t,n,r,i){try{return await this.client.post(n,r,i?{headers:i}:void 0)}catch(s){throw Je(t,n,s)}}async metricTreeHeaders(t,n){return{Referer:`${this.config.BI_BASE_URL??""}${this.config.BI_PUBLIC_PATH}/metrics-store/hierarchy/${encodeURIComponent(t)}/edit/${n}`,...await this.contextHeaders()}}async contextHeaders(){return this.contextHeadersPromise||(this.contextHeadersPromise=this.resolveContextHeaders()),this.contextHeadersPromise}async resolveContextHeaders(){let t={};if(this.config.BI_LOGIN_DOMAIN&&(t["x-dom-id"]=Z(this.config.BI_LOGIN_DOMAIN)),this.config.BI_LOGIN_ID&&(t["user-id"]=Z(this.config.BI_LOGIN_ID)),t["x-dom-id"]&&t["user-id"])return t;try{let n=await this.get("getUserProfile","/api/user/profile"),r=zt(n.domId,n.domainId,n.domain,n.dom_id),i=zt(n.email,n.loginId,n.userId,n.uId,n.uid);!t["x-dom-id"]&&r&&(t["x-dom-id"]=Z(r)),!t["user-id"]&&i&&(t["user-id"]=Z(i))}catch{}return t["x-dom-id"]||(t["x-dom-id"]=Z(this.config.BI_LOGIN_DOMAIN||"guanbi")),t["user-id"]||(t["user-id"]=Z(this.config.BI_LOGIN_ID||"unknown")),t}};function Je(e,t,n){let r=n instanceof Error?n.message:String(n),i=r.match(/\bHTTP\s+(\d{3})\b/);return new H({operation:e,path:t,status:i?Number(i[1]):void 0,message:r},n)}function $e(e,t){let n=new URLSearchParams;for(let[i,s]of Object.entries(t))s!==void 0&&s!==""&&n.set(i,s);let r=n.toString();return r?`${e}?${r}`:e}function h(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}function Z(e){return Buffer.from(e,"utf8").toString("base64")}function zt(...e){for(let t of e)if(typeof t=="string"&&t.trim())return t.trim()}var Gi=T.enum(["BT","CLOSE_BT_OPEN","OPEN_BT_CLOSE","OPEN_BT_OPEN","GT","GE","LT","LE","EQ","NE","IN","NI","IS_NULL","NOT_NULL","CONTAINS","NOT_CONTAINS","STARTSWITH","ENDSWITH","NOT_STARTSWITH","NOT_ENDSWITH","STARTSWITH_USER_PROPERTIES","STARTSWITH_GLOBAL_PARAMS"]),Qt=new Set(["BT","CLOSE_BT_OPEN","OPEN_BT_CLOSE","OPEN_BT_OPEN"]),Ve=new Set(["IS_NULL","NOT_NULL"]),Hi=T.object({field:T.string().min(1).describe("\u7B5B\u9009\u5B57\u6BB5\u540D\u79F0\u3001\u522B\u540D\u6216\u5B57\u6BB5 ID\u3002"),operator:Gi.describe("BI \u539F\u751F\u7B5B\u9009\u64CD\u4F5C\u7B26\uFF0C\u4F8B\u5982 EQ/NI/GE/BT/CONTAINS\u3002"),values:T.array(T.union([T.string(),T.number(),T.boolean()])).optional().describe("\u7B5B\u9009\u503C\u3002IS_NULL/NOT_NULL \u4E0D\u9700\u8981\u4F20\u503C\u3002"),fd_id:T.string().min(1).optional().describe("\u5DF2\u77E5\u5B57\u6BB5 ID \u65F6\u53EF\u76F4\u63A5\u6307\u5B9A\u3002")}).superRefine((e,t)=>{let n=e.values?.length??0;Ve.has(e.operator)&&n>0&&t.addIssue({code:T.ZodIssueCode.custom,path:["values"],message:`${e.operator} \u64CD\u4F5C\u7B26\u4E0D\u63A5\u53D7\u7B5B\u9009\u503C\u3002`}),Qt.has(e.operator)&&n!==2&&t.addIssue({code:T.ZodIssueCode.custom,path:["values"],message:`${e.operator} \u64CD\u4F5C\u7B26\u9700\u8981\u6070\u597D 2 \u4E2A\u503C\u3002`}),!Qt.has(e.operator)&&!Ve.has(e.operator)&&n<1&&t.addIssue({code:T.ZodIssueCode.custom,path:["values"],message:`${e.operator} \u64CD\u4F5C\u7B26\u81F3\u5C11\u9700\u8981 1 \u4E2A\u503C\u3002`})}),Xt={cd_id:T.string().min(1).describe("\u5361\u7247 ID\u3002"),filters:T.array(Hi).optional().describe("\u7ED3\u6784\u5316\u7B5B\u9009\u6761\u4EF6\u3002\u4E0D\u652F\u6301 CLI \u98CE\u683C\u7B5B\u9009\u5B57\u7B26\u4E32\u3002"),columns:T.array(T.string().min(1)).optional().describe("\u5BF9\u5DF2\u5C55\u5E73\u7ED3\u679C\u505A\u672C\u5730\u5217\u88C1\u526A\uFF0C\u4E0D\u53C2\u4E0E BI \u67E5\u8BE2\u8BED\u4E49\u3002"),limit:T.number().int().positive().max(1e4).optional().default(100).describe("\u6700\u591A\u8FD4\u56DE\u884C\u6570\uFF0C\u9ED8\u8BA4 100\uFF0C\u4E0A\u9650 10000\u3002"),raw:T.boolean().optional().describe("\u662F\u5426\u8FD4\u56DE\u539F\u59CB\u54CD\u5E94\u3002")},Zt={summary:T.unknown().optional(),columns:T.array(T.unknown()).optional(),rows:T.array(T.unknown()).optional(),diagnostic:T.unknown().optional(),raw:T.unknown().optional(),status:T.string().optional()};async function en(e,t){try{let n=t.limit??100,r=await e.get(`/api/card/${encodeURIComponent(t.cd_id)}`),i=Fi(r);if(i==="TEXT")return Ji(t.cd_id,r,t.columns,t.raw);let s=ts(t.filters??[],os(r),i);if("unsupported"in s)return $i("query_card_data",s.unsupported);let o=i==="CHART"?await zi(e,t.cd_id,n,s.filters):await Vi(e,tn(t.cd_id,i,n,s.filters)),{endpoint:a,requestBody:c}=o.requests[0],u=o.data,d=i==="CHART"?Ki(y(u.chartMain)):Zi(u),p=sn(d.slice(0,n),t.columns);return B({summary:h({cd_id:t.cd_id,card_type:i,chart_type:i==="CHART"?R(y(r.content).chartType):void 0,row_count:p.length,truncated:cs(i,u,p.length)}),columns:on(p),rows:p,diagnostic:{mode:Qi(i),card_type:i,endpoint:a,request_body:c,request_count:o.requests.length,request_bodies:o.requests.length>1?o.requests.map(_=>_.requestBody):void 0,raw_returned:t.raw===!0},raw:t.raw?o.raw:void 0})}catch(n){return q({status:"error",diagnostic:Ge("query_card_data",n)})}}function Ji(e,t,n,r){let i=y(t.content),s=es(i),o=sn(s?[{content:s}]:[],n);return B({summary:{cd_id:e,card_type:"TEXT",row_count:o.length,truncated:!1},columns:on(o),rows:o,diagnostic:{mode:"text_card_content",card_type:"TEXT",endpoint:`/api/card/${encodeURIComponent(e)}`,raw_returned:r===!0},raw:r?t:void 0})}function $i(e,t){return B({status:"unsupported",diagnostic:{tool:e,...t}})}function Fi(e){let t=R(e.cdType).toUpperCase();if(t==="SELECTOR"){let n=R(y(e.content).selectorType).toUpperCase();return n==="TREE"||n==="TREE_SELECTOR"?"TREE_SELECTOR":"SELECTOR"}return t==="TREE_SELECTOR"?"TREE_SELECTOR":t==="TEXT"?"TEXT":"CHART"}function tn(e,t,n,r,i=0){let s=encodeURIComponent(e);return t==="SELECTOR"?{endpoint:`/api/selector/${s}/data`,requestBody:h({fieldQuery:{offset:0,limit:n},filters:r.length?r:void 0})}:t==="TREE_SELECTOR"?{endpoint:`/api/treeSelector/${s}/data`,requestBody:h({limit:n,filters:r.length?r:void 0})}:{endpoint:`/api/card/${s}/data`,requestBody:h({view:"GRID",isUniversalStructure:!0,offset:i>0?i:void 0,limit:n,filters:r.length?r:void 0})}}async function Vi(e,t){let n=await e.post(t.endpoint,t.requestBody);return{raw:n,data:nn(n),requests:[t]}}async function zi(e,t,n,r){let s=[],o=[],a,c=0,u,d=!1,p=!1;for(;c<n;){let b=Math.min(1e3,n-c),S=tn(t,"CHART",b,r,c);s.push(S);let P=await e.post(S.endpoint,S.requestBody);o.push(P);let z=nn(P),te=y(z.chartMain);if(!Object.keys(te).length)return{raw:P,data:z,requests:s};a?Wi(y(a.chartMain),te):a=us(z);let ke=Yi(te);c+=ke,u=Ke(te.count)??u;let It=Qe(te.hasMoreData);if(p=It!==void 0,d=It??!1,ke===0||ke<b||u!==void 0&&c>=u||p&&!d)break}let _=a??{},I=y(_.chartMain);return Object.keys(I).length&&(I.offset=0,I.limit=n,I.hasMoreData=u!==void 0?c<u:d),{raw:o.length>1?{pages:o,merged:_}:o[0],data:_,requests:s}}function Qi(e){return e==="SELECTOR"?"selector_card_data":e==="TREE_SELECTOR"?"tree_selector_card_data":"chart_card_data"}function nn(e){let t=y(e),n=y(t.data),r=y(y(t.content).data);return Object.keys(n).length?n:Object.keys(r).length?r:t}function Ki(e){if(!Object.keys(e).length)return[];let t=y(e.row),n=y(e.column),r=k(t.data??t.values),i=k(e.data),s=se(t.fields??t.meta).map(ze).filter(Boolean),o=Xi(n),a=ds([...s,...o]),c=Math.max(r.length,i.length),u=[];for(let d=0;d<c;d+=1){let p=[];p.push(...k(r[d]).map(Yt)),p.push(...k(i[d]).map(Yt)),p.length&&u.push(Object.fromEntries(p.map((_,I)=>[a[I]??`column_${I+1}`,_])))}return u}function Wi(e,t){Fe(e,t,"data");let n=y(e.row),r=y(t.row);Fe(n,r,"data"),Fe(n,r,"values")}function Fe(e,t,n){let r=k(t[n]);r.length&&(e[n]=[...k(e[n]),...r])}function Yi(e){let t=k(e.data);if(t.length)return t.length;let n=y(e.row);return k(n.data).length||k(n.values).length}function Xi(e){let n=k(e.data??e.values).map((r,i)=>{let s=k(r).map(rn).filter(Boolean).join("/");return s||ze(se(e.fields??e.meta)[i])||`metric_${i+1}`}).filter(Boolean);return n.length?n:se(e.fields??e.meta).map(ze).filter(Boolean)}function Zi(e){return se(e.result)}function es(e){let n=k(y(e.body).blocks).map(r=>R(y(r).text)).filter(r=>r!=="");return n.length?n.join(`
5
- `):R(e.text)}function ts(e,t,n){let r=[];for(let i of e){let s=is(t,i.field,i.fd_id);if("unsupported"in s)return{unsupported:s.unsupported};r.push(h({name:s.field.name,fdId:s.field.fdId,fdType:s.field.fdType,filterLevel:n==="CHART"?rs(s.field.metaType):void 0,filterType:i.operator,filterValue:ns(i)}))}return{filters:r}}function ns(e){return Ve.has(e.operator)?[]:(e.values??[]).map(R)}function rs(e){return e.toUpperCase()==="METRIC"?"AGGREGATION":"DETAIL"}function is(e,t,n){let r=ss(e,t,n);if(!r)return{unsupported:{capability:"unsupported_filter_field",parameter:t,message:`\u7B5B\u9009\u5B57\u6BB5\u65E0\u6CD5\u4ECE\u5F53\u524D\u5361\u7247\u4E0A\u4E0B\u6587\u89E3\u6790\uFF1A${t}`,supported_fields:e.map(u=>h({name:R(u.name),fd_id:R(u.fd_id),meta_type:R(u.meta_type)}))}};let i=R(r.name),s=R(r.fd_id),o=R(r.fd_type),a=R(r.meta_type).toUpperCase(),c=[i?void 0:"name",s?void 0:"fdId",o?void 0:"fdType",a?void 0:"metaType"].filter(u=>!!u);return c.length?{unsupported:{capability:"unsupported_filter_field",parameter:t,message:`\u7B5B\u9009\u5B57\u6BB5\u7F3A\u5C11\u5FC5\u8981 BI \u5143\u4FE1\u606F\uFF1A${t}`,missing_metadata:c}}:{field:{name:i,fdId:s,fdType:o,metaType:a}}}function ss(e,t,n){if(n){let i=e.find(s=>R(s.fd_id)===n||R(s.id)===n);if(i)return i}let r=t.trim();return e.find(i=>[i.fd_id,i.id,i.name,i.alias].map(R).includes(r))}function os(e){let t=y(e.content),n=[],r=y(y(t.source).field);Object.keys(r).length&&n.push(Kt(r));let i=y(y(t.meta).chartMain),s=y(i.zoneData);for(let[o,a]of Object.entries(s))n.push(...se(a).map(c=>Kt(c,o)));return as(n)}function Kt(e,t){return h({name:N(e.name,e.title,e.originTitle,e.alias),alias:N(e.alias,e.title),id:R(e.id),fd_id:N(e.fdId,e.fd_id,e.id),fd_type:N(e.fdType,e.fd_type),meta_type:N(e.metaType,e.meta_type),zone_id:N(e.zoneId,e.zone_id,t)})}function as(e){let t=new Set;return e.filter(n=>{let r=N(n.fd_id,n.id,n.name,n.alias);return!r||t.has(r)?!1:(t.add(r),!0)})}function cs(e,t,n){if(e==="SELECTOR"||e==="TREE_SELECTOR")return Qe(t.exceedLimit)?!0:Wt(t,n);let r=y(t.chartMain);return Qe(r.hasMoreData)?!0:Wt(r,n)}function Wt(e,t){let n=Ke(e.count),r=Ke(e.limit);return n!==void 0&&r!==void 0&&r>0?n>r:n!==void 0&&n>t}function ze(e){return N(e.alias,e.title,e.originTitle,e.name,e.fdId,e.id)??""}function rn(e){let t=y(e);return Object.keys(t).length?N(t.title,t.name,t.originTitle,t.alias,t.v,t.value)??"":R(e)}function Yt(e){let t=y(e);return Object.keys(t).length?"v"in t?t.v:"value"in t?t.value:rn(e):e}function se(e){return Array.isArray(e)?e.map(y).filter(t=>Object.keys(t).length):[]}function k(e){return Array.isArray(e)?e:[]}function us(e){return JSON.parse(JSON.stringify(e))}function y(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function R(e){return typeof e=="string"?e:e==null?"":String(e)}function N(...e){return e.map(R).find(t=>t.trim())?.trim()}function Qe(e){return typeof e=="boolean"?e:void 0}function Ke(e){return typeof e=="number"&&Number.isFinite(e)?e:void 0}function sn(e,t){return t?.length?e.map(n=>Object.fromEntries(t.map(r=>[r,n[r]]))):e}function on(e){return[...new Set(e.flatMap(t=>Object.keys(t)))]}function ds(e){let t=new Map;return e.map((n,r)=>{let i=n||`column_${r+1}`,s=t.get(i)??0;return t.set(i,s+1),s?`${i}_${s+1}`:i})}import{createHash as ls}from"crypto";import{z as f}from"zod";var ps=6e4,J=1e4,an=10*6e4,Ce=new Map,Be=new Map,We=new Map,Ye=new Map,cn=f.object({format:f.literal("markdown").describe("\u6700\u7EC8\u7ED3\u679C\u683C\u5F0F\u3002"),content:f.string().describe("\u6700\u7EC8\u5C55\u793A\u7ED9\u8C03\u7528\u8005\u6216\u7528\u6237\u7684 markdown \u5185\u5BB9\u3002")}),un={themes:f.array(f.object({theme_id:f.string().optional(),theme_name:f.string().optional(),is_insight_enabled:f.boolean().optional()}).passthrough()),resolved_base_url:f.string().optional(),tried_base_urls:f.array(f.string()).optional()},dn={session_id:f.string().optional(),message_id:f.string().optional(),answer:f.unknown().optional().describe("ChatBI \u540E\u7AEF\u8FD4\u56DE\u7684\u95EE\u6570\u89E3\u91CA\u6216\u539F\u59CB\u7B54\u6848\u7ED3\u6784\u3002"),sql:f.unknown().optional().describe("ChatBI \u540E\u7AEF\u751F\u6210\u7684 SQL \u4FE1\u606F\u3002"),answer_status:f.string().optional(),final_status:f.string().optional(),query_result:f.unknown().optional().describe("ChatBI \u540E\u7AEF\u8FD4\u56DE\u7684\u7ED3\u6784\u5316\u67E5\u8BE2\u7ED3\u679C\uFF0C\u901A\u5E38\u5305\u542B columns\u3001preview\u3001truncated\u3001row_limit\u3002"),resolved_base_url:f.string().optional(),tried_base_urls:f.array(f.string()).optional()},ma={message_id:f.string().optional(),session_id:f.string().optional(),status:f.string(),detail:f.string().nullable().optional(),question:f.string().nullable().optional(),answer:f.unknown().optional(),final_result:cn.describe("\u6700\u7EC8\u5C55\u793A\u7ED3\u679C\uFF1B\u8C03\u7528\u65B9\u5E94\u4F18\u5148\u8BFB\u53D6 final_result.content\uFF0Canswer \u4EC5\u4FDD\u7559\u540E\u7AEF\u539F\u59CB\u7ED3\u679C\u3002"),resolved_base_url:f.string().optional(),tried_base_urls:f.array(f.string()).optional()},ln={theme_id:f.string().optional(),message_id:f.string().optional(),session_id:f.string().optional(),status:f.literal("started"),deduped:f.boolean(),retry_after_ms:f.number().int().nonnegative(),next_action:f.string().optional(),resolved_base_url:f.string().optional(),tried_base_urls:f.array(f.string()).optional()},pn={message_id:f.string().optional(),session_id:f.string().optional(),status:f.string(),detail:f.string().nullable().optional(),question:f.string().nullable().optional(),answer:f.unknown().optional(),throttled:f.boolean(),retry_after_ms:f.number().int().nonnegative(),final_result:cn.describe("\u6700\u7EC8\u5C55\u793A\u7ED3\u679C\uFF1B\u4EC5\u5728 status \u4E3A success \u65F6\u5B58\u5728\u3002\u8C03\u7528\u65B9\u5E94\u4F18\u5148\u8BFB\u53D6 final_result.content\uFF0Canswer \u4EC5\u4FDD\u7559\u540E\u7AEF\u539F\u59CB\u7ED3\u679C\u3002").optional(),next_action:f.string().optional(),resolved_base_url:f.string().optional(),tried_base_urls:f.array(f.string()).optional()},mn={is_insight:f.boolean().optional().describe("\u662F\u5426\u53EA\u5217\u51FA\u6D1E\u5BDF\u4E3B\u9898\u3002")},fn={theme_id:f.string().min(1).optional().describe("ChatBI \u4E3B\u9898 ID\u3002"),theme_name:f.string().min(1).optional().describe("ChatBI \u4E3B\u9898\u540D\u79F0\u3002"),message:f.string().min(1).describe("\u81EA\u7136\u8BED\u8A00\u95EE\u6570\u95EE\u9898\u3002"),session_id:f.string().min(1).optional().describe("\u53EF\u9009\u4F1A\u8BDD ID\uFF0C\u7528\u4E8E\u95EE\u6570\u7EED\u95EE\u3002\u540C\u4E00\u4E2A session_id \u53EA\u80FD\u7EE7\u7EED\u95EE\u6570\uFF0C\u4E0D\u80FD\u518D\u7528\u4E8E\u6D1E\u5BDF\u3002"),external_context:f.string().min(1).optional().describe("\u53EF\u9009\u5916\u90E8\u4E0A\u4E0B\u6587\u3002")},fa={theme_id:f.string().min(1).optional().describe("ChatBI \u4E3B\u9898 ID\u3002"),theme_name:f.string().min(1).optional().describe("ChatBI \u4E3B\u9898\u540D\u79F0\u3002"),message:f.string().min(1).describe("\u81EA\u7136\u8BED\u8A00\u6D1E\u5BDF\u95EE\u9898\u3002"),session_id:f.string().min(1).optional().describe("\u53EF\u9009\u4F1A\u8BDD ID\uFF0C\u7528\u4E8E\u6D1E\u5BDF\u7EED\u95EE\u3002\u540C\u4E00\u4E2A session_id \u53EA\u80FD\u7EE7\u7EED\u6D1E\u5BDF\uFF0C\u4E0D\u80FD\u518D\u7528\u4E8E\u95EE\u6570\u3002"),external_context:f.string().min(1).optional().describe("\u53EF\u9009\u5916\u90E8\u4E0A\u4E0B\u6587\u3002"),timeout_ms:f.number().int().positive().optional().describe("\u7B49\u5F85\u6D1E\u5BDF\u5B8C\u6210\u7684\u8D85\u65F6\u65F6\u95F4\uFF0C\u9ED8\u8BA4 300000ms\u3002"),poll_interval_ms:f.number().int().positive().optional().describe("\u8F6E\u8BE2\u95F4\u9694\uFF0C\u9ED8\u8BA4 2000ms\u3002")},gn={theme_id:f.string().min(1).optional().describe("ChatBI \u4E3B\u9898 ID\u3002"),theme_name:f.string().min(1).optional().describe("ChatBI \u4E3B\u9898\u540D\u79F0\u3002"),message:f.string().min(1).describe("\u81EA\u7136\u8BED\u8A00\u6D1E\u5BDF\u95EE\u9898\u3002\u6D1E\u5BDF\u901A\u5E38\u8017\u65F6 2-3 \u5206\u949F\uFF0C5 \u5206\u949F\u89C6\u4E3A\u8D85\u65F6\uFF1B\u540C\u4E00\u95EE\u9898\u53EA\u53D1\u8D77\u4E00\u6B21\u3002"),session_id:f.string().min(1).optional().describe("\u53EF\u9009\u4F1A\u8BDD ID\uFF0C\u7528\u4E8E\u6D1E\u5BDF\u7EED\u95EE\u3002\u540C\u4E00\u4E2A session_id \u53EA\u80FD\u7EE7\u7EED\u6D1E\u5BDF\uFF0C\u4E0D\u80FD\u518D\u7528\u4E8E\u95EE\u6570\u3002"),external_context:f.string().min(1).optional().describe("\u53EF\u9009\u5916\u90E8\u4E0A\u4E0B\u6587\u3002")},_n={theme_id:f.string().min(1).optional().describe("ChatBI \u4E3B\u9898 ID\u3002\u4F18\u5148\u4F7F\u7528 chatbi_insight_start \u8FD4\u56DE\u7684 theme_id\u3002"),theme_name:f.string().min(1).optional().describe("ChatBI \u4E3B\u9898\u540D\u79F0\uFF1B\u672A\u63D0\u4F9B theme_id \u65F6\u4F1A\u6309\u540D\u79F0\u67E5\u627E\u6D1E\u5BDF\u4E3B\u9898\u3002"),message_id:f.string().min(1).describe("chatbi_insight_start \u8FD4\u56DE\u7684\u6D88\u606F ID\u3002\u5EFA\u8BAE\u81F3\u5C11\u95F4\u9694 10 \u79D2\u67E5\u8BE2\u4E00\u6B21\uFF0C5 \u5206\u949F\u540E\u505C\u6B62\u7B49\u5F85\u3002")};async function hn(e,t){let n=new v(e);try{let r=await n.listThemes({isInsight:t.is_insight});return B({themes:r,resolved_base_url:n.getResolvedBaseUrl(),tried_base_urls:n.getTriedBaseUrls()})}catch(r){return we(n,r,"listThemes")}}async function In(e,t){let n=new v(e);try{let r=await n.query({themeId:t.theme_id,themeName:t.theme_name,message:t.message,sessionId:t.session_id,externalContext:t.external_context,fastMode:!0});return B({session_id:r.session_id,message_id:r.message_id,answer:r.answer,sql:r.sql,answer_status:r.answer_status,final_status:r.final_status,query_result:r.query_result,resolved_base_url:n.getResolvedBaseUrl(),tried_base_urls:n.getTriedBaseUrls()})}catch(r){return we(n,r,"query")}}async function bn(e,t){let n=new v(e);try{let r=Tn({caller_scope:Cn(e),theme_id:t.theme_id,theme_name:t.theme_name,message:t.message,session_id:t.session_id,external_context:t.external_context}),i=ms(r);if(i)return B({...i,deduped:!0,retry_after_ms:J,next_action:"\u540C\u4E00\u6D1E\u5BDF\u95EE\u9898\u521A\u521A\u5DF2\u7ECF\u53D1\u8D77\uFF0C\u5DF2\u590D\u7528\u5DF2\u6709 message_id\u3002\u8BF7\u4F7F\u7528 chatbi_insight_poll \u67E5\u8BE2\u7ED3\u679C\u3002"});let s=We.get(r);if(s){let c=await s;return B({...c,deduped:!0,retry_after_ms:J,next_action:"\u540C\u4E00\u6D1E\u5BDF\u95EE\u9898\u6B63\u5728\u53D1\u8D77\u4E2D\uFF0C\u5DF2\u590D\u7528\u5DF2\u6709\u8BF7\u6C42\u7ED3\u679C\u3002\u8BF7\u4F7F\u7528 chatbi_insight_poll \u67E5\u8BE2\u7ED3\u679C\u3002"})}let o=n.startInsight({themeId:t.theme_id,themeName:t.theme_name,message:t.message,sessionId:t.session_id,externalContext:t.external_context}).then(c=>{let u={theme_id:c.theme_id,message_id:c.message_id,session_id:c.session_id,status:"started"};return fs(r,u),u}).finally(()=>{We.delete(r)});We.set(r,o);let a=await o;return B({...a,deduped:!1,retry_after_ms:J,next_action:"\u6D1E\u5BDF\u4EFB\u52A1\u5DF2\u53D1\u8D77\u3002\u6D1E\u5BDF\u901A\u5E38\u8017\u65F6 2-3 \u5206\u949F\uFF0C\u8BF7\u4F7F\u7528 chatbi_insight_poll \u643A\u5E26 theme_id \u548C message_id \u67E5\u8BE2\u7ED3\u679C\uFF1B5 \u5206\u949F\u540E\u4ECD\u672A\u6210\u529F\u53EF\u89C6\u4E3A\u8D85\u65F6\u3002",resolved_base_url:n.getResolvedBaseUrl(),tried_base_urls:n.getTriedBaseUrls()})}catch(r){return we(n,r,"insight.start")}}async function yn(e,t){let n=new v(e);try{let r=Tn({caller_scope:Cn(e),message_id:t.message_id}),i=gs(r);if(i){let p=Xe(i.result),_=et(i.result,!0);return B({message_id:i.result.message_id,session_id:i.result.session_id,status:i.result.status,detail:Ze(i.result),question:i.result.question,answer:i.result.answer,throttled:!0,retry_after_ms:i.retryAfterMs,...p,next_action:_})}let s=Ye.get(r);if(s){let p=await s,_=nt(p.status),I=Xe(p),b=et(p,!0);return B({message_id:p.message_id,session_id:p.session_id,status:p.status,detail:Ze(p),question:p.question,answer:p.answer,throttled:!0,retry_after_ms:_?0:J,...I,next_action:b})}let o=n.pollInsight({themeId:t.theme_id,themeName:t.theme_name,messageId:t.message_id}).then(p=>(_s(r,p),p)).finally(()=>{Ye.delete(r)});Ye.set(r,o);let a=await o,c=nt(a.status),u=Xe(a),d=et(a,!1);return B({message_id:a.message_id,session_id:a.session_id,status:a.status,detail:Ze(a),question:a.question,answer:a.answer,throttled:!1,retry_after_ms:c?0:J,...u,next_action:d,resolved_base_url:n.getResolvedBaseUrl(),tried_base_urls:n.getTriedBaseUrls()})}catch(r){return we(n,r,"insight.poll")}}function Xe(e){return e.status!=="success"?{}:{final_result:{format:"markdown",content:Bn(e)}}}function Ze(e){return e.detail!=null?e.detail:e.status==="failure"||e.status==="stopped"?hs(e):e.detail}function et(e,t){if(e.status!=="success")return e.status==="waiting"?t?"\u540C\u4E00 message_id \u6B63\u5728\u67E5\u8BE2\u4E2D\u6216\u521A\u521A\u67E5\u8BE2\u8FC7\uFF0C\u5DF2\u8FD4\u56DE\u5DF2\u6709\u7ED3\u679C\uFF1B\u8BF7\u81F3\u5C11\u95F4\u9694 10 \u79D2\u518D\u67E5\u3002":"\u6D1E\u5BDF\u4EFB\u52A1\u4ECD\u5728\u6267\u884C\u4E2D\uFF0C\u8BF7\u7A0D\u540E\u7EE7\u7EED\u8C03\u7528 chatbi_insight_poll \u67E5\u8BE2\u7ED3\u679C\u3002":e.status==="failure"||e.status==="stopped"?"\u6D1E\u5BDF\u4EFB\u52A1\u672A\u6210\u529F\u5B8C\u6210\uFF0C\u8BF7\u67E5\u770B detail\uFF1B\u5982\u9700\u91CD\u8BD5\u8BF7\u91CD\u65B0\u8C03\u7528 chatbi_insight_start\u3002":"\u6D1E\u5BDF\u4EFB\u52A1\u5904\u4E8E\u975E\u6210\u529F\u72B6\u6001\uFF0C\u8BF7\u67E5\u770B status \u548C detail \u540E\u51B3\u5B9A\u662F\u5426\u7EE7\u7EED\u67E5\u8BE2\u3002"}function ms(e){Ee();let t=Ce.get(e);if(!(!t||Date.now()-t.createdAt>=ps))return t.result}function fs(e,t){Ee(),Ce.set(e,{createdAt:Date.now(),result:t})}function gs(e){Ee();let t=Be.get(e);if(!t)return;let n=Date.now()-t.checkedAt,r=nt(t.result.status);if(!(!r&&n>=J))return{result:t.result,retryAfterMs:r?0:Math.max(0,J-n)}}function nt(e){return e==="success"||e==="failure"||e==="stopped"}function _s(e,t){Ee(),Be.set(e,{checkedAt:Date.now(),result:t})}function Ee(){let e=Date.now();for(let[t,n]of Ce)e-n.createdAt>=an&&Ce.delete(t);for(let[t,n]of Be)e-n.checkedAt>=an&&Be.delete(t)}function Tn(e){return JSON.stringify(Object.keys(e).sort().reduce((t,n)=>{let r=e[n];return typeof r<"u"&&(t[n]=r),t},{}))}function Cn(e){return e.BI_PAT?`pat:${tt(e.BI_PAT)}`:e.BI_UID_TOKEN?`uid:${tt(e.BI_UID_TOKEN)}`:`login:${tt(`${e.BI_LOGIN_DOMAIN??""}\0${e.BI_LOGIN_ID??""}`)}`}function tt(e){return ls("sha256").update(e).digest("hex").slice(0,16)}function Bn(e){let t=e.answer?.trim();if(t)return Cs(t);let n=e.detail?.trim();return n||"\u5206\u6790\u5DF2\u5B8C\u6210\uFF0C\u4F46\u6CA1\u6709\u53EF\u5C55\u793A\u7684 markdown \u5185\u5BB9\u3002"}function hs(e){switch(e.status){case"success":return Bn(e);case"waiting":return"\u6D1E\u5BDF\u4EFB\u52A1\u4ECD\u5728\u6267\u884C\u4E2D\uFF0C\u8BF7\u7A0D\u540E\u7EE7\u7EED\u8C03\u7528 chatbi_insight_poll \u67E5\u8BE2\u7ED3\u679C\u3002";case"failure":case"stopped":return e.detail?.trim()||"\u6D1E\u5BDF\u4EFB\u52A1\u672A\u6210\u529F\u5B8C\u6210\u3002";default:return e.detail?.trim()||`\u6D1E\u5BDF\u4EFB\u52A1\u5F53\u524D\u72B6\u6001\uFF1A${e.status}`}}function Is(e,t){let n=[`| ${e.join(" | ")} |`,`|${e.map(()=>" --- ").join("|")}|`];for(let r of t)n.push(`| ${e.map((i,s)=>ys(bs(r[s]))).join(" | ")} |`);return n.join(`
6
- `)}function bs(e){return e===null||typeof e>"u"||e===""?"-":String(e)}function ys(e){return e.replaceAll(`\r
2
+ import"dotenv/config";import{createRequire as Uo}from"module";import{z as C}from"zod";var wr="http://guandata-web:8088",Sr=C.object({BI_BASE_URL:C.string().url().optional().default(wr),BI_PUBLIC_PATH:C.string().optional().default(""),BI_PAT:C.string().optional(),BI_PAT_CLIENT:C.string().optional(),BI_UID_TOKEN:C.string().optional(),BI_LOGIN_DOMAIN:C.string().optional().default("guanbi"),BI_LOGIN_ID:C.string().optional(),BI_LOGIN_PASSWORD:C.string().optional(),BI_APP_TOKEN:C.string().optional(),BI_LOGIN_ID_HEADER:C.string().optional(),BI_USER_PROPERTY_HEADER:C.string().optional(),BI_USER_PROPERTY_KEY:C.string().optional(),BI_IDENTITY_DEBUG:C.string().optional(),BI_IDENTITY_TOKEN_CACHE_TTL_MS:C.coerce.number().int().positive().default(6e5),BI_REQUEST_TIMEOUT_MS:C.coerce.number().int().positive().default(12e4),BI_MAX_ROWS:C.coerce.number().int().positive().default(1e3),BI_DATA_VERSION:C.string().optional(),GUANBI_MCP_USAGE_STATS:C.string().optional(),MCP_TRANSPORT:C.enum(["stdio","streamable-http"]).optional().default("stdio"),MCP_HTTP_HOST:C.string().optional().default("127.0.0.1"),MCP_HTTP_PORT:C.coerce.number().int().nonnegative().optional().default(9090),MCP_ENTRYPOINT_TOKEN:C.string().optional(),MCP_TRUSTED_GATEWAY:C.string().optional()});function Bt(e=process.env){let t=Sr.parse(e),n=t.MCP_TRANSPORT==="streamable-http";return{...t,BI_BASE_URL:t.BI_BASE_URL?.replace(/\/+$/,""),BI_PUBLIC_PATH:Rr(t.BI_PUBLIC_PATH),BI_PAT:n?void 0:t.BI_PAT?.trim()||void 0,BI_PAT_CLIENT:t.BI_PAT_CLIENT?.trim()||"mcp",BI_UID_TOKEN:t.BI_UID_TOKEN?.trim()||void 0,BI_LOGIN_DOMAIN:t.BI_LOGIN_DOMAIN?.trim()||"guanbi",BI_LOGIN_ID:t.BI_LOGIN_ID?.trim()||void 0,BI_LOGIN_PASSWORD:t.BI_LOGIN_PASSWORD?.trim()||void 0,BI_APP_TOKEN:t.BI_APP_TOKEN?.trim()||void 0,BI_LOGIN_ID_HEADER:t.BI_LOGIN_ID_HEADER===void 0?"x-guanbi-login-id":Ct(t.BI_LOGIN_ID_HEADER),BI_USER_PROPERTY_HEADER:Ct(t.BI_USER_PROPERTY_HEADER),BI_USER_PROPERTY_KEY:t.BI_USER_PROPERTY_KEY?.trim()||void 0,BI_IDENTITY_DEBUG:t.BI_IDENTITY_DEBUG?.trim()||void 0,BI_DATA_VERSION:t.BI_DATA_VERSION?.trim()||void 0,GUANBI_MCP_USAGE_STATS:t.GUANBI_MCP_USAGE_STATS?.trim()||void 0,MCP_ENTRYPOINT_TOKEN:t.MCP_ENTRYPOINT_TOKEN?.trim()||void 0,MCP_TRUSTED_GATEWAY:t.MCP_TRUSTED_GATEWAY?.trim()||void 0}}function Rr(e){let t=e?.trim().replace(/^\/+|\/+$/g,"")??"";return t?`/${t}`:""}function Ct(e){return e?.trim().toLowerCase()||void 0}import{createRequire as To}from"module";import{createHash as Co,randomUUID as Bo}from"crypto";import{createServer as Eo}from"http";import{McpServer as wo}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as So}from"@modelcontextprotocol/sdk/server/stdio.js";import{StreamableHTTPServerTransport as Ro}from"@modelcontextprotocol/sdk/server/streamableHttp.js";var ce=class{record(t){console.error(JSON.stringify({audit:Ar({...t})}))}},de=class{record(){}};function Me(e,t,n,r,i){return{transport:t.transport,tool:e,tenantId:t.audit.tenantId,endUserId:t.audit.endUserId,traceId:t.audit.traceId,status:r,durationMs:Math.max(0,Date.now()-n),failureType:r==="error"?Or(i):void 0}}function Or(e){return e instanceof Error?e.name||"Error":typeof e}function Ar(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}async function le(e){if(!e.BI_LOGIN_ID||!e.BI_LOGIN_PASSWORD||!e.BI_LOGIN_DOMAIN)throw new Error("\u5BC6\u7801\u767B\u5F55\u9700\u8981\u914D\u7F6E BI_LOGIN_DOMAIN\u3001BI_LOGIN_ID\u3001BI_LOGIN_PASSWORD\u3002");let t=await fetch(Pr(e,"/api/user/sign-in"),{method:"POST",headers:{"Content-Type":"application/json","raw-backend-response":"TRUE"},body:JSON.stringify({domain:e.BI_LOGIN_DOMAIN,loginId:e.BI_LOGIN_ID,password:Buffer.from(e.BI_LOGIN_PASSWORD,"utf8").toString("base64")}),signal:AbortSignal.timeout(e.BI_REQUEST_TIMEOUT_MS)}),n=await t.text();if(!t.ok)throw new Error(`BI \u767B\u5F55\u5931\u8D25\uFF1AHTTP ${t.status} ${Ur(n)}`);let r=kr(t,n);if(!r)throw new Error("BI \u767B\u5F55\u54CD\u5E94\u4E2D\u672A\u627E\u5230 X-Auth-Token/Authorization/uIdToken/authToken/token\u3002");return{token:r}}function Pr(e,t){return`${e.BI_BASE_URL}${e.BI_PUBLIC_PATH}${t}`}function kr(e,t){let n=vr(e.headers);if(n)return n;let r=xr(t);return r||Mr(e.headers)}function vr(e){let t=e.get("x-auth-token")?.trim();if(t)return t;let n=e.get("authorization")?.trim();return n&&(n.match(/^Bearer\s+(.+)$/i)?.[1]??n).trim()||void 0}function xr(e){try{let t=JSON.parse(e);return Et(t)??Et(jr(t.response))}catch{return}}function Mr(e){return[...e.getSetCookie?.()??[],...Dr(e.get("set-cookie"))].map(n=>n.trim().match(/(?:^|;\s*)uIdToken=([^;]+)/)?.[1]).find(Boolean)}function Dr(e){return e?e.split(/,(?=\s*[^;,]+=)/):[]}function Et(e){if(e)for(let t of["uIdToken","authToken","token"]){let n=e[t];if(typeof n=="string"&&n)return n}}function jr(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function Ur(e,t=500){return e.length>t?`${e.slice(0,t)}...`:e}var Nr="guanbi_mcp_chatbi",O=class extends Error{detail;retryableForBaseUrl;authExpired;constructor(t,n,r={}){super(t),this.name="ChatBIRequestError",this.detail=n,this.retryableForBaseUrl=!!r.retryableForBaseUrl,this.authExpired=!!r.authExpired}},v=class{constructor(t){this.config=t;this.token=t.BI_UID_TOKEN,this.candidates=t.BI_BASE_URL?Lr(`${t.BI_BASE_URL}${t.BI_PUBLIC_PATH}`):[]}config;token;resolvedBaseUrl;candidates;triedBaseUrls=new Set;lastError;loginPromise;refreshPromise;getRegisteredTools(){return["chatbi_list_themes","chatbi_query","chatbi_insight_start","chatbi_insight_poll"]}getResolvedBaseUrl(){return this.resolvedBaseUrl}getTriedBaseUrls(){return[...this.triedBaseUrls]}getLastError(){return this.lastError}async probe(){try{return await this.listThemes(),{available:!0,resolvedBaseUrl:this.resolvedBaseUrl,triedBaseUrls:this.getTriedBaseUrls(),registeredTools:this.getRegisteredTools()}}catch(t){let n=wt(t,"probe");return{available:!1,lastError:n,failureType:ei(n),triedBaseUrls:this.getTriedBaseUrls(),registeredTools:this.getRegisteredTools()}}}async listThemes(t={}){let n={filter_enable:!0,list_type:"CHAT"};return typeof t.isInsight=="boolean"&&(n.is_insight=t.isInsight),(await this.request("/theme/list-theme",{operation:"listThemes",body:n,retrySafeBaseUrlFallback:!0,validateResponse:Yr})).themes}async query(t){let n=await this.resolveThemeId(t.themeId,t.themeName,!1),r={attachments:[],theme_id:n,message:t.message,config:St({fast_mode:t.fastMode??!0,n_samples:t.nSamples})};t.sessionId&&(r.session_id=t.sessionId),t.externalContext&&(r.external_context=t.externalContext);let i=await this.request("/chat/send-message-sync",{operation:"query",body:r,includeDeviceId:!0});try{ni(i)}catch(s){throw this.operationError("query","/chat/send-message-sync",s)}return i}async insight(t){let n=t.timeoutMs??3e5,r=t.pollIntervalMs??2e3,i=Date.now()+n,s=await this.startInsight({...t,requestTimeoutMs:Rt(i)});if(!s.theme_id)throw this.operationError("insight.send","/chat/send-message","ChatBI insight response missing theme_id");if(!s.message_id?.trim())throw this.operationError("insight.send","/chat/send-message","ChatBI insight response missing message_id");for(;;){let o=await this.getAgentAnswer(s.theme_id,s.message_id,Rt(i));switch(o.message_id??=s.message_id,o.session_id??=s.session_id,o.status){case"success":return o;case"failure":case"stopped":throw this.operationError("insight.poll","/chat/get-agent-answer",o.detail?.trim()||"Insight request failed")}await si(i,r,n)}}async startInsight(t){let n=await this.resolveThemeId(t.themeId,t.themeName,!0),r={attachments:[],theme_id:n,message:t.message,is_insight:1};t.sessionId&&(r.session_id=t.sessionId),t.externalContext&&(r.external_context=t.externalContext);let i=St({analysis_expert_id:t.analysisExpertId,agent_mode:t.agentMode,analysis_confirmation_enabled:t.analysisConfirmationEnabled});Object.keys(i).length&&(r.config=i);let s=await this.request("/chat/send-message",{operation:"insight.send",body:r,includeDeviceId:!0,requestTimeoutMs:t.requestTimeoutMs});if(!s.message_id?.trim())throw this.operationError("insight.send","/chat/send-message","ChatBI insight response missing message_id");return s.theme_id=n,s}async pollInsight(t){let n=await this.resolveThemeId(t.themeId,t.themeName,!0),r=await this.getAgentAnswer(n,t.messageId,t.requestTimeoutMs);return r.message_id||(r.message_id=t.messageId),r}async getAgentAnswer(t,n,r){let i=new URLSearchParams({theme_id:t,message_id:n});try{return await this.request(`/chat/get-agent-answer?${i.toString()}`,{operation:"insight.poll",retrySafeBaseUrlFallback:!0,requestTimeoutMs:r})}catch(s){if(Qr(s))return{status:"waiting",message_id:n};throw s}}async resolveThemeId(t,n,r){let i=t?.trim();if(i)return i;let s=n?.trim();if(!s)throw new Error("\u7F3A\u5C11\u4E3B\u9898\u9009\u62E9\uFF0C\u8BF7\u4F20 theme_id \u6216 theme_name\u3002");let o=await this.listThemes({isInsight:r?!0:void 0});return ti(o,s)}async request(t,n){this.assertUsableConfig();let r=this.resolvedBaseUrl?[this.resolvedBaseUrl]:this.candidates,i;for(let s of r){this.triedBaseUrls.add(s);try{let o=await this.requestToBaseUrlWithAuthRetry(s,t,n);return n.validateResponse?.(o,{operation:n.operation,baseUrl:s,path:t}),this.resolvedBaseUrl=s,this.lastError=void 0,o}catch(o){if(i=o,this.lastError=wt(o,n.operation),!$r(o,n.retrySafeBaseUrlFallback))throw this.withTriedBaseUrls(o)}}throw this.withTriedBaseUrls(i??new Error("\u65E0\u6CD5\u5B9A\u4F4D ChatBI Public API\u3002"))}withTriedBaseUrls(t){return t instanceof O&&(t.detail.tried_base_urls=this.getTriedBaseUrls(),this.lastError=t.detail),t}operationError(t,n,r){let i=r instanceof Error?r.message:String(r);return new O(i,{operation:t,base_url:this.resolvedBaseUrl,path:n,chatbi_message:i,tried_base_urls:this.getTriedBaseUrls(),detail:i})}async requestToBaseUrlWithAuthRetry(t,n,r){if(this.config.BI_PAT)return this.requestToBaseUrl(t,n,{type:"pat",token:this.config.BI_PAT},r,{operation:r.operation,baseUrl:t,path:n});let i=await this.ensureToken(),s={operation:r.operation,baseUrl:t,path:n};try{return await this.requestToBaseUrl(t,n,{type:"uid",token:i},r,s)}catch(o){if(!Vr(o)||!this.canRefreshToken())throw o;let a=await this.refreshToken();return this.requestToBaseUrl(t,n,{type:"uid",token:a},r,{...s,tokenRefreshed:!0})}}async requestToBaseUrl(t,n,r,i,s){let o=i.body===void 0?"GET":"POST",a;try{a=await fetch(`${t}${n}`,{method:o,headers:qr(r,i),body:i.body===void 0?void 0:JSON.stringify(i.body),signal:AbortSignal.timeout(i.requestTimeoutMs??this.config.BI_REQUEST_TIMEOUT_MS)})}catch(d){throw new O(d instanceof Error?d.message:String(d),{operation:s.operation,base_url:s.baseUrl,path:s.path,token_refreshed:s.tokenRefreshed,detail:d instanceof Error?d.message:String(d)})}let u=await a.text(),c=Gr(u,a,s);if(!a.ok||Hr(c))throw Jr(c,u,a,s);return r.type==="uid"&&this.refreshTokenFromResponse(a,c),c.data}async ensureToken(){return this.token?this.token:(this.loginPromise??=this.signInForToken().finally(()=>{this.loginPromise=void 0}),this.loginPromise)}async refreshToken(){return this.refreshPromise??=this.refreshTokenOnce().finally(()=>{this.refreshPromise=void 0}),this.refreshPromise}async refreshTokenOnce(){if(this.config.BI_UID_TOKEN_REFRESH){let t=await this.config.BI_UID_TOKEN_REFRESH();return this.token=t,t}return this.signInForToken()}async signInForToken(){this.token=void 0;let t=await le(this.config);return this.token=t.token,t.token}refreshTokenFromResponse(t,n){let r=Xr(t,n);!r||r===this.token||(this.token=r)}hasPasswordLogin(){return!!(this.config.BI_LOGIN_DOMAIN&&this.config.BI_LOGIN_ID&&this.config.BI_LOGIN_PASSWORD)}canRefreshToken(){return!!this.config.BI_UID_TOKEN_REFRESH||this.hasPasswordLogin()}assertUsableConfig(){if(!this.config.BI_BASE_URL)throw new Error("\u7F3A\u5C11 BI_BASE_URL\uFF0C\u65E0\u6CD5\u63A8\u5BFC ChatBI Public API \u5730\u5740\u3002")}};function Lr(e){let t=new URL(e),n=[],r=s=>{let o=new URL(t.toString());o.pathname=s,o.search="",o.hash="";let a=o.toString().replace(/\/+$/,"");n.includes(a)||n.push(a)},i=t.pathname.replace(/\/+$/,"");return r("/api/chat/public-api"),i&&r(`${i}/api/chat/public-api`),r(i?`${i}/public-api`:"/public-api"),r("/public-api"),n}function pe(e){return e.BI_BASE_URL?e.BI_PAT||e.BI_UID_TOKEN?!0:!!(e.BI_LOGIN_DOMAIN&&e.BI_LOGIN_ID&&e.BI_LOGIN_PASSWORD):!1}function qr(e,t){let n={"User-Agent":"guanbi-mcp-server",...e.type==="pat"?{"X-Personal-Token":e.token}:{Cookie:`uIdToken=${e.token}`}};return t.body!==void 0&&(n["Content-Type"]="application/json"),t.includeDeviceId&&(n["Device-ID"]=Nr),n}function Gr(e,t,n){if(!e)return{};try{return JSON.parse(e)}catch{throw new O("ChatBI response is not valid JSON",{operation:n.operation,base_url:n.baseUrl,path:n.path,http_status:t.status,token_refreshed:n.tokenRefreshed,detail:Pt(e)},{retryableForBaseUrl:!0})}}function Hr(e){let t=Ot(e);return typeof t=="number"&&![0,200].includes(t)||e.result==="fail"||e.success===!1}function Jr(e,t,n,r){let i=Ot(e),s=Kr(e),o=s||t||`ChatBI request failed with status ${n.status}`,a={operation:r.operation,base_url:r.baseUrl,path:r.path,http_status:n.status,chatbi_code:i,chatbi_message:s,token_refreshed:r.tokenRefreshed,detail:Pt(t)},u=Wr(o),c=!u&&Fr(n.status,i);return new O(o,a,{authExpired:c,retryableForBaseUrl:u||zr(n.status,i)})}function $r(e,t){return!!(t&&e instanceof O&&e.retryableForBaseUrl)}function Vr(e){return e instanceof O&&e.authExpired}function Fr(e,t){return e===401||e===403||t===401||t===403||t===5001}function zr(e,t){return[401,403,404,405].includes(e)||typeof t=="number"&&[401,403,404,405].includes(t)}function Qr(e){return e instanceof O&&e.detail.http_status===200&&e.detail.chatbi_code===404&&e.detail.chatbi_message==="Message not found."}function Ot(e){if(typeof e.code=="number")return e.code;let t=me(e.error);return typeof t?.status=="number"?t.status:void 0}function Kr(e){if(typeof e.message=="string"&&e.message.trim())return e.message;let t=me(e.error);return typeof t?.message=="string"&&t.message.trim()?t.message:void 0}function Wr(e){return/No static resource/i.test(e)}function me(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function Yr(e,t){let n=me(e);if(!Array.isArray(n?.themes))throw new O("ChatBI list-theme response missing themes",{operation:t.operation,base_url:t.baseUrl,path:t.path,detail:"missing themes"},{retryableForBaseUrl:!0})}function Xr(e,t){let r=[...e.headers.getSetCookie?.()??[],...Zr(e.headers.get("set-cookie"))].map(s=>De(s.trim().match(/(?:^|;\s*)uIdToken=([^;]+)/)?.[1])).find(Boolean);if(r)return r;let i=De(e.headers.get("x-auth-token"));return i||At(t)}function Zr(e){return e?e.split(/,(?=\s*[^;,]+=)/):[]}function De(e){if(typeof e!="string")return;let t=e.trim();return t&&!/\s/.test(t)?t:void 0}function At(e){let t=me(e);if(t){for(let n of["uIdToken","authToken"]){let r=De(t[n]);if(r)return r}for(let n of["data","response"]){let r=At(t[n]);if(r)return r}}}function wt(e,t){return e instanceof O?e.detail:{operation:t,detail:e instanceof Error?e.message:String(e)}}function Pt(e,t=1e3){return e.length>t?`${e.slice(0,t)}...`:e}function ei(e){let t=`${e.chatbi_message??""} ${e.detail??""}`;return/BI 登录失败|密码登录|sign-?in|login/i.test(t)?"login_failed":e.http_status===401||e.http_status===403||e.chatbi_code===401||e.chatbi_code===403?"permission_denied":/No static resource|not valid JSON/i.test(t)||e.http_status===404||e.http_status===405||e.chatbi_code===404||e.chatbi_code===405?"public_api_unreachable":"unknown"}function ti(e,t){let n=t.trim().toLowerCase(),r,i=[];for(let s of e){let o=s.theme_name.trim().toLowerCase();o===n?r=s:o.includes(n)&&i.push(s)}if(r)return r.theme_id;if(i.length===1)return i[0].theme_id;throw i.length>1?new Error(`\u4E3B\u9898\u540D\u5339\u914D\u5230\u591A\u4E2A\u7ED3\u679C\uFF1A${t}`):new Error(`\u672A\u627E\u5230\u4E3B\u9898\uFF1A${t}`)}function St(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>typeof t<"u"))}function ni(e){if([e.final_status,e.answer_status,e.query_status].some(ii))throw new Error(`ChatBI query failed: ${ri(e.query_context?.err_msg,e.query_context?.detail,e.query_context?.msg,e.answer_context?.detail,e.answer_context?.msg,"unknown failure")}`);if(!e.answer?.explain?.trim()&&!(e.query_result?.columns?.length||e.query_result?.preview?.length))throw new Error("ChatBI response missing query content")}function ri(...e){return e.find(t=>typeof t=="string"&&t.trim())?.trim()}function ii(e){return typeof e=="string"&&e.trim().toLowerCase()==="failure"}function Rt(e){let t=e-Date.now();if(t<=0)throw new Error("Insight request timed out");return t}async function si(e,t,n){let r=e-Date.now();if(r<=0)throw new Error(`Insight request timed out after ${n}ms`);await new Promise(i=>setTimeout(i,Math.min(t,r)))}var re="8.2.0",Ue=["search_metrics","list_metric_catalog","get_metric_detail","query_metric_data","search_metric_trees","get_metric_tree_detail","query_metric_tree_attribution"],oi=["get_bi_capabilities","global_search",...Ue,"execute_sql_query","get_dataset_detail","get_card_info","query_card_data","get_page_info"],ai=6e4,ui="PAT \u6A21\u5F0F\u4EC5\u652F\u6301\u666E\u901A BI \u63A5\u53E3\uFF0C\u4E0D\u652F\u6301 ChatBI public-api\u3002",je=new WeakMap;async function ie(e,t){let n=je.get(e);return(!n||n.expiresAt<=Date.now())&&je.set(e,{expiresAt:Date.now()+ai,promise:di(e,t).catch(r=>ci(r,t))}),je.get(e).promise}function xt(e){let t=!e.BI_BASE_URL,n="HTTP \u6A21\u5F0F\u4E0B execute_sql_query \u4F1A\u5728\u8C03\u7528\u65F6\u4F7F\u7528\u5F53\u524D\u7528\u6237 token \u5224\u65AD BI \u7248\u672C/\u80FD\u529B\u3002",r="HTTP \u6A21\u5F0F\u542F\u52A8\u671F\u5C1A\u672A\u89E3\u6790\u8BF7\u6C42\u8C03\u7528\u8005\u3002";return{ok:!t,error:t?"\u914D\u7F6E\u4E0D\u5B8C\u6574\uFF1A\u7F3A\u5C11 BI_BASE_URL\u3002":void 0,versionSource:"api",dataVersion:e.BI_DATA_VERSION,service:Le(e,t?["get_bi_capabilities"]:Ne(e)),caller:{ok:!1,error:r,features:{executeSqlQuery:{enabled:!1,minVersion:re,reason:r}},chatbi:Q(e,r)},features:{executeSqlQuery:{enabled:!t,minVersion:re,reason:t?"\u914D\u7F6E\u4E0D\u5B8C\u6574\uFF1A\u7F3A\u5C11 BI_BASE_URL\u3002":n}},metricPlatform:{registeredTools:t?[]:Ue,readOnly:!0,lastError:t?"\u914D\u7F6E\u4E0D\u5B8C\u6574\uFF1A\u7F3A\u5C11 BI_BASE_URL\u3002":void 0},chatbi:Q(e,"HTTP \u6A21\u5F0F\u542F\u52A8\u671F\u4E0D\u4F7F\u7528\u67D0\u4E2A\u7528\u6237 token \u63A2\u6D4B ChatBI \u80FD\u529B\u3002")}}async function Mt(e,t,n){let i=(await ie(e,t)).features[n];if(!i.enabled)throw new Error(`\u5F53\u524D BI \u73AF\u5883\u4E0D\u652F\u6301 ${n}\uFF1A${i.reason??"\u80FD\u529B\u672A\u542F\u7528"}`)}function ci(e,t){let n=e instanceof Error?e.message:String(e);return{ok:!1,error:n,versionSource:"api",features:{executeSqlQuery:{enabled:!1,minVersion:re,reason:`\u65E0\u6CD5\u786E\u8BA4 BI \u80FD\u529B\uFF1A${n}`}},metricPlatform:{registeredTools:[],readOnly:!0,lastError:n},chatbi:Q(t,n),service:Le(t,Ne(t)),caller:{ok:!1,error:n,features:{executeSqlQuery:{enabled:!1,minVersion:re,reason:`\u65E0\u6CD5\u786E\u8BA4 BI \u80FD\u529B\uFF1A${n}`}},chatbi:Q(t,n)}}}async function di(e,t){let n=pi(t);if(n.length)throw new Error(`\u914D\u7F6E\u4E0D\u5B8C\u6574\uFF1A${n.join("\uFF1B")}\u3002`);let r=t.BI_DATA_VERSION?"env":"api",i=t.BI_DATA_VERSION?{dataVersion:t.BI_DATA_VERSION,capabilityVersion:t.BI_DATA_VERSION}:await mi(e),s=fi(i.capabilityVersion,re),o=await li(t);return{ok:!0,appVersion:i.appVersion,dataVersion:i.dataVersion,versionSource:r,service:Le(t,Ne(t)),caller:{ok:!0,features:{executeSqlQuery:s},chatbi:o},features:{executeSqlQuery:s},metricPlatform:{registeredTools:Ue,readOnly:!0},chatbi:o}}function Ne(e){let t=new Set(oi);if(!e.BI_PAT&&(pe(e)||e.MCP_TRANSPORT==="streamable-http"))for(let n of new v(e).getRegisteredTools())t.add(n);return[...t]}function Le(e,t){return{mode:e.MCP_TRANSPORT??"stdio",toolList:t,boundBISite:{configured:!!e.BI_BASE_URL,baseUrl:e.BI_BASE_URL,publicPath:e.BI_PUBLIC_PATH}}}async function li(e){if(e.BI_PAT)return Q(e,ui);let t=new v(e);return pe(e)?t.probe():Q(e,"\u7F3A\u5C11 BI_BASE_URL \u6216\u9274\u6743\u914D\u7F6E\u3002")}function Q(e,t){return{available:!1,registeredTools:e.BI_PAT||!pe(e)?[]:new v(e).getRegisteredTools(),failureType:"unknown",triedBaseUrls:[],lastError:{operation:"probe",chatbi_message:t,detail:t}}}function pi(e){let t=[];if(e.BI_BASE_URL||t.push("\u7F3A\u5C11 BI_BASE_URL"),!e.BI_PAT&&!e.BI_UID_TOKEN){let n=[["BI_LOGIN_DOMAIN",e.BI_LOGIN_DOMAIN],["BI_LOGIN_ID",e.BI_LOGIN_ID],["BI_LOGIN_PASSWORD",e.BI_LOGIN_PASSWORD]].filter(([,r])=>!r).map(([r])=>r);n.length&&t.push(`\u7F3A\u5C11\u9274\u6743\u914D\u7F6E\uFF1A\u8BF7\u914D\u7F6E BI_PAT\u3001BI_UID_TOKEN\uFF0C\u6216\u8865\u5168\u8D26\u53F7\u5BC6\u7801\u767B\u5F55\u914D\u7F6E\uFF08\u7F3A\u5C11 ${n.join("\u3001")}\uFF09`)}return t}async function mi(e){let t=await e.get("/api/server-version"),n=vt(t.version),r=vt(t.dataVersion)??n;if(!r)throw new Error("BI \u7248\u672C\u63A5\u53E3\u672A\u8FD4\u56DE version \u6216 dataVersion\u3002");return{appVersion:n,dataVersion:r,capabilityVersion:r}}function fi(e,t){let n=kt(e),r=kt(t);if(!r)throw new Error(`\u5185\u90E8\u914D\u7F6E\u9519\u8BEF\uFF1A\u65E0\u6CD5\u89E3\u6790\u6700\u4F4E\u7248\u672C ${t}\u3002`);if(!n)return{enabled:!1,minVersion:t,reason:`\u65E0\u6CD5\u4ECE\u7248\u672C\u5B57\u7B26\u4E32 "${e}" \u4E2D\u89E3\u6790\u4EA7\u54C1\u7248\u672C\uFF0C\u8BF7\u914D\u7F6E BI_DATA_VERSION\u3002`};let i=gi(n,r)>=0;return{enabled:i,minVersion:t,reason:i?void 0:`\u9700\u8981 BI ${t}+\uFF0C\u5F53\u524D\u7248\u672C\u4E3A ${e}\u3002`}}function kt(e){let t=e.match(/(\d+)\.(\d+)\.(\d+)/);if(t)return[Number(t[1]),Number(t[2]),Number(t[3])]}function gi(e,t){for(let n=0;n<e.length;n+=1){let r=e[n]-t[n];if(r!==0)return r}return 0}function vt(e){return typeof e=="string"&&e.trim()?e.trim():void 0}var fe=class{constructor(t){this.config=t}config;cache=new Map;async exchange(t){let n=Dt(t),r=this.cache.get(this.cacheKey(n));if(r&&r.expiresAtMs>Date.now())return this.result(n,r.token,r.biExpireAt);let i=await this.fetchLoginIdToken(n);return this.cache.set(this.cacheKey(n),{token:i.token,expiresAtMs:this.resolveCacheExpiresAt(i.expireAt),biExpireAt:i.expireAt}),this.result(n,i.token,i.expireAt)}async exchangeUserProperty(t){let n=await this.fetchLoginIdByUserProperty(t);return this.exchange(n)}async refresh(t){return this.cache.delete(this.cacheKey(t)),(await this.exchange(t)).token}result(t,n,r){return{token:n,expireAt:r,refresh:()=>this.refresh(t)}}async fetchLoginIdByUserProperty(t){let n=_i(t);if(!this.config.BI_BASE_URL)throw this.debugError("BI_BASE_URL is required for user property identity exchange.",{operation:"userPropertyLookup",request:{userPropertyValue:n}});if(!this.config.BI_APP_TOKEN)throw this.debugError("BI_APP_TOKEN is required for user property identity exchange.",{operation:"userPropertyLookup",request:{userPropertyValue:n}});let r=this.config.BI_USER_PROPERTY_KEY?.trim();if(!r)throw this.debugError("BI_USER_PROPERTY_KEY is required for user property identity exchange.",{operation:"userPropertyLookup",request:{userPropertyValue:n}});let i=this.buildUrl("/public-api/user/properties/list"),s={token:this.config.BI_APP_TOKEN,userPropertyKey:r,userPropertyValue:n,enabled:!0,offset:0,limit:2},o;try{o=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json","raw-backend-response":"TRUE"},body:JSON.stringify(s),signal:AbortSignal.timeout(this.config.BI_REQUEST_TIMEOUT_MS)})}catch(p){throw this.debugError(`BI user property lookup request failed: ${p instanceof Error?p.message:String(p)}`,{operation:"userPropertyLookup",request:{method:"POST",url:i,body:s},error:p instanceof Error?p.message:String(p)},[this.config.BI_APP_TOKEN])}let a=await o.text(),u=jt(a);if(!o.ok||Ut(u))throw this.debugError(`BI user property lookup failed: HTTP ${o.status} ${qe(a,[this.config.BI_APP_TOKEN,r,n])}`,{operation:"userPropertyLookup",request:{method:"POST",url:i,body:s},response:{status:o.status,body:a}},[this.config.BI_APP_TOKEN]);let c=u?.response?.list??[],d=u?.response?.total??c.length;if(d!==1||c.length!==1)throw this.debugError(`BI user property lookup must match exactly one user: matched ${d} user(s) for ${r}.`,{operation:"userPropertyLookup",request:{method:"POST",url:i,body:s},response:{status:o.status,total:d,listCount:c.length,matchedLoginIds:c.map(p=>p.loginId).filter(Boolean)}},[this.config.BI_APP_TOKEN]);return Dt(c[0]?.loginId??"")}async fetchLoginIdToken(t){if(!this.config.BI_BASE_URL)throw this.debugError("BI_BASE_URL is required for loginId identity exchange.",{operation:"loginIdSignIn",request:{loginId:t}});if(!this.config.BI_APP_TOKEN)throw this.debugError("BI_APP_TOKEN is required for loginId identity exchange.",{operation:"loginIdSignIn",request:{loginId:t}});let n=this.buildUrl("/public-api/user/loginId/sign-in"),r={token:this.config.BI_APP_TOKEN,loginId:t},i;try{i=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json","raw-backend-response":"TRUE"},body:JSON.stringify(r),signal:AbortSignal.timeout(this.config.BI_REQUEST_TIMEOUT_MS)})}catch(u){throw this.debugError(`BI loginId token exchange request failed: ${u instanceof Error?u.message:String(u)}`,{operation:"loginIdSignIn",request:{method:"POST",url:n,body:r},error:u instanceof Error?u.message:String(u)},[this.config.BI_APP_TOKEN])}let s=await i.text(),o=jt(s),a=o?.response?.token?.trim();if(!i.ok||Ut(o)||!a)throw this.debugError(`BI loginId token exchange failed: HTTP ${i.status} ${qe(s,[this.config.BI_APP_TOKEN,a,t])}`,{operation:"loginIdSignIn",request:{method:"POST",url:n,body:r},response:{status:i.status,body:s}},[this.config.BI_APP_TOKEN,a]);return{token:a,expireAt:o?.response?.expireAt}}buildUrl(t){let n=t.startsWith("/")?t:`/${t}`;return`${this.config.BI_BASE_URL}${this.config.BI_PUBLIC_PATH}${n}`}cacheKey(t){return`${this.config.BI_BASE_URL??""}${this.config.BI_PUBLIC_PATH}\0${t}`}resolveCacheExpiresAt(t){let n=Date.now()+this.config.BI_IDENTITY_TOKEN_CACHE_TTL_MS,r=hi(t);return r?Math.min(n,r):n}debugError(t,n,r=[]){if(!yi(this.config))return new Error(t);let i=Ge(n,[this.config.BI_APP_TOKEN,...r]);return console.error(JSON.stringify({identityExchangeDebug:i})),new Error(`${t}
3
+ identity_debug=${JSON.stringify(i,null,2)}`)}};function Dt(e){let t=e.trim();if(!t)throw new Error("GuanBI loginId is required for loginId identity exchange.");return t}function _i(e){let t=e.trim();if(!t)throw new Error("BI user property value is required for user property identity exchange.");return t}function jt(e){if(e.trim())try{return JSON.parse(e)}catch{return}}function Ut(e){return!e||e.result&&!["ok","success"].includes(e.result.toLowerCase())?!0:e.success===!1}function hi(e){if(!e)return;let t=e.replace(" ","T"),n=Date.parse(t);return Number.isFinite(n)?n:void 0}function qe(e,t){let n=t.filter(r=>!!r).reduce((r,i)=>r.split(i).join("[redacted]"),e);return bi(n)}function Ge(e,t){let n=t.filter(r=>!!r);return typeof e=="string"?qe(e,n):Array.isArray(e)?e.map(r=>Ge(r,n)):!e||typeof e!="object"?e:Object.fromEntries(Object.entries(e).map(([r,i])=>[r,Ii(r)?"[redacted]":Ge(i,n)]))}function Ii(e){return["token","authorization","cookie","uidtoken","uIdToken".toLowerCase()].includes(e.toLowerCase())}function yi(e){return["1","true","yes","on"].includes(e.BI_IDENTITY_DEBUG?.trim().toLowerCase()??"")}function bi(e,t=1e3){return e.length>t?`${e.slice(0,t)}\u2026`:e}var Y="x-personal-token";function Ti(e){return{transport:"stdio",...e.BI_PAT?{biPatToken:e.BI_PAT}:{},biUidToken:e.BI_UID_TOKEN,audit:{}}}function Lt(e){return{resolve:()=>Ti(e)}}function ge(e){let t=se(e);if(t)return{transport:"streamable-http",biPatToken:t,audit:K(e)};let n=U(e,"x-guanbi-uid-token")?.trim();if(!n)throw new Error("\u7F3A\u5C11 GuanBI \u7528\u6237\u4EE4\u724C\uFF1A\u8BF7\u901A\u8FC7 X-GuanBI-Uid-Token \u4F20\u5165\u5F53\u524D\u7528\u6237 uIdToken\u3002");return{transport:"streamable-http",biUidToken:n,audit:K(e)}}function qt(e,t={}){let n=e?new fe(e):void 0,r=t.exchangeLoginId??t.exchange??(n?n.exchange.bind(n):void 0),i=t.exchangeUserProperty??(n?n.exchangeUserProperty.bind(n):void 0);return{resolve:async s=>{if(!s?.requestInfo?.headers)return e?.BI_PAT?{transport:"streamable-http",biPatToken:e.BI_PAT,audit:{}}:{transport:"streamable-http",audit:{}};let o=s.requestInfo.headers,a=se(o);if(a)return{transport:"streamable-http",biPatToken:a,audit:K(o)};if(e?.BI_PAT)return{transport:"streamable-http",biPatToken:e.BI_PAT,audit:K(o)};if(U(o,"x-guanbi-uid-token")?.trim()||!e)return ge(o);let c=e.BI_LOGIN_ID_HEADER,d=c?W(U(o,c)):void 0;if(d){let I=await r?.(d);return I?{transport:"streamable-http",biUidToken:I.token,biUidTokenRefresh:I.refresh,loginId:d,audit:K(o)}:ge(o)}let p=e.BI_USER_PROPERTY_HEADER,g=p?W(U(o,p)):void 0;if(g){let I=await i?.(g);return I?{transport:"streamable-http",biUidToken:I.token,biUidTokenRefresh:I.refresh,audit:K(o)}:ge(o)}throw Ci(o,e)}}}function se(e){return W(U(e,Y))}function U(e,t){if(e instanceof Headers)return e.get(t)??void 0;let n=e.get;if(typeof n=="function")return n.call(e,t)??void 0;let r=t.toLowerCase();for(let[i,s]of Object.entries(e))if(i.toLowerCase()===r)return Array.isArray(s)?s[0]:s}function W(e){return e?.trim()||void 0}function K(e){return{tenantId:W(U(e,"x-tenant-id")),endUserId:W(U(e,"x-end-user-id")),traceId:W(U(e,"x-trace-id"))}}function Ci(e,t){let n="\u7F3A\u5C11 GuanBI \u7528\u6237\u4EE4\u724C\uFF1A\u8BF7\u901A\u8FC7 X-GuanBI-Uid-Token \u4F20\u5165\u5F53\u524D\u7528\u6237 uIdToken\u3002";if(!Ri(t))return new Error(n);let r={operation:"resolveHttpCallerContext",expectedIdentityHeaders:Bi(e,t),receivedHeaderNames:Ei(e),receivedIdentityLikeHeaders:Nt(Object.fromEntries(He(e).filter(([i])=>Si(i.toLowerCase()))),[Y,"x-guanbi-uid-token",t.BI_LOGIN_ID_HEADER,t.BI_USER_PROPERTY_HEADER]),receivedHeaders:Nt(e,[Y,"x-guanbi-uid-token",t.BI_LOGIN_ID_HEADER,t.BI_USER_PROPERTY_HEADER])};return console.error(JSON.stringify({identityExchangeDebug:r})),new Error(`${n}
4
+ identity_debug=${JSON.stringify(r,null,2)}`)}function Bi(e,t){return[{source:"pat",name:Y,present:_e(e,Y)},{source:"uidToken",name:"x-guanbi-uid-token",present:_e(e,"x-guanbi-uid-token")},...t.BI_LOGIN_ID_HEADER?[{source:"loginId",name:t.BI_LOGIN_ID_HEADER,present:_e(e,t.BI_LOGIN_ID_HEADER)}]:[],...t.BI_USER_PROPERTY_HEADER?[{source:"userProperty",name:t.BI_USER_PROPERTY_HEADER,present:_e(e,t.BI_USER_PROPERTY_HEADER),userPropertyKey:t.BI_USER_PROPERTY_KEY}]:[]]}function _e(e,t){return U(e,t)!==void 0}function Ei(e){return[...new Set(He(e).map(([t])=>t.toLowerCase()))].sort()}function Nt(e,t){let n=new Set(t.filter(r=>!!r).map(r=>r.toLowerCase()));return Object.fromEntries(He(e).map(([r,i])=>{let s=r.toLowerCase();return wi(s)?[s,"<redacted>"]:[s,n.has(s)?i:"<present>"]}))}function He(e){if(e instanceof Headers)return[...e.entries()];let t=e.entries;return typeof t=="function"?[...t.call(e)]:Object.entries(e).filter(([,n])=>n!==void 0).map(([n,r])=>[n,Array.isArray(r)?r.join(","):String(r)])}function wi(e){return["authorization","cookie","set-cookie","x-guanbi-uid-token",Y].includes(e)}function Si(e){return e.startsWith("x-")||e.includes("auth")||e.includes("login")||e.includes("token")||e.includes("uid")||e.includes("user")}function Ri(e){return["1","true","yes","on"].includes(e.BI_IDENTITY_DEBUG?.trim().toLowerCase()??"")}import{AsyncLocalStorage as Oi}from"async_hooks";var X={client:"X-Guandata-Client",clientVersion:"X-Guandata-Client-Version",command:"X-Guandata-Command"},Ai=new Set(Object.values(X).map(e=>e.toLowerCase())),Gt=new Oi;function Ht(e,t){return Gt.run(e,t)}function Pi(e,t="mcp"){e=Gt.getStore()??e;let n={};n[X.client]=e?.client.trim()||t.trim()||"mcp";let r=e?.clientVersion?.trim();r&&(n[X.clientVersion]=r);let i=e?.command?.trim();return i&&(n[X.command]=i),n}function Jt(e,t,n="mcp"){let r=Pi(t,n);return{...Je(e),...r}}function Je(e){return Object.fromEntries(Object.entries(e).filter(([t])=>!Ai.has(t.toLowerCase())))}var Ie=class{constructor(t){this.config=t;this.token=t.BI_UID_TOKEN}config;token;async get(t,n){return this.request("GET",t,void 0,n)}async post(t,n,r){return this.request("POST",t,n,r)}async put(t,n,r){return this.request("PUT",t,n,r)}async getText(t){if(this.config.BI_PAT){let s=await fetch(this.buildUrl(t),{method:"GET",headers:this.patHeaders(this.config.BI_PAT,{"raw-backend-response":"TRUE"}),signal:AbortSignal.timeout(this.config.BI_REQUEST_TIMEOUT_MS)}),o=await s.text();if(!s.ok)throw new Error(`BI \u8BF7\u6C42\u5931\u8D25\uFF1AGET ${t} HTTP ${s.status} ${he(o)}`);return o}let n=await this.ensureToken(),r=await fetch(this.buildUrl(t),{method:"GET",headers:this.uidHeaders(n,{"raw-backend-response":"TRUE"}),signal:AbortSignal.timeout(this.config.BI_REQUEST_TIMEOUT_MS)});if(this.shouldRefreshToken(r)){let s=await this.refreshToken();r=await fetch(this.buildUrl(t),{method:"GET",headers:this.uidHeaders(s,{"raw-backend-response":"TRUE"}),signal:AbortSignal.timeout(this.config.BI_REQUEST_TIMEOUT_MS)})}let i=await r.text();if(!r.ok)throw new Error(`BI \u8BF7\u6C42\u5931\u8D25\uFF1AGET ${t} HTTP ${r.status} ${he(i)}`);return this.refreshTokenFromResponse(r),i}async request(t,n,r,i){if(this.config.BI_PAT){let u=await this.fetchWithPat(t,n,this.config.BI_PAT,r,i),c=await u.text();if(!u.ok)throw new Error(`BI \u8BF7\u6C42\u5931\u8D25\uFF1A${t} ${n} HTTP ${u.status} ${he(c)}`);return $t(c)}let s=await this.ensureToken(),o=await this.fetchWithToken(t,n,s,r,i);if(this.shouldRefreshToken(o)){let u=await this.refreshToken();o=await this.fetchWithToken(t,n,u,r,i)}let a=await o.text();if(!o.ok)throw new Error(`BI \u8BF7\u6C42\u5931\u8D25\uFF1A${t} ${n} HTTP ${o.status} ${he(a)}`);return this.refreshTokenFromResponse(o),$t(a)}async fetchWithToken(t,n,r,i,s){return fetch(this.buildUrl(n),{method:t,headers:this.uidHeaders(r,{"Content-Type":"application/json","raw-backend-response":"TRUE",...s?.headers}),body:t==="POST"||t==="PUT"?JSON.stringify(i??{}):void 0,signal:AbortSignal.timeout(this.config.BI_REQUEST_TIMEOUT_MS)})}async fetchWithPat(t,n,r,i,s){return fetch(this.buildUrl(n),{method:t,headers:this.patHeaders(r,{"Content-Type":"application/json","raw-backend-response":"TRUE",...s?.headers}),body:t==="POST"||t==="PUT"?JSON.stringify(i??{}):void 0,signal:AbortSignal.timeout(this.config.BI_REQUEST_TIMEOUT_MS)})}async ensureToken(){if(this.token)return this.token;let t=await le(this.config);return this.token=t.token,t.token}async refreshToken(){if(this.config.BI_UID_TOKEN_REFRESH){let t=await this.config.BI_UID_TOKEN_REFRESH();return this.token=t,t}return this.token=void 0,this.ensureToken()}refreshTokenFromResponse(t){let n=vi(t);!n||n===this.token||(this.token=n)}shouldRefreshToken(t){return(!!this.config.BI_UID_TOKEN_REFRESH||this.hasPasswordLogin())&&t.status===401}hasPasswordLogin(){return!!(this.config.BI_LOGIN_DOMAIN&&this.config.BI_LOGIN_ID&&this.config.BI_LOGIN_PASSWORD)}uidHeaders(t,n){return{...Je(n),Cookie:`uIdToken=${t}`}}patHeaders(t,n){return Jt({...n,"X-Personal-Token":t},this.config.BI_REQUEST_METADATA,this.config.BI_PAT_CLIENT)}buildUrl(t){let n=t.startsWith("/")?t:`/${t}`;return`${this.config.BI_BASE_URL}${this.config.BI_PUBLIC_PATH}${n}`}};function $t(e){if(!e)return;let t=JSON.parse(e);if(!ki(t))return t;if(t.result&&!["ok","success"].includes(t.result.toLowerCase()))throw new Error(`BI \u8FD4\u56DE\u9519\u8BEF\uFF1A${t.message??JSON.stringify(t.error??t)}`);if(t.success===!1)throw new Error(`BI \u8FD4\u56DE\u9519\u8BEF\uFF1A${t.message??JSON.stringify(t.error??t)}`);return"response"in t?t.response:t}function ki(e){return!e||typeof e!="object"||Array.isArray(e)?!1:"response"in e||"result"in e||"success"in e}function vi(e){return xi(e.headers)??Di(e.headers)}function xi(e){return[...e.getSetCookie?.()??[],...Mi(e.get("set-cookie"))].map(n=>Vt(n.trim().match(/(?:^|;\s*)uIdToken=([^;]+)/)?.[1])).find(Boolean)}function Mi(e){return e?e.split(/,(?=\s*[^;,]+=)/):[]}function Di(e){return Vt(e.get("x-auth-token"))}function Vt(e){if(typeof e!="string")return;let t=e.trim();return t&&!/\s/.test(t)?t:void 0}function he(e,t=1e3){return e.length>t?`${e.slice(0,t)}...`:e}var ye=class{constructor(t,n={}){this.baseConfig=t;this.options=n}baseConfig;options;stdioClient;create(t,n){let r=this.resolveRequestMetadata(n);if(t.transport==="stdio"&&this.stdioClient)return{...this.stdioClient,config:{...this.stdioClient.config,BI_REQUEST_METADATA:r}};let i=this.resolveConfig(t,t.transport==="stdio"?this.resolveRequestMetadata(void 0):r),s={client:this.options.clientFactory?.(i)??new Ie(i),config:{...i,BI_REQUEST_METADATA:r},context:t};return t.transport==="stdio"&&(this.stdioClient={...s,config:i}),s}resolveConfig(t,n){let r=t.biPatToken??this.baseConfig.BI_PAT,i=t.biUidToken??(t.transport==="stdio"?this.baseConfig.BI_UID_TOKEN:void 0),s=!!r;return{...this.baseConfig,BI_PAT:r,BI_UID_TOKEN:s?void 0:i,BI_UID_TOKEN_REFRESH:!s&&t.transport==="streamable-http"?t.biUidTokenRefresh:void 0,BI_LOGIN_DOMAIN:!s&&t.transport==="stdio"?this.baseConfig.BI_LOGIN_DOMAIN:"",BI_LOGIN_ID:!s&&t.transport==="stdio"?this.baseConfig.BI_LOGIN_ID:void 0,BI_LOGIN_PASSWORD:!s&&t.transport==="stdio"?this.baseConfig.BI_LOGIN_PASSWORD:void 0,BI_REQUEST_METADATA:n}}resolveRequestMetadata(t){let n=this.options.requestMetadata;if(n)return t?{...n,command:t}:{...n}}};var Ft={endpoint:"https://www.google-analytics.com/mp/collect",measurementId:"G-800H8JWDPP",apiSecret:"poAwpMEhQteDl1rXKtNIqg",eventName:"guanbi_mcp_tool_call",clientId:"0000000000.0000000000",sessionId:1,engagementTimeMsec:1,timeoutMs:3e3,maxResponseBytes:1024},be=class{serviceDomain;appVersion;enabled;sender;now;constructor({config:t,appVersion:n,sender:r=Ni(),now:i=Date.now}){this.serviceDomain=qi(t.BI_BASE_URL),this.appVersion=n,this.enabled=Li(t),this.sender=r,this.now=i}observeToolCallStart(t){return{toolName:t,startedAtMs:this.now()}}observeToolCallEnd(t,n){if(!this.enabled||!this.serviceDomain)return;let r={service_domain:this.serviceDomain,app_version:this.appVersion,tool:t.toolName,success:n.success,duration_ms_bucket:Gi(this.now()-t.startedAtMs),error_type:n.success?"none":Ji(n.error)};try{Promise.resolve(this.sender(r)).catch(()=>{})}catch{}}};function ji(e=Ft){return t=>Ui(t,e)}async function Ui(e,t=Ft){try{if(!t.endpoint||!t.measurementId||!t.apiSecret||!e.tool)return;let n=new URL(t.endpoint);n.searchParams.set("measurement_id",t.measurementId),n.searchParams.set("api_secret",t.apiSecret);let r=JSON.stringify({client_id:t.clientId,events:[{name:t.eventName,params:{service_domain:e.service_domain,app_version:e.app_version,tool:e.tool,success:e.success,duration_ms_bucket:e.duration_ms_bucket,error_type:e.error_type,session_id:t.sessionId,engagement_time_msec:t.engagementTimeMsec}}]}),i=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:r,signal:AbortSignal.timeout(t.timeoutMs)});await Hi(i,t.maxResponseBytes)}catch{}}function Ni(){return $i(process.env)?()=>{}:ji()}function Li(e){let t=e.GUANBI_MCP_USAGE_STATS?.trim().toLowerCase();return t?["0","false","off","no"].includes(t)?!1:(["1","true","on","yes"].includes(t),!0):!0}function zt(e,t,n){return(async(...r)=>{let i=n.observeToolCallStart(e);try{let s=await t(...r);return n.observeToolCallEnd(i,{success:!0}),s}catch(s){throw n.observeToolCallEnd(i,{success:!1,error:s}),s}})}function qi(e){if(e)try{return new URL(e).hostname}catch{return}}function Gi(e){return e<1e3?"<1s":e<5e3?"1-5s":e<3e4?"5-30s":e<12e4?"30-120s":">120s"}async function Hi(e,t){let n=e.body?.getReader();if(!n)return;let r=0;try{for(;r<t;){let{done:i,value:s}=await n.read();if(i)return;r+=s.byteLength}}finally{await n.cancel().catch(()=>{})}}function Ji(e){let t=e instanceof Error?e.message:String(e);return/校验|验证|validation|invalid|schema|zod/i.test(t)?"validation":/鉴权|登录|认证|unauthorized|unauthenticated|401|auth/i.test(t)?"auth":/权限|forbidden|permission|403/i.test(t)?"permission":/timeout|network|fetch|econn|enotfound|socket/i.test(t)?"network":/BI 请求失败|BI 返回错误|HTTP \d{3}/i.test(t)?"bi_error":"unknown"}function $i(e){return e.NODE_ENV==="test"||e.VITEST==="true"}var Te=class{constructor(t,n,r=new de){this.callerContextResolver=t;this.clientFactory=n;this.auditLogger=r}callerContextResolver;clientFactory;auditLogger;async run(t,n,r){let i=Date.now(),s=await this.callerContextResolver.resolve(n),o=this.clientFactory.create(s,r);try{let a=await Ht(o.config.BI_REQUEST_METADATA,()=>t(o));if(r){let u=Vi(a)?"error":"success";this.auditLogger.record(Me(r,s,i,u,a))}return a}catch(a){throw r&&this.auditLogger.record(Me(r,s,i,"error",a)),a}}};function Vi(e){return!!(e&&typeof e=="object"&&e.isError===!0)}function M(e){return{content:[{type:"text",text:JSON.stringify(e,null,2)}]}}function B(e){let t=Ve(e);return{content:[{type:"text",text:JSON.stringify(t,null,2)}],structuredContent:t}}function q(e){let t=Ve(e);return{content:[{type:"text",text:JSON.stringify(t,null,2)}],isError:!0}}function Ce(e,t,n={}){return q({status:"error",diagnostic:$e(e,t,n)})}function $e(e,t,n={}){let r=t instanceof Error?t.message:String(t),i=r.match(/BI 请求失败:(?<method>[A-Z]+) (?<path>\S+) HTTP (?<status>\d+)/);return Ve({operation:e,path:i?.groups?.path,status:i?.groups?.status?Number(i.groups.status):void 0,message:r,...n})}function Ve(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}var Qt={};async function Kt(e,t){return M(await ie(e,t))}import{z as y}from"zod";var H=class extends Error{constructor(n,r){super(n.message,{cause:r});this.detail=n;this.name="MetricPlatformRequestError"}detail},D=class{constructor(t,n){this.client=t;this.config=n}client;config;contextHeadersPromise;listProjects(){return this.get("listProjects","/api/metric-platform/projects")}searchMetrics(t){let n=h({projectId:t.projectId,dirId:t.dirId,status:t.status,nameLike:t.keyword,subTypes:t.subTypes?.join(","),orderBy:t.orderBy});return this.post("searchMetrics","/api/metric-platform/metrics",n)}listMetricFullTree(t){return this.get("listMetricFullTree",ze("/api/metric-platform/metrics/full-tree",{projectId:t.projectId,nameLike:t.keyword}))}listMetricDirectoryTree(t){return this.get("listMetricDirectoryTree",ze("/api/directory/METRIC_PLATFORM/unauthorized-tree",{projectId:t}))}getMetricDetail(t){return this.get("getMetricDetail",`/api/metric-platform/metrics/${encodeURIComponent(t)}`)}getMetricLineage(t,n){return this.post("getMetricLineage",`/api/resource-atlas/${encodeURIComponent(t)}`,{resourceTypeName:n})}queryMetricData(t){let{metricId:n,metricName:r,...i}=t;return this.post("queryMetricData","/api/metric-platform/metric-data/v2",h(i))}getCardEditSession(t){return this.get("getCardEditSession",`/api/card/${encodeURIComponent(t)}/edit/session`)}getCardEditMeta(t){return this.get("getCardEditMeta",`/api/card/${encodeURIComponent(t)}/edit`)}modifyCardEditMeta(t,n,r){return this.put("modifyCardEditMeta",`/api/oriput/card/${encodeURIComponent(t)}/edit/${encodeURIComponent(n)}/modify`,r)}queryCardEditData(t,n,r){return this.post("queryCardEditData",`/api/card/${encodeURIComponent(t)}/edit/${encodeURIComponent(n)}/data`,r)}searchMetricTrees(t){return this.get("searchMetricTrees",ze("/api/metric-platform/metric-tree/search",{nameLike:t.keyword,projectId:t.projectId,parentDirId:t.parentDirId,orderBy:t.orderBy}))}async getMetricTreeDetail(t){return this.get("getMetricTreeDetail",`/api/metric-platform/metric-tree/${encodeURIComponent(t)}`,await this.metricTreeHeaders(t,"dimension"))}async queryMetricTreeDrill(t,n){return this.post("queryMetricTreeDrill",`/api/metric-platform/metric-tree/${encodeURIComponent(t)}/drill`,n,await this.metricTreeHeaders(t,"dimension"))}async queryMetricTreeDecompose(t,n){return this.post("queryMetricTreeDecompose",`/api/metric-platform/metric-tree/${encodeURIComponent(t)}/metric-decompose`,n,await this.metricTreeHeaders(t,"metric"))}async put(t,n,r,i){try{return await this.client.put(n,r,i?{headers:i}:void 0)}catch(s){throw Fe(t,n,s)}}async get(t,n,r){try{return await this.client.get(n,r?{headers:r}:void 0)}catch(i){throw Fe(t,n,i)}}async post(t,n,r,i){try{return await this.client.post(n,r,i?{headers:i}:void 0)}catch(s){throw Fe(t,n,s)}}async metricTreeHeaders(t,n){return{Referer:`${this.config.BI_BASE_URL??""}${this.config.BI_PUBLIC_PATH}/metrics-store/hierarchy/${encodeURIComponent(t)}/edit/${n}`,...await this.contextHeaders()}}async contextHeaders(){return this.contextHeadersPromise||(this.contextHeadersPromise=this.resolveContextHeaders()),this.contextHeadersPromise}async resolveContextHeaders(){let t={};if(this.config.BI_LOGIN_DOMAIN&&(t["x-dom-id"]=Z(this.config.BI_LOGIN_DOMAIN)),this.config.BI_LOGIN_ID&&(t["user-id"]=Z(this.config.BI_LOGIN_ID)),t["x-dom-id"]&&t["user-id"])return t;try{let n=await this.get("getUserProfile","/api/user/profile"),r=Wt(n.domId,n.domainId,n.domain,n.dom_id),i=Wt(n.email,n.loginId,n.userId,n.uId,n.uid);!t["x-dom-id"]&&r&&(t["x-dom-id"]=Z(r)),!t["user-id"]&&i&&(t["user-id"]=Z(i))}catch{}return t["x-dom-id"]||(t["x-dom-id"]=Z(this.config.BI_LOGIN_DOMAIN||"guanbi")),t["user-id"]||(t["user-id"]=Z(this.config.BI_LOGIN_ID||"unknown")),t}};function Fe(e,t,n){let r=n instanceof Error?n.message:String(n),i=r.match(/\bHTTP\s+(\d{3})\b/);return new H({operation:e,path:t,status:i?Number(i[1]):void 0,message:r},n)}function ze(e,t){let n=new URLSearchParams;for(let[i,s]of Object.entries(t))s!==void 0&&s!==""&&n.set(i,s);let r=n.toString();return r?`${e}?${r}`:e}function h(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}function Z(e){return Buffer.from(e,"utf8").toString("base64")}function Wt(...e){for(let t of e)if(typeof t=="string"&&t.trim())return t.trim()}var Fi=y.enum(["BT","CLOSE_BT_OPEN","OPEN_BT_CLOSE","OPEN_BT_OPEN","GT","GE","LT","LE","EQ","NE","IN","NI","IS_NULL","NOT_NULL","CONTAINS","NOT_CONTAINS","STARTSWITH","ENDSWITH","NOT_STARTSWITH","NOT_ENDSWITH","STARTSWITH_USER_PROPERTIES","STARTSWITH_GLOBAL_PARAMS"]),Yt=new Set(["BT","CLOSE_BT_OPEN","OPEN_BT_CLOSE","OPEN_BT_OPEN"]),Ke=new Set(["IS_NULL","NOT_NULL"]),zi=y.object({field:y.string().min(1).describe("\u7B5B\u9009\u5B57\u6BB5\u540D\u79F0\u3001\u522B\u540D\u6216\u5B57\u6BB5 ID\u3002"),operator:Fi.describe("BI \u539F\u751F\u7B5B\u9009\u64CD\u4F5C\u7B26\uFF0C\u4F8B\u5982 EQ/NI/GE/BT/CONTAINS\u3002"),values:y.array(y.union([y.string(),y.number(),y.boolean()])).optional().describe("\u7B5B\u9009\u503C\u3002IS_NULL/NOT_NULL \u4E0D\u9700\u8981\u4F20\u503C\u3002"),fd_id:y.string().min(1).optional().describe("\u5DF2\u77E5\u5B57\u6BB5 ID \u65F6\u53EF\u76F4\u63A5\u6307\u5B9A\u3002")}).superRefine((e,t)=>{let n=e.values?.length??0;Ke.has(e.operator)&&n>0&&t.addIssue({code:y.ZodIssueCode.custom,path:["values"],message:`${e.operator} \u64CD\u4F5C\u7B26\u4E0D\u63A5\u53D7\u7B5B\u9009\u503C\u3002`}),Yt.has(e.operator)&&n!==2&&t.addIssue({code:y.ZodIssueCode.custom,path:["values"],message:`${e.operator} \u64CD\u4F5C\u7B26\u9700\u8981\u6070\u597D 2 \u4E2A\u503C\u3002`}),!Yt.has(e.operator)&&!Ke.has(e.operator)&&n<1&&t.addIssue({code:y.ZodIssueCode.custom,path:["values"],message:`${e.operator} \u64CD\u4F5C\u7B26\u81F3\u5C11\u9700\u8981 1 \u4E2A\u503C\u3002`})}),Qi=y.object({parameter:y.string().min(1).describe("\u52A8\u6001\u53C2\u6570\u540D\u79F0\u6216 dpId\u3002"),value:y.union([y.string(),y.number(),y.boolean()]).describe("\u52A8\u6001\u53C2\u6570\u8986\u76D6\u503C\uFF0C\u4F1A\u6309 BI dynamicParams.defaultValue \u4EE5\u5B57\u7B26\u4E32\u53D1\u9001\u3002")}),nn={cd_id:y.string().min(1).describe("\u5361\u7247 ID\u3002"),filters:y.array(zi).optional().describe("\u7ED3\u6784\u5316\u7B5B\u9009\u6761\u4EF6\u3002\u4E0D\u652F\u6301 CLI \u98CE\u683C\u7B5B\u9009\u5B57\u7B26\u4E32\u3002"),dynamic_params:y.array(Qi).optional().describe("\u56FE\u8868\u5361\u52A8\u6001\u53C2\u6570\u8986\u76D6\uFF0Cparameter \u53EF\u4F20\u53C2\u6570\u540D\u6216 dpId\uFF1B\u4EC5\u652F\u6301 CHART \u5361\u7247\u3002"),columns:y.array(y.string().min(1)).optional().describe("\u5BF9\u5DF2\u5C55\u5E73\u7ED3\u679C\u505A\u672C\u5730\u5217\u88C1\u526A\uFF0C\u4E0D\u53C2\u4E0E BI \u67E5\u8BE2\u8BED\u4E49\u3002"),limit:y.number().int().positive().max(1e4).optional().default(100).describe("\u6700\u591A\u8FD4\u56DE\u884C\u6570\uFF0C\u9ED8\u8BA4 100\uFF0C\u4E0A\u9650 10000\u3002"),raw:y.boolean().optional().describe("\u662F\u5426\u8FD4\u56DE\u539F\u59CB\u54CD\u5E94\u3002")},rn={summary:y.unknown().optional(),columns:y.array(y.unknown()).optional(),rows:y.array(y.unknown()).optional(),diagnostic:y.unknown().optional(),raw:y.unknown().optional(),status:y.string().optional()};async function sn(e,t){try{let n=t.limit??100,r=await e.get(`/api/card/${encodeURIComponent(t.cd_id)}`),i=Wi(r);if(i==="TEXT")return t.dynamic_params?.length?Be("query_card_data",Xt(i)):Ki(t.cd_id,r,t.columns,t.raw);if(t.dynamic_params?.length&&i!=="CHART")return Be("query_card_data",Xt(i));let s=os(t.filters??[],_s(r),i);if("unsupported"in s)return Be("query_card_data",s.unsupported);let o=await as(e,t.dynamic_params??[]);if("unsupported"in o)return Be("query_card_data",o.unsupported);let a=i==="CHART"?await Xi(e,t.cd_id,n,s.filters,o.dynamicParams):await Yi(e,on(t.cd_id,i,n,s.filters,o.dynamicParams)),{endpoint:u,requestBody:c}=a.requests[0],d=a.data,p=i==="CHART"?es(b(d.chartMain)):is(d),g=dn(p.slice(0,n),t.columns);return B({summary:h({cd_id:t.cd_id,card_type:i,chart_type:i==="CHART"?w(b(r.content).chartType):void 0,row_count:g.length,truncated:Is(i,d,g.length)}),columns:ln(g),rows:g,diagnostic:{mode:Zi(i),card_type:i,endpoint:u,request_body:c,request_count:a.requests.length,request_bodies:a.requests.length>1?a.requests.map(I=>I.requestBody):void 0,raw_returned:t.raw===!0},raw:t.raw?a.raw:void 0})}catch(n){return q({status:"error",diagnostic:$e("query_card_data",n)})}}function Ki(e,t,n,r){let i=b(t.content),s=ss(i),o=dn(s?[{content:s}]:[],n);return B({summary:{cd_id:e,card_type:"TEXT",row_count:o.length,truncated:!1},columns:ln(o),rows:o,diagnostic:{mode:"text_card_content",card_type:"TEXT",endpoint:`/api/card/${encodeURIComponent(e)}`,raw_returned:r===!0},raw:r?t:void 0})}function Be(e,t){return B({status:"unsupported",diagnostic:{tool:e,...t}})}function Xt(e){return{capability:"unsupported_dynamic_params",message:`dynamic_params \u4EC5\u652F\u6301 CHART \u56FE\u8868\u5361\u7247\uFF0C\u5F53\u524D\u5361\u7247\u7C7B\u578B\u4E3A ${e}`,card_type:e}}function Wi(e){let t=w(e.cdType).toUpperCase();if(t==="SELECTOR"){let n=w(b(e.content).selectorType).toUpperCase();return n==="TREE"||n==="TREE_SELECTOR"?"TREE_SELECTOR":"SELECTOR"}return t==="TREE_SELECTOR"?"TREE_SELECTOR":t==="TEXT"?"TEXT":"CHART"}function on(e,t,n,r,i,s=0){let o=encodeURIComponent(e);return t==="SELECTOR"?{endpoint:`/api/selector/${o}/data`,requestBody:h({fieldQuery:{offset:0,limit:n},filters:r.length?r:void 0})}:t==="TREE_SELECTOR"?{endpoint:`/api/treeSelector/${o}/data`,requestBody:h({limit:n,filters:r.length?r:void 0})}:{endpoint:`/api/card/${o}/data`,requestBody:h({view:"GRID",isUniversalStructure:!0,offset:s>0?s:void 0,limit:n,filters:r.length?r:void 0,dynamicParams:i.length?i:void 0})}}async function Yi(e,t){let n=await e.post(t.endpoint,t.requestBody);return{raw:n,data:an(n),requests:[t]}}async function Xi(e,t,n,r,i){let o=[],a=[],u,c=0,d,p=!1,g=!1;for(;c<n;){let R=Math.min(1e3,n-c),k=on(t,"CHART",R,r,i,c);o.push(k);let z=await e.post(k.endpoint,k.requestBody);a.push(z);let ve=an(z),ne=b(ve.chartMain);if(!Object.keys(ne).length)return{raw:z,data:ve,requests:o};u?ts(b(u.chartMain),ne):u=cn(ve);let xe=ns(ne);c+=xe,d=Xe(ne.count)??d;let Tt=Ye(ne.hasMoreData);if(g=Tt!==void 0,p=Tt??!1,xe===0||xe<R||d!==void 0&&c>=d||g&&!p)break}let I=u??{},T=b(I.chartMain);return Object.keys(T).length&&(T.offset=0,T.limit=n,T.hasMoreData=d!==void 0?c<d:p),{raw:a.length>1?{pages:a,merged:I}:a[0],data:I,requests:o}}function Zi(e){return e==="SELECTOR"?"selector_card_data":e==="TREE_SELECTOR"?"tree_selector_card_data":"chart_card_data"}function an(e){let t=b(e),n=b(t.data),r=b(b(t.content).data);return Object.keys(n).length?n:Object.keys(r).length?r:t}function es(e){if(!Object.keys(e).length)return[];let t=b(e.row),n=b(e.column),r=P(t.data??t.values),i=P(e.data),s=oe(t.fields??t.meta).map(We).filter(Boolean),o=rs(n),a=ys([...s,...o]),u=Math.max(r.length,i.length),c=[];for(let d=0;d<u;d+=1){let p=[];p.push(...P(r[d]).map(tn)),p.push(...P(i[d]).map(tn)),p.length&&c.push(Object.fromEntries(p.map((g,I)=>[a[I]??`column_${I+1}`,g])))}return c}function ts(e,t){Qe(e,t,"data");let n=b(e.row),r=b(t.row);Qe(n,r,"data"),Qe(n,r,"values")}function Qe(e,t,n){let r=P(t[n]);r.length&&(e[n]=[...P(e[n]),...r])}function ns(e){let t=P(e.data);if(t.length)return t.length;let n=b(e.row);return P(n.data).length||P(n.values).length}function rs(e){let n=P(e.data??e.values).map((r,i)=>{let s=P(r).map(un).filter(Boolean).join("/");return s||We(oe(e.fields??e.meta)[i])||`metric_${i+1}`}).filter(Boolean);return n.length?n:oe(e.fields??e.meta).map(We).filter(Boolean)}function is(e){return oe(e.result)}function ss(e){let n=P(b(e.body).blocks).map(r=>w(b(r).text)).filter(r=>r!=="");return n.length?n.join(`
5
+ `):w(e.text)}function os(e,t,n){let r=[];for(let i of e){let s=fs(t,i.field,i.fd_id);if("unsupported"in s)return{unsupported:s.unsupported};r.push(h({name:s.field.name,fdId:s.field.fdId,fdType:s.field.fdType,filterLevel:n==="CHART"?ms(s.field.metaType):void 0,filterType:i.operator,filterValue:ps(i)}))}return{filters:r}}async function as(e,t){if(!t.length)return{dynamicParams:[]};let n=new Map,r=[];for(let a of t){let u=a.parameter.trim();if(n.has(u))return{unsupported:{capability:"unsupported_dynamic_params",parameter:u,message:`\u52A8\u6001\u53C2\u6570\u88AB\u91CD\u590D\u6307\u5B9A\uFF1A${u}`}};r.push(u),n.set(u,w(a.value))}let i=[...us(await e.get("/api/dynamic-parameter/query")),...cs()],s=[],o=new Map;for(let a of r){let u=ds(i,a);if("unsupported"in u)return{unsupported:u.unsupported};let c=cn(u.param),d=ee(c,"dpId","dp_id"),p=o.get(d);if(p)return{unsupported:{capability:"unsupported_dynamic_params",parameter:a,message:`\u52A8\u6001\u53C2\u6570 ${p} \u548C ${a} \u6307\u5411\u540C\u4E00\u4E2A dpId\uFF1A${d}`}};o.set(d,a),c.defaultValue=n.get(a)??"";let g=ls(c,a);if("unsupported"in g)return{unsupported:g.unsupported};s.push(c)}return{dynamicParams:s}}function us(e){if(Array.isArray(e))return e.map(b).filter(n=>Object.keys(n).length);let t=b(e);for(let n of["response","data"]){let r=P(t[n]).map(b).filter(i=>Object.keys(i).length);if(r.length)return r}return[]}function cs(){return[{dpId:"DATE_RANGE_PARAM_LEFT",name:"\u5F00\u59CB\u65E5\u671F\u53C2\u6570",valueType:"DATE",defaultValue:"",optionValue:[]},{dpId:"DATE_RANGE_PARAM_RIGHT",name:"\u7ED3\u675F\u65E5\u671F\u53C2\u6570",valueType:"DATE",defaultValue:"",optionValue:[]}]}function ds(e,t){let n=e.find(i=>ee(i,"dpId","dp_id")===t);if(n)return{param:n};let r=e.filter(i=>ee(i,"name")===t);return r.length===1?{param:r[0]}:r.length>1?{unsupported:{capability:"unsupported_dynamic_params",parameter:t,message:`\u52A8\u6001\u53C2\u6570\u540D\u5B58\u5728\u591A\u4E2A\u5339\u914D\u9879\uFF0C\u8BF7\u6539\u7528 dpId\uFF1A${t}`}}:{unsupported:{capability:"unsupported_dynamic_params",parameter:t,message:`\u672A\u627E\u5230\u52A8\u6001\u53C2\u6570\uFF1A${t}`}}}function ls(e,t){let n=[ee(e,"dpId","dp_id")?void 0:"dpId",ee(e,"name")?void 0:"name",ee(e,"valueType","value_type")?void 0:"valueType"].filter(r=>!!r);return n.length?{unsupported:{capability:"unsupported_dynamic_params",parameter:t,message:`\u52A8\u6001\u53C2\u6570\u7F3A\u5C11\u5FC5\u8981 BI \u5143\u4FE1\u606F\uFF1A${t}`,missing_metadata:n}}:typeof e.defaultValue!="string"?{unsupported:{capability:"unsupported_dynamic_params",parameter:t,message:`\u52A8\u6001\u53C2\u6570 defaultValue \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\uFF1A${t}`}}:{ok:!0}}function ee(e,...t){for(let n of t){let r=w(e[n]);if(r)return r}return""}function ps(e){return Ke.has(e.operator)?[]:(e.values??[]).map(w)}function ms(e){return e.toUpperCase()==="METRIC"?"AGGREGATION":"DETAIL"}function fs(e,t,n){let r=gs(e,t,n);if(!r)return{unsupported:{capability:"unsupported_filter_field",parameter:t,message:`\u7B5B\u9009\u5B57\u6BB5\u65E0\u6CD5\u4ECE\u5F53\u524D\u5361\u7247\u4E0A\u4E0B\u6587\u89E3\u6790\uFF1A${t}`,supported_fields:e.map(c=>h({name:w(c.name),fd_id:w(c.fd_id),meta_type:w(c.meta_type)}))}};let i=w(r.name),s=w(r.fd_id),o=w(r.fd_type),a=w(r.meta_type).toUpperCase(),u=[i?void 0:"name",s?void 0:"fdId",o?void 0:"fdType",a?void 0:"metaType"].filter(c=>!!c);return u.length?{unsupported:{capability:"unsupported_filter_field",parameter:t,message:`\u7B5B\u9009\u5B57\u6BB5\u7F3A\u5C11\u5FC5\u8981 BI \u5143\u4FE1\u606F\uFF1A${t}`,missing_metadata:u}}:{field:{name:i,fdId:s,fdType:o,metaType:a}}}function gs(e,t,n){if(n){let i=e.find(s=>w(s.fd_id)===n||w(s.id)===n);if(i)return i}let r=t.trim();return e.find(i=>[i.fd_id,i.id,i.name,i.alias].map(w).includes(r))}function _s(e){let t=b(e.content),n=[],r=b(b(t.source).field);Object.keys(r).length&&n.push(Zt(r));let i=b(b(t.meta).chartMain),s=b(i.zoneData);for(let[o,a]of Object.entries(s))n.push(...oe(a).map(u=>Zt(u,o)));return hs(n)}function Zt(e,t){return h({name:N(e.name,e.title,e.originTitle,e.alias),alias:N(e.alias,e.title),id:w(e.id),fd_id:N(e.fdId,e.fd_id,e.id),fd_type:N(e.fdType,e.fd_type),meta_type:N(e.metaType,e.meta_type),zone_id:N(e.zoneId,e.zone_id,t)})}function hs(e){let t=new Set;return e.filter(n=>{let r=N(n.fd_id,n.id,n.name,n.alias);return!r||t.has(r)?!1:(t.add(r),!0)})}function Is(e,t,n){if(e==="SELECTOR"||e==="TREE_SELECTOR")return Ye(t.exceedLimit)?!0:en(t,n);let r=b(t.chartMain);return Ye(r.hasMoreData)?!0:en(r,n)}function en(e,t){let n=Xe(e.count),r=Xe(e.limit);return n!==void 0&&r!==void 0&&r>0?n>r:n!==void 0&&n>t}function We(e){return N(e.alias,e.title,e.originTitle,e.name,e.fdId,e.id)??""}function un(e){let t=b(e);return Object.keys(t).length?N(t.title,t.name,t.originTitle,t.alias,t.v,t.value)??"":w(e)}function tn(e){let t=b(e);return Object.keys(t).length?"v"in t?t.v:"value"in t?t.value:un(e):e}function oe(e){return Array.isArray(e)?e.map(b).filter(t=>Object.keys(t).length):[]}function P(e){return Array.isArray(e)?e:[]}function cn(e){return JSON.parse(JSON.stringify(e))}function b(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function w(e){return typeof e=="string"?e:e==null?"":String(e)}function N(...e){return e.map(w).find(t=>t.trim())?.trim()}function Ye(e){return typeof e=="boolean"?e:void 0}function Xe(e){return typeof e=="number"&&Number.isFinite(e)?e:void 0}function dn(e,t){return t?.length?e.map(n=>Object.fromEntries(t.map(r=>[r,n[r]]))):e}function ln(e){return[...new Set(e.flatMap(t=>Object.keys(t)))]}function ys(e){let t=new Map;return e.map((n,r)=>{let i=n||`column_${r+1}`,s=t.get(i)??0;return t.set(i,s+1),s?`${i}_${s+1}`:i})}import{createHash as bs}from"crypto";import{z as f}from"zod";var Ts=6e4,J=1e4,pn=10*6e4,Ee=new Map,we=new Map,Ze=new Map,et=new Map,mn=f.object({format:f.literal("markdown").describe("\u6700\u7EC8\u7ED3\u679C\u683C\u5F0F\u3002"),content:f.string().describe("\u6700\u7EC8\u5C55\u793A\u7ED9\u8C03\u7528\u8005\u6216\u7528\u6237\u7684 markdown \u5185\u5BB9\u3002")}),fn={themes:f.array(f.object({theme_id:f.string().optional(),theme_name:f.string().optional(),is_insight_enabled:f.boolean().optional()}).passthrough()),resolved_base_url:f.string().optional(),tried_base_urls:f.array(f.string()).optional()},gn={session_id:f.string().optional(),message_id:f.string().optional(),answer:f.unknown().optional().describe("ChatBI \u540E\u7AEF\u8FD4\u56DE\u7684\u95EE\u6570\u89E3\u91CA\u6216\u539F\u59CB\u7B54\u6848\u7ED3\u6784\u3002"),sql:f.unknown().optional().describe("ChatBI \u540E\u7AEF\u751F\u6210\u7684 SQL \u4FE1\u606F\u3002"),answer_status:f.string().optional(),final_status:f.string().optional(),query_result:f.unknown().optional().describe("ChatBI \u540E\u7AEF\u8FD4\u56DE\u7684\u7ED3\u6784\u5316\u67E5\u8BE2\u7ED3\u679C\uFF0C\u901A\u5E38\u5305\u542B columns\u3001preview\u3001truncated\u3001row_limit\u3002"),resolved_base_url:f.string().optional(),tried_base_urls:f.array(f.string()).optional()},Ca={message_id:f.string().optional(),session_id:f.string().optional(),status:f.string(),detail:f.string().nullable().optional(),question:f.string().nullable().optional(),answer:f.unknown().optional(),final_result:mn.describe("\u6700\u7EC8\u5C55\u793A\u7ED3\u679C\uFF1B\u8C03\u7528\u65B9\u5E94\u4F18\u5148\u8BFB\u53D6 final_result.content\uFF0Canswer \u4EC5\u4FDD\u7559\u540E\u7AEF\u539F\u59CB\u7ED3\u679C\u3002"),resolved_base_url:f.string().optional(),tried_base_urls:f.array(f.string()).optional()},_n={theme_id:f.string().optional(),message_id:f.string().optional(),session_id:f.string().optional(),status:f.literal("started"),deduped:f.boolean(),retry_after_ms:f.number().int().nonnegative(),next_action:f.string().optional(),resolved_base_url:f.string().optional(),tried_base_urls:f.array(f.string()).optional()},hn={message_id:f.string().optional(),session_id:f.string().optional(),status:f.string(),detail:f.string().nullable().optional(),question:f.string().nullable().optional(),answer:f.unknown().optional(),throttled:f.boolean(),retry_after_ms:f.number().int().nonnegative(),final_result:mn.describe("\u6700\u7EC8\u5C55\u793A\u7ED3\u679C\uFF1B\u4EC5\u5728 status \u4E3A success \u65F6\u5B58\u5728\u3002\u8C03\u7528\u65B9\u5E94\u4F18\u5148\u8BFB\u53D6 final_result.content\uFF0Canswer \u4EC5\u4FDD\u7559\u540E\u7AEF\u539F\u59CB\u7ED3\u679C\u3002").optional(),next_action:f.string().optional(),resolved_base_url:f.string().optional(),tried_base_urls:f.array(f.string()).optional()},In={is_insight:f.boolean().optional().describe("\u662F\u5426\u53EA\u5217\u51FA\u6D1E\u5BDF\u4E3B\u9898\u3002")},yn={theme_id:f.string().min(1).optional().describe("ChatBI \u4E3B\u9898 ID\u3002"),theme_name:f.string().min(1).optional().describe("ChatBI \u4E3B\u9898\u540D\u79F0\u3002"),message:f.string().min(1).describe("\u81EA\u7136\u8BED\u8A00\u95EE\u6570\u95EE\u9898\u3002"),session_id:f.string().min(1).optional().describe("\u53EF\u9009\u4F1A\u8BDD ID\uFF0C\u7528\u4E8E\u95EE\u6570\u7EED\u95EE\u3002\u540C\u4E00\u4E2A session_id \u53EA\u80FD\u7EE7\u7EED\u95EE\u6570\uFF0C\u4E0D\u80FD\u518D\u7528\u4E8E\u6D1E\u5BDF\u3002"),external_context:f.string().min(1).optional().describe("\u53EF\u9009\u5916\u90E8\u4E0A\u4E0B\u6587\u3002")},Ba={theme_id:f.string().min(1).optional().describe("ChatBI \u4E3B\u9898 ID\u3002"),theme_name:f.string().min(1).optional().describe("ChatBI \u4E3B\u9898\u540D\u79F0\u3002"),message:f.string().min(1).describe("\u81EA\u7136\u8BED\u8A00\u6D1E\u5BDF\u95EE\u9898\u3002"),session_id:f.string().min(1).optional().describe("\u53EF\u9009\u4F1A\u8BDD ID\uFF0C\u7528\u4E8E\u6D1E\u5BDF\u7EED\u95EE\u3002\u540C\u4E00\u4E2A session_id \u53EA\u80FD\u7EE7\u7EED\u6D1E\u5BDF\uFF0C\u4E0D\u80FD\u518D\u7528\u4E8E\u95EE\u6570\u3002"),external_context:f.string().min(1).optional().describe("\u53EF\u9009\u5916\u90E8\u4E0A\u4E0B\u6587\u3002"),timeout_ms:f.number().int().positive().optional().describe("\u7B49\u5F85\u6D1E\u5BDF\u5B8C\u6210\u7684\u8D85\u65F6\u65F6\u95F4\uFF0C\u9ED8\u8BA4 300000ms\u3002"),poll_interval_ms:f.number().int().positive().optional().describe("\u8F6E\u8BE2\u95F4\u9694\uFF0C\u9ED8\u8BA4 2000ms\u3002")},bn={theme_id:f.string().min(1).optional().describe("ChatBI \u4E3B\u9898 ID\u3002"),theme_name:f.string().min(1).optional().describe("ChatBI \u4E3B\u9898\u540D\u79F0\u3002"),message:f.string().min(1).describe("\u81EA\u7136\u8BED\u8A00\u6D1E\u5BDF\u95EE\u9898\u3002\u6D1E\u5BDF\u901A\u5E38\u8017\u65F6 2-3 \u5206\u949F\uFF0C5 \u5206\u949F\u89C6\u4E3A\u8D85\u65F6\uFF1B\u540C\u4E00\u95EE\u9898\u53EA\u53D1\u8D77\u4E00\u6B21\u3002"),session_id:f.string().min(1).optional().describe("\u53EF\u9009\u4F1A\u8BDD ID\uFF0C\u7528\u4E8E\u6D1E\u5BDF\u7EED\u95EE\u3002\u540C\u4E00\u4E2A session_id \u53EA\u80FD\u7EE7\u7EED\u6D1E\u5BDF\uFF0C\u4E0D\u80FD\u518D\u7528\u4E8E\u95EE\u6570\u3002"),external_context:f.string().min(1).optional().describe("\u53EF\u9009\u5916\u90E8\u4E0A\u4E0B\u6587\u3002")},Tn={theme_id:f.string().min(1).optional().describe("ChatBI \u4E3B\u9898 ID\u3002\u4F18\u5148\u4F7F\u7528 chatbi_insight_start \u8FD4\u56DE\u7684 theme_id\u3002"),theme_name:f.string().min(1).optional().describe("ChatBI \u4E3B\u9898\u540D\u79F0\uFF1B\u672A\u63D0\u4F9B theme_id \u65F6\u4F1A\u6309\u540D\u79F0\u67E5\u627E\u6D1E\u5BDF\u4E3B\u9898\u3002"),message_id:f.string().min(1).describe("chatbi_insight_start \u8FD4\u56DE\u7684\u6D88\u606F ID\u3002\u5EFA\u8BAE\u81F3\u5C11\u95F4\u9694 10 \u79D2\u67E5\u8BE2\u4E00\u6B21\uFF0C5 \u5206\u949F\u540E\u505C\u6B62\u7B49\u5F85\u3002")};async function Cn(e,t){let n=new v(e);try{let r=await n.listThemes({isInsight:t.is_insight});return B({themes:r,resolved_base_url:n.getResolvedBaseUrl(),tried_base_urls:n.getTriedBaseUrls()})}catch(r){return Re(n,r,"listThemes")}}async function Bn(e,t){let n=new v(e);try{let r=await n.query({themeId:t.theme_id,themeName:t.theme_name,message:t.message,sessionId:t.session_id,externalContext:t.external_context,fastMode:!0});return B({session_id:r.session_id,message_id:r.message_id,answer:r.answer,sql:r.sql,answer_status:r.answer_status,final_status:r.final_status,query_result:r.query_result,resolved_base_url:n.getResolvedBaseUrl(),tried_base_urls:n.getTriedBaseUrls()})}catch(r){return Re(n,r,"query")}}async function En(e,t){let n=new v(e);try{let r=Sn({caller_scope:Rn(e),theme_id:t.theme_id,theme_name:t.theme_name,message:t.message,session_id:t.session_id,external_context:t.external_context}),i=Cs(r);if(i)return B({...i,deduped:!0,retry_after_ms:J,next_action:"\u540C\u4E00\u6D1E\u5BDF\u95EE\u9898\u521A\u521A\u5DF2\u7ECF\u53D1\u8D77\uFF0C\u5DF2\u590D\u7528\u5DF2\u6709 message_id\u3002\u8BF7\u4F7F\u7528 chatbi_insight_poll \u67E5\u8BE2\u7ED3\u679C\u3002"});let s=Ze.get(r);if(s){let u=await s;return B({...u,deduped:!0,retry_after_ms:J,next_action:"\u540C\u4E00\u6D1E\u5BDF\u95EE\u9898\u6B63\u5728\u53D1\u8D77\u4E2D\uFF0C\u5DF2\u590D\u7528\u5DF2\u6709\u8BF7\u6C42\u7ED3\u679C\u3002\u8BF7\u4F7F\u7528 chatbi_insight_poll \u67E5\u8BE2\u7ED3\u679C\u3002"})}let o=n.startInsight({themeId:t.theme_id,themeName:t.theme_name,message:t.message,sessionId:t.session_id,externalContext:t.external_context}).then(u=>{let c={theme_id:u.theme_id,message_id:u.message_id,session_id:u.session_id,status:"started"};return Bs(r,c),c}).finally(()=>{Ze.delete(r)});Ze.set(r,o);let a=await o;return B({...a,deduped:!1,retry_after_ms:J,next_action:"\u6D1E\u5BDF\u4EFB\u52A1\u5DF2\u53D1\u8D77\u3002\u6D1E\u5BDF\u901A\u5E38\u8017\u65F6 2-3 \u5206\u949F\uFF0C\u8BF7\u4F7F\u7528 chatbi_insight_poll \u643A\u5E26 theme_id \u548C message_id \u67E5\u8BE2\u7ED3\u679C\uFF1B5 \u5206\u949F\u540E\u4ECD\u672A\u6210\u529F\u53EF\u89C6\u4E3A\u8D85\u65F6\u3002",resolved_base_url:n.getResolvedBaseUrl(),tried_base_urls:n.getTriedBaseUrls()})}catch(r){return Re(n,r,"insight.start")}}async function wn(e,t){let n=new v(e);try{let r=Sn({caller_scope:Rn(e),message_id:t.message_id}),i=Es(r);if(i){let p=tt(i.result),g=rt(i.result,!0);return B({message_id:i.result.message_id,session_id:i.result.session_id,status:i.result.status,detail:nt(i.result),question:i.result.question,answer:i.result.answer,throttled:!0,retry_after_ms:i.retryAfterMs,...p,next_action:g})}let s=et.get(r);if(s){let p=await s,g=st(p.status),I=tt(p),T=rt(p,!0);return B({message_id:p.message_id,session_id:p.session_id,status:p.status,detail:nt(p),question:p.question,answer:p.answer,throttled:!0,retry_after_ms:g?0:J,...I,next_action:T})}let o=n.pollInsight({themeId:t.theme_id,themeName:t.theme_name,messageId:t.message_id}).then(p=>(ws(r,p),p)).finally(()=>{et.delete(r)});et.set(r,o);let a=await o,u=st(a.status),c=tt(a),d=rt(a,!1);return B({message_id:a.message_id,session_id:a.session_id,status:a.status,detail:nt(a),question:a.question,answer:a.answer,throttled:!1,retry_after_ms:u?0:J,...c,next_action:d,resolved_base_url:n.getResolvedBaseUrl(),tried_base_urls:n.getTriedBaseUrls()})}catch(r){return Re(n,r,"insight.poll")}}function tt(e){return e.status!=="success"?{}:{final_result:{format:"markdown",content:On(e)}}}function nt(e){return e.detail!=null?e.detail:e.status==="failure"||e.status==="stopped"?Ss(e):e.detail}function rt(e,t){if(e.status!=="success")return e.status==="waiting"?t?"\u540C\u4E00 message_id \u6B63\u5728\u67E5\u8BE2\u4E2D\u6216\u521A\u521A\u67E5\u8BE2\u8FC7\uFF0C\u5DF2\u8FD4\u56DE\u5DF2\u6709\u7ED3\u679C\uFF1B\u8BF7\u81F3\u5C11\u95F4\u9694 10 \u79D2\u518D\u67E5\u3002":"\u6D1E\u5BDF\u4EFB\u52A1\u4ECD\u5728\u6267\u884C\u4E2D\uFF0C\u8BF7\u7A0D\u540E\u7EE7\u7EED\u8C03\u7528 chatbi_insight_poll \u67E5\u8BE2\u7ED3\u679C\u3002":e.status==="failure"||e.status==="stopped"?"\u6D1E\u5BDF\u4EFB\u52A1\u672A\u6210\u529F\u5B8C\u6210\uFF0C\u8BF7\u67E5\u770B detail\uFF1B\u5982\u9700\u91CD\u8BD5\u8BF7\u91CD\u65B0\u8C03\u7528 chatbi_insight_start\u3002":"\u6D1E\u5BDF\u4EFB\u52A1\u5904\u4E8E\u975E\u6210\u529F\u72B6\u6001\uFF0C\u8BF7\u67E5\u770B status \u548C detail \u540E\u51B3\u5B9A\u662F\u5426\u7EE7\u7EED\u67E5\u8BE2\u3002"}function Cs(e){Se();let t=Ee.get(e);if(!(!t||Date.now()-t.createdAt>=Ts))return t.result}function Bs(e,t){Se(),Ee.set(e,{createdAt:Date.now(),result:t})}function Es(e){Se();let t=we.get(e);if(!t)return;let n=Date.now()-t.checkedAt,r=st(t.result.status);if(!(!r&&n>=J))return{result:t.result,retryAfterMs:r?0:Math.max(0,J-n)}}function st(e){return e==="success"||e==="failure"||e==="stopped"}function ws(e,t){Se(),we.set(e,{checkedAt:Date.now(),result:t})}function Se(){let e=Date.now();for(let[t,n]of Ee)e-n.createdAt>=pn&&Ee.delete(t);for(let[t,n]of we)e-n.checkedAt>=pn&&we.delete(t)}function Sn(e){return JSON.stringify(Object.keys(e).sort().reduce((t,n)=>{let r=e[n];return typeof r<"u"&&(t[n]=r),t},{}))}function Rn(e){return e.BI_PAT?`pat:${it(e.BI_PAT)}`:e.BI_UID_TOKEN?`uid:${it(e.BI_UID_TOKEN)}`:`login:${it(`${e.BI_LOGIN_DOMAIN??""}\0${e.BI_LOGIN_ID??""}`)}`}function it(e){return bs("sha256").update(e).digest("hex").slice(0,16)}function On(e){let t=e.answer?.trim();if(t)return ks(t);let n=e.detail?.trim();return n||"\u5206\u6790\u5DF2\u5B8C\u6210\uFF0C\u4F46\u6CA1\u6709\u53EF\u5C55\u793A\u7684 markdown \u5185\u5BB9\u3002"}function Ss(e){switch(e.status){case"success":return On(e);case"waiting":return"\u6D1E\u5BDF\u4EFB\u52A1\u4ECD\u5728\u6267\u884C\u4E2D\uFF0C\u8BF7\u7A0D\u540E\u7EE7\u7EED\u8C03\u7528 chatbi_insight_poll \u67E5\u8BE2\u7ED3\u679C\u3002";case"failure":case"stopped":return e.detail?.trim()||"\u6D1E\u5BDF\u4EFB\u52A1\u672A\u6210\u529F\u5B8C\u6210\u3002";default:return e.detail?.trim()||`\u6D1E\u5BDF\u4EFB\u52A1\u5F53\u524D\u72B6\u6001\uFF1A${e.status}`}}function Rs(e,t){let n=[`| ${e.join(" | ")} |`,`|${e.map(()=>" --- ").join("|")}|`];for(let r of t)n.push(`| ${e.map((i,s)=>As(Os(r[s]))).join(" | ")} |`);return n.join(`
6
+ `)}function Os(e){return e===null||typeof e>"u"||e===""?"-":String(e)}function As(e){return e.replaceAll(`\r
7
7
  `,"<br>").replaceAll(`
8
- `,"<br>").replaceAll("\r","<br>").replaceAll("|","\\|")}function Ts(e,t){return e?t&&t>0?`\u7ED3\u679C\u5DF2\u622A\u65AD\uFF0C\u4EC5\u5C55\u793A\u524D ${t} \u884C\u3002`:"\u7ED3\u679C\u5DF2\u622A\u65AD\uFF0C\u4EC5\u5C55\u793A\u90E8\u5206\u6570\u636E\u3002":""}function Cs(e){let t=/```GuanViz\.json\n([\s\S]*?)\n```/g;return e.replace(t,(n,r)=>Bs(r)??n)}function Bs(e){try{let t=JSON.parse(e),n=t.data_info?.columns,r=t.data_info?.preview;if(!Array.isArray(n)||!n.length||!Array.isArray(r))return;let i=n.map(d=>d.name??"-"),s=ws(t.viz_config),o=Ss(i,r,s),a=r.map(d=>i.map((p,_)=>Rs(d[_],s.get(p),o.get(p)))),c=Is(i,a),u=Ts(!!t.data_info?.truncated,t.data_info?.row_limit);return u?`${c}
8
+ `,"<br>").replaceAll("\r","<br>").replaceAll("|","\\|")}function Ps(e,t){return e?t&&t>0?`\u7ED3\u679C\u5DF2\u622A\u65AD\uFF0C\u4EC5\u5C55\u793A\u524D ${t} \u884C\u3002`:"\u7ED3\u679C\u5DF2\u622A\u65AD\uFF0C\u4EC5\u5C55\u793A\u90E8\u5206\u6570\u636E\u3002":""}function ks(e){let t=/```GuanViz\.json\n([\s\S]*?)\n```/g;return e.replace(t,(n,r)=>vs(r)??n)}function vs(e){try{let t=JSON.parse(e),n=t.data_info?.columns,r=t.data_info?.preview;if(!Array.isArray(n)||!n.length||!Array.isArray(r))return;let i=n.map(d=>d.name??"-"),s=Ms(t.viz_config),o=Ds(i,r,s),a=r.map(d=>i.map((p,g)=>js(d[g],s.get(p),o.get(p)))),u=Rs(i,a),c=Ps(!!t.data_info?.truncated,t.data_info?.row_limit);return c?`${u}
9
9
 
10
- ${u}`:c}catch{return}}var rt=new Map([["k",1e3],["K",1e3],["M",1e6],["B",1e9],["\u4E07",1e4],["\u4EBF",1e8]]),Es=[[1e8,"\u4EBF"],[1e4,"\u4E07"]];function ws(e){let t=e?.chartMeta?.chartMain?.zoneData?.metric,n=new Map;if(!Array.isArray(t))return n;for(let r of t)r.name&&r.fieldFormat?.numberFormat&&n.set(r.name,r.fieldFormat.numberFormat);return n}function Ss(e,t,n){let r=new Map;for(let[i,s]of e.entries()){let o=n.get(s);if(o?.prefixUnit!=="auto")continue;let a=0;for(let u of t){let d=En(u[i]);typeof d=="number"&&(a=Math.max(a,Math.abs(d/wn(o))))}let c=Ps(a);c&&r.set(s,c)}return r}function Rs(e,t,n){if(!t)return e;let r=En(e);return typeof r!="number"?e:Os(r,t,n)}function En(e){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e!="string")return;let t=Number(e.trim());return Number.isFinite(t)?t:void 0}function Os(e,t,n){let r=wn(t),{unit:i,shouldScale:s}=As(t,n),o=s&&i?rt.get(i)??1:1,a=e/r/o,c=ks(t.decimalPlaces),u=t.useThousandsSeparator?a.toLocaleString("en-US",{minimumFractionDigits:c,maximumFractionDigits:c}):a.toFixed(c),d=i&&t.showPrefixUnit!==!1?i:"",p=t.showSuffix===!1||typeof t.suffix!="string"?"":t.suffix;return`${u}${d}${p}`}function wn(e){if(e.showPrefixUnit!==!1&&typeof e.prefixUnit=="string"&&e.prefixUnit!=="auto"&&rt.has(e.prefixUnit))return 1;let t=Number(e.divideDataBy??1);return Number.isFinite(t)&&t!==0?t:1}function As(e,t){return e.showPrefixUnit===!1?{unit:"",shouldScale:!1}:e.prefixUnit==="auto"?{unit:t??"",shouldScale:!0}:typeof e.prefixUnit=="string"&&rt.has(e.prefixUnit)?{unit:e.prefixUnit,shouldScale:!0}:{unit:"",shouldScale:!1}}function ks(e){return typeof e!="number"||!Number.isFinite(e)?2:Math.max(0,Math.min(100,Math.trunc(e)))}function Ps(e){return Es.find(([t])=>e>=t)?.[1]??""}function we(e,t,n){let r=vs(e,t,n);return q({error:"chatbi_request_failed",requested_operation:n,...r,tried_base_urls:r.tried_base_urls??e.getTriedBaseUrls()})}function vs(e,t,n){return t instanceof O?t.detail:e.getLastError()??{operation:n,detail:t instanceof Error?t.message:String(t)}}import{z as it}from"zod";var Sn={dsId:it.string().min(1).describe("\u6570\u636E\u96C6 ID\u3002")},Rn={cdId:it.string().min(1).describe("\u5361\u7247 ID\u3002")},On={pageId:it.string().min(1).describe("\u9875\u9762/\u4EEA\u8868\u677F ID\u3002")};async function An(e,t){let n=await e.get(`/api/data-source/${encodeURIComponent(t.dsId)}`);return M(n)}async function kn(e,t){let n=await e.get(`/api/card/${encodeURIComponent(t.cdId)}`);return M(n)}async function Pn(e,t){let n=await e.get(`/api/page/${encodeURIComponent(t.pageId)}`);return M(n)}import{z as L}from"zod";var xs=L.object({name:L.string().min(1),query:L.string().min(1)}),vn={query:L.string().min(1).describe("\u8981\u6267\u884C\u7684\u67E5\u8BE2 SQL\u3002FROM \u540E\u5199\u6570\u636E\u96C6\u540D\u79F0/name\uFF1B\u4E2D\u6587\u6216\u7279\u6B8A\u5B57\u7B26\u540D\u79F0\u7528\u53CD\u5F15\u53F7\u3002\u652F\u6301\u5355\u8868\u6216\u591A\u8868\u8054\u67E5\uFF0C\u4EC5\u9650\u67E5\u8BE2\u8BED\u53E5\uFF0C\u5EFA\u8BAE\u663E\u5F0F\u5199 LIMIT\u3002\u591A\u8868\u8054\u67E5\u8981\u6C42\u53C2\u4E0E\u7684\u6570\u636E\u96C6\u8981\u4E48\u5747\u4E3A\u62BD\u53D6\u6570\u636E\u96C6\uFF0C\u8981\u4E48\u5747\u4E3A\u6765\u81EA\u540C\u4E00\u6570\u636E\u8D26\u6237\u548C\u6570\u636E\u5E93\u7684\u76F4\u8FDE\u6570\u636E\u96C6\u3002"),inputs:L.array(L.string().min(1)).min(1).describe("SQL \u67E5\u8BE2\u4F9D\u8D56\u7684\u6570\u636E\u96C6 ID \u5217\u8868\uFF0C\u7528\u4E8E BI \u7ED1\u5B9A/\u6388\u6743\u6570\u636E\u96C6\uFF1B\u5355\u8868\u67E5\u8BE2\u4F20 1 \u4E2A\uFF0C\u591A\u8868\u8054\u67E5\u4F20\u591A\u4E2A\u3002\u591A\u8868\u8054\u67E5\u8981\u6C42\u8FD9\u4E9B\u6570\u636E\u96C6\u8981\u4E48\u5747\u4E3A\u62BD\u53D6\uFF0C\u8981\u4E48\u5747\u4E3A\u6765\u81EA\u540C\u4E00\u6570\u636E\u8D26\u6237\u548C\u6570\u636E\u5E93\u7684\u76F4\u8FDE\u3002"),queryStructure:L.object({ctes:L.array(xs).optional(),mainQuery:L.string().optional()}).optional().describe("\u7ED3\u6784\u5316\u67E5\u8BE2\u4FE1\u606F\uFF0C\u53EF\u7528\u4E8E\u62C6\u5206 CTE \u548C\u4E3B\u67E5\u8BE2\u3002")};async function xn(e,t,n){try{await Pt(e,t,"executeSqlQuery");let r=await e.post("/api/data-source/execute-sql-query",{...n,limit:t.BI_MAX_ROWS});return M({maxRowsHint:t.BI_MAX_ROWS,result:r})}catch(r){if(Ms(r))return Te("execute_sql_query",r,{hint:"\u8BF7\u5728\u7BA1\u7406\u540E\u53F0 -> \u9AD8\u7EA7\u8BBE\u7F6E -> \u5BF9\u5E94\u57DF\u540D\u4E0B\uFF0C\u6253\u5F00\u9AD8\u7EA7SQL\u67E5\u8BE2\u529F\u80FD\u3002"});throw r}}function Ms(e){return e instanceof Error&&e.message.includes("POST /api/data-source/execute-sql-query HTTP 404")}import{z as U}from"zod";var Mn={keyword:U.string().default("").describe("\u641C\u7D22\u5173\u952E\u8BCD\uFF0C\u7559\u7A7A\u65F6\u8FD4\u56DE\u8D44\u6E90\u5217\u8868\u3002"),resourceType:U.enum(["ALL","CARD","DASHBOARD","DATA_SET","ETL"]).optional().default("ALL"),limit:U.number().int().min(1).max(100).optional().default(20),offset:U.number().int().min(0).optional().default(0),utimeStartTime:U.number().int().optional().describe("\u66F4\u65B0\u65F6\u95F4\u8D77\u70B9\uFF0C\u6BEB\u79D2\u65F6\u95F4\u6233\u3002"),utimeEndTime:U.number().int().optional().describe("\u66F4\u65B0\u65F6\u95F4\u7EC8\u70B9\uFF0C\u6BEB\u79D2\u65F6\u95F4\u6233\u3002"),cardType:U.string().optional().describe("\u5361\u7247\u7C7B\u578B\u8FC7\u6EE4\uFF0C\u4EC5 resourceType \u5305\u542B CARD \u65F6\u4F7F\u7528\u3002"),permissionType:U.string().optional(),orderBy:U.string().optional(),isDesc:U.boolean().optional()};async function Dn(e,t){let{cardType:n,...r}=t,i={...r,specificResourceFilters:n?{cardType:n}:void 0},s=await e.post("/api/global-search",i);return M(s)}import{z as m}from"zod";var dt=m.enum(["asc","desc"]),Ds=m.enum(["EQ","NE","IN","NI","GT","GE","LT","LE","BT","CLOSE_BT_OPEN","OPEN_BT_CLOSE","OPEN_BT_OPEN","IS_NULL","NOT_NULL","CONTAINS","NOT_CONTAINS","STARTSWITH","NOT_STARTSWITH","ENDSWITH","NOT_ENDSWITH","STARTSWITH_USER_PROPERTIES","STARTSWITH_GLOBAL_PARAMS"]),Un=new Set(["BT","CLOSE_BT_OPEN","OPEN_BT_CLOSE","OPEN_BT_OPEN"]),ot=new Set(["IS_NULL","NOT_NULL"]),$n=m.object({field:m.string().min(1).describe("\u7B5B\u9009\u5B57\u6BB5\u540D\u79F0\u6216\u5B57\u6BB5 ID\u3002"),operator:Ds.describe("BI \u539F\u751F\u7B5B\u9009\u64CD\u4F5C\u7B26\uFF0C\u4F8B\u5982 GE/LE/NI/CONTAINS\u3002\u533A\u95F4\u64CD\u4F5C\u7B26\u9700\u8981\u4F20\u4E24\u4E2A\u503C\u3002"),values:m.array(m.union([m.string(),m.number(),m.boolean()])).optional().describe("\u7B5B\u9009\u503C\u3002IS_NULL/NOT_NULL \u4E0D\u9700\u8981\u4F20\u503C\u3002"),fd_id:m.string().min(1).optional().describe("\u5DF2\u77E5\u5B57\u6BB5 ID \u65F6\u53EF\u76F4\u63A5\u6307\u5B9A\u3002")}).superRefine((e,t)=>{let n=e.values?.length??0;ot.has(e.operator)&&n>0&&t.addIssue({code:m.ZodIssueCode.custom,path:["values"],message:`${e.operator} \u64CD\u4F5C\u7B26\u4E0D\u63A5\u53D7\u7B5B\u9009\u503C\u3002`}),Un.has(e.operator)&&n!==2&&t.addIssue({code:m.ZodIssueCode.custom,path:["values"],message:`${e.operator} \u64CD\u4F5C\u7B26\u9700\u8981\u6070\u597D 2 \u4E2A\u503C\u3002`}),!Un.has(e.operator)&&!ot.has(e.operator)&&n<1&&t.addIssue({code:m.ZodIssueCode.custom,path:["values"],message:`${e.operator} \u64CD\u4F5C\u7B26\u81F3\u5C11\u9700\u8981 1 \u4E2A\u503C\u3002`})}),Us=m.object({field:m.string().min(1).describe("\u6392\u5E8F\u5B57\u6BB5\u540D\u79F0\u6216\u5B57\u6BB5 ID\u3002"),direction:dt.describe("\u6392\u5E8F\u65B9\u5411\u3002")}),js=m.object({type:m.enum(["compare","xtd","last","recent","percentage","rank_top"]),compare:m.enum(["yoy","mom","qoq","wow","dod"]).optional(),compare_value:m.enum(["value","rate","rawdata"]).optional(),xtd:m.enum(["ytd","qtd","mtd","wtd","dtd"]).optional(),recent:m.string().regex(/^[1-9]\d*[dwmqy]$/).optional(),recent_base:m.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),percentage_dim:m.string().min(1).optional(),rank_top:m.number().int().positive().optional(),rank_order:dt.optional(),rank_dim:m.string().min(1).optional()}),Fn={keyword:m.string().min(1).optional().describe("\u6307\u6807\u540D\u79F0\u5173\u952E\u8BCD\u3002"),project_id:m.string().min(1).optional().describe("\u6307\u6807\u4E3B\u9898 ID\uFF1B\u4E0D\u4F20\u5219\u8DE8\u53EF\u8BBF\u95EE\u4E3B\u9898\u641C\u7D22\u3002"),dir_id:m.string().min(1).optional().describe("\u76EE\u5F55 ID\u3002"),status:m.string().min(1).optional().describe("\u4E0A\u7EBF\u72B6\u6001\uFF0C\u4F20\u6307\u6807\u5E73\u53F0\u7684\u72B6\u6001\u4EE3\u7801\uFF1APUBLISHED\uFF08\u5DF2\u4E0A\u7EBF\uFF09\u3001UNPUBLISHED\uFF08\u672A\u4E0A\u7EBF\uFF09\u3002"),sub_types:m.array(m.string().min(1)).optional().describe("\u6307\u6807\u7C7B\u578B\u4EE3\u7801\u5217\u8868\uFF0C\u4F8B\u5982 ATOMIC\uFF08\u539F\u5B50\uFF09\u3001DERIVED\uFF08\u884D\u751F\uFF09\u3001COMPOSITE\uFF08\u590D\u5408\uFF09\u3002"),order_by:m.enum(["utimeDesc","utimeAsc"]).optional().describe("\u6392\u5E8F\u65B9\u5F0F\uFF1AutimeDesc \u6309\u66F4\u65B0\u65F6\u95F4\u5012\u5E8F\uFF0CutimeAsc \u6309\u66F4\u65B0\u65F6\u95F4\u6B63\u5E8F\u3002"),limit:m.number().int().positive().max(200).optional().default(20).describe("\u6700\u591A\u8FD4\u56DE\u6761\u6570\u3002")},Vn={project_id:m.string().min(1).optional().describe("\u6307\u6807\u4E3B\u9898 ID\u3002"),keyword:m.string().min(1).optional().describe("\u540D\u79F0\u5173\u952E\u8BCD\uFF0C\u53EF\u5339\u914D\u4E3B\u9898\u3001\u76EE\u5F55\u6216\u6307\u6807\u3002"),raw:m.boolean().optional().describe("\u662F\u5426\u8FD4\u56DE\u539F\u59CB\u54CD\u5E94\u3002")},zn={metric_id:m.string().min(1).describe("\u6307\u6807 ID\u3002"),brief:m.boolean().optional().describe("\u662F\u5426\u53EA\u8FD4\u56DE\u8BE6\u60C5\uFF0C\u4E0D\u8865\u5145\u8840\u7F18\u3002"),raw:m.boolean().optional().describe("\u662F\u5426\u8FD4\u56DE\u539F\u59CB\u8BE6\u60C5\u3002")},Qn={metric_id:m.string().min(1).describe("\u6307\u6807 ID\u3002"),dimensions:m.array(m.string().min(1)).optional().describe("\u6309\u540D\u79F0\u6216\u5B57\u6BB5 ID \u6307\u5B9A\u67E5\u8BE2\u7EF4\u5EA6\u3002"),filters:m.array($n).optional().describe("\u7B5B\u9009\u6761\u4EF6\u3002"),combine_type:m.enum(["AND","OR"]).optional().default("AND").describe("\u591A\u4E2A\u7B5B\u9009\u6761\u4EF6\u7684\u7EC4\u5408\u65B9\u5F0F\u3002"),sort:m.array(Us).optional().describe("\u6392\u5E8F\u5B57\u6BB5\u3002"),columns:m.array(m.string().min(1)).optional().describe("\u7ED3\u679C\u5217\u88C1\u526A\u3002"),limit:m.number().int().positive().max(1e3).optional().default(100).describe("\u6700\u591A\u8FD4\u56DE\u884C\u6570\u3002"),advanced_calc:js.optional().describe("\u9AD8\u7EA7\u8BA1\u7B97\uFF0C\u53EA\u4F7F\u7528\u6307\u6807\u6570\u636E\u67E5\u8BE2\u63A5\u53E3\u8868\u8FBE\u3002"),raw:m.boolean().optional().describe("\u662F\u5426\u8FD4\u56DE\u539F\u59CB\u54CD\u5E94\u3002")},Kn={keyword:m.string().min(1).optional().describe("\u6307\u6807\u6811\u540D\u79F0\u5173\u952E\u8BCD\u3002"),project_id:m.string().min(1).optional().describe("\u6839\u6307\u6807\u6240\u5C5E\u4E3B\u9898 ID\u3002"),parent_dir_id:m.string().min(1).optional().describe("\u6307\u6807\u6811\u76EE\u5F55 ID\u3002"),order_by:m.enum(["utimeDesc","utimeAsc"]).optional().default("utimeDesc").describe("\u6392\u5E8F\u65B9\u5F0F\uFF1AutimeDesc \u6309\u66F4\u65B0\u65F6\u95F4\u5012\u5E8F\uFF08\u9ED8\u8BA4\uFF09\uFF0CutimeAsc \u6309\u66F4\u65B0\u65F6\u95F4\u6B63\u5E8F\u3002"),limit:m.number().int().positive().max(200).optional().default(20).describe("\u6700\u591A\u8FD4\u56DE\u6761\u6570\u3002")},Wn={metric_tree_id:m.string().min(1).describe("\u6307\u6807\u6811 ID\u3002"),raw:m.boolean().optional().describe("\u662F\u5426\u8FD4\u56DE\u539F\u59CB\u8BE6\u60C5\u3002")},Yn={metric_tree_id:m.string().min(1).describe("\u6307\u6807\u6811 ID\u3002"),target:m.enum(["metric","dimension","scan"]).describe("\u5F52\u56E0\u7C7B\u578B\uFF1A\u6307\u6807\u62C6\u89E3\u3001\u5355\u7EF4\u62C6\u89E3\u6216\u5168\u7EF4\u626B\u63CF\u3002"),dimension:m.string().min(1).optional().describe("target=dimension \u65F6\u6309\u7EF4\u5EA6\u540D\u79F0\u6307\u5B9A\u3002"),dimension_fd_id:m.string().min(1).optional().describe("target=dimension \u65F6\u6309\u5B57\u6BB5 ID \u6307\u5B9A\u3002"),scan_dimensions:m.array(m.string().min(1)).optional().describe("target=scan \u65F6\u6307\u5B9A\u626B\u63CF\u7EF4\u5EA6\u540D\u79F0\u3002"),exclude_dimensions:m.array(m.string().min(1)).optional().describe("target=scan \u65F6\u6392\u9664\u7EF4\u5EA6\u540D\u79F0\u3002"),period:m.string().min(1).optional().describe("\u5F53\u524D\u671F\uFF0C\u914D\u5408 last_period \u8986\u76D6\u9ED8\u8BA4\u65F6\u95F4\u5BF9\u6BD4\u3002"),last_period:m.string().min(1).optional().describe("\u5BF9\u6BD4\u671F\uFF0C\u914D\u5408 period \u8986\u76D6\u9ED8\u8BA4\u65F6\u95F4\u5BF9\u6BD4\u3002"),time_comparison_json:m.record(m.string(),m.unknown()).optional().describe("\u5B8C\u6574\u65F6\u95F4\u5BF9\u6BD4\u914D\u7F6E\u8986\u76D6\u3002"),filters:m.array($n).optional().describe("\u5F52\u56E0\u7B5B\u9009\u6761\u4EF6\u3002"),limit:m.number().int().positive().max(200).optional().default(20).describe("metric/dimension \u8FD4\u56DE\u884C\u6570\u3002"),group_limit:m.number().int().positive().max(50).optional().default(5).describe("scan \u6BCF\u4E2A\u7EF4\u5EA6\u8FD4\u56DE\u884C\u6570\u3002"),sort:dt.optional().default("desc").describe("\u6309\u8D21\u732E\u503C\u6392\u5E8F\u65B9\u5411\u3002"),raw:m.boolean().optional().describe("\u662F\u5426\u8FD4\u56DE\u539F\u59CB\u54CD\u5E94\u3002")},G={summary:m.unknown().optional(),items:m.array(m.unknown()).optional(),tree:m.unknown().optional(),detail:m.unknown().optional(),columns:m.array(m.unknown()).optional(),rows:m.array(m.unknown()).optional(),raw:m.unknown().optional(),diagnostic:m.unknown().optional(),status:m.string().optional()};async function Xn(e,t,n){let r=new D(e,t);try{let i=n.project_id?[n.project_id]:await Ns(r),s=[];for(let a of i){let c=await r.searchMetrics({projectId:a,dirId:n.dir_id,keyword:n.keyword,status:n.status,subTypes:n.sub_types,orderBy:n.order_by});if(s.push(...Ls(c)),s.length>=n.limit)break}let o=lo(s.map(at),"metric_id").slice(0,n.limit);return B({summary:{keyword:n.keyword,project_id:n.project_id,count:o.length,searched_project_count:i.length,truncated:o.length<s.length},items:o})}catch(i){return F(i,"search_metrics")}}async function Zn(e,t,n){let r=new D(e,t);try{try{let i=await r.listMetricFullTree({projectId:n.project_id,keyword:n.keyword});return B({summary:{source:"full-tree"},tree:Gs(i),raw:n.raw?i:void 0})}catch(i){let s=n.project_id?[{id:n.project_id}]:await sr(r),o=[];for(let a of s){let c=l(a.id);if(!c)continue;let u=await r.listMetricDirectoryTree(c);o.push({id:c,name:l(a.name)||c,type:"project",project_id:c,children:Hs(u,c)})}return B({summary:{source:"directory-fallback",fallback_reason:i instanceof Error?i.message:String(i)},tree:o})}}catch(i){return F(i,"list_metric_catalog")}}async function er(e,t,n){let r=new D(e,t);try{let i=await r.getMetricDetail(n.metric_id),s=Js(i),o,a;if(!n.brief){let c=l(i.uniformResourceType)||"METRIC_PLATFORM_METRIC";try{o=$s(await r.getMetricLineage(n.metric_id,c))}catch(u){a=u instanceof H?u.detail:String(u)}}return B({detail:{...s,lineage:o,lineage_error:a},raw:n.raw?i:void 0})}catch(i){return F(i,"get_metric_detail")}}async function tr(e,t,n){let r=new D(e,t);try{let i=await r.getMetricDetail(n.metric_id);if(!n.advanced_calc){let a=Nn(i,n);if("unsupported"in a)return x("query_metric_data",a.unsupported);let c=async p=>{let _=await r.getCardEditSession(a.cardId),I=l(_.sessionId);if(!I)throw new Error("\u6307\u6807\u5361\u7247\u9884\u89C8\u4F1A\u8BDD\u54CD\u5E94\u7F3A\u5C11 sessionId\u3002");return a.dimensions.length&&await Fs(r,a.cardId,I,a.dimensions),{raw:await r.queryCardEditData(a.cardId,I,p),sessionId:I}};if(n.combine_type==="OR"&&(n.filters?.length??0)>1){let p=[],_=[];for(let I of n.filters??[]){let b=Nn(i,{...n,combine_type:"AND",filters:[I]});if("unsupported"in b)return x("query_metric_data",b.unsupported);let{raw:S}=await c(b.body);_.push(S),p.push(...Ln(S))}return Se(i,p,n,{mode:"metric_card_preview_data",card_id:a.cardId,card_kind:a.cardKind,combine_type:"OR",query_count:_.length},n.raw?_:void 0)}let{raw:u,sessionId:d}=await c(a.body);return Se(i,Ln(u),n,{mode:"metric_card_preview_data",card_id:a.cardId,card_kind:a.cardKind,session_id:d,request_body:a.body},n.raw?u:void 0)}let s=jn(i,n);if("unsupported"in s)return x("query_metric_data",s.unsupported);if(n.combine_type==="OR"&&(n.filters?.length??0)>1){let a=[],c=[];for(let u of n.filters??[]){let d=jn(i,{...n,combine_type:"AND",filters:[u]});if("unsupported"in d)return x("query_metric_data",d.unsupported);let p=await r.queryMetricData(d.input);c.push(p),a.push(...oe(p))}return Se(i,a,n,{mode:"metric_data_v2",combine_type:"OR",query_count:c.length},n.raw?c:void 0)}let o=await r.queryMetricData(s.input);return Se(i,oe(o),n,{mode:"metric_data_v2",request_body:s.input},n.raw?o:void 0)}catch(i){return uo(i)?x("query_metric_data",{capability:"metric_data_v2_unavailable",message:"\u5F53\u524D BI \u73AF\u5883\u672A\u63D0\u4F9B /api/metric-platform/metric-data/v2\uFF0C\u65E0\u6CD5\u6267\u884C\u9AD8\u7EA7\u8BA1\u7B97\u67E5\u8BE2\u3002",diagnostic:i.detail}):F(i,"query_metric_data")}}async function nr(e,t,n){let r=new D(e,t);try{let i=await r.searchMetricTrees({keyword:n.keyword,projectId:n.project_id,parentDirId:n.parent_dir_id,orderBy:n.order_by}),s=qs(i).map(dr).slice(0,n.limit);return B({summary:{keyword:n.keyword,count:s.length},items:s})}catch(i){return F(i,"search_metric_trees")}}async function rr(e,t,n){let r=new D(e,t);try{let i=await r.getMetricTreeDetail(n.metric_tree_id);return B({detail:Xs(i),raw:n.raw?i:void 0})}catch(i){return F(i,"get_metric_tree_detail")}}async function ir(e,t,n){let r=new D(e,t);try{if(n.target==="dimension"&&!n.dimension&&!n.dimension_fd_id)return x("query_metric_tree_attribution",{capability:"dimension_attribution_requires_dimension",message:"target=dimension \u65F6\u5FC5\u987B\u6307\u5B9A dimension \u6216 dimension_fd_id\u3002"});let i=await r.getMetricTreeDetail(n.metric_tree_id),s=l(i.metricId);if(!s)return x("query_metric_tree_attribution",{capability:"missing_root_metric",message:"\u6307\u6807\u6811\u8BE6\u60C5\u7F3A\u5C11\u6839\u6307\u6807 ID\uFF0C\u65E0\u6CD5\u6267\u884C\u5F52\u56E0\u3002"});let o=await r.getMetricDetail(s),a=ae(o),c=lt(n.filters??[],a);if("unsupported"in c)return x("query_metric_tree_attribution",c.unsupported);let u=c.filters,d=Zs(i,n);if("unsupported"in d)return x("query_metric_tree_attribution",d.unsupported);if(n.target==="metric"){let b=eo(i,d.value,u),S=await r.queryMetricTreeDecompose(n.metric_tree_id,b);return st(i,"metric",to(S),n,n.raw?S:void 0)}if(n.target==="dimension"){let b=ee(a,n.dimension,n.dimension_fd_id);if(!b)return x("query_metric_tree_attribution",{capability:"unknown_dimension",message:`\u7EF4\u5EA6\u4E0D\u5B58\u5728\u6216\u4E0D\u9002\u7528\u4E8E\u6839\u6307\u6807\uFF1A${n.dimension??n.dimension_fd_id}`});let S=Gn(i,b,d.value,u,n.limit,n.sort),P=await r.queryMetricTreeDrill(n.metric_tree_id,S);return st(i,"dimension",Hn(P,l(b.name)),n,n.raw?P:void 0)}let p=no(i,a,n.scan_dimensions,n.exclude_dimensions);if(!p.length)return x("query_metric_tree_attribution",{capability:"no_scan_dimensions",message:"\u6CA1\u6709\u53EF\u626B\u63CF\u7EF4\u5EA6\uFF0C\u8BF7\u6307\u5B9A scan_dimensions \u6216\u68C0\u67E5\u6307\u6807\u6811\u7EF4\u5EA6\u62C6\u89E3\u914D\u7F6E\u3002"});let _=[],I=[];for(let b of p){let S=Gn(i,b,d.value,u,n.group_limit,n.sort),P=await r.queryMetricTreeDrill(n.metric_tree_id,S);I.push({dimension:l(b.name),raw:P}),_.push(...Hn(P,l(b.name)).slice(0,n.group_limit))}return st(i,"scan",_,n,n.raw?I:void 0,{scanned_dimensions:p.map(b=>l(b.name))})}catch(i){return F(i,"query_metric_tree_attribution")}}async function Ns(e){return(await sr(e)).map(t=>l(t.id)).filter(Boolean)}async function sr(e){return w(await e.listProjects()).map(g).filter(Boolean)}function Ls(e){let t=g(e);return w(t.contents??t.items??t.data)}function qs(e){let t=g(e);return w(t.data??t.contents??t.items)}function at(e){return h({metric_id:l(e.id),name:l(e.name),project_id:l(e.projectId),dir_id:E(e.parentDirId,e.dirId),status:l(e.status),sub_type:l(e.subType),description:l(e.desc),dataset:mr(e.dsInfo),statistics:e.statisticsData,creator:Oe(e.creator),business_owner:Oe(e.businessOwner),updated_at:l(e.utime),raw:e})}function Gs(e){return w(e).map(t=>or(t,void 0))}function or(e,t){let n=!!e.isMetric,r=l(e.id),i=!t&&!n?r:t;return h({id:r,name:l(e.name),type:n?"metric":t?"directory":"project",project_id:i,dir_id:!n&&t?r:void 0,metric_id:n?r:void 0,parent_id:l(e.parentId),children:w(e.children).map(s=>or(s,i))})}function Hs(e,t){let n=g(e);return l(n.id)?[ct(n,t)]:w(n.contents??n.children).map(r=>ct(r,t))}function ct(e,t){return h({id:l(e.id),name:l(e.name),type:"directory",project_id:t,dir_id:l(e.id),parent_id:E(e.parentDirId,e.parentId),can_use:A(e.canUse),can_manage:A(e.canManage),metric_count:Jn(e.metricCnt),all_metric_count:Jn(e.allMetricCnt),children:w(e.contents??e.children).map(n=>ct(n,t))})}function Js(e){return h({metric_id:l(e.id),name:l(e.name),english_name:l(e.engName),status:l(e.status),sub_type:l(e.subType),description:l(e.desc),project_id:l(e.projectId),project_name:l(e.projectName),dir_id:E(e.parentDirId,e.dirId),dir_path:fr(e.dirPath),dataset:mr(e.dsInfo),source_fields:w(e.fdInfos).map(Re),aggregation:E(e.aggrType,e.aggregationType),formula:E(e.formula,e.expression),derive_setting:e.deriveSetting,format:e.format,applicable_dimensions:ae(e),time_dimension:g(e.timeDim)?Re(g(e.timeDim)):void 0,business_attributes:w(e.bizAttrs).map(co),business_owner:Oe(e.businessOwner),creator:Oe(e.creator),referenced_metrics:w(e.referencedMetrics).map(at),base_metric:g(e.baseMetric)?at(g(e.baseMetric)):void 0,linked_metric_id:l(e.linkMetricId),statistics:e.statisticsData,permissions:h({can_use:A(e.canUse),can_manage:A(e.canManage)}),created_at:l(e.ctime),updated_at:l(e.utime),has_draft:A(e.hasDraft)})}function $s(e){let t=g(e);return h({current:t.crtNode,upstream:t.backwardAtlas,downstream:t.forwardAtlas})}function jn(e,t){let n=l(e.name),r=l(e.projectId);if(!n||!r)return{unsupported:{capability:"metric_detail_incomplete",message:"\u6307\u6807\u8BE6\u60C5\u7F3A\u5C11 name \u6216 projectId\u3002"}};let i=ae(e),s=[...i,...lr(e)],o=[];for(let d of t.dimensions??[]){let p=ee(i,d);if(!p)return{unsupported:{capability:"unsupported_dimension",parameter:d,supported_dimensions:i}};o.push(ro(p))}let a=zs(e,i,t.advanced_calc);if("unsupported"in a)return{unsupported:a.unsupported};let c=lt(t.filters??[],s);if("unsupported"in c)return{unsupported:c.unsupported};let u=ar(t.sort??[],s);return"unsupported"in u?{unsupported:u.unsupported}:{input:{projectId:r,metricId:t.metric_id,metricName:n,metricItems:[h({name:n,alias:Qs(n,t.advanced_calc),advCalc:a.value})],dimensions:o,filters:c.filters,sorting:u.sorting,limit:t.limit}}}function Nn(e,t){let n=g(e.metricChartConfig),r=l(n.metricChartCdId),i=l(n.metricValueCdId),s=r||i;if(!s)return{unsupported:{capability:"missing_metric_card",message:"\u6307\u6807\u8BE6\u60C5\u7F3A\u5C11 metricChartConfig.metricChartCdId \u6216 metricValueCdId\uFF0C\u65E0\u6CD5\u8D70\u53EA\u8BFB\u5361\u7247\u53D6\u6570\u3002"}};let o=[...ae(e),...lr(e)],a=[];for(let _ of t.dimensions??[]){let I=ee(o,_);if(!I||l(I.meta_type).toUpperCase()==="METRIC")return{unsupported:{capability:"unsupported_dimension",parameter:_,supported_dimensions:ae(e)}};a.push(io(I))}let c=lt(t.filters??[],o);if("unsupported"in c)return{unsupported:c.unsupported};let u=c.filters,d=ar(t.sort??[],o);if("unsupported"in d)return{unsupported:d.unsupported};let p=d.sorting;return{cardId:s,cardKind:r?"chart":"value",dimensions:a,body:h({limit:t.limit,filters:u.length?u:void 0,combineType:t.filters?.length?t.combine_type:void 0,sorting:p.length?p:void 0})}}async function Fs(e,t,n,r){let i=gr(await e.getCardEditMeta(t))??{},s=Vs(i);s.row=r,s.sorting=[],await e.modifyCardEditMeta(t,n,i)}function Vs(e){let t=g(e.content),n=g(t.meta),r=g(n.chartMain),i=g(r.zoneData);if(!Object.keys(i).length)throw new Error("\u6307\u6807\u5361\u7247\u7F16\u8F91\u914D\u7F6E\u7F3A\u5C11 content.meta.chartMain.zoneData\u3002");return t.meta=n,n.chartMain=r,r.zoneData=i,e.content=t,i}function zs(e,t,n){if(!n)return{value:void 0};let r=g(e.timeDim),i=l(r?.fdId);if(["compare","last"].includes(n.type)&&!i)return{unsupported:{capability:"advanced_calc_requires_time_dimension",parameter:n.type}};if(n.type==="compare"){let a=n.compare??"yoy",c={yoy:["YEAR","YEAR"],mom:["MONTH","MONTH"],qoq:["QUARTER","QUARTER"],wow:["WEEK","WEEK"],dod:["DAY","DAY"]},[u,d]=c[a];return{value:{advType:"COMPARATIVE",advValue:{advType:"COMPARATIVE",dateFdId:i,valueType:(n.compare_value??"value").toUpperCase(),offset:1,offsetType:u,granularity:d}}}}if(n.type==="xtd")return{value:{advType:"XTD",advValue:{advType:"XTD",granularity:{ytd:"YEAR",qtd:"QUARTER",mtd:"MONTH",wtd:"WEEK",dtd:"DAY"}[n.xtd??"ytd"],includeCurrentValue:!0}}};if(n.type==="last")return{value:{advType:"LAST",advValue:{advType:"LAST",dateFdId:i}}};if(n.type==="recent"){let a=Ks(n.recent??"7d");return a?{value:{advType:"RECENT_X",advValue:{advType:"RECENT_X",granularity:a.granularity,baselineOffset:[a.count-1,0],includeCurrentValue:!0,baseline:n.recent_base}}}:{unsupported:{capability:"invalid_recent_spec",parameter:n.recent}}}if(n.type==="percentage"){let a=n.percentage_dim?ee(t,n.percentage_dim):void 0;return n.percentage_dim&&!a?{unsupported:{capability:"unknown_percentage_dimension",parameter:n.percentage_dim}}:{value:{advType:"LEVEL_PERCENTAGE",advValue:h({advType:"LEVEL_PERCENTAGE",auto:!a,tfdId:l(a?.fd_id)})}}}let o=n.rank_dim?ee(t,n.rank_dim):void 0;return n.rank_dim&&!o?{unsupported:{capability:"unknown_rank_dimension",parameter:n.rank_dim}}:{value:{advType:"RANK",advValue:h({advType:"RANK",calDimension:"FIELD",rankType:"RANK",sorting:(n.rank_order??"desc").toUpperCase(),tfdId:l(o?.fd_id),topN:{topType:"CUSTOM_NUMBER",count:n.rank_top??10,calculationType:"COUNT"}})}}}function Qs(e,t){return t?t.type==="compare"?`${e}_${t.compare??"yoy"}`:t.type==="xtd"?`${e}_${t.xtd??"ytd"}`:t.type==="recent"?`${e}_recent_${t.recent??"7d"}`:`${e}_${t.type}`:e}function Ks(e){let t=e.match(/^([1-9]\d*)([dwmqy])$/);if(!t)return;let n={d:"DAY",w:"WEEK",m:"MONTH",q:"QUARTER",y:"YEAR"};return{count:Number(t[1]),granularity:n[t[2]]}}function lt(e,t){let n=[];for(let r of e){let i=cr(t,r.field,r.fd_id,"filter");if("unsupported"in i)return{unsupported:i.unsupported};n.push(h({name:i.field.name,fdId:i.field.fdId,fdType:i.field.fdType,metaType:i.field.metaType,filterType:r.operator,filterValue:Ws(r)}))}return{filters:n}}function Ws(e){return ot.has(e.operator)?[]:e.values??[]}function ar(e,t){let n=[];for(let r of e){let i=cr(t,r.field,void 0,"sort");if("unsupported"in i)return{unsupported:i.unsupported};n.push(h({name:i.field.name,ordering:r.direction,key:i.field.fdId,fdId:i.field.fdId,fdType:i.field.fdType,metaType:i.field.metaType}))}return{sorting:n}}function cr(e,t,n,r){let i=ee(e,t,n),s=r==="filter"?"unsupported_filter_field":"unsupported_sort_field",o=r==="filter"?"\u7B5B\u9009":"\u6392\u5E8F";if(!i)return{unsupported:{capability:s,parameter:t,message:`${o}\u5B57\u6BB5\u65E0\u6CD5\u4ECE\u5F53\u524D\u67E5\u8BE2\u4E0A\u4E0B\u6587\u89E3\u6790\uFF1A${t}`,supported_fields:e.map(_=>h({name:l(_.name),fd_id:l(_.fd_id),meta_type:l(_.meta_type)}))}};let a=l(i.name),c=l(i.fd_id),u=l(i.fd_type),d=l(i.meta_type).toUpperCase(),p=[a?void 0:"name",c?void 0:"fdId",u?void 0:"fdType",d?void 0:"metaType"].filter(_=>!!_);return p.length?{unsupported:{capability:s,parameter:t,message:`${o}\u5B57\u6BB5\u7F3A\u5C11\u5FC5\u8981 BI \u5143\u4FE1\u606F\uFF1A${t}`,missing_metadata:p}}:{field:{name:a,fdId:c,fdType:u,metaType:d}}}function Se(e,t,n,r,i){let s=so(t.slice(0,n.limit),n.columns);return B({summary:{metric_id:n.metric_id,metric_name:l(e.name),row_count:s.length,truncated:t.length>s.length},columns:pr(s),rows:s,diagnostic:r,raw:i})}function oe(e){let t=g(e),n=g(t.data)??t,r=w(n.values??n.rows??t.values??t.rows);if(r.length)return r;let i=w(n.columns??t.columns).map(o=>l(g(o)?.name??o)).filter(Boolean),s=w(n.preview??n.contents);return i.length?s.map(o=>{let a=Array.isArray(o)?o:[];return Object.fromEntries(i.map((c,u)=>[c,a[u]]))}):s}function Ln(e){let t=g(e),n=g(t.data)??t,r=g(n.chartMain??t.chartMain??g(g(t.content).data).chartMain);if(!Object.keys(r).length)return oe(e);let i=g(r.row),s=g(r.column),o=w(i.fields),a=$(i.data),c=$(r.data),u=Ys(s),d=o.map(ut).filter(Boolean),p=oo([...d,...u]),_=Math.max(a.length,c.length),I=[];for(let b=0;b<_;b+=1){let S=[];S.push(...$(a[b]).map(qn)),S.push(...$(c[b]).map(qn)),S.length&&I.push(Object.fromEntries(S.map((P,z)=>[p[z]??`column_${z+1}`,P])))}return I}function Ys(e){let n=$(e.data).map((r,i)=>{let s=$(r).map(ur).filter(Boolean).join("/");return s||ut(w(e.fields)[i])||`metric_${i+1}`}).filter(Boolean);return n.length?n:w(e.fields).map(ut).filter(Boolean)}function ut(e){return E(e.alias,e.title,e.originTitle,e.name,e.fdId,e.id)??""}function ur(e){let t=g(e);return Object.keys(t).length?E(t.title,t.name,t.originTitle,t.alias,t.v,t.value)??"":l(e)}function qn(e){let t=g(e);return Object.keys(t).length?"v"in t?t.v:"value"in t?t.value:ur(e):e}function dr(e){return h({metric_tree_id:l(e.metricTreeId),name:l(e.metricTreeName),root_metric_id:l(e.metricId),root_metric_name:l(e.metricName),project_id:l(e.projectId),project_name:l(e.projectName),parent_dir_id:l(e.parentDirId),dir_path:fr(e.dirPath),creator_id:l(e.creatorId),creator_name:l(e.creatorName),can_use:A(e.canUse),can_manage:A(e.canManage),updated_at:l(e.utime)})}function Xs(e){let t=g(e.config)??{};return h({...dr(e),dom_id:l(e.domId),created_at:l(e.ctime),time_comparison:t.timeComparisonSetting,comparison_enabled:A(t.comparisonEnabled),contribution_calc_enabled:A(t.contributionCalcEnabled),dimension_decomposition:t.dimensionDecompositionContent,metric_decomposition:t.metricDecompositionContent,permissions:h({can_use:A(e.canUse),can_manage:A(e.canManage)})})}function Zs(e,t){let n=g(e.config)??{},r=t.time_comparison_json??gr(g(n.timeComparisonSetting)),i=A(n.comparisonEnabled)??!!r,s=A(n.contributionCalcEnabled)??!1;if(t.period||t.last_period){if(!t.period||!t.last_period)return{unsupported:{capability:"period_requires_last_period",message:"period \u548C last_period \u9700\u8981\u540C\u65F6\u6307\u5B9A\u3002"}};r=r??{};let o=g(r.advValue)??{};r.advValue=o,o.window={period:[t.period],withMacro:!1};let a=ao(t.period,t.last_period);if(!a)return{unsupported:{capability:"unsupported_period_granularity",message:"\u76EE\u524D\u4EC5\u652F\u6301 YYYY-MM-DD \u683C\u5F0F\u7684 period/last_period\u3002"}};Object.assign(o,a,{mode:"NORMAL"}),r.advType="COMPARATIVE",i=!0}return{value:{setting:r,comparisonEnabled:i,contributionEnabled:s}}}function eo(e,t,n){let r=g(e.config)??{},i=g(r.metricDecompositionContent)??{};return h({timeComparisonSetting:t.setting,comparisonEnabled:t.comparisonEnabled,contributionCalcEnabled:!1,metricDecomposeInfo:{metricRelationTree:i.metricRelationTree,filters:n}})}function Gn(e,t,n,r,i,s){return h({timeComparisonSetting:n.setting,comparisonEnabled:n.comparisonEnabled,contributionCalcEnabled:n.contributionEnabled,drillInfo:{dimensionFdId:l(t.fd_id),drillFilters:r,nodeNum:i,orderBy:s==="asc"?"contributionAsc":"contributionDesc"}})}function to(e){return oe(e).map(t=>h({child_metric:l(g(t.metricInfo)?.name),child_metric_id:l(g(t.metricInfo)?.metricId),current_value:t.currentValue,comparison_value:t.comparisonValue,change_value:t.changeValue,change_rate:t.changeRate,contribution_value:t.contributionValue,contribution_rate:t.contributionRate}))}function Hn(e,t){return oe(e).map((n,r)=>h({dimension:t,dimension_value:Array.isArray(n.dimensionValue)?n.dimensionValue.join("/"):n.dimensionValue,current_value:n.currentValue,comparison_value:n.comparisonValue,change_value:n.changeValue,change_rate:n.changeRate,contribution_value:n.contributionValue,contribution_rate:n.contributionRate,rank:r+1}))}function st(e,t,n,r,i,s){let o=t==="scan"?n:n.slice(0,r.limit);return B({summary:{metric_tree_id:r.metric_tree_id,metric_tree_name:l(e.metricTreeName),root_metric_id:l(e.metricId),root_metric_name:l(e.metricName),target:t,row_count:o.length,...s},columns:pr(o),rows:o,raw:i})}function no(e,t,n,r){let i=new Set((n??[]).map(u=>u.trim()).filter(Boolean)),s=new Set((r??[]).map(u=>u.trim()).filter(Boolean)),o=new Map(t.map(u=>[l(u.name),u])),a=new Map(t.map(u=>[l(u.fd_id),u])),c=i.size?[...i].map(u=>o.get(u)).filter(u=>!!u):[];if(!c.length){let u=g(e.config)??{},d=g(u.dimensionDecompositionContent)??{};c=$(d.decomposableDimensionIds).map(p=>a.get(String(p))).filter(p=>!!p)}return c.length||(c=t),c.filter(u=>!s.has(l(u.name)))}function ae(e){let t=new Set,n=[],r=i=>{if(!i)return;let s=l(i.fdId),o=l(i.name),a=s||o;if(!(!a||t.has(a))){t.add(a),n.push(Re(i));for(let c of w(i.subs))r(c)}};for(let i of w(e.applicableDims))r(i);return r(g(e.timeDim)),n}function lr(e){let t=w(e.fdInfos).map(Re);return l(e.name)&&!t.some(n=>l(n.name)===l(e.name))&&t.push(h({id:E(e.id,e.name),fd_id:l(e.id),name:l(e.name),fd_type:E(t[0]?.fd_type,"DOUBLE"),meta_type:"METRIC"})),t}function Re(e){return h({id:E(e.id,e.fdId),fd_id:l(e.fdId),name:l(e.name),fd_type:l(e.fdType),meta_type:l(e.metaType),ds_id:l(e.dsId),granularity:l(e.granularity)})}function ee(e,t,n){let r=(n??t)?.trim();if(r)return e.find(i=>[i.fd_id,i.id,i.name].map(l).includes(r))}function ro(e){return h({name:l(e.name),alias:l(e.name),fdType:E(e.fd_type),metaType:"DIM",key:E(e.fd_id,e.id,e.name),fdId:E(e.fd_id),dsId:E(e.ds_id),granularity:E(e.granularity)})}function io(e){return h({name:l(e.name),alias:E(e.name),fdType:E(e.fd_type),metaType:"DIM",key:E(e.fd_id,e.id,e.name),fdId:E(e.fd_id),dsId:E(e.ds_id),granularity:E(e.granularity)})}function so(e,t){return t?.length?e.map(n=>Object.fromEntries(t.map(r=>[r,n[r]]))):e}function pr(e){return[...new Set(e.flatMap(t=>Object.keys(t)))]}function oo(e){let t=new Map;return e.map((n,r)=>{let i=n||`column_${r+1}`,s=t.get(i)??0;return t.set(i,s+1),s?`${i}_${s+1}`:i})}function ao(e,t){let n=Date.parse(e),r=Date.parse(t);if(!/^\d{4}-\d{2}-\d{2}$/.test(e)||!/^\d{4}-\d{2}-\d{2}$/.test(t)||Number.isNaN(n)||Number.isNaN(r))return;let i=Math.round((n-r)/864e5);if(!(i<=0))return{offset:i,offsetType:"DAY",granularity:"DAY"}}function mr(e){let t=g(e);if(t)return h({dataset_id:l(t.dsId),name:l(t.name)})}function Oe(e){let t=g(e);if(t)return h({user_id:E(t.uId,t.id),name:l(t.name),deleted:A(t.isDel)})}function co(e){return h({id:l(e.id),name:l(e.name),type:l(e.valueType),values:w(e.values)})}function fr(e){return w(e).map(t=>l(t.dirName??t.name)).filter(Boolean)}function x(e,t){return B({status:"unsupported",diagnostic:{tool:e,...t}})}function F(e,t){return e instanceof H?q({operation:t,diagnostic:e.detail}):q({operation:t,message:e instanceof Error?e.message:String(e)})}function uo(e){return e instanceof H&&e.detail.operation==="queryMetricData"&&e.detail.path==="/api/metric-platform/metric-data/v2"&&/No static resource metric-platform\/metric-data\/v2/i.test(e.detail.message)}function w(e){return Array.isArray(e)?e.map(g).filter(Boolean):[]}function $(e){return Array.isArray(e)?e:[]}function g(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function l(e){return typeof e=="string"?e:e==null?"":String(e)}function E(...e){return e.map(l).find(t=>t.trim())?.trim()}function A(e){return typeof e=="boolean"?e:void 0}function Jn(e){return typeof e=="number"&&Number.isFinite(e)?e:void 0}function lo(e,t){let n=new Set;return e.filter(r=>{let i=l(r[t]);return!i||n.has(i)?!1:(n.add(i),!0)})}function gr(e){return e?JSON.parse(JSON.stringify(e)):void 0}function _r(e,t,n,r,i={}){let s=i.usageTelemetry??new be({config:n,appVersion:i.appVersion??"unknown"}),o=(c,u,d)=>{let p=e.registerTool,_=$t(c,d,s),I=async(...b)=>{try{return await _(...b)}catch(S){return Te(c,S)}};p.call(e,c,u,I)},a=c=>!r.service||r.service.toolList.includes(c);o("get_bi_capabilities",{title:"Get BI Capabilities",description:"\u83B7\u53D6\u5F53\u524D BI \u73AF\u5883\u7248\u672C\u548C MCP \u529F\u80FD\u542F\u7528\u72B6\u6001\u3002",inputSchema:Ft},(c,u)=>t.run(({client:d,config:p})=>Vt(d,p),u,"get_bi_capabilities")),["chatbi_list_themes","chatbi_query","chatbi_insight_start","chatbi_insight_poll"].some(a)&&(o("chatbi_list_themes",{title:"List ChatBI Themes",description:"\u5217\u51FA\u5F53\u524D\u767B\u5F55\u7528\u6237\u53EF\u8BBF\u95EE\u7684 ChatBI \u4E3B\u9898\uFF0C\u53EF\u7B5B\u9009\u6D1E\u5BDF\u4E3B\u9898\u3002",inputSchema:mn,outputSchema:un},(c,u)=>t.run(({config:d})=>hn(d,c),u,"chatbi_list_themes")),o("chatbi_query",{title:"ChatBI Query",description:"\u6267\u884C ChatBI L1 \u540C\u6B65\u95EE\u6570\uFF0C\u7528\u81EA\u7136\u8BED\u8A00\u76F4\u63A5\u63D0\u95EE\uFF0C\u6700\u7701\u4E8B\uFF0C\u9002\u5408\u4E1A\u52A1\u95EE\u9898\u8868\u8FF0\u660E\u786E\u3001\u65E0\u9700\u7CBE\u786E\u63A7\u5236\u7EF4\u5EA6\u6216 SQL \u7684\u573A\u666F\uFF1B\u9700\u8981\u7CBE\u786E\u6307\u5B9A\u7EF4\u5EA6/\u7B5B\u9009\u7528 query_metric_data\uFF0C\u9700\u8981\u81EA\u5B9A\u4E49 SQL \u7528 execute_sql_query\u3002\u652F\u6301\u4E3B\u9898 ID \u6216\u4E3B\u9898\u540D\u3002\u6210\u529F\u7ED3\u679C\u76F4\u63A5\u900F\u51FA answer\u3001sql\u3001query_result \u7B49\u7ED3\u6784\u5316\u5B57\u6BB5\uFF0C\u7531\u8C03\u7528\u65B9\u81EA\u884C\u7EC4\u7EC7\u6700\u7EC8\u56DE\u590D\u3002session_id \u53EA\u80FD\u7528\u4E8E\u95EE\u6570\u7EED\u95EE\uFF0C\u4E0D\u80FD\u4E0E ChatBI \u6D1E\u5BDF\u4F1A\u8BDD\u6DF7\u7528\u3002",inputSchema:fn,outputSchema:dn},(c,u)=>t.run(({config:d})=>In(d,c),u,"chatbi_query")),o("chatbi_insight_start",{title:"Start ChatBI Insight",description:"\u53D1\u8D77 ChatBI L2 \u6D1E\u5BDF\u5206\u6790\u5E76\u5728\u8BF7\u6C42\u53D7\u7406\u540E\u7ACB\u5373\u8FD4\u56DE message_id\uFF0C\u4E0D\u7B49\u5F85\u6700\u7EC8\u62A5\u544A\uFF0C\u4E5F\u4E0D\u8FD4\u56DE final_result\u3002\u6D1E\u5BDF\u901A\u5E38\u8017\u65F6 2-3 \u5206\u949F\uFF0C5 \u5206\u949F\u89C6\u4E3A\u8D85\u65F6\uFF1B\u540C\u4E00\u95EE\u9898\u53EA\u8C03\u7528\u4E00\u6B21\uFF0C\u540E\u7EED\u4F7F\u7528 chatbi_insight_poll \u67E5\u8BE2\u7ED3\u679C\u3002",inputSchema:gn,outputSchema:ln},(c,u)=>t.run(({config:d})=>bn(d,c),u,"chatbi_insight_start")),o("chatbi_insight_poll",{title:"Poll ChatBI Insight",description:"\u67E5\u8BE2 ChatBI L2 \u6D1E\u5BDF\u4EFB\u52A1\u72B6\u6001\u548C\u6700\u7EC8\u62A5\u544A\u3002status=success \u65F6\u6700\u7EC8\u5C55\u793A\u5185\u5BB9\u8BFB\u53D6 structuredContent.final_result.content\uFF1Banswer \u4E3A\u540E\u7AEF\u539F\u59CB\u7B54\u6848\u3002\u4F7F\u7528 chatbi_insight_start \u8FD4\u56DE\u7684 theme_id \u548C message_id\uFF1B\u4E0D\u8981\u9AD8\u9891\u8C03\u7528\uFF0C\u5EFA\u8BAE\u81F3\u5C11\u95F4\u9694 10 \u79D2\uFF0C\u6D1E\u5BDF\u901A\u5E38\u8017\u65F6 2-3 \u5206\u949F\uFF0C5 \u5206\u949F\u540E\u505C\u6B62\u7B49\u5F85\u3002",inputSchema:_n,outputSchema:pn},(c,u)=>t.run(({config:d})=>yn(d,c),u,"chatbi_insight_poll"))),r.ok&&(a("global_search")&&o("global_search",{title:"Global Search",description:"\u6309\u5173\u952E\u8BCD\u641C\u7D22 BI \u4E2D\u7684\u5361\u7247\u3001\u4EEA\u8868\u677F\u3001\u6570\u636E\u96C6\u548C ETL \u8D44\u6E90\uFF0C\u9002\u5408\u5B9A\u4F4D\u67D0\u4E2A\u5DF2\u6709\u8D44\u4EA7\u6216\u5176 ID\u3002\u8FD4\u56DE\u7684\u5361\u7247 ID \u53EF\u4EA4\u7ED9 get_card_info/query_card_data\uFF0C\u6570\u636E\u96C6 ID \u53EF\u4EA4\u7ED9 get_dataset_detail/execute_sql_query\u3002\u6307\u6807\u76F8\u5173\u68C0\u7D22\u8BF7\u7528 search_metrics\u3002",inputSchema:Mn},(c,u)=>t.run(({client:d})=>Dn(d,c),u,"global_search")),a("search_metrics")&&o("search_metrics",{title:"Search Metrics",description:"\u6309\u5173\u952E\u8BCD\u641C\u7D22\u6307\u6807\u5E73\u53F0\u6307\u6807\uFF0C\u8FD4\u56DE metric_id\u3001\u540D\u79F0\u3001\u4E3B\u9898\u3001\u76EE\u5F55\u3001\u7C7B\u578B\u3001\u72B6\u6001\u548C\u4E1A\u52A1\u53E3\u5F84\u6458\u8981\u3002\u5DF2\u6709\u5173\u952E\u8BCD\u65F6\u4F18\u5148\u7528\u672C\u5DE5\u5177\uFF1B\u4E0D\u6E05\u695A\u6709\u54EA\u4E9B\u6307\u6807\u65F6\u6539\u7528 list_metric_catalog \u6D4F\u89C8\u3002\u8FD4\u56DE\u7684 metric_id \u53EF\u7EE7\u7EED\u4EA4\u7ED9 get_metric_detail \u770B\u53E3\u5F84\u3001query_metric_data \u53D6\u6570\u3002",inputSchema:Fn,outputSchema:G},(c,u)=>t.run(({client:d,config:p})=>Xn(d,p,c),u,"search_metrics")),a("list_metric_catalog")&&o("list_metric_catalog",{title:"List Metric Catalog",description:"\u6309\u4E3B\u9898/\u76EE\u5F55\u5C42\u7EA7\u6D4F\u89C8\u6307\u6807\u8282\u70B9\uFF0C\u9002\u5408\u4E0D\u77E5\u9053\u5173\u952E\u8BCD\u3001\u9700\u8981\u5148\u53D1\u73B0\u6709\u54EA\u4E9B\u53EF\u7528\u6307\u6807\u7684\u573A\u666F\u3002\u5DF2\u6709\u660E\u786E\u5173\u952E\u8BCD\u65F6\u6539\u7528 search_metrics\u3002\u8FD4\u56DE\u7684 metric_id \u53EF\u7EE7\u7EED\u4EA4\u7ED9 get_metric_detail\u3001query_metric_data\u3002",inputSchema:Vn,outputSchema:G},(c,u)=>t.run(({client:d,config:p})=>Zn(d,p,c),u,"list_metric_catalog")),a("get_metric_detail")&&o("get_metric_detail",{title:"Get Metric Detail",description:"\u6309 metric_id \u83B7\u53D6\u6307\u6807\u7684\u4E1A\u52A1\u53E3\u5F84\u3001\u8BA1\u7B97\u53E3\u5F84\u3001\u9002\u7528\u7EF4\u5EA6\u3001\u65F6\u95F4\u7EF4\u3001\u8840\u7F18/\u5F15\u7528\u6458\u8981\u548C\u6743\u9650\u4FE1\u606F\u3002\u5EFA\u8BAE\u5728 query_metric_data \u53D6\u6570\u524D\u5148\u8C03\u7528\uFF0C\u786E\u8BA4\u53EF\u7528\u7EF4\u5EA6\u4E0E\u53E3\u5F84\u3002metric_id \u6765\u81EA search_metrics \u6216 list_metric_catalog\u3002",inputSchema:zn,outputSchema:G},(c,u)=>t.run(({client:d,config:p})=>er(d,p,c),u,"get_metric_detail")),a("query_metric_data")&&o("query_metric_data",{title:"Query Metric Data",description:"\u6309\u5DF2\u77E5 metric_id \u7CBE\u786E\u67E5\u8BE2\u6307\u6807\u6570\u636E\uFF0C\u9002\u5408\u9700\u8981\u6307\u5B9A\u7EF4\u5EA6\u3001\u7B5B\u9009\u3001\u6392\u5E8F\u7684\u53D6\u6570\u573A\u666F\uFF1B\u7EF4\u5EA6\u5EFA\u8BAE\u5148\u7528 get_metric_detail \u786E\u8BA4\u3002\u53EA\u8BFB\u5B89\u5168\uFF1A\u8BFB\u53D6\u6307\u6807\u5361\u9884\u89C8\u6570\u636E\uFF0C\u7EF4\u5EA6\u67E5\u8BE2\u53EA\u6539\u4E34\u65F6 session\uFF0C\u4E0D\u89E6\u53D1 save\u3001update\u3001delete\u3001publish \u7B49\u6301\u4E45\u5316\u64CD\u4F5C\u3002\u9700\u8981\u81EA\u7136\u8BED\u8A00\u95EE\u6570\u7528 chatbi_query\uFF0C\u9700\u8981\u5199 SQL \u7528 execute_sql_query\u3002",inputSchema:Qn,outputSchema:G},(c,u)=>t.run(({client:d,config:p})=>tr(d,p,c),u,"query_metric_data")),a("search_metric_trees")&&o("search_metric_trees",{title:"Search Metric Trees",description:"\u6309\u5173\u952E\u8BCD\u641C\u7D22\u6307\u6807\u6811\u8D44\u6E90\uFF0C\u8FD4\u56DE metric_tree_id\u3002\u5F52\u56E0\u5206\u6790\u7684\u5165\u53E3\u5DE5\u5177\uFF1A\u62FF\u5230 metric_tree_id \u540E\u7528 get_metric_tree_detail \u770B\u7ED3\u6784\u3001query_metric_tree_attribution \u505A\u5F52\u56E0\u3002",inputSchema:Kn,outputSchema:G},(c,u)=>t.run(({client:d,config:p})=>nr(d,p,c),u,"search_metric_trees")),a("get_metric_tree_detail")&&o("get_metric_tree_detail",{title:"Get Metric Tree Detail",description:"\u6309 metric_tree_id \u83B7\u53D6\u6307\u6807\u6811\u8BE6\u60C5\u3001\u6839\u6307\u6807\u3001\u65F6\u95F4\u5BF9\u6BD4\u914D\u7F6E\u3001\u7EF4\u5EA6\u62C6\u89E3\u914D\u7F6E\u548C\u6307\u6807\u5173\u7CFB\u6811\u3002\u5EFA\u8BAE\u5728 query_metric_tree_attribution \u5F52\u56E0\u524D\u5148\u8C03\u7528\uFF0C\u786E\u8BA4\u53EF\u62C6\u89E3\u7EF4\u5EA6\u4E0E\u5BF9\u6BD4\u914D\u7F6E\u3002metric_tree_id \u6765\u81EA search_metric_trees\u3002",inputSchema:Wn,outputSchema:G},(c,u)=>t.run(({client:d,config:p})=>rr(d,p,c),u,"get_metric_tree_detail")),a("query_metric_tree_attribution")&&o("query_metric_tree_attribution",{title:"Query Metric Tree Attribution",description:"\u6309\u5DF2\u77E5 metric_tree_id \u6267\u884C\u6307\u6807\u62C6\u89E3\u3001\u5355\u7EF4\u62C6\u89E3\u6216\u5168\u7EF4\u626B\u63CF\u5F52\u56E0\uFF0C\u9002\u5408\u5206\u6790\u67D0\u6307\u6807\u53D8\u5316\u7531\u54EA\u4E9B\u56E0\u7D20/\u7EF4\u5EA6\u8D21\u732E\u3002\u5EFA\u8BAE\u5148\u7528 get_metric_tree_detail \u786E\u8BA4\u53EF\u62C6\u89E3\u7EF4\u5EA6\u3002",inputSchema:Yn,outputSchema:G},(c,u)=>t.run(({client:d,config:p})=>ir(d,p,c),u,"query_metric_tree_attribution")),a("execute_sql_query")&&o("execute_sql_query",{title:"Execute SQL Query",description:`\u57FA\u4E8E\u4E00\u4E2A\u6216\u591A\u4E2A\u6570\u636E\u96C6\u6267\u884C\u67E5\u8BE2 SQL\u3002SQL FROM \u540E\u5199\u6570\u636E\u96C6\u540D\u79F0/name\uFF1B\u4E2D\u6587\u6216\u7279\u6B8A\u5B57\u7B26\u540D\u79F0\u7528\u53CD\u5F15\u53F7\uFF0C\u4F8B\u5982 SELECT * FROM \`\u9500\u552E\u6570\u636E\u96C6\` LIMIT 20\u3002\u652F\u6301\u591A\u8868\u8054\u67E5\uFF0C\u4F46\u8981\u6C42\u53C2\u4E0E\u7684\u6570\u636E\u96C6\u8981\u4E48\u5747\u4E3A\u62BD\u53D6\u6570\u636E\u96C6\uFF0C\u8981\u4E48\u5747\u4E3A\u6765\u81EA\u540C\u4E00\u6570\u636E\u8D26\u6237\u548C\u6570\u636E\u5E93\u7684\u76F4\u8FDE\u6570\u636E\u96C6\u3002inputs \u4F20\u6570\u636E\u96C6 ID \u5217\u8868\uFF0C\u4EC5\u7528\u4E8E BI \u7ED1\u5B9A/\u6388\u6743\u3002\u8FD4\u56DE\u884C\u6570\u53D7 BI_MAX_ROWS \u63A7\u5236\uFF0C\u5F53\u524D\u914D\u7F6E\u4E3A ${n.BI_MAX_ROWS} \u884C\uFF0C\u9ED8\u8BA4\u503C\u4E3A 1000 \u884C\u3002`,inputSchema:vn},(c,u)=>t.run(({client:d,config:p})=>xn(d,p,c),u,"execute_sql_query")),a("get_dataset_detail")&&o("get_dataset_detail",{title:"Get Dataset Detail",description:"\u6309\u6570\u636E\u96C6 ID \u83B7\u53D6\u57FA\u7840\u4FE1\u606F\u3001\u5B57\u6BB5\u7ED3\u6784\u548C\u76F8\u5173\u914D\u7F6E\u3002\u5EFA\u8BAE\u5728 execute_sql_query \u5199 SQL \u524D\u5148\u8C03\u7528\uFF0C\u786E\u8BA4\u6570\u636E\u96C6\u540D\u79F0\u4E0E\u53EF\u7528\u5B57\u6BB5\u3002\u6570\u636E\u96C6 ID \u6765\u81EA global_search\u3002",inputSchema:Sn},(c,u)=>t.run(({client:d})=>An(d,c),u,"get_dataset_detail")),a("get_card_info")&&o("get_card_info",{title:"Get Card Info",description:"\u6309\u5361\u7247 ID \u83B7\u53D6\u57FA\u7840\u4FE1\u606F\u3001\u56FE\u8868\u7C7B\u578B\u3001\u6570\u636E\u6765\u6E90\u548C\u914D\u7F6E\u3002\u5EFA\u8BAE\u5728 query_card_data \u53D6\u6570\u524D\u5148\u8C03\u7528\uFF0C\u786E\u8BA4\u5B57\u6BB5\u4E0E\u6570\u636E\u6765\u6E90\u3002\u5361\u7247 ID \u6765\u81EA global_search \u6216 get_page_info\u3002",inputSchema:Rn},(c,u)=>t.run(({client:d})=>kn(d,c),u,"get_card_info")),a("query_card_data")&&o("query_card_data",{title:"Query Card Data",description:"\u6309\u5DF2\u77E5\u5361\u7247 ID \u5B89\u5168\u53EA\u8BFB\u67E5\u8BE2 BI \u5361\u7247\u9884\u89C8\u6570\u636E\uFF0C\u8FD4\u56DE\u7ED3\u6784\u5316 columns\u3001rows\u3001summary \u548C diagnostic\uFF0C\u9002\u5408\u8BFB\u53D6\u5DF2\u6709\u5361\u7247\u80CC\u540E\u7684\u6570\u636E\u3002\u5361\u7247 ID \u6765\u81EA global_search \u6216 get_page_info\uFF1B\u5EFA\u8BAE\u5148\u7528 get_card_info \u4E86\u89E3\u5B57\u6BB5\u3002",inputSchema:Xt,outputSchema:Zt},(c,u)=>t.run(({client:d})=>en(d,c),u,"query_card_data")),a("get_page_info")&&o("get_page_info",{title:"Get Page Info",description:"\u6309\u9875\u9762/\u4EEA\u8868\u677F ID \u83B7\u53D6\u57FA\u7840\u4FE1\u606F\u3001\u5E03\u5C40\u3001\u5361\u7247\u5217\u8868\u548C\u76F8\u5173\u914D\u7F6E\uFF0C\u53EF\u4ECE\u4E2D\u62FF\u5230\u5361\u7247 ID \u518D\u4EA4\u7ED9 get_card_info/query_card_data\u3002\u9875\u9762 ID \u6765\u81EA global_search\u3002",inputSchema:On},(c,u)=>t.run(({client:d})=>Pn(d,c),u,"get_page_info")))}var bo=po(import.meta.url),ht=bo("../package.json"),mt=class{record(t){console.error(JSON.stringify({runtime:wo(t)}))}};function Ir(e,t={}){let n=t.mode??e.MCP_TRANSPORT??"stdio",r={appVersion:t.appVersion,clientFactory:t.clientFactory,callerContextResolver:t.callerContextResolver,guanBIClientFactory:t.guanBIClientFactory,capabilityResolver:t.capabilityResolver,transportFactory:t.transportFactory};return n==="streamable-http"?new gt(e,r):new ft(e,r)}var yo=`\u89C2\u8FDC BI\uFF08Guandata\uFF09MCP Server\uFF0C\u7528\u4E8E\u5728\u89C2\u8FDC BI \u5E73\u53F0\u4E0A\u505A\u6570\u636E\u53D1\u73B0\u3001\u770B\u8D44\u4EA7\u8BE6\u60C5\u3001\u5B89\u5168\u53EA\u8BFB\u53D6\u6570\u548C\u6307\u6807\u5206\u6790\u3002\u6240\u6709\u5DE5\u5177\u5747\u4E3A\u53EA\u8BFB\uFF0C\u4E0D\u4F1A\u4FEE\u6539\u3001\u4FDD\u5B58\u6216\u5220\u9664 BI \u8D44\u4EA7\u3002
10
+ ${c}`:u}catch{return}}var ot=new Map([["k",1e3],["K",1e3],["M",1e6],["B",1e9],["\u4E07",1e4],["\u4EBF",1e8]]),xs=[[1e8,"\u4EBF"],[1e4,"\u4E07"]];function Ms(e){let t=e?.chartMeta?.chartMain?.zoneData?.metric,n=new Map;if(!Array.isArray(t))return n;for(let r of t)r.name&&r.fieldFormat?.numberFormat&&n.set(r.name,r.fieldFormat.numberFormat);return n}function Ds(e,t,n){let r=new Map;for(let[i,s]of e.entries()){let o=n.get(s);if(o?.prefixUnit!=="auto")continue;let a=0;for(let c of t){let d=An(c[i]);typeof d=="number"&&(a=Math.max(a,Math.abs(d/Pn(o))))}let u=qs(a);u&&r.set(s,u)}return r}function js(e,t,n){if(!t)return e;let r=An(e);return typeof r!="number"?e:Us(r,t,n)}function An(e){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e!="string")return;let t=Number(e.trim());return Number.isFinite(t)?t:void 0}function Us(e,t,n){let r=Pn(t),{unit:i,shouldScale:s}=Ns(t,n),o=s&&i?ot.get(i)??1:1,a=e/r/o,u=Ls(t.decimalPlaces),c=t.useThousandsSeparator?a.toLocaleString("en-US",{minimumFractionDigits:u,maximumFractionDigits:u}):a.toFixed(u),d=i&&t.showPrefixUnit!==!1?i:"",p=t.showSuffix===!1||typeof t.suffix!="string"?"":t.suffix;return`${c}${d}${p}`}function Pn(e){if(e.showPrefixUnit!==!1&&typeof e.prefixUnit=="string"&&e.prefixUnit!=="auto"&&ot.has(e.prefixUnit))return 1;let t=Number(e.divideDataBy??1);return Number.isFinite(t)&&t!==0?t:1}function Ns(e,t){return e.showPrefixUnit===!1?{unit:"",shouldScale:!1}:e.prefixUnit==="auto"?{unit:t??"",shouldScale:!0}:typeof e.prefixUnit=="string"&&ot.has(e.prefixUnit)?{unit:e.prefixUnit,shouldScale:!0}:{unit:"",shouldScale:!1}}function Ls(e){return typeof e!="number"||!Number.isFinite(e)?2:Math.max(0,Math.min(100,Math.trunc(e)))}function qs(e){return xs.find(([t])=>e>=t)?.[1]??""}function Re(e,t,n){let r=Gs(e,t,n);return q({error:"chatbi_request_failed",requested_operation:n,...r,tried_base_urls:r.tried_base_urls??e.getTriedBaseUrls()})}function Gs(e,t,n){return t instanceof O?t.detail:e.getLastError()??{operation:n,detail:t instanceof Error?t.message:String(t)}}import{z as at}from"zod";var kn={dsId:at.string().min(1).describe("\u6570\u636E\u96C6 ID\u3002")},vn={cdId:at.string().min(1).describe("\u5361\u7247 ID\u3002")},xn={pageId:at.string().min(1).describe("\u9875\u9762/\u4EEA\u8868\u677F ID\u3002")};async function Mn(e,t){let n=await e.get(`/api/data-source/${encodeURIComponent(t.dsId)}`);return M(n)}async function Dn(e,t){let n=await e.get(`/api/card/${encodeURIComponent(t.cdId)}`);return M(n)}async function jn(e,t){let n=await e.get(`/api/page/${encodeURIComponent(t.pageId)}`);return M(n)}import{z as L}from"zod";var Hs=L.object({name:L.string().min(1),query:L.string().min(1)}),Un={query:L.string().min(1).describe("\u8981\u6267\u884C\u7684\u67E5\u8BE2 SQL\u3002FROM \u540E\u5199\u6570\u636E\u96C6\u540D\u79F0/name\uFF1B\u4E2D\u6587\u6216\u7279\u6B8A\u5B57\u7B26\u540D\u79F0\u7528\u53CD\u5F15\u53F7\u3002\u652F\u6301\u5355\u8868\u6216\u591A\u8868\u8054\u67E5\uFF0C\u4EC5\u9650\u67E5\u8BE2\u8BED\u53E5\uFF0C\u5EFA\u8BAE\u663E\u5F0F\u5199 LIMIT\u3002\u591A\u8868\u8054\u67E5\u8981\u6C42\u53C2\u4E0E\u7684\u6570\u636E\u96C6\u8981\u4E48\u5747\u4E3A\u62BD\u53D6\u6570\u636E\u96C6\uFF0C\u8981\u4E48\u5747\u4E3A\u6765\u81EA\u540C\u4E00\u6570\u636E\u8D26\u6237\u548C\u6570\u636E\u5E93\u7684\u76F4\u8FDE\u6570\u636E\u96C6\u3002"),inputs:L.array(L.string().min(1)).min(1).describe("SQL \u67E5\u8BE2\u4F9D\u8D56\u7684\u6570\u636E\u96C6 ID \u5217\u8868\uFF0C\u7528\u4E8E BI \u7ED1\u5B9A/\u6388\u6743\u6570\u636E\u96C6\uFF1B\u5355\u8868\u67E5\u8BE2\u4F20 1 \u4E2A\uFF0C\u591A\u8868\u8054\u67E5\u4F20\u591A\u4E2A\u3002\u591A\u8868\u8054\u67E5\u8981\u6C42\u8FD9\u4E9B\u6570\u636E\u96C6\u8981\u4E48\u5747\u4E3A\u62BD\u53D6\uFF0C\u8981\u4E48\u5747\u4E3A\u6765\u81EA\u540C\u4E00\u6570\u636E\u8D26\u6237\u548C\u6570\u636E\u5E93\u7684\u76F4\u8FDE\u3002"),queryStructure:L.object({ctes:L.array(Hs).optional(),mainQuery:L.string().optional()}).optional().describe("\u7ED3\u6784\u5316\u67E5\u8BE2\u4FE1\u606F\uFF0C\u53EF\u7528\u4E8E\u62C6\u5206 CTE \u548C\u4E3B\u67E5\u8BE2\u3002")};async function Nn(e,t,n){try{await Mt(e,t,"executeSqlQuery");let r=await e.post("/api/data-source/execute-sql-query",{...n,limit:t.BI_MAX_ROWS});return M({maxRowsHint:t.BI_MAX_ROWS,result:r})}catch(r){if(Js(r))return Ce("execute_sql_query",r,{hint:"\u8BF7\u5728\u7BA1\u7406\u540E\u53F0 -> \u9AD8\u7EA7\u8BBE\u7F6E -> \u5BF9\u5E94\u57DF\u540D\u4E0B\uFF0C\u6253\u5F00\u9AD8\u7EA7SQL\u67E5\u8BE2\u529F\u80FD\u3002"});throw r}}function Js(e){return e instanceof Error&&e.message.includes("POST /api/data-source/execute-sql-query HTTP 404")}import{z as j}from"zod";var Ln={keyword:j.string().default("").describe("\u641C\u7D22\u5173\u952E\u8BCD\uFF0C\u7559\u7A7A\u65F6\u8FD4\u56DE\u8D44\u6E90\u5217\u8868\u3002"),resourceType:j.enum(["ALL","CARD","DASHBOARD","DATA_SET","ETL"]).optional().default("ALL"),limit:j.number().int().min(1).max(100).optional().default(20),offset:j.number().int().min(0).optional().default(0),utimeStartTime:j.number().int().optional().describe("\u66F4\u65B0\u65F6\u95F4\u8D77\u70B9\uFF0C\u6BEB\u79D2\u65F6\u95F4\u6233\u3002"),utimeEndTime:j.number().int().optional().describe("\u66F4\u65B0\u65F6\u95F4\u7EC8\u70B9\uFF0C\u6BEB\u79D2\u65F6\u95F4\u6233\u3002"),cardType:j.string().optional().describe("\u5361\u7247\u7C7B\u578B\u8FC7\u6EE4\uFF0C\u4EC5 resourceType \u5305\u542B CARD \u65F6\u4F7F\u7528\u3002"),permissionType:j.string().optional(),orderBy:j.string().optional(),isDesc:j.boolean().optional()};async function qn(e,t){let{cardType:n,...r}=t,i={...r,specificResourceFilters:n?{cardType:n}:void 0},s=await e.post("/api/global-search",i);return M(s)}import{z as m}from"zod";var mt=m.enum(["asc","desc"]),$s=m.enum(["EQ","NE","IN","NI","GT","GE","LT","LE","BT","CLOSE_BT_OPEN","OPEN_BT_CLOSE","OPEN_BT_OPEN","IS_NULL","NOT_NULL","CONTAINS","NOT_CONTAINS","STARTSWITH","NOT_STARTSWITH","ENDSWITH","NOT_ENDSWITH","STARTSWITH_USER_PROPERTIES","STARTSWITH_GLOBAL_PARAMS"]),Gn=new Set(["BT","CLOSE_BT_OPEN","OPEN_BT_CLOSE","OPEN_BT_OPEN"]),ct=new Set(["IS_NULL","NOT_NULL"]),Kn=m.object({field:m.string().min(1).describe("\u7B5B\u9009\u5B57\u6BB5\u540D\u79F0\u6216\u5B57\u6BB5 ID\u3002"),operator:$s.describe("BI \u539F\u751F\u7B5B\u9009\u64CD\u4F5C\u7B26\uFF0C\u4F8B\u5982 GE/LE/NI/CONTAINS\u3002\u533A\u95F4\u64CD\u4F5C\u7B26\u9700\u8981\u4F20\u4E24\u4E2A\u503C\u3002"),values:m.array(m.union([m.string(),m.number(),m.boolean()])).optional().describe("\u7B5B\u9009\u503C\u3002IS_NULL/NOT_NULL \u4E0D\u9700\u8981\u4F20\u503C\u3002"),fd_id:m.string().min(1).optional().describe("\u5DF2\u77E5\u5B57\u6BB5 ID \u65F6\u53EF\u76F4\u63A5\u6307\u5B9A\u3002")}).superRefine((e,t)=>{let n=e.values?.length??0;ct.has(e.operator)&&n>0&&t.addIssue({code:m.ZodIssueCode.custom,path:["values"],message:`${e.operator} \u64CD\u4F5C\u7B26\u4E0D\u63A5\u53D7\u7B5B\u9009\u503C\u3002`}),Gn.has(e.operator)&&n!==2&&t.addIssue({code:m.ZodIssueCode.custom,path:["values"],message:`${e.operator} \u64CD\u4F5C\u7B26\u9700\u8981\u6070\u597D 2 \u4E2A\u503C\u3002`}),!Gn.has(e.operator)&&!ct.has(e.operator)&&n<1&&t.addIssue({code:m.ZodIssueCode.custom,path:["values"],message:`${e.operator} \u64CD\u4F5C\u7B26\u81F3\u5C11\u9700\u8981 1 \u4E2A\u503C\u3002`})}),Vs=m.object({field:m.string().min(1).describe("\u6392\u5E8F\u5B57\u6BB5\u540D\u79F0\u6216\u5B57\u6BB5 ID\u3002"),direction:mt.describe("\u6392\u5E8F\u65B9\u5411\u3002")}),Fs=m.object({type:m.enum(["compare","xtd","last","recent","percentage","rank_top"]),compare:m.enum(["yoy","mom","qoq","wow","dod"]).optional(),compare_value:m.enum(["value","rate","rawdata"]).optional(),xtd:m.enum(["ytd","qtd","mtd","wtd","dtd"]).optional(),recent:m.string().regex(/^[1-9]\d*[dwmqy]$/).optional(),recent_base:m.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),percentage_dim:m.string().min(1).optional(),rank_top:m.number().int().positive().optional(),rank_order:mt.optional(),rank_dim:m.string().min(1).optional()}),Wn={keyword:m.string().min(1).optional().describe("\u6307\u6807\u540D\u79F0\u5173\u952E\u8BCD\u3002"),project_id:m.string().min(1).optional().describe("\u6307\u6807\u4E3B\u9898 ID\uFF1B\u4E0D\u4F20\u5219\u8DE8\u53EF\u8BBF\u95EE\u4E3B\u9898\u641C\u7D22\u3002"),dir_id:m.string().min(1).optional().describe("\u76EE\u5F55 ID\u3002"),status:m.string().min(1).optional().describe("\u4E0A\u7EBF\u72B6\u6001\uFF0C\u4F20\u6307\u6807\u5E73\u53F0\u7684\u72B6\u6001\u4EE3\u7801\uFF1APUBLISHED\uFF08\u5DF2\u4E0A\u7EBF\uFF09\u3001UNPUBLISHED\uFF08\u672A\u4E0A\u7EBF\uFF09\u3002"),sub_types:m.array(m.string().min(1)).optional().describe("\u6307\u6807\u7C7B\u578B\u4EE3\u7801\u5217\u8868\uFF0C\u4F8B\u5982 ATOMIC\uFF08\u539F\u5B50\uFF09\u3001DERIVED\uFF08\u884D\u751F\uFF09\u3001COMPOSITE\uFF08\u590D\u5408\uFF09\u3002"),order_by:m.enum(["utimeDesc","utimeAsc"]).optional().describe("\u6392\u5E8F\u65B9\u5F0F\uFF1AutimeDesc \u6309\u66F4\u65B0\u65F6\u95F4\u5012\u5E8F\uFF0CutimeAsc \u6309\u66F4\u65B0\u65F6\u95F4\u6B63\u5E8F\u3002"),limit:m.number().int().positive().max(200).optional().default(20).describe("\u6700\u591A\u8FD4\u56DE\u6761\u6570\u3002")},Yn={project_id:m.string().min(1).optional().describe("\u6307\u6807\u4E3B\u9898 ID\u3002"),keyword:m.string().min(1).optional().describe("\u540D\u79F0\u5173\u952E\u8BCD\uFF0C\u53EF\u5339\u914D\u4E3B\u9898\u3001\u76EE\u5F55\u6216\u6307\u6807\u3002"),raw:m.boolean().optional().describe("\u662F\u5426\u8FD4\u56DE\u539F\u59CB\u54CD\u5E94\u3002")},Xn={metric_id:m.string().min(1).describe("\u6307\u6807 ID\u3002"),brief:m.boolean().optional().describe("\u662F\u5426\u53EA\u8FD4\u56DE\u8BE6\u60C5\uFF0C\u4E0D\u8865\u5145\u8840\u7F18\u3002"),raw:m.boolean().optional().describe("\u662F\u5426\u8FD4\u56DE\u539F\u59CB\u8BE6\u60C5\u3002")},Zn={metric_id:m.string().min(1).describe("\u6307\u6807 ID\u3002"),dimensions:m.array(m.string().min(1)).optional().describe("\u6309\u540D\u79F0\u6216\u5B57\u6BB5 ID \u6307\u5B9A\u67E5\u8BE2\u7EF4\u5EA6\u3002"),filters:m.array(Kn).optional().describe("\u7B5B\u9009\u6761\u4EF6\u3002"),combine_type:m.enum(["AND","OR"]).optional().default("AND").describe("\u591A\u4E2A\u7B5B\u9009\u6761\u4EF6\u7684\u7EC4\u5408\u65B9\u5F0F\u3002"),sort:m.array(Vs).optional().describe("\u6392\u5E8F\u5B57\u6BB5\u3002"),columns:m.array(m.string().min(1)).optional().describe("\u7ED3\u679C\u5217\u88C1\u526A\u3002"),limit:m.number().int().positive().max(1e3).optional().default(100).describe("\u6700\u591A\u8FD4\u56DE\u884C\u6570\u3002"),advanced_calc:Fs.optional().describe("\u9AD8\u7EA7\u8BA1\u7B97\uFF0C\u53EA\u4F7F\u7528\u6307\u6807\u6570\u636E\u67E5\u8BE2\u63A5\u53E3\u8868\u8FBE\u3002"),raw:m.boolean().optional().describe("\u662F\u5426\u8FD4\u56DE\u539F\u59CB\u54CD\u5E94\u3002")},er={keyword:m.string().min(1).optional().describe("\u6307\u6807\u6811\u540D\u79F0\u5173\u952E\u8BCD\u3002"),project_id:m.string().min(1).optional().describe("\u6839\u6307\u6807\u6240\u5C5E\u4E3B\u9898 ID\u3002"),parent_dir_id:m.string().min(1).optional().describe("\u6307\u6807\u6811\u76EE\u5F55 ID\u3002"),order_by:m.enum(["utimeDesc","utimeAsc"]).optional().default("utimeDesc").describe("\u6392\u5E8F\u65B9\u5F0F\uFF1AutimeDesc \u6309\u66F4\u65B0\u65F6\u95F4\u5012\u5E8F\uFF08\u9ED8\u8BA4\uFF09\uFF0CutimeAsc \u6309\u66F4\u65B0\u65F6\u95F4\u6B63\u5E8F\u3002"),limit:m.number().int().positive().max(200).optional().default(20).describe("\u6700\u591A\u8FD4\u56DE\u6761\u6570\u3002")},tr={metric_tree_id:m.string().min(1).describe("\u6307\u6807\u6811 ID\u3002"),raw:m.boolean().optional().describe("\u662F\u5426\u8FD4\u56DE\u539F\u59CB\u8BE6\u60C5\u3002")},nr={metric_tree_id:m.string().min(1).describe("\u6307\u6807\u6811 ID\u3002"),target:m.enum(["metric","dimension","scan"]).describe("\u5F52\u56E0\u7C7B\u578B\uFF1A\u6307\u6807\u62C6\u89E3\u3001\u5355\u7EF4\u62C6\u89E3\u6216\u5168\u7EF4\u626B\u63CF\u3002"),dimension:m.string().min(1).optional().describe("target=dimension \u65F6\u6309\u7EF4\u5EA6\u540D\u79F0\u6307\u5B9A\u3002"),dimension_fd_id:m.string().min(1).optional().describe("target=dimension \u65F6\u6309\u5B57\u6BB5 ID \u6307\u5B9A\u3002"),scan_dimensions:m.array(m.string().min(1)).optional().describe("target=scan \u65F6\u6307\u5B9A\u626B\u63CF\u7EF4\u5EA6\u540D\u79F0\u3002"),exclude_dimensions:m.array(m.string().min(1)).optional().describe("target=scan \u65F6\u6392\u9664\u7EF4\u5EA6\u540D\u79F0\u3002"),period:m.string().min(1).optional().describe("\u5F53\u524D\u671F\uFF0C\u914D\u5408 last_period \u8986\u76D6\u9ED8\u8BA4\u65F6\u95F4\u5BF9\u6BD4\u3002"),last_period:m.string().min(1).optional().describe("\u5BF9\u6BD4\u671F\uFF0C\u914D\u5408 period \u8986\u76D6\u9ED8\u8BA4\u65F6\u95F4\u5BF9\u6BD4\u3002"),time_comparison_json:m.record(m.string(),m.unknown()).optional().describe("\u5B8C\u6574\u65F6\u95F4\u5BF9\u6BD4\u914D\u7F6E\u8986\u76D6\u3002"),filters:m.array(Kn).optional().describe("\u5F52\u56E0\u7B5B\u9009\u6761\u4EF6\u3002"),limit:m.number().int().positive().max(200).optional().default(20).describe("metric/dimension \u8FD4\u56DE\u884C\u6570\u3002"),group_limit:m.number().int().positive().max(50).optional().default(5).describe("scan \u6BCF\u4E2A\u7EF4\u5EA6\u8FD4\u56DE\u884C\u6570\u3002"),sort:mt.optional().default("desc").describe("\u6309\u8D21\u732E\u503C\u6392\u5E8F\u65B9\u5411\u3002"),raw:m.boolean().optional().describe("\u662F\u5426\u8FD4\u56DE\u539F\u59CB\u54CD\u5E94\u3002")},G={summary:m.unknown().optional(),items:m.array(m.unknown()).optional(),tree:m.unknown().optional(),detail:m.unknown().optional(),columns:m.array(m.unknown()).optional(),rows:m.array(m.unknown()).optional(),raw:m.unknown().optional(),diagnostic:m.unknown().optional(),status:m.string().optional()};async function rr(e,t,n){let r=new D(e,t);try{let i=n.project_id?[n.project_id]:await zs(r),s=[];for(let a of i){let u=await r.searchMetrics({projectId:a,dirId:n.dir_id,keyword:n.keyword,status:n.status,subTypes:n.sub_types,orderBy:n.order_by});if(s.push(...Qs(u)),s.length>=n.limit)break}let o=bo(s.map(dt),"metric_id").slice(0,n.limit);return B({summary:{keyword:n.keyword,project_id:n.project_id,count:o.length,searched_project_count:i.length,truncated:o.length<s.length},items:o})}catch(i){return V(i,"search_metrics")}}async function ir(e,t,n){let r=new D(e,t);try{try{let i=await r.listMetricFullTree({projectId:n.project_id,keyword:n.keyword});return B({summary:{source:"full-tree"},tree:Ws(i),raw:n.raw?i:void 0})}catch(i){let s=n.project_id?[{id:n.project_id}]:await dr(r),o=[];for(let a of s){let u=l(a.id);if(!u)continue;let c=await r.listMetricDirectoryTree(u);o.push({id:u,name:l(a.name)||u,type:"project",project_id:u,children:Ys(c,u)})}return B({summary:{source:"directory-fallback",fallback_reason:i instanceof Error?i.message:String(i)},tree:o})}}catch(i){return V(i,"list_metric_catalog")}}async function sr(e,t,n){let r=new D(e,t);try{let i=await r.getMetricDetail(n.metric_id),s=Xs(i),o,a;if(!n.brief){let u=l(i.uniformResourceType)||"METRIC_PLATFORM_METRIC";try{o=Zs(await r.getMetricLineage(n.metric_id,u))}catch(c){a=c instanceof H?c.detail:String(c)}}return B({detail:{...s,lineage:o,lineage_error:a},raw:n.raw?i:void 0})}catch(i){return V(i,"get_metric_detail")}}async function or(e,t,n){let r=new D(e,t);try{let i=await r.getMetricDetail(n.metric_id);if(!n.advanced_calc){let a=Jn(i,n);if("unsupported"in a)return x("query_metric_data",a.unsupported);let u=async p=>{let g=await r.getCardEditSession(a.cardId),I=l(g.sessionId);if(!I)throw new Error("\u6307\u6807\u5361\u7247\u9884\u89C8\u4F1A\u8BDD\u54CD\u5E94\u7F3A\u5C11 sessionId\u3002");return a.dimensions.length&&await eo(r,a.cardId,I,a.dimensions),{raw:await r.queryCardEditData(a.cardId,I,p),sessionId:I}};if(n.combine_type==="OR"&&(n.filters?.length??0)>1){let p=[],g=[];for(let I of n.filters??[]){let T=Jn(i,{...n,combine_type:"AND",filters:[I]});if("unsupported"in T)return x("query_metric_data",T.unsupported);let{raw:R}=await u(T.body);g.push(R),p.push(...$n(R))}return Oe(i,p,n,{mode:"metric_card_preview_data",card_id:a.cardId,card_kind:a.cardKind,combine_type:"OR",query_count:g.length},n.raw?g:void 0)}let{raw:c,sessionId:d}=await u(a.body);return Oe(i,$n(c),n,{mode:"metric_card_preview_data",card_id:a.cardId,card_kind:a.cardKind,session_id:d,request_body:a.body},n.raw?c:void 0)}let s=Hn(i,n);if("unsupported"in s)return x("query_metric_data",s.unsupported);if(n.combine_type==="OR"&&(n.filters?.length??0)>1){let a=[],u=[];for(let c of n.filters??[]){let d=Hn(i,{...n,combine_type:"AND",filters:[c]});if("unsupported"in d)return x("query_metric_data",d.unsupported);let p=await r.queryMetricData(d.input);u.push(p),a.push(...ae(p))}return Oe(i,a,n,{mode:"metric_data_v2",combine_type:"OR",query_count:u.length},n.raw?u:void 0)}let o=await r.queryMetricData(s.input);return Oe(i,ae(o),n,{mode:"metric_data_v2",request_body:s.input},n.raw?o:void 0)}catch(i){return yo(i)?x("query_metric_data",{capability:"metric_data_v2_unavailable",message:"\u5F53\u524D BI \u73AF\u5883\u672A\u63D0\u4F9B /api/metric-platform/metric-data/v2\uFF0C\u65E0\u6CD5\u6267\u884C\u9AD8\u7EA7\u8BA1\u7B97\u67E5\u8BE2\u3002",diagnostic:i.detail}):V(i,"query_metric_data")}}async function ar(e,t,n){let r=new D(e,t);try{let i=await r.searchMetricTrees({keyword:n.keyword,projectId:n.project_id,parentDirId:n.parent_dir_id,orderBy:n.order_by}),s=Ks(i).map(gr).slice(0,n.limit);return B({summary:{keyword:n.keyword,count:s.length},items:s})}catch(i){return V(i,"search_metric_trees")}}async function ur(e,t,n){let r=new D(e,t);try{let i=await r.getMetricTreeDetail(n.metric_tree_id);return B({detail:ao(i),raw:n.raw?i:void 0})}catch(i){return V(i,"get_metric_tree_detail")}}async function cr(e,t,n){let r=new D(e,t);try{if(n.target==="dimension"&&!n.dimension&&!n.dimension_fd_id)return x("query_metric_tree_attribution",{capability:"dimension_attribution_requires_dimension",message:"target=dimension \u65F6\u5FC5\u987B\u6307\u5B9A dimension \u6216 dimension_fd_id\u3002"});let i=await r.getMetricTreeDetail(n.metric_tree_id),s=l(i.metricId);if(!s)return x("query_metric_tree_attribution",{capability:"missing_root_metric",message:"\u6307\u6807\u6811\u8BE6\u60C5\u7F3A\u5C11\u6839\u6307\u6807 ID\uFF0C\u65E0\u6CD5\u6267\u884C\u5F52\u56E0\u3002"});let o=await r.getMetricDetail(s),a=ue(o),u=ft(n.filters??[],a);if("unsupported"in u)return x("query_metric_tree_attribution",u.unsupported);let c=u.filters,d=uo(i,n);if("unsupported"in d)return x("query_metric_tree_attribution",d.unsupported);if(n.target==="metric"){let T=co(i,d.value,c),R=await r.queryMetricTreeDecompose(n.metric_tree_id,T);return ut(i,"metric",lo(R),n,n.raw?R:void 0)}if(n.target==="dimension"){let T=te(a,n.dimension,n.dimension_fd_id);if(!T)return x("query_metric_tree_attribution",{capability:"unknown_dimension",message:`\u7EF4\u5EA6\u4E0D\u5B58\u5728\u6216\u4E0D\u9002\u7528\u4E8E\u6839\u6307\u6807\uFF1A${n.dimension??n.dimension_fd_id}`});let R=Fn(i,T,d.value,c,n.limit,n.sort),k=await r.queryMetricTreeDrill(n.metric_tree_id,R);return ut(i,"dimension",zn(k,l(T.name)),n,n.raw?k:void 0)}let p=po(i,a,n.scan_dimensions,n.exclude_dimensions);if(!p.length)return x("query_metric_tree_attribution",{capability:"no_scan_dimensions",message:"\u6CA1\u6709\u53EF\u626B\u63CF\u7EF4\u5EA6\uFF0C\u8BF7\u6307\u5B9A scan_dimensions \u6216\u68C0\u67E5\u6307\u6807\u6811\u7EF4\u5EA6\u62C6\u89E3\u914D\u7F6E\u3002"});let g=[],I=[];for(let T of p){let R=Fn(i,T,d.value,c,n.group_limit,n.sort),k=await r.queryMetricTreeDrill(n.metric_tree_id,R);I.push({dimension:l(T.name),raw:k}),g.push(...zn(k,l(T.name)).slice(0,n.group_limit))}return ut(i,"scan",g,n,n.raw?I:void 0,{scanned_dimensions:p.map(T=>l(T.name))})}catch(i){return V(i,"query_metric_tree_attribution")}}async function zs(e){return(await dr(e)).map(t=>l(t.id)).filter(Boolean)}async function dr(e){return S(await e.listProjects()).map(_).filter(Boolean)}function Qs(e){let t=_(e);return S(t.contents??t.items??t.data)}function Ks(e){let t=_(e);return S(t.data??t.contents??t.items)}function dt(e){return h({metric_id:l(e.id),name:l(e.name),project_id:l(e.projectId),dir_id:E(e.parentDirId,e.dirId),status:l(e.status),sub_type:l(e.subType),description:l(e.desc),dataset:Ir(e.dsInfo),statistics:e.statisticsData,creator:Pe(e.creator),business_owner:Pe(e.businessOwner),updated_at:l(e.utime),raw:e})}function Ws(e){return S(e).map(t=>lr(t,void 0))}function lr(e,t){let n=!!e.isMetric,r=l(e.id),i=!t&&!n?r:t;return h({id:r,name:l(e.name),type:n?"metric":t?"directory":"project",project_id:i,dir_id:!n&&t?r:void 0,metric_id:n?r:void 0,parent_id:l(e.parentId),children:S(e.children).map(s=>lr(s,i))})}function Ys(e,t){let n=_(e);return l(n.id)?[lt(n,t)]:S(n.contents??n.children).map(r=>lt(r,t))}function lt(e,t){return h({id:l(e.id),name:l(e.name),type:"directory",project_id:t,dir_id:l(e.id),parent_id:E(e.parentDirId,e.parentId),can_use:A(e.canUse),can_manage:A(e.canManage),metric_count:Qn(e.metricCnt),all_metric_count:Qn(e.allMetricCnt),children:S(e.contents??e.children).map(n=>lt(n,t))})}function Xs(e){return h({metric_id:l(e.id),name:l(e.name),english_name:l(e.engName),status:l(e.status),sub_type:l(e.subType),description:l(e.desc),project_id:l(e.projectId),project_name:l(e.projectName),dir_id:E(e.parentDirId,e.dirId),dir_path:yr(e.dirPath),dataset:Ir(e.dsInfo),source_fields:S(e.fdInfos).map(Ae),aggregation:E(e.aggrType,e.aggregationType),formula:E(e.formula,e.expression),derive_setting:e.deriveSetting,format:e.format,applicable_dimensions:ue(e),time_dimension:_(e.timeDim)?Ae(_(e.timeDim)):void 0,business_attributes:S(e.bizAttrs).map(Io),business_owner:Pe(e.businessOwner),creator:Pe(e.creator),referenced_metrics:S(e.referencedMetrics).map(dt),base_metric:_(e.baseMetric)?dt(_(e.baseMetric)):void 0,linked_metric_id:l(e.linkMetricId),statistics:e.statisticsData,permissions:h({can_use:A(e.canUse),can_manage:A(e.canManage)}),created_at:l(e.ctime),updated_at:l(e.utime),has_draft:A(e.hasDraft)})}function Zs(e){let t=_(e);return h({current:t.crtNode,upstream:t.backwardAtlas,downstream:t.forwardAtlas})}function Hn(e,t){let n=l(e.name),r=l(e.projectId);if(!n||!r)return{unsupported:{capability:"metric_detail_incomplete",message:"\u6307\u6807\u8BE6\u60C5\u7F3A\u5C11 name \u6216 projectId\u3002"}};let i=ue(e),s=[...i,..._r(e)],o=[];for(let d of t.dimensions??[]){let p=te(i,d);if(!p)return{unsupported:{capability:"unsupported_dimension",parameter:d,supported_dimensions:i}};o.push(mo(p))}let a=no(e,i,t.advanced_calc);if("unsupported"in a)return{unsupported:a.unsupported};let u=ft(t.filters??[],s);if("unsupported"in u)return{unsupported:u.unsupported};let c=pr(t.sort??[],s);return"unsupported"in c?{unsupported:c.unsupported}:{input:{projectId:r,metricId:t.metric_id,metricName:n,metricItems:[h({name:n,alias:ro(n,t.advanced_calc),advCalc:a.value})],dimensions:o,filters:u.filters,sorting:c.sorting,limit:t.limit}}}function Jn(e,t){let n=_(e.metricChartConfig),r=l(n.metricChartCdId),i=l(n.metricValueCdId),s=r||i;if(!s)return{unsupported:{capability:"missing_metric_card",message:"\u6307\u6807\u8BE6\u60C5\u7F3A\u5C11 metricChartConfig.metricChartCdId \u6216 metricValueCdId\uFF0C\u65E0\u6CD5\u8D70\u53EA\u8BFB\u5361\u7247\u53D6\u6570\u3002"}};let o=[...ue(e),..._r(e)],a=[];for(let g of t.dimensions??[]){let I=te(o,g);if(!I||l(I.meta_type).toUpperCase()==="METRIC")return{unsupported:{capability:"unsupported_dimension",parameter:g,supported_dimensions:ue(e)}};a.push(fo(I))}let u=ft(t.filters??[],o);if("unsupported"in u)return{unsupported:u.unsupported};let c=u.filters,d=pr(t.sort??[],o);if("unsupported"in d)return{unsupported:d.unsupported};let p=d.sorting;return{cardId:s,cardKind:r?"chart":"value",dimensions:a,body:h({limit:t.limit,filters:c.length?c:void 0,combineType:t.filters?.length?t.combine_type:void 0,sorting:p.length?p:void 0})}}async function eo(e,t,n,r){let i=br(await e.getCardEditMeta(t))??{},s=to(i);s.row=r,s.sorting=[],await e.modifyCardEditMeta(t,n,i)}function to(e){let t=_(e.content),n=_(t.meta),r=_(n.chartMain),i=_(r.zoneData);if(!Object.keys(i).length)throw new Error("\u6307\u6807\u5361\u7247\u7F16\u8F91\u914D\u7F6E\u7F3A\u5C11 content.meta.chartMain.zoneData\u3002");return t.meta=n,n.chartMain=r,r.zoneData=i,e.content=t,i}function no(e,t,n){if(!n)return{value:void 0};let r=_(e.timeDim),i=l(r?.fdId);if(["compare","last"].includes(n.type)&&!i)return{unsupported:{capability:"advanced_calc_requires_time_dimension",parameter:n.type}};if(n.type==="compare"){let a=n.compare??"yoy",u={yoy:["YEAR","YEAR"],mom:["MONTH","MONTH"],qoq:["QUARTER","QUARTER"],wow:["WEEK","WEEK"],dod:["DAY","DAY"]},[c,d]=u[a];return{value:{advType:"COMPARATIVE",advValue:{advType:"COMPARATIVE",dateFdId:i,valueType:(n.compare_value??"value").toUpperCase(),offset:1,offsetType:c,granularity:d}}}}if(n.type==="xtd")return{value:{advType:"XTD",advValue:{advType:"XTD",granularity:{ytd:"YEAR",qtd:"QUARTER",mtd:"MONTH",wtd:"WEEK",dtd:"DAY"}[n.xtd??"ytd"],includeCurrentValue:!0}}};if(n.type==="last")return{value:{advType:"LAST",advValue:{advType:"LAST",dateFdId:i}}};if(n.type==="recent"){let a=io(n.recent??"7d");return a?{value:{advType:"RECENT_X",advValue:{advType:"RECENT_X",granularity:a.granularity,baselineOffset:[a.count-1,0],includeCurrentValue:!0,baseline:n.recent_base}}}:{unsupported:{capability:"invalid_recent_spec",parameter:n.recent}}}if(n.type==="percentage"){let a=n.percentage_dim?te(t,n.percentage_dim):void 0;return n.percentage_dim&&!a?{unsupported:{capability:"unknown_percentage_dimension",parameter:n.percentage_dim}}:{value:{advType:"LEVEL_PERCENTAGE",advValue:h({advType:"LEVEL_PERCENTAGE",auto:!a,tfdId:l(a?.fd_id)})}}}let o=n.rank_dim?te(t,n.rank_dim):void 0;return n.rank_dim&&!o?{unsupported:{capability:"unknown_rank_dimension",parameter:n.rank_dim}}:{value:{advType:"RANK",advValue:h({advType:"RANK",calDimension:"FIELD",rankType:"RANK",sorting:(n.rank_order??"desc").toUpperCase(),tfdId:l(o?.fd_id),topN:{topType:"CUSTOM_NUMBER",count:n.rank_top??10,calculationType:"COUNT"}})}}}function ro(e,t){return t?t.type==="compare"?`${e}_${t.compare??"yoy"}`:t.type==="xtd"?`${e}_${t.xtd??"ytd"}`:t.type==="recent"?`${e}_recent_${t.recent??"7d"}`:`${e}_${t.type}`:e}function io(e){let t=e.match(/^([1-9]\d*)([dwmqy])$/);if(!t)return;let n={d:"DAY",w:"WEEK",m:"MONTH",q:"QUARTER",y:"YEAR"};return{count:Number(t[1]),granularity:n[t[2]]}}function ft(e,t){let n=[];for(let r of e){let i=mr(t,r.field,r.fd_id,"filter");if("unsupported"in i)return{unsupported:i.unsupported};n.push(h({name:i.field.name,fdId:i.field.fdId,fdType:i.field.fdType,metaType:i.field.metaType,filterType:r.operator,filterValue:so(r)}))}return{filters:n}}function so(e){return ct.has(e.operator)?[]:e.values??[]}function pr(e,t){let n=[];for(let r of e){let i=mr(t,r.field,void 0,"sort");if("unsupported"in i)return{unsupported:i.unsupported};n.push(h({name:i.field.name,ordering:r.direction,key:i.field.fdId,fdId:i.field.fdId,fdType:i.field.fdType,metaType:i.field.metaType}))}return{sorting:n}}function mr(e,t,n,r){let i=te(e,t,n),s=r==="filter"?"unsupported_filter_field":"unsupported_sort_field",o=r==="filter"?"\u7B5B\u9009":"\u6392\u5E8F";if(!i)return{unsupported:{capability:s,parameter:t,message:`${o}\u5B57\u6BB5\u65E0\u6CD5\u4ECE\u5F53\u524D\u67E5\u8BE2\u4E0A\u4E0B\u6587\u89E3\u6790\uFF1A${t}`,supported_fields:e.map(g=>h({name:l(g.name),fd_id:l(g.fd_id),meta_type:l(g.meta_type)}))}};let a=l(i.name),u=l(i.fd_id),c=l(i.fd_type),d=l(i.meta_type).toUpperCase(),p=[a?void 0:"name",u?void 0:"fdId",c?void 0:"fdType",d?void 0:"metaType"].filter(g=>!!g);return p.length?{unsupported:{capability:s,parameter:t,message:`${o}\u5B57\u6BB5\u7F3A\u5C11\u5FC5\u8981 BI \u5143\u4FE1\u606F\uFF1A${t}`,missing_metadata:p}}:{field:{name:a,fdId:u,fdType:c,metaType:d}}}function Oe(e,t,n,r,i){let s=go(t.slice(0,n.limit),n.columns);return B({summary:{metric_id:n.metric_id,metric_name:l(e.name),row_count:s.length,truncated:t.length>s.length},columns:hr(s),rows:s,diagnostic:r,raw:i})}function ae(e){let t=_(e),n=_(t.data)??t,r=S(n.values??n.rows??t.values??t.rows);if(r.length)return r;let i=S(n.columns??t.columns).map(o=>l(_(o)?.name??o)).filter(Boolean),s=S(n.preview??n.contents);return i.length?s.map(o=>{let a=Array.isArray(o)?o:[];return Object.fromEntries(i.map((u,c)=>[u,a[c]]))}):s}function $n(e){let t=_(e),n=_(t.data)??t,r=_(n.chartMain??t.chartMain??_(_(t.content).data).chartMain);if(!Object.keys(r).length)return ae(e);let i=_(r.row),s=_(r.column),o=S(i.fields),a=$(i.data),u=$(r.data),c=oo(s),d=o.map(pt).filter(Boolean),p=_o([...d,...c]),g=Math.max(a.length,u.length),I=[];for(let T=0;T<g;T+=1){let R=[];R.push(...$(a[T]).map(Vn)),R.push(...$(u[T]).map(Vn)),R.length&&I.push(Object.fromEntries(R.map((k,z)=>[p[z]??`column_${z+1}`,k])))}return I}function oo(e){let n=$(e.data).map((r,i)=>{let s=$(r).map(fr).filter(Boolean).join("/");return s||pt(S(e.fields)[i])||`metric_${i+1}`}).filter(Boolean);return n.length?n:S(e.fields).map(pt).filter(Boolean)}function pt(e){return E(e.alias,e.title,e.originTitle,e.name,e.fdId,e.id)??""}function fr(e){let t=_(e);return Object.keys(t).length?E(t.title,t.name,t.originTitle,t.alias,t.v,t.value)??"":l(e)}function Vn(e){let t=_(e);return Object.keys(t).length?"v"in t?t.v:"value"in t?t.value:fr(e):e}function gr(e){return h({metric_tree_id:l(e.metricTreeId),name:l(e.metricTreeName),root_metric_id:l(e.metricId),root_metric_name:l(e.metricName),project_id:l(e.projectId),project_name:l(e.projectName),parent_dir_id:l(e.parentDirId),dir_path:yr(e.dirPath),creator_id:l(e.creatorId),creator_name:l(e.creatorName),can_use:A(e.canUse),can_manage:A(e.canManage),updated_at:l(e.utime)})}function ao(e){let t=_(e.config)??{};return h({...gr(e),dom_id:l(e.domId),created_at:l(e.ctime),time_comparison:t.timeComparisonSetting,comparison_enabled:A(t.comparisonEnabled),contribution_calc_enabled:A(t.contributionCalcEnabled),dimension_decomposition:t.dimensionDecompositionContent,metric_decomposition:t.metricDecompositionContent,permissions:h({can_use:A(e.canUse),can_manage:A(e.canManage)})})}function uo(e,t){let n=_(e.config)??{},r=t.time_comparison_json??br(_(n.timeComparisonSetting)),i=A(n.comparisonEnabled)??!!r,s=A(n.contributionCalcEnabled)??!1;if(t.period||t.last_period){if(!t.period||!t.last_period)return{unsupported:{capability:"period_requires_last_period",message:"period \u548C last_period \u9700\u8981\u540C\u65F6\u6307\u5B9A\u3002"}};r=r??{};let o=_(r.advValue)??{};r.advValue=o,o.window={period:[t.period],withMacro:!1};let a=ho(t.period,t.last_period);if(!a)return{unsupported:{capability:"unsupported_period_granularity",message:"\u76EE\u524D\u4EC5\u652F\u6301 YYYY-MM-DD \u683C\u5F0F\u7684 period/last_period\u3002"}};Object.assign(o,a,{mode:"NORMAL"}),r.advType="COMPARATIVE",i=!0}return{value:{setting:r,comparisonEnabled:i,contributionEnabled:s}}}function co(e,t,n){let r=_(e.config)??{},i=_(r.metricDecompositionContent)??{};return h({timeComparisonSetting:t.setting,comparisonEnabled:t.comparisonEnabled,contributionCalcEnabled:!1,metricDecomposeInfo:{metricRelationTree:i.metricRelationTree,filters:n}})}function Fn(e,t,n,r,i,s){return h({timeComparisonSetting:n.setting,comparisonEnabled:n.comparisonEnabled,contributionCalcEnabled:n.contributionEnabled,drillInfo:{dimensionFdId:l(t.fd_id),drillFilters:r,nodeNum:i,orderBy:s==="asc"?"contributionAsc":"contributionDesc"}})}function lo(e){return ae(e).map(t=>h({child_metric:l(_(t.metricInfo)?.name),child_metric_id:l(_(t.metricInfo)?.metricId),current_value:t.currentValue,comparison_value:t.comparisonValue,change_value:t.changeValue,change_rate:t.changeRate,contribution_value:t.contributionValue,contribution_rate:t.contributionRate}))}function zn(e,t){return ae(e).map((n,r)=>h({dimension:t,dimension_value:Array.isArray(n.dimensionValue)?n.dimensionValue.join("/"):n.dimensionValue,current_value:n.currentValue,comparison_value:n.comparisonValue,change_value:n.changeValue,change_rate:n.changeRate,contribution_value:n.contributionValue,contribution_rate:n.contributionRate,rank:r+1}))}function ut(e,t,n,r,i,s){let o=t==="scan"?n:n.slice(0,r.limit);return B({summary:{metric_tree_id:r.metric_tree_id,metric_tree_name:l(e.metricTreeName),root_metric_id:l(e.metricId),root_metric_name:l(e.metricName),target:t,row_count:o.length,...s},columns:hr(o),rows:o,raw:i})}function po(e,t,n,r){let i=new Set((n??[]).map(c=>c.trim()).filter(Boolean)),s=new Set((r??[]).map(c=>c.trim()).filter(Boolean)),o=new Map(t.map(c=>[l(c.name),c])),a=new Map(t.map(c=>[l(c.fd_id),c])),u=i.size?[...i].map(c=>o.get(c)).filter(c=>!!c):[];if(!u.length){let c=_(e.config)??{},d=_(c.dimensionDecompositionContent)??{};u=$(d.decomposableDimensionIds).map(p=>a.get(String(p))).filter(p=>!!p)}return u.length||(u=t),u.filter(c=>!s.has(l(c.name)))}function ue(e){let t=new Set,n=[],r=i=>{if(!i)return;let s=l(i.fdId),o=l(i.name),a=s||o;if(!(!a||t.has(a))){t.add(a),n.push(Ae(i));for(let u of S(i.subs))r(u)}};for(let i of S(e.applicableDims))r(i);return r(_(e.timeDim)),n}function _r(e){let t=S(e.fdInfos).map(Ae);return l(e.name)&&!t.some(n=>l(n.name)===l(e.name))&&t.push(h({id:E(e.id,e.name),fd_id:l(e.id),name:l(e.name),fd_type:E(t[0]?.fd_type,"DOUBLE"),meta_type:"METRIC"})),t}function Ae(e){return h({id:E(e.id,e.fdId),fd_id:l(e.fdId),name:l(e.name),fd_type:l(e.fdType),meta_type:l(e.metaType),ds_id:l(e.dsId),granularity:l(e.granularity)})}function te(e,t,n){let r=(n??t)?.trim();if(r)return e.find(i=>[i.fd_id,i.id,i.name].map(l).includes(r))}function mo(e){return h({name:l(e.name),alias:l(e.name),fdType:E(e.fd_type),metaType:"DIM",key:E(e.fd_id,e.id,e.name),fdId:E(e.fd_id),dsId:E(e.ds_id),granularity:E(e.granularity)})}function fo(e){return h({name:l(e.name),alias:E(e.name),fdType:E(e.fd_type),metaType:"DIM",key:E(e.fd_id,e.id,e.name),fdId:E(e.fd_id),dsId:E(e.ds_id),granularity:E(e.granularity)})}function go(e,t){return t?.length?e.map(n=>Object.fromEntries(t.map(r=>[r,n[r]]))):e}function hr(e){return[...new Set(e.flatMap(t=>Object.keys(t)))]}function _o(e){let t=new Map;return e.map((n,r)=>{let i=n||`column_${r+1}`,s=t.get(i)??0;return t.set(i,s+1),s?`${i}_${s+1}`:i})}function ho(e,t){let n=Date.parse(e),r=Date.parse(t);if(!/^\d{4}-\d{2}-\d{2}$/.test(e)||!/^\d{4}-\d{2}-\d{2}$/.test(t)||Number.isNaN(n)||Number.isNaN(r))return;let i=Math.round((n-r)/864e5);if(!(i<=0))return{offset:i,offsetType:"DAY",granularity:"DAY"}}function Ir(e){let t=_(e);if(t)return h({dataset_id:l(t.dsId),name:l(t.name)})}function Pe(e){let t=_(e);if(t)return h({user_id:E(t.uId,t.id),name:l(t.name),deleted:A(t.isDel)})}function Io(e){return h({id:l(e.id),name:l(e.name),type:l(e.valueType),values:S(e.values)})}function yr(e){return S(e).map(t=>l(t.dirName??t.name)).filter(Boolean)}function x(e,t){return B({status:"unsupported",diagnostic:{tool:e,...t}})}function V(e,t){return e instanceof H?q({operation:t,diagnostic:e.detail}):q({operation:t,message:e instanceof Error?e.message:String(e)})}function yo(e){return e instanceof H&&e.detail.operation==="queryMetricData"&&e.detail.path==="/api/metric-platform/metric-data/v2"&&/No static resource metric-platform\/metric-data\/v2/i.test(e.detail.message)}function S(e){return Array.isArray(e)?e.map(_).filter(Boolean):[]}function $(e){return Array.isArray(e)?e:[]}function _(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function l(e){return typeof e=="string"?e:e==null?"":String(e)}function E(...e){return e.map(l).find(t=>t.trim())?.trim()}function A(e){return typeof e=="boolean"?e:void 0}function Qn(e){return typeof e=="number"&&Number.isFinite(e)?e:void 0}function bo(e,t){let n=new Set;return e.filter(r=>{let i=l(r[t]);return!i||n.has(i)?!1:(n.add(i),!0)})}function br(e){return e?JSON.parse(JSON.stringify(e)):void 0}function Tr(e,t,n,r,i={}){let s=i.usageTelemetry??new be({config:n,appVersion:i.appVersion??"unknown"}),o=(u,c,d)=>{let p=e.registerTool,g=zt(u,d,s),I=async(...T)=>{try{return await g(...T)}catch(R){return Ce(u,R)}};p.call(e,u,c,I)},a=u=>!r.service||r.service.toolList.includes(u);o("get_bi_capabilities",{title:"Get BI Capabilities",description:"\u83B7\u53D6\u5F53\u524D BI \u73AF\u5883\u7248\u672C\u548C MCP \u529F\u80FD\u542F\u7528\u72B6\u6001\u3002",inputSchema:Qt},(u,c)=>t.run(({client:d,config:p})=>Kt(d,p),c,"get_bi_capabilities")),["chatbi_list_themes","chatbi_query","chatbi_insight_start","chatbi_insight_poll"].some(a)&&(o("chatbi_list_themes",{title:"List ChatBI Themes",description:"\u5217\u51FA\u5F53\u524D\u767B\u5F55\u7528\u6237\u53EF\u8BBF\u95EE\u7684 ChatBI \u4E3B\u9898\uFF0C\u53EF\u7B5B\u9009\u6D1E\u5BDF\u4E3B\u9898\u3002",inputSchema:In,outputSchema:fn},(u,c)=>t.run(({config:d})=>Cn(d,u),c,"chatbi_list_themes")),o("chatbi_query",{title:"ChatBI Query",description:"\u6267\u884C ChatBI L1 \u540C\u6B65\u95EE\u6570\uFF0C\u7528\u81EA\u7136\u8BED\u8A00\u76F4\u63A5\u63D0\u95EE\uFF0C\u6700\u7701\u4E8B\uFF0C\u9002\u5408\u4E1A\u52A1\u95EE\u9898\u8868\u8FF0\u660E\u786E\u3001\u65E0\u9700\u7CBE\u786E\u63A7\u5236\u7EF4\u5EA6\u6216 SQL \u7684\u573A\u666F\uFF1B\u9700\u8981\u7CBE\u786E\u6307\u5B9A\u7EF4\u5EA6/\u7B5B\u9009\u7528 query_metric_data\uFF0C\u9700\u8981\u81EA\u5B9A\u4E49 SQL \u7528 execute_sql_query\u3002\u652F\u6301\u4E3B\u9898 ID \u6216\u4E3B\u9898\u540D\u3002\u6210\u529F\u7ED3\u679C\u76F4\u63A5\u900F\u51FA answer\u3001sql\u3001query_result \u7B49\u7ED3\u6784\u5316\u5B57\u6BB5\uFF0C\u7531\u8C03\u7528\u65B9\u81EA\u884C\u7EC4\u7EC7\u6700\u7EC8\u56DE\u590D\u3002session_id \u53EA\u80FD\u7528\u4E8E\u95EE\u6570\u7EED\u95EE\uFF0C\u4E0D\u80FD\u4E0E ChatBI \u6D1E\u5BDF\u4F1A\u8BDD\u6DF7\u7528\u3002",inputSchema:yn,outputSchema:gn},(u,c)=>t.run(({config:d})=>Bn(d,u),c,"chatbi_query")),o("chatbi_insight_start",{title:"Start ChatBI Insight",description:"\u53D1\u8D77 ChatBI L2 \u6D1E\u5BDF\u5206\u6790\u5E76\u5728\u8BF7\u6C42\u53D7\u7406\u540E\u7ACB\u5373\u8FD4\u56DE message_id\uFF0C\u4E0D\u7B49\u5F85\u6700\u7EC8\u62A5\u544A\uFF0C\u4E5F\u4E0D\u8FD4\u56DE final_result\u3002\u6D1E\u5BDF\u901A\u5E38\u8017\u65F6 2-3 \u5206\u949F\uFF0C5 \u5206\u949F\u89C6\u4E3A\u8D85\u65F6\uFF1B\u540C\u4E00\u95EE\u9898\u53EA\u8C03\u7528\u4E00\u6B21\uFF0C\u540E\u7EED\u4F7F\u7528 chatbi_insight_poll \u67E5\u8BE2\u7ED3\u679C\u3002",inputSchema:bn,outputSchema:_n},(u,c)=>t.run(({config:d})=>En(d,u),c,"chatbi_insight_start")),o("chatbi_insight_poll",{title:"Poll ChatBI Insight",description:"\u67E5\u8BE2 ChatBI L2 \u6D1E\u5BDF\u4EFB\u52A1\u72B6\u6001\u548C\u6700\u7EC8\u62A5\u544A\u3002status=success \u65F6\u6700\u7EC8\u5C55\u793A\u5185\u5BB9\u8BFB\u53D6 structuredContent.final_result.content\uFF1Banswer \u4E3A\u540E\u7AEF\u539F\u59CB\u7B54\u6848\u3002\u4F7F\u7528 chatbi_insight_start \u8FD4\u56DE\u7684 theme_id \u548C message_id\uFF1B\u4E0D\u8981\u9AD8\u9891\u8C03\u7528\uFF0C\u5EFA\u8BAE\u81F3\u5C11\u95F4\u9694 10 \u79D2\uFF0C\u6D1E\u5BDF\u901A\u5E38\u8017\u65F6 2-3 \u5206\u949F\uFF0C5 \u5206\u949F\u540E\u505C\u6B62\u7B49\u5F85\u3002",inputSchema:Tn,outputSchema:hn},(u,c)=>t.run(({config:d})=>wn(d,u),c,"chatbi_insight_poll"))),r.ok&&(a("global_search")&&o("global_search",{title:"Global Search",description:"\u6309\u5173\u952E\u8BCD\u641C\u7D22 BI \u4E2D\u7684\u5361\u7247\u3001\u4EEA\u8868\u677F\u3001\u6570\u636E\u96C6\u548C ETL \u8D44\u6E90\uFF0C\u9002\u5408\u5B9A\u4F4D\u67D0\u4E2A\u5DF2\u6709\u8D44\u4EA7\u6216\u5176 ID\u3002\u8FD4\u56DE\u7684\u5361\u7247 ID \u53EF\u4EA4\u7ED9 get_card_info/query_card_data\uFF0C\u6570\u636E\u96C6 ID \u53EF\u4EA4\u7ED9 get_dataset_detail/execute_sql_query\u3002\u6307\u6807\u76F8\u5173\u68C0\u7D22\u8BF7\u7528 search_metrics\u3002",inputSchema:Ln},(u,c)=>t.run(({client:d})=>qn(d,u),c,"global_search")),a("search_metrics")&&o("search_metrics",{title:"Search Metrics",description:"\u6309\u5173\u952E\u8BCD\u641C\u7D22\u6307\u6807\u5E73\u53F0\u6307\u6807\uFF0C\u8FD4\u56DE metric_id\u3001\u540D\u79F0\u3001\u4E3B\u9898\u3001\u76EE\u5F55\u3001\u7C7B\u578B\u3001\u72B6\u6001\u548C\u4E1A\u52A1\u53E3\u5F84\u6458\u8981\u3002\u5DF2\u6709\u5173\u952E\u8BCD\u65F6\u4F18\u5148\u7528\u672C\u5DE5\u5177\uFF1B\u4E0D\u6E05\u695A\u6709\u54EA\u4E9B\u6307\u6807\u65F6\u6539\u7528 list_metric_catalog \u6D4F\u89C8\u3002\u8FD4\u56DE\u7684 metric_id \u53EF\u7EE7\u7EED\u4EA4\u7ED9 get_metric_detail \u770B\u53E3\u5F84\u3001query_metric_data \u53D6\u6570\u3002",inputSchema:Wn,outputSchema:G},(u,c)=>t.run(({client:d,config:p})=>rr(d,p,u),c,"search_metrics")),a("list_metric_catalog")&&o("list_metric_catalog",{title:"List Metric Catalog",description:"\u6309\u4E3B\u9898/\u76EE\u5F55\u5C42\u7EA7\u6D4F\u89C8\u6307\u6807\u8282\u70B9\uFF0C\u9002\u5408\u4E0D\u77E5\u9053\u5173\u952E\u8BCD\u3001\u9700\u8981\u5148\u53D1\u73B0\u6709\u54EA\u4E9B\u53EF\u7528\u6307\u6807\u7684\u573A\u666F\u3002\u5DF2\u6709\u660E\u786E\u5173\u952E\u8BCD\u65F6\u6539\u7528 search_metrics\u3002\u8FD4\u56DE\u7684 metric_id \u53EF\u7EE7\u7EED\u4EA4\u7ED9 get_metric_detail\u3001query_metric_data\u3002",inputSchema:Yn,outputSchema:G},(u,c)=>t.run(({client:d,config:p})=>ir(d,p,u),c,"list_metric_catalog")),a("get_metric_detail")&&o("get_metric_detail",{title:"Get Metric Detail",description:"\u6309 metric_id \u83B7\u53D6\u6307\u6807\u7684\u4E1A\u52A1\u53E3\u5F84\u3001\u8BA1\u7B97\u53E3\u5F84\u3001\u9002\u7528\u7EF4\u5EA6\u3001\u65F6\u95F4\u7EF4\u3001\u8840\u7F18/\u5F15\u7528\u6458\u8981\u548C\u6743\u9650\u4FE1\u606F\u3002\u5EFA\u8BAE\u5728 query_metric_data \u53D6\u6570\u524D\u5148\u8C03\u7528\uFF0C\u786E\u8BA4\u53EF\u7528\u7EF4\u5EA6\u4E0E\u53E3\u5F84\u3002metric_id \u6765\u81EA search_metrics \u6216 list_metric_catalog\u3002",inputSchema:Xn,outputSchema:G},(u,c)=>t.run(({client:d,config:p})=>sr(d,p,u),c,"get_metric_detail")),a("query_metric_data")&&o("query_metric_data",{title:"Query Metric Data",description:"\u6309\u5DF2\u77E5 metric_id \u7CBE\u786E\u67E5\u8BE2\u6307\u6807\u6570\u636E\uFF0C\u9002\u5408\u9700\u8981\u6307\u5B9A\u7EF4\u5EA6\u3001\u7B5B\u9009\u3001\u6392\u5E8F\u7684\u53D6\u6570\u573A\u666F\uFF1B\u7EF4\u5EA6\u5EFA\u8BAE\u5148\u7528 get_metric_detail \u786E\u8BA4\u3002\u53EA\u8BFB\u5B89\u5168\uFF1A\u8BFB\u53D6\u6307\u6807\u5361\u9884\u89C8\u6570\u636E\uFF0C\u7EF4\u5EA6\u67E5\u8BE2\u53EA\u6539\u4E34\u65F6 session\uFF0C\u4E0D\u89E6\u53D1 save\u3001update\u3001delete\u3001publish \u7B49\u6301\u4E45\u5316\u64CD\u4F5C\u3002\u9700\u8981\u81EA\u7136\u8BED\u8A00\u95EE\u6570\u7528 chatbi_query\uFF0C\u9700\u8981\u5199 SQL \u7528 execute_sql_query\u3002",inputSchema:Zn,outputSchema:G},(u,c)=>t.run(({client:d,config:p})=>or(d,p,u),c,"query_metric_data")),a("search_metric_trees")&&o("search_metric_trees",{title:"Search Metric Trees",description:"\u6309\u5173\u952E\u8BCD\u641C\u7D22\u6307\u6807\u6811\u8D44\u6E90\uFF0C\u8FD4\u56DE metric_tree_id\u3002\u5F52\u56E0\u5206\u6790\u7684\u5165\u53E3\u5DE5\u5177\uFF1A\u62FF\u5230 metric_tree_id \u540E\u7528 get_metric_tree_detail \u770B\u7ED3\u6784\u3001query_metric_tree_attribution \u505A\u5F52\u56E0\u3002",inputSchema:er,outputSchema:G},(u,c)=>t.run(({client:d,config:p})=>ar(d,p,u),c,"search_metric_trees")),a("get_metric_tree_detail")&&o("get_metric_tree_detail",{title:"Get Metric Tree Detail",description:"\u6309 metric_tree_id \u83B7\u53D6\u6307\u6807\u6811\u8BE6\u60C5\u3001\u6839\u6307\u6807\u3001\u65F6\u95F4\u5BF9\u6BD4\u914D\u7F6E\u3001\u7EF4\u5EA6\u62C6\u89E3\u914D\u7F6E\u548C\u6307\u6807\u5173\u7CFB\u6811\u3002\u5EFA\u8BAE\u5728 query_metric_tree_attribution \u5F52\u56E0\u524D\u5148\u8C03\u7528\uFF0C\u786E\u8BA4\u53EF\u62C6\u89E3\u7EF4\u5EA6\u4E0E\u5BF9\u6BD4\u914D\u7F6E\u3002metric_tree_id \u6765\u81EA search_metric_trees\u3002",inputSchema:tr,outputSchema:G},(u,c)=>t.run(({client:d,config:p})=>ur(d,p,u),c,"get_metric_tree_detail")),a("query_metric_tree_attribution")&&o("query_metric_tree_attribution",{title:"Query Metric Tree Attribution",description:"\u6309\u5DF2\u77E5 metric_tree_id \u6267\u884C\u6307\u6807\u62C6\u89E3\u3001\u5355\u7EF4\u62C6\u89E3\u6216\u5168\u7EF4\u626B\u63CF\u5F52\u56E0\uFF0C\u9002\u5408\u5206\u6790\u67D0\u6307\u6807\u53D8\u5316\u7531\u54EA\u4E9B\u56E0\u7D20/\u7EF4\u5EA6\u8D21\u732E\u3002\u5EFA\u8BAE\u5148\u7528 get_metric_tree_detail \u786E\u8BA4\u53EF\u62C6\u89E3\u7EF4\u5EA6\u3002",inputSchema:nr,outputSchema:G},(u,c)=>t.run(({client:d,config:p})=>cr(d,p,u),c,"query_metric_tree_attribution")),a("execute_sql_query")&&o("execute_sql_query",{title:"Execute SQL Query",description:`\u57FA\u4E8E\u4E00\u4E2A\u6216\u591A\u4E2A\u6570\u636E\u96C6\u6267\u884C\u67E5\u8BE2 SQL\u3002SQL FROM \u540E\u5199\u6570\u636E\u96C6\u540D\u79F0/name\uFF1B\u4E2D\u6587\u6216\u7279\u6B8A\u5B57\u7B26\u540D\u79F0\u7528\u53CD\u5F15\u53F7\uFF0C\u4F8B\u5982 SELECT * FROM \`\u9500\u552E\u6570\u636E\u96C6\` LIMIT 20\u3002\u652F\u6301\u591A\u8868\u8054\u67E5\uFF0C\u4F46\u8981\u6C42\u53C2\u4E0E\u7684\u6570\u636E\u96C6\u8981\u4E48\u5747\u4E3A\u62BD\u53D6\u6570\u636E\u96C6\uFF0C\u8981\u4E48\u5747\u4E3A\u6765\u81EA\u540C\u4E00\u6570\u636E\u8D26\u6237\u548C\u6570\u636E\u5E93\u7684\u76F4\u8FDE\u6570\u636E\u96C6\u3002inputs \u4F20\u6570\u636E\u96C6 ID \u5217\u8868\uFF0C\u4EC5\u7528\u4E8E BI \u7ED1\u5B9A/\u6388\u6743\u3002\u8FD4\u56DE\u884C\u6570\u53D7 BI_MAX_ROWS \u63A7\u5236\uFF0C\u5F53\u524D\u914D\u7F6E\u4E3A ${n.BI_MAX_ROWS} \u884C\uFF0C\u9ED8\u8BA4\u503C\u4E3A 1000 \u884C\u3002`,inputSchema:Un},(u,c)=>t.run(({client:d,config:p})=>Nn(d,p,u),c,"execute_sql_query")),a("get_dataset_detail")&&o("get_dataset_detail",{title:"Get Dataset Detail",description:"\u6309\u6570\u636E\u96C6 ID \u83B7\u53D6\u57FA\u7840\u4FE1\u606F\u3001\u5B57\u6BB5\u7ED3\u6784\u548C\u76F8\u5173\u914D\u7F6E\u3002\u5EFA\u8BAE\u5728 execute_sql_query \u5199 SQL \u524D\u5148\u8C03\u7528\uFF0C\u786E\u8BA4\u6570\u636E\u96C6\u540D\u79F0\u4E0E\u53EF\u7528\u5B57\u6BB5\u3002\u6570\u636E\u96C6 ID \u6765\u81EA global_search\u3002",inputSchema:kn},(u,c)=>t.run(({client:d})=>Mn(d,u),c,"get_dataset_detail")),a("get_card_info")&&o("get_card_info",{title:"Get Card Info",description:"\u6309\u5361\u7247 ID \u83B7\u53D6\u57FA\u7840\u4FE1\u606F\u3001\u56FE\u8868\u7C7B\u578B\u3001\u6570\u636E\u6765\u6E90\u548C\u914D\u7F6E\u3002\u5EFA\u8BAE\u5728 query_card_data \u53D6\u6570\u524D\u5148\u8C03\u7528\uFF0C\u786E\u8BA4\u5B57\u6BB5\u4E0E\u6570\u636E\u6765\u6E90\u3002\u5361\u7247 ID \u6765\u81EA global_search \u6216 get_page_info\u3002",inputSchema:vn},(u,c)=>t.run(({client:d})=>Dn(d,u),c,"get_card_info")),a("query_card_data")&&o("query_card_data",{title:"Query Card Data",description:"\u6309\u5DF2\u77E5\u5361\u7247 ID \u5B89\u5168\u53EA\u8BFB\u67E5\u8BE2 BI \u5361\u7247\u9884\u89C8\u6570\u636E\uFF0C\u652F\u6301\u56FE\u8868\u5361\u52A8\u6001\u53C2\u6570\u8986\u76D6\uFF0C\u8FD4\u56DE\u7ED3\u6784\u5316 columns\u3001rows\u3001summary \u548C diagnostic\uFF0C\u9002\u5408\u8BFB\u53D6\u5DF2\u6709\u5361\u7247\u80CC\u540E\u7684\u6570\u636E\u3002\u5361\u7247 ID \u6765\u81EA global_search \u6216 get_page_info\uFF1B\u5EFA\u8BAE\u5148\u7528 get_card_info \u4E86\u89E3\u5B57\u6BB5\u3002",inputSchema:nn,outputSchema:rn},(u,c)=>t.run(({client:d})=>sn(d,u),c,"query_card_data")),a("get_page_info")&&o("get_page_info",{title:"Get Page Info",description:"\u6309\u9875\u9762/\u4EEA\u8868\u677F ID \u83B7\u53D6\u57FA\u7840\u4FE1\u606F\u3001\u5E03\u5C40\u3001\u5361\u7247\u5217\u8868\u548C\u76F8\u5173\u914D\u7F6E\uFF0C\u53EF\u4ECE\u4E2D\u62FF\u5230\u5361\u7247 ID \u518D\u4EA4\u7ED9 get_card_info/query_card_data\u3002\u9875\u9762 ID \u6765\u81EA global_search\u3002",inputSchema:xn},(u,c)=>t.run(({client:d})=>jn(d,u),c,"get_page_info")))}var Oo=To(import.meta.url),bt=Oo("../package.json"),_t=class{record(t){console.error(JSON.stringify({runtime:Mo(t)}))}};function Br(e,t={}){let n=t.mode??e.MCP_TRANSPORT??"stdio",r={appVersion:t.appVersion,clientFactory:t.clientFactory,callerContextResolver:t.callerContextResolver,guanBIClientFactory:t.guanBIClientFactory,capabilityResolver:t.capabilityResolver,transportFactory:t.transportFactory};return n==="streamable-http"?new It(e,r):new ht(e,r)}var Ao=`\u89C2\u8FDC BI\uFF08Guandata\uFF09MCP Server\uFF0C\u7528\u4E8E\u5728\u89C2\u8FDC BI \u5E73\u53F0\u4E0A\u505A\u6570\u636E\u53D1\u73B0\u3001\u770B\u8D44\u4EA7\u8BE6\u60C5\u3001\u5B89\u5168\u53EA\u8BFB\u53D6\u6570\u548C\u6307\u6807\u5206\u6790\u3002\u6240\u6709\u5DE5\u5177\u5747\u4E3A\u53EA\u8BFB\uFF0C\u4E0D\u4F1A\u4FEE\u6539\u3001\u4FDD\u5B58\u6216\u5220\u9664 BI \u8D44\u4EA7\u3002
11
11
 
12
12
  \u5DE5\u5177\u6309\u6240\u5C5E\u6A21\u5757\u5206\u4E3A\u4E09\u7EC4\uFF0C\u5176\u4E2D\u300C\u6307\u6807\u300D\u548C\u300CChatBI\u300D\u662F BI \u7684\u72EC\u7ACB\u589E\u8D2D\u6A21\u5757\uFF0C\u53EF\u80FD\u672A\u5F00\u901A\uFF1B\u300CBI \u9ED8\u8BA4\u529F\u80FD\u300D\u968F BI \u6807\u914D\u63D0\u4F9B\uFF1A
13
13
 
@@ -26,5 +26,5 @@ ${u}`:c}catch{return}}var rt=new Map([["k",1e3],["K",1e3],["M",1e6],["B",1e9],["
26
26
  - chatbi_query\uFF1AL1 \u540C\u6B65\u95EE\u6570\uFF0C\u81EA\u7136\u8BED\u8A00\u63D0\u95EE\u6700\u7701\u4E8B\uFF0C\u9002\u5408\u4E1A\u52A1\u95EE\u9898\u8868\u8FF0\u660E\u786E\u3001\u65E0\u9700\u7CBE\u786E\u63A7\u5236\u7EF4\u5EA6/SQL \u65F6\u3002
27
27
  - chatbi_insight_start + chatbi_insight_poll\uFF1AL2 \u6DF1\u5EA6\u6D1E\u5BDF\uFF0C\u8017\u65F6\u8F83\u957F\uFF0C\u5148\u53D1\u8D77\u518D\u8F6E\u8BE2\u3002
28
28
 
29
- \u901A\u7528\u5DE5\u4F5C\u6D41\uFF1A\u5148\u53D1\u73B0\u8D44\u4EA7 \u2192 \u518D\u770B\u8BE6\u60C5\u62FF\u53E3\u5F84\u4E0E\u5404\u7C7B id \u2192 \u6700\u540E\u6309\u573A\u666F\u53D6\u6570\u3002\u73AF\u5883\u80FD\u529B\uFF08\u542B\u5404\u589E\u8D2D\u6A21\u5757\u662F\u5426\u5F00\u901A\uFF09\u53EF\u5148\u7528 get_bi_capabilities \u67E5\u8BE2\uFF1B\u90E8\u5206\u5DE5\u5177\u4F1A\u968F BI \u7248\u672C\u4E0E\u6A21\u5757\u5F00\u901A\u72B6\u6001\u52A8\u6001\u542F\u7528\u3002`;async function br(e,t={}){let n=t.appVersion??ht.version,r=t.callerContextResolver??Ut(e),i=t.guanBIClientFactory??new Ie(e,{clientFactory:t.clientFactory,requestMetadata:{client:e.BI_PAT_CLIENT??"mcp",clientVersion:n}}),s=i.create(await r.resolve()),o=await(t.capabilityResolver??re)(s.client,s.config),a=new _o({name:"guanbi-mcp-server",version:n},{instructions:yo});return _r(a,new ye(r,i,new ce),s.config,o,{appVersion:n}),a}var ft=class{constructor(t,n){this.config=t;this.options=n}config;options;mode="stdio";health(){return{status:"ok",mode:this.mode,version:this.options.appVersion??ht.version,boundBISite:{configured:!!this.config.BI_BASE_URL,baseUrl:this.config.BI_BASE_URL,publicPath:this.config.BI_PUBLIC_PATH}}}async start(){await(await br(this.config,this.options)).connect(this.options.transportFactory?.()??new ho)}},gt=class{constructor(t,n){this.config=t;this.options=n}config;options;mode="streamable-http";httpServer;sessions=new Map;logger=new mt;health(){return{status:"ok",mode:this.mode,version:this.options.appVersion??ht.version,boundBISite:{configured:!!this.config.BI_BASE_URL,baseUrl:this.config.BI_BASE_URL,publicPath:this.config.BI_PUBLIC_PATH}}}async start(){this.httpServer=go((t,n)=>{this.handleRequest(t,n).catch(r=>{this.log("error","mcp_http_internal_error","Streamable HTTP request failed.",t,{statusCode:500,errorMessage:r instanceof Error?r.message:String(r)}),V(n,500,{error:"internal_error",message:r instanceof Error?r.message:String(r)})})}),await new Promise((t,n)=>{this.httpServer?.once("error",r=>{this.log("error","mcp_http_start_failed","Streamable HTTP server failed to start.",void 0,{host:this.config.MCP_HTTP_HOST??"127.0.0.1",port:this.config.MCP_HTTP_PORT??9090,errorMessage:r.message}),n(r)}),this.httpServer?.listen(this.config.MCP_HTTP_PORT??9090,this.config.MCP_HTTP_HOST??"127.0.0.1",()=>{this.httpServer?.removeAllListeners("error");let r=this.httpServer?.address(),i=typeof r=="object"&&r?r.port:this.config.MCP_HTTP_PORT??9090,s=this.config.MCP_HTTP_HOST??"127.0.0.1";this.log("info","mcp_http_started","Streamable HTTP server started.",void 0,{host:s,port:i,url:this.url(),boundBISite:Ro(this.config),entrypointTokenConfigured:!!this.config.MCP_ENTRYPOINT_TOKEN,trustedGateway:_t(this.config.MCP_TRUSTED_GATEWAY)}),t()})})}async stop(){await Promise.all([...this.sessions.values()].map(({server:t})=>t.close())),this.sessions.clear(),this.httpServer&&(await new Promise((t,n)=>{this.httpServer?.close(r=>r?n(r):t())}),this.httpServer=void 0,this.log("info","mcp_http_stopped","Streamable HTTP server stopped.",void 0,{sessionCount:this.sessions.size}))}url(){let t=this.httpServer?.address();if(!(!t||typeof t=="string"))return`http://${Eo(t,this.config.MCP_HTTP_HOST??"127.0.0.1")}:${t.port}`}async handleRequest(t,n){let r=hr(t);if(!r){V(n,400,{error:"bad_request"});return}if(So(r)&&t.method==="GET"){if(r==="/sysmon/health/readiness"){let a=this.readiness();V(n,a.ready?200:503,a);return}V(n,200,this.health());return}if(r!=="/mcp"){V(n,404,{error:"not_found"});return}if(!To(t.headers,this.config)){this.log("warn","mcp_entrypoint_unauthorized","Rejected MCP request with invalid entrypoint credential.",t,{statusCode:401,entrypointTokenConfigured:!!this.config.MCP_ENTRYPOINT_TOKEN,trustedGateway:_t(this.config.MCP_TRUSTED_GATEWAY)}),V(n,401,{error:"mcp_entrypoint_unauthorized"});return}let i=Ae(t.headers["mcp-session-id"]);if(i&&!this.sessions.has(i)){this.log("warn","mcp_session_not_found","Rejected MCP request for an unknown session.",t,{statusCode:404,...pt(i),sessionCount:this.sessions.size}),V(n,404,{error:"mcp_session_not_found"});return}let s=await this.resolveSession(t);await s.transport.handleRequest(t,n);let o=s.transport.sessionId;o&&t.method!=="DELETE"&&!this.sessions.has(o)&&(this.sessions.set(o,s),this.log("info","mcp_session_created","Created Streamable HTTP MCP session.",t,{...pt(o),sessionCount:this.sessions.size}))}async resolveSession(t){let n=Ae(t.headers["mcp-session-id"]);if(n){let o=this.sessions.get(n);if(o)return o}let r=new Io({sessionIdGenerator:fo,onsessionclosed:async o=>{let a=this.sessions.get(o);this.sessions.delete(o),await a?.server.close(),this.log("info","mcp_session_closed","Closed Streamable HTTP MCP session.",void 0,{...pt(o),sessionCount:this.sessions.size})}}),i=Bo(this.config,t.headers),s=await br(i,{...this.options,callerContextResolver:this.options.callerContextResolver??jt(i),capabilityResolver:this.options.capabilityResolver??(async()=>kt(i))});return await s.connect(r),{server:s,transport:r}}readiness(){let t=Co(this.config);return{...this.health(),status:t.length>0?"error":"ok",ready:t.length===0,errors:t.length>0?t:void 0}}log(t,n,r,i,s={}){let o=i?hr(i):void 0;this.logger.record({level:t,event:n,mode:this.mode,message:r,method:i?.method,path:o,...s})}};function To(e,t){if(_t(t.MCP_TRUSTED_GATEWAY)||ie(e))return!0;let n=t.MCP_ENTRYPOINT_TOKEN;return n?Ae(e.authorization)?.trim()===`Bearer ${n}`:!1}function Ae(e){return Array.isArray(e)?e[0]:e}function _t(e){return["1","true","yes","on"].includes(e?.trim().toLowerCase()??"")}function Co(e){let t=[];return e.BI_BASE_URL||t.push("BI_BASE_URL is required"),t}function Bo(e,t){let n=ie(t),r=Ae(t[X.client.toLowerCase()])?.trim();return{...e,BI_PAT:n,...n&&r?{BI_PAT_CLIENT:r}:{}}}function V(e,t,n){e.headersSent||(e.writeHead(t,{"Content-Type":"application/json"}),e.end(JSON.stringify(n)))}function Eo(e,t){return e.address==="::"||e.address==="0.0.0.0"?t==="0.0.0.0"||t==="::"?"127.0.0.1":t:e.address}function wo(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}function hr(e){try{return new URL(e.url??"/",`http://${e.headers.host??"localhost"}`).pathname}catch{return}}function So(e){return["/healthz","/sysmon/health/liveness","/sysmon/health/readiness"].includes(e)}function Ro(e){let t={configured:!!e.BI_BASE_URL,publicPath:e.BI_PUBLIC_PATH};if(!e.BI_BASE_URL)return t;try{t.origin=new URL(e.BI_BASE_URL).origin}catch{t.configured=!0}return t}function pt(e){return{hasSessionId:!0,sessionIdHash:mo("sha256").update(e).digest("hex").slice(0,12)}}var Ao=Oo(import.meta.url),{version:ko}=Ao("../package.json");async function Po(){if(process.argv.slice(2).some(t=>t==="--version"||t==="-v")){process.stdout.write(`${ko}
30
- `);return}let e=yt();await Ir(e).start()}Po().catch(e=>{console.error(e instanceof Error?e.message:e),process.exit(1)});
29
+ \u901A\u7528\u5DE5\u4F5C\u6D41\uFF1A\u5148\u53D1\u73B0\u8D44\u4EA7 \u2192 \u518D\u770B\u8BE6\u60C5\u62FF\u53E3\u5F84\u4E0E\u5404\u7C7B id \u2192 \u6700\u540E\u6309\u573A\u666F\u53D6\u6570\u3002\u73AF\u5883\u80FD\u529B\uFF08\u542B\u5404\u589E\u8D2D\u6A21\u5757\u662F\u5426\u5F00\u901A\uFF09\u53EF\u5148\u7528 get_bi_capabilities \u67E5\u8BE2\uFF1B\u90E8\u5206\u5DE5\u5177\u4F1A\u968F BI \u7248\u672C\u4E0E\u6A21\u5757\u5F00\u901A\u72B6\u6001\u52A8\u6001\u542F\u7528\u3002`;async function Er(e,t={}){let n=t.appVersion??bt.version,r=t.callerContextResolver??Lt(e),i=t.guanBIClientFactory??new ye(e,{clientFactory:t.clientFactory,requestMetadata:{client:e.BI_PAT_CLIENT??"mcp",clientVersion:n}}),s=i.create(await r.resolve()),o=await(t.capabilityResolver??ie)(s.client,s.config),a=new wo({name:"guanbi-mcp-server",version:n},{instructions:Ao});return Tr(a,new Te(r,i,new ce),s.config,o,{appVersion:n}),a}var ht=class{constructor(t,n){this.config=t;this.options=n}config;options;mode="stdio";health(){return{status:"ok",mode:this.mode,version:this.options.appVersion??bt.version,boundBISite:{configured:!!this.config.BI_BASE_URL,baseUrl:this.config.BI_BASE_URL,publicPath:this.config.BI_PUBLIC_PATH}}}async start(){await(await Er(this.config,this.options)).connect(this.options.transportFactory?.()??new So)}},It=class{constructor(t,n){this.config=t;this.options=n}config;options;mode="streamable-http";httpServer;sessions=new Map;logger=new _t;health(){return{status:"ok",mode:this.mode,version:this.options.appVersion??bt.version,boundBISite:{configured:!!this.config.BI_BASE_URL,baseUrl:this.config.BI_BASE_URL,publicPath:this.config.BI_PUBLIC_PATH}}}async start(){this.httpServer=Eo((t,n)=>{this.handleRequest(t,n).catch(r=>{this.log("error","mcp_http_internal_error","Streamable HTTP request failed.",t,{statusCode:500,errorMessage:r instanceof Error?r.message:String(r)}),F(n,500,{error:"internal_error",message:r instanceof Error?r.message:String(r)})})}),await new Promise((t,n)=>{this.httpServer?.once("error",r=>{this.log("error","mcp_http_start_failed","Streamable HTTP server failed to start.",void 0,{host:this.config.MCP_HTTP_HOST??"127.0.0.1",port:this.config.MCP_HTTP_PORT??9090,errorMessage:r.message}),n(r)}),this.httpServer?.listen(this.config.MCP_HTTP_PORT??9090,this.config.MCP_HTTP_HOST??"127.0.0.1",()=>{this.httpServer?.removeAllListeners("error");let r=this.httpServer?.address(),i=typeof r=="object"&&r?r.port:this.config.MCP_HTTP_PORT??9090,s=this.config.MCP_HTTP_HOST??"127.0.0.1";this.log("info","mcp_http_started","Streamable HTTP server started.",void 0,{host:s,port:i,url:this.url(),boundBISite:jo(this.config),entrypointTokenConfigured:!!this.config.MCP_ENTRYPOINT_TOKEN,trustedGateway:yt(this.config.MCP_TRUSTED_GATEWAY)}),t()})})}async stop(){await Promise.all([...this.sessions.values()].map(({server:t})=>t.close())),this.sessions.clear(),this.httpServer&&(await new Promise((t,n)=>{this.httpServer?.close(r=>r?n(r):t())}),this.httpServer=void 0,this.log("info","mcp_http_stopped","Streamable HTTP server stopped.",void 0,{sessionCount:this.sessions.size}))}url(){let t=this.httpServer?.address();if(!(!t||typeof t=="string"))return`http://${xo(t,this.config.MCP_HTTP_HOST??"127.0.0.1")}:${t.port}`}async handleRequest(t,n){let r=Cr(t);if(!r){F(n,400,{error:"bad_request"});return}if(Do(r)&&t.method==="GET"){if(r==="/sysmon/health/readiness"){let a=this.readiness();F(n,a.ready?200:503,a);return}F(n,200,this.health());return}if(r!=="/mcp"){F(n,404,{error:"not_found"});return}if(!Po(t.headers,this.config)){this.log("warn","mcp_entrypoint_unauthorized","Rejected MCP request with invalid entrypoint credential.",t,{statusCode:401,entrypointTokenConfigured:!!this.config.MCP_ENTRYPOINT_TOKEN,trustedGateway:yt(this.config.MCP_TRUSTED_GATEWAY)}),F(n,401,{error:"mcp_entrypoint_unauthorized"});return}let i=ke(t.headers["mcp-session-id"]);if(i&&!this.sessions.has(i)){this.log("warn","mcp_session_not_found","Rejected MCP request for an unknown session.",t,{statusCode:404,...gt(i),sessionCount:this.sessions.size}),F(n,404,{error:"mcp_session_not_found"});return}let s=await this.resolveSession(t);await s.transport.handleRequest(t,n);let o=s.transport.sessionId;o&&t.method!=="DELETE"&&!this.sessions.has(o)&&(this.sessions.set(o,s),this.log("info","mcp_session_created","Created Streamable HTTP MCP session.",t,{...gt(o),sessionCount:this.sessions.size}))}async resolveSession(t){let n=ke(t.headers["mcp-session-id"]);if(n){let o=this.sessions.get(n);if(o)return o}let r=new Ro({sessionIdGenerator:Bo,onsessionclosed:async o=>{let a=this.sessions.get(o);this.sessions.delete(o),await a?.server.close(),this.log("info","mcp_session_closed","Closed Streamable HTTP MCP session.",void 0,{...gt(o),sessionCount:this.sessions.size})}}),i=vo(this.config,t.headers),s=await Er(i,{...this.options,callerContextResolver:this.options.callerContextResolver??qt(i),capabilityResolver:this.options.capabilityResolver??(async()=>xt(i))});return await s.connect(r),{server:s,transport:r}}readiness(){let t=ko(this.config);return{...this.health(),status:t.length>0?"error":"ok",ready:t.length===0,errors:t.length>0?t:void 0}}log(t,n,r,i,s={}){let o=i?Cr(i):void 0;this.logger.record({level:t,event:n,mode:this.mode,message:r,method:i?.method,path:o,...s})}};function Po(e,t){if(yt(t.MCP_TRUSTED_GATEWAY)||se(e))return!0;let n=t.MCP_ENTRYPOINT_TOKEN;return n?ke(e.authorization)?.trim()===`Bearer ${n}`:!1}function ke(e){return Array.isArray(e)?e[0]:e}function yt(e){return["1","true","yes","on"].includes(e?.trim().toLowerCase()??"")}function ko(e){let t=[];return e.BI_BASE_URL||t.push("BI_BASE_URL is required"),t}function vo(e,t){let n=se(t),r=ke(t[X.client.toLowerCase()])?.trim();return{...e,BI_PAT:n,...n&&r?{BI_PAT_CLIENT:r}:{}}}function F(e,t,n){e.headersSent||(e.writeHead(t,{"Content-Type":"application/json"}),e.end(JSON.stringify(n)))}function xo(e,t){return e.address==="::"||e.address==="0.0.0.0"?t==="0.0.0.0"||t==="::"?"127.0.0.1":t:e.address}function Mo(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}function Cr(e){try{return new URL(e.url??"/",`http://${e.headers.host??"localhost"}`).pathname}catch{return}}function Do(e){return["/healthz","/sysmon/health/liveness","/sysmon/health/readiness"].includes(e)}function jo(e){let t={configured:!!e.BI_BASE_URL,publicPath:e.BI_PUBLIC_PATH};if(!e.BI_BASE_URL)return t;try{t.origin=new URL(e.BI_BASE_URL).origin}catch{t.configured=!0}return t}function gt(e){return{hasSessionId:!0,sessionIdHash:Co("sha256").update(e).digest("hex").slice(0,12)}}var No=Uo(import.meta.url),{version:Lo}=No("../package.json");async function qo(){if(process.argv.slice(2).some(t=>t==="--version"||t==="-v")){process.stdout.write(`${Lo}
30
+ `);return}let e=Bt();await Br(e).start()}qo().catch(e=>{console.error(e instanceof Error?e.message:e),process.exit(1)});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@guandata/guanbi-mcp-server",
3
- "version": "0.1.23",
3
+ "version": "0.1.24",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "MCP server for exposing GuanBI capabilities to AI agents.",