@guandata/guanbi-mcp-server 0.1.31 → 0.1.33

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 (3) hide show
  1. package/README.md +1 -1
  2. package/dist/index.js +10 -10
  3. package/package.json +4 -3
package/README.md CHANGED
@@ -130,7 +130,7 @@ BI_USER_PROPERTY_KEY=email
130
130
  - `execute_sql_query`:在支持的环境中执行单条只读 SQL 查询;建议先用 `get_dataset_detail` 确认数据集名称和字段名。`inputs` 只传对应数据集 ID,SQL 通常先用数据集名称作为表引用;若返回表名错误,按 `diagnostic.tableBindings` 提供的执行链路引用修正。支持无表查询和兼容的多数据集查询。
131
131
  - `get_dataset_detail`:获取数据集详情。
132
132
  - `get_card_info`:获取卡片元信息。
133
- - `query_card_data`:只读查询图表卡、筛选器、树筛选器和文本卡片数据,支持使用卡片关联数据集的任意字段构造结构化 filters,以及 columns 投影和 raw 诊断;图表卡按需自动分页,显式 limit 不设一万行硬上限。
133
+ - `query_card_data`:只读查询图表卡、筛选器、树筛选器和文本卡片的一页数据;单次最多 1000 行并受响应字节预算保护,通过 `page.next_offset` 续页。
134
134
  - `get_page_info`:获取页面或仪表板元信息。
135
135
  - `search_metrics`、`list_metric_catalog`、`get_metric_detail`、`query_metric_data`:发现并查询指标平台指标。
136
136
  - `search_metric_trees`、`get_metric_tree_detail`、`query_metric_tree_attribution`:发现指标树并执行归因分析。
package/dist/index.js CHANGED
@@ -1,20 +1,20 @@
1
1
  #!/usr/bin/env node
