@guandata/guanbi-mcp-server 0.1.11 → 0.1.14
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 +1 -0
- package/dist/index.js +5 -4
- package/package.json +9 -2
package/README.md
CHANGED
|
@@ -72,6 +72,7 @@ HTTP 入口使用 `POST /mcp`。除非设置 `MCP_TRUSTED_GATEWAY=true` 并由
|
|
|
72
72
|
- `execute_sql_query`:在支持的环境中执行轻量只读 SQL 查询。
|
|
73
73
|
- `get_dataset_detail`:获取数据集详情。
|
|
74
74
|
- `get_card_info`:获取卡片元信息。
|
|
75
|
+
- `query_card_data`:只读查询图表卡、筛选器、树筛选器和文本卡片数据,支持结构化 filters、columns 投影和 raw 诊断。
|
|
75
76
|
- `get_page_info`:获取页面或仪表板元信息。
|
|
76
77
|
- `search_metrics`、`list_metric_catalog`、`get_metric_detail`、`query_metric_data`:发现并查询指标平台指标。
|
|
77
78
|
- `search_metric_trees`、`get_metric_tree_detail`、`query_metric_tree_attribution`:发现指标树并执行归因分析。
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import"dotenv/config";import{z as w}from"zod";var Tn=w.object({BI_BASE_URL:w.string().url().optional(),BI_PUBLIC_PATH:w.string().optional().default(""),BI_UID_TOKEN:w.string().optional(),BI_LOGIN_DOMAIN:w.string().optional().default("guanbi"),BI_LOGIN_ID:w.string().optional(),BI_LOGIN_PASSWORD:w.string().optional(),BI_REQUEST_TIMEOUT_MS:w.coerce.number().int().positive().default(12e4),BI_MAX_ROWS:w.coerce.number().int().positive().default(1e3),BI_DATA_VERSION:w.string().optional(),GUANBI_MCP_USAGE_STATS:w.string().optional(),MCP_TRANSPORT:w.enum(["stdio","streamable-http"]).optional().default("stdio"),MCP_HTTP_HOST:w.string().optional().default("127.0.0.1"),MCP_HTTP_PORT:w.coerce.number().int().nonnegative().optional().default(9090),MCP_ENTRYPOINT_TOKEN:w.string().optional(),MCP_TRUSTED_GATEWAY:w.string().optional()});function qe(t=process.env){let e=Tn.parse(t);return{...e,BI_BASE_URL:e.BI_BASE_URL?.replace(/\/+$/,""),BI_PUBLIC_PATH:Cn(e.BI_PUBLIC_PATH),BI_UID_TOKEN:e.BI_UID_TOKEN?.trim()||void 0,BI_LOGIN_DOMAIN:e.BI_LOGIN_DOMAIN?.trim()||"guanbi",BI_LOGIN_ID:e.BI_LOGIN_ID?.trim()||void 0,BI_LOGIN_PASSWORD:e.BI_LOGIN_PASSWORD?.trim()||void 0,BI_DATA_VERSION:e.BI_DATA_VERSION?.trim()||void 0,GUANBI_MCP_USAGE_STATS:e.GUANBI_MCP_USAGE_STATS?.trim()||void 0,MCP_ENTRYPOINT_TOKEN:e.MCP_ENTRYPOINT_TOKEN?.trim()||void 0,MCP_TRUSTED_GATEWAY:e.MCP_TRUSTED_GATEWAY?.trim()||void 0}}function Cn(t){let e=t?.trim().replace(/^\/+|\/+$/g,"")??"";return e?`/${e}`:""}import{createRequire as vi}from"module";import{createHash as Ai,randomUUID as Ei}from"crypto";import{createServer as Oi}from"http";import{McpServer as xi}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as Mi}from"@modelcontextprotocol/sdk/server/stdio.js";import{StreamableHTTPServerTransport as Pi}from"@modelcontextprotocol/sdk/server/streamableHttp.js";var F=class{record(e){console.error(JSON.stringify({audit:Bn({...e})}))}},Q=class{record(){}};function le(t,e,n,r,i){return{transport:e.transport,tool:t,tenantId:e.audit.tenantId,endUserId:e.audit.endUserId,traceId:e.audit.traceId,status:r,durationMs:Math.max(0,Date.now()-n),failureType:r==="error"?wn(i):void 0}}function wn(t){return t instanceof Error?t.name||"Error":typeof t}function Bn(t){return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}async function W(t){if(!t.BI_LOGIN_ID||!t.BI_LOGIN_PASSWORD||!t.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 e=await fetch(Sn(t,"/api/user/sign-in"),{method:"POST",headers:{"Content-Type":"application/json","raw-backend-response":"TRUE"},body:JSON.stringify({domain:t.BI_LOGIN_DOMAIN,loginId:t.BI_LOGIN_ID,password:Buffer.from(t.BI_LOGIN_PASSWORD,"utf8").toString("base64")}),signal:AbortSignal.timeout(t.BI_REQUEST_TIMEOUT_MS)}),n=await e.text();if(!e.ok)throw new Error(`BI \u767B\u5F55\u5931\u8D25\uFF1AHTTP ${e.status} ${xn(n)}`);let r=Rn(e,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 Sn(t,e){return`${t.BI_BASE_URL}${t.BI_PUBLIC_PATH}${e}`}function Rn(t,e){let n=kn(t.headers);if(n)return n;let r=vn(e);return r||An(t.headers)}function kn(t){let e=t.get("x-auth-token")?.trim();if(e)return e;let n=t.get("authorization")?.trim();return n&&(n.match(/^Bearer\s+(.+)$/i)?.[1]??n).trim()||void 0}function vn(t){try{let e=JSON.parse(t);return Ge(e)??Ge(On(e.response))}catch{return}}function An(t){return[...t.getSetCookie?.()??[],...En(t.get("set-cookie"))].map(n=>n.trim().match(/(?:^|;\s*)uIdToken=([^;]+)/)?.[1]).find(Boolean)}function En(t){return t?t.split(/,(?=\s*[^;,]+=)/):[]}function Ge(t){if(t)for(let e of["uIdToken","authToken","token"]){let n=t[e];if(typeof n=="string"&&n)return n}}function On(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function xn(t,e=500){return t.length>e?`${t.slice(0,e)}...`:t}var Mn="guanbi_mcp_chatbi",B=class extends Error{detail;retryableForBaseUrl;authExpired;constructor(e,n,r={}){super(e),this.name="ChatBIRequestError",this.detail=n,this.retryableForBaseUrl=!!r.retryableForBaseUrl,this.authExpired=!!r.authExpired}},k=class{constructor(e){this.config=e;this.token=e.BI_UID_TOKEN,this.candidates=e.BI_BASE_URL?Pn(`${e.BI_BASE_URL}${e.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(e){let n=Je(e,"probe");return{available:!1,lastError:n,failureType:Wn(n),triedBaseUrls:this.getTriedBaseUrls(),registeredTools:this.getRegisteredTools()}}}async listThemes(e={}){let n={filter_enable:!0,list_type:"CHAT"};return typeof e.isInsight=="boolean"&&(n.is_insight=e.isInsight),(await this.request("/theme/list-theme",{operation:"listThemes",body:n,retrySafeBaseUrlFallback:!0,validateResponse:zn})).themes}async query(e){let n=await this.resolveThemeId(e.themeId,e.themeName,!1),r={attachments:[],theme_id:n,message:e.message,config:He({fast_mode:e.fastMode??!0,n_samples:e.nSamples})};e.sessionId&&(r.session_id=e.sessionId),e.externalContext&&(r.external_context=e.externalContext);let i=await this.request("/chat/send-message-sync",{operation:"query",body:r,includeDeviceId:!0});try{Yn(i)}catch(s){throw this.operationError("query","/chat/send-message-sync",s)}return i}async insight(e){let n=e.timeoutMs??3e5,r=e.pollIntervalMs??2e3,i=Date.now()+n,s=await this.startInsight({...e,requestTimeoutMs:$e(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,$e(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 er(i,r,n)}}async startInsight(e){let n=await this.resolveThemeId(e.themeId,e.themeName,!0),r={attachments:[],theme_id:n,message:e.message,is_insight:1};e.sessionId&&(r.session_id=e.sessionId),e.externalContext&&(r.external_context=e.externalContext);let i=He({analysis_expert_id:e.analysisExpertId,agent_mode:e.agentMode,analysis_confirmation_enabled:e.analysisConfirmationEnabled});Object.keys(i).length&&(r.config=i);let s=await this.request("/chat/send-message",{operation:"insight.send",body:r,includeDeviceId:!0,requestTimeoutMs:e.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(e){let n=await this.resolveThemeId(e.themeId,e.themeName,!0),r=await this.getAgentAnswer(n,e.messageId,e.requestTimeoutMs);return r.message_id||(r.message_id=e.messageId),r}async getAgentAnswer(e,n,r){let i=new URLSearchParams({theme_id:e,message_id:n});try{return await this.request(`/chat/get-agent-answer?${i.toString()}`,{operation:"insight.poll",retrySafeBaseUrlFallback:!0,requestTimeoutMs:r})}catch(s){if(Hn(s))return{status:"waiting",message_id:n};throw s}}async resolveThemeId(e,n,r){let i=e?.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 Kn(o,s)}async request(e,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,e,n);return n.validateResponse?.(o,{operation:n.operation,baseUrl:s,path:e}),this.resolvedBaseUrl=s,this.lastError=void 0,o}catch(o){if(i=o,this.lastError=Je(o,n.operation),!Ln(o,n.retrySafeBaseUrlFallback))throw this.withTriedBaseUrls(o)}}throw this.withTriedBaseUrls(i??new Error("\u65E0\u6CD5\u5B9A\u4F4D ChatBI Public API\u3002"))}withTriedBaseUrls(e){return e instanceof B&&(e.detail.tried_base_urls=this.getTriedBaseUrls(),this.lastError=e.detail),e}operationError(e,n,r){let i=r instanceof Error?r.message:String(r);return new B(i,{operation:e,base_url:this.resolvedBaseUrl,path:n,chatbi_message:i,tried_base_urls:this.getTriedBaseUrls(),detail:i})}async requestToBaseUrlWithAuthRetry(e,n,r){let i=await this.ensureToken(),s={operation:r.operation,baseUrl:e,path:n};try{return await this.requestToBaseUrl(e,n,i,r,s)}catch(o){if(!qn(o)||!this.hasPasswordLogin())throw o;let a=await this.refreshToken();return this.requestToBaseUrl(e,n,a,r,{...s,tokenRefreshed:!0})}}async requestToBaseUrl(e,n,r,i,s){let o=i.body===void 0?"GET":"POST",a;try{a=await fetch(`${e}${n}`,{method:o,headers:Dn(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(m){throw new B(m instanceof Error?m.message:String(m),{operation:s.operation,base_url:s.baseUrl,path:s.path,token_refreshed:s.tokenRefreshed,detail:m instanceof Error?m.message:String(m)})}let c=await a.text(),d=jn(c,a,s);if(!a.ok||Un(d))throw Nn(d,c,a,s);return this.refreshTokenFromResponse(a,d),d.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.signInForToken().finally(()=>{this.refreshPromise=void 0}),this.refreshPromise}async signInForToken(){this.token=void 0;let e=await W(this.config);return this.token=e.token,e.token}refreshTokenFromResponse(e,n){let r=Fn(e,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)}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 Pn(t){let e=new URL(t),n=[],r=s=>{let o=new URL(e.toString());o.pathname=s,o.search="",o.hash="";let a=o.toString().replace(/\/+$/,"");n.includes(a)||n.push(a)},i=e.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 K(t){return t.BI_BASE_URL?t.BI_UID_TOKEN?!0:!!(t.BI_LOGIN_DOMAIN&&t.BI_LOGIN_ID&&t.BI_LOGIN_PASSWORD):!1}function Dn(t,e){let n={Cookie:`uIdToken=${t}`,"User-Agent":"guanbi-mcp-server"};return e.body!==void 0&&(n["Content-Type"]="application/json"),e.includeDeviceId&&(n["Device-ID"]=Mn),n}function jn(t,e,n){if(!t)return{};try{return JSON.parse(t)}catch{throw new B("ChatBI response is not valid JSON",{operation:n.operation,base_url:n.baseUrl,path:n.path,http_status:e.status,token_refreshed:n.tokenRefreshed,detail:Fe(t)},{retryableForBaseUrl:!0})}}function Un(t){let e=Ve(t);return typeof e=="number"&&![0,200].includes(e)||t.result==="fail"||t.success===!1}function Nn(t,e,n,r){let i=Ve(t),s=$n(t),o=s||e||`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:Fe(e)},c=Vn(o),d=!c&&Gn(n.status,i);return new B(o,a,{authExpired:d,retryableForBaseUrl:c||Jn(n.status,i)})}function Ln(t,e){return!!(e&&t instanceof B&&t.retryableForBaseUrl)}function qn(t){return t instanceof B&&t.authExpired}function Gn(t,e){return t===401||t===403||e===401||e===403||e===5001}function Jn(t,e){return[401,403,404,405].includes(t)||typeof e=="number"&&[401,403,404,405].includes(e)}function Hn(t){return t instanceof B&&t.detail.http_status===200&&t.detail.chatbi_code===404&&t.detail.chatbi_message==="Message not found."}function Ve(t){if(typeof t.code=="number")return t.code;let e=Y(t.error);return typeof e?.status=="number"?e.status:void 0}function $n(t){if(typeof t.message=="string"&&t.message.trim())return t.message;let e=Y(t.error);return typeof e?.message=="string"&&e.message.trim()?e.message:void 0}function Vn(t){return/No static resource/i.test(t)}function Y(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function zn(t,e){let n=Y(t);if(!Array.isArray(n?.themes))throw new B("ChatBI list-theme response missing themes",{operation:e.operation,base_url:e.baseUrl,path:e.path,detail:"missing themes"},{retryableForBaseUrl:!0})}function Fn(t,e){let r=[...t.headers.getSetCookie?.()??[],...Qn(t.headers.get("set-cookie"))].map(s=>pe(s.trim().match(/(?:^|;\s*)uIdToken=([^;]+)/)?.[1])).find(Boolean);if(r)return r;let i=pe(t.headers.get("x-auth-token"));return i||ze(e)}function Qn(t){return t?t.split(/,(?=\s*[^;,]+=)/):[]}function pe(t){if(typeof t!="string")return;let e=t.trim();return e&&!/\s/.test(e)?e:void 0}function ze(t){let e=Y(t);if(e){for(let n of["uIdToken","authToken"]){let r=pe(e[n]);if(r)return r}for(let n of["data","response"]){let r=ze(e[n]);if(r)return r}}}function Je(t,e){return t instanceof B?t.detail:{operation:e,detail:t instanceof Error?t.message:String(t)}}function Fe(t,e=1e3){return t.length>e?`${t.slice(0,e)}...`:t}function Wn(t){let e=`${t.chatbi_message??""} ${t.detail??""}`;return/BI 登录失败|密码登录|sign-?in|login/i.test(e)?"login_failed":t.http_status===401||t.http_status===403||t.chatbi_code===401||t.chatbi_code===403?"permission_denied":/No static resource|not valid JSON/i.test(e)||t.http_status===404||t.http_status===405||t.chatbi_code===404||t.chatbi_code===405?"public_api_unreachable":"unknown"}function Kn(t,e){let n=e.trim().toLowerCase(),r,i=[];for(let s of t){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${e}`):new Error(`\u672A\u627E\u5230\u4E3B\u9898\uFF1A${e}`)}function He(t){return Object.fromEntries(Object.entries(t).filter(([,e])=>typeof e<"u"))}function Yn(t){if([t.final_status,t.answer_status,t.query_status].some(Zn))throw new Error(`ChatBI query failed: ${Xn(t.query_context?.err_msg,t.query_context?.detail,t.query_context?.msg,t.answer_context?.detail,t.answer_context?.msg,"unknown failure")}`);if(!t.answer?.explain?.trim()&&!(t.query_result?.columns?.length||t.query_result?.preview?.length))throw new Error("ChatBI response missing query content")}function Xn(...t){return t.find(e=>typeof e=="string"&&e.trim())?.trim()}function Zn(t){return typeof t=="string"&&t.trim().toLowerCase()==="failure"}function $e(t){let e=t-Date.now();if(e<=0)throw new Error("Insight request timed out");return e}async function er(t,e,n){let r=t-Date.now();if(r<=0)throw new Error(`Insight request timed out after ${n}ms`);await new Promise(i=>setTimeout(i,Math.min(e,r)))}var G="8.2.1",fe=["search_metrics","list_metric_catalog","get_metric_detail","query_metric_data","search_metric_trees","get_metric_tree_detail","query_metric_tree_attribution"],tr=["get_bi_capabilities","global_search",...fe,"execute_sql_query","get_dataset_detail","get_card_info","get_page_info"],nr=6e4,me=new WeakMap;async function H(t,e){let n=me.get(t);return(!n||n.expiresAt<=Date.now())&&me.set(t,{expiresAt:Date.now()+nr,promise:ir(t,e).catch(r=>rr(r,e))}),me.get(t).promise}function Ke(t){let e=!t.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:!e,error:e?"\u914D\u7F6E\u4E0D\u5B8C\u6574\uFF1A\u7F3A\u5C11 BI_BASE_URL\u3002":void 0,versionSource:"api",dataVersion:t.BI_DATA_VERSION,service:he(t,e?["get_bi_capabilities"]:ge(t)),caller:{ok:!1,error:r,features:{executeSqlQuery:{enabled:!1,minVersion:G,reason:r}},chatbi:J(t,r)},features:{executeSqlQuery:{enabled:!e,minVersion:G,reason:e?"\u914D\u7F6E\u4E0D\u5B8C\u6574\uFF1A\u7F3A\u5C11 BI_BASE_URL\u3002":n}},metricPlatform:{registeredTools:e?[]:fe,readOnly:!0,lastError:e?"\u914D\u7F6E\u4E0D\u5B8C\u6574\uFF1A\u7F3A\u5C11 BI_BASE_URL\u3002":void 0},chatbi:J(t,"HTTP \u6A21\u5F0F\u542F\u52A8\u671F\u4E0D\u4F7F\u7528\u67D0\u4E2A\u7528\u6237 token \u63A2\u6D4B ChatBI \u80FD\u529B\u3002")}}async function Ye(t,e,n){let i=(await H(t,e)).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 rr(t,e){let n=t instanceof Error?t.message:String(t);return{ok:!1,error:n,versionSource:"api",features:{executeSqlQuery:{enabled:!1,minVersion:G,reason:`\u65E0\u6CD5\u786E\u8BA4 BI \u80FD\u529B\uFF1A${n}`}},metricPlatform:{registeredTools:[],readOnly:!0,lastError:n},chatbi:J(e,n),service:he(e,ge(e)),caller:{ok:!1,error:n,features:{executeSqlQuery:{enabled:!1,minVersion:G,reason:`\u65E0\u6CD5\u786E\u8BA4 BI \u80FD\u529B\uFF1A${n}`}},chatbi:J(e,n)}}}async function ir(t,e){let n=or(e);if(n.length)throw new Error(`\u914D\u7F6E\u4E0D\u5B8C\u6574\uFF1A${n.join("\uFF1B")}\u3002`);let r=e.BI_DATA_VERSION?"env":"api",i=e.BI_DATA_VERSION?{dataVersion:e.BI_DATA_VERSION,capabilityVersion:e.BI_DATA_VERSION}:await ar(t),s=cr(i.capabilityVersion,G),o=await sr(e);return{ok:!0,appVersion:i.appVersion,dataVersion:i.dataVersion,versionSource:r,service:he(e,ge(e)),caller:{ok:!0,features:{executeSqlQuery:s},chatbi:o},features:{executeSqlQuery:s},metricPlatform:{registeredTools:fe,readOnly:!0},chatbi:o}}function ge(t){let e=new Set(tr);if(K(t)||t.MCP_TRANSPORT==="streamable-http")for(let n of new k(t).getRegisteredTools())e.add(n);return[...e]}function he(t,e){return{mode:t.MCP_TRANSPORT??"stdio",toolList:e,boundBISite:{configured:!!t.BI_BASE_URL,baseUrl:t.BI_BASE_URL,publicPath:t.BI_PUBLIC_PATH}}}async function sr(t){let e=new k(t);return K(t)?e.probe():J(t,"\u7F3A\u5C11 BI_BASE_URL \u6216\u9274\u6743\u914D\u7F6E\u3002")}function J(t,e){return{available:!1,registeredTools:K(t)?new k(t).getRegisteredTools():[],failureType:"unknown",triedBaseUrls:[],lastError:{operation:"probe",chatbi_message:e,detail:e}}}function or(t){let e=[];if(t.BI_BASE_URL||e.push("\u7F3A\u5C11 BI_BASE_URL"),!t.BI_UID_TOKEN){let n=[["BI_LOGIN_DOMAIN",t.BI_LOGIN_DOMAIN],["BI_LOGIN_ID",t.BI_LOGIN_ID],["BI_LOGIN_PASSWORD",t.BI_LOGIN_PASSWORD]].filter(([,r])=>!r).map(([r])=>r);n.length&&e.push(`\u7F3A\u5C11\u9274\u6743\u914D\u7F6E\uFF1A\u8BF7\u914D\u7F6E BI_UID_TOKEN\uFF0C\u6216\u8865\u5168\u8D26\u53F7\u5BC6\u7801\u767B\u5F55\u914D\u7F6E\uFF08\u7F3A\u5C11 ${n.join("\u3001")}\uFF09`)}return e}async function ar(t){let e=await t.get("/api/server-version"),n=We(e.version),r=We(e.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 cr(t,e){let n=Qe(t),r=Qe(e);if(!r)throw new Error(`\u5185\u90E8\u914D\u7F6E\u9519\u8BEF\uFF1A\u65E0\u6CD5\u89E3\u6790\u6700\u4F4E\u7248\u672C ${e}\u3002`);if(!n)return{enabled:!1,minVersion:e,reason:`\u65E0\u6CD5\u4ECE\u7248\u672C\u5B57\u7B26\u4E32 "${t}" \u4E2D\u89E3\u6790\u4EA7\u54C1\u7248\u672C\uFF0C\u8BF7\u914D\u7F6E BI_DATA_VERSION\u3002`};let i=ur(n,r)>=0;return{enabled:i,minVersion:e,reason:i?void 0:`\u9700\u8981 BI ${e}+\uFF0C\u5F53\u524D\u7248\u672C\u4E3A ${t}\u3002`}}function Qe(t){let e=t.match(/(\d+)\.(\d+)\.(\d+)/);if(e)return[Number(e[1]),Number(e[2]),Number(e[3])]}function ur(t,e){for(let n=0;n<t.length;n+=1){let r=t[n]-e[n];if(r!==0)return r}return 0}function We(t){return typeof t=="string"&&t.trim()?t.trim():void 0}function dr(t){return{transport:"stdio",biUidToken:t.BI_UID_TOKEN,audit:{}}}function Xe(t){return{resolve:()=>dr(t)}}function lr(t){let e=X(t,"x-guanbi-uid-token")?.trim();if(!e)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:e,audit:{tenantId:_e(X(t,"x-tenant-id")),endUserId:_e(X(t,"x-end-user-id")),traceId:_e(X(t,"x-trace-id"))}}}function Ze(){return{resolve:t=>t?.requestInfo?.headers?lr(t.requestInfo.headers):{transport:"streamable-http",audit:{}}}}function X(t,e){if(t instanceof Headers)return t.get(e)??void 0;let n=t.get;if(typeof n=="function")return n.call(t,e)??void 0;let r=e.toLowerCase();for(let[i,s]of Object.entries(t))if(i.toLowerCase()===r)return Array.isArray(s)?s[0]:s}function _e(t){return t?.trim()||void 0}var Z=class{constructor(e){this.config=e;this.token=e.BI_UID_TOKEN}config;token;async get(e,n){return this.request("GET",e,void 0,n)}async post(e,n,r){return this.request("POST",e,n,r)}async put(e,n,r){return this.request("PUT",e,n,r)}async getText(e){let n=await this.ensureToken(),r=await fetch(this.buildUrl(e),{method:"GET",headers:{"raw-backend-response":"TRUE",Cookie:`uIdToken=${n}`},signal:AbortSignal.timeout(this.config.BI_REQUEST_TIMEOUT_MS)});if(this.shouldRefreshToken(r)){let s=await this.refreshToken();r=await fetch(this.buildUrl(e),{method:"GET",headers:{"raw-backend-response":"TRUE",Cookie:`uIdToken=${s}`},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 ${e} HTTP ${r.status} ${et(i)}`);return this.refreshTokenFromResponse(r),i}async request(e,n,r,i){let s=await this.ensureToken(),o=await this.fetchWithToken(e,n,s,r,i);if(this.shouldRefreshToken(o)){let c=await this.refreshToken();o=await this.fetchWithToken(e,n,c,r,i)}let a=await o.text();if(!o.ok)throw new Error(`BI \u8BF7\u6C42\u5931\u8D25\uFF1A${e} ${n} HTTP ${o.status} ${et(a)}`);return this.refreshTokenFromResponse(o),pr(a)}async fetchWithToken(e,n,r,i,s){return fetch(this.buildUrl(n),{method:e,headers:{"Content-Type":"application/json","raw-backend-response":"TRUE",Cookie:`uIdToken=${r}`,...s?.headers},body:e==="POST"||e==="PUT"?JSON.stringify(i??{}):void 0,signal:AbortSignal.timeout(this.config.BI_REQUEST_TIMEOUT_MS)})}async ensureToken(){if(this.token)return this.token;let e=await W(this.config);return this.token=e.token,e.token}async refreshToken(){return this.token=void 0,this.ensureToken()}refreshTokenFromResponse(e){let n=fr(e);!n||n===this.token||(this.token=n)}shouldRefreshToken(e){return this.hasPasswordLogin()&&e.status===401}hasPasswordLogin(){return!!(this.config.BI_LOGIN_DOMAIN&&this.config.BI_LOGIN_ID&&this.config.BI_LOGIN_PASSWORD)}buildUrl(e){let n=e.startsWith("/")?e:`/${e}`;return`${this.config.BI_BASE_URL}${this.config.BI_PUBLIC_PATH}${n}`}};function pr(t){if(!t)return;let e=JSON.parse(t);if(!mr(e))return e;if(e.result&&!["ok","success"].includes(e.result.toLowerCase()))throw new Error(`BI \u8FD4\u56DE\u9519\u8BEF\uFF1A${e.message??JSON.stringify(e.error??e)}`);if(e.success===!1)throw new Error(`BI \u8FD4\u56DE\u9519\u8BEF\uFF1A${e.message??JSON.stringify(e.error??e)}`);return"response"in e?e.response:e}function mr(t){return!t||typeof t!="object"||Array.isArray(t)?!1:"response"in t||"result"in t||"success"in t}function fr(t){return gr(t.headers)??_r(t.headers)}function gr(t){return[...t.getSetCookie?.()??[],...hr(t.get("set-cookie"))].map(n=>tt(n.trim().match(/(?:^|;\s*)uIdToken=([^;]+)/)?.[1])).find(Boolean)}function hr(t){return t?t.split(/,(?=\s*[^;,]+=)/):[]}function _r(t){return tt(t.get("x-auth-token"))}function tt(t){if(typeof t!="string")return;let e=t.trim();return e&&!/\s/.test(e)?e:void 0}function et(t,e=1e3){return t.length>e?`${t.slice(0,e)}...`:t}var ee=class{constructor(e,n={}){this.baseConfig=e;this.options=n}baseConfig;options;stdioClient;create(e){if(e.transport==="stdio"&&this.stdioClient)return this.stdioClient;let n=this.resolveConfig(e),r={client:this.options.clientFactory?.(n)??new Z(n),config:n,context:e};return e.transport==="stdio"&&(this.stdioClient=r),r}resolveConfig(e){let n=e.biUidToken??(e.transport==="stdio"?this.baseConfig.BI_UID_TOKEN:void 0);return{...this.baseConfig,BI_UID_TOKEN:n,BI_LOGIN_DOMAIN:e.transport==="stdio"?this.baseConfig.BI_LOGIN_DOMAIN:"",BI_LOGIN_ID:e.transport==="stdio"?this.baseConfig.BI_LOGIN_ID:void 0,BI_LOGIN_PASSWORD:e.transport==="stdio"?this.baseConfig.BI_LOGIN_PASSWORD:void 0}}};var nt={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},te=class{serviceDomain;appVersion;enabled;sender;now;constructor({config:e,appVersion:n,sender:r=yr(),now:i=Date.now}){this.serviceDomain=Cr(e.BI_BASE_URL),this.appVersion=n,this.enabled=Tr(e),this.sender=r,this.now=i}observeToolCallStart(e){return{toolName:e,startedAtMs:this.now()}}observeToolCallEnd(e,n){if(!this.enabled||!this.serviceDomain)return;let r={service_domain:this.serviceDomain,app_version:this.appVersion,tool:e.toolName,success:n.success,duration_ms_bucket:wr(this.now()-e.startedAtMs),error_type:n.success?"none":Sr(n.error)};try{Promise.resolve(this.sender(r)).catch(()=>{})}catch{}}};function br(t=nt){return e=>Ir(e,t)}async function Ir(t,e=nt){try{if(!e.endpoint||!e.measurementId||!e.apiSecret||!t.tool)return;let n=new URL(e.endpoint);n.searchParams.set("measurement_id",e.measurementId),n.searchParams.set("api_secret",e.apiSecret);let r=JSON.stringify({client_id:e.clientId,events:[{name:e.eventName,params:{service_domain:t.service_domain,app_version:t.app_version,tool:t.tool,success:t.success,duration_ms_bucket:t.duration_ms_bucket,error_type:t.error_type,session_id:e.sessionId,engagement_time_msec:e.engagementTimeMsec}}]}),i=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:r,signal:AbortSignal.timeout(e.timeoutMs)});await Br(i,e.maxResponseBytes)}catch{}}function yr(){return Rr(process.env)?()=>{}:br()}function Tr(t){let e=t.GUANBI_MCP_USAGE_STATS?.trim().toLowerCase();return e?["0","false","off","no"].includes(e)?!1:(["1","true","on","yes"].includes(e),!0):!0}function rt(t,e,n){return(async(...r)=>{let i=n.observeToolCallStart(t);try{let s=await e(...r);return n.observeToolCallEnd(i,{success:!0}),s}catch(s){throw n.observeToolCallEnd(i,{success:!1,error:s}),s}})}function Cr(t){if(t)try{return new URL(t).hostname}catch{return}}function wr(t){return t<1e3?"<1s":t<5e3?"1-5s":t<3e4?"5-30s":t<12e4?"30-120s":">120s"}async function Br(t,e){let n=t.body?.getReader();if(!n)return;let r=0;try{for(;r<e;){let{done:i,value:s}=await n.read();if(i)return;r+=s.byteLength}}finally{await n.cancel().catch(()=>{})}}function Sr(t){let e=t instanceof Error?t.message:String(t);return/校验|验证|validation|invalid|schema|zod/i.test(e)?"validation":/鉴权|登录|认证|unauthorized|unauthenticated|401|auth/i.test(e)?"auth":/权限|forbidden|permission|403/i.test(e)?"permission":/timeout|network|fetch|econn|enotfound|socket/i.test(e)?"network":/BI 请求失败|BI 返回错误|HTTP \d{3}/i.test(e)?"bi_error":"unknown"}function Rr(t){return t.NODE_ENV==="test"||t.VITEST==="true"}var ne=class{constructor(e,n,r=new Q){this.callerContextResolver=e;this.clientFactory=n;this.auditLogger=r}callerContextResolver;clientFactory;auditLogger;async run(e,n,r){let i=Date.now(),s=await this.callerContextResolver.resolve(n);try{let o=await e(this.clientFactory.create(s));if(r){let a=kr(o)?"error":"success";this.auditLogger.record(le(r,s,i,a,o))}return o}catch(o){throw r&&this.auditLogger.record(le(r,s,i,"error",o)),o}}};function kr(t){return!!(t&&typeof t=="object"&&t.isError===!0)}function v(t){return{content:[{type:"text",text:JSON.stringify(t,null,2)}]}}function y(t){let e=it(t);return{content:[{type:"text",text:JSON.stringify(e,null,2)}],structuredContent:e}}function $(t){let e=it(t);return{content:[{type:"text",text:JSON.stringify(e,null,2)}],isError:!0}}function it(t){return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}var st={};async function ot(t,e){return v(await H(t,e))}import{createHash as vr}from"crypto";import{z as p}from"zod";var Ar=6e4,P=1e4,at=10*6e4,re=new Map,ie=new Map,be=new Map,Ie=new Map,ut=p.object({format:p.literal("markdown").describe("\u6700\u7EC8\u7ED3\u679C\u683C\u5F0F\u3002"),content:p.string().describe("\u6700\u7EC8\u5C55\u793A\u7ED9\u8C03\u7528\u8005\u6216\u7528\u6237\u7684 markdown \u5185\u5BB9\u3002")}),dt={themes:p.array(p.object({theme_id:p.string().optional(),theme_name:p.string().optional(),is_insight_enabled:p.boolean().optional()}).passthrough()),resolved_base_url:p.string().optional(),tried_base_urls:p.array(p.string()).optional()},lt={session_id:p.string().optional(),message_id:p.string().optional(),answer:p.unknown().optional().describe("ChatBI \u540E\u7AEF\u8FD4\u56DE\u7684\u95EE\u6570\u89E3\u91CA\u6216\u539F\u59CB\u7B54\u6848\u7ED3\u6784\u3002"),sql:p.unknown().optional().describe("ChatBI \u540E\u7AEF\u751F\u6210\u7684 SQL \u4FE1\u606F\u3002"),answer_status:p.string().optional(),final_status:p.string().optional(),query_result:p.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:p.string().optional(),tried_base_urls:p.array(p.string()).optional()},fs={message_id:p.string().optional(),session_id:p.string().optional(),status:p.string(),detail:p.string().nullable().optional(),question:p.string().nullable().optional(),answer:p.unknown().optional(),final_result:ut.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:p.string().optional(),tried_base_urls:p.array(p.string()).optional()},pt={theme_id:p.string().optional(),message_id:p.string().optional(),session_id:p.string().optional(),status:p.literal("started"),deduped:p.boolean(),retry_after_ms:p.number().int().nonnegative(),next_action:p.string().optional(),resolved_base_url:p.string().optional(),tried_base_urls:p.array(p.string()).optional()},mt={message_id:p.string().optional(),session_id:p.string().optional(),status:p.string(),detail:p.string().nullable().optional(),question:p.string().nullable().optional(),answer:p.unknown().optional(),throttled:p.boolean(),retry_after_ms:p.number().int().nonnegative(),final_result:ut.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:p.string().optional(),resolved_base_url:p.string().optional(),tried_base_urls:p.array(p.string()).optional()},ft={is_insight:p.boolean().optional().describe("\u662F\u5426\u53EA\u5217\u51FA\u6D1E\u5BDF\u4E3B\u9898\u3002")},gt={theme_id:p.string().min(1).optional().describe("ChatBI \u4E3B\u9898 ID\u3002"),theme_name:p.string().min(1).optional().describe("ChatBI \u4E3B\u9898\u540D\u79F0\u3002"),message:p.string().min(1).describe("\u81EA\u7136\u8BED\u8A00\u95EE\u6570\u95EE\u9898\u3002"),session_id:p.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:p.string().min(1).optional().describe("\u53EF\u9009\u5916\u90E8\u4E0A\u4E0B\u6587\u3002")},gs={theme_id:p.string().min(1).optional().describe("ChatBI \u4E3B\u9898 ID\u3002"),theme_name:p.string().min(1).optional().describe("ChatBI \u4E3B\u9898\u540D\u79F0\u3002"),message:p.string().min(1).describe("\u81EA\u7136\u8BED\u8A00\u6D1E\u5BDF\u95EE\u9898\u3002"),session_id:p.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:p.string().min(1).optional().describe("\u53EF\u9009\u5916\u90E8\u4E0A\u4E0B\u6587\u3002"),timeout_ms:p.number().int().positive().optional().describe("\u7B49\u5F85\u6D1E\u5BDF\u5B8C\u6210\u7684\u8D85\u65F6\u65F6\u95F4\uFF0C\u9ED8\u8BA4 300000ms\u3002"),poll_interval_ms:p.number().int().positive().optional().describe("\u8F6E\u8BE2\u95F4\u9694\uFF0C\u9ED8\u8BA4 2000ms\u3002")},ht={theme_id:p.string().min(1).optional().describe("ChatBI \u4E3B\u9898 ID\u3002"),theme_name:p.string().min(1).optional().describe("ChatBI \u4E3B\u9898\u540D\u79F0\u3002"),message:p.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:p.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:p.string().min(1).optional().describe("\u53EF\u9009\u5916\u90E8\u4E0A\u4E0B\u6587\u3002")},_t={theme_id:p.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:p.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:p.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 bt(t,e){let n=new k(t);try{let r=await n.listThemes({isInsight:e.is_insight});return y({themes:r,resolved_base_url:n.getResolvedBaseUrl(),tried_base_urls:n.getTriedBaseUrls()})}catch(r){return oe(n,r,"listThemes")}}async function It(t,e){let n=new k(t);try{let r=await n.query({themeId:e.theme_id,themeName:e.theme_name,message:e.message,sessionId:e.session_id,externalContext:e.external_context,fastMode:!0});return y({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 yt(t,e){let n=new k(t);try{let r=Ct({caller_scope:wt(t),theme_id:e.theme_id,theme_name:e.theme_name,message:e.message,session_id:e.session_id,external_context:e.external_context}),i=Er(r);if(i)return y({...i,deduped:!0,retry_after_ms:P,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=be.get(r);if(s){let c=await s;return y({...c,deduped:!0,retry_after_ms:P,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:e.theme_id,themeName:e.theme_name,message:e.message,sessionId:e.session_id,externalContext:e.external_context}).then(c=>{let d={theme_id:c.theme_id,message_id:c.message_id,session_id:c.session_id,status:"started"};return Or(r,d),d}).finally(()=>{be.delete(r)});be.set(r,o);let a=await o;return y({...a,deduped:!1,retry_after_ms:P,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 Tt(t,e){let n=new k(t);try{let r=Ct({caller_scope:wt(t),message_id:e.message_id}),i=xr(r);if(i){let f=ye(i.result),C=Ce(i.result,!0);return y({message_id:i.result.message_id,session_id:i.result.session_id,status:i.result.status,detail:Te(i.result),question:i.result.question,answer:i.result.answer,throttled:!0,retry_after_ms:i.retryAfterMs,...f,next_action:C})}let s=Ie.get(r);if(s){let f=await s,C=we(f.status),_=ye(f),T=Ce(f,!0);return y({message_id:f.message_id,session_id:f.session_id,status:f.status,detail:Te(f),question:f.question,answer:f.answer,throttled:!0,retry_after_ms:C?0:P,..._,next_action:T})}let o=n.pollInsight({themeId:e.theme_id,themeName:e.theme_name,messageId:e.message_id}).then(f=>(Mr(r,f),f)).finally(()=>{Ie.delete(r)});Ie.set(r,o);let a=await o,c=we(a.status),d=ye(a),m=Ce(a,!1);return y({message_id:a.message_id,session_id:a.session_id,status:a.status,detail:Te(a),question:a.question,answer:a.answer,throttled:!1,retry_after_ms:c?0:P,...d,next_action:m,resolved_base_url:n.getResolvedBaseUrl(),tried_base_urls:n.getTriedBaseUrls()})}catch(r){return oe(n,r,"insight.poll")}}function ye(t){return t.status!=="success"?{}:{final_result:{format:"markdown",content:Bt(t)}}}function Te(t){return t.detail!=null?t.detail:t.status==="failure"||t.status==="stopped"?Pr(t):t.detail}function Ce(t,e){if(t.status!=="success")return t.status==="waiting"?e?"\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":t.status==="failure"||t.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 Er(t){se();let e=re.get(t);if(!(!e||Date.now()-e.createdAt>=Ar))return e.result}function Or(t,e){se(),re.set(t,{createdAt:Date.now(),result:e})}function xr(t){se();let e=ie.get(t);if(!e)return;let n=Date.now()-e.checkedAt,r=we(e.result.status);if(!(!r&&n>=P))return{result:e.result,retryAfterMs:r?0:Math.max(0,P-n)}}function we(t){return t==="success"||t==="failure"||t==="stopped"}function Mr(t,e){se(),ie.set(t,{checkedAt:Date.now(),result:e})}function se(){let t=Date.now();for(let[e,n]of re)t-n.createdAt>=at&&re.delete(e);for(let[e,n]of ie)t-n.checkedAt>=at&&ie.delete(e)}function Ct(t){return JSON.stringify(Object.keys(t).sort().reduce((e,n)=>{let r=t[n];return typeof r<"u"&&(e[n]=r),e},{}))}function wt(t){return t.BI_UID_TOKEN?`uid:${ct(t.BI_UID_TOKEN)}`:`login:${ct(`${t.BI_LOGIN_DOMAIN??""}\0${t.BI_LOGIN_ID??""}`)}`}function ct(t){return vr("sha256").update(t).digest("hex").slice(0,16)}function Bt(t){let e=t.answer?.trim();if(e)return Lr(e);let n=t.detail?.trim();return n||"\u5206\u6790\u5DF2\u5B8C\u6210\uFF0C\u4F46\u6CA1\u6709\u53EF\u5C55\u793A\u7684 markdown \u5185\u5BB9\u3002"}function Pr(t){switch(t.status){case"success":return Bt(t);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 t.detail?.trim()||"\u6D1E\u5BDF\u4EFB\u52A1\u672A\u6210\u529F\u5B8C\u6210\u3002";default:return t.detail?.trim()||`\u6D1E\u5BDF\u4EFB\u52A1\u5F53\u524D\u72B6\u6001\uFF1A${t.status}`}}function Dr(t,e){let n=[`| ${t.join(" | ")} |`,`|${t.map(()=>" --- ").join("|")}|`];for(let r of e)n.push(`| ${t.map((i,s)=>Ur(jr(r[s]))).join(" | ")} |`);return n.join(`
|
|
3
|
-
`)}function jr(t){return t===null||typeof t>"u"||t===""?"-":String(t)}function Ur(t){return t.replaceAll(`\r
|
|
2
|
+
import"dotenv/config";import{z as R}from"zod";var Yn=R.object({BI_BASE_URL:R.string().url().optional(),BI_PUBLIC_PATH:R.string().optional().default(""),BI_UID_TOKEN:R.string().optional(),BI_LOGIN_DOMAIN:R.string().optional().default("guanbi"),BI_LOGIN_ID:R.string().optional(),BI_LOGIN_PASSWORD:R.string().optional(),BI_REQUEST_TIMEOUT_MS:R.coerce.number().int().positive().default(12e4),BI_MAX_ROWS:R.coerce.number().int().positive().default(1e3),BI_DATA_VERSION:R.string().optional(),GUANBI_MCP_USAGE_STATS:R.string().optional(),MCP_TRANSPORT:R.enum(["stdio","streamable-http"]).optional().default("stdio"),MCP_HTTP_HOST:R.string().optional().default("127.0.0.1"),MCP_HTTP_PORT:R.coerce.number().int().nonnegative().optional().default(9090),MCP_ENTRYPOINT_TOKEN:R.string().optional(),MCP_TRUSTED_GATEWAY:R.string().optional()});function nt(e=process.env){let t=Yn.parse(e);return{...t,BI_BASE_URL:t.BI_BASE_URL?.replace(/\/+$/,""),BI_PUBLIC_PATH:Zn(t.BI_PUBLIC_PATH),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_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 Zn(e){let t=e?.trim().replace(/^\/+|\/+$/g,"")??"";return t?`/${t}`:""}import{createRequire as ks}from"module";import{createHash as As,randomUUID as vs}from"crypto";import{createServer as xs}from"http";import{McpServer as Ms}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as Ps}from"@modelcontextprotocol/sdk/server/stdio.js";import{StreamableHTTPServerTransport as js}from"@modelcontextprotocol/sdk/server/streamableHttp.js";var ne=class{record(t){console.error(JSON.stringify({audit:er({...t})}))}},re=class{record(){}};function Te(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"?Xn(i):void 0}}function Xn(e){return e instanceof Error?e.name||"Error":typeof e}function er(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}async function ie(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(tr(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} ${cr(n)}`);let r=nr(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 tr(e,t){return`${e.BI_BASE_URL}${e.BI_PUBLIC_PATH}${t}`}function nr(e,t){let n=rr(e.headers);if(n)return n;let r=ir(t);return r||sr(e.headers)}function rr(e){let t=e.get("x-auth-token")?.trim();if(t)return t;let n=e.get("authorization")?.trim();return n&&(n.match(/^Bearer\s+(.+)$/i)?.[1]??n).trim()||void 0}function ir(e){try{let t=JSON.parse(e);return rt(t)??rt(ar(t.response))}catch{return}}function sr(e){return[...e.getSetCookie?.()??[],...or(e.get("set-cookie"))].map(n=>n.trim().match(/(?:^|;\s*)uIdToken=([^;]+)/)?.[1]).find(Boolean)}function or(e){return e?e.split(/,(?=\s*[^;,]+=)/):[]}function rt(e){if(e)for(let t of["uIdToken","authToken","token"]){let n=e[t];if(typeof n=="string"&&n)return n}}function ar(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function cr(e,t=500){return e.length>t?`${e.slice(0,t)}...`:e}var ur="guanbi_mcp_chatbi",E=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}},x=class{constructor(t){this.config=t;this.token=t.BI_UID_TOKEN,this.candidates=t.BI_BASE_URL?dr(`${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=it(t,"probe");return{available:!1,lastError:n,failureType:Br(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:Cr})).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{Rr(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 Ar(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(yr(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 Or(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=it(o,n.operation),!gr(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 E&&(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 E(i,{operation:t,base_url:this.resolvedBaseUrl,path:n,chatbi_message:i,tried_base_urls:this.getTriedBaseUrls(),detail:i})}async requestToBaseUrlWithAuthRetry(t,n,r){let i=await this.ensureToken(),s={operation:r.operation,baseUrl:t,path:n};try{return await this.requestToBaseUrl(t,n,i,r,s)}catch(o){if(!hr(o)||!this.hasPasswordLogin())throw o;let a=await this.refreshToken();return this.requestToBaseUrl(t,n,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:lr(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(l){throw new E(l instanceof Error?l.message:String(l),{operation:s.operation,base_url:s.baseUrl,path:s.path,token_refreshed:s.tokenRefreshed,detail:l instanceof Error?l.message:String(l)})}let c=await a.text(),u=pr(c,a,s);if(!a.ok||mr(u))throw fr(u,c,a,s);return this.refreshTokenFromResponse(a,u),u.data}async ensureToken(){return this.token?this.token:(this.loginPromise??=this.signInForToken().finally(()=>{this.loginPromise=void 0}),this.loginPromise)}async refreshToken(){return this.refreshPromise??=this.signInForToken().finally(()=>{this.refreshPromise=void 0}),this.refreshPromise}async signInForToken(){this.token=void 0;let t=await ie(this.config);return this.token=t.token,t.token}refreshTokenFromResponse(t,n){let r=wr(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)}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 dr(e){let t=new URL(e),n=[],r=s=>{let o=new URL(t.toString());o.pathname=s,o.search="",o.hash="";let a=o.toString().replace(/\/+$/,"");n.includes(a)||n.push(a)},i=t.pathname.replace(/\/+$/,"");return r("/api/chat/public-api"),i&&r(`${i}/api/chat/public-api`),r(i?`${i}/public-api`:"/public-api"),r("/public-api"),n}function se(e){return e.BI_BASE_URL?e.BI_UID_TOKEN?!0:!!(e.BI_LOGIN_DOMAIN&&e.BI_LOGIN_ID&&e.BI_LOGIN_PASSWORD):!1}function lr(e,t){let n={Cookie:`uIdToken=${e}`,"User-Agent":"guanbi-mcp-server"};return t.body!==void 0&&(n["Content-Type"]="application/json"),t.includeDeviceId&&(n["Device-ID"]=ur),n}function pr(e,t,n){if(!e)return{};try{return JSON.parse(e)}catch{throw new E("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:ut(e)},{retryableForBaseUrl:!0})}}function mr(e){let t=at(e);return typeof t=="number"&&![0,200].includes(t)||e.result==="fail"||e.success===!1}function fr(e,t,n,r){let i=at(e),s=Ir(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:ut(t)},c=Tr(o),u=!c&&_r(n.status,i);return new E(o,a,{authExpired:u,retryableForBaseUrl:c||br(n.status,i)})}function gr(e,t){return!!(t&&e instanceof E&&e.retryableForBaseUrl)}function hr(e){return e instanceof E&&e.authExpired}function _r(e,t){return e===401||e===403||t===401||t===403||t===5001}function br(e,t){return[401,403,404,405].includes(e)||typeof t=="number"&&[401,403,404,405].includes(t)}function yr(e){return e instanceof E&&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=oe(e.error);return typeof t?.status=="number"?t.status:void 0}function Ir(e){if(typeof e.message=="string"&&e.message.trim())return e.message;let t=oe(e.error);return typeof t?.message=="string"&&t.message.trim()?t.message:void 0}function Tr(e){return/No static resource/i.test(e)}function oe(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function Cr(e,t){let n=oe(e);if(!Array.isArray(n?.themes))throw new E("ChatBI list-theme response missing themes",{operation:t.operation,base_url:t.baseUrl,path:t.path,detail:"missing themes"},{retryableForBaseUrl:!0})}function wr(e,t){let r=[...e.headers.getSetCookie?.()??[],...Sr(e.headers.get("set-cookie"))].map(s=>Ce(s.trim().match(/(?:^|;\s*)uIdToken=([^;]+)/)?.[1])).find(Boolean);if(r)return r;let i=Ce(e.headers.get("x-auth-token"));return i||ct(t)}function Sr(e){return e?e.split(/,(?=\s*[^;,]+=)/):[]}function Ce(e){if(typeof e!="string")return;let t=e.trim();return t&&!/\s/.test(t)?t:void 0}function ct(e){let t=oe(e);if(t){for(let n of["uIdToken","authToken"]){let r=Ce(t[n]);if(r)return r}for(let n of["data","response"]){let r=ct(t[n]);if(r)return r}}}function it(e,t){return e instanceof E?e.detail:{operation:t,detail:e instanceof Error?e.message:String(e)}}function ut(e,t=1e3){return e.length>t?`${e.slice(0,t)}...`:e}function Br(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 Or(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 Rr(e){if([e.final_status,e.answer_status,e.query_status].some(kr))throw new Error(`ChatBI query failed: ${Er(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 Er(...e){return e.find(t=>typeof t=="string"&&t.trim())?.trim()}function kr(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 Ar(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 K="8.2.1",Se=["search_metrics","list_metric_catalog","get_metric_detail","query_metric_data","search_metric_trees","get_metric_tree_detail","query_metric_tree_attribution"],vr=["get_bi_capabilities","global_search",...Se,"execute_sql_query","get_dataset_detail","get_card_info","query_card_data","get_page_info"],xr=6e4,we=new WeakMap;async function Z(e,t){let n=we.get(e);return(!n||n.expiresAt<=Date.now())&&we.set(e,{expiresAt:Date.now()+xr,promise:Pr(e,t).catch(r=>Mr(r,t))}),we.get(e).promise}function pt(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:Oe(e,t?["get_bi_capabilities"]:Be(e)),caller:{ok:!1,error:r,features:{executeSqlQuery:{enabled:!1,minVersion:K,reason:r}},chatbi:Y(e,r)},features:{executeSqlQuery:{enabled:!t,minVersion:K,reason:t?"\u914D\u7F6E\u4E0D\u5B8C\u6574\uFF1A\u7F3A\u5C11 BI_BASE_URL\u3002":n}},metricPlatform:{registeredTools:t?[]:Se,readOnly:!0,lastError:t?"\u914D\u7F6E\u4E0D\u5B8C\u6574\uFF1A\u7F3A\u5C11 BI_BASE_URL\u3002":void 0},chatbi:Y(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 Z(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 Mr(e,t){let n=e instanceof Error?e.message:String(e);return{ok:!1,error:n,versionSource:"api",features:{executeSqlQuery:{enabled:!1,minVersion:K,reason:`\u65E0\u6CD5\u786E\u8BA4 BI \u80FD\u529B\uFF1A${n}`}},metricPlatform:{registeredTools:[],readOnly:!0,lastError:n},chatbi:Y(t,n),service:Oe(t,Be(t)),caller:{ok:!1,error:n,features:{executeSqlQuery:{enabled:!1,minVersion:K,reason:`\u65E0\u6CD5\u786E\u8BA4 BI \u80FD\u529B\uFF1A${n}`}},chatbi:Y(t,n)}}}async function Pr(e,t){let n=Dr(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 Nr(e),s=Ur(i.capabilityVersion,K),o=await jr(t);return{ok:!0,appVersion:i.appVersion,dataVersion:i.dataVersion,versionSource:r,service:Oe(t,Be(t)),caller:{ok:!0,features:{executeSqlQuery:s},chatbi:o},features:{executeSqlQuery:s},metricPlatform:{registeredTools:Se,readOnly:!0},chatbi:o}}function Be(e){let t=new Set(vr);if(se(e)||e.MCP_TRANSPORT==="streamable-http")for(let n of new x(e).getRegisteredTools())t.add(n);return[...t]}function Oe(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 jr(e){let t=new x(e);return se(e)?t.probe():Y(e,"\u7F3A\u5C11 BI_BASE_URL \u6216\u9274\u6743\u914D\u7F6E\u3002")}function Y(e,t){return{available:!1,registeredTools:se(e)?new x(e).getRegisteredTools():[],failureType:"unknown",triedBaseUrls:[],lastError:{operation:"probe",chatbi_message:t,detail:t}}}function Dr(e){let t=[];if(e.BI_BASE_URL||t.push("\u7F3A\u5C11 BI_BASE_URL"),!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_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 Nr(e){let t=await e.get("/api/server-version"),n=lt(t.version),r=lt(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 Ur(e,t){let n=dt(e),r=dt(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=Lr(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 dt(e){let t=e.match(/(\d+)\.(\d+)\.(\d+)/);if(t)return[Number(t[1]),Number(t[2]),Number(t[3])]}function Lr(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 lt(e){return typeof e=="string"&&e.trim()?e.trim():void 0}function qr(e){return{transport:"stdio",biUidToken:e.BI_UID_TOKEN,audit:{}}}function ft(e){return{resolve:()=>qr(e)}}function Gr(e){let t=ae(e,"x-guanbi-uid-token")?.trim();if(!t)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:t,audit:{tenantId:Re(ae(e,"x-tenant-id")),endUserId:Re(ae(e,"x-end-user-id")),traceId:Re(ae(e,"x-trace-id"))}}}function gt(){return{resolve:e=>e?.requestInfo?.headers?Gr(e.requestInfo.headers):{transport:"streamable-http",audit:{}}}}function ae(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 Re(e){return e?.trim()||void 0}var ce=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){let n=await this.ensureToken(),r=await fetch(this.buildUrl(t),{method:"GET",headers:{"raw-backend-response":"TRUE",Cookie:`uIdToken=${n}`},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:{"raw-backend-response":"TRUE",Cookie:`uIdToken=${s}`},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} ${ht(i)}`);return this.refreshTokenFromResponse(r),i}async request(t,n,r,i){let s=await this.ensureToken(),o=await this.fetchWithToken(t,n,s,r,i);if(this.shouldRefreshToken(o)){let c=await this.refreshToken();o=await this.fetchWithToken(t,n,c,r,i)}let a=await o.text();if(!o.ok)throw new Error(`BI \u8BF7\u6C42\u5931\u8D25\uFF1A${t} ${n} HTTP ${o.status} ${ht(a)}`);return this.refreshTokenFromResponse(o),Jr(a)}async fetchWithToken(t,n,r,i,s){return fetch(this.buildUrl(n),{method:t,headers:{"Content-Type":"application/json","raw-backend-response":"TRUE",Cookie:`uIdToken=${r}`,...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 ie(this.config);return this.token=t.token,t.token}async refreshToken(){return this.token=void 0,this.ensureToken()}refreshTokenFromResponse(t){let n=$r(t);!n||n===this.token||(this.token=n)}shouldRefreshToken(t){return this.hasPasswordLogin()&&t.status===401}hasPasswordLogin(){return!!(this.config.BI_LOGIN_DOMAIN&&this.config.BI_LOGIN_ID&&this.config.BI_LOGIN_PASSWORD)}buildUrl(t){let n=t.startsWith("/")?t:`/${t}`;return`${this.config.BI_BASE_URL}${this.config.BI_PUBLIC_PATH}${n}`}};function Jr(e){if(!e)return;let t=JSON.parse(e);if(!Hr(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 Hr(e){return!e||typeof e!="object"||Array.isArray(e)?!1:"response"in e||"result"in e||"success"in e}function $r(e){return Fr(e.headers)??zr(e.headers)}function Fr(e){return[...e.getSetCookie?.()??[],...Vr(e.get("set-cookie"))].map(n=>_t(n.trim().match(/(?:^|;\s*)uIdToken=([^;]+)/)?.[1])).find(Boolean)}function Vr(e){return e?e.split(/,(?=\s*[^;,]+=)/):[]}function zr(e){return _t(e.get("x-auth-token"))}function _t(e){if(typeof e!="string")return;let t=e.trim();return t&&!/\s/.test(t)?t:void 0}function ht(e,t=1e3){return e.length>t?`${e.slice(0,t)}...`:e}var ue=class{constructor(t,n={}){this.baseConfig=t;this.options=n}baseConfig;options;stdioClient;create(t){if(t.transport==="stdio"&&this.stdioClient)return this.stdioClient;let n=this.resolveConfig(t),r={client:this.options.clientFactory?.(n)??new ce(n),config:n,context:t};return t.transport==="stdio"&&(this.stdioClient=r),r}resolveConfig(t){let n=t.biUidToken??(t.transport==="stdio"?this.baseConfig.BI_UID_TOKEN:void 0);return{...this.baseConfig,BI_UID_TOKEN:n,BI_LOGIN_DOMAIN:t.transport==="stdio"?this.baseConfig.BI_LOGIN_DOMAIN:"",BI_LOGIN_ID:t.transport==="stdio"?this.baseConfig.BI_LOGIN_ID:void 0,BI_LOGIN_PASSWORD:t.transport==="stdio"?this.baseConfig.BI_LOGIN_PASSWORD:void 0}}};var bt={endpoint:"https://www.google-analytics.com/mp/collect",measurementId:"G-800H8JWDPP",apiSecret:"poAwpMEhQteDl1rXKtNIqg",eventName:"guanbi_mcp_tool_call",clientId:"0000000000.0000000000",sessionId:1,engagementTimeMsec:1,timeoutMs:3e3,maxResponseBytes:1024},de=class{serviceDomain;appVersion;enabled;sender;now;constructor({config:t,appVersion:n,sender:r=Kr(),now:i=Date.now}){this.serviceDomain=Zr(t.BI_BASE_URL),this.appVersion=n,this.enabled=Yr(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:Xr(this.now()-t.startedAtMs),error_type:n.success?"none":ti(n.error)};try{Promise.resolve(this.sender(r)).catch(()=>{})}catch{}}};function Qr(e=bt){return t=>Wr(t,e)}async function Wr(e,t=bt){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 ei(i,t.maxResponseBytes)}catch{}}function Kr(){return ni(process.env)?()=>{}:Qr()}function Yr(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 yt(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 Zr(e){if(e)try{return new URL(e).hostname}catch{return}}function Xr(e){return e<1e3?"<1s":e<5e3?"1-5s":e<3e4?"5-30s":e<12e4?"30-120s":">120s"}async function ei(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 ti(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 ni(e){return e.NODE_ENV==="test"||e.VITEST==="true"}var le=class{constructor(t,n,r=new re){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);try{let o=await t(this.clientFactory.create(s));if(r){let a=ri(o)?"error":"success";this.auditLogger.record(Te(r,s,i,a,o))}return o}catch(o){throw r&&this.auditLogger.record(Te(r,s,i,"error",o)),o}}};function ri(e){return!!(e&&typeof e=="object"&&e.isError===!0)}function P(e){return{content:[{type:"text",text:JSON.stringify(e,null,2)}]}}function C(e){let t=It(e);return{content:[{type:"text",text:JSON.stringify(t,null,2)}],structuredContent:t}}function q(e){let t=It(e);return{content:[{type:"text",text:JSON.stringify(t,null,2)}],isError:!0}}function It(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}var Tt={};async function Ct(e,t){return P(await Z(e,t))}import{z as T}from"zod";var G=class extends Error{constructor(n,r){super(n.message,{cause:r});this.detail=n;this.name="MetricPlatformRequestError"}detail},j=class{constructor(t,n){this.client=t;this.config=n}client;config;contextHeadersPromise;listProjects(){return this.get("listProjects","/api/metric-platform/projects")}searchMetrics(t){let n=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",ke("/api/metric-platform/metrics/full-tree",{projectId:t.projectId,nameLike:t.keyword}))}listMetricDirectoryTree(t){return this.get("listMetricDirectoryTree",ke("/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",ke("/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 Ee(t,n,s)}}async get(t,n,r){try{return await this.client.get(n,r?{headers:r}:void 0)}catch(i){throw Ee(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 Ee(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 Ee(e,t,n){let r=n instanceof Error?n.message:String(n),i=r.match(/\bHTTP\s+(\d{3})\b/);return new G({operation:e,path:t,status:i?Number(i[1]):void 0,message:r},n)}function ke(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 ii=T.enum(["BT","CLOSE_BT_OPEN","OPEN_BT_CLOSE","OPEN_BT_OPEN","GT","GE","LT","LE","EQ","NE","IN","NI","IS_NULL","NOT_NULL","CONTAINS","NOT_CONTAINS","STARTSWITH","ENDSWITH","NOT_STARTSWITH","NOT_ENDSWITH","STARTSWITH_USER_PROPERTIES","STARTSWITH_GLOBAL_PARAMS"]),St=new Set(["BT","CLOSE_BT_OPEN","OPEN_BT_CLOSE","OPEN_BT_OPEN"]),ve=new Set(["IS_NULL","NOT_NULL"]),si=T.object({field:T.string().min(1).describe("\u7B5B\u9009\u5B57\u6BB5\u540D\u79F0\u3001\u522B\u540D\u6216\u5B57\u6BB5 ID\u3002"),operator:ii.describe("BI \u539F\u751F\u7B5B\u9009\u64CD\u4F5C\u7B26\uFF0C\u4F8B\u5982 EQ/NI/GE/BT/CONTAINS\u3002"),values:T.array(T.union([T.string(),T.number(),T.boolean()])).optional().describe("\u7B5B\u9009\u503C\u3002IS_NULL/NOT_NULL \u4E0D\u9700\u8981\u4F20\u503C\u3002"),fd_id:T.string().min(1).optional().describe("\u5DF2\u77E5\u5B57\u6BB5 ID \u65F6\u53EF\u76F4\u63A5\u6307\u5B9A\u3002")}).superRefine((e,t)=>{let n=e.values?.length??0;ve.has(e.operator)&&n>0&&t.addIssue({code:T.ZodIssueCode.custom,path:["values"],message:`${e.operator} \u64CD\u4F5C\u7B26\u4E0D\u63A5\u53D7\u7B5B\u9009\u503C\u3002`}),St.has(e.operator)&&n!==2&&t.addIssue({code:T.ZodIssueCode.custom,path:["values"],message:`${e.operator} \u64CD\u4F5C\u7B26\u9700\u8981\u6070\u597D 2 \u4E2A\u503C\u3002`}),!St.has(e.operator)&&!ve.has(e.operator)&&n<1&&t.addIssue({code:T.ZodIssueCode.custom,path:["values"],message:`${e.operator} \u64CD\u4F5C\u7B26\u81F3\u5C11\u9700\u8981 1 \u4E2A\u503C\u3002`})}),Et={cd_id:T.string().min(1).describe("\u5361\u7247 ID\u3002"),filters:T.array(si).optional().describe("\u7ED3\u6784\u5316\u7B5B\u9009\u6761\u4EF6\u3002\u4E0D\u652F\u6301 CLI \u98CE\u683C\u7B5B\u9009\u5B57\u7B26\u4E32\u3002"),columns:T.array(T.string().min(1)).optional().describe("\u5BF9\u5DF2\u5C55\u5E73\u7ED3\u679C\u505A\u672C\u5730\u5217\u88C1\u526A\uFF0C\u4E0D\u53C2\u4E0E BI \u67E5\u8BE2\u8BED\u4E49\u3002"),limit:T.number().int().positive().max(1e4).optional().default(100).describe("\u6700\u591A\u8FD4\u56DE\u884C\u6570\uFF0C\u9ED8\u8BA4 100\uFF0C\u4E0A\u9650 10000\u3002"),raw:T.boolean().optional().describe("\u662F\u5426\u8FD4\u56DE\u539F\u59CB\u54CD\u5E94\u3002")},kt={summary:T.unknown().optional(),columns:T.array(T.unknown()).optional(),rows:T.array(T.unknown()).optional(),diagnostic:T.unknown().optional(),raw:T.unknown().optional(),status:T.string().optional()};async function At(e,t){try{let n=t.limit??100,r=await e.get(`/api/card/${encodeURIComponent(t.cd_id)}`),i=ci(r);if(i==="TEXT")return oi(t.cd_id,r,t.columns,t.raw);let s=bi(t.filters??[],wi(r),i);if("unsupported"in s)return ai("query_card_data",s.unsupported);let o=i==="CHART"?await di(e,t.cd_id,n,s.filters):await ui(e,vt(t.cd_id,i,n,s.filters)),{endpoint:a,requestBody:c}=o.requests[0],u=o.data,l=i==="CHART"?pi(b(u.chartMain)):hi(u),m=Pt(l.slice(0,n),t.columns);return C({summary:h({cd_id:t.cd_id,card_type:i,chart_type:i==="CHART"?B(b(r.content).chartType):void 0,row_count:m.length,truncated:Bi(i,u,m.length)}),columns:jt(m),rows:m,diagnostic:{mode:li(i),card_type:i,endpoint:a,request_body:c,request_count:o.requests.length,request_bodies:o.requests.length>1?o.requests.map(_=>_.requestBody):void 0,raw_returned:t.raw===!0},raw:t.raw?o.raw:void 0})}catch(n){return q({status:"error",diagnostic:Oi("query_card_data",n)})}}function oi(e,t,n,r){let i=b(t.content),s=_i(i),o=Pt(s?[{content:s}]:[],n);return C({summary:{cd_id:e,card_type:"TEXT",row_count:o.length,truncated:!1},columns:jt(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 ai(e,t){return C({status:"unsupported",diagnostic:{tool:e,...t}})}function ci(e){let t=B(e.cdType).toUpperCase();if(t==="SELECTOR"){let n=B(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 vt(e,t,n,r,i=0){let s=encodeURIComponent(e);return t==="SELECTOR"?{endpoint:`/api/selector/${s}/data`,requestBody:h({fieldQuery:{offset:0,limit:n},filters:r.length?r:void 0})}:t==="TREE_SELECTOR"?{endpoint:`/api/treeSelector/${s}/data`,requestBody:h({limit:n,filters:r.length?r:void 0})}:{endpoint:`/api/card/${s}/data`,requestBody:h({view:"GRID",isUniversalStructure:!0,offset:i>0?i:void 0,limit:n,filters:r.length?r:void 0})}}async function ui(e,t){let n=await e.post(t.endpoint,t.requestBody);return{raw:n,data:xt(n),requests:[t]}}async function di(e,t,n,r){let s=[],o=[],a,c=0,u,l=!1,m=!1;for(;c<n;){let I=Math.min(1e3,n-c),O=vt(t,"CHART",I,r,c);s.push(O);let v=await e.post(O.endpoint,O.requestBody);o.push(v);let V=xt(v),W=b(V.chartMain);if(!Object.keys(W).length)return{raw:v,data:V,requests:s};a?mi(b(a.chartMain),W):a=Ri(V);let Ie=fi(W);c+=Ie,u=Pe(W.count)??u;let tt=Me(W.hasMoreData);if(m=tt!==void 0,l=tt??!1,Ie===0||Ie<I||u!==void 0&&c>=u||m&&!l)break}let _=a??{},y=b(_.chartMain);return Object.keys(y).length&&(y.offset=0,y.limit=n,y.hasMoreData=u!==void 0?c<u:l),{raw:o.length>1?{pages:o,merged:_}:o[0],data:_,requests:s}}function li(e){return e==="SELECTOR"?"selector_card_data":e==="TREE_SELECTOR"?"tree_selector_card_data":"chart_card_data"}function xt(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 pi(e){if(!Object.keys(e).length)return[];let t=b(e.row),n=b(e.column),r=A(t.data??t.values),i=A(e.data),s=X(t.fields??t.meta).map(xe).filter(Boolean),o=gi(n),a=Ei([...s,...o]),c=Math.max(r.length,i.length),u=[];for(let l=0;l<c;l+=1){let m=[];m.push(...A(r[l]).map(Rt)),m.push(...A(i[l]).map(Rt)),m.length&&u.push(Object.fromEntries(m.map((_,y)=>[a[y]??`column_${y+1}`,_])))}return u}function mi(e,t){Ae(e,t,"data");let n=b(e.row),r=b(t.row);Ae(n,r,"data"),Ae(n,r,"values")}function Ae(e,t,n){let r=A(t[n]);r.length&&(e[n]=[...A(e[n]),...r])}function fi(e){let t=A(e.data);if(t.length)return t.length;let n=b(e.row);return A(n.data).length||A(n.values).length}function gi(e){let n=A(e.data??e.values).map((r,i)=>{let s=A(r).map(Mt).filter(Boolean).join("/");return s||xe(X(e.fields??e.meta)[i])||`metric_${i+1}`}).filter(Boolean);return n.length?n:X(e.fields??e.meta).map(xe).filter(Boolean)}function hi(e){return X(e.result)}function _i(e){let n=A(b(e.body).blocks).map(r=>B(b(r).text)).filter(r=>r!=="");return n.length?n.join(`
|
|
3
|
+
`):B(e.text)}function bi(e,t,n){let r=[];for(let i of e){let s=Ti(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"?Ii(s.field.metaType):void 0,filterType:i.operator,filterValue:yi(i)}))}return{filters:r}}function yi(e){return ve.has(e.operator)?[]:(e.values??[]).map(B)}function Ii(e){return e.toUpperCase()==="METRIC"?"AGGREGATION":"DETAIL"}function Ti(e,t,n){let r=Ci(e,t,n);if(!r)return{unsupported:{capability:"unsupported_filter_field",parameter:t,message:`\u7B5B\u9009\u5B57\u6BB5\u65E0\u6CD5\u4ECE\u5F53\u524D\u5361\u7247\u4E0A\u4E0B\u6587\u89E3\u6790\uFF1A${t}`,supported_fields:e.map(u=>h({name:B(u.name),fd_id:B(u.fd_id),meta_type:B(u.meta_type)}))}};let i=B(r.name),s=B(r.fd_id),o=B(r.fd_type),a=B(r.meta_type).toUpperCase(),c=[i?void 0:"name",s?void 0:"fdId",o?void 0:"fdType",a?void 0:"metaType"].filter(u=>!!u);return c.length?{unsupported:{capability:"unsupported_filter_field",parameter:t,message:`\u7B5B\u9009\u5B57\u6BB5\u7F3A\u5C11\u5FC5\u8981 BI \u5143\u4FE1\u606F\uFF1A${t}`,missing_metadata:c}}:{field:{name:i,fdId:s,fdType:o,metaType:a}}}function Ci(e,t,n){if(n){let i=e.find(s=>B(s.fd_id)===n||B(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(B).includes(r))}function wi(e){let t=b(e.content),n=[],r=b(b(t.source).field);Object.keys(r).length&&n.push(Bt(r));let i=b(b(t.meta).chartMain),s=b(i.zoneData);for(let[o,a]of Object.entries(s))n.push(...X(a).map(c=>Bt(c,o)));return Si(n)}function Bt(e,t){return h({name:N(e.name,e.title,e.originTitle,e.alias),alias:N(e.alias,e.title),id:B(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 Si(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 Bi(e,t,n){if(e==="SELECTOR"||e==="TREE_SELECTOR")return Me(t.exceedLimit)?!0:Ot(t,n);let r=b(t.chartMain);return Me(r.hasMoreData)?!0:Ot(r,n)}function Ot(e,t){let n=Pe(e.count),r=Pe(e.limit);return n!==void 0&&r!==void 0&&r>0?n>r:n!==void 0&&n>t}function xe(e){return N(e.alias,e.title,e.originTitle,e.name,e.fdId,e.id)??""}function Mt(e){let t=b(e);return Object.keys(t).length?N(t.title,t.name,t.originTitle,t.alias,t.v,t.value)??"":B(e)}function Rt(e){let t=b(e);return Object.keys(t).length?"v"in t?t.v:"value"in t?t.value:Mt(e):e}function Oi(e,t){let n=t instanceof Error?t.message:String(t),r=n.match(/BI 请求失败:(?<method>[A-Z]+) (?<path>\S+) HTTP (?<status>\d+)/);return h({operation:e,path:r?.groups?.path,status:r?.groups?.status?Number(r.groups.status):void 0,message:n})}function X(e){return Array.isArray(e)?e.map(b).filter(t=>Object.keys(t).length):[]}function A(e){return Array.isArray(e)?e:[]}function Ri(e){return JSON.parse(JSON.stringify(e))}function b(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function B(e){return typeof e=="string"?e:e==null?"":String(e)}function N(...e){return e.map(B).find(t=>t.trim())?.trim()}function Me(e){return typeof e=="boolean"?e:void 0}function Pe(e){return typeof e=="number"&&Number.isFinite(e)?e:void 0}function Pt(e,t){return t?.length?e.map(n=>Object.fromEntries(t.map(r=>[r,n[r]]))):e}function jt(e){return[...new Set(e.flatMap(t=>Object.keys(t)))]}function Ei(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 ki}from"crypto";import{z as f}from"zod";var Ai=6e4,J=1e4,Dt=10*6e4,pe=new Map,me=new Map,je=new Map,De=new Map,Ut=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")}),Lt={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()},qt={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()},To={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:Ut.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()},Gt={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()},Jt={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:Ut.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()},Ht={is_insight:f.boolean().optional().describe("\u662F\u5426\u53EA\u5217\u51FA\u6D1E\u5BDF\u4E3B\u9898\u3002")},$t={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")},Co={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")},Ft={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")},Vt={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 zt(e,t){let n=new x(e);try{let r=await n.listThemes({isInsight:t.is_insight});return C({themes:r,resolved_base_url:n.getResolvedBaseUrl(),tried_base_urls:n.getTriedBaseUrls()})}catch(r){return ge(n,r,"listThemes")}}async function Qt(e,t){let n=new x(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 C({session_id:r.session_id,message_id:r.message_id,answer:r.answer,sql:r.sql,answer_status:r.answer_status,final_status:r.final_status,query_result:r.query_result,resolved_base_url:n.getResolvedBaseUrl(),tried_base_urls:n.getTriedBaseUrls()})}catch(r){return ge(n,r,"query")}}async function Wt(e,t){let n=new x(e);try{let r=Yt({caller_scope:Zt(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=vi(r);if(i)return C({...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=je.get(r);if(s){let c=await s;return C({...c,deduped:!0,retry_after_ms:J,next_action:"\u540C\u4E00\u6D1E\u5BDF\u95EE\u9898\u6B63\u5728\u53D1\u8D77\u4E2D\uFF0C\u5DF2\u590D\u7528\u5DF2\u6709\u8BF7\u6C42\u7ED3\u679C\u3002\u8BF7\u4F7F\u7528 chatbi_insight_poll \u67E5\u8BE2\u7ED3\u679C\u3002"})}let o=n.startInsight({themeId:t.theme_id,themeName:t.theme_name,message:t.message,sessionId:t.session_id,externalContext:t.external_context}).then(c=>{let u={theme_id:c.theme_id,message_id:c.message_id,session_id:c.session_id,status:"started"};return xi(r,u),u}).finally(()=>{je.delete(r)});je.set(r,o);let a=await o;return C({...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 ge(n,r,"insight.start")}}async function Kt(e,t){let n=new x(e);try{let r=Yt({caller_scope:Zt(e),message_id:t.message_id}),i=Mi(r);if(i){let m=Ne(i.result),_=Le(i.result,!0);return C({message_id:i.result.message_id,session_id:i.result.session_id,status:i.result.status,detail:Ue(i.result),question:i.result.question,answer:i.result.answer,throttled:!0,retry_after_ms:i.retryAfterMs,...m,next_action:_})}let s=De.get(r);if(s){let m=await s,_=qe(m.status),y=Ne(m),I=Le(m,!0);return C({message_id:m.message_id,session_id:m.session_id,status:m.status,detail:Ue(m),question:m.question,answer:m.answer,throttled:!0,retry_after_ms:_?0:J,...y,next_action:I})}let o=n.pollInsight({themeId:t.theme_id,themeName:t.theme_name,messageId:t.message_id}).then(m=>(Pi(r,m),m)).finally(()=>{De.delete(r)});De.set(r,o);let a=await o,c=qe(a.status),u=Ne(a),l=Le(a,!1);return C({message_id:a.message_id,session_id:a.session_id,status:a.status,detail:Ue(a),question:a.question,answer:a.answer,throttled:!1,retry_after_ms:c?0:J,...u,next_action:l,resolved_base_url:n.getResolvedBaseUrl(),tried_base_urls:n.getTriedBaseUrls()})}catch(r){return ge(n,r,"insight.poll")}}function Ne(e){return e.status!=="success"?{}:{final_result:{format:"markdown",content:Xt(e)}}}function Ue(e){return e.detail!=null?e.detail:e.status==="failure"||e.status==="stopped"?ji(e):e.detail}function Le(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 vi(e){fe();let t=pe.get(e);if(!(!t||Date.now()-t.createdAt>=Ai))return t.result}function xi(e,t){fe(),pe.set(e,{createdAt:Date.now(),result:t})}function Mi(e){fe();let t=me.get(e);if(!t)return;let n=Date.now()-t.checkedAt,r=qe(t.result.status);if(!(!r&&n>=J))return{result:t.result,retryAfterMs:r?0:Math.max(0,J-n)}}function qe(e){return e==="success"||e==="failure"||e==="stopped"}function Pi(e,t){fe(),me.set(e,{checkedAt:Date.now(),result:t})}function fe(){let e=Date.now();for(let[t,n]of pe)e-n.createdAt>=Dt&&pe.delete(t);for(let[t,n]of me)e-n.checkedAt>=Dt&&me.delete(t)}function Yt(e){return JSON.stringify(Object.keys(e).sort().reduce((t,n)=>{let r=e[n];return typeof r<"u"&&(t[n]=r),t},{}))}function Zt(e){return e.BI_UID_TOKEN?`uid:${Nt(e.BI_UID_TOKEN)}`:`login:${Nt(`${e.BI_LOGIN_DOMAIN??""}\0${e.BI_LOGIN_ID??""}`)}`}function Nt(e){return ki("sha256").update(e).digest("hex").slice(0,16)}function Xt(e){let t=e.answer?.trim();if(t)return qi(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 ji(e){switch(e.status){case"success":return Xt(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 Di(e,t){let n=[`| ${e.join(" | ")} |`,`|${e.map(()=>" --- ").join("|")}|`];for(let r of t)n.push(`| ${e.map((i,s)=>Ui(Ni(r[s]))).join(" | ")} |`);return n.join(`
|
|
4
|
+
`)}function Ni(e){return e===null||typeof e>"u"||e===""?"-":String(e)}function Ui(e){return e.replaceAll(`\r
|
|
4
5
|
`,"<br>").replaceAll(`
|
|
5
|
-
`,"<br>").replaceAll("\r","<br>").replaceAll("|","\\|")}function
|
|
6
|
+
`,"<br>").replaceAll("\r","<br>").replaceAll("|","\\|")}function Li(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 qi(e){let t=/```GuanViz\.json\n([\s\S]*?)\n```/g;return e.replace(t,(n,r)=>Gi(r)??n)}function Gi(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(l=>l.name??"-"),s=Hi(t.viz_config),o=$i(i,r,s),a=r.map(l=>i.map((m,_)=>Fi(l[_],s.get(m),o.get(m)))),c=Di(i,a),u=Li(!!t.data_info?.truncated,t.data_info?.row_limit);return u?`${c}
|
|
6
7
|
|
|
7
|
-
${d}`:c}catch{return}}var Be=new Map([["k",1e3],["K",1e3],["M",1e6],["B",1e9],["\u4E07",1e4],["\u4EBF",1e8]]),Gr=[[1e8,"\u4EBF"],[1e4,"\u4E07"]];function Jr(t){let e=t?.chartMeta?.chartMain?.zoneData?.metric,n=new Map;if(!Array.isArray(e))return n;for(let r of e)r.name&&r.fieldFormat?.numberFormat&&n.set(r.name,r.fieldFormat.numberFormat);return n}function Hr(t,e,n){let r=new Map;for(let[i,s]of t.entries()){let o=n.get(s);if(o?.prefixUnit!=="auto")continue;let a=0;for(let d of e){let m=St(d[i]);typeof m=="number"&&(a=Math.max(a,Math.abs(m/Rt(o))))}let c=Qr(a);c&&r.set(s,c)}return r}function $r(t,e,n){if(!e)return t;let r=St(t);return typeof r!="number"?t:Vr(r,e,n)}function St(t){if(typeof t=="number"&&Number.isFinite(t))return t;if(typeof t!="string")return;let e=Number(t.trim());return Number.isFinite(e)?e:void 0}function Vr(t,e,n){let r=Rt(e),{unit:i,shouldScale:s}=zr(e,n),o=s&&i?Be.get(i)??1:1,a=t/r/o,c=Fr(e.decimalPlaces),d=e.useThousandsSeparator?a.toLocaleString("en-US",{minimumFractionDigits:c,maximumFractionDigits:c}):a.toFixed(c),m=i&&e.showPrefixUnit!==!1?i:"",f=e.showSuffix===!1||typeof e.suffix!="string"?"":e.suffix;return`${d}${m}${f}`}function Rt(t){if(t.showPrefixUnit!==!1&&typeof t.prefixUnit=="string"&&t.prefixUnit!=="auto"&&Be.has(t.prefixUnit))return 1;let e=Number(t.divideDataBy??1);return Number.isFinite(e)&&e!==0?e:1}function zr(t,e){return t.showPrefixUnit===!1?{unit:"",shouldScale:!1}:t.prefixUnit==="auto"?{unit:e??"",shouldScale:!0}:typeof t.prefixUnit=="string"&&Be.has(t.prefixUnit)?{unit:t.prefixUnit,shouldScale:!0}:{unit:"",shouldScale:!1}}function Fr(t){return typeof t!="number"||!Number.isFinite(t)?2:Math.max(0,Math.min(100,Math.trunc(t)))}function Qr(t){return Gr.find(([e])=>t>=e)?.[1]??""}function oe(t,e,n){let r=Wr(t,e,n);return $({error:"chatbi_request_failed",requested_operation:n,...r,tried_base_urls:r.tried_base_urls??t.getTriedBaseUrls()})}function Wr(t,e,n){return e instanceof B?e.detail:t.getLastError()??{operation:n,detail:e instanceof Error?e.message:String(e)}}import{z as Se}from"zod";var kt={dsId:Se.string().min(1).describe("\u6570\u636E\u96C6 ID\u3002")},vt={cdId:Se.string().min(1).describe("\u5361\u7247 ID\u3002")},At={pageId:Se.string().min(1).describe("\u9875\u9762/\u4EEA\u8868\u677F ID\u3002")};async function Et(t,e){let n=await t.get(`/api/data-source/${encodeURIComponent(e.dsId)}`);return v(n)}async function Ot(t,e){let n=await t.get(`/api/card/${encodeURIComponent(e.cdId)}`);return v(n)}async function xt(t,e){let n=await t.get(`/api/page/${encodeURIComponent(e.pageId)}`);return v(n)}import{z as x}from"zod";var Kr=x.object({name:x.string().min(1),query:x.string().min(1)}),Mt={query:x.string().min(1).describe("\u8981\u6267\u884C\u7684\u7B80\u5355\u67E5\u8BE2 SQL\u3002\u4EC5\u652F\u6301\u5355\u8868\u67E5\u8BE2\u548C\u67E5\u8BE2\u8BED\u53E5\uFF0C\u63A8\u8350\u7528\u4E8E\u5C11\u91CF\u7ED3\u679C\u9884\u89C8\u6216\u8F7B\u91CF\u5206\u6790\uFF0C\u4E0D\u9002\u5408\u62C9\u53D6\u5168\u91CF\u6570\u636E\uFF1B\u5EFA\u8BAE\u663E\u5F0F\u5199 LIMIT\u3002"),inputs:x.array(x.string().min(1)).min(1).max(1).describe("SQL \u67E5\u8BE2\u4F9D\u8D56\u7684\u6570\u636E\u96C6 ID \u5217\u8868\u3002\u4EC5\u652F\u6301\u5355\u8868\u67E5\u8BE2\uFF0C\u8BF7\u53EA\u4F20 1 \u4E2A\u6570\u636E\u96C6 ID\u3002"),queryStructure:x.object({ctes:x.array(Kr).optional(),mainQuery:x.string().optional()}).optional().describe("\u7ED3\u6784\u5316\u67E5\u8BE2\u4FE1\u606F\uFF0C\u53EF\u7528\u4E8E\u62C6\u5206 CTE \u548C\u4E3B\u67E5\u8BE2\uFF1B\u4ECD\u4EC5\u9002\u7528\u4E8E\u5355\u8868\u67E5\u8BE2\u3002")};async function Pt(t,e,n){await Ye(t,e,"executeSqlQuery");try{let r=await t.post("/api/data-source/execute-sql-query",{...n,limit:e.BI_MAX_ROWS});return v({maxRowsHint:e.BI_MAX_ROWS,result:r})}catch(r){throw Yr(r)?new Error("execute_sql_query \u8FD4\u56DE 404\u3002\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"):r}}function Yr(t){return t instanceof Error&&t.message.includes("POST /api/data-source/execute-sql-query HTTP 404")}import{z as A}from"zod";var Dt={keyword:A.string().default("").describe("\u641C\u7D22\u5173\u952E\u8BCD\uFF0C\u7559\u7A7A\u65F6\u8FD4\u56DE\u8D44\u6E90\u5217\u8868\u3002"),resourceType:A.enum(["ALL","CARD","DASHBOARD","DATA_SET","ETL"]).optional().default("ALL"),limit:A.number().int().min(1).max(100).optional().default(20),offset:A.number().int().min(0).optional().default(0),utimeStartTime:A.number().int().optional().describe("\u66F4\u65B0\u65F6\u95F4\u8D77\u70B9\uFF0C\u6BEB\u79D2\u65F6\u95F4\u6233\u3002"),utimeEndTime:A.number().int().optional().describe("\u66F4\u65B0\u65F6\u95F4\u7EC8\u70B9\uFF0C\u6BEB\u79D2\u65F6\u95F4\u6233\u3002"),cardType:A.string().optional().describe("\u5361\u7247\u7C7B\u578B\u8FC7\u6EE4\uFF0C\u4EC5 resourceType \u5305\u542B CARD \u65F6\u4F7F\u7528\u3002"),permissionType:A.string().optional(),orderBy:A.string().optional(),isDesc:A.boolean().optional()};async function jt(t,e){let{cardType:n,...r}=e,i={...r,specificResourceFilters:n?{cardType:n}:void 0},s=await t.post("/api/global-search",i);return v(s)}import{z as l}from"zod";var D=class extends Error{constructor(n,r){super(n.message,{cause:r});this.detail=n;this.name="MetricPlatformRequestError"}detail},E=class{constructor(e,n){this.client=e;this.config=n}client;config;contextHeadersPromise;listProjects(){return this.get("listProjects","/api/metric-platform/projects")}searchMetrics(e){let n=h({projectId:e.projectId,dirId:e.dirId,status:e.status,nameLike:e.keyword,subTypes:e.subTypes?.join(","),orderBy:e.orderBy});return this.post("searchMetrics","/api/metric-platform/metrics",n)}listMetricFullTree(e){return this.get("listMetricFullTree",ke("/api/metric-platform/metrics/full-tree",{projectId:e.projectId,nameLike:e.keyword}))}listMetricDirectoryTree(e){return this.get("listMetricDirectoryTree",ke("/api/directory/METRIC_PLATFORM/unauthorized-tree",{projectId:e}))}getMetricDetail(e){return this.get("getMetricDetail",`/api/metric-platform/metrics/${encodeURIComponent(e)}`)}getMetricLineage(e,n){return this.post("getMetricLineage",`/api/resource-atlas/${encodeURIComponent(e)}`,{resourceTypeName:n})}queryMetricData(e){let{metricId:n,metricName:r,...i}=e;return this.post("queryMetricData","/api/metric-platform/metric-data/v2",h(i))}getCardEditSession(e){return this.get("getCardEditSession",`/api/card/${encodeURIComponent(e)}/edit/session`)}getCardEditMeta(e){return this.get("getCardEditMeta",`/api/card/${encodeURIComponent(e)}/edit`)}modifyCardEditMeta(e,n,r){return this.put("modifyCardEditMeta",`/api/oriput/card/${encodeURIComponent(e)}/edit/${encodeURIComponent(n)}/modify`,r)}queryCardEditData(e,n,r){return this.post("queryCardEditData",`/api/card/${encodeURIComponent(e)}/edit/${encodeURIComponent(n)}/data`,r)}searchMetricTrees(e){return this.get("searchMetricTrees",ke("/api/metric-platform/metric-tree/search",{nameLike:e.keyword,projectId:e.projectId,parentDirId:e.parentDirId,orderBy:e.orderBy}))}async getMetricTreeDetail(e){return this.get("getMetricTreeDetail",`/api/metric-platform/metric-tree/${encodeURIComponent(e)}`,await this.metricTreeHeaders(e,"dimension"))}async queryMetricTreeDrill(e,n){return this.post("queryMetricTreeDrill",`/api/metric-platform/metric-tree/${encodeURIComponent(e)}/drill`,n,await this.metricTreeHeaders(e,"dimension"))}async queryMetricTreeDecompose(e,n){return this.post("queryMetricTreeDecompose",`/api/metric-platform/metric-tree/${encodeURIComponent(e)}/metric-decompose`,n,await this.metricTreeHeaders(e,"metric"))}async put(e,n,r,i){try{return await this.client.put(n,r,i?{headers:i}:void 0)}catch(s){throw Re(e,n,s)}}async get(e,n,r){try{return await this.client.get(n,r?{headers:r}:void 0)}catch(i){throw Re(e,n,i)}}async post(e,n,r,i){try{return await this.client.post(n,r,i?{headers:i}:void 0)}catch(s){throw Re(e,n,s)}}async metricTreeHeaders(e,n){return{Referer:`${this.config.BI_BASE_URL??""}${this.config.BI_PUBLIC_PATH}/metrics-store/hierarchy/${encodeURIComponent(e)}/edit/${n}`,...await this.contextHeaders()}}async contextHeaders(){return this.contextHeadersPromise||(this.contextHeadersPromise=this.resolveContextHeaders()),this.contextHeadersPromise}async resolveContextHeaders(){let e={};if(this.config.BI_LOGIN_DOMAIN&&(e["x-dom-id"]=q(this.config.BI_LOGIN_DOMAIN)),this.config.BI_LOGIN_ID&&(e["user-id"]=q(this.config.BI_LOGIN_ID)),e["x-dom-id"]&&e["user-id"])return e;try{let n=await this.get("getUserProfile","/api/user/profile"),r=Ut(n.domId,n.domainId,n.domain,n.dom_id),i=Ut(n.email,n.loginId,n.userId,n.uId,n.uid);!e["x-dom-id"]&&r&&(e["x-dom-id"]=q(r)),!e["user-id"]&&i&&(e["user-id"]=q(i))}catch{}return e["x-dom-id"]||(e["x-dom-id"]=q(this.config.BI_LOGIN_DOMAIN||"guanbi")),e["user-id"]||(e["user-id"]=q(this.config.BI_LOGIN_ID||"unknown")),e}};function Re(t,e,n){let r=n instanceof Error?n.message:String(n),i=r.match(/\bHTTP\s+(\d{3})\b/);return new D({operation:t,path:e,status:i?Number(i[1]):void 0,message:r},n)}function ke(t,e){let n=new URLSearchParams;for(let[i,s]of Object.entries(e))s!==void 0&&s!==""&&n.set(i,s);let r=n.toString();return r?`${t}?${r}`:t}function h(t){return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}function q(t){return Buffer.from(t,"utf8").toString("base64")}function Ut(...t){for(let e of t)if(typeof e=="string"&&e.trim())return e.trim()}var xe=l.enum(["asc","desc"]),Xr=l.enum(["EQ","NE","IN","NIN","LIKE","GT","GTE","LT","LTE","BT"]),Vt=l.object({field:l.string().min(1).describe("\u7B5B\u9009\u5B57\u6BB5\u540D\u79F0\u6216\u5B57\u6BB5 ID\u3002"),operator:Xr.describe("\u7B5B\u9009\u64CD\u4F5C\u7B26\u3002BT \u9700\u8981\u4F20\u4E24\u4E2A\u503C\u3002"),values:l.array(l.union([l.string(),l.number(),l.boolean()])).min(1).describe("\u7B5B\u9009\u503C\u3002"),fd_id:l.string().min(1).optional().describe("\u5DF2\u77E5\u5B57\u6BB5 ID \u65F6\u53EF\u76F4\u63A5\u6307\u5B9A\u3002")}),Zr=l.object({field:l.string().min(1).describe("\u6392\u5E8F\u5B57\u6BB5\u540D\u79F0\u6216\u5B57\u6BB5 ID\u3002"),direction:xe.describe("\u6392\u5E8F\u65B9\u5411\u3002")}),ei=l.object({type:l.enum(["compare","xtd","last","recent","percentage","rank_top"]),compare:l.enum(["yoy","mom","qoq","wow","dod"]).optional(),compare_value:l.enum(["value","rate","rawdata"]).optional(),xtd:l.enum(["ytd","qtd","mtd","wtd","dtd"]).optional(),recent:l.string().regex(/^[1-9]\d*[dwmqy]$/).optional(),recent_base:l.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),percentage_dim:l.string().min(1).optional(),rank_top:l.number().int().positive().optional(),rank_order:xe.optional(),rank_dim:l.string().min(1).optional()}),zt={keyword:l.string().min(1).optional().describe("\u6307\u6807\u540D\u79F0\u5173\u952E\u8BCD\u3002"),project_id:l.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:l.string().min(1).optional().describe("\u76EE\u5F55 ID\u3002"),status:l.string().min(1).optional().describe("\u4E0A\u7EBF\u72B6\u6001\u3002"),sub_types:l.array(l.string().min(1)).optional().describe("\u6307\u6807\u7C7B\u578B\u5217\u8868\u3002"),order_by:l.enum(["utimeDesc","utimeAsc"]).optional().describe("\u6392\u5E8F\u65B9\u5F0F\u3002"),limit:l.number().int().positive().max(200).optional().default(20).describe("\u6700\u591A\u8FD4\u56DE\u6761\u6570\u3002")},Ft={project_id:l.string().min(1).optional().describe("\u6307\u6807\u4E3B\u9898 ID\u3002"),keyword:l.string().min(1).optional().describe("\u540D\u79F0\u5173\u952E\u8BCD\uFF0C\u53EF\u5339\u914D\u4E3B\u9898\u3001\u76EE\u5F55\u6216\u6307\u6807\u3002"),raw:l.boolean().optional().describe("\u662F\u5426\u8FD4\u56DE\u539F\u59CB\u54CD\u5E94\u3002")},Qt={metric_id:l.string().min(1).describe("\u6307\u6807 ID\u3002"),brief:l.boolean().optional().describe("\u662F\u5426\u53EA\u8FD4\u56DE\u8BE6\u60C5\uFF0C\u4E0D\u8865\u5145\u8840\u7F18\u3002"),raw:l.boolean().optional().describe("\u662F\u5426\u8FD4\u56DE\u539F\u59CB\u8BE6\u60C5\u3002")},Wt={metric_id:l.string().min(1).describe("\u6307\u6807 ID\u3002"),dimensions:l.array(l.string().min(1)).optional().describe("\u6309\u540D\u79F0\u6216\u5B57\u6BB5 ID \u6307\u5B9A\u67E5\u8BE2\u7EF4\u5EA6\u3002"),filters:l.array(Vt).optional().describe("\u7B5B\u9009\u6761\u4EF6\u3002"),combine_type:l.enum(["AND","OR"]).optional().default("AND").describe("\u591A\u4E2A\u7B5B\u9009\u6761\u4EF6\u7684\u7EC4\u5408\u65B9\u5F0F\u3002"),sort:l.array(Zr).optional().describe("\u6392\u5E8F\u5B57\u6BB5\u3002"),columns:l.array(l.string().min(1)).optional().describe("\u7ED3\u679C\u5217\u88C1\u526A\u3002"),limit:l.number().int().positive().max(1e3).optional().default(100).describe("\u6700\u591A\u8FD4\u56DE\u884C\u6570\u3002"),advanced_calc:ei.optional().describe("\u9AD8\u7EA7\u8BA1\u7B97\uFF0C\u53EA\u4F7F\u7528\u6307\u6807\u6570\u636E\u67E5\u8BE2\u63A5\u53E3\u8868\u8FBE\u3002"),raw:l.boolean().optional().describe("\u662F\u5426\u8FD4\u56DE\u539F\u59CB\u54CD\u5E94\u3002")},Kt={keyword:l.string().min(1).optional().describe("\u6307\u6807\u6811\u540D\u79F0\u5173\u952E\u8BCD\u3002"),project_id:l.string().min(1).optional().describe("\u6839\u6307\u6807\u6240\u5C5E\u4E3B\u9898 ID\u3002"),parent_dir_id:l.string().min(1).optional().describe("\u6307\u6807\u6811\u76EE\u5F55 ID\u3002"),order_by:l.enum(["utimeDesc","utimeAsc"]).optional().default("utimeDesc").describe("\u6392\u5E8F\u65B9\u5F0F\u3002"),limit:l.number().int().positive().max(200).optional().default(20).describe("\u6700\u591A\u8FD4\u56DE\u6761\u6570\u3002")},Yt={metric_tree_id:l.string().min(1).describe("\u6307\u6807\u6811 ID\u3002"),raw:l.boolean().optional().describe("\u662F\u5426\u8FD4\u56DE\u539F\u59CB\u8BE6\u60C5\u3002")},Xt={metric_tree_id:l.string().min(1).describe("\u6307\u6807\u6811 ID\u3002"),target:l.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:l.string().min(1).optional().describe("target=dimension \u65F6\u6309\u7EF4\u5EA6\u540D\u79F0\u6307\u5B9A\u3002"),dimension_fd_id:l.string().min(1).optional().describe("target=dimension \u65F6\u6309\u5B57\u6BB5 ID \u6307\u5B9A\u3002"),scan_dimensions:l.array(l.string().min(1)).optional().describe("target=scan \u65F6\u6307\u5B9A\u626B\u63CF\u7EF4\u5EA6\u540D\u79F0\u3002"),exclude_dimensions:l.array(l.string().min(1)).optional().describe("target=scan \u65F6\u6392\u9664\u7EF4\u5EA6\u540D\u79F0\u3002"),period:l.string().min(1).optional().describe("\u5F53\u524D\u671F\uFF0C\u914D\u5408 last_period \u8986\u76D6\u9ED8\u8BA4\u65F6\u95F4\u5BF9\u6BD4\u3002"),last_period:l.string().min(1).optional().describe("\u5BF9\u6BD4\u671F\uFF0C\u914D\u5408 period \u8986\u76D6\u9ED8\u8BA4\u65F6\u95F4\u5BF9\u6BD4\u3002"),time_comparison_json:l.record(l.string(),l.unknown()).optional().describe("\u5B8C\u6574\u65F6\u95F4\u5BF9\u6BD4\u914D\u7F6E\u8986\u76D6\u3002"),filters:l.array(Vt).optional().describe("\u5F52\u56E0\u7B5B\u9009\u6761\u4EF6\u3002"),limit:l.number().int().positive().max(200).optional().default(20).describe("metric/dimension \u8FD4\u56DE\u884C\u6570\u3002"),group_limit:l.number().int().positive().max(50).optional().default(5).describe("scan \u6BCF\u4E2A\u7EF4\u5EA6\u8FD4\u56DE\u884C\u6570\u3002"),sort:xe.optional().default("desc").describe("\u6309\u8D21\u732E\u503C\u6392\u5E8F\u65B9\u5411\u3002"),raw:l.boolean().optional().describe("\u662F\u5426\u8FD4\u56DE\u539F\u59CB\u54CD\u5E94\u3002")},M={summary:l.unknown().optional(),items:l.array(l.unknown()).optional(),tree:l.unknown().optional(),detail:l.unknown().optional(),columns:l.array(l.unknown()).optional(),rows:l.array(l.unknown()).optional(),raw:l.unknown().optional(),diagnostic:l.unknown().optional(),status:l.string().optional()};async function Zt(t,e,n){let r=new E(t,e);try{let i=n.project_id?[n.project_id]:await ti(r),s=[];for(let a of i){let c=await r.searchMetrics({projectId:a,dirId:n.dir_id,keyword:n.keyword,status:n.status,subTypes:n.sub_types,orderBy:n.order_by});if(s.push(...ni(c)),s.length>=n.limit)break}let o=ki(s.map(Ae),"metric_id").slice(0,n.limit);return y({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 N(i,"search_metrics")}}async function en(t,e,n){let r=new E(t,e);try{try{let i=await r.listMetricFullTree({projectId:n.project_id,keyword:n.keyword});return y({summary:{source:"full-tree"},tree:ii(i),raw:n.raw?i:void 0})}catch(i){let s=n.project_id?[{id:n.project_id}]:await an(r),o=[];for(let a of s){let c=u(a.id);if(!c)continue;let d=await r.listMetricDirectoryTree(c);o.push({id:c,name:u(a.name)||c,type:"project",project_id:c,children:si(d,c)})}return y({summary:{source:"directory-fallback",fallback_reason:i instanceof Error?i.message:String(i)},tree:o})}}catch(i){return N(i,"list_metric_catalog")}}async function tn(t,e,n){let r=new E(t,e);try{let i=await r.getMetricDetail(n.metric_id),s=oi(i),o,a;if(!n.brief){let c=u(i.uniformResourceType)||"METRIC_PLATFORM_METRIC";try{o=ai(await r.getMetricLineage(n.metric_id,c))}catch(d){a=d instanceof D?d.detail:String(d)}}return y({detail:{...s,lineage:o,lineage_error:a},raw:n.raw?i:void 0})}catch(i){return N(i,"get_metric_detail")}}async function nn(t,e,n){let r=new E(t,e);try{let i=await r.getMetricDetail(n.metric_id);if(!n.advanced_calc){let a=Lt(i,n);if("unsupported"in a)return O("query_metric_data",a.unsupported);let c=async f=>{let C=await r.getCardEditSession(a.cardId),_=u(C.sessionId);if(!_)throw new Error("\u6307\u6807\u5361\u7247\u9884\u89C8\u4F1A\u8BDD\u54CD\u5E94\u7F3A\u5C11 sessionId\u3002");return a.dimensions.length&&await ci(r,a.cardId,_,a.dimensions),{raw:await r.queryCardEditData(a.cardId,_,f),sessionId:_}};if(n.combine_type==="OR"&&(n.filters?.length??0)>1){let f=[],C=[];for(let _ of n.filters??[]){let T=Lt(i,{...n,combine_type:"AND",filters:[_]});if("unsupported"in T)return O("query_metric_data",T.unsupported);let{raw:R}=await c(T.body);C.push(R),f.push(...qt(R))}return ae(i,f,n,{mode:"metric_card_preview_data",card_id:a.cardId,card_kind:a.cardKind,combine_type:"OR",query_count:C.length},n.raw?C:void 0)}let{raw:d,sessionId:m}=await c(a.body);return ae(i,qt(d),n,{mode:"metric_card_preview_data",card_id:a.cardId,card_kind:a.cardKind,session_id:m,request_body:a.body},n.raw?d:void 0)}let s=Nt(i,n);if("unsupported"in s)return O("query_metric_data",s.unsupported);if(n.combine_type==="OR"&&(n.filters?.length??0)>1){let a=[],c=[];for(let d of n.filters??[]){let m=Nt(i,{...n,combine_type:"AND",filters:[d]});if("unsupported"in m)return O("query_metric_data",m.unsupported);let f=await r.queryMetricData(m.input);c.push(f),a.push(...V(f))}return ae(i,a,n,{mode:"metric_data_v2",combine_type:"OR",query_count:c.length},n.raw?c:void 0)}let o=await r.queryMetricData(s.input);return ae(i,V(o),n,{mode:"metric_data_v2",request_body:s.input},n.raw?o:void 0)}catch(i){return Ri(i)?O("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}):N(i,"query_metric_data")}}async function rn(t,e,n){let r=new E(t,e);try{let i=await r.searchMetricTrees({keyword:n.keyword,projectId:n.project_id,parentDirId:n.parent_dir_id,orderBy:n.order_by}),s=ri(i).map(ln).slice(0,n.limit);return y({summary:{keyword:n.keyword,count:s.length},items:s})}catch(i){return N(i,"search_metric_trees")}}async function sn(t,e,n){let r=new E(t,e);try{let i=await r.getMetricTreeDetail(n.metric_tree_id);return y({detail:fi(i),raw:n.raw?i:void 0})}catch(i){return N(i,"get_metric_tree_detail")}}async function on(t,e,n){let r=new E(t,e);try{if(n.target==="dimension"&&!n.dimension&&!n.dimension_fd_id)return O("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=u(i.metricId);if(!s)return O("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=z(o),c=Me(n.filters??[],a),d=gi(i,n);if("unsupported"in d)return O("query_metric_tree_attribution",d.unsupported);if(n.target==="metric"){let _=hi(i,d.value,c),T=await r.queryMetricTreeDecompose(n.metric_tree_id,_);return ve(i,"metric",_i(T),n,n.raw?T:void 0)}if(n.target==="dimension"){let _=U(a,n.dimension,n.dimension_fd_id);if(!_)return O("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 T=Jt(i,_,d.value,c,n.limit,n.sort),R=await r.queryMetricTreeDrill(n.metric_tree_id,T);return ve(i,"dimension",Ht(R,u(_.name)),n,n.raw?R:void 0)}let m=bi(i,a,n.scan_dimensions,n.exclude_dimensions);if(!m.length)return O("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 f=[],C=[];for(let _ of m){let T=Jt(i,_,d.value,c,n.group_limit,n.sort),R=await r.queryMetricTreeDrill(n.metric_tree_id,T);C.push({dimension:u(_.name),raw:R}),f.push(...Ht(R,u(_.name)).slice(0,n.group_limit))}return ve(i,"scan",f,n,n.raw?C:void 0,{scanned_dimensions:m.map(_=>u(_.name))})}catch(i){return N(i,"query_metric_tree_attribution")}}async function ti(t){return(await an(t)).map(e=>u(e.id)).filter(Boolean)}async function an(t){return I(await t.listProjects()).map(g).filter(Boolean)}function ni(t){let e=g(t);return I(e.contents??e.items??e.data)}function ri(t){let e=g(t);return I(e.data??e.contents??e.items)}function Ae(t){return h({metric_id:u(t.id),name:u(t.name),project_id:u(t.projectId),dir_id:b(t.parentDirId,t.dirId),status:u(t.status),sub_type:u(t.subType),description:u(t.desc),dataset:mn(t.dsInfo),statistics:t.statisticsData,creator:ue(t.creator),business_owner:ue(t.businessOwner),updated_at:u(t.utime),raw:t})}function ii(t){return I(t).map(e=>cn(e,void 0))}function cn(t,e){let n=!!t.isMetric,r=u(t.id),i=!e&&!n?r:e;return h({id:r,name:u(t.name),type:n?"metric":e?"directory":"project",project_id:i,dir_id:!n&&e?r:void 0,metric_id:n?r:void 0,parent_id:u(t.parentId),children:I(t.children).map(s=>cn(s,i))})}function si(t,e){let n=g(t);return u(n.id)?[Ee(n,e)]:I(n.contents??n.children).map(r=>Ee(r,e))}function Ee(t,e){return h({id:u(t.id),name:u(t.name),type:"directory",project_id:e,dir_id:u(t.id),parent_id:b(t.parentDirId,t.parentId),can_use:S(t.canUse),can_manage:S(t.canManage),metric_count:$t(t.metricCnt),all_metric_count:$t(t.allMetricCnt),children:I(t.contents??t.children).map(n=>Ee(n,e))})}function oi(t){return h({metric_id:u(t.id),name:u(t.name),english_name:u(t.engName),status:u(t.status),sub_type:u(t.subType),description:u(t.desc),project_id:u(t.projectId),project_name:u(t.projectName),dir_id:b(t.parentDirId,t.dirId),dir_path:fn(t.dirPath),dataset:mn(t.dsInfo),source_fields:I(t.fdInfos).map(ce),aggregation:b(t.aggrType,t.aggregationType),formula:b(t.formula,t.expression),derive_setting:t.deriveSetting,format:t.format,applicable_dimensions:z(t),time_dimension:g(t.timeDim)?ce(g(t.timeDim)):void 0,business_attributes:I(t.bizAttrs).map(Si),business_owner:ue(t.businessOwner),creator:ue(t.creator),referenced_metrics:I(t.referencedMetrics).map(Ae),base_metric:g(t.baseMetric)?Ae(g(t.baseMetric)):void 0,linked_metric_id:u(t.linkMetricId),statistics:t.statisticsData,permissions:h({can_use:S(t.canUse),can_manage:S(t.canManage)}),created_at:u(t.ctime),updated_at:u(t.utime),has_draft:S(t.hasDraft)})}function ai(t){let e=g(t);return h({current:e.crtNode,upstream:e.backwardAtlas,downstream:e.forwardAtlas})}function Nt(t,e){let n=u(t.name),r=u(t.projectId);if(!n||!r)return{unsupported:{capability:"metric_detail_incomplete",message:"\u6307\u6807\u8BE6\u60C5\u7F3A\u5C11 name \u6216 projectId\u3002"}};let i=z(t),s=[];for(let a of e.dimensions??[]){let c=U(i,a);if(!c)return{unsupported:{capability:"unsupported_dimension",parameter:a,supported_dimensions:i}};s.push(yi(c))}let o=di(t,i,e.advanced_calc);return"unsupported"in o?{unsupported:o.unsupported}:{input:{projectId:r,metricId:e.metric_id,metricName:n,metricItems:[h({name:n,alias:li(n,e.advanced_calc),advCalc:o.value})],dimensions:s,filters:Me(e.filters??[],i),sorting:un(e.sort??[],t,i),limit:e.limit}}}function Lt(t,e){let n=g(t.metricChartConfig),r=u(n.metricChartCdId),i=u(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=[...z(t),...Ii(t)],a=[];for(let m of e.dimensions??[]){let f=U(o,m);if(!f||u(f.meta_type).toUpperCase()==="METRIC")return{unsupported:{capability:"unsupported_dimension",parameter:m,supported_dimensions:z(t)}};a.push(Ti(f))}let c=Me(e.filters??[],o),d=un(e.sort??[],t,o);return{cardId:s,cardKind:r?"chart":"value",dimensions:a,body:h({limit:e.limit,filters:c.length?c:void 0,combineType:e.filters?.length?e.combine_type:void 0,sorting:d.length?d:void 0})}}async function ci(t,e,n,r){let i=gn(await t.getCardEditMeta(e))??{},s=ui(i);s.row=r,s.sorting=[],await t.modifyCardEditMeta(e,n,i)}function ui(t){let e=g(t.content),n=g(e.meta),r=g(n.chartMain),i=g(r.zoneData);if(!Object.keys(i).length)throw new Error("\u6307\u6807\u5361\u7247\u7F16\u8F91\u914D\u7F6E\u7F3A\u5C11 content.meta.chartMain.zoneData\u3002");return e.meta=n,n.chartMain=r,r.zoneData=i,t.content=e,i}function di(t,e,n){if(!n)return{value:void 0};let r=g(t.timeDim),i=u(r?.fdId);if(["compare","last"].includes(n.type)&&!i)return{unsupported:{capability:"advanced_calc_requires_time_dimension",parameter:n.type}};if(n.type==="compare"){let a=n.compare??"yoy",c={yoy:["YEAR","YEAR"],mom:["MONTH","MONTH"],qoq:["QUARTER","QUARTER"],wow:["WEEK","WEEK"],dod:["DAY","DAY"]},[d,m]=c[a];return{value:{advType:"COMPARATIVE",advValue:{advType:"COMPARATIVE",dateFdId:i,valueType:(n.compare_value??"value").toUpperCase(),offset:1,offsetType:d,granularity:m}}}}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=pi(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?U(e,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:u(a?.fd_id)})}}}let o=n.rank_dim?U(e,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:u(o?.fd_id),topN:{topType:"CUSTOM_NUMBER",count:n.rank_top??10,calculationType:"COUNT"}})}}}function li(t,e){return e?e.type==="compare"?`${t}_${e.compare??"yoy"}`:e.type==="xtd"?`${t}_${e.xtd??"ytd"}`:e.type==="recent"?`${t}_recent_${e.recent??"7d"}`:`${t}_${e.type}`:t}function pi(t){let e=t.match(/^([1-9]\d*)([dwmqy])$/);if(!e)return;let n={d:"DAY",w:"WEEK",m:"MONTH",q:"QUARTER",y:"YEAR"};return{count:Number(e[1]),granularity:n[e[2]]}}function Me(t,e){return t.map(n=>{let r=U(e,n.field,n.fd_id),i=u(r?.meta_type).toUpperCase();return h({name:r?.name??n.field,fdId:n.fd_id??u(r?.fd_id)??n.field,fdType:u(r?.fd_type),metaType:i||"DIM",filterType:n.operator,filterValue:n.values})})}function un(t,e,n){return t.map(r=>{let i=U(n,r.field),s=u(i?.meta_type).toUpperCase();return h({name:i?.name??(r.field===u(e.name)?u(e.name):r.field),ordering:r.direction,key:u(i?.fd_id)||u(i?.id)||r.field,fdId:u(i?.fd_id),fdType:u(i?.fd_type),metaType:s||(i?"DIM":"METRIC")})})}function ae(t,e,n,r,i){let s=Ci(e.slice(0,n.limit),n.columns);return y({summary:{metric_id:n.metric_id,metric_name:u(t.name),row_count:s.length,truncated:e.length>s.length},columns:pn(s),rows:s,diagnostic:r,raw:i})}function V(t){let e=g(t),n=g(e.data)??e,r=I(n.values??n.rows??e.values??e.rows);if(r.length)return r;let i=I(n.columns??e.columns).map(o=>u(g(o)?.name??o)).filter(Boolean),s=I(n.preview??n.contents);return i.length?s.map(o=>{let a=Array.isArray(o)?o:[];return Object.fromEntries(i.map((c,d)=>[c,a[d]]))}):s}function qt(t){let e=g(t),n=g(e.data)??e,r=g(n.chartMain??e.chartMain??g(g(e.content).data).chartMain);if(!Object.keys(r).length)return V(t);let i=g(r.row),s=g(r.column),o=I(i.fields),a=j(i.data),c=j(r.data),d=mi(s),m=o.map(Oe).filter(Boolean),f=wi([...m,...d]),C=Math.max(a.length,c.length),_=[];for(let T=0;T<C;T+=1){let R=[];R.push(...j(a[T]).map(Gt)),R.push(...j(c[T]).map(Gt)),R.length&&_.push(Object.fromEntries(R.map((yn,Le)=>[f[Le]??`column_${Le+1}`,yn])))}return _}function mi(t){let n=j(t.data).map((r,i)=>{let s=j(r).map(dn).filter(Boolean).join("/");return s||Oe(I(t.fields)[i])||`metric_${i+1}`}).filter(Boolean);return n.length?n:I(t.fields).map(Oe).filter(Boolean)}function Oe(t){return b(t.alias,t.title,t.originTitle,t.name,t.fdId,t.id)??""}function dn(t){let e=g(t);return Object.keys(e).length?b(e.title,e.name,e.originTitle,e.alias,e.v,e.value)??"":u(t)}function Gt(t){let e=g(t);return Object.keys(e).length?"v"in e?e.v:"value"in e?e.value:dn(t):t}function ln(t){return h({metric_tree_id:u(t.metricTreeId),name:u(t.metricTreeName),root_metric_id:u(t.metricId),root_metric_name:u(t.metricName),project_id:u(t.projectId),project_name:u(t.projectName),parent_dir_id:u(t.parentDirId),dir_path:fn(t.dirPath),creator_id:u(t.creatorId),creator_name:u(t.creatorName),can_use:S(t.canUse),can_manage:S(t.canManage),updated_at:u(t.utime)})}function fi(t){let e=g(t.config)??{};return h({...ln(t),dom_id:u(t.domId),created_at:u(t.ctime),time_comparison:e.timeComparisonSetting,comparison_enabled:S(e.comparisonEnabled),contribution_calc_enabled:S(e.contributionCalcEnabled),dimension_decomposition:e.dimensionDecompositionContent,metric_decomposition:e.metricDecompositionContent,permissions:h({can_use:S(t.canUse),can_manage:S(t.canManage)})})}function gi(t,e){let n=g(t.config)??{},r=e.time_comparison_json??gn(g(n.timeComparisonSetting)),i=S(n.comparisonEnabled)??!!r,s=S(n.contributionCalcEnabled)??!1;if(e.period||e.last_period){if(!e.period||!e.last_period)return{unsupported:{capability:"period_requires_last_period",message:"period \u548C last_period \u9700\u8981\u540C\u65F6\u6307\u5B9A\u3002"}};r=r??{};let o=g(r.advValue)??{};r.advValue=o,o.window={period:[e.period],withMacro:!1};let a=Bi(e.period,e.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 hi(t,e,n){let r=g(t.config)??{},i=g(r.metricDecompositionContent)??{};return h({timeComparisonSetting:e.setting,comparisonEnabled:e.comparisonEnabled,contributionCalcEnabled:!1,metricDecomposeInfo:{metricRelationTree:i.metricRelationTree,filters:n}})}function Jt(t,e,n,r,i,s){return h({timeComparisonSetting:n.setting,comparisonEnabled:n.comparisonEnabled,contributionCalcEnabled:n.contributionEnabled,drillInfo:{dimensionFdId:u(e.fd_id),drillFilters:r,nodeNum:i,orderBy:s==="asc"?"contributionAsc":"contributionDesc"}})}function _i(t){return V(t).map(e=>h({child_metric:u(g(e.metricInfo)?.name),child_metric_id:u(g(e.metricInfo)?.metricId),current_value:e.currentValue,comparison_value:e.comparisonValue,change_value:e.changeValue,change_rate:e.changeRate,contribution_value:e.contributionValue,contribution_rate:e.contributionRate}))}function Ht(t,e){return V(t).map((n,r)=>h({dimension:e,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 ve(t,e,n,r,i,s){let o=e==="scan"?n:n.slice(0,r.limit);return y({summary:{metric_tree_id:r.metric_tree_id,metric_tree_name:u(t.metricTreeName),root_metric_id:u(t.metricId),root_metric_name:u(t.metricName),target:e,row_count:o.length,...s},columns:pn(o),rows:o,raw:i})}function bi(t,e,n,r){let i=new Set((n??[]).map(d=>d.trim()).filter(Boolean)),s=new Set((r??[]).map(d=>d.trim()).filter(Boolean)),o=new Map(e.map(d=>[u(d.name),d])),a=new Map(e.map(d=>[u(d.fd_id),d])),c=i.size?[...i].map(d=>o.get(d)).filter(d=>!!d):[];if(!c.length){let d=g(t.config)??{},m=g(d.dimensionDecompositionContent)??{};c=j(m.decomposableDimensionIds).map(f=>a.get(String(f))).filter(f=>!!f)}return c.length||(c=e),c.filter(d=>!s.has(u(d.name)))}function z(t){let e=new Set,n=[],r=i=>{if(!i)return;let s=u(i.fdId),o=u(i.name),a=s||o;if(!(!a||e.has(a))){e.add(a),n.push(ce(i));for(let c of I(i.subs))r(c)}};for(let i of I(t.applicableDims))r(i);return r(g(t.timeDim)),n}function Ii(t){let e=I(t.fdInfos).map(ce);return!e.length&&u(t.name)&&e.push(h({id:b(t.id,t.name),fd_id:u(t.id),name:u(t.name),fd_type:"DOUBLE",meta_type:"METRIC"})),e}function ce(t){return h({id:b(t.id,t.fdId),fd_id:u(t.fdId),name:u(t.name),fd_type:u(t.fdType),meta_type:u(t.metaType),ds_id:u(t.dsId),granularity:u(t.granularity)})}function U(t,e,n){let r=(n??e)?.trim();if(r)return t.find(i=>[i.fd_id,i.id,i.name].map(u).includes(r))}function yi(t){return h({name:u(t.name),alias:u(t.name),fdType:b(t.fd_type),metaType:"DIM",key:b(t.fd_id,t.id,t.name),fdId:b(t.fd_id),dsId:b(t.ds_id),granularity:b(t.granularity)})}function Ti(t){return h({name:u(t.name),alias:b(t.name),fdType:b(t.fd_type),metaType:"DIM",key:b(t.fd_id,t.id,t.name),fdId:b(t.fd_id),dsId:b(t.ds_id),granularity:b(t.granularity)})}function Ci(t,e){return e?.length?t.map(n=>Object.fromEntries(e.map(r=>[r,n[r]]))):t}function pn(t){return[...new Set(t.flatMap(e=>Object.keys(e)))]}function wi(t){let e=new Map;return t.map((n,r)=>{let i=n||`column_${r+1}`,s=e.get(i)??0;return e.set(i,s+1),s?`${i}_${s+1}`:i})}function Bi(t,e){let n=Date.parse(t),r=Date.parse(e);if(!/^\d{4}-\d{2}-\d{2}$/.test(t)||!/^\d{4}-\d{2}-\d{2}$/.test(e)||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 mn(t){let e=g(t);if(e)return h({dataset_id:u(e.dsId),name:u(e.name)})}function ue(t){let e=g(t);if(e)return h({user_id:b(e.uId,e.id),name:u(e.name),deleted:S(e.isDel)})}function Si(t){return h({id:u(t.id),name:u(t.name),type:u(t.valueType),values:I(t.values)})}function fn(t){return I(t).map(e=>u(e.dirName??e.name)).filter(Boolean)}function O(t,e){return y({status:"unsupported",diagnostic:{tool:t,...e}})}function N(t,e){return t instanceof D?$({operation:e,diagnostic:t.detail}):$({operation:e,message:t instanceof Error?t.message:String(t)})}function Ri(t){return t instanceof D&&t.detail.operation==="queryMetricData"&&t.detail.path==="/api/metric-platform/metric-data/v2"&&/No static resource metric-platform\/metric-data\/v2/i.test(t.detail.message)}function I(t){return Array.isArray(t)?t.map(g).filter(Boolean):[]}function j(t){return Array.isArray(t)?t:[]}function g(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}function u(t){return typeof t=="string"?t:t==null?"":String(t)}function b(...t){return t.map(u).find(e=>e.trim())?.trim()}function S(t){return typeof t=="boolean"?t:void 0}function $t(t){return typeof t=="number"&&Number.isFinite(t)?t:void 0}function ki(t,e){let n=new Set;return t.filter(r=>{let i=u(r[e]);return!i||n.has(i)?!1:(n.add(i),!0)})}function gn(t){return t?JSON.parse(JSON.stringify(t)):void 0}function hn(t,e,n,r,i={}){let s=i.usageTelemetry??new te({config:n,appVersion:i.appVersion??"unknown"}),o=(c,d,m)=>{t.registerTool.call(t,c,d,rt(c,m,s))},a=c=>!r.service||r.service.toolList.includes(c);o("get_bi_capabilities",{title:"Get BI Capabilities",description:"\u83B7\u53D6\u5F53\u524D BI \u73AF\u5883\u7248\u672C\u548C MCP \u529F\u80FD\u542F\u7528\u72B6\u6001\u3002",inputSchema:st},(c,d)=>e.run(({client:m,config:f})=>ot(m,f),d,"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:ft,outputSchema:dt},(c,d)=>e.run(({config:m})=>bt(m,c),d,"chatbi_list_themes")),o("chatbi_query",{title:"ChatBI Query",description:"\u6267\u884C ChatBI L1 \u540C\u6B65\u95EE\u6570\uFF0C\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:gt,outputSchema:lt},(c,d)=>e.run(({config:m})=>It(m,c),d,"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:ht,outputSchema:pt},(c,d)=>e.run(({config:m})=>yt(m,c),d,"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:_t,outputSchema:mt},(c,d)=>e.run(({config:m})=>Tt(m,c),d,"chatbi_insight_poll"))),r.ok&&(a("global_search")&&o("global_search",{title:"Global Search",description:"\u641C\u7D22 BI \u4E2D\u7684\u5361\u7247\u3001\u4EEA\u8868\u677F\u3001\u6570\u636E\u96C6\u548C ETL \u8D44\u6E90\u3002",inputSchema:Dt},(c,d)=>e.run(({client:m})=>jt(m,c),d,"global_search")),a("search_metrics")&&o("search_metrics",{title:"Search Metrics",description:"\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",inputSchema:zt,outputSchema:M},(c,d)=>e.run(({client:m,config:f})=>Zt(m,f,c),d,"search_metrics")),a("list_metric_catalog")&&o("list_metric_catalog",{title:"List Metric Catalog",description:"\u6D4F\u89C8\u6307\u6807\u4E3B\u9898\u3001\u76EE\u5F55\u548C\u6307\u6807\u8282\u70B9\uFF0C\u9002\u5408\u4E0D\u77E5\u9053\u5173\u952E\u8BCD\u65F6\u53D1\u73B0\u53EF\u7528\u6307\u6807\u3002",inputSchema:Ft,outputSchema:M},(c,d)=>e.run(({client:m,config:f})=>en(m,f,c),d,"list_metric_catalog")),a("get_metric_detail")&&o("get_metric_detail",{title:"Get Metric Detail",description:"\u83B7\u53D6\u6307\u6807\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",inputSchema:Qt,outputSchema:M},(c,d)=>e.run(({client:m,config:f})=>tn(m,f,c),d,"get_metric_detail")),a("query_metric_data")&&o("query_metric_data",{title:"Query Metric Data",description:"\u5B89\u5168\u67E5\u8BE2\u6307\u6807\u6570\u636E\uFF1B\u666E\u901A/\u7EF4\u5EA6\u67E5\u8BE2\u8BFB\u53D6\u6307\u6807\u5361\u9884\u89C8\u6570\u636E\uFF0C\u7EF4\u5EA6\u67E5\u8BE2\u53EA\u4FEE\u6539\u4E34\u65F6 session\uFF0C\u4E0D\u8C03\u7528 save\u3001update\u3001delete\u3001publish \u7C7B\u6301\u4E45\u5316\u8DEF\u5F84\u3002",inputSchema:Wt,outputSchema:M},(c,d)=>e.run(({client:m,config:f})=>nn(m,f,c),d,"query_metric_data")),a("search_metric_trees")&&o("search_metric_trees",{title:"Search Metric Trees",description:"\u641C\u7D22\u6307\u6807\u6811\u8D44\u6E90\uFF0C\u8FD4\u56DE\u53EF\u7528\u4E8E\u5F52\u56E0\u5206\u6790\u7684 metric_tree_id\u3002",inputSchema:Kt,outputSchema:M},(c,d)=>e.run(({client:m,config:f})=>rn(m,f,c),d,"search_metric_trees")),a("get_metric_tree_detail")&&o("get_metric_tree_detail",{title:"Get Metric Tree Detail",description:"\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",inputSchema:Yt,outputSchema:M},(c,d)=>e.run(({client:m,config:f})=>sn(m,f,c),d,"get_metric_tree_detail")),a("query_metric_tree_attribution")&&o("query_metric_tree_attribution",{title:"Query Metric Tree Attribution",description:"\u57FA\u4E8E\u6307\u6807\u6811\u6267\u884C\u6307\u6807\u62C6\u89E3\u3001\u5355\u7EF4\u62C6\u89E3\u6216\u5168\u7EF4\u626B\u63CF\u5F52\u56E0\u5206\u6790\u3002",inputSchema:Xt,outputSchema:M},(c,d)=>e.run(({client:m,config:f})=>on(m,f,c),d,"query_metric_tree_attribution")),a("execute_sql_query")&&o("execute_sql_query",{title:"Execute SQL Query",description:`\u57FA\u4E8E\u5355\u4E2A\u6570\u636E\u96C6\u6267\u884C\u7B80\u5355\u67E5\u8BE2 SQL\u3002\u4EC5\u652F\u6301\u5355\u8868\u67E5\u8BE2\u548C\u67E5\u8BE2\u8BED\u53E5\uFF0C\u9002\u5408\u5C11\u91CF\u7ED3\u679C\u9884\u89C8\u6216\u8F7B\u91CF\u5206\u6790\uFF0C\u4E0D\u9002\u5408\u62C9\u53D6\u5168\u91CF\u6570\u636E\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:Mt},(c,d)=>e.run(({client:m,config:f})=>Pt(m,f,c),d,"execute_sql_query")),a("get_dataset_detail")&&o("get_dataset_detail",{title:"Get Dataset Detail",description:"\u83B7\u53D6\u6570\u636E\u96C6\u7684\u57FA\u7840\u4FE1\u606F\u3001\u5B57\u6BB5\u7ED3\u6784\u548C\u76F8\u5173\u914D\u7F6E\u3002",inputSchema:kt},(c,d)=>e.run(({client:m})=>Et(m,c),d,"get_dataset_detail")),a("get_card_info")&&o("get_card_info",{title:"Get Card Info",description:"\u83B7\u53D6\u5361\u7247\u7684\u57FA\u7840\u4FE1\u606F\u3001\u56FE\u8868\u7C7B\u578B\u3001\u6570\u636E\u6765\u6E90\u548C\u914D\u7F6E\u3002",inputSchema:vt},(c,d)=>e.run(({client:m})=>Ot(m,c),d,"get_card_info")),a("get_page_info")&&o("get_page_info",{title:"Get Page Info",description:"\u83B7\u53D6\u9875\u9762/\u4EEA\u8868\u677F\u7684\u57FA\u7840\u4FE1\u606F\u3001\u5E03\u5C40\u3001\u5361\u7247\u5217\u8868\u548C\u76F8\u5173\u914D\u7F6E\u3002",inputSchema:At},(c,d)=>e.run(({client:m})=>xt(m,c),d,"get_page_info")))}var Di=vi(import.meta.url),ji=Di("../package.json"),De=class{record(e){console.error(JSON.stringify({runtime:qi(e)}))}};function bn(t,e={}){let n=e.mode??t.MCP_TRANSPORT??"stdio",r={appVersion:e.appVersion,clientFactory:e.clientFactory,callerContextResolver:e.callerContextResolver,guanBIClientFactory:e.guanBIClientFactory,capabilityResolver:e.capabilityResolver,transportFactory:e.transportFactory};return n==="streamable-http"?new Ue(t,r):new je(t,r)}async function In(t,e={}){let n=e.appVersion??ji.version,r=e.callerContextResolver??Xe(t),i=e.guanBIClientFactory??new ee(t,{clientFactory:e.clientFactory}),s=i.create(await r.resolve()),o=await(e.capabilityResolver??H)(s.client,s.config),a=new xi({name:"guanbi-mcp-server",version:n});return hn(a,new ne(r,i,new F),s.config,o,{appVersion:n}),a}var je=class{constructor(e,n){this.config=e;this.options=n}config;options;mode="stdio";health(){return{status:"ok",mode:this.mode,boundBISite:{configured:!!this.config.BI_BASE_URL,baseUrl:this.config.BI_BASE_URL,publicPath:this.config.BI_PUBLIC_PATH}}}async start(){await(await In(this.config,this.options)).connect(this.options.transportFactory?.()??new Mi)}},Ue=class{constructor(e,n){this.config=e;this.options=n}config;options;mode="streamable-http";httpServer;sessions=new Map;logger=new De;health(){return{status:"ok",mode:this.mode,boundBISite:{configured:!!this.config.BI_BASE_URL,baseUrl:this.config.BI_BASE_URL,publicPath:this.config.BI_PUBLIC_PATH}}}async start(){this.httpServer=Oi((e,n)=>{this.handleRequest(e,n).catch(r=>{this.log("error","mcp_http_internal_error","Streamable HTTP request failed.",e,{statusCode:500,errorMessage:r instanceof Error?r.message:String(r)}),L(n,500,{error:"internal_error",message:r instanceof Error?r.message:String(r)})})}),await new Promise((e,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:Ji(this.config),entrypointTokenConfigured:!!this.config.MCP_ENTRYPOINT_TOKEN,trustedGateway:de(this.config.MCP_TRUSTED_GATEWAY)}),e()})})}async stop(){await Promise.all([...this.sessions.values()].map(({server:e})=>e.close())),this.sessions.clear(),this.httpServer&&(await new Promise((e,n)=>{this.httpServer?.close(r=>r?n(r):e())}),this.httpServer=void 0,this.log("info","mcp_http_stopped","Streamable HTTP server stopped.",void 0,{sessionCount:this.sessions.size}))}url(){let e=this.httpServer?.address();if(!(!e||typeof e=="string"))return`http://${Li(e,this.config.MCP_HTTP_HOST??"127.0.0.1")}:${e.port}`}async handleRequest(e,n){let r=_n(e);if(!r){L(n,400,{error:"bad_request"});return}if(Gi(r)&&e.method==="GET"){if(r==="/sysmon/health/readiness"){let a=this.readiness();L(n,a.ready?200:503,a);return}L(n,200,this.health());return}if(r!=="/mcp"){L(n,404,{error:"not_found"});return}if(!Ui(e.headers,this.config)){this.log("warn","mcp_entrypoint_unauthorized","Rejected MCP request with invalid entrypoint credential.",e,{statusCode:401,entrypointTokenConfigured:!!this.config.MCP_ENTRYPOINT_TOKEN,trustedGateway:de(this.config.MCP_TRUSTED_GATEWAY)}),L(n,401,{error:"mcp_entrypoint_unauthorized"});return}let i=Ne(e.headers["mcp-session-id"]);if(i&&!this.sessions.has(i)){this.log("warn","mcp_session_not_found","Rejected MCP request for an unknown session.",e,{statusCode:404,...Pe(i),sessionCount:this.sessions.size}),L(n,404,{error:"mcp_session_not_found"});return}let s=await this.resolveSession(e);await s.transport.handleRequest(e,n);let o=s.transport.sessionId;o&&e.method!=="DELETE"&&!this.sessions.has(o)&&(this.sessions.set(o,s),this.log("info","mcp_session_created","Created Streamable HTTP MCP session.",e,{...Pe(o),sessionCount:this.sessions.size}))}async resolveSession(e){let n=Ne(e.headers["mcp-session-id"]);if(n){let s=this.sessions.get(n);if(s)return s}let r=new Pi({sessionIdGenerator:Ei,onsessionclosed:async s=>{let o=this.sessions.get(s);this.sessions.delete(s),await o?.server.close(),this.log("info","mcp_session_closed","Closed Streamable HTTP MCP session.",void 0,{...Pe(s),sessionCount:this.sessions.size})}}),i=await In(this.config,{...this.options,callerContextResolver:this.options.callerContextResolver??Ze(),capabilityResolver:this.options.capabilityResolver??(async()=>Ke(this.config))});return await i.connect(r),{server:i,transport:r}}readiness(){let e=Ni(this.config);return{...this.health(),status:e.length>0?"error":"ok",ready:e.length===0,errors:e.length>0?e:void 0}}log(e,n,r,i,s={}){let o=i?_n(i):void 0;this.logger.record({level:e,event:n,mode:this.mode,message:r,method:i?.method,path:o,...s})}};function Ui(t,e){if(de(e.MCP_TRUSTED_GATEWAY))return!0;let n=e.MCP_ENTRYPOINT_TOKEN;return n?Ne(t.authorization)?.trim()===`Bearer ${n}`:!1}function Ne(t){return Array.isArray(t)?t[0]:t}function de(t){return["1","true","yes","on"].includes(t?.trim().toLowerCase()??"")}function Ni(t){let e=[];return t.BI_BASE_URL||e.push("BI_BASE_URL is required"),!de(t.MCP_TRUSTED_GATEWAY)&&!t.MCP_ENTRYPOINT_TOKEN&&e.push("MCP_ENTRYPOINT_TOKEN is required unless MCP_TRUSTED_GATEWAY is true"),e}function L(t,e,n){t.headersSent||(t.writeHead(e,{"Content-Type":"application/json"}),t.end(JSON.stringify(n)))}function Li(t,e){return t.address==="::"||t.address==="0.0.0.0"?e==="0.0.0.0"||e==="::"?"127.0.0.1":e:t.address}function qi(t){return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}function _n(t){try{return new URL(t.url??"/",`http://${t.headers.host??"localhost"}`).pathname}catch{return}}function Gi(t){return["/healthz","/sysmon/health/liveness","/sysmon/health/readiness"].includes(t)}function Ji(t){let e={configured:!!t.BI_BASE_URL,publicPath:t.BI_PUBLIC_PATH};if(!t.BI_BASE_URL)return e;try{e.origin=new URL(t.BI_BASE_URL).origin}catch{e.configured=!0}return e}function Pe(t){return{hasSessionId:!0,sessionIdHash:Ai("sha256").update(t).digest("hex").slice(0,12)}}async function Hi(){let t=qe();await bn(t).start()}Hi().catch(t=>{console.error(t instanceof Error?t.message:t),process.exit(1)});
|
|
8
|
+
${u}`:c}catch{return}}var Ge=new Map([["k",1e3],["K",1e3],["M",1e6],["B",1e9],["\u4E07",1e4],["\u4EBF",1e8]]),Ji=[[1e8,"\u4EBF"],[1e4,"\u4E07"]];function Hi(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 $i(e,t,n){let r=new Map;for(let[i,s]of e.entries()){let o=n.get(s);if(o?.prefixUnit!=="auto")continue;let a=0;for(let u of t){let l=en(u[i]);typeof l=="number"&&(a=Math.max(a,Math.abs(l/tn(o))))}let c=Wi(a);c&&r.set(s,c)}return r}function Fi(e,t,n){if(!t)return e;let r=en(e);return typeof r!="number"?e:Vi(r,t,n)}function en(e){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e!="string")return;let t=Number(e.trim());return Number.isFinite(t)?t:void 0}function Vi(e,t,n){let r=tn(t),{unit:i,shouldScale:s}=zi(t,n),o=s&&i?Ge.get(i)??1:1,a=e/r/o,c=Qi(t.decimalPlaces),u=t.useThousandsSeparator?a.toLocaleString("en-US",{minimumFractionDigits:c,maximumFractionDigits:c}):a.toFixed(c),l=i&&t.showPrefixUnit!==!1?i:"",m=t.showSuffix===!1||typeof t.suffix!="string"?"":t.suffix;return`${u}${l}${m}`}function tn(e){if(e.showPrefixUnit!==!1&&typeof e.prefixUnit=="string"&&e.prefixUnit!=="auto"&&Ge.has(e.prefixUnit))return 1;let t=Number(e.divideDataBy??1);return Number.isFinite(t)&&t!==0?t:1}function zi(e,t){return e.showPrefixUnit===!1?{unit:"",shouldScale:!1}:e.prefixUnit==="auto"?{unit:t??"",shouldScale:!0}:typeof e.prefixUnit=="string"&&Ge.has(e.prefixUnit)?{unit:e.prefixUnit,shouldScale:!0}:{unit:"",shouldScale:!1}}function Qi(e){return typeof e!="number"||!Number.isFinite(e)?2:Math.max(0,Math.min(100,Math.trunc(e)))}function Wi(e){return Ji.find(([t])=>e>=t)?.[1]??""}function ge(e,t,n){let r=Ki(e,t,n);return q({error:"chatbi_request_failed",requested_operation:n,...r,tried_base_urls:r.tried_base_urls??e.getTriedBaseUrls()})}function Ki(e,t,n){return t instanceof E?t.detail:e.getLastError()??{operation:n,detail:t instanceof Error?t.message:String(t)}}import{z as Je}from"zod";var nn={dsId:Je.string().min(1).describe("\u6570\u636E\u96C6 ID\u3002")},rn={cdId:Je.string().min(1).describe("\u5361\u7247 ID\u3002")},sn={pageId:Je.string().min(1).describe("\u9875\u9762/\u4EEA\u8868\u677F ID\u3002")};async function on(e,t){let n=await e.get(`/api/data-source/${encodeURIComponent(t.dsId)}`);return P(n)}async function an(e,t){let n=await e.get(`/api/card/${encodeURIComponent(t.cdId)}`);return P(n)}async function cn(e,t){let n=await e.get(`/api/page/${encodeURIComponent(t.pageId)}`);return P(n)}import{z as U}from"zod";var Yi=U.object({name:U.string().min(1),query:U.string().min(1)}),un={query:U.string().min(1).describe("\u8981\u6267\u884C\u7684\u7B80\u5355\u67E5\u8BE2 SQL\u3002\u4EC5\u652F\u6301\u5355\u8868\u67E5\u8BE2\u548C\u67E5\u8BE2\u8BED\u53E5\uFF0C\u63A8\u8350\u7528\u4E8E\u5C11\u91CF\u7ED3\u679C\u9884\u89C8\u6216\u8F7B\u91CF\u5206\u6790\uFF0C\u4E0D\u9002\u5408\u62C9\u53D6\u5168\u91CF\u6570\u636E\uFF1B\u5EFA\u8BAE\u663E\u5F0F\u5199 LIMIT\u3002"),inputs:U.array(U.string().min(1)).min(1).max(1).describe("SQL \u67E5\u8BE2\u4F9D\u8D56\u7684\u6570\u636E\u96C6 ID \u5217\u8868\u3002\u4EC5\u652F\u6301\u5355\u8868\u67E5\u8BE2\uFF0C\u8BF7\u53EA\u4F20 1 \u4E2A\u6570\u636E\u96C6 ID\u3002"),queryStructure:U.object({ctes:U.array(Yi).optional(),mainQuery:U.string().optional()}).optional().describe("\u7ED3\u6784\u5316\u67E5\u8BE2\u4FE1\u606F\uFF0C\u53EF\u7528\u4E8E\u62C6\u5206 CTE \u548C\u4E3B\u67E5\u8BE2\uFF1B\u4ECD\u4EC5\u9002\u7528\u4E8E\u5355\u8868\u67E5\u8BE2\u3002")};async function dn(e,t,n){await mt(e,t,"executeSqlQuery");try{let r=await e.post("/api/data-source/execute-sql-query",{...n,limit:t.BI_MAX_ROWS});return P({maxRowsHint:t.BI_MAX_ROWS,result:r})}catch(r){throw Zi(r)?new Error("execute_sql_query \u8FD4\u56DE 404\u3002\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"):r}}function Zi(e){return e instanceof Error&&e.message.includes("POST /api/data-source/execute-sql-query HTTP 404")}import{z as D}from"zod";var ln={keyword:D.string().default("").describe("\u641C\u7D22\u5173\u952E\u8BCD\uFF0C\u7559\u7A7A\u65F6\u8FD4\u56DE\u8D44\u6E90\u5217\u8868\u3002"),resourceType:D.enum(["ALL","CARD","DASHBOARD","DATA_SET","ETL"]).optional().default("ALL"),limit:D.number().int().min(1).max(100).optional().default(20),offset:D.number().int().min(0).optional().default(0),utimeStartTime:D.number().int().optional().describe("\u66F4\u65B0\u65F6\u95F4\u8D77\u70B9\uFF0C\u6BEB\u79D2\u65F6\u95F4\u6233\u3002"),utimeEndTime:D.number().int().optional().describe("\u66F4\u65B0\u65F6\u95F4\u7EC8\u70B9\uFF0C\u6BEB\u79D2\u65F6\u95F4\u6233\u3002"),cardType:D.string().optional().describe("\u5361\u7247\u7C7B\u578B\u8FC7\u6EE4\uFF0C\u4EC5 resourceType \u5305\u542B CARD \u65F6\u4F7F\u7528\u3002"),permissionType:D.string().optional(),orderBy:D.string().optional(),isDesc:D.boolean().optional()};async function pn(e,t){let{cardType:n,...r}=t,i={...r,specificResourceFilters:n?{cardType:n}:void 0},s=await e.post("/api/global-search",i);return P(s)}import{z as p}from"zod";var Qe=p.enum(["asc","desc"]),Xi=p.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"]),mn=new Set(["BT","CLOSE_BT_OPEN","OPEN_BT_CLOSE","OPEN_BT_OPEN"]),$e=new Set(["IS_NULL","NOT_NULL"]),Tn=p.object({field:p.string().min(1).describe("\u7B5B\u9009\u5B57\u6BB5\u540D\u79F0\u6216\u5B57\u6BB5 ID\u3002"),operator:Xi.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:p.array(p.union([p.string(),p.number(),p.boolean()])).optional().describe("\u7B5B\u9009\u503C\u3002IS_NULL/NOT_NULL \u4E0D\u9700\u8981\u4F20\u503C\u3002"),fd_id:p.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;$e.has(e.operator)&&n>0&&t.addIssue({code:p.ZodIssueCode.custom,path:["values"],message:`${e.operator} \u64CD\u4F5C\u7B26\u4E0D\u63A5\u53D7\u7B5B\u9009\u503C\u3002`}),mn.has(e.operator)&&n!==2&&t.addIssue({code:p.ZodIssueCode.custom,path:["values"],message:`${e.operator} \u64CD\u4F5C\u7B26\u9700\u8981\u6070\u597D 2 \u4E2A\u503C\u3002`}),!mn.has(e.operator)&&!$e.has(e.operator)&&n<1&&t.addIssue({code:p.ZodIssueCode.custom,path:["values"],message:`${e.operator} \u64CD\u4F5C\u7B26\u81F3\u5C11\u9700\u8981 1 \u4E2A\u503C\u3002`})}),es=p.object({field:p.string().min(1).describe("\u6392\u5E8F\u5B57\u6BB5\u540D\u79F0\u6216\u5B57\u6BB5 ID\u3002"),direction:Qe.describe("\u6392\u5E8F\u65B9\u5411\u3002")}),ts=p.object({type:p.enum(["compare","xtd","last","recent","percentage","rank_top"]),compare:p.enum(["yoy","mom","qoq","wow","dod"]).optional(),compare_value:p.enum(["value","rate","rawdata"]).optional(),xtd:p.enum(["ytd","qtd","mtd","wtd","dtd"]).optional(),recent:p.string().regex(/^[1-9]\d*[dwmqy]$/).optional(),recent_base:p.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),percentage_dim:p.string().min(1).optional(),rank_top:p.number().int().positive().optional(),rank_order:Qe.optional(),rank_dim:p.string().min(1).optional()}),Cn={keyword:p.string().min(1).optional().describe("\u6307\u6807\u540D\u79F0\u5173\u952E\u8BCD\u3002"),project_id:p.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:p.string().min(1).optional().describe("\u76EE\u5F55 ID\u3002"),status:p.string().min(1).optional().describe("\u4E0A\u7EBF\u72B6\u6001\u3002"),sub_types:p.array(p.string().min(1)).optional().describe("\u6307\u6807\u7C7B\u578B\u5217\u8868\u3002"),order_by:p.enum(["utimeDesc","utimeAsc"]).optional().describe("\u6392\u5E8F\u65B9\u5F0F\u3002"),limit:p.number().int().positive().max(200).optional().default(20).describe("\u6700\u591A\u8FD4\u56DE\u6761\u6570\u3002")},wn={project_id:p.string().min(1).optional().describe("\u6307\u6807\u4E3B\u9898 ID\u3002"),keyword:p.string().min(1).optional().describe("\u540D\u79F0\u5173\u952E\u8BCD\uFF0C\u53EF\u5339\u914D\u4E3B\u9898\u3001\u76EE\u5F55\u6216\u6307\u6807\u3002"),raw:p.boolean().optional().describe("\u662F\u5426\u8FD4\u56DE\u539F\u59CB\u54CD\u5E94\u3002")},Sn={metric_id:p.string().min(1).describe("\u6307\u6807 ID\u3002"),brief:p.boolean().optional().describe("\u662F\u5426\u53EA\u8FD4\u56DE\u8BE6\u60C5\uFF0C\u4E0D\u8865\u5145\u8840\u7F18\u3002"),raw:p.boolean().optional().describe("\u662F\u5426\u8FD4\u56DE\u539F\u59CB\u8BE6\u60C5\u3002")},Bn={metric_id:p.string().min(1).describe("\u6307\u6807 ID\u3002"),dimensions:p.array(p.string().min(1)).optional().describe("\u6309\u540D\u79F0\u6216\u5B57\u6BB5 ID \u6307\u5B9A\u67E5\u8BE2\u7EF4\u5EA6\u3002"),filters:p.array(Tn).optional().describe("\u7B5B\u9009\u6761\u4EF6\u3002"),combine_type:p.enum(["AND","OR"]).optional().default("AND").describe("\u591A\u4E2A\u7B5B\u9009\u6761\u4EF6\u7684\u7EC4\u5408\u65B9\u5F0F\u3002"),sort:p.array(es).optional().describe("\u6392\u5E8F\u5B57\u6BB5\u3002"),columns:p.array(p.string().min(1)).optional().describe("\u7ED3\u679C\u5217\u88C1\u526A\u3002"),limit:p.number().int().positive().max(1e3).optional().default(100).describe("\u6700\u591A\u8FD4\u56DE\u884C\u6570\u3002"),advanced_calc:ts.optional().describe("\u9AD8\u7EA7\u8BA1\u7B97\uFF0C\u53EA\u4F7F\u7528\u6307\u6807\u6570\u636E\u67E5\u8BE2\u63A5\u53E3\u8868\u8FBE\u3002"),raw:p.boolean().optional().describe("\u662F\u5426\u8FD4\u56DE\u539F\u59CB\u54CD\u5E94\u3002")},On={keyword:p.string().min(1).optional().describe("\u6307\u6807\u6811\u540D\u79F0\u5173\u952E\u8BCD\u3002"),project_id:p.string().min(1).optional().describe("\u6839\u6307\u6807\u6240\u5C5E\u4E3B\u9898 ID\u3002"),parent_dir_id:p.string().min(1).optional().describe("\u6307\u6807\u6811\u76EE\u5F55 ID\u3002"),order_by:p.enum(["utimeDesc","utimeAsc"]).optional().default("utimeDesc").describe("\u6392\u5E8F\u65B9\u5F0F\u3002"),limit:p.number().int().positive().max(200).optional().default(20).describe("\u6700\u591A\u8FD4\u56DE\u6761\u6570\u3002")},Rn={metric_tree_id:p.string().min(1).describe("\u6307\u6807\u6811 ID\u3002"),raw:p.boolean().optional().describe("\u662F\u5426\u8FD4\u56DE\u539F\u59CB\u8BE6\u60C5\u3002")},En={metric_tree_id:p.string().min(1).describe("\u6307\u6807\u6811 ID\u3002"),target:p.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:p.string().min(1).optional().describe("target=dimension \u65F6\u6309\u7EF4\u5EA6\u540D\u79F0\u6307\u5B9A\u3002"),dimension_fd_id:p.string().min(1).optional().describe("target=dimension \u65F6\u6309\u5B57\u6BB5 ID \u6307\u5B9A\u3002"),scan_dimensions:p.array(p.string().min(1)).optional().describe("target=scan \u65F6\u6307\u5B9A\u626B\u63CF\u7EF4\u5EA6\u540D\u79F0\u3002"),exclude_dimensions:p.array(p.string().min(1)).optional().describe("target=scan \u65F6\u6392\u9664\u7EF4\u5EA6\u540D\u79F0\u3002"),period:p.string().min(1).optional().describe("\u5F53\u524D\u671F\uFF0C\u914D\u5408 last_period \u8986\u76D6\u9ED8\u8BA4\u65F6\u95F4\u5BF9\u6BD4\u3002"),last_period:p.string().min(1).optional().describe("\u5BF9\u6BD4\u671F\uFF0C\u914D\u5408 period \u8986\u76D6\u9ED8\u8BA4\u65F6\u95F4\u5BF9\u6BD4\u3002"),time_comparison_json:p.record(p.string(),p.unknown()).optional().describe("\u5B8C\u6574\u65F6\u95F4\u5BF9\u6BD4\u914D\u7F6E\u8986\u76D6\u3002"),filters:p.array(Tn).optional().describe("\u5F52\u56E0\u7B5B\u9009\u6761\u4EF6\u3002"),limit:p.number().int().positive().max(200).optional().default(20).describe("metric/dimension \u8FD4\u56DE\u884C\u6570\u3002"),group_limit:p.number().int().positive().max(50).optional().default(5).describe("scan \u6BCF\u4E2A\u7EF4\u5EA6\u8FD4\u56DE\u884C\u6570\u3002"),sort:Qe.optional().default("desc").describe("\u6309\u8D21\u732E\u503C\u6392\u5E8F\u65B9\u5411\u3002"),raw:p.boolean().optional().describe("\u662F\u5426\u8FD4\u56DE\u539F\u59CB\u54CD\u5E94\u3002")},L={summary:p.unknown().optional(),items:p.array(p.unknown()).optional(),tree:p.unknown().optional(),detail:p.unknown().optional(),columns:p.array(p.unknown()).optional(),rows:p.array(p.unknown()).optional(),raw:p.unknown().optional(),diagnostic:p.unknown().optional(),status:p.string().optional()};async function kn(e,t,n){let r=new j(e,t);try{let i=n.project_id?[n.project_id]:await ns(r),s=[];for(let a of i){let c=await r.searchMetrics({projectId:a,dirId:n.dir_id,keyword:n.keyword,status:n.status,subTypes:n.sub_types,orderBy:n.order_by});if(s.push(...rs(c)),s.length>=n.limit)break}let o=Es(s.map(Fe),"metric_id").slice(0,n.limit);return C({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 An(e,t,n){let r=new j(e,t);try{try{let i=await r.listMetricFullTree({projectId:n.project_id,keyword:n.keyword});return C({summary:{source:"full-tree"},tree:ss(i),raw:n.raw?i:void 0})}catch(i){let s=n.project_id?[{id:n.project_id}]:await Dn(r),o=[];for(let a of s){let c=d(a.id);if(!c)continue;let u=await r.listMetricDirectoryTree(c);o.push({id:c,name:d(a.name)||c,type:"project",project_id:c,children:os(u,c)})}return C({summary:{source:"directory-fallback",fallback_reason:i instanceof Error?i.message:String(i)},tree:o})}}catch(i){return $(i,"list_metric_catalog")}}async function vn(e,t,n){let r=new j(e,t);try{let i=await r.getMetricDetail(n.metric_id),s=as(i),o,a;if(!n.brief){let c=d(i.uniformResourceType)||"METRIC_PLATFORM_METRIC";try{o=cs(await r.getMetricLineage(n.metric_id,c))}catch(u){a=u instanceof G?u.detail:String(u)}}return C({detail:{...s,lineage:o,lineage_error:a},raw:n.raw?i:void 0})}catch(i){return $(i,"get_metric_detail")}}async function xn(e,t,n){let r=new j(e,t);try{let i=await r.getMetricDetail(n.metric_id);if(!n.advanced_calc){let a=gn(i,n);if("unsupported"in a)return M("query_metric_data",a.unsupported);let c=async m=>{let _=await r.getCardEditSession(a.cardId),y=d(_.sessionId);if(!y)throw new Error("\u6307\u6807\u5361\u7247\u9884\u89C8\u4F1A\u8BDD\u54CD\u5E94\u7F3A\u5C11 sessionId\u3002");return a.dimensions.length&&await us(r,a.cardId,y,a.dimensions),{raw:await r.queryCardEditData(a.cardId,y,m),sessionId:y}};if(n.combine_type==="OR"&&(n.filters?.length??0)>1){let m=[],_=[];for(let y of n.filters??[]){let I=gn(i,{...n,combine_type:"AND",filters:[y]});if("unsupported"in I)return M("query_metric_data",I.unsupported);let{raw:O}=await c(I.body);_.push(O),m.push(...hn(O))}return he(i,m,n,{mode:"metric_card_preview_data",card_id:a.cardId,card_kind:a.cardKind,combine_type:"OR",query_count:_.length},n.raw?_:void 0)}let{raw:u,sessionId:l}=await c(a.body);return he(i,hn(u),n,{mode:"metric_card_preview_data",card_id:a.cardId,card_kind:a.cardKind,session_id:l,request_body:a.body},n.raw?u:void 0)}let s=fn(i,n);if("unsupported"in s)return M("query_metric_data",s.unsupported);if(n.combine_type==="OR"&&(n.filters?.length??0)>1){let a=[],c=[];for(let u of n.filters??[]){let l=fn(i,{...n,combine_type:"AND",filters:[u]});if("unsupported"in l)return M("query_metric_data",l.unsupported);let m=await r.queryMetricData(l.input);c.push(m),a.push(...ee(m))}return he(i,a,n,{mode:"metric_data_v2",combine_type:"OR",query_count:c.length},n.raw?c:void 0)}let o=await r.queryMetricData(s.input);return he(i,ee(o),n,{mode:"metric_data_v2",request_body:s.input},n.raw?o:void 0)}catch(i){return Rs(i)?M("query_metric_data",{capability:"metric_data_v2_unavailable",message:"\u5F53\u524D BI \u73AF\u5883\u672A\u63D0\u4F9B /api/metric-platform/metric-data/v2\uFF0C\u65E0\u6CD5\u6267\u884C\u9AD8\u7EA7\u8BA1\u7B97\u67E5\u8BE2\u3002",diagnostic:i.detail}):$(i,"query_metric_data")}}async function Mn(e,t,n){let r=new j(e,t);try{let i=await r.searchMetricTrees({keyword:n.keyword,projectId:n.project_id,parentDirId:n.parent_dir_id,orderBy:n.order_by}),s=is(i).map(Gn).slice(0,n.limit);return C({summary:{keyword:n.keyword,count:s.length},items:s})}catch(i){return $(i,"search_metric_trees")}}async function Pn(e,t,n){let r=new j(e,t);try{let i=await r.getMetricTreeDetail(n.metric_tree_id);return C({detail:hs(i),raw:n.raw?i:void 0})}catch(i){return $(i,"get_metric_tree_detail")}}async function jn(e,t,n){let r=new j(e,t);try{if(n.target==="dimension"&&!n.dimension&&!n.dimension_fd_id)return M("query_metric_tree_attribution",{capability:"dimension_attribution_requires_dimension",message:"target=dimension \u65F6\u5FC5\u987B\u6307\u5B9A dimension \u6216 dimension_fd_id\u3002"});let i=await r.getMetricTreeDetail(n.metric_tree_id),s=d(i.metricId);if(!s)return M("query_metric_tree_attribution",{capability:"missing_root_metric",message:"\u6307\u6807\u6811\u8BE6\u60C5\u7F3A\u5C11\u6839\u6307\u6807 ID\uFF0C\u65E0\u6CD5\u6267\u884C\u5F52\u56E0\u3002"});let o=await r.getMetricDetail(s),a=te(o),c=We(n.filters??[],a);if("unsupported"in c)return M("query_metric_tree_attribution",c.unsupported);let u=c.filters,l=_s(i,n);if("unsupported"in l)return M("query_metric_tree_attribution",l.unsupported);if(n.target==="metric"){let I=bs(i,l.value,u),O=await r.queryMetricTreeDecompose(n.metric_tree_id,I);return He(i,"metric",ys(O),n,n.raw?O:void 0)}if(n.target==="dimension"){let I=Q(a,n.dimension,n.dimension_fd_id);if(!I)return M("query_metric_tree_attribution",{capability:"unknown_dimension",message:`\u7EF4\u5EA6\u4E0D\u5B58\u5728\u6216\u4E0D\u9002\u7528\u4E8E\u6839\u6307\u6807\uFF1A${n.dimension??n.dimension_fd_id}`});let O=bn(i,I,l.value,u,n.limit,n.sort),v=await r.queryMetricTreeDrill(n.metric_tree_id,O);return He(i,"dimension",yn(v,d(I.name)),n,n.raw?v:void 0)}let m=Is(i,a,n.scan_dimensions,n.exclude_dimensions);if(!m.length)return M("query_metric_tree_attribution",{capability:"no_scan_dimensions",message:"\u6CA1\u6709\u53EF\u626B\u63CF\u7EF4\u5EA6\uFF0C\u8BF7\u6307\u5B9A scan_dimensions \u6216\u68C0\u67E5\u6307\u6807\u6811\u7EF4\u5EA6\u62C6\u89E3\u914D\u7F6E\u3002"});let _=[],y=[];for(let I of m){let O=bn(i,I,l.value,u,n.group_limit,n.sort),v=await r.queryMetricTreeDrill(n.metric_tree_id,O);y.push({dimension:d(I.name),raw:v}),_.push(...yn(v,d(I.name)).slice(0,n.group_limit))}return He(i,"scan",_,n,n.raw?y:void 0,{scanned_dimensions:m.map(I=>d(I.name))})}catch(i){return $(i,"query_metric_tree_attribution")}}async function ns(e){return(await Dn(e)).map(t=>d(t.id)).filter(Boolean)}async function Dn(e){return S(await e.listProjects()).map(g).filter(Boolean)}function rs(e){let t=g(e);return S(t.contents??t.items??t.data)}function is(e){let t=g(e);return S(t.data??t.contents??t.items)}function Fe(e){return h({metric_id:d(e.id),name:d(e.name),project_id:d(e.projectId),dir_id:w(e.parentDirId,e.dirId),status:d(e.status),sub_type:d(e.subType),description:d(e.desc),dataset:$n(e.dsInfo),statistics:e.statisticsData,creator:be(e.creator),business_owner:be(e.businessOwner),updated_at:d(e.utime),raw:e})}function ss(e){return S(e).map(t=>Nn(t,void 0))}function Nn(e,t){let n=!!e.isMetric,r=d(e.id),i=!t&&!n?r:t;return h({id:r,name:d(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:d(e.parentId),children:S(e.children).map(s=>Nn(s,i))})}function os(e,t){let n=g(e);return d(n.id)?[Ve(n,t)]:S(n.contents??n.children).map(r=>Ve(r,t))}function Ve(e,t){return h({id:d(e.id),name:d(e.name),type:"directory",project_id:t,dir_id:d(e.id),parent_id:w(e.parentDirId,e.parentId),can_use:k(e.canUse),can_manage:k(e.canManage),metric_count:In(e.metricCnt),all_metric_count:In(e.allMetricCnt),children:S(e.contents??e.children).map(n=>Ve(n,t))})}function as(e){return h({metric_id:d(e.id),name:d(e.name),english_name:d(e.engName),status:d(e.status),sub_type:d(e.subType),description:d(e.desc),project_id:d(e.projectId),project_name:d(e.projectName),dir_id:w(e.parentDirId,e.dirId),dir_path:Fn(e.dirPath),dataset:$n(e.dsInfo),source_fields:S(e.fdInfos).map(_e),aggregation:w(e.aggrType,e.aggregationType),formula:w(e.formula,e.expression),derive_setting:e.deriveSetting,format:e.format,applicable_dimensions:te(e),time_dimension:g(e.timeDim)?_e(g(e.timeDim)):void 0,business_attributes:S(e.bizAttrs).map(Os),business_owner:be(e.businessOwner),creator:be(e.creator),referenced_metrics:S(e.referencedMetrics).map(Fe),base_metric:g(e.baseMetric)?Fe(g(e.baseMetric)):void 0,linked_metric_id:d(e.linkMetricId),statistics:e.statisticsData,permissions:h({can_use:k(e.canUse),can_manage:k(e.canManage)}),created_at:d(e.ctime),updated_at:d(e.utime),has_draft:k(e.hasDraft)})}function cs(e){let t=g(e);return h({current:t.crtNode,upstream:t.backwardAtlas,downstream:t.forwardAtlas})}function fn(e,t){let n=d(e.name),r=d(e.projectId);if(!n||!r)return{unsupported:{capability:"metric_detail_incomplete",message:"\u6307\u6807\u8BE6\u60C5\u7F3A\u5C11 name \u6216 projectId\u3002"}};let i=te(e),s=[...i,...Jn(e)],o=[];for(let l of t.dimensions??[]){let m=Q(i,l);if(!m)return{unsupported:{capability:"unsupported_dimension",parameter:l,supported_dimensions:i}};o.push(Ts(m))}let a=ls(e,i,t.advanced_calc);if("unsupported"in a)return{unsupported:a.unsupported};let c=We(t.filters??[],s);if("unsupported"in c)return{unsupported:c.unsupported};let u=Un(t.sort??[],s);return"unsupported"in u?{unsupported:u.unsupported}:{input:{projectId:r,metricId:t.metric_id,metricName:n,metricItems:[h({name:n,alias:ps(n,t.advanced_calc),advCalc:a.value})],dimensions:o,filters:c.filters,sorting:u.sorting,limit:t.limit}}}function gn(e,t){let n=g(e.metricChartConfig),r=d(n.metricChartCdId),i=d(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=[...te(e),...Jn(e)],a=[];for(let _ of t.dimensions??[]){let y=Q(o,_);if(!y||d(y.meta_type).toUpperCase()==="METRIC")return{unsupported:{capability:"unsupported_dimension",parameter:_,supported_dimensions:te(e)}};a.push(Cs(y))}let c=We(t.filters??[],o);if("unsupported"in c)return{unsupported:c.unsupported};let u=c.filters,l=Un(t.sort??[],o);if("unsupported"in l)return{unsupported:l.unsupported};let m=l.sorting;return{cardId:s,cardKind:r?"chart":"value",dimensions:a,body:h({limit:t.limit,filters:u.length?u:void 0,combineType:t.filters?.length?t.combine_type:void 0,sorting:m.length?m:void 0})}}async function us(e,t,n,r){let i=Vn(await e.getCardEditMeta(t))??{},s=ds(i);s.row=r,s.sorting=[],await e.modifyCardEditMeta(t,n,i)}function ds(e){let t=g(e.content),n=g(t.meta),r=g(n.chartMain),i=g(r.zoneData);if(!Object.keys(i).length)throw new Error("\u6307\u6807\u5361\u7247\u7F16\u8F91\u914D\u7F6E\u7F3A\u5C11 content.meta.chartMain.zoneData\u3002");return t.meta=n,n.chartMain=r,r.zoneData=i,e.content=t,i}function ls(e,t,n){if(!n)return{value:void 0};let r=g(e.timeDim),i=d(r?.fdId);if(["compare","last"].includes(n.type)&&!i)return{unsupported:{capability:"advanced_calc_requires_time_dimension",parameter:n.type}};if(n.type==="compare"){let a=n.compare??"yoy",c={yoy:["YEAR","YEAR"],mom:["MONTH","MONTH"],qoq:["QUARTER","QUARTER"],wow:["WEEK","WEEK"],dod:["DAY","DAY"]},[u,l]=c[a];return{value:{advType:"COMPARATIVE",advValue:{advType:"COMPARATIVE",dateFdId:i,valueType:(n.compare_value??"value").toUpperCase(),offset:1,offsetType:u,granularity:l}}}}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=ms(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?Q(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:d(a?.fd_id)})}}}let o=n.rank_dim?Q(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:d(o?.fd_id),topN:{topType:"CUSTOM_NUMBER",count:n.rank_top??10,calculationType:"COUNT"}})}}}function ps(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 ms(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 We(e,t){let n=[];for(let r of e){let i=Ln(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:fs(r)}))}return{filters:n}}function fs(e){return $e.has(e.operator)?[]:e.values??[]}function Un(e,t){let n=[];for(let r of e){let i=Ln(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 Ln(e,t,n,r){let i=Q(e,t,n),s=r==="filter"?"unsupported_filter_field":"unsupported_sort_field",o=r==="filter"?"\u7B5B\u9009":"\u6392\u5E8F";if(!i)return{unsupported:{capability:s,parameter:t,message:`${o}\u5B57\u6BB5\u65E0\u6CD5\u4ECE\u5F53\u524D\u67E5\u8BE2\u4E0A\u4E0B\u6587\u89E3\u6790\uFF1A${t}`,supported_fields:e.map(_=>h({name:d(_.name),fd_id:d(_.fd_id),meta_type:d(_.meta_type)}))}};let a=d(i.name),c=d(i.fd_id),u=d(i.fd_type),l=d(i.meta_type).toUpperCase(),m=[a?void 0:"name",c?void 0:"fdId",u?void 0:"fdType",l?void 0:"metaType"].filter(_=>!!_);return m.length?{unsupported:{capability:s,parameter:t,message:`${o}\u5B57\u6BB5\u7F3A\u5C11\u5FC5\u8981 BI \u5143\u4FE1\u606F\uFF1A${t}`,missing_metadata:m}}:{field:{name:a,fdId:c,fdType:u,metaType:l}}}function he(e,t,n,r,i){let s=ws(t.slice(0,n.limit),n.columns);return C({summary:{metric_id:n.metric_id,metric_name:d(e.name),row_count:s.length,truncated:t.length>s.length},columns:Hn(s),rows:s,diagnostic:r,raw:i})}function ee(e){let t=g(e),n=g(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=>d(g(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((c,u)=>[c,a[u]]))}):s}function hn(e){let t=g(e),n=g(t.data)??t,r=g(n.chartMain??t.chartMain??g(g(t.content).data).chartMain);if(!Object.keys(r).length)return ee(e);let i=g(r.row),s=g(r.column),o=S(i.fields),a=H(i.data),c=H(r.data),u=gs(s),l=o.map(ze).filter(Boolean),m=Ss([...l,...u]),_=Math.max(a.length,c.length),y=[];for(let I=0;I<_;I+=1){let O=[];O.push(...H(a[I]).map(_n)),O.push(...H(c[I]).map(_n)),O.length&&y.push(Object.fromEntries(O.map((v,V)=>[m[V]??`column_${V+1}`,v])))}return y}function gs(e){let n=H(e.data).map((r,i)=>{let s=H(r).map(qn).filter(Boolean).join("/");return s||ze(S(e.fields)[i])||`metric_${i+1}`}).filter(Boolean);return n.length?n:S(e.fields).map(ze).filter(Boolean)}function ze(e){return w(e.alias,e.title,e.originTitle,e.name,e.fdId,e.id)??""}function qn(e){let t=g(e);return Object.keys(t).length?w(t.title,t.name,t.originTitle,t.alias,t.v,t.value)??"":d(e)}function _n(e){let t=g(e);return Object.keys(t).length?"v"in t?t.v:"value"in t?t.value:qn(e):e}function Gn(e){return h({metric_tree_id:d(e.metricTreeId),name:d(e.metricTreeName),root_metric_id:d(e.metricId),root_metric_name:d(e.metricName),project_id:d(e.projectId),project_name:d(e.projectName),parent_dir_id:d(e.parentDirId),dir_path:Fn(e.dirPath),creator_id:d(e.creatorId),creator_name:d(e.creatorName),can_use:k(e.canUse),can_manage:k(e.canManage),updated_at:d(e.utime)})}function hs(e){let t=g(e.config)??{};return h({...Gn(e),dom_id:d(e.domId),created_at:d(e.ctime),time_comparison:t.timeComparisonSetting,comparison_enabled:k(t.comparisonEnabled),contribution_calc_enabled:k(t.contributionCalcEnabled),dimension_decomposition:t.dimensionDecompositionContent,metric_decomposition:t.metricDecompositionContent,permissions:h({can_use:k(e.canUse),can_manage:k(e.canManage)})})}function _s(e,t){let n=g(e.config)??{},r=t.time_comparison_json??Vn(g(n.timeComparisonSetting)),i=k(n.comparisonEnabled)??!!r,s=k(n.contributionCalcEnabled)??!1;if(t.period||t.last_period){if(!t.period||!t.last_period)return{unsupported:{capability:"period_requires_last_period",message:"period \u548C last_period \u9700\u8981\u540C\u65F6\u6307\u5B9A\u3002"}};r=r??{};let o=g(r.advValue)??{};r.advValue=o,o.window={period:[t.period],withMacro:!1};let a=Bs(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 bs(e,t,n){let r=g(e.config)??{},i=g(r.metricDecompositionContent)??{};return h({timeComparisonSetting:t.setting,comparisonEnabled:t.comparisonEnabled,contributionCalcEnabled:!1,metricDecomposeInfo:{metricRelationTree:i.metricRelationTree,filters:n}})}function bn(e,t,n,r,i,s){return h({timeComparisonSetting:n.setting,comparisonEnabled:n.comparisonEnabled,contributionCalcEnabled:n.contributionEnabled,drillInfo:{dimensionFdId:d(t.fd_id),drillFilters:r,nodeNum:i,orderBy:s==="asc"?"contributionAsc":"contributionDesc"}})}function ys(e){return ee(e).map(t=>h({child_metric:d(g(t.metricInfo)?.name),child_metric_id:d(g(t.metricInfo)?.metricId),current_value:t.currentValue,comparison_value:t.comparisonValue,change_value:t.changeValue,change_rate:t.changeRate,contribution_value:t.contributionValue,contribution_rate:t.contributionRate}))}function yn(e,t){return ee(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 He(e,t,n,r,i,s){let o=t==="scan"?n:n.slice(0,r.limit);return C({summary:{metric_tree_id:r.metric_tree_id,metric_tree_name:d(e.metricTreeName),root_metric_id:d(e.metricId),root_metric_name:d(e.metricName),target:t,row_count:o.length,...s},columns:Hn(o),rows:o,raw:i})}function Is(e,t,n,r){let i=new Set((n??[]).map(u=>u.trim()).filter(Boolean)),s=new Set((r??[]).map(u=>u.trim()).filter(Boolean)),o=new Map(t.map(u=>[d(u.name),u])),a=new Map(t.map(u=>[d(u.fd_id),u])),c=i.size?[...i].map(u=>o.get(u)).filter(u=>!!u):[];if(!c.length){let u=g(e.config)??{},l=g(u.dimensionDecompositionContent)??{};c=H(l.decomposableDimensionIds).map(m=>a.get(String(m))).filter(m=>!!m)}return c.length||(c=t),c.filter(u=>!s.has(d(u.name)))}function te(e){let t=new Set,n=[],r=i=>{if(!i)return;let s=d(i.fdId),o=d(i.name),a=s||o;if(!(!a||t.has(a))){t.add(a),n.push(_e(i));for(let c of S(i.subs))r(c)}};for(let i of S(e.applicableDims))r(i);return r(g(e.timeDim)),n}function Jn(e){let t=S(e.fdInfos).map(_e);return d(e.name)&&!t.some(n=>d(n.name)===d(e.name))&&t.push(h({id:w(e.id,e.name),fd_id:d(e.id),name:d(e.name),fd_type:w(t[0]?.fd_type,"DOUBLE"),meta_type:"METRIC"})),t}function _e(e){return h({id:w(e.id,e.fdId),fd_id:d(e.fdId),name:d(e.name),fd_type:d(e.fdType),meta_type:d(e.metaType),ds_id:d(e.dsId),granularity:d(e.granularity)})}function Q(e,t,n){let r=(n??t)?.trim();if(r)return e.find(i=>[i.fd_id,i.id,i.name].map(d).includes(r))}function Ts(e){return h({name:d(e.name),alias:d(e.name),fdType:w(e.fd_type),metaType:"DIM",key:w(e.fd_id,e.id,e.name),fdId:w(e.fd_id),dsId:w(e.ds_id),granularity:w(e.granularity)})}function Cs(e){return h({name:d(e.name),alias:w(e.name),fdType:w(e.fd_type),metaType:"DIM",key:w(e.fd_id,e.id,e.name),fdId:w(e.fd_id),dsId:w(e.ds_id),granularity:w(e.granularity)})}function ws(e,t){return t?.length?e.map(n=>Object.fromEntries(t.map(r=>[r,n[r]]))):e}function Hn(e){return[...new Set(e.flatMap(t=>Object.keys(t)))]}function Ss(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 Bs(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 $n(e){let t=g(e);if(t)return h({dataset_id:d(t.dsId),name:d(t.name)})}function be(e){let t=g(e);if(t)return h({user_id:w(t.uId,t.id),name:d(t.name),deleted:k(t.isDel)})}function Os(e){return h({id:d(e.id),name:d(e.name),type:d(e.valueType),values:S(e.values)})}function Fn(e){return S(e).map(t=>d(t.dirName??t.name)).filter(Boolean)}function M(e,t){return C({status:"unsupported",diagnostic:{tool:e,...t}})}function $(e,t){return e instanceof G?q({operation:t,diagnostic:e.detail}):q({operation:t,message:e instanceof Error?e.message:String(e)})}function Rs(e){return e instanceof G&&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(g).filter(Boolean):[]}function H(e){return Array.isArray(e)?e:[]}function g(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function d(e){return typeof e=="string"?e:e==null?"":String(e)}function w(...e){return e.map(d).find(t=>t.trim())?.trim()}function k(e){return typeof e=="boolean"?e:void 0}function In(e){return typeof e=="number"&&Number.isFinite(e)?e:void 0}function Es(e,t){let n=new Set;return e.filter(r=>{let i=d(r[t]);return!i||n.has(i)?!1:(n.add(i),!0)})}function Vn(e){return e?JSON.parse(JSON.stringify(e)):void 0}function zn(e,t,n,r,i={}){let s=i.usageTelemetry??new de({config:n,appVersion:i.appVersion??"unknown"}),o=(c,u,l)=>{e.registerTool.call(e,c,u,yt(c,l,s))},a=c=>!r.service||r.service.toolList.includes(c);o("get_bi_capabilities",{title:"Get BI Capabilities",description:"\u83B7\u53D6\u5F53\u524D BI \u73AF\u5883\u7248\u672C\u548C MCP \u529F\u80FD\u542F\u7528\u72B6\u6001\u3002",inputSchema:Tt},(c,u)=>t.run(({client:l,config:m})=>Ct(l,m),u,"get_bi_capabilities")),["chatbi_list_themes","chatbi_query","chatbi_insight_start","chatbi_insight_poll"].some(a)&&(o("chatbi_list_themes",{title:"List ChatBI Themes",description:"\u5217\u51FA\u5F53\u524D\u767B\u5F55\u7528\u6237\u53EF\u8BBF\u95EE\u7684 ChatBI \u4E3B\u9898\uFF0C\u53EF\u7B5B\u9009\u6D1E\u5BDF\u4E3B\u9898\u3002",inputSchema:Ht,outputSchema:Lt},(c,u)=>t.run(({config:l})=>zt(l,c),u,"chatbi_list_themes")),o("chatbi_query",{title:"ChatBI Query",description:"\u6267\u884C ChatBI L1 \u540C\u6B65\u95EE\u6570\uFF0C\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:$t,outputSchema:qt},(c,u)=>t.run(({config:l})=>Qt(l,c),u,"chatbi_query")),o("chatbi_insight_start",{title:"Start ChatBI Insight",description:"\u53D1\u8D77 ChatBI L2 \u6D1E\u5BDF\u5206\u6790\u5E76\u5728\u8BF7\u6C42\u53D7\u7406\u540E\u7ACB\u5373\u8FD4\u56DE message_id\uFF0C\u4E0D\u7B49\u5F85\u6700\u7EC8\u62A5\u544A\uFF0C\u4E5F\u4E0D\u8FD4\u56DE final_result\u3002\u6D1E\u5BDF\u901A\u5E38\u8017\u65F6 2-3 \u5206\u949F\uFF0C5 \u5206\u949F\u89C6\u4E3A\u8D85\u65F6\uFF1B\u540C\u4E00\u95EE\u9898\u53EA\u8C03\u7528\u4E00\u6B21\uFF0C\u540E\u7EED\u4F7F\u7528 chatbi_insight_poll \u67E5\u8BE2\u7ED3\u679C\u3002",inputSchema:Ft,outputSchema:Gt},(c,u)=>t.run(({config:l})=>Wt(l,c),u,"chatbi_insight_start")),o("chatbi_insight_poll",{title:"Poll ChatBI Insight",description:"\u67E5\u8BE2 ChatBI L2 \u6D1E\u5BDF\u4EFB\u52A1\u72B6\u6001\u548C\u6700\u7EC8\u62A5\u544A\u3002status=success \u65F6\u6700\u7EC8\u5C55\u793A\u5185\u5BB9\u8BFB\u53D6 structuredContent.final_result.content\uFF1Banswer \u4E3A\u540E\u7AEF\u539F\u59CB\u7B54\u6848\u3002\u4F7F\u7528 chatbi_insight_start \u8FD4\u56DE\u7684 theme_id \u548C message_id\uFF1B\u4E0D\u8981\u9AD8\u9891\u8C03\u7528\uFF0C\u5EFA\u8BAE\u81F3\u5C11\u95F4\u9694 10 \u79D2\uFF0C\u6D1E\u5BDF\u901A\u5E38\u8017\u65F6 2-3 \u5206\u949F\uFF0C5 \u5206\u949F\u540E\u505C\u6B62\u7B49\u5F85\u3002",inputSchema:Vt,outputSchema:Jt},(c,u)=>t.run(({config:l})=>Kt(l,c),u,"chatbi_insight_poll"))),r.ok&&(a("global_search")&&o("global_search",{title:"Global Search",description:"\u641C\u7D22 BI \u4E2D\u7684\u5361\u7247\u3001\u4EEA\u8868\u677F\u3001\u6570\u636E\u96C6\u548C ETL \u8D44\u6E90\u3002",inputSchema:ln},(c,u)=>t.run(({client:l})=>pn(l,c),u,"global_search")),a("search_metrics")&&o("search_metrics",{title:"Search Metrics",description:"\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",inputSchema:Cn,outputSchema:L},(c,u)=>t.run(({client:l,config:m})=>kn(l,m,c),u,"search_metrics")),a("list_metric_catalog")&&o("list_metric_catalog",{title:"List Metric Catalog",description:"\u6D4F\u89C8\u6307\u6807\u4E3B\u9898\u3001\u76EE\u5F55\u548C\u6307\u6807\u8282\u70B9\uFF0C\u9002\u5408\u4E0D\u77E5\u9053\u5173\u952E\u8BCD\u65F6\u53D1\u73B0\u53EF\u7528\u6307\u6807\u3002",inputSchema:wn,outputSchema:L},(c,u)=>t.run(({client:l,config:m})=>An(l,m,c),u,"list_metric_catalog")),a("get_metric_detail")&&o("get_metric_detail",{title:"Get Metric Detail",description:"\u83B7\u53D6\u6307\u6807\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",inputSchema:Sn,outputSchema:L},(c,u)=>t.run(({client:l,config:m})=>vn(l,m,c),u,"get_metric_detail")),a("query_metric_data")&&o("query_metric_data",{title:"Query Metric Data",description:"\u5B89\u5168\u67E5\u8BE2\u6307\u6807\u6570\u636E\uFF1B\u666E\u901A/\u7EF4\u5EA6\u67E5\u8BE2\u8BFB\u53D6\u6307\u6807\u5361\u9884\u89C8\u6570\u636E\uFF0C\u7EF4\u5EA6\u67E5\u8BE2\u53EA\u4FEE\u6539\u4E34\u65F6 session\uFF0C\u4E0D\u8C03\u7528 save\u3001update\u3001delete\u3001publish \u7C7B\u6301\u4E45\u5316\u8DEF\u5F84\u3002",inputSchema:Bn,outputSchema:L},(c,u)=>t.run(({client:l,config:m})=>xn(l,m,c),u,"query_metric_data")),a("search_metric_trees")&&o("search_metric_trees",{title:"Search Metric Trees",description:"\u641C\u7D22\u6307\u6807\u6811\u8D44\u6E90\uFF0C\u8FD4\u56DE\u53EF\u7528\u4E8E\u5F52\u56E0\u5206\u6790\u7684 metric_tree_id\u3002",inputSchema:On,outputSchema:L},(c,u)=>t.run(({client:l,config:m})=>Mn(l,m,c),u,"search_metric_trees")),a("get_metric_tree_detail")&&o("get_metric_tree_detail",{title:"Get Metric Tree Detail",description:"\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",inputSchema:Rn,outputSchema:L},(c,u)=>t.run(({client:l,config:m})=>Pn(l,m,c),u,"get_metric_tree_detail")),a("query_metric_tree_attribution")&&o("query_metric_tree_attribution",{title:"Query Metric Tree Attribution",description:"\u57FA\u4E8E\u6307\u6807\u6811\u6267\u884C\u6307\u6807\u62C6\u89E3\u3001\u5355\u7EF4\u62C6\u89E3\u6216\u5168\u7EF4\u626B\u63CF\u5F52\u56E0\u5206\u6790\u3002",inputSchema:En,outputSchema:L},(c,u)=>t.run(({client:l,config:m})=>jn(l,m,c),u,"query_metric_tree_attribution")),a("execute_sql_query")&&o("execute_sql_query",{title:"Execute SQL Query",description:`\u57FA\u4E8E\u5355\u4E2A\u6570\u636E\u96C6\u6267\u884C\u7B80\u5355\u67E5\u8BE2 SQL\u3002\u4EC5\u652F\u6301\u5355\u8868\u67E5\u8BE2\u548C\u67E5\u8BE2\u8BED\u53E5\uFF0C\u9002\u5408\u5C11\u91CF\u7ED3\u679C\u9884\u89C8\u6216\u8F7B\u91CF\u5206\u6790\uFF0C\u4E0D\u9002\u5408\u62C9\u53D6\u5168\u91CF\u6570\u636E\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},(c,u)=>t.run(({client:l,config:m})=>dn(l,m,c),u,"execute_sql_query")),a("get_dataset_detail")&&o("get_dataset_detail",{title:"Get Dataset Detail",description:"\u83B7\u53D6\u6570\u636E\u96C6\u7684\u57FA\u7840\u4FE1\u606F\u3001\u5B57\u6BB5\u7ED3\u6784\u548C\u76F8\u5173\u914D\u7F6E\u3002",inputSchema:nn},(c,u)=>t.run(({client:l})=>on(l,c),u,"get_dataset_detail")),a("get_card_info")&&o("get_card_info",{title:"Get Card Info",description:"\u83B7\u53D6\u5361\u7247\u7684\u57FA\u7840\u4FE1\u606F\u3001\u56FE\u8868\u7C7B\u578B\u3001\u6570\u636E\u6765\u6E90\u548C\u914D\u7F6E\u3002",inputSchema:rn},(c,u)=>t.run(({client:l})=>an(l,c),u,"get_card_info")),a("query_card_data")&&o("query_card_data",{title:"Query Card Data",description:"\u5B89\u5168\u53EA\u8BFB\u67E5\u8BE2 BI \u5361\u7247\u9884\u89C8\u6570\u636E\uFF0C\u8FD4\u56DE\u7ED3\u6784\u5316 columns\u3001rows\u3001summary \u548C diagnostic\u3002",inputSchema:Et,outputSchema:kt},(c,u)=>t.run(({client:l})=>At(l,c),u,"query_card_data")),a("get_page_info")&&o("get_page_info",{title:"Get Page Info",description:"\u83B7\u53D6\u9875\u9762/\u4EEA\u8868\u677F\u7684\u57FA\u7840\u4FE1\u606F\u3001\u5E03\u5C40\u3001\u5361\u7247\u5217\u8868\u548C\u76F8\u5173\u914D\u7F6E\u3002",inputSchema:sn},(c,u)=>t.run(({client:l})=>cn(l,c),u,"get_page_info")))}var Ds=ks(import.meta.url),Ns=Ds("../package.json"),Ye=class{record(t){console.error(JSON.stringify({runtime:Gs(t)}))}};function Wn(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 Xe(e,r):new Ze(e,r)}async function Kn(e,t={}){let n=t.appVersion??Ns.version,r=t.callerContextResolver??ft(e),i=t.guanBIClientFactory??new ue(e,{clientFactory:t.clientFactory}),s=i.create(await r.resolve()),o=await(t.capabilityResolver??Z)(s.client,s.config),a=new Ms({name:"guanbi-mcp-server",version:n});return zn(a,new le(r,i,new ne),s.config,o,{appVersion:n}),a}var Ze=class{constructor(t,n){this.config=t;this.options=n}config;options;mode="stdio";health(){return{status:"ok",mode:this.mode,boundBISite:{configured:!!this.config.BI_BASE_URL,baseUrl:this.config.BI_BASE_URL,publicPath:this.config.BI_PUBLIC_PATH}}}async start(){await(await Kn(this.config,this.options)).connect(this.options.transportFactory?.()??new Ps)}},Xe=class{constructor(t,n){this.config=t;this.options=n}config;options;mode="streamable-http";httpServer;sessions=new Map;logger=new Ye;health(){return{status:"ok",mode:this.mode,boundBISite:{configured:!!this.config.BI_BASE_URL,baseUrl:this.config.BI_BASE_URL,publicPath:this.config.BI_PUBLIC_PATH}}}async start(){this.httpServer=xs((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:Hs(this.config),entrypointTokenConfigured:!!this.config.MCP_ENTRYPOINT_TOKEN,trustedGateway:ye(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://${qs(t,this.config.MCP_HTTP_HOST??"127.0.0.1")}:${t.port}`}async handleRequest(t,n){let r=Qn(t);if(!r){F(n,400,{error:"bad_request"});return}if(Js(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(!Us(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:ye(this.config.MCP_TRUSTED_GATEWAY)}),F(n,401,{error:"mcp_entrypoint_unauthorized"});return}let i=et(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,...Ke(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,{...Ke(o),sessionCount:this.sessions.size}))}async resolveSession(t){let n=et(t.headers["mcp-session-id"]);if(n){let s=this.sessions.get(n);if(s)return s}let r=new js({sessionIdGenerator:vs,onsessionclosed:async s=>{let o=this.sessions.get(s);this.sessions.delete(s),await o?.server.close(),this.log("info","mcp_session_closed","Closed Streamable HTTP MCP session.",void 0,{...Ke(s),sessionCount:this.sessions.size})}}),i=await Kn(this.config,{...this.options,callerContextResolver:this.options.callerContextResolver??gt(),capabilityResolver:this.options.capabilityResolver??(async()=>pt(this.config))});return await i.connect(r),{server:i,transport:r}}readiness(){let t=Ls(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?Qn(i):void 0;this.logger.record({level:t,event:n,mode:this.mode,message:r,method:i?.method,path:o,...s})}};function Us(e,t){if(ye(t.MCP_TRUSTED_GATEWAY))return!0;let n=t.MCP_ENTRYPOINT_TOKEN;return n?et(e.authorization)?.trim()===`Bearer ${n}`:!1}function et(e){return Array.isArray(e)?e[0]:e}function ye(e){return["1","true","yes","on"].includes(e?.trim().toLowerCase()??"")}function Ls(e){let t=[];return e.BI_BASE_URL||t.push("BI_BASE_URL is required"),!ye(e.MCP_TRUSTED_GATEWAY)&&!e.MCP_ENTRYPOINT_TOKEN&&t.push("MCP_ENTRYPOINT_TOKEN is required unless MCP_TRUSTED_GATEWAY is true"),t}function F(e,t,n){e.headersSent||(e.writeHead(t,{"Content-Type":"application/json"}),e.end(JSON.stringify(n)))}function qs(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 Gs(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}function Qn(e){try{return new URL(e.url??"/",`http://${e.headers.host??"localhost"}`).pathname}catch{return}}function Js(e){return["/healthz","/sysmon/health/liveness","/sysmon/health/readiness"].includes(e)}function Hs(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 Ke(e){return{hasSessionId:!0,sessionIdHash:As("sha256").update(e).digest("hex").slice(0,12)}}async function $s(){let e=nt();await Wn(e).start()}$s().catch(e=>{console.error(e instanceof Error?e.message:e),process.exit(1)});
|
package/package.json
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@guandata/guanbi-mcp-server",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.14",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "MCP server for exposing GuanBI capabilities to AI agents.",
|
|
7
|
+
"license": "UNLICENSED",
|
|
7
8
|
"packageManager": "pnpm@10.30.3",
|
|
9
|
+
"publishConfig": {
|
|
10
|
+
"access": "public",
|
|
11
|
+
"registry": "https://app.mayidata.com/nexus/repository/guandata-web/"
|
|
12
|
+
},
|
|
8
13
|
"bin": {
|
|
9
14
|
"guanbi-mcp-server": "dist/index.js"
|
|
10
15
|
},
|
|
@@ -16,8 +21,10 @@
|
|
|
16
21
|
"dev": "tsx src/index.ts",
|
|
17
22
|
"clean": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"",
|
|
18
23
|
"build": "tsup",
|
|
24
|
+
"prepack": "npm run build",
|
|
19
25
|
"release:mr": "node scripts/release-mr.mjs",
|
|
20
26
|
"release:publish": "node scripts/publish-release.mjs",
|
|
27
|
+
"release:publish:public": "node scripts/publish-public-release.mjs",
|
|
21
28
|
"test": "vitest run",
|
|
22
29
|
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
23
30
|
"start": "node dist/index.js"
|
|
@@ -38,4 +45,4 @@
|
|
|
38
45
|
"engines": {
|
|
39
46
|
"node": ">=20.0.0"
|
|
40
47
|
}
|
|
41
|
-
}
|
|
48
|
+
}
|