@guandata/guanbi-mcp-server 0.1.18 → 0.1.19

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