2
- import"dotenv/config";import{createRequire as Fo}from"module";import{z as E}from"zod";var kr="http://guandata-web:8088",Pr=E.object({BI_BASE_URL:E.string().url().optional().default(kr),BI_PUBLIC_PATH:E.string().optional().default(""),BI_PAT:E.string().optional(),BI_UID_TOKEN:E.string().optional(),BI_LOGIN_DOMAIN:E.string().optional().default("guanbi"),BI_LOGIN_ID:E.string().optional(),BI_LOGIN_PASSWORD:E.string().optional(),BI_APP_TOKEN:E.string().optional(),BI_LOGIN_ID_HEADER:E.string().optional(),BI_USER_PROPERTY_HEADER:E.string().optional(),BI_USER_PROPERTY_KEY:E.string().optional(),BI_IDENTITY_DEBUG:E.string().optional(),BI_IDENTITY_TOKEN_CACHE_TTL_MS:E.coerce.number().int().positive().default(6e5),BI_REQUEST_TIMEOUT_MS:E.coerce.number().int().positive().default(12e4),BI_MAX_ROWS:E.coerce.number().int().positive().default(1e3),BI_DATA_VERSION:E.string().optional(),GUANBI_MCP_USAGE_STATS:E.string().optional(),MCP_TRANSPORT:E.enum(["stdio","streamable-http"]).optional().default("stdio"),MCP_HTTP_HOST:E.string().optional().default("127.0.0.1"),MCP_HTTP_PORT:E.coerce.number().int().nonnegative().optional().default(9090),MCP_ENTRYPOINT_TOKEN:E.string().optional(),MCP_TRUSTED_GATEWAY:E.string().optional()});function wt(e=process.env){let t=Pr.parse(e),n=t.MCP_TRANSPORT==="streamable-http";return{...t,BI_BASE_URL:t.BI_BASE_URL?.replace(/\/+$/,""),BI_PUBLIC_PATH:vr(t.BI_PUBLIC_PATH),BI_PAT:n?void 0:t.BI_PAT?.trim()||void 0,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 vr(e){let t=e?.trim().replace(/^\/+|\/+$/g,"")??"";return t?`/${t}`:""}function Bt(e){return e?.trim().toLowerCase()||void 0}import{createRequire as Ao}from"module";import{createHash as ko,randomUUID as Po}from"crypto";import{createServer as vo}from"http";import{McpServer as xo}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as Mo}from"@modelcontextprotocol/sdk/server/stdio.js";import{StreamableHTTPServerTransport as Do}from"@modelcontextprotocol/sdk/server/streamableHttp.js";var le=class{record(t){console.error(JSON.stringify({audit:Mr({...t})}))}},pe=class{record(){}};function De(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"?xr(i):void 0}}function xr(e){return e instanceof Error?e.name||"Error":typeof e}function Mr(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}async function me(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(Dr(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} ${Gr(n)}`);let r=jr(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 Dr(e,t){return`${e.BI_BASE_URL}${e.BI_PUBLIC_PATH}${t}`}function jr(e,t){let n=Ur(e.headers);if(n)return n;let r=Nr(t);return r||Lr(e.headers)}function Ur(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 Nr(e){try{let t=JSON.parse(e);return St(t)??St(Hr(t.response))}catch{return}}function Lr(e){return[...e.getSetCookie?.()??[],...qr(e.get("set-cookie"))].map(n=>n.trim().match(/(?:^|;\s*)uIdToken=([^;]+)/)?.[1]).find(Boolean)}function qr(e){return e?e.split(/,(?=\s*[^;,]+=)/):[]}function St(e){if(e)for(let t of["uIdToken","authToken","token"]){let n=e[t];if(typeof n=="string"&&n)return n}}function Hr(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function Gr(e,t=500){return e.length>t?`${e.slice(0,t)}...`:e}var Jr="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?$r(`${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=Rt(t,"probe");return{available:!1,lastError:n,failureType:si(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:ni})).themes}async query(t){let n=await this.resolveThemeId(t.themeId,t.themeName,!1),r={attachments:[],theme_id:n,message:t.message,config:Ot({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{ai(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:At(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,At(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 di(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=Ot({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(Zr(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 oi(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=Rt(o,n.operation),!Kr(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(!Wr(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:Vr(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=Fr(u,a,s);if(!a.ok||zr(c))throw Qr(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 me(this.config);return this.token=t.token,t.token}refreshTokenFromResponse(t,n){let r=ri(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 $r(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 fe(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 Vr(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"]=Jr),n}function Fr(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:vt(e)},{retryableForBaseUrl:!0})}}function zr(e){let t=kt(e);return typeof t=="number"&&![0,200].includes(t)||e.result==="fail"||e.success===!1}function Qr(e,t,n,r){let i=kt(e),s=ei(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:vt(t)},u=ti(o),c=!u&&Yr(n.status,i);return new O(o,a,{authExpired:c,retryableForBaseUrl:u||Xr(n.status,i)})}function Kr(e,t){return!!(t&&e instanceof O&&e.retryableForBaseUrl)}function Wr(e){return e instanceof O&&e.authExpired}function Yr(e,t){return e===401||e===403||t===401||t===403||t===5001}function Xr(e,t){return[401,403,404,405].includes(e)||typeof t=="number"&&[401,403,404,405].includes(t)}function Zr(e){return e instanceof O&&e.detail.http_status===200&&e.detail.chatbi_code===404&&e.detail.chatbi_message==="Message not found."}function kt(e){if(typeof e.code=="number")return e.code;let t=ge(e.error);return typeof t?.status=="number"?t.status:void 0}function ei(e){if(typeof e.message=="string"&&e.message.trim())return e.message;let t=ge(e.error);return typeof t?.message=="string"&&t.message.trim()?t.message:void 0}function ti(e){return/No static resource/i.test(e)}function ge(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function ni(e,t){let n=ge(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 ri(e,t){let r=[...e.headers.getSetCookie?.()??[],...ii(e.headers.get("set-cookie"))].map(s=>je(s.trim().match(/(?:^|;\s*)uIdToken=([^;]+)/)?.[1])).find(Boolean);if(r)return r;let i=je(e.headers.get("x-auth-token"));return i||Pt(t)}function ii(e){return e?e.split(/,(?=\s*[^;,]+=)/):[]}function je(e){if(typeof e!="string")return;let t=e.trim();return t&&!/\s/.test(t)?t:void 0}function Pt(e){let t=ge(e);if(t){for(let n of["uIdToken","authToken"]){let r=je(t[n]);if(r)return r}for(let n of["data","response"]){let r=Pt(t[n]);if(r)return r}}}function Rt(e,t){return e instanceof O?e.detail:{operation:t,detail:e instanceof Error?e.message:String(e)}}function vt(e,t=1e3){return e.length>t?`${e.slice(0,t)}...`:e}function si(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 oi(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 Ot(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>typeof t<"u"))}function ai(e){if([e.final_status,e.answer_status,e.query_status].some(ci))throw new Error(`ChatBI query failed: ${ui(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 ui(...e){return e.find(t=>typeof t=="string"&&t.trim())?.trim()}function ci(e){return typeof e=="string"&&e.trim().toLowerCase()==="failure"}function At(e){let t=e-Date.now();if(t<=0)throw new Error("Insight request timed out");return t}async function di(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",Ne=["search_metrics","list_metric_catalog","get_metric_detail","query_metric_data","search_metric_trees","get_metric_tree_detail","query_metric_tree_attribution"],li=["get_bi_capabilities","global_search",...Ne,"execute_sql_query","get_dataset_detail","get_card_info","query_card_data","get_page_info"],pi=6e4,mi="PAT \u6A21\u5F0F\u4EC5\u652F\u6301\u666E\u901A BI \u63A5\u53E3\uFF0C\u4E0D\u652F\u6301 ChatBI public-api\u3002",Ue=new WeakMap;async function ie(e,t){let n=Ue.get(e);return(!n||n.expiresAt<=Date.now())&&Ue.set(e,{expiresAt:Date.now()+pi,promise:gi(e,t).catch(r=>fi(r,t))}),Ue.get(e).promise}function Dt(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:qe(e,t?["get_bi_capabilities"]:Le(e)),caller:{ok:!1,error:r,features:{executeSqlQuery:{enabled:!1,minVersion:re,reason:r}},chatbi:z(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?[]:Ne,readOnly:!0,lastError:t?"\u914D\u7F6E\u4E0D\u5B8C\u6574\uFF1A\u7F3A\u5C11 BI_BASE_URL\u3002":void 0},chatbi:z(e,"HTTP \u6A21\u5F0F\u542F\u52A8\u671F\u4E0D\u4F7F\u7528\u67D0\u4E2A\u7528\u6237 token \u63A2\u6D4B ChatBI \u80FD\u529B\u3002")}}async function jt(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 fi(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:z(t,n),service:qe(t,Le(t)),caller:{ok:!1,error:n,features:{executeSqlQuery:{enabled:!1,minVersion:re,reason:`\u65E0\u6CD5\u786E\u8BA4 BI \u80FD\u529B\uFF1A${n}`}},chatbi:z(t,n)}}}async function gi(e,t){let n=hi(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 Ii(e),s=yi(i.capabilityVersion,re),o=await _i(t);return{ok:!0,appVersion:i.appVersion,dataVersion:i.dataVersion,versionSource:r,service:qe(t,Le(t)),caller:{ok:!0,features:{executeSqlQuery:s},chatbi:o},features:{executeSqlQuery:s},metricPlatform:{registeredTools:Ne,readOnly:!0},chatbi:o}}function Le(e){let t=new Set(li);if(!e.BI_PAT&&(fe(e)||e.MCP_TRANSPORT==="streamable-http"))for(let n of new v(e).getRegisteredTools())t.add(n);return[...t]}function qe(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 _i(e){if(e.BI_PAT)return z(e,mi);let t=new v(e);return fe(e)?t.probe():z(e,"\u7F3A\u5C11 BI_BASE_URL \u6216\u9274\u6743\u914D\u7F6E\u3002")}function z(e,t){return{available:!1,registeredTools:e.BI_PAT||!fe(e)?[]:new v(e).getRegisteredTools(),failureType:"unknown",triedBaseUrls:[],lastError:{operation:"probe",chatbi_message:t,detail:t}}}function hi(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 Ii(e){let t=await e.get("/api/server-version"),n=Mt(t.version),r=Mt(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 yi(e,t){let n=xt(e),r=xt(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=bi(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 xt(e){let t=e.match(/(\d+)\.(\d+)\.(\d+)/);if(t)return[Number(t[1]),Number(t[2]),Number(t[3])]}function bi(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 Mt(e){return typeof e=="string"&&e.trim()?e.trim():void 0}var _e=class{constructor(t){this.config=t}config;cache=new Map;async exchange(t){let n=Ut(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=Ti(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=Nt(a);if(!o.ok||Lt(u))throw this.debugError(`BI user property lookup failed: HTTP ${o.status} ${He(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 Ut(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=Nt(s),a=o?.response?.token?.trim();if(!i.ok||Lt(o)||!a)throw this.debugError(`BI loginId token exchange failed: HTTP ${i.status} ${He(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=Ci(t);return r?Math.min(n,r):n}debugError(t,n,r=[]){if(!Bi(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 Ut(e){let t=e.trim();if(!t)throw new Error("GuanBI loginId is required for loginId identity exchange.");return t}function Ti(e){let t=e.trim();if(!t)throw new Error("BI user property value is required for user property identity exchange.");return t}function Nt(e){if(e.trim())try{return JSON.parse(e)}catch{return}}function Lt(e){return!e||e.result&&!["ok","success"].includes(e.result.toLowerCase())?!0:e.success===!1}function Ci(e){if(!e)return;let t=e.replace(" ","T"),n=Date.parse(t);return Number.isFinite(n)?n:void 0}function He(e,t){let n=t.filter(r=>!!r).reduce((r,i)=>r.split(i).join("[redacted]"),e);return wi(n)}function Ge(e,t){let n=t.filter(r=>!!r);return typeof e=="string"?He(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,Ei(r)?"[redacted]":Ge(i,n)]))}function Ei(e){return["token","authorization","cookie","uidtoken","uIdToken".toLowerCase()].includes(e.toLowerCase())}function Bi(e){return["1","true","yes","on"].includes(e.BI_IDENTITY_DEBUG?.trim().toLowerCase()??"")}function wi(e,t=1e3){return e.length>t?`${e.slice(0,t)}\u2026`:e}var W="x-personal-token";function Si(e){return{transport:"stdio",...e.BI_PAT?{biPatToken:e.BI_PAT}:{},biUidToken:e.BI_UID_TOKEN,audit:{}}}function Ht(e){return{resolve:()=>Si(e)}}function he(e){let t=se(e);if(t)return{transport:"streamable-http",biPatToken:t,audit:Q(e)};let n=N(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:Q(e)}}function Gt(e,t={}){let n=e?new _e(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:Q(o)};if(e?.BI_PAT)return{transport:"streamable-http",biPatToken:e.BI_PAT,audit:Q(o)};if(N(o,"x-guanbi-uid-token")?.trim()||!e)return he(o);let c=e.BI_LOGIN_ID_HEADER,d=c?K(N(o,c)):void 0;if(d){let y=await r?.(d);return y?{transport:"streamable-http",biUidToken:y.token,biUidTokenRefresh:y.refresh,loginId:d,audit:Q(o)}:he(o)}let p=e.BI_USER_PROPERTY_HEADER,g=p?K(N(o,p)):void 0;if(g){let y=await i?.(g);return y?{transport:"streamable-http",biUidToken:y.token,biUidTokenRefresh:y.refresh,audit:Q(o)}:he(o)}throw Ri(o,e)}}}function se(e){return K(N(e,W))}function N(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 K(e){return e?.trim()||void 0}function Q(e){return{tenantId:K(N(e,"x-tenant-id")),endUserId:K(N(e,"x-end-user-id")),traceId:K(N(e,"x-trace-id"))}}function Ri(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(!vi(t))return new Error(n);let r={operation:"resolveHttpCallerContext",expectedIdentityHeaders:Oi(e,t),receivedHeaderNames:Ai(e),receivedIdentityLikeHeaders:qt(Object.fromEntries(Je(e).filter(([i])=>Pi(i.toLowerCase()))),[W,"x-guanbi-uid-token",t.BI_LOGIN_ID_HEADER,t.BI_USER_PROPERTY_HEADER]),receivedHeaders:qt(e,[W,"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 Oi(e,t){return[{source:"pat",name:W,present:Ie(e,W)},{source:"uidToken",name:"x-guanbi-uid-token",present:Ie(e,"x-guanbi-uid-token")},...t.BI_LOGIN_ID_HEADER?[{source:"loginId",name:t.BI_LOGIN_ID_HEADER,present:Ie(e,t.BI_LOGIN_ID_HEADER)}]:[],...t.BI_USER_PROPERTY_HEADER?[{source:"userProperty",name:t.BI_USER_PROPERTY_HEADER,present:Ie(e,t.BI_USER_PROPERTY_HEADER),userPropertyKey:t.BI_USER_PROPERTY_KEY}]:[]]}function Ie(e,t){return N(e,t)!==void 0}function Ai(e){return[...new Set(Je(e).map(([t])=>t.toLowerCase()))].sort()}function qt(e,t){let n=new Set(t.filter(r=>!!r).map(r=>r.toLowerCase()));return Object.fromEntries(Je(e).map(([r,i])=>{let s=r.toLowerCase();return ki(s)?[s,"<redacted>"]:[s,n.has(s)?i:"<present>"]}))}function Je(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 ki(e){return["authorization","cookie","set-cookie","x-guanbi-uid-token",W].includes(e)}function Pi(e){return e.startsWith("x-")||e.includes("auth")||e.includes("login")||e.includes("token")||e.includes("uid")||e.includes("user")}function vi(e){return["1","true","yes","on"].includes(e.BI_IDENTITY_DEBUG?.trim().toLowerCase()??"")}import{AsyncLocalStorage as xi}from"async_hooks";var Y={client:"X-Guandata-Client",clientVersion:"X-Guandata-Client-Version",command:"X-Guandata-Command"},Mi=new Set(Object.values(Y).map(e=>e.toLowerCase())),Jt=new xi;function $t(e,t){return Jt.run(e,t)}function Di(e,t="mcp"){e=Jt.getStore()??e;let n={};n[Y.client]=e?.client.trim()||t.trim()||"mcp";let r=e?.clientVersion?.trim();r&&(n[Y.clientVersion]=r);let i=e?.command?.trim();return i&&(n[Y.command]=i),n}function Vt(e,t,n="mcp"){let r=Di(t,n);return{...$e(e),...r}}function $e(e){return Object.fromEntries(Object.entries(e).filter(([t])=>!Mi.has(t.toLowerCase())))}var be=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} ${ye(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} ${ye(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} ${ye(c)}`);return Ft(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} ${ye(a)}`);return this.refreshTokenFromResponse(o),Ft(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 me(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=Ui(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{...$e(n),Cookie:`uIdToken=${t}`}}patHeaders(t,n){return Vt({...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 Ft(e){if(!e)return;let t=JSON.parse(e);if(!ji(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 ji(e){return!e||typeof e!="object"||Array.isArray(e)?!1:"response"in e||"result"in e||"success"in e}function Ui(e){return Ni(e.headers)??qi(e.headers)}function Ni(e){return[...e.getSetCookie?.()??[],...Li(e.get("set-cookie"))].map(n=>zt(n.trim().match(/(?:^|;\s*)uIdToken=([^;]+)/)?.[1])).find(Boolean)}function Li(e){return e?e.split(/,(?=\s*[^;,]+=)/):[]}function qi(e){return zt(e.get("x-auth-token"))}function zt(e){if(typeof e!="string")return;let t=e.trim();return t&&!/\s/.test(t)?t:void 0}function ye(e,t=1e3){return e.length>t?`${e.slice(0,t)}...`:e}var Te=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 be(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 Qt={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},Ce=class{serviceDomain;appVersion;enabled;sender;now;constructor({config:t,appVersion:n,sender:r=Ji(),now:i=Date.now}){this.serviceDomain=Vi(t.BI_BASE_URL),this.appVersion=n,this.enabled=$i(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:Fi(this.now()-t.startedAtMs),error_type:n.success?"none":Qi(n.error)};try{Promise.resolve(this.sender(r)).catch(()=>{})}catch{}}};function Hi(e=Qt){return t=>Gi(t,e)}async function Gi(e,t=Qt){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 zi(i,t.maxResponseBytes)}catch{}}function Ji(){return Ki(process.env)?()=>{}:Hi()}function $i(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 Kt(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 Vi(e){if(e)try{return new URL(e).hostname}catch{return}}function Fi(e){return e<1e3?"<1s":e<5e3?"1-5s":e<3e4?"5-30s":e<12e4?"30-120s":">120s"}async function zi(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 Qi(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 Ki(e){return e.NODE_ENV==="test"||e.VITEST==="true"}var Ee=class{constructor(t,n,r=new pe){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 $t(o.config.BI_REQUEST_METADATA,()=>t(o));if(r){let u=Wi(a)?"error":"success";this.auditLogger.record(De(r,s,i,u,a))}return a}catch(a){throw r&&this.auditLogger.record(De(r,s,i,"error",a)),a}}};function Wi(e){return!!(e&&typeof e=="object"&&e.isError===!0)}function D(e){return{content:[{type:"text",text:JSON.stringify(e,null,2)}]}}function B(e){let t=Fe(e);return{content:[{type:"text",text:JSON.stringify(t,null,2)}],structuredContent:t}}function L(e){let t=Fe(e);return{content:[{type:"text",text:JSON.stringify(t,null,2)}],isError:!0}}function oe(e,t,n={}){return L({status:"error",diagnostic:Ve(e,t,n)})}function Ve(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 Fe({operation:e,path:i?.groups?.path,status:i?.groups?.status?Number(i.groups.status):void 0,message:r,...n})}function Fe(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}var Wt={};async function Yt(e,t){return D(await ie(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},j=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=I({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",Qe("/api/metric-platform/metrics/full-tree",{projectId:t.projectId,nameLike:t.keyword}))}listMetricDirectoryTree(t){return this.get("listMetricDirectoryTree",Qe("/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",I(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",Qe("/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 ze(t,n,s)}}async get(t,n,r){try{return await this.client.get(n,r?{headers:r}:void 0)}catch(i){throw ze(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 ze(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"]=X(this.config.BI_LOGIN_DOMAIN)),this.config.BI_LOGIN_ID&&(t["user-id"]=X(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=Xt(n.domId,n.domainId,n.domain,n.dom_id),i=Xt(n.email,n.loginId,n.userId,n.uId,n.uid);!t["x-dom-id"]&&r&&(t["x-dom-id"]=X(r)),!t["user-id"]&&i&&(t["user-id"]=X(i))}catch{}return t["x-dom-id"]||(t["x-dom-id"]=X(this.config.BI_LOGIN_DOMAIN||"guanbi")),t["user-id"]||(t["user-id"]=X(this.config.BI_LOGIN_ID||"unknown")),t}};function ze(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 Qe(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 I(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}function X(e){return Buffer.from(e,"utf8").toString("base64")}function Xt(...e){for(let t of e)if(typeof t=="string"&&t.trim())return t.trim()}var Yi=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"]),Zt=new Set(["BT","CLOSE_BT_OPEN","OPEN_BT_CLOSE","OPEN_BT_OPEN"]),We=new Set(["IS_NULL","NOT_NULL"]),Xi=T.object({field:T.string().min(1).describe("\u5361\u7247\u5173\u8054\u6570\u636E\u96C6\u4E2D\u7684\u7B5B\u9009\u5B57\u6BB5\u540D\u79F0\u3001\u522B\u540D\u6216\u5B57\u6BB5 ID\u3002"),operator:Yi.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;We.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`}),Zt.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`}),!Zt.has(e.operator)&&!We.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`})}),Zi=T.object({parameter:T.string().min(1).describe("\u52A8\u6001\u53C2\u6570\u540D\u79F0\u6216 dpId\u3002"),value:T.union([T.string(),T.number(),T.boolean()]).describe("\u52A8\u6001\u53C2\u6570\u8986\u76D6\u503C\uFF0C\u4F1A\u6309 BI dynamicParams.defaultValue \u4EE5\u5B57\u7B26\u4E32\u53D1\u9001\u3002")}),sn={cd_id:T.string().min(1).describe("\u5361\u7247 ID\u3002"),filters:T.array(Xi).optional().describe("\u7ED3\u6784\u5316\u7B5B\u9009\u6761\u4EF6\u3002\u4E0D\u652F\u6301 CLI \u98CE\u683C\u7B5B\u9009\u5B57\u7B26\u4E32\u3002"),dynamic_params:T.array(Zi).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: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().optional().default(100).describe("\u6700\u591A\u8FD4\u56DE\u884C\u6570\uFF0C\u9ED8\u8BA4 100\uFF1B\u6570\u636E\u91CF\u8F83\u5927\u65F6\u4F1A\u81EA\u52A8\u5206\u9875\u8BFB\u53D6\u3002"),raw:T.boolean().optional().describe("\u662F\u5426\u8FD4\u56DE\u539F\u59CB\u54CD\u5E94\u3002")},on={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 an(e,t){try{let n=t.limit??100,r=await e.get(`/api/card/${encodeURIComponent(t.cd_id)}`),i=ts(r);if(i==="TEXT")return t.dynamic_params?.length?Be("query_card_data",en(i)):es(t.cd_id,r,t.columns,t.raw);if(t.dynamic_params?.length&&i!=="CHART")return Be("query_card_data",en(i));let s=t.filters??[],o=await Is(e,r,s),a=ls(s,o,i);if("unsupported"in a)return Be("query_card_data",a.unsupported);let u=await ps(e,t.dynamic_params??[]);if("unsupported"in u)return Be("query_card_data",u.unsupported);let c=i==="CHART"?await rs(e,t.cd_id,n,a.filters,u.dynamicParams):await ns(e,un(t.cd_id,i,n,a.filters,u.dynamicParams)),{endpoint:d,requestBody:p}=c.requests[0],g=c.data,y=i==="CHART"?ss(b(g.chartMain)):cs(g),h=fn(y.slice(0,n),t.columns);return B({summary:I({cd_id:t.cd_id,card_type:i,chart_type:i==="CHART"?C(b(r.content).chartType):void 0,row_count:h.length,truncated:Es(i,g,h.length)}),columns:gn(h),rows:h,diagnostic:{mode:is(i),card_type:i,endpoint:d,request_body:p,request_count:c.requests.length,request_bodies:c.requests.length>1?c.requests.map(S=>S.requestBody):void 0,raw_returned:t.raw===!0},raw:t.raw?c.raw:void 0})}catch(n){return L({status:"error",diagnostic:Ve("query_card_data",n)})}}function es(e,t,n,r){let i=b(t.content),s=ds(i),o=fn(s?[{content:s}]:[],n);return B({summary:{cd_id:e,card_type:"TEXT",row_count:o.length,truncated:!1},columns:gn(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 en(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 ts(e){let t=C(e.cdType).toUpperCase();if(t==="SELECTOR"){let n=C(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 un(e,t,n,r,i,s=0){let o=encodeURIComponent(e);return t==="SELECTOR"?{endpoint:`/api/selector/${o}/data`,requestBody:I({fieldQuery:{offset:0,limit:n},filters:r.length?r:void 0})}:t==="TREE_SELECTOR"?{endpoint:`/api/treeSelector/${o}/data`,requestBody:I({limit:n,filters:r.length?r:void 0})}:{endpoint:`/api/card/${o}/data`,requestBody:I({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 ns(e,t){let n=await e.post(t.endpoint,t.requestBody);return{raw:n,data:cn(n),requests:[t]}}async function rs(e,t,n,r,i){let o=[],a=[],u,c=0,d,p=!1,g=!1;for(;c<n;){let S=Math.min(1e3,n-c),P=un(t,"CHART",S,r,i,c);o.push(P);let F=await e.post(P.endpoint,P.requestBody);a.push(F);let xe=cn(F),ne=b(xe.chartMain);if(!Object.keys(ne).length)return{raw:F,data:xe,requests:o};u?os(b(u.chartMain),ne):u=mn(xe);let Me=as(ne);c+=Me,d=et(ne.count)??d;let Et=Ze(ne.hasMoreData);if(g=Et!==void 0,p=Et??!1,Me===0||Me<S||d!==void 0&&c>=d||g&&!p)break}let y=u??{},h=b(y.chartMain);return Object.keys(h).length&&(h.offset=0,h.limit=n,h.hasMoreData=d!==void 0?c<d:p),{raw:a.length>1?{pages:a,merged:y}:a[0],data:y,requests:o}}function is(e){return e==="SELECTOR"?"selector_card_data":e==="TREE_SELECTOR"?"tree_selector_card_data":"chart_card_data"}function cn(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 ss(e){if(!Object.keys(e).length)return[];let t=b(e.row),n=b(e.column),r=k(t.data??t.values),i=k(e.data),s=ee(t.fields??t.meta).map(Xe).filter(Boolean),o=us(n),a=Bs([...s,...o]),u=Math.max(r.length,i.length),c=[];for(let d=0;d<u;d+=1){let p=[];if(p.push(...k(r[d]).map(rn)),p.push(...k(i[d]).map(rn)),!p.length)continue;let g=Math.max(a.length,p.length);c.push(Object.fromEntries(Array.from({length:g},(y,h)=>[a[h]??`column_${h+1}`,p[h]??null])))}return c}function os(e,t){Ke(e,t,"data");let n=b(e.row),r=b(t.row);Ke(n,r,"data"),Ke(n,r,"values")}function Ke(e,t,n){let r=k(t[n]);r.length&&(e[n]=[...k(e[n]),...r])}function as(e){let t=k(e.data);if(t.length)return t.length;let n=b(e.row);return k(n.data).length||k(n.values).length}function us(e){let n=k(e.data??e.values).map((r,i)=>{let s=k(r).map(pn).filter(Boolean).join("/");return s||Xe(ee(e.fields??e.meta)[i])||`metric_${i+1}`}).filter(Boolean);return n.length?n:ee(e.fields??e.meta).map(Xe).filter(Boolean)}function cs(e){return ee(e.result)}function ds(e){let n=k(b(e.body).blocks).map(r=>C(b(r).text)).filter(r=>r!=="");return n.length?n.join(`
5
- `):C(e.text)}function ls(e,t,n){let r=[];for(let i of e){let s=bs(t,i.field,i.fd_id);if("unsupported"in s)return{unsupported:s.unsupported};r.push(I({name:s.field.name,fdId:s.field.fdId,fdType:s.field.fdType,filterLevel:n==="CHART"?ys(s.field.metaType):void 0,filterType:i.operator,filterValue:hs(i)}))}return{filters:r}}async function ps(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,C(a.value))}let i=[...ms(await e.get("/api/dynamic-parameter/query")),...fs()],s=[],o=new Map;for(let a of r){let u=gs(i,a);if("unsupported"in u)return{unsupported:u.unsupported};let c=mn(u.param),d=Z(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=_s(c,a);if("unsupported"in g)return{unsupported:g.unsupported};s.push(c)}return{dynamicParams:s}}function ms(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=k(t[n]).map(b).filter(i=>Object.keys(i).length);if(r.length)return r}return[]}function fs(){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 gs(e,t){let n=e.find(i=>Z(i,"dpId","dp_id")===t);if(n)return{param:n};let r=e.filter(i=>Z(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 _s(e,t){let n=[Z(e,"dpId","dp_id")?void 0:"dpId",Z(e,"name")?void 0:"name",Z(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 Z(e,...t){for(let n of t){let r=C(e[n]);if(r)return r}return""}function hs(e){return We.has(e.operator)?[]:(e.values??[]).map(C)}async function Is(e,t,n){let r=Ts(t);if(!n.some(o=>{let a=dn(r,o.field,o.fd_id);return!a||!C(a.fd_id)}))return r;let i=b(b(t.content).dsInfo),s=x(i.dsId,i.ds_id);if(!s)return r;try{let o=await e.get(`/api/data-source/${encodeURIComponent(s)}`);return[...r,...ln(o)]}catch{return r}}function ys(e){return e.toUpperCase()==="METRIC"?"AGGREGATION":"DETAIL"}function bs(e,t,n){let r=dn(e,t,n);if(!r)return{unsupported:{capability:"unsupported_filter_field",parameter:t,message:`\u7B5B\u9009\u5B57\u6BB5\u65E0\u6CD5\u4ECE\u5361\u7247\u5173\u8054\u6570\u636E\u96C6\u89E3\u6790\uFF1A${t}`,supported_fields:e.map(c=>I({name:C(c.name),fd_id:C(c.fd_id),meta_type:C(c.meta_type)}))}};let i=C(r.name),s=C(r.fd_id),o=C(r.fd_type),a=C(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 dn(e,t,n){if(n)return e.find(i=>C(i.fd_id)===n||C(i.id)===n);let r=t.trim();return e.find(i=>[i.fd_id,i.id].map(C).includes(r))??tn(e.filter(i=>C(i.name)===r))??tn(e.filter(i=>C(i.alias)===r))}function tn(e){return e.find(t=>C(t.fd_id))??e[0]}function Ts(e){let t=b(e.content),n=ln(b(t.dsInfo)),r=b(b(t.source).field);Object.keys(r).length&&n.push(Ye(r));let i=b(b(t.meta).chartMain),s=b(i.zoneData);for(let[o,a]of Object.entries(s))n.push(...ee(a).map(u=>Ye(u,o)));return Cs(n)}function ln(e){return ee(e.columns).map(t=>({...Ye(t),meta_type:x(t.metaType,t.meta_type)??"DIM"}))}function Ye(e,t){return I({name:x(e.name,e.title,e.originTitle,e.alias),alias:x(e.alias,e.title),id:C(e.id),fd_id:x(e.fdId,e.fd_id,e.id),fd_type:x(e.fdType,e.fd_type),meta_type:x(e.metaType,e.meta_type),zone_id:x(e.zoneId,e.zone_id,t)})}function Cs(e){let t=new Set;return e.filter(n=>{let r=x(n.fd_id,n.id,n.name,n.alias);return!r||t.has(r)?!1:(t.add(r),!0)})}function Es(e,t,n){if(e==="SELECTOR"||e==="TREE_SELECTOR")return Ze(t.exceedLimit)?!0:nn(t,n);let r=b(t.chartMain);return Ze(r.hasMoreData)?!0:nn(r,n)}function nn(e,t){let n=et(e.count),r=et(e.limit);return n!==void 0&&r!==void 0&&r>0?n>r:n!==void 0&&n>t}function Xe(e){return x(e.alias,e.title,e.originTitle,e.name,e.fdId,e.id)??""}function pn(e){let t=b(e);return Object.keys(t).length?x(t.title,t.name,t.originTitle,t.alias,t.v,t.value)??"":C(e)}function rn(e){let t=b(e);return Object.keys(t).length?"v"in t?t.v:"value"in t?t.value:pn(e):e}function ee(e){return Array.isArray(e)?e.map(b).filter(t=>Object.keys(t).length):[]}function k(e){return Array.isArray(e)?e:[]}function mn(e){return JSON.parse(JSON.stringify(e))}function b(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function C(e){return typeof e=="string"?e:e==null?"":String(e)}function x(...e){return e.map(C).find(t=>t.trim())?.trim()}function Ze(e){return typeof e=="boolean"?e:void 0}function et(e){return typeof e=="number"&&Number.isFinite(e)?e:void 0}function fn(e,t){return t?.length?e.map(n=>Object.fromEntries(t.map(r=>[r,n[r]??null]))):e}function gn(e){return[...new Set(e.flatMap(t=>Object.keys(t)))]}function Bs(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 ws}from"crypto";import{z as f}from"zod";var Ss=6e4,G=1e4,_n=10*6e4,we=new Map,Se=new Map,tt=new Map,nt=new Map,hn=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")}),In={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()},yn={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()},Pa={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:hn.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()},bn={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()},Tn={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:hn.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()},Cn={is_insight:f.boolean().optional().describe("\u662F\u5426\u53EA\u5217\u51FA\u6D1E\u5BDF\u4E3B\u9898\u3002")},En={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")},va={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")},wn={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 Sn(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 Oe(n,r,"listThemes")}}async function Rn(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 Oe(n,r,"query")}}async function On(e,t){let n=new v(e);try{let r=kn({caller_scope:Pn(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=Rs(r);if(i)return B({...i,deduped:!0,retry_after_ms:G,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=tt.get(r);if(s){let u=await s;return B({...u,deduped:!0,retry_after_ms:G,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 Os(r,c),c}).finally(()=>{tt.delete(r)});tt.set(r,o);let a=await o;return B({...a,deduped:!1,retry_after_ms:G,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 Oe(n,r,"insight.start")}}async function An(e,t){let n=new v(e);try{let r=kn({caller_scope:Pn(e),message_id:t.message_id}),i=As(r);if(i){let p=rt(i.result),g=st(i.result,!0);return B({message_id:i.result.message_id,session_id:i.result.session_id,status:i.result.status,detail:it(i.result),question:i.result.question,answer:i.result.answer,throttled:!0,retry_after_ms:i.retryAfterMs,...p,next_action:g})}let s=nt.get(r);if(s){let p=await s,g=at(p.status),y=rt(p),h=st(p,!0);return B({message_id:p.message_id,session_id:p.session_id,status:p.status,detail:it(p),question:p.question,answer:p.answer,throttled:!0,retry_after_ms:g?0:G,...y,next_action:h})}let o=n.pollInsight({themeId:t.theme_id,themeName:t.theme_name,messageId:t.message_id}).then(p=>(ks(r,p),p)).finally(()=>{nt.delete(r)});nt.set(r,o);let a=await o,u=at(a.status),c=rt(a),d=st(a,!1);return B({message_id:a.message_id,session_id:a.session_id,status:a.status,detail:it(a),question:a.question,answer:a.answer,throttled:!1,retry_after_ms:u?0:G,...c,next_action:d,resolved_base_url:n.getResolvedBaseUrl(),tried_base_urls:n.getTriedBaseUrls()})}catch(r){return Oe(n,r,"insight.poll")}}function rt(e){return e.status!=="success"?{}:{final_result:{format:"markdown",content:vn(e)}}}function it(e){return e.detail!=null?e.detail:e.status==="failure"||e.status==="stopped"?Ps(e):e.detail}function st(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 Rs(e){Re();let t=we.get(e);if(!(!t||Date.now()-t.createdAt>=Ss))return t.result}function Os(e,t){Re(),we.set(e,{createdAt:Date.now(),result:t})}function As(e){Re();let t=Se.get(e);if(!t)return;let n=Date.now()-t.checkedAt,r=at(t.result.status);if(!(!r&&n>=G))return{result:t.result,retryAfterMs:r?0:Math.max(0,G-n)}}function at(e){return e==="success"||e==="failure"||e==="stopped"}function ks(e,t){Re(),Se.set(e,{checkedAt:Date.now(),result:t})}function Re(){let e=Date.now();for(let[t,n]of we)e-n.createdAt>=_n&&we.delete(t);for(let[t,n]of Se)e-n.checkedAt>=_n&&Se.delete(t)}function kn(e){return JSON.stringify(Object.keys(e).sort().reduce((t,n)=>{let r=e[n];return typeof r<"u"&&(t[n]=r),t},{}))}function Pn(e){return e.BI_PAT?`pat:${ot(e.BI_PAT)}`:e.BI_UID_TOKEN?`uid:${ot(e.BI_UID_TOKEN)}`:`login:${ot(`${e.BI_LOGIN_DOMAIN??""}\0${e.BI_LOGIN_ID??""}`)}`}function ot(e){return ws("sha256").update(e).digest("hex").slice(0,16)}function vn(e){let t=e.answer?.trim();if(t)return js(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 Ps(e){switch(e.status){case"success":return vn(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 vs(e,t){let n=[`| ${e.join(" | ")} |`,`|${e.map(()=>" --- ").join("|")}|`];for(let r of t)n.push(`| ${e.map((i,s)=>Ms(xs(r[s]))).join(" | ")} |`);return n.join(`
6
- `)}function xs(e){return e===null||typeof e>"u"||e===""?"-":String(e)}function Ms(e){return e.replaceAll(`\r
2
+ import"dotenv/config";import{createRequire as Aa}from"module";import{z as R}from"zod";var Zr="http://guandata-web:8088",ei=R.object({BI_BASE_URL:R.string().url().optional().default(Zr),BI_PUBLIC_PATH:R.string().optional().default(""),BI_PAT:R.string().optional(),BI_UID_TOKEN:R.string().optional(),BI_LOGIN_DOMAIN:R.string().optional().default("guanbi"),BI_LOGIN_ID:R.string().optional(),BI_LOGIN_PASSWORD:R.string().optional(),BI_APP_TOKEN:R.string().optional(),BI_LOGIN_ID_HEADER:R.string().optional(),BI_USER_PROPERTY_HEADER:R.string().optional(),BI_USER_PROPERTY_KEY:R.string().optional(),BI_IDENTITY_DEBUG:R.string().optional(),BI_IDENTITY_TOKEN_CACHE_TTL_MS:R.coerce.number().int().positive().default(6e5),BI_REQUEST_TIMEOUT_MS:R.coerce.number().int().positive().default(12e4),BI_MAX_ROWS:R.coerce.number().int().positive().default(1e3),BI_DATA_VERSION:R.string().optional(),GUANBI_MCP_USAGE_STATS:R.string().optional(),MCP_TRANSPORT:R.enum(["stdio","streamable-http"]).optional().default("stdio"),MCP_HTTP_HOST:R.string().optional().default("127.0.0.1"),MCP_HTTP_PORT:R.coerce.number().int().nonnegative().optional().default(9090),MCP_ENTRYPOINT_TOKEN:R.string().optional(),MCP_TRUSTED_GATEWAY:R.string().optional()});function Gt(e=process.env){let t=ei.parse(e),n=t.MCP_TRANSPORT==="streamable-http";return{...t,BI_BASE_URL:t.BI_BASE_URL?.replace(/\/+$/,""),BI_PUBLIC_PATH:ti(t.BI_PUBLIC_PATH),BI_PAT:n?void 0:t.BI_PAT?.trim()||void 0,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":Ht(t.BI_LOGIN_ID_HEADER),BI_USER_PROPERTY_HEADER:Ht(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 ti(e){let t=e?.trim().replace(/^\/+|\/+$/g,"")??"";return t?`/${t}`:""}function Ht(e){return e?.trim().toLowerCase()||void 0}import{createRequire as la}from"module";import{createHash as pa,randomUUID as ma}from"crypto";import{createServer as fa}from"http";import{McpServer as ga}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as _a}from"@modelcontextprotocol/sdk/server/stdio.js";import{StreamableHTTPServerTransport as ha}from"@modelcontextprotocol/sdk/server/streamableHttp.js";var Ee=class{record(t){console.error(JSON.stringify({audit:ri({...t})}))}},Be=class{record(){}};function ze(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"?ni(i):void 0}}function ni(e){return e instanceof Error?e.name||"Error":typeof e}function ri(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}async function Re(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(ii(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} ${li(n)}`);let r=si(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 ii(e,t){return`${e.BI_BASE_URL}${e.BI_PUBLIC_PATH}${t}`}function si(e,t){let n=oi(e.headers);if(n)return n;let r=ai(t);return r||ui(e.headers)}function oi(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 ai(e){try{let t=JSON.parse(e);return Jt(t)??Jt(di(t.response))}catch{return}}function ui(e){return[...e.getSetCookie?.()??[],...ci(e.get("set-cookie"))].map(n=>n.trim().match(/(?:^|;\s*)uIdToken=([^;]+)/)?.[1]).find(Boolean)}function ci(e){return e?e.split(/,(?=\s*[^;,]+=)/):[]}function Jt(e){if(e)for(let t of["uIdToken","authToken","token"]){let n=e[t];if(typeof n=="string"&&n)return n}}function di(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function li(e,t=500){return e.length>t?`${e.slice(0,t)}...`:e}var pi="guanbi_mcp_chatbi",k=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?mi(`${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=$t(t,"probe");return{available:!1,lastError:n,failureType:Ai(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:Bi})).themes}async query(t){let n=await this.resolveThemeId(t.themeId,t.themeName,!1),r={attachments:[],theme_id:n,message:t.message,config:Ft({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{Pi(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:Vt(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,Vt(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 vi(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=Ft({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(Ci(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 Oi(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=$t(o,n.operation),!yi(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 k&&(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 k(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(!bi(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:fi(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 k(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=gi(u,a,s);if(!a.ok||_i(c))throw hi(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 Re(this.config);return this.token=t.token,t.token}refreshTokenFromResponse(t,n){let r=Ri(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 mi(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 Se(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 fi(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"]=pi),n}function gi(e,t,n){if(!e)return{};try{return JSON.parse(e)}catch{throw new k("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:Kt(e)},{retryableForBaseUrl:!0})}}function _i(e){let t=zt(e);return typeof t=="number"&&![0,200].includes(t)||e.result==="fail"||e.success===!1}function hi(e,t,n,r){let i=zt(e),s=wi(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:Kt(t)},u=Ei(o),c=!u&&Ii(n.status,i);return new k(o,a,{authExpired:c,retryableForBaseUrl:u||Ti(n.status,i)})}function yi(e,t){return!!(t&&e instanceof k&&e.retryableForBaseUrl)}function bi(e){return e instanceof k&&e.authExpired}function Ii(e,t){return e===401||e===403||t===401||t===403||t===5001}function Ti(e,t){return[401,403,404,405].includes(e)||typeof t=="number"&&[401,403,404,405].includes(t)}function Ci(e){return e instanceof k&&e.detail.http_status===200&&e.detail.chatbi_code===404&&e.detail.chatbi_message==="Message not found."}function zt(e){if(typeof e.code=="number")return e.code;let t=Ae(e.error);return typeof t?.status=="number"?t.status:void 0}function wi(e){if(typeof e.message=="string"&&e.message.trim())return e.message;let t=Ae(e.error);return typeof t?.message=="string"&&t.message.trim()?t.message:void 0}function Ei(e){return/No static resource/i.test(e)}function Ae(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function Bi(e,t){let n=Ae(e);if(!Array.isArray(n?.themes))throw new k("ChatBI list-theme response missing themes",{operation:t.operation,base_url:t.baseUrl,path:t.path,detail:"missing themes"},{retryableForBaseUrl:!0})}function Ri(e,t){let r=[...e.headers.getSetCookie?.()??[],...Si(e.headers.get("set-cookie"))].map(s=>Qe(s.trim().match(/(?:^|;\s*)uIdToken=([^;]+)/)?.[1])).find(Boolean);if(r)return r;let i=Qe(e.headers.get("x-auth-token"));return i||Qt(t)}function Si(e){return e?e.split(/,(?=\s*[^;,]+=)/):[]}function Qe(e){if(typeof e!="string")return;let t=e.trim();return t&&!/\s/.test(t)?t:void 0}function Qt(e){let t=Ae(e);if(t){for(let n of["uIdToken","authToken"]){let r=Qe(t[n]);if(r)return r}for(let n of["data","response"]){let r=Qt(t[n]);if(r)return r}}}function $t(e,t){return e instanceof k?e.detail:{operation:t,detail:e instanceof Error?e.message:String(e)}}function Kt(e,t=1e3){return e.length>t?`${e.slice(0,t)}...`:e}function Ai(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 Oi(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 Ft(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>typeof t<"u"))}function Pi(e){if([e.final_status,e.answer_status,e.query_status].some(xi))throw new Error(`ChatBI query failed: ${ki(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 ki(...e){return e.find(t=>typeof t=="string"&&t.trim())?.trim()}function xi(e){return typeof e=="string"&&e.trim().toLowerCase()==="failure"}function Vt(e){let t=e-Date.now();if(t<=0)throw new Error("Insight request timed out");return t}async function vi(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 de="8.2.0",We=["search_metrics","list_metric_catalog","get_metric_detail","query_metric_data","search_metric_trees","get_metric_tree_detail","query_metric_tree_attribution"],Mi=["get_bi_capabilities","global_search",...We,"execute_sql_query","get_dataset_detail","get_card_info","query_card_data","get_page_info"],Di=6e4,ji="PAT \u6A21\u5F0F\u4EC5\u652F\u6301\u666E\u901A BI \u63A5\u53E3\uFF0C\u4E0D\u652F\u6301 ChatBI public-api\u3002",Ke=new WeakMap;async function le(e,t){let n=Ke.get(e);return(!n||n.expiresAt<=Date.now())&&Ke.set(e,{expiresAt:Date.now()+Di,promise:Ni(e,t).catch(r=>Ui(r,t))}),Ke.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:Xe(e,t?["get_bi_capabilities"]:Ye(e)),caller:{ok:!1,error:r,features:{executeSqlQuery:{enabled:!1,minVersion:de,reason:r}},chatbi:Z(e,r)},features:{executeSqlQuery:{enabled:!t,minVersion:de,reason:t?"\u914D\u7F6E\u4E0D\u5B8C\u6574\uFF1A\u7F3A\u5C11 BI_BASE_URL\u3002":n}},metricPlatform:{registeredTools:t?[]:We,readOnly:!0,lastError:t?"\u914D\u7F6E\u4E0D\u5B8C\u6574\uFF1A\u7F3A\u5C11 BI_BASE_URL\u3002":void 0},chatbi:Z(e,"HTTP \u6A21\u5F0F\u542F\u52A8\u671F\u4E0D\u4F7F\u7528\u67D0\u4E2A\u7528\u6237 token \u63A2\u6D4B ChatBI \u80FD\u529B\u3002")}}async function Zt(e,t,n){let i=(await le(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 Ui(e,t){let n=e instanceof Error?e.message:String(e);return{ok:!1,error:n,versionSource:"api",features:{executeSqlQuery:{enabled:!1,minVersion:de,reason:`\u65E0\u6CD5\u786E\u8BA4 BI \u80FD\u529B\uFF1A${n}`}},metricPlatform:{registeredTools:[],readOnly:!0,lastError:n},chatbi:Z(t,n),service:Xe(t,Ye(t)),caller:{ok:!1,error:n,features:{executeSqlQuery:{enabled:!1,minVersion:de,reason:`\u65E0\u6CD5\u786E\u8BA4 BI \u80FD\u529B\uFF1A${n}`}},chatbi:Z(t,n)}}}async function Ni(e,t){let n=qi(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 Hi(e),s=Gi(i.capabilityVersion,de),o=await Li(t);return{ok:!0,appVersion:i.appVersion,dataVersion:i.dataVersion,versionSource:r,service:Xe(t,Ye(t)),caller:{ok:!0,features:{executeSqlQuery:s},chatbi:o},features:{executeSqlQuery:s},metricPlatform:{registeredTools:We,readOnly:!0},chatbi:o}}function Ye(e){let t=new Set(Mi);if(!e.BI_PAT&&(Se(e)||e.MCP_TRANSPORT==="streamable-http"))for(let n of new v(e).getRegisteredTools())t.add(n);return[...t]}function Xe(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 Z(e,ji);let t=new v(e);return Se(e)?t.probe():Z(e,"\u7F3A\u5C11 BI_BASE_URL \u6216\u9274\u6743\u914D\u7F6E\u3002")}function Z(e,t){return{available:!1,registeredTools:e.BI_PAT||!Se(e)?[]:new v(e).getRegisteredTools(),failureType:"unknown",triedBaseUrls:[],lastError:{operation:"probe",chatbi_message:t,detail:t}}}function qi(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 Hi(e){let t=await e.get("/api/server-version"),n=Yt(t.version),r=Yt(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 Gi(e,t){let n=Wt(e),r=Wt(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=Ji(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 Wt(e){let t=e.match(/(\d+)\.(\d+)\.(\d+)/);if(t)return[Number(t[1]),Number(t[2]),Number(t[3])]}function Ji(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 Yt(e){return typeof e=="string"&&e.trim()?e.trim():void 0}var Oe=class{constructor(t){this.config=t}config;cache=new Map;async exchange(t){let n=en(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(l){throw this.debugError(`BI user property lookup request failed: ${l instanceof Error?l.message:String(l)}`,{operation:"userPropertyLookup",request:{method:"POST",url:i,body:s},error:l instanceof Error?l.message:String(l)},[this.config.BI_APP_TOKEN])}let a=await o.text(),u=tn(a);if(!o.ok||nn(u))throw this.debugError(`BI user property lookup failed: HTTP ${o.status} ${Ze(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(l=>l.loginId).filter(Boolean)}},[this.config.BI_APP_TOKEN]);return en(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=tn(s),a=o?.response?.token?.trim();if(!i.ok||nn(o)||!a)throw this.debugError(`BI loginId token exchange failed: HTTP ${i.status} ${Ze(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=Fi(t);return r?Math.min(n,r):n}debugError(t,n,r=[]){if(!zi(this.config))return new Error(t);let i=et(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 en(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 tn(e){if(e.trim())try{return JSON.parse(e)}catch{return}}function nn(e){return!e||e.result&&!["ok","success"].includes(e.result.toLowerCase())?!0:e.success===!1}function Fi(e){if(!e)return;let t=e.replace(" ","T"),n=Date.parse(t);return Number.isFinite(n)?n:void 0}function Ze(e,t){let n=t.filter(r=>!!r).reduce((r,i)=>r.split(i).join("[redacted]"),e);return Qi(n)}function et(e,t){let n=t.filter(r=>!!r);return typeof e=="string"?Ze(e,n):Array.isArray(e)?e.map(r=>et(r,n)):!e||typeof e!="object"?e:Object.fromEntries(Object.entries(e).map(([r,i])=>[r,Vi(r)?"[redacted]":et(i,n)]))}function Vi(e){return["token","authorization","cookie","uidtoken","uIdToken".toLowerCase()].includes(e.toLowerCase())}function zi(e){return["1","true","yes","on"].includes(e.BI_IDENTITY_DEBUG?.trim().toLowerCase()??"")}function Qi(e,t=1e3){return e.length>t?`${e.slice(0,t)}\u2026`:e}var ne="x-personal-token";function Ki(e){return{transport:"stdio",...e.BI_PAT?{biPatToken:e.BI_PAT}:{},biUidToken:e.BI_UID_TOKEN,audit:{}}}function sn(e){return{resolve:()=>Ki(e)}}function Pe(e){let t=pe(e);if(t)return{transport:"streamable-http",biPatToken:t,audit:ee(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:ee(e)}}function on(e,t={}){let n=e?new Oe(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=pe(o);if(a)return{transport:"streamable-http",biPatToken:a,audit:ee(o)};if(e?.BI_PAT)return{transport:"streamable-http",biPatToken:e.BI_PAT,audit:ee(o)};if(J(o,"x-guanbi-uid-token")?.trim()||!e)return Pe(o);let c=e.BI_LOGIN_ID_HEADER,d=c?te(J(o,c)):void 0;if(d){let h=await r?.(d);return h?{transport:"streamable-http",biUidToken:h.token,biUidTokenRefresh:h.refresh,loginId:d,audit:ee(o)}:Pe(o)}let l=e.BI_USER_PROPERTY_HEADER,g=l?te(J(o,l)):void 0;if(g){let h=await i?.(g);return h?{transport:"streamable-http",biUidToken:h.token,biUidTokenRefresh:h.refresh,audit:ee(o)}:Pe(o)}throw Wi(o,e)}}}function pe(e){return te(J(e,ne))}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 te(e){return e?.trim()||void 0}function ee(e){return{tenantId:te(J(e,"x-tenant-id")),endUserId:te(J(e,"x-end-user-id")),traceId:te(J(e,"x-trace-id"))}}function Wi(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(!ts(t))return new Error(n);let r={operation:"resolveHttpCallerContext",expectedIdentityHeaders:Yi(e,t),receivedHeaderNames:Xi(e),receivedIdentityLikeHeaders:rn(Object.fromEntries(tt(e).filter(([i])=>es(i.toLowerCase()))),[ne,"x-guanbi-uid-token",t.BI_LOGIN_ID_HEADER,t.BI_USER_PROPERTY_HEADER]),receivedHeaders:rn(e,[ne,"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 Yi(e,t){return[{source:"pat",name:ne,present:ke(e,ne)},{source:"uidToken",name:"x-guanbi-uid-token",present:ke(e,"x-guanbi-uid-token")},...t.BI_LOGIN_ID_HEADER?[{source:"loginId",name:t.BI_LOGIN_ID_HEADER,present:ke(e,t.BI_LOGIN_ID_HEADER)}]:[],...t.BI_USER_PROPERTY_HEADER?[{source:"userProperty",name:t.BI_USER_PROPERTY_HEADER,present:ke(e,t.BI_USER_PROPERTY_HEADER),userPropertyKey:t.BI_USER_PROPERTY_KEY}]:[]]}function ke(e,t){return J(e,t)!==void 0}function Xi(e){return[...new Set(tt(e).map(([t])=>t.toLowerCase()))].sort()}function rn(e,t){let n=new Set(t.filter(r=>!!r).map(r=>r.toLowerCase()));return Object.fromEntries(tt(e).map(([r,i])=>{let s=r.toLowerCase();return Zi(s)?[s,"<redacted>"]:[s,n.has(s)?i:"<present>"]}))}function tt(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 Zi(e){return["authorization","cookie","set-cookie","x-guanbi-uid-token",ne].includes(e)}function es(e){return e.startsWith("x-")||e.includes("auth")||e.includes("login")||e.includes("token")||e.includes("uid")||e.includes("user")}function ts(e){return["1","true","yes","on"].includes(e.BI_IDENTITY_DEBUG?.trim().toLowerCase()??"")}import{AsyncLocalStorage as ns}from"async_hooks";var re={client:"X-Guandata-Client",clientVersion:"X-Guandata-Client-Version",command:"X-Guandata-Command"},rs=new Set(Object.values(re).map(e=>e.toLowerCase())),an=new ns;function un(e,t){return an.run(e,t)}function is(e,t="mcp"){e=an.getStore()??e;let n={};n[re.client]=e?.client.trim()||t.trim()||"mcp";let r=e?.clientVersion?.trim();r&&(n[re.clientVersion]=r);let i=e?.command?.trim();return i&&(n[re.command]=i),n}function cn(e,t,n="mcp"){let r=is(t,n);return{...nt(e),...r}}function nt(e){return Object.fromEntries(Object.entries(e).filter(([t])=>!rs.has(t.toLowerCase())))}var dn=64*1024,rt=16*1024*1024,ss=8*1024,it=class extends Error{constructor(n,r){super(r);this.status=n;this.name="BIHttpResponseError"}status},ve=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,n){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:me(this.config.BI_REQUEST_TIMEOUT_MS,n?.signal)});return s.ok||await xe(s,"GET",t),s.text()}let r=await this.ensureToken(),i=await fetch(this.buildUrl(t),{method:"GET",headers:this.uidHeaders(r,{"raw-backend-response":"TRUE"}),signal:me(this.config.BI_REQUEST_TIMEOUT_MS,n?.signal)});if(this.shouldRefreshToken(i)){await st(i,"retrying after BI authentication expired");let s=await this.refreshToken();i=await fetch(this.buildUrl(t),{method:"GET",headers:this.uidHeaders(s,{"raw-backend-response":"TRUE"}),signal:me(this.config.BI_REQUEST_TIMEOUT_MS,n?.signal)})}return i.ok||await xe(i,"GET",t),this.refreshTokenFromResponse(i),i.text()}async request(t,n,r,i){if(this.config.BI_PAT){let u=await this.fetchWithPat(t,n,this.config.BI_PAT,r,i);u.ok||await xe(u,t,n);let c=await ln(u,t,n);return fn(c)}let s=await this.ensureToken(),o=await this.fetchWithToken(t,n,s,r,i);if(this.shouldRefreshToken(o)){await st(o,"retrying after BI authentication expired");let u=await this.refreshToken();o=await this.fetchWithToken(t,n,u,r,i)}o.ok||await xe(o,t,n);let a=await ln(o,t,n);return this.refreshTokenFromResponse(o),fn(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:me(this.config.BI_REQUEST_TIMEOUT_MS,s?.signal)})}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:me(this.config.BI_REQUEST_TIMEOUT_MS,s?.signal)})}async ensureToken(){if(this.token)return this.token;let t=await Re(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=cs(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{...nt(n),Cookie:`uIdToken=${t}`}}patHeaders(t,n){return cn({...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 me(e,t){if(t?.aborted)return t;let n=AbortSignal.timeout(e);return t?AbortSignal.any([t,n]):n}async function xe(e,t,n){let r=await gn(e,dn),i=r.truncated?` [truncated after ${dn} bytes]`:"";throw new it(e.status,`BI \u8BF7\u6C42\u5931\u8D25\uFF1A${t} ${n} HTTP ${e.status} ${ms(r.text)}${i}`)}async function ln(e,t,n){let r=as(e);r!==void 0&&r>rt&&(await st(e,"BI JSON response exceeded byte limit"),pn(t,n));let i=await gn(e,rt);return i.truncated&&pn(t,n),i.text}function pn(e,t){throw new Error(`BI JSON \u54CD\u5E94\u8FC7\u5927\uFF1A${e} ${t} \u8D85\u8FC7 ${rt} \u5B57\u8282\uFF1B\u8BF7\u7F29\u5C0F\u67E5\u8BE2\u8303\u56F4\u6216\u964D\u4F4E query_card_data \u7684 limit/columns \u540E\u6309 next_offset \u5206\u9875\u8BFB\u53D6\u3002`)}async function gn(e,t){if(!e.body)return{text:"",truncated:!1};let n=e.body.getReader(),r=new Uint8Array(Math.min(ss,t)),i=0;try{for(;;){let{done:s,value:o}=await n.read();if(s)return{text:new TextDecoder().decode(r.subarray(0,i)),truncated:!1};let a=t-i;if(o.byteLength>a)return a>0&&(r=mn(r,t,i+a),r.set(o.subarray(0,a),i),i+=a),await os(n,"response body exceeded byte limit"),{text:new TextDecoder().decode(r.subarray(0,i)),truncated:!0};r=mn(r,t,i+o.byteLength),r.set(o,i),i+=o.byteLength}}finally{n.releaseLock()}}function mn(e,t,n){if(n<=e.byteLength)return e;let r=Math.min(t,Math.max(n,Math.max(1,e.byteLength)*2)),i=new Uint8Array(r);return i.set(e),i}async function os(e,t){try{await e.cancel(new Error(t))}catch{}}async function st(e,t){if(e.body)try{await e.body.cancel(new Error(t))}catch{}}function as(e){let t=e.headers.get("content-length");if(!t)return;let n=Number(t);return Number.isSafeInteger(n)&&n>=0?n:void 0}function fn(e){if(!e)return;let t=JSON.parse(e);if(!us(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 us(e){return!e||typeof e!="object"||Array.isArray(e)?!1:"response"in e||"result"in e||"success"in e}function cs(e){return ds(e.headers)??ps(e.headers)}function ds(e){return[...e.getSetCookie?.()??[],...ls(e.get("set-cookie"))].map(n=>_n(n.trim().match(/(?:^|;\s*)uIdToken=([^;]+)/)?.[1])).find(Boolean)}function ls(e){return e?e.split(/,(?=\s*[^;,]+=)/):[]}function ps(e){return _n(e.get("x-auth-token"))}function _n(e){if(typeof e!="string")return;let t=e.trim();return t&&!/\s/.test(t)?t:void 0}function ms(e,t=1e3){return e.length>t?`${e.slice(0,t)}...`:e}var Me=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 ve(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 hn={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},De=class{serviceDomain;appVersion;enabled;sender;now;constructor({config:t,appVersion:n,sender:r=_s(),now:i=Date.now}){this.serviceDomain=ys(t.BI_BASE_URL),this.appVersion=n,this.enabled=hs(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:bs(this.now()-t.startedAtMs),error_type:n.success?"none":Ts(n.error)};try{Promise.resolve(this.sender(r)).catch(()=>{})}catch{}}};function fs(e=hn){return t=>gs(t,e)}async function gs(e,t=hn){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 Is(i,t.maxResponseBytes)}catch{}}function _s(){return Cs(process.env)?()=>{}:fs()}function hs(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 yn(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 ys(e){if(e)try{return new URL(e).hostname}catch{return}}function bs(e){return e<1e3?"<1s":e<5e3?"1-5s":e<3e4?"5-30s":e<12e4?"30-120s":">120s"}async function Is(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 Ts(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 Cs(e){return e.NODE_ENV==="test"||e.VITEST==="true"}var je=class{constructor(t,n,r=new Be,i=12e4){this.callerContextResolver=t;this.clientFactory=n;this.auditLogger=r;this.requestTimeoutMs=i}callerContextResolver;clientFactory;auditLogger;requestTimeoutMs;async run(t,n,r){let i=Date.now(),s=ws(n?.signal,this.requestTimeoutMs);s.throwIfAborted();let o=await bn(this.callerContextResolver.resolve(n),s),a=this.clientFactory.create(o,r),u={...a,signal:s};try{let c=await bn(un(a.config.BI_REQUEST_METADATA,()=>t(u)),s);if(r){let d=Es(c)?"error":"success";this.auditLogger.record(ze(r,o,i,d,c))}return c}catch(c){throw r&&this.auditLogger.record(ze(r,o,i,"error",c)),c}}};function ws(e,t){let n=AbortSignal.timeout(t);return e?AbortSignal.any([e,n]):n}function bn(e,t){return new Promise((n,r)=>{if(t.aborted){r(t.reason);return}let i=()=>r(t.reason);t.addEventListener("abort",i,{once:!0}),Promise.resolve(e).then(s=>{t.removeEventListener("abort",i),n(s)},s=>{t.removeEventListener("abort",i),r(s)})})}function Es(e){return!!(e&&typeof e=="object"&&e.isError===!0)}function L(e){return{content:[{type:"text",text:JSON.stringify(e,null,2)}]}}function S(e,t={}){let n=at(e),r=t.text===void 0?n:t.text;return{content:[{type:"text",text:typeof r=="string"?r:JSON.stringify(r,null,2)}],structuredContent:n}}function F(e){let t=at(e);return{content:[{type:"text",text:JSON.stringify(t,null,2)}],isError:!0}}function fe(e,t,n={}){return F({status:"error",diagnostic:ot(e,t,n)})}function ot(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 at({operation:e,path:i?.groups?.path,status:i?.groups?.status?Number(i.groups.status):void 0,message:r,...n})}function at(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}var In={};async function Tn(e,t){return L(await le(e,t))}import{z as b}from"zod";var z=class extends Error{constructor(n,r){super(n.message,{cause:r});this.detail=n;this.name="MetricPlatformRequestError"}detail},q=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=y({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",ct("/api/metric-platform/metrics/full-tree",{projectId:t.projectId,nameLike:t.keyword}))}listMetricDirectoryTree(t){return this.get("listMetricDirectoryTree",ct("/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",y(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",ct("/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 ut(t,n,s)}}async get(t,n,r){try{return await this.client.get(n,r?{headers:r}:void 0)}catch(i){throw ut(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 ut(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"]=ie(this.config.BI_LOGIN_DOMAIN)),this.config.BI_LOGIN_ID&&(t["user-id"]=ie(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=Cn(n.domId,n.domainId,n.domain,n.dom_id),i=Cn(n.email,n.loginId,n.userId,n.uId,n.uid);!t["x-dom-id"]&&r&&(t["x-dom-id"]=ie(r)),!t["user-id"]&&i&&(t["user-id"]=ie(i))}catch{}return t["x-dom-id"]||(t["x-dom-id"]=ie(this.config.BI_LOGIN_DOMAIN||"guanbi")),t["user-id"]||(t["user-id"]=ie(this.config.BI_LOGIN_ID||"unknown")),t}};function ut(e,t,n){let r=n instanceof Error?n.message:String(n),i=r.match(/\bHTTP\s+(\d{3})\b/);return new z({operation:e,path:t,status:i?Number(i[1]):void 0,message:r},n)}function ct(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 y(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}function ie(e){return Buffer.from(e,"utf8").toString("base64")}function Cn(...e){for(let t of e)if(typeof t=="string"&&t.trim())return t.trim()}var Bs=b.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"]),wn=new Set(["BT","CLOSE_BT_OPEN","OPEN_BT_CLOSE","OPEN_BT_OPEN"]),lt=new Set(["IS_NULL","NOT_NULL"]),Rs=b.object({field:b.string().min(1).describe("\u5361\u7247\u5173\u8054\u6570\u636E\u96C6\u4E2D\u7684\u7B5B\u9009\u5B57\u6BB5\u540D\u79F0\u3001\u522B\u540D\u6216\u5B57\u6BB5 ID\u3002"),operator:Bs.describe("BI \u539F\u751F\u7B5B\u9009\u64CD\u4F5C\u7B26\uFF0C\u4F8B\u5982 EQ/NI/GE/BT/CONTAINS\u3002"),values:b.array(b.union([b.string(),b.number(),b.boolean()])).optional().describe("\u7B5B\u9009\u503C\u3002IS_NULL/NOT_NULL \u4E0D\u9700\u8981\u4F20\u503C\u3002"),fd_id:b.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;lt.has(e.operator)&&n>0&&t.addIssue({code:b.ZodIssueCode.custom,path:["values"],message:`${e.operator} \u64CD\u4F5C\u7B26\u4E0D\u63A5\u53D7\u7B5B\u9009\u503C\u3002`}),wn.has(e.operator)&&n!==2&&t.addIssue({code:b.ZodIssueCode.custom,path:["values"],message:`${e.operator} \u64CD\u4F5C\u7B26\u9700\u8981\u6070\u597D 2 \u4E2A\u503C\u3002`}),!wn.has(e.operator)&&!lt.has(e.operator)&&n<1&&t.addIssue({code:b.ZodIssueCode.custom,path:["values"],message:`${e.operator} \u64CD\u4F5C\u7B26\u81F3\u5C11\u9700\u8981 1 \u4E2A\u503C\u3002`})}),Ss=b.object({parameter:b.string().min(1).describe("\u52A8\u6001\u53C2\u6570\u540D\u79F0\u6216 dpId\u3002"),value:b.union([b.string(),b.number(),b.boolean()]).describe("\u52A8\u6001\u53C2\u6570\u8986\u76D6\u503C\uFF0C\u4F1A\u6309 BI dynamicParams.defaultValue \u4EE5\u5B57\u7B26\u4E32\u53D1\u9001\u3002")}),As=b.object({returned_count:b.number().int().nonnegative(),offset:b.number().int().nonnegative(),limit:b.number().int().positive(),has_more:b.boolean(),next_offset:b.number().int().nonnegative().optional(),total_count:b.number().int().nonnegative().optional()}),Rn={cd_id:b.string().min(1).max(512).describe("\u5361\u7247 ID\u3002"),filters:b.array(Rs).optional().describe("\u7ED3\u6784\u5316\u7B5B\u9009\u6761\u4EF6\u3002\u4E0D\u652F\u6301 CLI \u98CE\u683C\u7B5B\u9009\u5B57\u7B26\u4E32\u3002"),dynamic_params:b.array(Ss).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:b.array(b.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"),offset:b.number().int().nonnegative().optional().default(0).describe("\u5F53\u524D\u9875\u8D77\u59CB\u504F\u79FB\u91CF\uFF0C\u9ED8\u8BA4 0\u3002"),limit:b.number().int().positive().optional().default(100).describe("\u5F53\u524D\u9875\u671F\u671B\u8FD4\u56DE\u884C\u6570\uFF0C\u9ED8\u8BA4 100\uFF1B\u5927\u4E8E 1000 \u65F6\u4ECD\u6309\u5355\u9875 1000 \u884C\u67E5\u8BE2\uFF0C\u5E76\u901A\u8FC7 next_offset \u7EED\u9875\u3002"),raw:b.boolean().optional().describe("\u662F\u5426\u8FD4\u56DE\u539F\u59CB\u54CD\u5E94\u3002")},Sn={summary:b.unknown().optional(),columns:b.array(b.unknown()).optional(),rows:b.array(b.unknown()).optional(),page:As.optional(),diagnostic:b.unknown().optional(),raw:b.unknown().optional(),status:b.string().optional(),next_action:b.string().optional()},Os=1e3,ge=4*1024*1024,Ue=1024*1024,An=64*1024;async function On(e,t,n){try{let r=t.limit??100,i=Math.min(r,Os),s=t.offset??0,o=await Ps(e,t.cd_id,t.filters??[],t.dynamic_params??[],n);if("unsupported"in o)return vs("query_card_data",o.unsupported);let{card:a,cardType:u,filters:c,dynamicParams:d}=o;if(u==="TEXT")return xs(t.cd_id,a,t.columns,t.raw,s,i);let l=await Ns(e,Us(t.cd_id,u,i,c,d,s),n),{endpoint:g}=l.requests[0],h=l.data,_=u==="CHART"?Hs(T(h.chartMain)):void 0,w=_?.rows??Js(h),P=Un(w.slice(0,i),t.columns),j=ge-An-(t.raw?Ue:0),E=vn(P,j),B=ro(u,h,s,i,P.length);if(u==="TREE_SELECTOR"&&E.truncated)return ks(t.cd_id,s,i,B.page.total_count);if(E.oversizedFirstRow)return Pn(t.cd_id,u,s,i,B.page.total_count);let U=E.rows,$=E.truncated||B.page.has_more===!0,ue=B.backendLimitReached&&!E.truncated,ce=$&&U.length>0&&!ue?s+(u==="TREE_SELECTOR"?i:U.length):void 0,Te=y({...B.page,returned_count:U.length,has_more:$,next_offset:ce}),X=t.raw===!0&&Mn(l.raw,Ue)&&!E.truncated;return Ne({summary:y({cd_id:t.cd_id,card_type:u,chart_type:u==="CHART"?C(T(a.content).chartType):void 0,row_count:U.length,truncated:Te.has_more}),columns:E.columns,rows:U,page:Te,diagnostic:y({mode:Ls(u),card_type:u,endpoint:g,request:{offset:s,limit:i,requested_limit:r>i?r:void 0,filter_count:c.length,dynamic_param_count:d.length},request_count:1,partial_reason:E.truncated?"response_bytes":ue?"backend_limit":r>i&&$?"page_limit":void 0,response_byte_limit:E.truncated?ge:void 0,alignment_issue_count:_?.alignmentIssueCount||void 0,alignment_issues:_?.alignmentIssues.length?_.alignmentIssues:void 0,raw_returned:X,raw_omitted_reason:t.raw===!0&&!X?"response_bytes":void 0}),raw:X?l.raw:void 0,next_action:ue?"BI \u5DF2\u8FBE\u5230\u7B5B\u9009\u5668\u540E\u7AEF\u884C\u6570\u4E0A\u9650\uFF1B\u8BF7\u589E\u52A0 filters \u7F29\u5C0F\u67E5\u8BE2\u8303\u56F4\u540E\u4ECE offset=0 \u91CD\u65B0\u5206\u9875\u3002":r>i&&ce!==void 0?`\u8BF7\u6C42\u7684 limit=${r} \u5DF2\u6309\u5355\u9875\u4E0A\u9650 ${i} \u6267\u884C\uFF1B\u7EE7\u7EED\u8C03\u7528 query_card_data\uFF0C\u5E76\u4F20\u5165 offset=${ce} \u83B7\u53D6\u4E0B\u4E00\u9875\u3002`:void 0})}catch(r){return F({status:"error",diagnostic:ot("query_card_data",r)})}}async function Ps(e,t,n=[],r=[],i){i?.throwIfAborted();let s=await _t(e,`/api/card/${encodeURIComponent(t)}`,i);i?.throwIfAborted();let o=js(s);if(r.length&&o!=="CHART")return{unsupported:Ms(o)};let a=o==="SELECTOR"?Ds(s):void 0;if(a)return{unsupported:a};if(o==="TEXT")return{card:s,cardType:o,filters:[],dynamicParams:[]};let u=await Xs(e,s,n,i);i?.throwIfAborted();let c=Fs(n,u,o);if("unsupported"in c)return c;let d=await Vs(e,r,i);return i?.throwIfAborted(),"unsupported"in d?d:{card:s,cardType:o,filters:c.filters,dynamicParams:d.dynamicParams}}function Pn(e,t,n,r,i){return Ne({status:"response_too_large",summary:{cd_id:e,card_type:t,row_count:0,truncated:!0},columns:[],rows:[],page:y({returned_count:0,offset:n,limit:r,has_more:!0,total_count:i}),next_action:"\u5355\u884C\u6570\u636E\u5DF2\u8D85\u8FC7 MCP \u5185\u8054\u54CD\u5E94\u9884\u7B97\uFF0C\u8BF7\u4F7F\u7528 columns \u88C1\u526A\u5217\u3001\u51CF\u5C0F limit \u6216\u589E\u52A0\u7B5B\u9009\u6761\u4EF6\u540E\u91CD\u8BD5\u3002",diagnostic:{mode:"response_too_large",reason:"response_bytes",response_byte_limit:ge}})}function ks(e,t,n,r){return Ne({status:"response_too_large",summary:{cd_id:e,card_type:"TREE_SELECTOR",row_count:0,truncated:!0},columns:[],rows:[],page:y({returned_count:0,offset:t,limit:n,has_more:!0,total_count:r}),next_action:"\u6811\u7B5B\u9009\u5668\u5F53\u524D\u9875\u8D85\u8FC7 MCP \u5185\u8054\u54CD\u5E94\u9884\u7B97\uFF1B\u8BF7\u4FDD\u6301 offset \u4E0D\u53D8\u5E76\u51CF\u5C0F limit \u540E\u91CD\u8BD5\u3002",diagnostic:{mode:"response_too_large",reason:"response_bytes",response_byte_limit:ge}})}function Ne(e){let t=T(e.page),n=T(e.diagnostic),r=jn(t.next_offset),i=_e(t.has_more)===!0,s=C(e.status)||(i?"partial":"success");return S({...e,status:s},{text:y({status:s,summary:e.summary,page:e.page,next_action:e.next_action??(r===void 0?void 0:`\u7EE7\u7EED\u8C03\u7528 query_card_data\uFF0C\u5E76\u4F20\u5165 offset=${r} \u83B7\u53D6\u4E0B\u4E00\u9875\u3002`),diagnostic:y({mode:n.mode,endpoint:n.endpoint,partial_reason:n.partial_reason,response_byte_limit:n.response_byte_limit,raw_returned:n.raw_returned,raw_omitted_reason:n.raw_omitted_reason})})})}function xs(e,t,n,r,i,s){let o=T(t.content),a=$s(o),u=a?[{content:a}]:[],c=Un(u.slice(i,i+s),n),d=r===!0&&Mn(t,Ue),l=ge-An-(d?Ue:0),g=vn(c,l);if(g.oversizedFirstRow)return Pn(e,"TEXT",i,s,u.length);let h=g.rows,_=g.truncated||i+h.length<u.length,w=d&&!g.truncated;return Ne({summary:{cd_id:e,card_type:"TEXT",row_count:h.length,truncated:_},columns:g.columns,rows:h,page:y({returned_count:h.length,offset:i,limit:s,has_more:_,next_offset:_?i+h.length:void 0,total_count:u.length}),diagnostic:{mode:"text_card_content",card_type:"TEXT",endpoint:`/api/card/${encodeURIComponent(e)}`,raw_returned:w,raw_omitted_reason:r===!0&&!w?"response_bytes":void 0},raw:w?t:void 0})}function vs(e,t){return S({status:"unsupported",diagnostic:{tool:e,...t}})}function Ms(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 Ds(e){let t=T(e.content);if(C(t.selectorType).toUpperCase()!=="PARAMETER")return;let n=T(t.parameter);if(!(["STRING","TEXT"].includes(C(n.valueType).toUpperCase())&&_e(n.customize)!==!0&&C(T(t.source).dsId)!==""))return{capability:"unsupported_parameter_selector_data",message:"\u56FA\u5B9A\u9009\u9879\u3001\u81EA\u5B9A\u4E49\u503C\u6216\u975E\u6587\u672C\u53C2\u6570\u9009\u62E9\u5668\u6CA1\u6709\u53EF\u9760\u7684\u540E\u7AEF offset \u7EED\u9875\u8BED\u4E49\u3002",card_type:"SELECTOR",selector_type:"PARAMETER"}}function js(e){let t=C(e.cdType).toUpperCase();if(t==="SELECTOR"){let n=C(T(e.content).selectorType).toUpperCase();return n==="TREE"||n==="TREE_SELECTOR"?"TREE_SELECTOR":"SELECTOR"}return t==="TREE_SELECTOR"?"TREE_SELECTOR":t==="TEXT"?"TEXT":"CHART"}function Us(e,t,n,r,i,s=0){let o=encodeURIComponent(e);return t==="SELECTOR"?{endpoint:`/api/selector/${o}/data`,requestBody:y({fieldQuery:{offset:s,limit:n},filters:r.length?r:void 0})}:t==="TREE_SELECTOR"?{endpoint:`/api/treeSelector/${o}/data`,requestBody:y({offset:s,limit:n,filters:r.length?r:void 0})}:{endpoint:`/api/card/${o}/data`,requestBody:y({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 Ns(e,t,n){let r=await so(e,t.endpoint,t.requestBody,n);return{raw:r,data:qs(r),requests:[t]}}function Ls(e){return e==="SELECTOR"?"selector_card_data":e==="TREE_SELECTOR"?"tree_selector_card_data":"chart_card_data"}function qs(e){let t=T(e),n=T(t.data),r=T(T(t.content).data);return Object.keys(n).length?n:Object.keys(r).length?r:t}function Hs(e){if(!Object.keys(e).length)return{rows:[],alignmentIssueCount:0,alignmentIssues:[]};let t=T(e.row),n=T(e.column),r=H(t.data??t.values),i=H(e.data),o=oe(t.fields??t.meta).map((E,B)=>({header:mt(E)||`row_${B+1}`,shrinked:_e(E.isShrinkedInGroupTable)===!0})),a=Gs(n),u=o.filter(E=>!E.shrinked).length,c=r.reduce((E,B)=>Math.max(E,H(B).length),u),d=Array.from({length:c-u},(E,B)=>`row_extra_${B+1}`),l=i.reduce((E,B)=>Math.max(E,H(B).length),a.length),g=Array.from({length:l},(E,B)=>a[B]||`metric_${B+1}`),h=oo([...o.map(E=>E.header),...d,...g]),_=Math.max(r.length,i.length),w=[],P=[],j=0;for(let E=0;E<_;E+=1){let B=H(r[E]),U=H(i[E]),$=0,ue=o.map(we=>{if(we.shrinked)return null;let N=$<B.length?dt(B[$]):null;return $+=1,N}),ce=d.map((we,N)=>{let qt=$+N;return qt<B.length?dt(B[qt]):null}),Te=g.map((we,N)=>N<U.length?dt(U[N]):null),Ce=[...ue,...ce,...Te];if(!Ce.length)continue;let X=B.length!==u,Lt=U.length!==a.length;(X||Lt)&&(j+=1,P.length<20&&P.push(y({row_number:E+1,row_value_count:X?{expected:u,actual:B.length}:void 0,metric_value_count:Lt?{expected:a.length,actual:U.length}:void 0})));let Xr=Math.max(h.length,Ce.length);w.push(Object.fromEntries(Array.from({length:Xr},(we,N)=>[h[N]??`column_${N+1}`,Ce[N]??null])))}return{rows:w,alignmentIssueCount:j,alignmentIssues:P}}function Gs(e){let n=H(e.data??e.values).map((r,i)=>{let s=H(r).map(Dn).filter(Boolean).join("/");return s||mt(oe(e.fields??e.meta)[i])||`metric_${i+1}`}).filter(Boolean);return n.length?n:oe(e.fields??e.meta).map(mt).filter(Boolean)}function Js(e){return oe(e.result)}function $s(e){let n=H(T(e.body).blocks).map(r=>C(T(r).text)).filter(r=>r!=="");return n.length?n.join(`
5
+ `):C(e.text)}function Fs(e,t,n){let r=[];for(let i of e){let s=eo(t,i.field,i.fd_id);if("unsupported"in s)return{unsupported:s.unsupported};r.push(y({name:s.field.name,fdId:s.field.fdId,fdType:s.field.fdType,filterLevel:n==="CHART"?Zs(s.field.metaType):void 0,filterType:i.operator,filterValue:Ys(i)}))}return{filters:r}}async function Vs(e,t,n){if(!t.length)return{dynamicParams:[]};let r=new Map,i=[];for(let c of t){let d=c.parameter.trim();if(r.has(d))return{unsupported:{capability:"unsupported_dynamic_params",parameter:d,message:`\u52A8\u6001\u53C2\u6570\u88AB\u91CD\u590D\u6307\u5B9A\uFF1A${d}`}};i.push(d),r.set(d,C(c.value))}n?.throwIfAborted();let s=await _t(e,"/api/dynamic-parameter/query",n);n?.throwIfAborted();let o=[...zs(s),...Qs()],a=[],u=new Map;for(let c of i){let d=Ks(o,c);if("unsupported"in d)return{unsupported:d.unsupported};let l=io(d.param),g=se(l,"dpId","dp_id"),h=u.get(g);if(h)return{unsupported:{capability:"unsupported_dynamic_params",parameter:c,message:`\u52A8\u6001\u53C2\u6570 ${h} \u548C ${c} \u6307\u5411\u540C\u4E00\u4E2A dpId\uFF1A${g}`}};u.set(g,c),l.defaultValue=r.get(c)??"";let _=Ws(l,c);if("unsupported"in _)return{unsupported:_.unsupported};a.push(l)}return{dynamicParams:a}}function zs(e){if(Array.isArray(e))return e.map(T).filter(n=>Object.keys(n).length);let t=T(e);for(let n of["response","data"]){let r=H(t[n]).map(T).filter(i=>Object.keys(i).length);if(r.length)return r}return[]}function Qs(){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 Ks(e,t){let n=e.find(i=>se(i,"dpId","dp_id")===t);if(n)return{param:n};let r=e.filter(i=>se(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 Ws(e,t){let n=[se(e,"dpId","dp_id")?void 0:"dpId",se(e,"name")?void 0:"name",se(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 se(e,...t){for(let n of t){let r=C(e[n]);if(r)return r}return""}function Ys(e){return lt.has(e.operator)?[]:(e.values??[]).map(C)}async function Xs(e,t,n,r){let i=to(t);if(!n.some(a=>{let u=kn(i,a.field,a.fd_id);return!u||!C(u.fd_id)}))return i;let s=T(T(t.content).dsInfo),o=M(s.dsId,s.ds_id);if(!o)return i;try{r?.throwIfAborted();let a=await _t(e,`/api/data-source/${encodeURIComponent(o)}`,r);return r?.throwIfAborted(),[...i,...xn(a)]}catch{return r?.throwIfAborted(),i}}function Zs(e){return e.toUpperCase()==="METRIC"?"AGGREGATION":"DETAIL"}function eo(e,t,n){let r=kn(e,t,n);if(!r)return{unsupported:{capability:"unsupported_filter_field",parameter:t,message:`\u7B5B\u9009\u5B57\u6BB5\u65E0\u6CD5\u4ECE\u5361\u7247\u5173\u8054\u6570\u636E\u96C6\u89E3\u6790\uFF1A${t}`,supported_fields:e.map(c=>y({name:C(c.name),fd_id:C(c.fd_id),meta_type:C(c.meta_type)}))}};let i=C(r.name),s=C(r.fd_id),o=C(r.fd_type),a=C(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 kn(e,t,n){if(n)return e.find(i=>C(i.fd_id)===n||C(i.id)===n);let r=t.trim();return e.find(i=>[i.fd_id,i.id].map(C).includes(r))??En(e.filter(i=>C(i.name)===r))??En(e.filter(i=>C(i.alias)===r))}function En(e){return e.find(t=>C(t.fd_id))??e[0]}function to(e){let t=T(e.content),n=xn(T(t.dsInfo)),r=T(T(t.source).field);Object.keys(r).length&&n.push(pt(r));let i=T(T(t.meta).chartMain),s=T(i.zoneData);for(let[o,a]of Object.entries(s))n.push(...oe(a).map(u=>pt(u,o)));return no(n)}function xn(e){return oe(e.columns).map(t=>({...pt(t),meta_type:M(t.metaType,t.meta_type)??"DIM"}))}function pt(e,t){return y({name:M(e.name,e.title,e.originTitle,e.alias),alias:M(e.alias,e.title),id:C(e.id),fd_id:M(e.fdId,e.fd_id,e.id),fd_type:M(e.fdType,e.fd_type),meta_type:M(e.metaType,e.meta_type),zone_id:M(e.zoneId,e.zone_id,t)})}function no(e){let t=new Set;return e.filter(n=>{let r=M(n.fd_id,n.id,n.name,n.alias);return!r||t.has(r)?!1:(t.add(r),!0)})}function ro(e,t,n,r,i){let s=e==="CHART"?T(t.chartMain):t,o=jn(s.count),a=e==="TREE_SELECTOR"?r:i,u=o===void 0?void 0:n+a<o,c=e!=="CHART"&&_e(s.exceedLimit)===!0,d=c&&(o===void 0||n+a>=o),l=d||(e==="CHART"?_e(s.hasMoreData)??u??i===r:u??i===r);return{backendLimitReached:d,page:y({returned_count:i,offset:n,limit:r,has_more:l,next_offset:l&&!d&&i>0?n+(e==="TREE_SELECTOR"?r:i):void 0,total_count:c?void 0:o})}}function vn(e,t){let n=[],r=[],i=new Set,s=2,o=2;for(let a of e){let u=n.length?1:0,c=t-s-o-u,d=ft(a,c),l=Object.keys(a).filter(_=>!i.has(_)),g=0,h=!0;for(let _=0;_<l.length;_+=1){let w=r.length+_>0?1:0,P=t-s-o-u-d-g-w,j=gt(l[_],P);if(j>P){h=!1;break}g+=w+j}if(d>c||!h)return{rows:n,columns:r,truncated:!0,oversizedFirstRow:n.length===0};n.push(a),s+=u+d,o+=g;for(let _ of l)r.push(_),i.add(_)}return{rows:n,columns:r,truncated:!1,oversizedFirstRow:!1}}function Mn(e,t){return ft(e,t)<=t}function ft(e,t){if(t<0)return t+1;if(e==null)return 4;if(typeof e=="string")return gt(e,t);if(typeof e=="number"||typeof e=="boolean")return Buffer.byteLength(JSON.stringify(e));if(Array.isArray(e))return Bn(e.map(n=>[void 0,n]),t);if(typeof e=="object"){let n=Object.entries(e).filter(([,r])=>r!==void 0);return Bn(n,t)}return 4}function Bn(e,t){let n=2;for(let r=0;r<e.length;r+=1){let[i,s]=e[r];if(n+=r>0?1:0,i!==void 0){let a=gt(i,t-n);n+=a+1}let o=ft(s,t-n);if(n+=o,n>t)return t+1}return n}function gt(e,t){let n=2;for(let r of e){let i=r.codePointAt(0)??0;if(i===34||i===92?n+=2:i<=31||i>=55296&&i<=57343?n+=6:n+=Buffer.byteLength(r),n>t)return t+1}return n}function mt(e){return M(e.title,e.alias,e.originTitle,e.name,e.fdId,e.id)??""}function Dn(e){let t=T(e);return Object.keys(t).length?M(t.title,t.name,t.originTitle,t.alias,t.v,t.value)??"":C(e)}function dt(e){let t=T(e);return Object.keys(t).length?"v"in t?t.v:"value"in t?t.value:Dn(e):e}function oe(e){return Array.isArray(e)?e.map(T).filter(t=>Object.keys(t).length):[]}function H(e){return Array.isArray(e)?e:[]}function io(e){return JSON.parse(JSON.stringify(e))}function T(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function _t(e,t,n){return n?e.get(t,{signal:n}):e.get(t)}function so(e,t,n,r){return r?e.post(t,n,{signal:r}):e.post(t,n)}function C(e){return typeof e=="string"?e:e==null?"":String(e)}function M(...e){return e.map(C).find(t=>t.trim())?.trim()}function _e(e){return typeof e=="boolean"?e:void 0}function jn(e){return typeof e=="number"&&Number.isFinite(e)?e:void 0}function Un(e,t){return t?.length?e.map(n=>Object.fromEntries(t.map(r=>[r,n[r]??null]))):e}function oo(e){let t=e.map((i,s)=>i||`column_${s+1}`),n=new Set(t),r=new Set;return t.map(i=>{if(!r.has(i))return r.add(i),i;for(let s=2;;s+=1){let o=`${i}_${s}`;if(!n.has(o)&&!r.has(o))return r.add(o),o}})}import{createHash as ao}from"crypto";import{z as f}from"zod";var uo=6e4,Q=1e4,Nn=10*6e4,Le=new Map,qe=new Map,ht=new Map,yt=new Map,Ln=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")}),qn={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()},Hn={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()},mu={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:Ln.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()},Gn={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()},Jn={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:Ln.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()},$n={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")},fu={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")},Vn={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")},zn={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 Qn(e,t){let n=new v(e);try{let r=await n.listThemes({isInsight:t.is_insight});return S({themes:r,resolved_base_url:n.getResolvedBaseUrl(),tried_base_urls:n.getTriedBaseUrls()})}catch(r){return Ge(n,r,"listThemes")}}async function Kn(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 S({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 Ge(n,r,"query")}}async function Wn(e,t){let n=new v(e);try{let r=Xn({caller_scope:Zn(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=co(r);if(i)return S({...i,deduped:!0,retry_after_ms:Q,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=ht.get(r);if(s){let u=await s;return S({...u,deduped:!0,retry_after_ms:Q,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 lo(r,c),c}).finally(()=>{ht.delete(r)});ht.set(r,o);let a=await o;return S({...a,deduped:!1,retry_after_ms:Q,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 Ge(n,r,"insight.start")}}async function Yn(e,t){let n=new v(e);try{let r=Xn({caller_scope:Zn(e),message_id:t.message_id}),i=po(r);if(i){let l=bt(i.result),g=Tt(i.result,!0);return S({message_id:i.result.message_id,session_id:i.result.session_id,status:i.result.status,detail:It(i.result),question:i.result.question,answer:i.result.answer,throttled:!0,retry_after_ms:i.retryAfterMs,...l,next_action:g})}let s=yt.get(r);if(s){let l=await s,g=wt(l.status),h=bt(l),_=Tt(l,!0);return S({message_id:l.message_id,session_id:l.session_id,status:l.status,detail:It(l),question:l.question,answer:l.answer,throttled:!0,retry_after_ms:g?0:Q,...h,next_action:_})}let o=n.pollInsight({themeId:t.theme_id,themeName:t.theme_name,messageId:t.message_id}).then(l=>(mo(r,l),l)).finally(()=>{yt.delete(r)});yt.set(r,o);let a=await o,u=wt(a.status),c=bt(a),d=Tt(a,!1);return S({message_id:a.message_id,session_id:a.session_id,status:a.status,detail:It(a),question:a.question,answer:a.answer,throttled:!1,retry_after_ms:u?0:Q,...c,next_action:d,resolved_base_url:n.getResolvedBaseUrl(),tried_base_urls:n.getTriedBaseUrls()})}catch(r){return Ge(n,r,"insight.poll")}}function bt(e){return e.status!=="success"?{}:{final_result:{format:"markdown",content:er(e)}}}function It(e){return e.detail!=null?e.detail:e.status==="failure"||e.status==="stopped"?fo(e):e.detail}function Tt(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 co(e){He();let t=Le.get(e);if(!(!t||Date.now()-t.createdAt>=uo))return t.result}function lo(e,t){He(),Le.set(e,{createdAt:Date.now(),result:t})}function po(e){He();let t=qe.get(e);if(!t)return;let n=Date.now()-t.checkedAt,r=wt(t.result.status);if(!(!r&&n>=Q))return{result:t.result,retryAfterMs:r?0:Math.max(0,Q-n)}}function wt(e){return e==="success"||e==="failure"||e==="stopped"}function mo(e,t){He(),qe.set(e,{checkedAt:Date.now(),result:t})}function He(){let e=Date.now();for(let[t,n]of Le)e-n.createdAt>=Nn&&Le.delete(t);for(let[t,n]of qe)e-n.checkedAt>=Nn&&qe.delete(t)}function Xn(e){return JSON.stringify(Object.keys(e).sort().reduce((t,n)=>{let r=e[n];return typeof r<"u"&&(t[n]=r),t},{}))}function Zn(e){return e.BI_PAT?`pat:${Ct(e.BI_PAT)}`:e.BI_UID_TOKEN?`uid:${Ct(e.BI_UID_TOKEN)}`:`login:${Ct(`${e.BI_LOGIN_DOMAIN??""}\0${e.BI_LOGIN_ID??""}`)}`}function Ct(e){return ao("sha256").update(e).digest("hex").slice(0,16)}function er(e){let t=e.answer?.trim();if(t)return bo(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 fo(e){switch(e.status){case"success":return er(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 go(e,t){let n=[`| ${e.join(" | ")} |`,`|${e.map(()=>" --- ").join("|")}|`];for(let r of t)n.push(`| ${e.map((i,s)=>ho(_o(r[s]))).join(" | ")} |`);return n.join(`
6
+ `)}function _o(e){return e===null||typeof e>"u"||e===""?"-":String(e)}function ho(e){return e.replaceAll(`\r
7
7
  `,"<br>").replaceAll(`
8
- `,"<br>").replaceAll("\r","<br>").replaceAll("|","\\|")}function Ds(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 js(e){let t=/```GuanViz\.json\n([\s\S]*?)\n```/g;return e.replace(t,(n,r)=>Us(r)??n)}function Us(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=Ls(t.viz_config),o=qs(i,r,s),a=r.map(d=>i.map((p,g)=>Hs(d[g],s.get(p),o.get(p)))),u=vs(i,a),c=Ds(!!t.data_info?.truncated,t.data_info?.row_limit);return c?`${u}
8
+ `,"<br>").replaceAll("\r","<br>").replaceAll("|","\\|")}function yo(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 bo(e){let t=/```GuanViz\.json\n([\s\S]*?)\n```/g;return e.replace(t,(n,r)=>Io(r)??n)}function Io(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=Co(t.viz_config),o=wo(i,r,s),a=r.map(d=>i.map((l,g)=>Eo(d[g],s.get(l),o.get(l)))),u=go(i,a),c=yo(!!t.data_info?.truncated,t.data_info?.row_limit);return c?`${u}
9
9
 
10
- ${c}`:u}catch{return}}var ut=new Map([["k",1e3],["K",1e3],["M",1e6],["B",1e9],["\u4E07",1e4],["\u4EBF",1e8]]),Ns=[[1e8,"\u4EBF"],[1e4,"\u4E07"]];function Ls(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 qs(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=xn(c[i]);typeof d=="number"&&(a=Math.max(a,Math.abs(d/Mn(o))))}let u=Vs(a);u&&r.set(s,u)}return r}function Hs(e,t,n){if(!t)return e;let r=xn(e);return typeof r!="number"?e:Gs(r,t,n)}function xn(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 Gs(e,t,n){let r=Mn(t),{unit:i,shouldScale:s}=Js(t,n),o=s&&i?ut.get(i)??1:1,a=e/r/o,u=$s(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 Mn(e){if(e.showPrefixUnit!==!1&&typeof e.prefixUnit=="string"&&e.prefixUnit!=="auto"&&ut.has(e.prefixUnit))return 1;let t=Number(e.divideDataBy??1);return Number.isFinite(t)&&t!==0?t:1}function Js(e,t){return e.showPrefixUnit===!1?{unit:"",shouldScale:!1}:e.prefixUnit==="auto"?{unit:t??"",shouldScale:!0}:typeof e.prefixUnit=="string"&&ut.has(e.prefixUnit)?{unit:e.prefixUnit,shouldScale:!0}:{unit:"",shouldScale:!1}}function $s(e){return typeof e!="number"||!Number.isFinite(e)?2:Math.max(0,Math.min(100,Math.trunc(e)))}function Vs(e){return Ns.find(([t])=>e>=t)?.[1]??""}function Oe(e,t,n){let r=Fs(e,t,n);return L({error:"chatbi_request_failed",requested_operation:n,...r,tried_base_urls:r.tried_base_urls??e.getTriedBaseUrls()})}function Fs(e,t,n){return t instanceof O?t.detail:e.getLastError()??{operation:n,detail:t instanceof Error?t.message:String(t)}}import{z as ct}from"zod";var Dn={dsId:ct.string().min(1).describe("\u6570\u636E\u96C6 ID\u3002")},jn={cdId:ct.string().min(1).describe("\u5361\u7247 ID\u3002")},Un={pageId:ct.string().min(1).describe("\u9875\u9762/\u4EEA\u8868\u677F ID\u3002")};async function Nn(e,t){let n=await e.get(`/api/data-source/${encodeURIComponent(t.dsId)}`);return D(n)}async function Ln(e,t){let n=await e.get(`/api/card/${encodeURIComponent(t.cdId)}`);return D(n)}async function qn(e,t){let n=await e.get(`/api/page/${encodeURIComponent(t.pageId)}`);return D(n)}import{z as ae}from"zod";var ue=ae.string().trim().min(1),zs=ae.object({name:ue.describe("CTE \u540D\u79F0\uFF0C\u4E0D\u80FD\u4E0E\u4EFB\u4E00\u8F93\u5165\u6570\u636E\u96C6\u7684\u7CBE\u786E\u540D\u79F0/name \u76F8\u540C\u3002"),query:ue.describe("\u8BE5 CTE \u7684\u67E5\u8BE2\u4F53\uFF0C\u4E0D\u5305\u542B CTE \u540D\u79F0\u548C AS \u5916\u5C42\u3002")}).strict(),Hn={query:ue.describe("\u5B8C\u6574\u7684\u5355\u6761\u67E5\u8BE2 SQL\uFF0C\u4EC5\u9650 SELECT/WITH\u3002inputs \u53EA\u7ED1\u5B9A\u6570\u636E\u96C6\uFF0CdsId\u3001fdId \u6216 input0 \u4E0D\u80FD\u76F4\u63A5\u4F5C\u4E3A\u8868\u540D\uFF1B\u901A\u5E38\u5148\u4F7F\u7528 get_dataset_detail \u8FD4\u56DE\u7684\u6570\u636E\u96C6\u540D\u79F0/name \u548C columns[].name\u3002\u82E5 TABLE_OR_VIEW_NOT_FOUND \u7684 diagnostic.tableBindings[] \u63D0\u4F9B sqlReference\uFF0C\u6309\u8BE5\u503C\u4FEE\u6B63\u8868\u5F15\u7528\uFF1B\u5355\u6570\u636E\u96C6 Spark \u67E5\u8BE2\u53EF\u80FD\u8FD4\u56DE __THIS__\u3002\u4E2D\u6587\u6216\u7279\u6B8A\u5B57\u7B26\u540D\u79F0\u7528\u53CD\u5F15\u53F7\u3002\u8FD4\u56DE\u884C\u6570\u7531 MCP \u63A7\u5236\uFF0C\u901A\u5E38\u65E0\u9700\u81EA\u884C\u6DFB\u52A0 LIMIT\u3002"),inputs:ae.array(ue).describe("query \u5B9E\u9645\u5F15\u7528\u7684\u5168\u90E8\u6570\u636E\u96C6 ID\uFF0C\u7528\u4E8E BI \u7ED1\u5B9A\u548C\u6743\u9650\u6821\u9A8C\uFF0C\u4E0D\u80FD\u4F5C\u4E3A SQL \u8868\u540D\u3002\u6BCF\u4E2A FROM/JOIN \u6570\u636E\u96C6\u90FD\u8981\u4F20\u5BF9\u5E94 ID\uFF0C\u4E0D\u8981\u591A\u4F20\u6216\u91CD\u590D\uFF1BSELECT 1 \u7B49\u65E0\u8868\u67E5\u8BE2\u4F20\u7A7A\u6570\u7EC4\u3002\u540E\u7AEF\u9ED8\u8BA4\u6700\u591A\u652F\u6301 10 \u4E2A\u4E0D\u540C\u6570\u636E\u96C6\uFF0C\u5B9E\u9645\u9650\u5236\u4EE5\u90E8\u7F72\u914D\u7F6E\u4E3A\u51C6\u3002"),queryStructure:ae.object({ctes:ae.array(zs).min(1),mainQuery:ue.describe("\u79FB\u9664\u9876\u5C42 WITH/CTE \u5B9A\u4E49\u540E\u7684\u6700\u7EC8 SELECT \u67E5\u8BE2\u3002")}).strict().optional().describe("\u4EC5\u5F53\u5B8C\u6574 query \u662F\u9876\u5C42 WITH/CTE \u67E5\u8BE2\u65F6\u63D0\u4F9B\u3002query \u4ECD\u4FDD\u7559\u5B8C\u6574\u539F\u59CB SQL\uFF1Bctes \u548C mainQuery \u662F\u540C\u4E00 SQL \u7684\u7ED3\u6784\u5316\u62C6\u5206\u3002\u6CA1\u6709 CTE \u65F6\u7701\u7565\u6574\u4E2A\u5B57\u6BB5\u3002")};async function Gn(e,t,n){try{await jt(e,t,"executeSqlQuery");let r=await e.post("/api/data-source/execute-sql-query",{...n,query:n.query.trim(),inputs:[...new Set(n.inputs.map(i=>i.trim()))],limit:t.BI_MAX_ROWS,disableCache:!0});return D({maxRowsHint:t.BI_MAX_ROWS,result:r})}catch(r){if(Qs(r))return oe("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"});if(Ks(r)){let i=await Ys(e,n.inputs),s=Jn(r)&&i.length===1,o=i.map(a=>s?{...a,sqlReference:"__THIS__"}:a);return oe("execute_sql_query",r,{hint:Ws(r,s),tableBindings:o.length>0?o:void 0})}throw r}}function Qs(e){return e instanceof Error&&e.message.includes("POST /api/data-source/execute-sql-query HTTP 404")}function Ks(e){return e instanceof Error&&e.message.includes("TABLE_OR_VIEW_NOT_FOUND")}function Jn(e){return e instanceof Error&&e.message.includes("SparkViewDataset")}function Ws(e,t){return t?"\u8BE5\u8BF7\u6C42\u8D70 Spark \u6570\u636E\u96C6\u6267\u884C\u94FE\u8DEF\u3002\u4FDD\u6301 inputs \u4E0D\u53D8\uFF0C\u5C06 SQL \u4E2D\u8BE5\u6570\u636E\u96C6\u7684 FROM/JOIN \u8868\u5F15\u7528\u6539\u4E3A diagnostic.tableBindings[0].sqlReference\uFF08__THIS__\uFF09\u540E\u91CD\u8BD5\uFF1B\u4E0D\u8981\u518D\u6B21\u4F7F\u7528\u76F8\u540C\u7684\u663E\u793A\u540D\u79F0\u3002":Jn(e)?"\u8BE5\u8BF7\u6C42\u8D70 Spark \u591A\u6570\u636E\u96C6\u6267\u884C\u94FE\u8DEF\uFF0C\u6570\u636E\u96C6\u663E\u793A\u540D\u79F0\u4E0D\u4FDD\u8BC1\u7B49\u4E8E\u5DF2\u6CE8\u518C\u7684 SQL \u5173\u7CFB\u540D\uFF0CMCP \u65E0\u6CD5\u53EF\u9760\u63A8\u5BFC\u5168\u90E8\u8868\u5F15\u7528\uFF1B\u8BF7\u52FF\u539F\u6837\u91CD\u590D\u8C03\u7528\uFF0C\u9700\u8981\u540E\u7AEF\u63D0\u4F9B\u7A33\u5B9A\u522B\u540D\u3002":"\u6570\u636E\u96C6 ID \u53EA\u7528\u4E8E BI \u7ED1\u5B9A\u548C\u6388\u6743\uFF0C\u4E0D\u80FD\u76F4\u63A5\u4F5C\u4E3A\u8868\u540D\u3002\u53EF\u6838\u5BF9 diagnostic.tableBindings[].displayName\uFF0C\u4F46\u663E\u793A\u540D\u79F0\u4E0D\u4FDD\u8BC1\u662F\u5F53\u524D\u6267\u884C\u94FE\u8DEF\u53EF\u7528\u7684 SQL \u5F15\u7528\u3002"}async function Ys(e,t){let n=[...new Set(t.map(r=>r.trim()))];return Promise.all(n.map(async r=>{try{let i=await e.get(`/api/data-source/${encodeURIComponent(r)}`);if(!i||typeof i!="object"||!("name"in i)||typeof i.name!="string")return{dsId:r};let s=i.name.trim();return s?{dsId:r,displayName:s}:{dsId:r}}catch{return{dsId:r}}}))}import{z as U}from"zod";var $n={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 Vn(e,t){let{cardType:n,...r}=t,i={...r,specificResourceFilters:n?{cardType:n}:void 0},s=await e.post("/api/global-search",i);return D(s)}import{z as m}from"zod";var gt=m.enum(["asc","desc"]),Xs=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"]),Fn=new Set(["BT","CLOSE_BT_OPEN","OPEN_BT_CLOSE","OPEN_BT_OPEN"]),lt=new Set(["IS_NULL","NOT_NULL"]),er=m.object({field:m.string().min(1).describe("\u7B5B\u9009\u5B57\u6BB5\u540D\u79F0\u6216\u5B57\u6BB5 ID\u3002"),operator:Xs.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;lt.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`}),Fn.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`}),!Fn.has(e.operator)&&!lt.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`})}),Zs=m.object({field:m.string().min(1).describe("\u6392\u5E8F\u5B57\u6BB5\u540D\u79F0\u6216\u5B57\u6BB5 ID\u3002"),direction:gt.describe("\u6392\u5E8F\u65B9\u5411\u3002")}),eo=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:gt.optional(),rank_dim:m.string().min(1).optional()}),tr={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")},nr={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")},rr={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")},ir={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(er).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(Zs).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:eo.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")},sr={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")},or={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")},ar={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(er).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:gt.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")},q={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 ur(e,t,n){let r=new j(e,t);try{let i=n.project_id?[n.project_id]:await to(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(...no(u)),s.length>=n.limit)break}let o=Oo(s.map(pt),"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 $(i,"search_metrics")}}async function cr(e,t,n){let r=new j(e,t);try{try{let i=await r.listMetricFullTree({projectId:n.project_id,keyword:n.keyword});return B({summary:{source:"full-tree"},tree:io(i),raw:n.raw?i:void 0})}catch(i){let s=n.project_id?[{id:n.project_id}]:await gr(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:so(c,u)})}return B({summary:{source:"directory-fallback",fallback_reason:i instanceof Error?i.message:String(i)},tree:o})}}catch(i){return $(i,"list_metric_catalog")}}async function dr(e,t,n){let r=new j(e,t);try{let i=await r.getMetricDetail(n.metric_id),s=oo(i),o,a;if(!n.brief){let u=l(i.uniformResourceType)||"METRIC_PLATFORM_METRIC";try{o=ao(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 $(i,"get_metric_detail")}}async function lr(e,t,n){let r=new j(e,t);try{let i=await r.getMetricDetail(n.metric_id);if(!n.advanced_calc){let a=Qn(i,n);if("unsupported"in a)return M("query_metric_data",a.unsupported);let u=async p=>{let g=await r.getCardEditSession(a.cardId),y=l(g.sessionId);if(!y)throw new Error("\u6307\u6807\u5361\u7247\u9884\u89C8\u4F1A\u8BDD\u54CD\u5E94\u7F3A\u5C11 sessionId\u3002");return a.dimensions.length&&await uo(r,a.cardId,y,a.dimensions),{raw:await r.queryCardEditData(a.cardId,y,p),sessionId:y}};if(n.combine_type==="OR"&&(n.filters?.length??0)>1){let p=[],g=[];for(let y of n.filters??[]){let h=Qn(i,{...n,combine_type:"AND",filters:[y]});if("unsupported"in h)return M("query_metric_data",h.unsupported);let{raw:S}=await u(h.body);g.push(S),p.push(...Kn(S))}return Ae(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 Ae(i,Kn(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=zn(i,n);if("unsupported"in s)return M("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=zn(i,{...n,combine_type:"AND",filters:[c]});if("unsupported"in d)return M("query_metric_data",d.unsupported);let p=await r.queryMetricData(d.input);u.push(p),a.push(...ce(p))}return Ae(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 Ae(i,ce(o),n,{mode:"metric_data_v2",request_body:s.input},n.raw?o:void 0)}catch(i){return Ro(i)?M("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}):$(i,"query_metric_data")}}async function pr(e,t,n){let r=new j(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=ro(i).map(br).slice(0,n.limit);return B({summary:{keyword:n.keyword,count:s.length},items:s})}catch(i){return $(i,"search_metric_trees")}}async function mr(e,t,n){let r=new j(e,t);try{let i=await r.getMetricTreeDetail(n.metric_tree_id);return B({detail:_o(i),raw:n.raw?i:void 0})}catch(i){return $(i,"get_metric_tree_detail")}}async function fr(e,t,n){let r=new j(e,t);try{if(n.target==="dimension"&&!n.dimension&&!n.dimension_fd_id)return M("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 M("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=de(o),u=_t(n.filters??[],a);if("unsupported"in u)return M("query_metric_tree_attribution",u.unsupported);let c=u.filters,d=ho(i,n);if("unsupported"in d)return M("query_metric_tree_attribution",d.unsupported);if(n.target==="metric"){let h=Io(i,d.value,c),S=await r.queryMetricTreeDecompose(n.metric_tree_id,h);return dt(i,"metric",yo(S),n,n.raw?S:void 0)}if(n.target==="dimension"){let h=te(a,n.dimension,n.dimension_fd_id);if(!h)return M("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=Yn(i,h,d.value,c,n.limit,n.sort),P=await r.queryMetricTreeDrill(n.metric_tree_id,S);return dt(i,"dimension",Xn(P,l(h.name)),n,n.raw?P:void 0)}let p=bo(i,a,n.scan_dimensions,n.exclude_dimensions);if(!p.length)return M("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=[],y=[];for(let h of p){let S=Yn(i,h,d.value,c,n.group_limit,n.sort),P=await r.queryMetricTreeDrill(n.metric_tree_id,S);y.push({dimension:l(h.name),raw:P}),g.push(...Xn(P,l(h.name)).slice(0,n.group_limit))}return dt(i,"scan",g,n,n.raw?y:void 0,{scanned_dimensions:p.map(h=>l(h.name))})}catch(i){return $(i,"query_metric_tree_attribution")}}async function to(e){return(await gr(e)).map(t=>l(t.id)).filter(Boolean)}async function gr(e){return R(await e.listProjects()).map(_).filter(Boolean)}function no(e){let t=_(e);return R(t.contents??t.items??t.data)}function ro(e){let t=_(e);return R(t.data??t.contents??t.items)}function pt(e){return I({metric_id:l(e.id),name:l(e.name),project_id:l(e.projectId),dir_id:w(e.parentDirId,e.dirId),status:l(e.status),sub_type:l(e.subType),description:l(e.desc),dataset:Er(e.dsInfo),statistics:e.statisticsData,creator:Pe(e.creator),business_owner:Pe(e.businessOwner),updated_at:l(e.utime),raw:e})}function io(e){return R(e).map(t=>_r(t,void 0))}function _r(e,t){let n=!!e.isMetric,r=l(e.id),i=!t&&!n?r:t;return I({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:R(e.children).map(s=>_r(s,i))})}function so(e,t){let n=_(e);return l(n.id)?[mt(n,t)]:R(n.contents??n.children).map(r=>mt(r,t))}function mt(e,t){return I({id:l(e.id),name:l(e.name),type:"directory",project_id:t,dir_id:l(e.id),parent_id:w(e.parentDirId,e.parentId),can_use:A(e.canUse),can_manage:A(e.canManage),metric_count:Zn(e.metricCnt),all_metric_count:Zn(e.allMetricCnt),children:R(e.contents??e.children).map(n=>mt(n,t))})}function oo(e){return I({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:w(e.parentDirId,e.dirId),dir_path:Br(e.dirPath),dataset:Er(e.dsInfo),source_fields:R(e.fdInfos).map(ke),aggregation:w(e.aggrType,e.aggregationType),formula:w(e.formula,e.expression),derive_setting:e.deriveSetting,format:e.format,applicable_dimensions:de(e),time_dimension:_(e.timeDim)?ke(_(e.timeDim)):void 0,business_attributes:R(e.bizAttrs).map(So),business_owner:Pe(e.businessOwner),creator:Pe(e.creator),referenced_metrics:R(e.referencedMetrics).map(pt),base_metric:_(e.baseMetric)?pt(_(e.baseMetric)):void 0,linked_metric_id:l(e.linkMetricId),statistics:e.statisticsData,permissions:I({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 ao(e){let t=_(e);return I({current:t.crtNode,upstream:t.backwardAtlas,downstream:t.forwardAtlas})}function zn(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=de(e),s=[...i,...Tr(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(To(p))}let a=lo(e,i,t.advanced_calc);if("unsupported"in a)return{unsupported:a.unsupported};let u=_t(t.filters??[],s);if("unsupported"in u)return{unsupported:u.unsupported};let c=hr(t.sort??[],s);return"unsupported"in c?{unsupported:c.unsupported}:{input:{projectId:r,metricId:t.metric_id,metricName:n,metricItems:[I({name:n,alias:po(n,t.advanced_calc),advCalc:a.value})],dimensions:o,filters:u.filters,sorting:c.sorting,limit:t.limit}}}function Qn(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=[...de(e),...Tr(e)],a=[];for(let g of t.dimensions??[]){let y=te(o,g);if(!y||l(y.meta_type).toUpperCase()==="METRIC")return{unsupported:{capability:"unsupported_dimension",parameter:g,supported_dimensions:de(e)}};a.push(Co(y))}let u=_t(t.filters??[],o);if("unsupported"in u)return{unsupported:u.unsupported};let c=u.filters,d=hr(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:I({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 uo(e,t,n,r){let i=wr(await e.getCardEditMeta(t))??{},s=co(i);s.row=r,s.sorting=[],await e.modifyCardEditMeta(t,n,i)}function co(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 lo(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=mo(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:I({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:I({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 po(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 mo(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 _t(e,t){let n=[];for(let r of e){let i=Ir(t,r.field,r.fd_id,"filter");if("unsupported"in i)return{unsupported:i.unsupported};n.push(I({name:i.field.name,fdId:i.field.fdId,fdType:i.field.fdType,metaType:i.field.metaType,filterType:r.operator,filterValue:fo(r)}))}return{filters:n}}function fo(e){return lt.has(e.operator)?[]:e.values??[]}function hr(e,t){let n=[];for(let r of e){let i=Ir(t,r.field,void 0,"sort");if("unsupported"in i)return{unsupported:i.unsupported};n.push(I({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 Ir(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=>I({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 Ae(e,t,n,r,i){let s=Eo(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:Cr(s),rows:s,diagnostic:r,raw:i})}function ce(e){let t=_(e),n=_(t.data)??t,r=R(n.values??n.rows??t.values??t.rows);if(r.length)return r;let i=R(n.columns??t.columns).map(o=>l(_(o)?.name??o)).filter(Boolean),s=R(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 Kn(e){let t=_(e),n=_(t.data)??t,r=_(n.chartMain??t.chartMain??_(_(t.content).data).chartMain);if(!Object.keys(r).length)return ce(e);let i=_(r.row),s=_(r.column),o=R(i.fields),a=J(i.data),u=J(r.data),c=go(s),d=o.map(ft).filter(Boolean),p=Bo([...d,...c]),g=Math.max(a.length,u.length),y=[];for(let h=0;h<g;h+=1){let S=[];S.push(...J(a[h]).map(Wn)),S.push(...J(u[h]).map(Wn)),S.length&&y.push(Object.fromEntries(S.map((P,F)=>[p[F]??`column_${F+1}`,P])))}return y}function go(e){let n=J(e.data).map((r,i)=>{let s=J(r).map(yr).filter(Boolean).join("/");return s||ft(R(e.fields)[i])||`metric_${i+1}`}).filter(Boolean);return n.length?n:R(e.fields).map(ft).filter(Boolean)}function ft(e){return w(e.alias,e.title,e.originTitle,e.name,e.fdId,e.id)??""}function yr(e){let t=_(e);return Object.keys(t).length?w(t.title,t.name,t.originTitle,t.alias,t.v,t.value)??"":l(e)}function Wn(e){let t=_(e);return Object.keys(t).length?"v"in t?t.v:"value"in t?t.value:yr(e):e}function br(e){return I({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:Br(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 _o(e){let t=_(e.config)??{};return I({...br(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:I({can_use:A(e.canUse),can_manage:A(e.canManage)})})}function ho(e,t){let n=_(e.config)??{},r=t.time_comparison_json??wr(_(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=wo(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 Io(e,t,n){let r=_(e.config)??{},i=_(r.metricDecompositionContent)??{};return I({timeComparisonSetting:t.setting,comparisonEnabled:t.comparisonEnabled,contributionCalcEnabled:!1,metricDecomposeInfo:{metricRelationTree:i.metricRelationTree,filters:n}})}function Yn(e,t,n,r,i,s){return I({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 yo(e){return ce(e).map(t=>I({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 Xn(e,t){return ce(e).map((n,r)=>I({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 dt(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:Cr(o),rows:o,raw:i})}function bo(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=J(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 de(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(ke(i));for(let u of R(i.subs))r(u)}};for(let i of R(e.applicableDims))r(i);return r(_(e.timeDim)),n}function Tr(e){let t=R(e.fdInfos).map(ke);return l(e.name)&&!t.some(n=>l(n.name)===l(e.name))&&t.push(I({id:w(e.id,e.name),fd_id:l(e.id),name:l(e.name),fd_type:w(t[0]?.fd_type,"DOUBLE"),meta_type:"METRIC"})),t}function ke(e){return I({id:w(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 To(e){return I({name:l(e.name),alias:l(e.name),fdType:w(e.fd_type),metaType:"DIM",key:w(e.fd_id,e.id,e.name),fdId:w(e.fd_id),dsId:w(e.ds_id),granularity:w(e.granularity)})}function Co(e){return I({name:l(e.name),alias:w(e.name),fdType:w(e.fd_type),metaType:"DIM",key:w(e.fd_id,e.id,e.name),fdId:w(e.fd_id),dsId:w(e.ds_id),granularity:w(e.granularity)})}function Eo(e,t){return t?.length?e.map(n=>Object.fromEntries(t.map(r=>[r,n[r]]))):e}function Cr(e){return[...new Set(e.flatMap(t=>Object.keys(t)))]}function Bo(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 wo(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 Er(e){let t=_(e);if(t)return I({dataset_id:l(t.dsId),name:l(t.name)})}function Pe(e){let t=_(e);if(t)return I({user_id:w(t.uId,t.id),name:l(t.name),deleted:A(t.isDel)})}function So(e){return I({id:l(e.id),name:l(e.name),type:l(e.valueType),values:R(e.values)})}function Br(e){return R(e).map(t=>l(t.dirName??t.name)).filter(Boolean)}function M(e,t){return B({status:"unsupported",diagnostic:{tool:e,...t}})}function $(e,t){return e instanceof H?L({operation:t,diagnostic:e.detail}):L({operation:t,message:e instanceof Error?e.message:String(e)})}function Ro(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 R(e){return Array.isArray(e)?e.map(_).filter(Boolean):[]}function J(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 w(...e){return e.map(l).find(t=>t.trim())?.trim()}function A(e){return typeof e=="boolean"?e:void 0}function Zn(e){return typeof e=="number"&&Number.isFinite(e)?e:void 0}function Oo(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 wr(e){return e?JSON.parse(JSON.stringify(e)):void 0}function Sr(e,t,n,r,i={}){let s=i.usageTelemetry??new Ce({config:n,appVersion:i.appVersion??"unknown"}),o=(u,c,d)=>{let p=e.registerTool,g=Kt(u,d,s),y=async(...h)=>{try{return await g(...h)}catch(S){return oe(u,S)}};p.call(e,u,c,y)},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:Wt},(u,c)=>t.run(({client:d,config:p})=>Yt(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:Cn,outputSchema:In},(u,c)=>t.run(({config:d})=>Sn(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:En,outputSchema:yn},(u,c)=>t.run(({config:d})=>Rn(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:bn},(u,c)=>t.run(({config:d})=>On(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:wn,outputSchema:Tn},(u,c)=>t.run(({config:d})=>An(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:$n},(u,c)=>t.run(({client:d})=>Vn(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:tr,outputSchema:q},(u,c)=>t.run(({client:d,config:p})=>ur(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:nr,outputSchema:q},(u,c)=>t.run(({client:d,config:p})=>cr(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:rr,outputSchema:q},(u,c)=>t.run(({client:d,config:p})=>dr(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:ir,outputSchema:q},(u,c)=>t.run(({client:d,config:p})=>lr(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:sr,outputSchema:q},(u,c)=>t.run(({client:d,config:p})=>pr(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:or,outputSchema:q},(u,c)=>t.run(({client:d,config:p})=>mr(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:ar,outputSchema:q},(u,c)=>t.run(({client:d,config:p})=>fr(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\u3002\u82E5\u672C\u8F6E\u5C1A\u672A\u8BFB\u53D6\u6570\u636E\u96C6\u8BE6\u60C5\uFF0C\u5148\u8C03\u7528 get_dataset_detail \u83B7\u53D6\u6570\u636E\u96C6\u540D\u79F0/name \u548C columns[].name\u3002inputs \u53EA\u4F20\u5BF9\u5E94\u6570\u636E\u96C6 ID\uFF0C\u4E0D\u5F97\u628A dsId\u3001fdId \u6216 input0 \u5F53\u8868\u540D\uFF1BSQL \u901A\u5E38\u5148\u7528\u6570\u636E\u96C6\u540D\u79F0\u4F5C\u4E3A FROM/JOIN \u8868\u5F15\u7528\u3002\u82E5 TABLE_OR_VIEW_NOT_FOUND \u7684 diagnostic.tableBindings[] \u63D0\u4F9B sqlReference\uFF0C\u5FC5\u987B\u6309\u8BE5\u503C\u4FEE\u6B63\uFF1B\u5355\u6570\u636E\u96C6 Spark \u67E5\u8BE2\u53EF\u80FD\u8FD4\u56DE\u7A33\u5B9A\u5F15\u7528 __THIS__\uFF0C\u4E0D\u8981\u539F\u6837\u91CD\u590D\u5931\u8D25 SQL\u3002\u4E2D\u6587\u6216\u7279\u6B8A\u5B57\u7B26\u540D\u79F0\u7528\u53CD\u5F15\u53F7\uFF0C\u4F8B\u5982 SELECT * FROM \`\u9500\u552E\u6570\u636E\u96C6\`\u3002\u65E0\u8868\u67E5\u8BE2\u4F20 inputs: []\u3002\u591A\u6570\u636E\u96C6\u67E5\u8BE2\u8981\u6C42\u6570\u636E\u96C6\u80FD\u5728\u540C\u4E00\u6267\u884C\u94FE\u8DEF\u4E2D\u67E5\u8BE2\u3002\u8FD4\u56DE\u884C\u6570\u7531 BI_MAX_ROWS \u63A7\u5236\uFF0C\u5F53\u524D\u4E3A ${n.BI_MAX_ROWS} \u884C\uFF0C\u65E0\u9700\u81EA\u884C\u6DFB\u52A0 LIMIT\u3002`,inputSchema:Hn},(u,c)=>t.run(({client:d,config:p})=>Gn(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:Dn},(u,c)=>t.run(({client:d})=>Nn(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:jn},(u,c)=>t.run(({client:d})=>Ln(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:sn,outputSchema:on},(u,c)=>t.run(({client:d})=>an(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:Un},(u,c)=>t.run(({client:d})=>qn(d,u),c,"get_page_info")))}var jo=Ao(import.meta.url),Ct=jo("../package.json"),It=class{record(t){console.error(JSON.stringify({runtime:Jo(t)}))}};function Or(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 bt(e,r):new yt(e,r)}var Uo=`\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 Et=new Map([["k",1e3],["K",1e3],["M",1e6],["B",1e9],["\u4E07",1e4],["\u4EBF",1e8]]),To=[[1e8,"\u4EBF"],[1e4,"\u4E07"]];function Co(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 wo(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=tr(c[i]);typeof d=="number"&&(a=Math.max(a,Math.abs(d/nr(o))))}let u=Ao(a);u&&r.set(s,u)}return r}function Eo(e,t,n){if(!t)return e;let r=tr(e);return typeof r!="number"?e:Bo(r,t,n)}function tr(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 Bo(e,t,n){let r=nr(t),{unit:i,shouldScale:s}=Ro(t,n),o=s&&i?Et.get(i)??1:1,a=e/r/o,u=So(t.decimalPlaces),c=t.useThousandsSeparator?a.toLocaleString("en-US",{minimumFractionDigits:u,maximumFractionDigits:u}):a.toFixed(u),d=i&&t.showPrefixUnit!==!1?i:"",l=t.showSuffix===!1||typeof t.suffix!="string"?"":t.suffix;return`${c}${d}${l}`}function nr(e){if(e.showPrefixUnit!==!1&&typeof e.prefixUnit=="string"&&e.prefixUnit!=="auto"&&Et.has(e.prefixUnit))return 1;let t=Number(e.divideDataBy??1);return Number.isFinite(t)&&t!==0?t:1}function Ro(e,t){return e.showPrefixUnit===!1?{unit:"",shouldScale:!1}:e.prefixUnit==="auto"?{unit:t??"",shouldScale:!0}:typeof e.prefixUnit=="string"&&Et.has(e.prefixUnit)?{unit:e.prefixUnit,shouldScale:!0}:{unit:"",shouldScale:!1}}function So(e){return typeof e!="number"||!Number.isFinite(e)?2:Math.max(0,Math.min(100,Math.trunc(e)))}function Ao(e){return To.find(([t])=>e>=t)?.[1]??""}function Ge(e,t,n){let r=Oo(e,t,n);return F({error:"chatbi_request_failed",requested_operation:n,...r,tried_base_urls:r.tried_base_urls??e.getTriedBaseUrls()})}function Oo(e,t,n){return t instanceof k?t.detail:e.getLastError()??{operation:n,detail:t instanceof Error?t.message:String(t)}}import{z as Bt}from"zod";var rr={dsId:Bt.string().min(1).describe("\u6570\u636E\u96C6 ID\u3002")},ir={cdId:Bt.string().min(1).describe("\u5361\u7247 ID\u3002")},sr={pageId:Bt.string().min(1).describe("\u9875\u9762/\u4EEA\u8868\u677F ID\u3002")};async function or(e,t){let n=await e.get(`/api/data-source/${encodeURIComponent(t.dsId)}`);return L(n)}async function ar(e,t){let n=await e.get(`/api/card/${encodeURIComponent(t.cdId)}`);return L(n)}async function ur(e,t){let n=await e.get(`/api/page/${encodeURIComponent(t.pageId)}`);return L(n)}import{z as he}from"zod";var ye=he.string().trim().min(1),Po=he.object({name:ye.describe("CTE \u540D\u79F0\uFF0C\u4E0D\u80FD\u4E0E\u4EFB\u4E00\u8F93\u5165\u6570\u636E\u96C6\u7684\u7CBE\u786E\u540D\u79F0/name \u76F8\u540C\u3002"),query:ye.describe("\u8BE5 CTE \u7684\u67E5\u8BE2\u4F53\uFF0C\u4E0D\u5305\u542B CTE \u540D\u79F0\u548C AS \u5916\u5C42\u3002")}).strict(),cr={query:ye.describe("\u5B8C\u6574\u7684\u5355\u6761\u67E5\u8BE2 SQL\uFF0C\u4EC5\u9650 SELECT/WITH\u3002inputs \u53EA\u7ED1\u5B9A\u6570\u636E\u96C6\uFF0CdsId\u3001fdId \u6216 input0 \u4E0D\u80FD\u76F4\u63A5\u4F5C\u4E3A\u8868\u540D\uFF1B\u901A\u5E38\u5148\u4F7F\u7528 get_dataset_detail \u8FD4\u56DE\u7684\u6570\u636E\u96C6\u540D\u79F0/name \u548C columns[].name\u3002\u82E5 TABLE_OR_VIEW_NOT_FOUND \u7684 diagnostic.tableBindings[] \u63D0\u4F9B sqlReference\uFF0C\u6309\u8BE5\u503C\u4FEE\u6B63\u8868\u5F15\u7528\uFF1B\u5355\u6570\u636E\u96C6 Spark \u67E5\u8BE2\u53EF\u80FD\u8FD4\u56DE __THIS__\u3002\u4E2D\u6587\u6216\u7279\u6B8A\u5B57\u7B26\u540D\u79F0\u7528\u53CD\u5F15\u53F7\u3002\u8FD4\u56DE\u884C\u6570\u7531 MCP \u63A7\u5236\uFF0C\u901A\u5E38\u65E0\u9700\u81EA\u884C\u6DFB\u52A0 LIMIT\u3002"),inputs:he.array(ye).describe("query \u5B9E\u9645\u5F15\u7528\u7684\u5168\u90E8\u6570\u636E\u96C6 ID\uFF0C\u7528\u4E8E BI \u7ED1\u5B9A\u548C\u6743\u9650\u6821\u9A8C\uFF0C\u4E0D\u80FD\u4F5C\u4E3A SQL \u8868\u540D\u3002\u6BCF\u4E2A FROM/JOIN \u6570\u636E\u96C6\u90FD\u8981\u4F20\u5BF9\u5E94 ID\uFF0C\u4E0D\u8981\u591A\u4F20\u6216\u91CD\u590D\uFF1BSELECT 1 \u7B49\u65E0\u8868\u67E5\u8BE2\u4F20\u7A7A\u6570\u7EC4\u3002\u540E\u7AEF\u9ED8\u8BA4\u6700\u591A\u652F\u6301 10 \u4E2A\u4E0D\u540C\u6570\u636E\u96C6\uFF0C\u5B9E\u9645\u9650\u5236\u4EE5\u90E8\u7F72\u914D\u7F6E\u4E3A\u51C6\u3002"),queryStructure:he.object({ctes:he.array(Po).min(1),mainQuery:ye.describe("\u79FB\u9664\u9876\u5C42 WITH/CTE \u5B9A\u4E49\u540E\u7684\u6700\u7EC8 SELECT \u67E5\u8BE2\u3002")}).strict().optional().describe("\u4EC5\u5F53\u5B8C\u6574 query \u662F\u9876\u5C42 WITH/CTE \u67E5\u8BE2\u65F6\u63D0\u4F9B\u3002query \u4ECD\u4FDD\u7559\u5B8C\u6574\u539F\u59CB SQL\uFF1Bctes \u548C mainQuery \u662F\u540C\u4E00 SQL \u7684\u7ED3\u6784\u5316\u62C6\u5206\u3002\u6CA1\u6709 CTE \u65F6\u7701\u7565\u6574\u4E2A\u5B57\u6BB5\u3002")};async function dr(e,t,n){try{await Zt(e,t,"executeSqlQuery");let r=await e.post("/api/data-source/execute-sql-query",{...n,query:n.query.trim(),inputs:[...new Set(n.inputs.map(i=>i.trim()))],limit:t.BI_MAX_ROWS,disableCache:!0});return L({maxRowsHint:t.BI_MAX_ROWS,result:r})}catch(r){if(ko(r))return fe("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"});if(xo(r)){let i=await Mo(e,n.inputs),s=lr(r)&&i.length===1,o=i.map(a=>s?{...a,sqlReference:"__THIS__"}:a);return fe("execute_sql_query",r,{hint:vo(r,s),tableBindings:o.length>0?o:void 0})}throw r}}function ko(e){return e instanceof Error&&e.message.includes("POST /api/data-source/execute-sql-query HTTP 404")}function xo(e){return e instanceof Error&&e.message.includes("TABLE_OR_VIEW_NOT_FOUND")}function lr(e){return e instanceof Error&&e.message.includes("SparkViewDataset")}function vo(e,t){return t?"\u8BE5\u8BF7\u6C42\u8D70 Spark \u6570\u636E\u96C6\u6267\u884C\u94FE\u8DEF\u3002\u4FDD\u6301 inputs \u4E0D\u53D8\uFF0C\u5C06 SQL \u4E2D\u8BE5\u6570\u636E\u96C6\u7684 FROM/JOIN \u8868\u5F15\u7528\u6539\u4E3A diagnostic.tableBindings[0].sqlReference\uFF08__THIS__\uFF09\u540E\u91CD\u8BD5\uFF1B\u4E0D\u8981\u518D\u6B21\u4F7F\u7528\u76F8\u540C\u7684\u663E\u793A\u540D\u79F0\u3002":lr(e)?"\u8BE5\u8BF7\u6C42\u8D70 Spark \u591A\u6570\u636E\u96C6\u6267\u884C\u94FE\u8DEF\uFF0C\u6570\u636E\u96C6\u663E\u793A\u540D\u79F0\u4E0D\u4FDD\u8BC1\u7B49\u4E8E\u5DF2\u6CE8\u518C\u7684 SQL \u5173\u7CFB\u540D\uFF0CMCP \u65E0\u6CD5\u53EF\u9760\u63A8\u5BFC\u5168\u90E8\u8868\u5F15\u7528\uFF1B\u8BF7\u52FF\u539F\u6837\u91CD\u590D\u8C03\u7528\uFF0C\u9700\u8981\u540E\u7AEF\u63D0\u4F9B\u7A33\u5B9A\u522B\u540D\u3002":"\u6570\u636E\u96C6 ID \u53EA\u7528\u4E8E BI \u7ED1\u5B9A\u548C\u6388\u6743\uFF0C\u4E0D\u80FD\u76F4\u63A5\u4F5C\u4E3A\u8868\u540D\u3002\u53EF\u6838\u5BF9 diagnostic.tableBindings[].displayName\uFF0C\u4F46\u663E\u793A\u540D\u79F0\u4E0D\u4FDD\u8BC1\u662F\u5F53\u524D\u6267\u884C\u94FE\u8DEF\u53EF\u7528\u7684 SQL \u5F15\u7528\u3002"}async function Mo(e,t){let n=[...new Set(t.map(r=>r.trim()))];return Promise.all(n.map(async r=>{try{let i=await e.get(`/api/data-source/${encodeURIComponent(r)}`);if(!i||typeof i!="object"||!("name"in i)||typeof i.name!="string")return{dsId:r};let s=i.name.trim();return s?{dsId:r,displayName:s}:{dsId:r}}catch{return{dsId:r}}}))}import{z as G}from"zod";var pr={keyword:G.string().default("").describe("\u641C\u7D22\u5173\u952E\u8BCD\uFF0C\u7559\u7A7A\u65F6\u8FD4\u56DE\u8D44\u6E90\u5217\u8868\u3002"),resourceType:G.enum(["ALL","CARD","DASHBOARD","DATA_SET","ETL"]).optional().default("ALL"),limit:G.number().int().min(1).max(100).optional().default(20),offset:G.number().int().min(0).optional().default(0),utimeStartTime:G.number().int().optional().describe("\u66F4\u65B0\u65F6\u95F4\u8D77\u70B9\uFF0C\u6BEB\u79D2\u65F6\u95F4\u6233\u3002"),utimeEndTime:G.number().int().optional().describe("\u66F4\u65B0\u65F6\u95F4\u7EC8\u70B9\uFF0C\u6BEB\u79D2\u65F6\u95F4\u6233\u3002"),cardType:G.string().optional().describe("\u5361\u7247\u7C7B\u578B\u8FC7\u6EE4\uFF0C\u4EC5 resourceType \u5305\u542B CARD \u65F6\u4F7F\u7528\u3002"),permissionType:G.string().optional(),orderBy:G.string().optional(),isDesc:G.boolean().optional()};async function mr(e,t){let{cardType:n,...r}=t,i={...r,specificResourceFilters:n?{cardType:n}:void 0},s=await e.post("/api/global-search",i);return L(s)}import{z as m}from"zod";var kt=m.enum(["asc","desc"]),Do=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"]),fr=new Set(["BT","CLOSE_BT_OPEN","OPEN_BT_CLOSE","OPEN_BT_OPEN"]),St=new Set(["IS_NULL","NOT_NULL"]),Cr=m.object({field:m.string().min(1).describe("\u7B5B\u9009\u5B57\u6BB5\u540D\u79F0\u6216\u5B57\u6BB5 ID\u3002"),operator:Do.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;St.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`}),fr.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`}),!fr.has(e.operator)&&!St.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`})}),jo=m.object({field:m.string().min(1).describe("\u6392\u5E8F\u5B57\u6BB5\u540D\u79F0\u6216\u5B57\u6BB5 ID\u3002"),direction:kt.describe("\u6392\u5E8F\u65B9\u5411\u3002")}),Uo=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:kt.optional(),rank_dim:m.string().min(1).optional()}),wr={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")},Er={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")},Br={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")},Rr={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(Cr).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(jo).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:Uo.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")},Sr={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")},Ar={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")},Or={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(Cr).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:kt.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")},V={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 Pr(e,t,n){let r=new q(e,t);try{let i=n.project_id?[n.project_id]:await No(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(...Lo(u)),s.length>=n.limit)break}let o=da(s.map(At),"metric_id").slice(0,n.limit);return S({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 W(i,"search_metrics")}}async function kr(e,t,n){let r=new q(e,t);try{try{let i=await r.listMetricFullTree({projectId:n.project_id,keyword:n.keyword});return S({summary:{source:"full-tree"},tree:Ho(i),raw:n.raw?i:void 0})}catch(i){let s=n.project_id?[{id:n.project_id}]:await Ur(r),o=[];for(let a of s){let u=p(a.id);if(!u)continue;let c=await r.listMetricDirectoryTree(u);o.push({id:u,name:p(a.name)||u,type:"project",project_id:u,children:Go(c,u)})}return S({summary:{source:"directory-fallback",fallback_reason:i instanceof Error?i.message:String(i)},tree:o})}}catch(i){return W(i,"list_metric_catalog")}}async function xr(e,t,n){let r=new q(e,t);try{let i=await r.getMetricDetail(n.metric_id),s=Jo(i),o,a;if(!n.brief){let u=p(i.uniformResourceType)||"METRIC_PLATFORM_METRIC";try{o=$o(await r.getMetricLineage(n.metric_id,u))}catch(c){a=c instanceof z?c.detail:String(c)}}return S({detail:{...s,lineage:o,lineage_error:a},raw:n.raw?i:void 0})}catch(i){return W(i,"get_metric_detail")}}async function vr(e,t,n){let r=new q(e,t);try{let i=await r.getMetricDetail(n.metric_id);if(!n.advanced_calc){let a=_r(i,n);if("unsupported"in a)return D("query_metric_data",a.unsupported);let u=async l=>{let g=await r.getCardEditSession(a.cardId),h=p(g.sessionId);if(!h)throw new Error("\u6307\u6807\u5361\u7247\u9884\u89C8\u4F1A\u8BDD\u54CD\u5E94\u7F3A\u5C11 sessionId\u3002");return a.dimensions.length&&await Fo(r,a.cardId,h,a.dimensions),{raw:await r.queryCardEditData(a.cardId,h,l),sessionId:h}};if(n.combine_type==="OR"&&(n.filters?.length??0)>1){let l=[],g=[];for(let h of n.filters??[]){let _=_r(i,{...n,combine_type:"AND",filters:[h]});if("unsupported"in _)return D("query_metric_data",_.unsupported);let{raw:w}=await u(_.body);g.push(w),l.push(...hr(w))}return Je(i,l,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 Je(i,hr(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=gr(i,n);if("unsupported"in s)return D("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=gr(i,{...n,combine_type:"AND",filters:[c]});if("unsupported"in d)return D("query_metric_data",d.unsupported);let l=await r.queryMetricData(d.input);u.push(l),a.push(...be(l))}return Je(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 Je(i,be(o),n,{mode:"metric_data_v2",request_body:s.input},n.raw?o:void 0)}catch(i){return ca(i)?D("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}):W(i,"query_metric_data")}}async function Mr(e,t,n){let r=new q(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=qo(i).map(Gr).slice(0,n.limit);return S({summary:{keyword:n.keyword,count:s.length},items:s})}catch(i){return W(i,"search_metric_trees")}}async function Dr(e,t,n){let r=new q(e,t);try{let i=await r.getMetricTreeDetail(n.metric_tree_id);return S({detail:Xo(i),raw:n.raw?i:void 0})}catch(i){return W(i,"get_metric_tree_detail")}}async function jr(e,t,n){let r=new q(e,t);try{if(n.target==="dimension"&&!n.dimension&&!n.dimension_fd_id)return D("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=p(i.metricId);if(!s)return D("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=Ie(o),u=xt(n.filters??[],a);if("unsupported"in u)return D("query_metric_tree_attribution",u.unsupported);let c=u.filters,d=Zo(i,n);if("unsupported"in d)return D("query_metric_tree_attribution",d.unsupported);if(n.target==="metric"){let _=ea(i,d.value,c),w=await r.queryMetricTreeDecompose(n.metric_tree_id,_);return Rt(i,"metric",ta(w),n,n.raw?w:void 0)}if(n.target==="dimension"){let _=ae(a,n.dimension,n.dimension_fd_id);if(!_)return D("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 w=br(i,_,d.value,c,n.limit,n.sort),P=await r.queryMetricTreeDrill(n.metric_tree_id,w);return Rt(i,"dimension",Ir(P,p(_.name)),n,n.raw?P:void 0)}let l=na(i,a,n.scan_dimensions,n.exclude_dimensions);if(!l.length)return D("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=[],h=[];for(let _ of l){let w=br(i,_,d.value,c,n.group_limit,n.sort),P=await r.queryMetricTreeDrill(n.metric_tree_id,w);h.push({dimension:p(_.name),raw:P}),g.push(...Ir(P,p(_.name)).slice(0,n.group_limit))}return Rt(i,"scan",g,n,n.raw?h:void 0,{scanned_dimensions:l.map(_=>p(_.name))})}catch(i){return W(i,"query_metric_tree_attribution")}}async function No(e){return(await Ur(e)).map(t=>p(t.id)).filter(Boolean)}async function Ur(e){return O(await e.listProjects()).map(I).filter(Boolean)}function Lo(e){let t=I(e);return O(t.contents??t.items??t.data)}function qo(e){let t=I(e);return O(t.data??t.contents??t.items)}function At(e){return y({metric_id:p(e.id),name:p(e.name),project_id:p(e.projectId),dir_id:A(e.parentDirId,e.dirId),status:p(e.status),sub_type:p(e.subType),description:p(e.desc),dataset:Fr(e.dsInfo),statistics:e.statisticsData,creator:Fe(e.creator),business_owner:Fe(e.businessOwner),updated_at:p(e.utime),raw:e})}function Ho(e){return O(e).map(t=>Nr(t,void 0))}function Nr(e,t){let n=!!e.isMetric,r=p(e.id),i=!t&&!n?r:t;return y({id:r,name:p(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:p(e.parentId),children:O(e.children).map(s=>Nr(s,i))})}function Go(e,t){let n=I(e);return p(n.id)?[Ot(n,t)]:O(n.contents??n.children).map(r=>Ot(r,t))}function Ot(e,t){return y({id:p(e.id),name:p(e.name),type:"directory",project_id:t,dir_id:p(e.id),parent_id:A(e.parentDirId,e.parentId),can_use:x(e.canUse),can_manage:x(e.canManage),metric_count:Tr(e.metricCnt),all_metric_count:Tr(e.allMetricCnt),children:O(e.contents??e.children).map(n=>Ot(n,t))})}function Jo(e){return y({metric_id:p(e.id),name:p(e.name),english_name:p(e.engName),status:p(e.status),sub_type:p(e.subType),description:p(e.desc),project_id:p(e.projectId),project_name:p(e.projectName),dir_id:A(e.parentDirId,e.dirId),dir_path:Vr(e.dirPath),dataset:Fr(e.dsInfo),source_fields:O(e.fdInfos).map($e),aggregation:A(e.aggrType,e.aggregationType),formula:A(e.formula,e.expression),derive_setting:e.deriveSetting,format:e.format,applicable_dimensions:Ie(e),time_dimension:I(e.timeDim)?$e(I(e.timeDim)):void 0,business_attributes:O(e.bizAttrs).map(ua),business_owner:Fe(e.businessOwner),creator:Fe(e.creator),referenced_metrics:O(e.referencedMetrics).map(At),base_metric:I(e.baseMetric)?At(I(e.baseMetric)):void 0,linked_metric_id:p(e.linkMetricId),statistics:e.statisticsData,permissions:y({can_use:x(e.canUse),can_manage:x(e.canManage)}),created_at:p(e.ctime),updated_at:p(e.utime),has_draft:x(e.hasDraft)})}function $o(e){let t=I(e);return y({current:t.crtNode,upstream:t.backwardAtlas,downstream:t.forwardAtlas})}function gr(e,t){let n=p(e.name),r=p(e.projectId);if(!n||!r)return{unsupported:{capability:"metric_detail_incomplete",message:"\u6307\u6807\u8BE6\u60C5\u7F3A\u5C11 name \u6216 projectId\u3002"}};let i=Ie(e),s=[...i,...Jr(e)],o=[];for(let d of t.dimensions??[]){let l=ae(i,d);if(!l)return{unsupported:{capability:"unsupported_dimension",parameter:d,supported_dimensions:i}};o.push(ra(l))}let a=zo(e,i,t.advanced_calc);if("unsupported"in a)return{unsupported:a.unsupported};let u=xt(t.filters??[],s);if("unsupported"in u)return{unsupported:u.unsupported};let c=Lr(t.sort??[],s);return"unsupported"in c?{unsupported:c.unsupported}:{input:{projectId:r,metricId:t.metric_id,metricName:n,metricItems:[y({name:n,alias:Qo(n,t.advanced_calc),advCalc:a.value})],dimensions:o,filters:u.filters,sorting:c.sorting,limit:t.limit}}}function _r(e,t){let n=I(e.metricChartConfig),r=p(n.metricChartCdId),i=p(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=[...Ie(e),...Jr(e)],a=[];for(let g of t.dimensions??[]){let h=ae(o,g);if(!h||p(h.meta_type).toUpperCase()==="METRIC")return{unsupported:{capability:"unsupported_dimension",parameter:g,supported_dimensions:Ie(e)}};a.push(ia(h))}let u=xt(t.filters??[],o);if("unsupported"in u)return{unsupported:u.unsupported};let c=u.filters,d=Lr(t.sort??[],o);if("unsupported"in d)return{unsupported:d.unsupported};let l=d.sorting;return{cardId:s,cardKind:r?"chart":"value",dimensions:a,body:y({limit:t.limit,filters:c.length?c:void 0,combineType:t.filters?.length?t.combine_type:void 0,sorting:l.length?l:void 0})}}async function Fo(e,t,n,r){let i=zr(await e.getCardEditMeta(t))??{},s=Vo(i);s.row=r,s.sorting=[],await e.modifyCardEditMeta(t,n,i)}function Vo(e){let t=I(e.content),n=I(t.meta),r=I(n.chartMain),i=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 zo(e,t,n){if(!n)return{value:void 0};let r=I(e.timeDim),i=p(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=Ko(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?ae(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:y({advType:"LEVEL_PERCENTAGE",auto:!a,tfdId:p(a?.fd_id)})}}}let o=n.rank_dim?ae(t,n.rank_dim):void 0;return n.rank_dim&&!o?{unsupported:{capability:"unknown_rank_dimension",parameter:n.rank_dim}}:{value:{advType:"RANK",advValue:y({advType:"RANK",calDimension:"FIELD",rankType:"RANK",sorting:(n.rank_order??"desc").toUpperCase(),tfdId:p(o?.fd_id),topN:{topType:"CUSTOM_NUMBER",count:n.rank_top??10,calculationType:"COUNT"}})}}}function Qo(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 Ko(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 xt(e,t){let n=[];for(let r of e){let i=qr(t,r.field,r.fd_id,"filter");if("unsupported"in i)return{unsupported:i.unsupported};n.push(y({name:i.field.name,fdId:i.field.fdId,fdType:i.field.fdType,metaType:i.field.metaType,filterType:r.operator,filterValue:Wo(r)}))}return{filters:n}}function Wo(e){return St.has(e.operator)?[]:e.values??[]}function Lr(e,t){let n=[];for(let r of e){let i=qr(t,r.field,void 0,"sort");if("unsupported"in i)return{unsupported:i.unsupported};n.push(y({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 qr(e,t,n,r){let i=ae(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=>y({name:p(g.name),fd_id:p(g.fd_id),meta_type:p(g.meta_type)}))}};let a=p(i.name),u=p(i.fd_id),c=p(i.fd_type),d=p(i.meta_type).toUpperCase(),l=[a?void 0:"name",u?void 0:"fdId",c?void 0:"fdType",d?void 0:"metaType"].filter(g=>!!g);return l.length?{unsupported:{capability:s,parameter:t,message:`${o}\u5B57\u6BB5\u7F3A\u5C11\u5FC5\u8981 BI \u5143\u4FE1\u606F\uFF1A${t}`,missing_metadata:l}}:{field:{name:a,fdId:u,fdType:c,metaType:d}}}function Je(e,t,n,r,i){let s=sa(t.slice(0,n.limit),n.columns);return S({summary:{metric_id:n.metric_id,metric_name:p(e.name),row_count:s.length,truncated:t.length>s.length},columns:$r(s),rows:s,diagnostic:r,raw:i})}function be(e){let t=I(e),n=I(t.data)??t,r=O(n.values??n.rows??t.values??t.rows);if(r.length)return r;let i=O(n.columns??t.columns).map(o=>p(I(o)?.name??o)).filter(Boolean),s=O(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 hr(e){let t=I(e),n=I(t.data)??t,r=I(n.chartMain??t.chartMain??I(I(t.content).data).chartMain);if(!Object.keys(r).length)return be(e);let i=I(r.row),s=I(r.column),o=O(i.fields),a=K(i.data),u=K(r.data),c=Yo(s),d=o.map(Pt).filter(Boolean),l=oa([...d,...c]),g=Math.max(a.length,u.length),h=[];for(let _=0;_<g;_+=1){let w=[];w.push(...K(a[_]).map(yr)),w.push(...K(u[_]).map(yr)),w.length&&h.push(Object.fromEntries(w.map((P,j)=>[l[j]??`column_${j+1}`,P])))}return h}function Yo(e){let n=K(e.data).map((r,i)=>{let s=K(r).map(Hr).filter(Boolean).join("/");return s||Pt(O(e.fields)[i])||`metric_${i+1}`}).filter(Boolean);return n.length?n:O(e.fields).map(Pt).filter(Boolean)}function Pt(e){return A(e.alias,e.title,e.originTitle,e.name,e.fdId,e.id)??""}function Hr(e){let t=I(e);return Object.keys(t).length?A(t.title,t.name,t.originTitle,t.alias,t.v,t.value)??"":p(e)}function yr(e){let t=I(e);return Object.keys(t).length?"v"in t?t.v:"value"in t?t.value:Hr(e):e}function Gr(e){return y({metric_tree_id:p(e.metricTreeId),name:p(e.metricTreeName),root_metric_id:p(e.metricId),root_metric_name:p(e.metricName),project_id:p(e.projectId),project_name:p(e.projectName),parent_dir_id:p(e.parentDirId),dir_path:Vr(e.dirPath),creator_id:p(e.creatorId),creator_name:p(e.creatorName),can_use:x(e.canUse),can_manage:x(e.canManage),updated_at:p(e.utime)})}function Xo(e){let t=I(e.config)??{};return y({...Gr(e),dom_id:p(e.domId),created_at:p(e.ctime),time_comparison:t.timeComparisonSetting,comparison_enabled:x(t.comparisonEnabled),contribution_calc_enabled:x(t.contributionCalcEnabled),dimension_decomposition:t.dimensionDecompositionContent,metric_decomposition:t.metricDecompositionContent,permissions:y({can_use:x(e.canUse),can_manage:x(e.canManage)})})}function Zo(e,t){let n=I(e.config)??{},r=t.time_comparison_json??zr(I(n.timeComparisonSetting)),i=x(n.comparisonEnabled)??!!r,s=x(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=I(r.advValue)??{};r.advValue=o,o.window={period:[t.period],withMacro:!1};let a=aa(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 ea(e,t,n){let r=I(e.config)??{},i=I(r.metricDecompositionContent)??{};return y({timeComparisonSetting:t.setting,comparisonEnabled:t.comparisonEnabled,contributionCalcEnabled:!1,metricDecomposeInfo:{metricRelationTree:i.metricRelationTree,filters:n}})}function br(e,t,n,r,i,s){return y({timeComparisonSetting:n.setting,comparisonEnabled:n.comparisonEnabled,contributionCalcEnabled:n.contributionEnabled,drillInfo:{dimensionFdId:p(t.fd_id),drillFilters:r,nodeNum:i,orderBy:s==="asc"?"contributionAsc":"contributionDesc"}})}function ta(e){return be(e).map(t=>y({child_metric:p(I(t.metricInfo)?.name),child_metric_id:p(I(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 Ir(e,t){return be(e).map((n,r)=>y({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 Rt(e,t,n,r,i,s){let o=t==="scan"?n:n.slice(0,r.limit);return S({summary:{metric_tree_id:r.metric_tree_id,metric_tree_name:p(e.metricTreeName),root_metric_id:p(e.metricId),root_metric_name:p(e.metricName),target:t,row_count:o.length,...s},columns:$r(o),rows:o,raw:i})}function na(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=>[p(c.name),c])),a=new Map(t.map(c=>[p(c.fd_id),c])),u=i.size?[...i].map(c=>o.get(c)).filter(c=>!!c):[];if(!u.length){let c=I(e.config)??{},d=I(c.dimensionDecompositionContent)??{};u=K(d.decomposableDimensionIds).map(l=>a.get(String(l))).filter(l=>!!l)}return u.length||(u=t),u.filter(c=>!s.has(p(c.name)))}function Ie(e){let t=new Set,n=[],r=i=>{if(!i)return;let s=p(i.fdId),o=p(i.name),a=s||o;if(!(!a||t.has(a))){t.add(a),n.push($e(i));for(let u of O(i.subs))r(u)}};for(let i of O(e.applicableDims))r(i);return r(I(e.timeDim)),n}function Jr(e){let t=O(e.fdInfos).map($e);return p(e.name)&&!t.some(n=>p(n.name)===p(e.name))&&t.push(y({id:A(e.id,e.name),fd_id:p(e.id),name:p(e.name),fd_type:A(t[0]?.fd_type,"DOUBLE"),meta_type:"METRIC"})),t}function $e(e){return y({id:A(e.id,e.fdId),fd_id:p(e.fdId),name:p(e.name),fd_type:p(e.fdType),meta_type:p(e.metaType),ds_id:p(e.dsId),granularity:p(e.granularity)})}function ae(e,t,n){let r=(n??t)?.trim();if(r)return e.find(i=>[i.fd_id,i.id,i.name].map(p).includes(r))}function ra(e){return y({name:p(e.name),alias:p(e.name),fdType:A(e.fd_type),metaType:"DIM",key:A(e.fd_id,e.id,e.name),fdId:A(e.fd_id),dsId:A(e.ds_id),granularity:A(e.granularity)})}function ia(e){return y({name:p(e.name),alias:A(e.name),fdType:A(e.fd_type),metaType:"DIM",key:A(e.fd_id,e.id,e.name),fdId:A(e.fd_id),dsId:A(e.ds_id),granularity:A(e.granularity)})}function sa(e,t){return t?.length?e.map(n=>Object.fromEntries(t.map(r=>[r,n[r]]))):e}function $r(e){return[...new Set(e.flatMap(t=>Object.keys(t)))]}function oa(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 aa(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 Fr(e){let t=I(e);if(t)return y({dataset_id:p(t.dsId),name:p(t.name)})}function Fe(e){let t=I(e);if(t)return y({user_id:A(t.uId,t.id),name:p(t.name),deleted:x(t.isDel)})}function ua(e){return y({id:p(e.id),name:p(e.name),type:p(e.valueType),values:O(e.values)})}function Vr(e){return O(e).map(t=>p(t.dirName??t.name)).filter(Boolean)}function D(e,t){return S({status:"unsupported",diagnostic:{tool:e,...t}})}function W(e,t){return e instanceof z?F({operation:t,diagnostic:e.detail}):F({operation:t,message:e instanceof Error?e.message:String(e)})}function ca(e){return e instanceof z&&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 O(e){return Array.isArray(e)?e.map(I).filter(Boolean):[]}function K(e){return Array.isArray(e)?e:[]}function I(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function p(e){return typeof e=="string"?e:e==null?"":String(e)}function A(...e){return e.map(p).find(t=>t.trim())?.trim()}function x(e){return typeof e=="boolean"?e:void 0}function Tr(e){return typeof e=="number"&&Number.isFinite(e)?e:void 0}function da(e,t){let n=new Set;return e.filter(r=>{let i=p(r[t]);return!i||n.has(i)?!1:(n.add(i),!0)})}function zr(e){return e?JSON.parse(JSON.stringify(e)):void 0}function Qr(e,t,n,r,i={}){let s=i.usageTelemetry??new De({config:n,appVersion:i.appVersion??"unknown"}),o=(u,c,d)=>{let l=e.registerTool,g=yn(u,d,s),h=async(..._)=>{try{return await g(..._)}catch(w){return fe(u,w)}};l.call(e,u,c,h)},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:In},(u,c)=>t.run(({client:d,config:l})=>Tn(d,l),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:$n,outputSchema:qn},(u,c)=>t.run(({config:d})=>Qn(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:Fn,outputSchema:Hn},(u,c)=>t.run(({config:d})=>Kn(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:Vn,outputSchema:Gn},(u,c)=>t.run(({config:d})=>Wn(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:zn,outputSchema:Jn},(u,c)=>t.run(({config:d})=>Yn(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:pr},(u,c)=>t.run(({client:d})=>mr(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:wr,outputSchema:V},(u,c)=>t.run(({client:d,config:l})=>Pr(d,l,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:Er,outputSchema:V},(u,c)=>t.run(({client:d,config:l})=>kr(d,l,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:Br,outputSchema:V},(u,c)=>t.run(({client:d,config:l})=>xr(d,l,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:Rr,outputSchema:V},(u,c)=>t.run(({client:d,config:l})=>vr(d,l,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:Sr,outputSchema:V},(u,c)=>t.run(({client:d,config:l})=>Mr(d,l,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:Ar,outputSchema:V},(u,c)=>t.run(({client:d,config:l})=>Dr(d,l,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:Or,outputSchema:V},(u,c)=>t.run(({client:d,config:l})=>jr(d,l,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\u3002\u82E5\u672C\u8F6E\u5C1A\u672A\u8BFB\u53D6\u6570\u636E\u96C6\u8BE6\u60C5\uFF0C\u5148\u8C03\u7528 get_dataset_detail \u83B7\u53D6\u6570\u636E\u96C6\u540D\u79F0/name \u548C columns[].name\u3002inputs \u53EA\u4F20\u5BF9\u5E94\u6570\u636E\u96C6 ID\uFF0C\u4E0D\u5F97\u628A dsId\u3001fdId \u6216 input0 \u5F53\u8868\u540D\uFF1BSQL \u901A\u5E38\u5148\u7528\u6570\u636E\u96C6\u540D\u79F0\u4F5C\u4E3A FROM/JOIN \u8868\u5F15\u7528\u3002\u82E5 TABLE_OR_VIEW_NOT_FOUND \u7684 diagnostic.tableBindings[] \u63D0\u4F9B sqlReference\uFF0C\u5FC5\u987B\u6309\u8BE5\u503C\u4FEE\u6B63\uFF1B\u5355\u6570\u636E\u96C6 Spark \u67E5\u8BE2\u53EF\u80FD\u8FD4\u56DE\u7A33\u5B9A\u5F15\u7528 __THIS__\uFF0C\u4E0D\u8981\u539F\u6837\u91CD\u590D\u5931\u8D25 SQL\u3002\u4E2D\u6587\u6216\u7279\u6B8A\u5B57\u7B26\u540D\u79F0\u7528\u53CD\u5F15\u53F7\uFF0C\u4F8B\u5982 SELECT * FROM \`\u9500\u552E\u6570\u636E\u96C6\`\u3002\u65E0\u8868\u67E5\u8BE2\u4F20 inputs: []\u3002\u591A\u6570\u636E\u96C6\u67E5\u8BE2\u8981\u6C42\u6570\u636E\u96C6\u80FD\u5728\u540C\u4E00\u6267\u884C\u94FE\u8DEF\u4E2D\u67E5\u8BE2\u3002\u8FD4\u56DE\u884C\u6570\u7531 BI_MAX_ROWS \u63A7\u5236\uFF0C\u5F53\u524D\u4E3A ${n.BI_MAX_ROWS} \u884C\uFF0C\u65E0\u9700\u81EA\u884C\u6DFB\u52A0 LIMIT\u3002`,inputSchema:cr},(u,c)=>t.run(({client:d,config:l})=>dr(d,l,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:rr},(u,c)=>t.run(({client:d})=>or(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:ir},(u,c)=>t.run(({client:d})=>ar(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\u4E00\u9875 BI \u5361\u7247\u9884\u89C8\u6570\u636E\uFF0C\u5355\u6B21\u6700\u591A 1000 \u884C\u3002\u5B8C\u6574 rows \u4F4D\u4E8E structuredContent\uFF1Bpage.has_more=true \u65F6\u4F7F\u7528 next_offset \u7EED\u9875\u3002",inputSchema:Rn,outputSchema:Sn},(u,c)=>t.run(({client:d,signal:l})=>On(d,u,l),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:sr},(u,c)=>t.run(({client:d})=>ur(d,u),c,"get_page_info")))}var ya=la(import.meta.url),Nt=ya("../package.json"),Mt=class{record(t){console.error(JSON.stringify({runtime:Ba(t)}))}};function Wr(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 jt(e,r):new Dt(e,r)}var ba=`\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
 
14
14
  1. BI \u9ED8\u8BA4\u529F\u80FD\uFF08\u5361\u7247\u3001\u4EEA\u8868\u677F\u3001\u6570\u636E\u96C6\u3001ETL \u7B49\u6838\u5FC3\u8D44\u4EA7\uFF09
15
15
  - \u53D1\u73B0\uFF1Aglobal_search \u6309\u5173\u952E\u8BCD\u641C\u5361\u7247/\u4EEA\u8868\u677F/\u6570\u636E\u96C6/ETL\u3002
16
16
  - \u770B\u8BE6\u60C5\uFF1Aget_card_info\u3001get_page_info\u3001get_dataset_detail\u3002
17
- - \u53D6\u6570\uFF1Aquery_card_data \u8BFB\u5361\u7247\u9884\u89C8\u6570\u636E\uFF1Bexecute_sql_query \u57FA\u4E8E\u4E00\u4E2A\u6216\u591A\u4E2A\u6570\u636E\u96C6\u5199 SQL \u67E5\u8BE2\uFF08\u591A\u8868\u8054\u67E5\u8981\u6C42\u6570\u636E\u96C6\u5747\u4E3A\u62BD\u53D6\uFF0C\u6216\u5747\u4E3A\u6765\u81EA\u540C\u4E00\u6570\u636E\u8D26\u6237\u548C\u6570\u636E\u5E93\u7684\u76F4\u8FDE\uFF09\u3002
17
+ - \u53D6\u6570\uFF1Aquery_card_data \u5206\u9875\u8BFB\u53D6\u5361\u7247\u9884\u89C8\u6570\u636E\uFF1Bexecute_sql_query \u57FA\u4E8E\u4E00\u4E2A\u6216\u591A\u4E2A\u6570\u636E\u96C6\u5199 SQL \u67E5\u8BE2\uFF08\u591A\u8868\u8054\u67E5\u8981\u6C42\u6570\u636E\u96C6\u5747\u4E3A\u62BD\u53D6\uFF0C\u6216\u5747\u4E3A\u6765\u81EA\u540C\u4E00\u6570\u636E\u8D26\u6237\u548C\u6570\u636E\u5E93\u7684\u76F4\u8FDE\uFF09\u3002
18
18
 
19
19
  2. \u6307\u6807\u6A21\u5757\uFF08\u72EC\u7ACB\u589E\u8D2D\uFF0C\u6307\u6807\u5E73\u53F0 / \u6307\u6807\u6811\uFF0C\u9700\u5F00\u901A\u540E\u53EF\u7528\uFF09
20
20
  - \u53D1\u73B0\uFF1A\u5DF2\u6709\u5173\u952E\u8BCD\u7528 search_metrics\uFF08\u6307\u6807\uFF09\u3001search_metric_trees\uFF08\u6307\u6807\u6811\uFF09\uFF1B\u4E0D\u77E5\u9053\u5173\u952E\u8BCD\u7528 list_metric_catalog \u6D4F\u89C8\u6307\u6807\u76EE\u5F55\u3002
@@ -26,5 +26,5 @@ ${c}`:u}catch{return}}var ut=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 Ar(e,t={}){let n=t.appVersion??Ct.version,r=t.callerContextResolver??Ht(e),i=t.guanBIClientFactory??new Te(e,{clientFactory:t.clientFactory,requestMetadata:{client:e.MCP_TRANSPORT==="streamable-http"?e.BI_PAT_CLIENT??"mcp":"mcp",clientVersion:n}}),s=i.create(await r.resolve()),o=await(t.capabilityResolver??ie)(s.client,s.config),a=new xo({name:"guanbi-mcp-server",version:n},{instructions:Uo});return Sr(a,new Ee(r,i,new le),s.config,o,{appVersion:n}),a}var yt=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??Ct.version,boundBISite:{configured:!!this.config.BI_BASE_URL,baseUrl:this.config.BI_BASE_URL,publicPath:this.config.BI_PUBLIC_PATH}}}async start(){await(await Ar(this.config,this.options)).connect(this.options.transportFactory?.()??new Mo)}},bt=class{constructor(t,n){this.config=t;this.options=n}config;options;mode="streamable-http";httpServer;sessions=new Map;logger=new It;health(){return{status:"ok",mode:this.mode,version:this.options.appVersion??Ct.version,boundBISite:{configured:!!this.config.BI_BASE_URL,baseUrl:this.config.BI_BASE_URL,publicPath:this.config.BI_PUBLIC_PATH}}}async start(){this.httpServer=vo((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:Vo(this.config),entrypointTokenConfigured:!!this.config.MCP_ENTRYPOINT_TOKEN,trustedGateway:Tt(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://${Go(t,this.config.MCP_HTTP_HOST??"127.0.0.1")}:${t.port}`}async handleRequest(t,n){let r=Rr(t);if(!r){V(n,400,{error:"bad_request"});return}if($o(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(!No(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:Tt(this.config.MCP_TRUSTED_GATEWAY)}),V(n,401,{error:"mcp_entrypoint_unauthorized"});return}let i=ve(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,...ht(i),sessionCount:this.sessions.size}),V(n,404,{error:"mcp_session_not_found"});return}let s=await this.resolveSession(t);Ho(n),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,{...ht(o),sessionCount:this.sessions.size}))}async resolveSession(t){let n=ve(t.headers["mcp-session-id"]);if(n){let o=this.sessions.get(n);if(o)return o}let r=new Do({sessionIdGenerator:Po,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,{...ht(o),sessionCount:this.sessions.size})}}),i=qo(this.config,t.headers),s=await Ar(i,{...this.options,callerContextResolver:this.options.callerContextResolver??Gt(i),capabilityResolver:this.options.capabilityResolver??(async()=>Dt(i))});return await s.connect(r),{server:s,transport:r}}readiness(){let t=Lo(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?Rr(i):void 0;this.logger.record({level:t,event:n,mode:this.mode,message:r,method:i?.method,path:o,...s})}};function No(e,t){if(Tt(t.MCP_TRUSTED_GATEWAY)||se(e))return!0;let n=t.MCP_ENTRYPOINT_TOKEN;return n?ve(e.authorization)?.trim()===`Bearer ${n}`:!1}function ve(e){return Array.isArray(e)?e[0]:e}function Tt(e){return["1","true","yes","on"].includes(e?.trim().toLowerCase()??"")}function Lo(e){let t=[];return e.BI_BASE_URL||t.push("BI_BASE_URL is required"),t}function qo(e,t){let n=se(t),r=ve(t[Y.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 Ho(e){let t=e.writeHead.bind(e);e.writeHead=((n,r,i)=>(n===202&&e.setHeader("Content-Length","0"),typeof r=="string"?t(n,r,i):t(n,r)))}function Go(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 Jo(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}function Rr(e){try{return new URL(e.url??"/",`http://${e.headers.host??"localhost"}`).pathname}catch{return}}function $o(e){return["/healthz","/sysmon/health/liveness","/sysmon/health/readiness"].includes(e)}function Vo(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 ht(e){return{hasSessionId:!0,sessionIdHash:ko("sha256").update(e).digest("hex").slice(0,12)}}var zo=Fo(import.meta.url),{version:Qo}=zo("../package.json");async function Ko(){if(process.argv.slice(2).some(t=>t==="--version"||t==="-v")){process.stdout.write(`${Qo}
30
- `);return}let e=wt();await Or(e).start()}Ko().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 Yr(e,t={}){let n=t.appVersion??Nt.version,r=t.callerContextResolver??sn(e),i=t.guanBIClientFactory??new Me(e,{clientFactory:t.clientFactory,requestMetadata:{client:e.MCP_TRANSPORT==="streamable-http"?e.BI_PAT_CLIENT??"mcp":"mcp",clientVersion:n}}),s=i.create(await r.resolve()),o=await(t.capabilityResolver??le)(s.client,s.config),a=new ga({name:"guanbi-mcp-server",version:n},{instructions:ba});return Qr(a,new je(r,i,new Ee,e.BI_REQUEST_TIMEOUT_MS),s.config,o,{appVersion:n}),a}var Dt=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??Nt.version,boundBISite:{configured:!!this.config.BI_BASE_URL,baseUrl:this.config.BI_BASE_URL,publicPath:this.config.BI_PUBLIC_PATH}}}async start(){await(await Yr(this.config,this.options)).connect(this.options.transportFactory?.()??new _a)}},jt=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??Nt.version,boundBISite:{configured:!!this.config.BI_BASE_URL,baseUrl:this.config.BI_BASE_URL,publicPath:this.config.BI_PUBLIC_PATH}}}async start(){this.httpServer=fa((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)}),Y(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:Sa(this.config),entrypointTokenConfigured:!!this.config.MCP_ENTRYPOINT_TOKEN,trustedGateway:Ut(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://${Ea(t,this.config.MCP_HTTP_HOST??"127.0.0.1")}:${t.port}`}async handleRequest(t,n){let r=Kr(t);if(!r){Y(n,400,{error:"bad_request"});return}if(Ra(r)&&t.method==="GET"){if(r==="/sysmon/health/readiness"){let a=this.readiness();Y(n,a.ready?200:503,a);return}Y(n,200,this.health());return}if(r!=="/mcp"){Y(n,404,{error:"not_found"});return}if(!Ia(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:Ut(this.config.MCP_TRUSTED_GATEWAY)}),Y(n,401,{error:"mcp_entrypoint_unauthorized"});return}let i=Ve(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,...vt(i),sessionCount:this.sessions.size}),Y(n,404,{error:"mcp_session_not_found"});return}let s=await this.resolveSession(t);wa(n),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,{...vt(o),sessionCount:this.sessions.size}))}async resolveSession(t){let n=Ve(t.headers["mcp-session-id"]);if(n){let o=this.sessions.get(n);if(o)return o}let r=new ha({sessionIdGenerator:ma,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,{...vt(o),sessionCount:this.sessions.size})}}),i=Ca(this.config,t.headers),s=await Yr(i,{...this.options,callerContextResolver:this.options.callerContextResolver??on(i),capabilityResolver:this.options.capabilityResolver??(async()=>Xt(i))});return await s.connect(r),{server:s,transport:r}}readiness(){let t=Ta(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?Kr(i):void 0;this.logger.record({level:t,event:n,mode:this.mode,message:r,method:i?.method,path:o,...s})}};function Ia(e,t){if(Ut(t.MCP_TRUSTED_GATEWAY)||pe(e))return!0;let n=t.MCP_ENTRYPOINT_TOKEN;return n?Ve(e.authorization)?.trim()===`Bearer ${n}`:!1}function Ve(e){return Array.isArray(e)?e[0]:e}function Ut(e){return["1","true","yes","on"].includes(e?.trim().toLowerCase()??"")}function Ta(e){let t=[];return e.BI_BASE_URL||t.push("BI_BASE_URL is required"),t}function Ca(e,t){let n=pe(t),r=Ve(t[re.client.toLowerCase()])?.trim();return{...e,BI_PAT:n,...n&&r?{BI_PAT_CLIENT:r}:{}}}function Y(e,t,n){e.headersSent||(e.writeHead(t,{"Content-Type":"application/json"}),e.end(JSON.stringify(n)))}function wa(e){let t=e.writeHead.bind(e);e.writeHead=((n,r,i)=>(n===202&&e.setHeader("Content-Length","0"),typeof r=="string"?t(n,r,i):t(n,r)))}function Ea(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 Ba(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}function Kr(e){try{return new URL(e.url??"/",`http://${e.headers.host??"localhost"}`).pathname}catch{return}}function Ra(e){return["/healthz","/sysmon/health/liveness","/sysmon/health/readiness"].includes(e)}function Sa(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 vt(e){return{hasSessionId:!0,sessionIdHash:pa("sha256").update(e).digest("hex").slice(0,12)}}var Oa=Aa(import.meta.url),{version:Pa}=Oa("../package.json");async function ka(){if(process.argv.slice(2).some(t=>t==="--version"||t==="-v")){process.stdout.write(`${Pa}
30
+ `);return}let e=Gt();await Wr(e).start()}ka().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.31",
3
+ "version": "0.1.33",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "MCP server for exposing GuanBI capabilities to AI agents.",
@@ -43,7 +43,7 @@
43
43
  "start": "node dist/index.js"
44
44
  },
45
45
  "dependencies": {
46
- "@modelcontextprotocol/sdk": "^1.29.0",
46
+ "@modelcontextprotocol/sdk": "^1.30.0",
47
47
  "dotenv": "^17.4.2",
48
48
  "zod": "^4.4.3"
49
49
  },
@@ -53,7 +53,8 @@
53
53
  "tsup": "^8.5.1",
54
54
  "tsx": "^4.21.0",
55
55
  "typescript": "^6.0.3",
56
- "vitest": "^4.1.6"
56
+ "vite": "^8.0.16",
57
+ "vitest": "^4.1.11"
57
58
  },
58
59
  "engines": {
59
60
  "node": ">=20.0.0"