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