@guandata/guanbi-mcp-server 0.1.24 → 0.1.27

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