@guandata/guanbi-mcp-server 0.1.20 → 0.1.22

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 CHANGED
@@ -1,9 +1,12 @@
1
- BI_BASE_URL=https://your-bi-host.example.com
1
+ # Defaults to the Kubernetes internal guandata-web service.
2
+ BI_BASE_URL=http://guandata-web:8088
2
3
 
3
4
  # Optional tenant path when BI is mounted below a prefix, for example /guanbi.
4
5
  BI_PUBLIC_PATH=
5
6
 
6
7
  # Prefer token for local MCP usage. If absent, password login is used.
8
+ # Optional local stdio PAT. HTTP mode receives PAT from X-Personal-Token instead.
9
+ BI_PAT=
7
10
  BI_UID_TOKEN=
8
11
 
9
12
  BI_LOGIN_DOMAIN=guanbi
package/README.md CHANGED
@@ -13,7 +13,7 @@
13
13
  "command": "npx",
14
14
  "args": ["-y", "@guandata/guanbi-mcp-server@latest"],
15
15
  "env": {
16
- "BI_BASE_URL": "https://your-bi-host.example.com",
16
+ "BI_BASE_URL": "http://guandata-web:8088",
17
17
  "BI_UID_TOKEN": "your-token"
18
18
  }
19
19
  }
@@ -29,25 +29,30 @@
29
29
 
30
30
  | 变量 | 必填 | 默认值 | 说明 |
31
31
  | --- | --- | --- | --- |
32
- | `BI_BASE_URL` | 是 | - | BI 站点根地址。 |
32
+ | `BI_BASE_URL` | 否 | `http://guandata-web:8088` | BI 站点根地址;默认指向 Kubernetes 集群内的 `guandata-web` 服务,非该部署场景请显式覆盖。 |
33
33
  | `BI_PUBLIC_PATH` | 否 | 空字符串 | BI 部署在子路径时填写,例如 `/guanbi`。 |
34
+ | `BI_CLIENT` | 否 | `mcp` | 临时兼容项,用于复用 PAT 现有 `cli` 逻辑;为空或空字符串时使用 `mcp`,后续会移除。 |
34
35
  | `BI_REQUEST_TIMEOUT_MS` | 否 | `120000` | BI 请求超时时间,单位毫秒。 |
35
36
  | `BI_MAX_ROWS` | 否 | `1000` | `execute_sql_query` 返回行数上限,会作为 `limit` 参数传给 BI 接口;实际限制以 BI 接口能力为准。 |
36
37
  | `BI_DATA_VERSION` | 否 | - | 手工覆盖能力判断使用的 BI 版本,例如 `8.2.0`。 |
37
38
  | `GUANBI_MCP_USAGE_STATS` | 否 | 开启 | 匿名聚合使用统计开关;设置为 `0`、`false`、`off` 或 `no` 可关闭。 |
38
39
  | `MCP_TRANSPORT` | 否 | `stdio` | 运行模式;传 `streamable-http` 启用企业 HTTP 模式。 |
39
40
 
41
+ BI 请求默认发送 `X-Guandata-Client: mcp`。`BI_CLIENT` 是临时兼容项,仅用于复用 PAT 现有 `cli` 逻辑;为空或空字符串时使用 `mcp`,后续会移除。
42
+
40
43
  ### stdio 配置
41
44
 
42
45
  | 变量 | 必填 | 默认值 | 说明 |
43
46
  | --- | --- | --- | --- |
44
- | `BI_UID_TOKEN` | 否 | - | 本地固定调用者登录态 token;配置后优先使用。 |
47
+ | `BI_PAT` | 否 | - | 本地 GuanBI Personal Access Token;仅用于 `stdio` 模式,优先于 `BI_UID_TOKEN` 和账号密码登录。 |
48
+ | `BI_UID_TOKEN` | 否 | - | 本地固定调用者登录态 token;未配置 `BI_PAT` 时优先使用。 |
45
49
  | `BI_LOGIN_DOMAIN` | 否 | `guanbi` | 账号密码登录使用的 domain。 |
46
50
  | `BI_LOGIN_ID` | 否 | - | 登录账号。 |
47
51
  | `BI_LOGIN_PASSWORD` | 否 | - | 登录密码。 |
48
52
 
49
53
  `stdio` 模式访问 BI 需要满足以下任一条件:
50
54
 
55
+ - 配置 `BI_PAT`。
51
56
  - 配置 `BI_UID_TOKEN`。
52
57
  - 同时配置 `BI_LOGIN_DOMAIN`、`BI_LOGIN_ID`、`BI_LOGIN_PASSWORD`。
53
58
 
@@ -57,7 +62,7 @@
57
62
  | --- | --- | --- | --- |
58
63
  | `MCP_HTTP_HOST` | 否 | `127.0.0.1` | HTTP 监听地址。 |
59
64
  | `MCP_HTTP_PORT` | 否 | `9090` | HTTP 监听端口。 |
60
- | `MCP_ENTRYPOINT_TOKEN` | HTTP 模式必填,除非启用可信网关 | - | MCP HTTP 入口 bearer token。 |
65
+ | `MCP_ENTRYPOINT_TOKEN` | Aily / identity exchange 模式必填,除非启用可信网关 | - | MCP HTTP 入口 bearer token;PAT 请求可只携带 `X-Personal-Token`。 |
61
66
  | `MCP_TRUSTED_GATEWAY` | 否 | - | 设为 `true` 时跳过 MCP 入口 token 校验,仅用于可信网关已完成鉴权的部署。 |
62
67
  | `BI_APP_TOKEN` | identity exchange 模式必填 | - | Public API 应用 Token;必须保存在 MCP 服务端 Secret 中。请求中不能携带 app token。 |
63
68
  | `BI_LOGIN_ID_HEADER` | 否 | `x-guanbi-login-id` | 读取 GuanBI loginId 的请求 header 名;设为空字符串可禁用直接 loginId 路径。 |
@@ -66,11 +71,14 @@
66
71
  | `BI_IDENTITY_DEBUG` | 否 | - | 设为 `true` 时,identity exchange 失败会在错误响应和 stderr 日志中输出脱敏 debug 信息;仅建议排查时临时开启。 |
67
72
  | `BI_IDENTITY_TOKEN_CACHE_TTL_MS` | 否 | `600000` | identity exchange 换出的用户 token 进程内短缓存时间。 |
68
73
 
69
- `streamable-http` 模式不使用账号密码登录,也不使用进程级 `BI_UID_TOKEN` 给所有用户代查。HTTP 下有两类用户登录方式:
74
+ HTTP 模式不使用服务端环境变量 `BI_PAT` 作为全局 BI 身份。个人 PAT 需要由请求 header `X-Personal-Token` 传入;该请求不需要 `Authorization`,PAT 优先于请求 token、loginId 和用户属性 identity exchange。未传 PAT 时,HTTP 不使用账号密码登录,也不使用进程级 `BI_UID_TOKEN` 给所有用户代查。HTTP 下有两类用户登录方式:
75
+ PAT 模式仅支持普通 BI 接口,不注册 ChatBI tools。
70
76
 
71
77
  1. **请求直传 BI uIdToken**:调用方或网关已经拿到当前用户的 GuanBI `uIdToken`,每次请求带 `X-GuanBI-Uid-Token`。这种方式不需要 `BI_APP_TOKEN`,优先级最高。
72
78
  2. **服务端 identity exchange**:调用方拿不到 `uIdToken`,但能提供可信的 GuanBI `loginId`,或能映射到 BI 用户属性的外部用户 id。MCP 服务端配置 `BI_APP_TOKEN` 后,使用 `BI_LOGIN_ID_HEADER` 或 `BI_USER_PROPERTY_HEADER + BI_USER_PROPERTY_KEY` 换出当前用户 `uIdToken`。
73
79
 
80
+ 请求传 `X-Personal-Token` 时,PAT 优先于上述请求身份。
81
+
74
82
  ## HTTP 模式
75
83
 
76
84
  本地 MCP 客户端使用建议保留默认 `stdio` 模式。如果需要把 MCP server 作为常驻 HTTP 服务部署,可以启用 `streamable-http`:
@@ -80,11 +88,17 @@ MCP_TRANSPORT=streamable-http \
80
88
  MCP_HTTP_HOST=127.0.0.1 \
81
89
  MCP_HTTP_PORT=9090 \
82
90
  MCP_ENTRYPOINT_TOKEN=change-me \
83
- BI_BASE_URL=https://your-bi-host.example.com \
91
+ BI_BASE_URL=http://guandata-web:8088 \
84
92
  npx -y @guandata/guanbi-mcp-server@latest
85
93
  ```
86
94
 
87
- HTTP 入口使用 `POST /mcp`。除非设置 `MCP_TRUSTED_GATEWAY=true` 并由可信网关完成鉴权,否则调用方需要携带 `Authorization: Bearer <mcp_service_token>`。
95
+ HTTP 入口使用 `POST /mcp`。Aily / identity exchange 链路需要携带 `Authorization: Bearer <mcp_service_token>`,除非设置 `MCP_TRUSTED_GATEWAY=true` 并由可信网关完成鉴权;个人 PAT 链路可只携带 `X-Personal-Token`。
96
+
97
+ 个人 PAT 请求示例:
98
+
99
+ ```http
100
+ X-Personal-Token: <personal-access-token>
101
+ ```
88
102
 
89
103
  请求直传 token 模式需要带:
90
104
 
package/dist/index.js CHANGED
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
- import"dotenv/config";import{z as E}from"zod";var _r=E.object({BI_BASE_URL:E.string().url().optional(),BI_PUBLIC_PATH:E.string().optional().default(""),BI_UID_TOKEN:E.string().optional(),BI_LOGIN_DOMAIN:E.string().optional().default("guanbi"),BI_LOGIN_ID:E.string().optional(),BI_LOGIN_PASSWORD:E.string().optional(),BI_APP_TOKEN:E.string().optional(),BI_LOGIN_ID_HEADER:E.string().optional(),BI_USER_PROPERTY_HEADER:E.string().optional(),BI_USER_PROPERTY_KEY:E.string().optional(),BI_IDENTITY_DEBUG:E.string().optional(),BI_IDENTITY_TOKEN_CACHE_TTL_MS:E.coerce.number().int().positive().default(6e5),BI_REQUEST_TIMEOUT_MS:E.coerce.number().int().positive().default(12e4),BI_MAX_ROWS:E.coerce.number().int().positive().default(1e3),BI_DATA_VERSION:E.string().optional(),GUANBI_MCP_USAGE_STATS:E.string().optional(),MCP_TRANSPORT:E.enum(["stdio","streamable-http"]).optional().default("stdio"),MCP_HTTP_HOST:E.string().optional().default("127.0.0.1"),MCP_HTTP_PORT:E.coerce.number().int().nonnegative().optional().default(9090),MCP_ENTRYPOINT_TOKEN:E.string().optional(),MCP_TRUSTED_GATEWAY:E.string().optional()});function _t(e=process.env){let t=_r.parse(e);return{...t,BI_BASE_URL:t.BI_BASE_URL?.replace(/\/+$/,""),BI_PUBLIC_PATH:hr(t.BI_PUBLIC_PATH),BI_UID_TOKEN:t.BI_UID_TOKEN?.trim()||void 0,BI_LOGIN_DOMAIN:t.BI_LOGIN_DOMAIN?.trim()||"guanbi",BI_LOGIN_ID:t.BI_LOGIN_ID?.trim()||void 0,BI_LOGIN_PASSWORD:t.BI_LOGIN_PASSWORD?.trim()||void 0,BI_APP_TOKEN:t.BI_APP_TOKEN?.trim()||void 0,BI_LOGIN_ID_HEADER:t.BI_LOGIN_ID_HEADER===void 0?"x-guanbi-login-id":gt(t.BI_LOGIN_ID_HEADER),BI_USER_PROPERTY_HEADER:gt(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 hr(e){let t=e?.trim().replace(/^\/+|\/+$/g,"")??"";return t?`/${t}`:""}function gt(e){return e?.trim().toLowerCase()||void 0}import{createRequire as io}from"module";import{createHash as so,randomUUID as oo}from"crypto";import{createServer as ao}from"http";import{McpServer as co}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as uo}from"@modelcontextprotocol/sdk/server/stdio.js";import{StreamableHTTPServerTransport as lo}from"@modelcontextprotocol/sdk/server/streamableHttp.js";var oe=class{record(t){console.error(JSON.stringify({audit:yr({...t})}))}},ae=class{record(){}};function Oe(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"?Ir(i):void 0}}function Ir(e){return e instanceof Error?e.name||"Error":typeof e}function yr(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}import{AsyncLocalStorage as br}from"async_hooks";var ce={client:"X-Guandata-Client",clientVersion:"X-Guandata-Client-Version",command:"X-Guandata-Command"},ht=new br;function It(e,t){return ht.run(e,t)}function X(e){e=ht.getStore()??e;let t={},n=e?.client.trim();n&&(t[ce.client]=n);let r=e?.clientVersion?.trim();r&&(t[ce.clientVersion]=r);let i=e?.command?.trim();return i&&(t[ce.command]=i),t}function H(e,t){let n=X(t);if(!Object.keys(n).length)return e;let r=new Set(Object.values(ce).map(i=>i.toLowerCase()));return{...Object.fromEntries(Object.entries(e).filter(([i])=>!r.has(i.toLowerCase()))),...n}}async function ue(e){if(!e.BI_LOGIN_ID||!e.BI_LOGIN_PASSWORD||!e.BI_LOGIN_DOMAIN)throw new Error("\u5BC6\u7801\u767B\u5F55\u9700\u8981\u914D\u7F6E BI_LOGIN_DOMAIN\u3001BI_LOGIN_ID\u3001BI_LOGIN_PASSWORD\u3002");let t=await fetch(Tr(e,"/api/user/sign-in"),{method:"POST",headers:{"Content-Type":"application/json","raw-backend-response":"TRUE",...X(e.BI_REQUEST_METADATA)},body:JSON.stringify({domain:e.BI_LOGIN_DOMAIN,loginId:e.BI_LOGIN_ID,password:Buffer.from(e.BI_LOGIN_PASSWORD,"utf8").toString("base64")}),signal:AbortSignal.timeout(e.BI_REQUEST_TIMEOUT_MS)}),n=await t.text();if(!t.ok)throw new Error(`BI \u767B\u5F55\u5931\u8D25\uFF1AHTTP ${t.status} ${Or(n)}`);let r=Cr(t,n);if(!r)throw new Error("BI \u767B\u5F55\u54CD\u5E94\u4E2D\u672A\u627E\u5230 X-Auth-Token/Authorization/uIdToken/authToken/token\u3002");return{token:r}}function Tr(e,t){return`${e.BI_BASE_URL}${e.BI_PUBLIC_PATH}${t}`}function Cr(e,t){let n=Er(e.headers);if(n)return n;let r=Br(t);return r||wr(e.headers)}function Er(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 Br(e){try{let t=JSON.parse(e);return yt(t)??yt(Rr(t.response))}catch{return}}function wr(e){return[...e.getSetCookie?.()??[],...Sr(e.get("set-cookie"))].map(n=>n.trim().match(/(?:^|;\s*)uIdToken=([^;]+)/)?.[1]).find(Boolean)}function Sr(e){return e?e.split(/,(?=\s*[^;,]+=)/):[]}function yt(e){if(e)for(let t of["uIdToken","authToken","token"]){let n=e[t];if(typeof n=="string"&&n)return n}}function Rr(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function Or(e,t=500){return e.length>t?`${e.slice(0,t)}...`:e}var Ar="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?kr(`${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=bt(t,"probe");return{available:!1,lastError:n,failureType:Fr(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:Hr})).themes}async query(t){let n=await this.resolveThemeId(t.themeId,t.themeName,!1),r={attachments:[],theme_id:n,message:t.message,config:Tt({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{zr(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:Ct(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,Ct(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 Yr(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=Tt({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(Lr(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 Vr(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=bt(o,n.operation),!Dr(o,n.retrySafeBaseUrlFallback))throw this.withTriedBaseUrls(o)}}throw this.withTriedBaseUrls(i??new Error("\u65E0\u6CD5\u5B9A\u4F4D ChatBI Public API\u3002"))}withTriedBaseUrls(t){return t instanceof O&&(t.detail.tried_base_urls=this.getTriedBaseUrls(),this.lastError=t.detail),t}operationError(t,n,r){let i=r instanceof Error?r.message:String(r);return new O(i,{operation:t,base_url:this.resolvedBaseUrl,path:n,chatbi_message:i,tried_base_urls:this.getTriedBaseUrls(),detail:i})}async requestToBaseUrlWithAuthRetry(t,n,r){let i=await this.ensureToken(),s={operation:r.operation,baseUrl:t,path:n};try{return await this.requestToBaseUrl(t,n,i,r,s)}catch(o){if(!Ur(o)||!this.canRefreshToken())throw o;let a=await this.refreshToken();return this.requestToBaseUrl(t,n,a,r,{...s,tokenRefreshed:!0})}}async requestToBaseUrl(t,n,r,i,s){let o=i.body===void 0?"GET":"POST",a;try{a=await fetch(`${t}${n}`,{method:o,headers:Pr(r,i,this.config.BI_REQUEST_METADATA),body:i.body===void 0?void 0:JSON.stringify(i.body),signal:AbortSignal.timeout(i.requestTimeoutMs??this.config.BI_REQUEST_TIMEOUT_MS)})}catch(d){throw new O(d instanceof Error?d.message:String(d),{operation:s.operation,base_url:s.baseUrl,path:s.path,token_refreshed:s.tokenRefreshed,detail:d instanceof Error?d.message:String(d)})}let c=await a.text(),u=vr(c,a,s);if(!a.ok||xr(u))throw Mr(u,c,a,s);return this.refreshTokenFromResponse(a,u),u.data}async ensureToken(){return this.token?this.token:(this.loginPromise??=this.signInForToken().finally(()=>{this.loginPromise=void 0}),this.loginPromise)}async refreshToken(){return this.refreshPromise??=this.refreshTokenOnce().finally(()=>{this.refreshPromise=void 0}),this.refreshPromise}async refreshTokenOnce(){if(this.config.BI_UID_TOKEN_REFRESH){let t=await this.config.BI_UID_TOKEN_REFRESH();return this.token=t,t}return this.signInForToken()}async signInForToken(){this.token=void 0;let t=await ue(this.config);return this.token=t.token,t.token}refreshTokenFromResponse(t,n){let r=Jr(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 kr(e){let t=new URL(e),n=[],r=s=>{let o=new URL(t.toString());o.pathname=s,o.search="",o.hash="";let a=o.toString().replace(/\/+$/,"");n.includes(a)||n.push(a)},i=t.pathname.replace(/\/+$/,"");return r("/api/chat/public-api"),i&&r(`${i}/api/chat/public-api`),r(i?`${i}/public-api`:"/public-api"),r("/public-api"),n}function de(e){return e.BI_BASE_URL?e.BI_UID_TOKEN?!0:!!(e.BI_LOGIN_DOMAIN&&e.BI_LOGIN_ID&&e.BI_LOGIN_PASSWORD):!1}function Pr(e,t,n){let r={Cookie:`uIdToken=${e}`,"User-Agent":"guanbi-mcp-server",...X(n)};return t.body!==void 0&&(r["Content-Type"]="application/json"),t.includeDeviceId&&(r["Device-ID"]=Ar),r}function vr(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:wt(e)},{retryableForBaseUrl:!0})}}function xr(e){let t=Et(e);return typeof t=="number"&&![0,200].includes(t)||e.result==="fail"||e.success===!1}function Mr(e,t,n,r){let i=Et(e),s=qr(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:wt(t)},c=Gr(o),u=!c&&jr(n.status,i);return new O(o,a,{authExpired:u,retryableForBaseUrl:c||Nr(n.status,i)})}function Dr(e,t){return!!(t&&e instanceof O&&e.retryableForBaseUrl)}function Ur(e){return e instanceof O&&e.authExpired}function jr(e,t){return e===401||e===403||t===401||t===403||t===5001}function Nr(e,t){return[401,403,404,405].includes(e)||typeof t=="number"&&[401,403,404,405].includes(t)}function Lr(e){return e instanceof O&&e.detail.http_status===200&&e.detail.chatbi_code===404&&e.detail.chatbi_message==="Message not found."}function Et(e){if(typeof e.code=="number")return e.code;let t=le(e.error);return typeof t?.status=="number"?t.status:void 0}function qr(e){if(typeof e.message=="string"&&e.message.trim())return e.message;let t=le(e.error);return typeof t?.message=="string"&&t.message.trim()?t.message:void 0}function Gr(e){return/No static resource/i.test(e)}function le(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function Hr(e,t){let n=le(e);if(!Array.isArray(n?.themes))throw new O("ChatBI list-theme response missing themes",{operation:t.operation,base_url:t.baseUrl,path:t.path,detail:"missing themes"},{retryableForBaseUrl:!0})}function Jr(e,t){let r=[...e.headers.getSetCookie?.()??[],...$r(e.headers.get("set-cookie"))].map(s=>Ae(s.trim().match(/(?:^|;\s*)uIdToken=([^;]+)/)?.[1])).find(Boolean);if(r)return r;let i=Ae(e.headers.get("x-auth-token"));return i||Bt(t)}function $r(e){return e?e.split(/,(?=\s*[^;,]+=)/):[]}function Ae(e){if(typeof e!="string")return;let t=e.trim();return t&&!/\s/.test(t)?t:void 0}function Bt(e){let t=le(e);if(t){for(let n of["uIdToken","authToken"]){let r=Ae(t[n]);if(r)return r}for(let n of["data","response"]){let r=Bt(t[n]);if(r)return r}}}function bt(e,t){return e instanceof O?e.detail:{operation:t,detail:e instanceof Error?e.message:String(e)}}function wt(e,t=1e3){return e.length>t?`${e.slice(0,t)}...`:e}function Fr(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 Vr(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 Tt(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>typeof t<"u"))}function zr(e){if([e.final_status,e.answer_status,e.query_status].some(Kr))throw new Error(`ChatBI query failed: ${Qr(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 Qr(...e){return e.find(t=>typeof t=="string"&&t.trim())?.trim()}function Kr(e){return typeof e=="string"&&e.trim().toLowerCase()==="failure"}function Ct(e){let t=e-Date.now();if(t<=0)throw new Error("Insight request timed out");return t}async function Yr(e,t,n){let r=e-Date.now();if(r<=0)throw new Error(`Insight request timed out after ${n}ms`);await new Promise(i=>setTimeout(i,Math.min(t,r)))}var Z="8.2.0",Pe=["search_metrics","list_metric_catalog","get_metric_detail","query_metric_data","search_metric_trees","get_metric_tree_detail","query_metric_tree_attribution"],Wr=["get_bi_capabilities","global_search",...Pe,"execute_sql_query","get_dataset_detail","get_card_info","query_card_data","get_page_info"],Xr=6e4,ke=new WeakMap;async function te(e,t){let n=ke.get(e);return(!n||n.expiresAt<=Date.now())&&ke.set(e,{expiresAt:Date.now()+Xr,promise:ei(e,t).catch(r=>Zr(r,t))}),ke.get(e).promise}function Ot(e){let t=!e.BI_BASE_URL,n="HTTP \u6A21\u5F0F\u4E0B execute_sql_query \u4F1A\u5728\u8C03\u7528\u65F6\u4F7F\u7528\u5F53\u524D\u7528\u6237 token \u5224\u65AD BI \u7248\u672C/\u80FD\u529B\u3002",r="HTTP \u6A21\u5F0F\u542F\u52A8\u671F\u5C1A\u672A\u89E3\u6790\u8BF7\u6C42\u8C03\u7528\u8005\u3002";return{ok:!t,error:t?"\u914D\u7F6E\u4E0D\u5B8C\u6574\uFF1A\u7F3A\u5C11 BI_BASE_URL\u3002":void 0,versionSource:"api",dataVersion:e.BI_DATA_VERSION,service:xe(e,t?["get_bi_capabilities"]:ve(e)),caller:{ok:!1,error:r,features:{executeSqlQuery:{enabled:!1,minVersion:Z,reason:r}},chatbi:ee(e,r)},features:{executeSqlQuery:{enabled:!t,minVersion:Z,reason:t?"\u914D\u7F6E\u4E0D\u5B8C\u6574\uFF1A\u7F3A\u5C11 BI_BASE_URL\u3002":n}},metricPlatform:{registeredTools:t?[]:Pe,readOnly:!0,lastError:t?"\u914D\u7F6E\u4E0D\u5B8C\u6574\uFF1A\u7F3A\u5C11 BI_BASE_URL\u3002":void 0},chatbi:ee(e,"HTTP \u6A21\u5F0F\u542F\u52A8\u671F\u4E0D\u4F7F\u7528\u67D0\u4E2A\u7528\u6237 token \u63A2\u6D4B ChatBI \u80FD\u529B\u3002")}}async function At(e,t,n){let i=(await te(e,t)).features[n];if(!i.enabled)throw new Error(`\u5F53\u524D BI \u73AF\u5883\u4E0D\u652F\u6301 ${n}\uFF1A${i.reason??"\u80FD\u529B\u672A\u542F\u7528"}`)}function Zr(e,t){let n=e instanceof Error?e.message:String(e);return{ok:!1,error:n,versionSource:"api",features:{executeSqlQuery:{enabled:!1,minVersion:Z,reason:`\u65E0\u6CD5\u786E\u8BA4 BI \u80FD\u529B\uFF1A${n}`}},metricPlatform:{registeredTools:[],readOnly:!0,lastError:n},chatbi:ee(t,n),service:xe(t,ve(t)),caller:{ok:!1,error:n,features:{executeSqlQuery:{enabled:!1,minVersion:Z,reason:`\u65E0\u6CD5\u786E\u8BA4 BI \u80FD\u529B\uFF1A${n}`}},chatbi:ee(t,n)}}}async function ei(e,t){let n=ni(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 ri(e),s=ii(i.capabilityVersion,Z),o=await ti(t);return{ok:!0,appVersion:i.appVersion,dataVersion:i.dataVersion,versionSource:r,service:xe(t,ve(t)),caller:{ok:!0,features:{executeSqlQuery:s},chatbi:o},features:{executeSqlQuery:s},metricPlatform:{registeredTools:Pe,readOnly:!0},chatbi:o}}function ve(e){let t=new Set(Wr);if(de(e)||e.MCP_TRANSPORT==="streamable-http")for(let n of new v(e).getRegisteredTools())t.add(n);return[...t]}function xe(e,t){return{mode:e.MCP_TRANSPORT??"stdio",toolList:t,boundBISite:{configured:!!e.BI_BASE_URL,baseUrl:e.BI_BASE_URL,publicPath:e.BI_PUBLIC_PATH}}}async function ti(e){let t=new v(e);return de(e)?t.probe():ee(e,"\u7F3A\u5C11 BI_BASE_URL \u6216\u9274\u6743\u914D\u7F6E\u3002")}function ee(e,t){return{available:!1,registeredTools:de(e)?new v(e).getRegisteredTools():[],failureType:"unknown",triedBaseUrls:[],lastError:{operation:"probe",chatbi_message:t,detail:t}}}function ni(e){let t=[];if(e.BI_BASE_URL||t.push("\u7F3A\u5C11 BI_BASE_URL"),!e.BI_UID_TOKEN){let n=[["BI_LOGIN_DOMAIN",e.BI_LOGIN_DOMAIN],["BI_LOGIN_ID",e.BI_LOGIN_ID],["BI_LOGIN_PASSWORD",e.BI_LOGIN_PASSWORD]].filter(([,r])=>!r).map(([r])=>r);n.length&&t.push(`\u7F3A\u5C11\u9274\u6743\u914D\u7F6E\uFF1A\u8BF7\u914D\u7F6E BI_UID_TOKEN\uFF0C\u6216\u8865\u5168\u8D26\u53F7\u5BC6\u7801\u767B\u5F55\u914D\u7F6E\uFF08\u7F3A\u5C11 ${n.join("\u3001")}\uFF09`)}return t}async function ri(e){let t=await e.get("/api/server-version"),n=Rt(t.version),r=Rt(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 ii(e,t){let n=St(e),r=St(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=si(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 St(e){let t=e.match(/(\d+)\.(\d+)\.(\d+)/);if(t)return[Number(t[1]),Number(t[2]),Number(t[3])]}function si(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 Rt(e){return typeof e=="string"&&e.trim()?e.trim():void 0}var pe=class{constructor(t){this.config=t}config;cache=new Map;async exchange(t){let n=kt(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=oi(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:H({"Content-Type":"application/json","raw-backend-response":"TRUE"},this.config.BI_REQUEST_METADATA),body:JSON.stringify(s),signal:AbortSignal.timeout(this.config.BI_REQUEST_TIMEOUT_MS)})}catch(p){throw this.debugError(`BI user property lookup request failed: ${p instanceof Error?p.message:String(p)}`,{operation:"userPropertyLookup",request:{method:"POST",url:i,body:s},error:p instanceof Error?p.message:String(p)},[this.config.BI_APP_TOKEN])}let a=await o.text(),c=Pt(a);if(!o.ok||vt(c))throw this.debugError(`BI user property lookup failed: HTTP ${o.status} ${Me(a,[this.config.BI_APP_TOKEN,r,n])}`,{operation:"userPropertyLookup",request:{method:"POST",url:i,body:s},response:{status:o.status,body:a}},[this.config.BI_APP_TOKEN]);let u=c?.response?.list??[],d=c?.response?.total??u.length;if(d!==1||u.length!==1)throw this.debugError(`BI user property lookup must match exactly one user: matched ${d} user(s) for ${r}.`,{operation:"userPropertyLookup",request:{method:"POST",url:i,body:s},response:{status:o.status,total:d,listCount:u.length,matchedLoginIds:u.map(p=>p.loginId).filter(Boolean)}},[this.config.BI_APP_TOKEN]);return kt(u[0]?.loginId??"")}async fetchLoginIdToken(t){if(!this.config.BI_BASE_URL)throw this.debugError("BI_BASE_URL is required for loginId identity exchange.",{operation:"loginIdSignIn",request:{loginId:t}});if(!this.config.BI_APP_TOKEN)throw this.debugError("BI_APP_TOKEN is required for loginId identity exchange.",{operation:"loginIdSignIn",request:{loginId:t}});let n=this.buildUrl("/public-api/user/loginId/sign-in"),r={token:this.config.BI_APP_TOKEN,loginId:t},i;try{i=await fetch(n,{method:"POST",headers:H({"Content-Type":"application/json","raw-backend-response":"TRUE"},this.config.BI_REQUEST_METADATA),body:JSON.stringify(r),signal:AbortSignal.timeout(this.config.BI_REQUEST_TIMEOUT_MS)})}catch(c){throw this.debugError(`BI loginId token exchange request failed: ${c instanceof Error?c.message:String(c)}`,{operation:"loginIdSignIn",request:{method:"POST",url:n,body:r},error:c instanceof Error?c.message:String(c)},[this.config.BI_APP_TOKEN])}let s=await i.text(),o=Pt(s),a=o?.response?.token?.trim();if(!i.ok||vt(o)||!a)throw this.debugError(`BI loginId token exchange failed: HTTP ${i.status} ${Me(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=ai(t);return r?Math.min(n,r):n}debugError(t,n,r=[]){if(!ui(this.config))return new Error(t);let i=De(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 kt(e){let t=e.trim();if(!t)throw new Error("GuanBI loginId is required for loginId identity exchange.");return t}function oi(e){let t=e.trim();if(!t)throw new Error("BI user property value is required for user property identity exchange.");return t}function Pt(e){if(e.trim())try{return JSON.parse(e)}catch{return}}function vt(e){return!e||e.result&&!["ok","success"].includes(e.result.toLowerCase())?!0:e.success===!1}function ai(e){if(!e)return;let t=e.replace(" ","T"),n=Date.parse(t);return Number.isFinite(n)?n:void 0}function Me(e,t){let n=t.filter(r=>!!r).reduce((r,i)=>r.split(i).join("[redacted]"),e);return di(n)}function De(e,t){let n=t.filter(r=>!!r);return typeof e=="string"?Me(e,n):Array.isArray(e)?e.map(r=>De(r,n)):!e||typeof e!="object"?e:Object.fromEntries(Object.entries(e).map(([r,i])=>[r,ci(r)?"[redacted]":De(i,n)]))}function ci(e){return["token","authorization","cookie","uidtoken","uIdToken".toLowerCase()].includes(e.toLowerCase())}function ui(e){return["1","true","yes","on"].includes(e.BI_IDENTITY_DEBUG?.trim().toLowerCase()??"")}function di(e,t=1e3){return e.length>t?`${e.slice(0,t)}\u2026`:e}function li(e){return{transport:"stdio",biUidToken:e.BI_UID_TOKEN,audit:{}}}function Mt(e){return{resolve:()=>li(e)}}function me(e){let t=L(e,"x-guanbi-uid-token")?.trim();if(!t)throw new Error("\u7F3A\u5C11 GuanBI \u7528\u6237\u4EE4\u724C\uFF1A\u8BF7\u901A\u8FC7 X-GuanBI-Uid-Token \u4F20\u5165\u5F53\u524D\u7528\u6237 uIdToken\u3002");return{transport:"streamable-http",biUidToken:t,audit:je(e)}}function Dt(e,t={}){let n=e?new pe(e):void 0,r=t.exchangeLoginId??t.exchange??(n?n.exchange.bind(n):void 0),i=t.exchangeUserProperty??(n?n.exchangeUserProperty.bind(n):void 0);return{resolve:async s=>{if(!s?.requestInfo?.headers)return{transport:"streamable-http",audit:{}};let o=s.requestInfo.headers;if(L(o,"x-guanbi-uid-token")?.trim()||!e)return me(o);let c=e.BI_LOGIN_ID_HEADER,u=c?ne(L(o,c)):void 0;if(u){let g=await r?.(u);return g?{transport:"streamable-http",biUidToken:g.token,biUidTokenRefresh:g.refresh,loginId:u,audit:je(o)}:me(o)}let d=e.BI_USER_PROPERTY_HEADER,p=d?ne(L(o,d)):void 0;if(p){let g=await i?.(p);return g?{transport:"streamable-http",biUidToken:g.token,biUidTokenRefresh:g.refresh,audit:je(o)}:me(o)}throw pi(o,e)}}}function L(e,t){if(e instanceof Headers)return e.get(t)??void 0;let n=e.get;if(typeof n=="function")return n.call(e,t)??void 0;let r=t.toLowerCase();for(let[i,s]of Object.entries(e))if(i.toLowerCase()===r)return Array.isArray(s)?s[0]:s}function ne(e){return e?.trim()||void 0}function je(e){return{tenantId:ne(L(e,"x-tenant-id")),endUserId:ne(L(e,"x-end-user-id")),traceId:ne(L(e,"x-trace-id"))}}function pi(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(!hi(t))return new Error(n);let r={operation:"resolveHttpCallerContext",expectedIdentityHeaders:mi(e,t),receivedHeaderNames:fi(e),receivedIdentityLikeHeaders:xt(Object.fromEntries(Ne(e).filter(([i])=>_i(i.toLowerCase()))),["x-guanbi-uid-token",t.BI_LOGIN_ID_HEADER,t.BI_USER_PROPERTY_HEADER]),receivedHeaders:xt(e,["x-guanbi-uid-token",t.BI_LOGIN_ID_HEADER,t.BI_USER_PROPERTY_HEADER])};return console.error(JSON.stringify({identityExchangeDebug:r})),new Error(`${n}
4
- identity_debug=${JSON.stringify(r,null,2)}`)}function mi(e,t){return[{source:"uidToken",name:"x-guanbi-uid-token",present:Ue(e,"x-guanbi-uid-token")},...t.BI_LOGIN_ID_HEADER?[{source:"loginId",name:t.BI_LOGIN_ID_HEADER,present:Ue(e,t.BI_LOGIN_ID_HEADER)}]:[],...t.BI_USER_PROPERTY_HEADER?[{source:"userProperty",name:t.BI_USER_PROPERTY_HEADER,present:Ue(e,t.BI_USER_PROPERTY_HEADER),userPropertyKey:t.BI_USER_PROPERTY_KEY}]:[]]}function Ue(e,t){return L(e,t)!==void 0}function fi(e){return[...new Set(Ne(e).map(([t])=>t.toLowerCase()))].sort()}function xt(e,t){let n=new Set(t.filter(r=>!!r).map(r=>r.toLowerCase()));return Object.fromEntries(Ne(e).map(([r,i])=>{let s=r.toLowerCase();return gi(s)?[s,"<redacted>"]:[s,n.has(s)?i:"<present>"]}))}function Ne(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 gi(e){return["authorization","cookie","set-cookie","x-guanbi-uid-token"].includes(e)}function _i(e){return e.startsWith("x-")||e.includes("auth")||e.includes("login")||e.includes("token")||e.includes("uid")||e.includes("user")}function hi(e){return["1","true","yes","on"].includes(e.BI_IDENTITY_DEBUG?.trim().toLowerCase()??"")}var fe=class{constructor(t){this.config=t;this.token=t.BI_UID_TOKEN}config;token;async get(t,n){return this.request("GET",t,void 0,n)}async post(t,n,r){return this.request("POST",t,n,r)}async put(t,n,r){return this.request("PUT",t,n,r)}async getText(t){let n=await this.ensureToken(),r=await fetch(this.buildUrl(t),{method:"GET",headers:H({"raw-backend-response":"TRUE",Cookie:`uIdToken=${n}`},this.config.BI_REQUEST_METADATA),signal:AbortSignal.timeout(this.config.BI_REQUEST_TIMEOUT_MS)});if(this.shouldRefreshToken(r)){let s=await this.refreshToken();r=await fetch(this.buildUrl(t),{method:"GET",headers:H({"raw-backend-response":"TRUE",Cookie:`uIdToken=${s}`},this.config.BI_REQUEST_METADATA),signal:AbortSignal.timeout(this.config.BI_REQUEST_TIMEOUT_MS)})}let i=await r.text();if(!r.ok)throw new Error(`BI \u8BF7\u6C42\u5931\u8D25\uFF1AGET ${t} HTTP ${r.status} ${Ut(i)}`);return this.refreshTokenFromResponse(r),i}async request(t,n,r,i){let s=await this.ensureToken(),o=await this.fetchWithToken(t,n,s,r,i);if(this.shouldRefreshToken(o)){let c=await this.refreshToken();o=await this.fetchWithToken(t,n,c,r,i)}let a=await o.text();if(!o.ok)throw new Error(`BI \u8BF7\u6C42\u5931\u8D25\uFF1A${t} ${n} HTTP ${o.status} ${Ut(a)}`);return this.refreshTokenFromResponse(o),Ii(a)}async fetchWithToken(t,n,r,i,s){return fetch(this.buildUrl(n),{method:t,headers:H({"Content-Type":"application/json","raw-backend-response":"TRUE",Cookie:`uIdToken=${r}`,...s?.headers},this.config.BI_REQUEST_METADATA),body:t==="POST"||t==="PUT"?JSON.stringify(i??{}):void 0,signal:AbortSignal.timeout(this.config.BI_REQUEST_TIMEOUT_MS)})}async ensureToken(){if(this.token)return this.token;let t=await ue(this.config);return this.token=t.token,t.token}async refreshToken(){if(this.config.BI_UID_TOKEN_REFRESH){let t=await this.config.BI_UID_TOKEN_REFRESH();return this.token=t,t}return this.token=void 0,this.ensureToken()}refreshTokenFromResponse(t){let n=bi(t);!n||n===this.token||(this.token=n)}shouldRefreshToken(t){return(!!this.config.BI_UID_TOKEN_REFRESH||this.hasPasswordLogin())&&t.status===401}hasPasswordLogin(){return!!(this.config.BI_LOGIN_DOMAIN&&this.config.BI_LOGIN_ID&&this.config.BI_LOGIN_PASSWORD)}buildUrl(t){let n=t.startsWith("/")?t:`/${t}`;return`${this.config.BI_BASE_URL}${this.config.BI_PUBLIC_PATH}${n}`}};function Ii(e){if(!e)return;let t=JSON.parse(e);if(!yi(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 yi(e){return!e||typeof e!="object"||Array.isArray(e)?!1:"response"in e||"result"in e||"success"in e}function bi(e){return Ti(e.headers)??Ei(e.headers)}function Ti(e){return[...e.getSetCookie?.()??[],...Ci(e.get("set-cookie"))].map(n=>jt(n.trim().match(/(?:^|;\s*)uIdToken=([^;]+)/)?.[1])).find(Boolean)}function Ci(e){return e?e.split(/,(?=\s*[^;,]+=)/):[]}function Ei(e){return jt(e.get("x-auth-token"))}function jt(e){if(typeof e!="string")return;let t=e.trim();return t&&!/\s/.test(t)?t:void 0}function Ut(e,t=1e3){return e.length>t?`${e.slice(0,t)}...`:e}var ge=class{constructor(t,n={}){this.baseConfig=t;this.options=n}baseConfig;options;stdioClient;create(t,n){let r=this.resolveRequestMetadata(n);if(t.transport==="stdio"&&this.stdioClient)return{...this.stdioClient,config:{...this.stdioClient.config,BI_REQUEST_METADATA:r}};let i=this.resolveConfig(t,t.transport==="stdio"?this.resolveRequestMetadata(void 0):r),s={client:this.options.clientFactory?.(i)??new fe(i),config:{...i,BI_REQUEST_METADATA:r},context:t};return t.transport==="stdio"&&(this.stdioClient={...s,config:i}),s}resolveConfig(t,n){let r=t.biUidToken??(t.transport==="stdio"?this.baseConfig.BI_UID_TOKEN:void 0);return{...this.baseConfig,BI_UID_TOKEN:r,BI_UID_TOKEN_REFRESH:t.transport==="streamable-http"?t.biUidTokenRefresh:void 0,BI_LOGIN_DOMAIN:t.transport==="stdio"?this.baseConfig.BI_LOGIN_DOMAIN:"",BI_LOGIN_ID:t.transport==="stdio"?this.baseConfig.BI_LOGIN_ID:void 0,BI_LOGIN_PASSWORD:t.transport==="stdio"?this.baseConfig.BI_LOGIN_PASSWORD:void 0,BI_REQUEST_METADATA:n}}resolveRequestMetadata(t){let n=this.options.requestMetadata;if(n)return t?{...n,command:t}:{...n}}};var Nt={endpoint:"https://www.google-analytics.com/mp/collect",measurementId:"G-800H8JWDPP",apiSecret:"poAwpMEhQteDl1rXKtNIqg",eventName:"guanbi_mcp_tool_call",clientId:"0000000000.0000000000",sessionId:1,engagementTimeMsec:1,timeoutMs:3e3,maxResponseBytes:1024},_e=class{serviceDomain;appVersion;enabled;sender;now;constructor({config:t,appVersion:n,sender:r=Si(),now:i=Date.now}){this.serviceDomain=Oi(t.BI_BASE_URL),this.appVersion=n,this.enabled=Ri(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:Ai(this.now()-t.startedAtMs),error_type:n.success?"none":Pi(n.error)};try{Promise.resolve(this.sender(r)).catch(()=>{})}catch{}}};function Bi(e=Nt){return t=>wi(t,e)}async function wi(e,t=Nt){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 ki(i,t.maxResponseBytes)}catch{}}function Si(){return vi(process.env)?()=>{}:Bi()}function Ri(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 Lt(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 Oi(e){if(e)try{return new URL(e).hostname}catch{return}}function Ai(e){return e<1e3?"<1s":e<5e3?"1-5s":e<3e4?"5-30s":e<12e4?"30-120s":">120s"}async function ki(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 Pi(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 vi(e){return e.NODE_ENV==="test"||e.VITEST==="true"}var he=class{constructor(t,n,r=new ae){this.callerContextResolver=t;this.clientFactory=n;this.auditLogger=r}callerContextResolver;clientFactory;auditLogger;async run(t,n,r){let i=Date.now(),s=await this.callerContextResolver.resolve(n),o=this.clientFactory.create(s,r);try{let a=await It(o.config.BI_REQUEST_METADATA,()=>t(o));if(r){let c=xi(a)?"error":"success";this.auditLogger.record(Oe(r,s,i,c,a))}return a}catch(a){throw r&&this.auditLogger.record(Oe(r,s,i,"error",a)),a}}};function xi(e){return!!(e&&typeof e=="object"&&e.isError===!0)}function M(e){return{content:[{type:"text",text:JSON.stringify(e,null,2)}]}}function C(e){let t=qe(e);return{content:[{type:"text",text:JSON.stringify(t,null,2)}],structuredContent:t}}function q(e){let t=qe(e);return{content:[{type:"text",text:JSON.stringify(t,null,2)}],isError:!0}}function Ie(e,t,n={}){return q({status:"error",diagnostic:Le(e,t,n)})}function Le(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 qe({operation:e,path:i?.groups?.path,status:i?.groups?.status?Number(i.groups.status):void 0,message:r,...n})}function qe(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}var qt={};async function Gt(e,t){return M(await te(e,t))}import{z as T}from"zod";var J=class extends Error{constructor(n,r){super(n.message,{cause:r});this.detail=n;this.name="MetricPlatformRequestError"}detail},D=class{constructor(t,n){this.client=t;this.config=n}client;config;contextHeadersPromise;listProjects(){return this.get("listProjects","/api/metric-platform/projects")}searchMetrics(t){let n=h({projectId:t.projectId,dirId:t.dirId,status:t.status,nameLike:t.keyword,subTypes:t.subTypes?.join(","),orderBy:t.orderBy});return this.post("searchMetrics","/api/metric-platform/metrics",n)}listMetricFullTree(t){return this.get("listMetricFullTree",He("/api/metric-platform/metrics/full-tree",{projectId:t.projectId,nameLike:t.keyword}))}listMetricDirectoryTree(t){return this.get("listMetricDirectoryTree",He("/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",He("/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 Ge(t,n,s)}}async get(t,n,r){try{return await this.client.get(n,r?{headers:r}:void 0)}catch(i){throw Ge(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 Ge(t,n,s)}}async metricTreeHeaders(t,n){return{Referer:`${this.config.BI_BASE_URL??""}${this.config.BI_PUBLIC_PATH}/metrics-store/hierarchy/${encodeURIComponent(t)}/edit/${n}`,...await this.contextHeaders()}}async contextHeaders(){return this.contextHeadersPromise||(this.contextHeadersPromise=this.resolveContextHeaders()),this.contextHeadersPromise}async resolveContextHeaders(){let t={};if(this.config.BI_LOGIN_DOMAIN&&(t["x-dom-id"]=K(this.config.BI_LOGIN_DOMAIN)),this.config.BI_LOGIN_ID&&(t["user-id"]=K(this.config.BI_LOGIN_ID)),t["x-dom-id"]&&t["user-id"])return t;try{let n=await this.get("getUserProfile","/api/user/profile"),r=Ht(n.domId,n.domainId,n.domain,n.dom_id),i=Ht(n.email,n.loginId,n.userId,n.uId,n.uid);!t["x-dom-id"]&&r&&(t["x-dom-id"]=K(r)),!t["user-id"]&&i&&(t["user-id"]=K(i))}catch{}return t["x-dom-id"]||(t["x-dom-id"]=K(this.config.BI_LOGIN_DOMAIN||"guanbi")),t["user-id"]||(t["user-id"]=K(this.config.BI_LOGIN_ID||"unknown")),t}};function Ge(e,t,n){let r=n instanceof Error?n.message:String(n),i=r.match(/\bHTTP\s+(\d{3})\b/);return new J({operation:e,path:t,status:i?Number(i[1]):void 0,message:r},n)}function He(e,t){let n=new URLSearchParams;for(let[i,s]of Object.entries(t))s!==void 0&&s!==""&&n.set(i,s);let r=n.toString();return r?`${e}?${r}`:e}function h(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}function K(e){return Buffer.from(e,"utf8").toString("base64")}function Ht(...e){for(let t of e)if(typeof t=="string"&&t.trim())return t.trim()}var Mi=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"]),Jt=new Set(["BT","CLOSE_BT_OPEN","OPEN_BT_CLOSE","OPEN_BT_OPEN"]),$e=new Set(["IS_NULL","NOT_NULL"]),Di=T.object({field:T.string().min(1).describe("\u7B5B\u9009\u5B57\u6BB5\u540D\u79F0\u3001\u522B\u540D\u6216\u5B57\u6BB5 ID\u3002"),operator:Mi.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;$e.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`}),Jt.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`}),!Jt.has(e.operator)&&!$e.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`})}),zt={cd_id:T.string().min(1).describe("\u5361\u7247 ID\u3002"),filters:T.array(Di).optional().describe("\u7ED3\u6784\u5316\u7B5B\u9009\u6761\u4EF6\u3002\u4E0D\u652F\u6301 CLI \u98CE\u683C\u7B5B\u9009\u5B57\u7B26\u4E32\u3002"),columns:T.array(T.string().min(1)).optional().describe("\u5BF9\u5DF2\u5C55\u5E73\u7ED3\u679C\u505A\u672C\u5730\u5217\u88C1\u526A\uFF0C\u4E0D\u53C2\u4E0E BI \u67E5\u8BE2\u8BED\u4E49\u3002"),limit:T.number().int().positive().max(1e4).optional().default(100).describe("\u6700\u591A\u8FD4\u56DE\u884C\u6570\uFF0C\u9ED8\u8BA4 100\uFF0C\u4E0A\u9650 10000\u3002"),raw:T.boolean().optional().describe("\u662F\u5426\u8FD4\u56DE\u539F\u59CB\u54CD\u5E94\u3002")},Qt={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 Kt(e,t){try{let n=t.limit??100,r=await e.get(`/api/card/${encodeURIComponent(t.cd_id)}`),i=Ni(r);if(i==="TEXT")return Ui(t.cd_id,r,t.columns,t.raw);let s=Qi(t.filters??[],Zi(r),i);if("unsupported"in s)return ji("query_card_data",s.unsupported);let o=i==="CHART"?await qi(e,t.cd_id,n,s.filters):await Li(e,Yt(t.cd_id,i,n,s.filters)),{endpoint:a,requestBody:c}=o.requests[0],u=o.data,d=i==="CHART"?Hi(b(u.chartMain)):Vi(u),p=Zt(d.slice(0,n),t.columns);return C({summary:h({cd_id:t.cd_id,card_type:i,chart_type:i==="CHART"?R(b(r.content).chartType):void 0,row_count:p.length,truncated:ts(i,u,p.length)}),columns:en(p),rows:p,diagnostic:{mode:Gi(i),card_type:i,endpoint:a,request_body:c,request_count:o.requests.length,request_bodies:o.requests.length>1?o.requests.map(g=>g.requestBody):void 0,raw_returned:t.raw===!0},raw:t.raw?o.raw:void 0})}catch(n){return q({status:"error",diagnostic:Le("query_card_data",n)})}}function Ui(e,t,n,r){let i=b(t.content),s=zi(i),o=Zt(s?[{content:s}]:[],n);return C({summary:{cd_id:e,card_type:"TEXT",row_count:o.length,truncated:!1},columns:en(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 ji(e,t){return C({status:"unsupported",diagnostic:{tool:e,...t}})}function Ni(e){let t=R(e.cdType).toUpperCase();if(t==="SELECTOR"){let n=R(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 Yt(e,t,n,r,i=0){let s=encodeURIComponent(e);return t==="SELECTOR"?{endpoint:`/api/selector/${s}/data`,requestBody:h({fieldQuery:{offset:0,limit:n},filters:r.length?r:void 0})}:t==="TREE_SELECTOR"?{endpoint:`/api/treeSelector/${s}/data`,requestBody:h({limit:n,filters:r.length?r:void 0})}:{endpoint:`/api/card/${s}/data`,requestBody:h({view:"GRID",isUniversalStructure:!0,offset:i>0?i:void 0,limit:n,filters:r.length?r:void 0})}}async function Li(e,t){let n=await e.post(t.endpoint,t.requestBody);return{raw:n,data:Wt(n),requests:[t]}}async function qi(e,t,n,r){let s=[],o=[],a,c=0,u,d=!1,p=!1;for(;c<n;){let y=Math.min(1e3,n-c),S=Yt(t,"CHART",y,r,c);s.push(S);let P=await e.post(S.endpoint,S.requestBody);o.push(P);let Q=Wt(P),W=b(Q.chartMain);if(!Object.keys(W).length)return{raw:P,data:Q,requests:s};a?Ji(b(a.chartMain),W):a=ns(Q);let Re=$i(W);c+=Re,u=ze(W.count)??u;let ft=Ve(W.hasMoreData);if(p=ft!==void 0,d=ft??!1,Re===0||Re<y||u!==void 0&&c>=u||p&&!d)break}let g=a??{},I=b(g.chartMain);return Object.keys(I).length&&(I.offset=0,I.limit=n,I.hasMoreData=u!==void 0?c<u:d),{raw:o.length>1?{pages:o,merged:g}:o[0],data:g,requests:s}}function Gi(e){return e==="SELECTOR"?"selector_card_data":e==="TREE_SELECTOR"?"tree_selector_card_data":"chart_card_data"}function Wt(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 Hi(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=re(t.fields??t.meta).map(Fe).filter(Boolean),o=Fi(n),a=rs([...s,...o]),c=Math.max(r.length,i.length),u=[];for(let d=0;d<c;d+=1){let p=[];p.push(...k(r[d]).map(Vt)),p.push(...k(i[d]).map(Vt)),p.length&&u.push(Object.fromEntries(p.map((g,I)=>[a[I]??`column_${I+1}`,g])))}return u}function Ji(e,t){Je(e,t,"data");let n=b(e.row),r=b(t.row);Je(n,r,"data"),Je(n,r,"values")}function Je(e,t,n){let r=k(t[n]);r.length&&(e[n]=[...k(e[n]),...r])}function $i(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 Fi(e){let n=k(e.data??e.values).map((r,i)=>{let s=k(r).map(Xt).filter(Boolean).join("/");return s||Fe(re(e.fields??e.meta)[i])||`metric_${i+1}`}).filter(Boolean);return n.length?n:re(e.fields??e.meta).map(Fe).filter(Boolean)}function Vi(e){return re(e.result)}function zi(e){let n=k(b(e.body).blocks).map(r=>R(b(r).text)).filter(r=>r!=="");return n.length?n.join(`
5
- `):R(e.text)}function Qi(e,t,n){let r=[];for(let i of e){let s=Wi(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"?Yi(s.field.metaType):void 0,filterType:i.operator,filterValue:Ki(i)}))}return{filters:r}}function Ki(e){return $e.has(e.operator)?[]:(e.values??[]).map(R)}function Yi(e){return e.toUpperCase()==="METRIC"?"AGGREGATION":"DETAIL"}function Wi(e,t,n){let r=Xi(e,t,n);if(!r)return{unsupported:{capability:"unsupported_filter_field",parameter:t,message:`\u7B5B\u9009\u5B57\u6BB5\u65E0\u6CD5\u4ECE\u5F53\u524D\u5361\u7247\u4E0A\u4E0B\u6587\u89E3\u6790\uFF1A${t}`,supported_fields:e.map(u=>h({name:R(u.name),fd_id:R(u.fd_id),meta_type:R(u.meta_type)}))}};let i=R(r.name),s=R(r.fd_id),o=R(r.fd_type),a=R(r.meta_type).toUpperCase(),c=[i?void 0:"name",s?void 0:"fdId",o?void 0:"fdType",a?void 0:"metaType"].filter(u=>!!u);return c.length?{unsupported:{capability:"unsupported_filter_field",parameter:t,message:`\u7B5B\u9009\u5B57\u6BB5\u7F3A\u5C11\u5FC5\u8981 BI \u5143\u4FE1\u606F\uFF1A${t}`,missing_metadata:c}}:{field:{name:i,fdId:s,fdType:o,metaType:a}}}function Xi(e,t,n){if(n){let i=e.find(s=>R(s.fd_id)===n||R(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(R).includes(r))}function Zi(e){let t=b(e.content),n=[],r=b(b(t.source).field);Object.keys(r).length&&n.push($t(r));let i=b(b(t.meta).chartMain),s=b(i.zoneData);for(let[o,a]of Object.entries(s))n.push(...re(a).map(c=>$t(c,o)));return es(n)}function $t(e,t){return h({name:j(e.name,e.title,e.originTitle,e.alias),alias:j(e.alias,e.title),id:R(e.id),fd_id:j(e.fdId,e.fd_id,e.id),fd_type:j(e.fdType,e.fd_type),meta_type:j(e.metaType,e.meta_type),zone_id:j(e.zoneId,e.zone_id,t)})}function es(e){let t=new Set;return e.filter(n=>{let r=j(n.fd_id,n.id,n.name,n.alias);return!r||t.has(r)?!1:(t.add(r),!0)})}function ts(e,t,n){if(e==="SELECTOR"||e==="TREE_SELECTOR")return Ve(t.exceedLimit)?!0:Ft(t,n);let r=b(t.chartMain);return Ve(r.hasMoreData)?!0:Ft(r,n)}function Ft(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 Fe(e){return j(e.alias,e.title,e.originTitle,e.name,e.fdId,e.id)??""}function Xt(e){let t=b(e);return Object.keys(t).length?j(t.title,t.name,t.originTitle,t.alias,t.v,t.value)??"":R(e)}function Vt(e){let t=b(e);return Object.keys(t).length?"v"in t?t.v:"value"in t?t.value:Xt(e):e}function re(e){return Array.isArray(e)?e.map(b).filter(t=>Object.keys(t).length):[]}function k(e){return Array.isArray(e)?e:[]}function ns(e){return JSON.parse(JSON.stringify(e))}function b(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function R(e){return typeof e=="string"?e:e==null?"":String(e)}function j(...e){return e.map(R).find(t=>t.trim())?.trim()}function Ve(e){return typeof e=="boolean"?e:void 0}function ze(e){return typeof e=="number"&&Number.isFinite(e)?e:void 0}function Zt(e,t){return t?.length?e.map(n=>Object.fromEntries(t.map(r=>[r,n[r]]))):e}function en(e){return[...new Set(e.flatMap(t=>Object.keys(t)))]}function rs(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 is}from"crypto";import{z as f}from"zod";var ss=6e4,$=1e4,tn=10*6e4,ye=new Map,be=new Map,Qe=new Map,Ke=new Map,rn=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")}),sn={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()},on={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:rn.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()},an={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()},cn={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:rn.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()},un={is_insight:f.boolean().optional().describe("\u662F\u5426\u53EA\u5217\u51FA\u6D1E\u5BDF\u4E3B\u9898\u3002")},dn={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")},ln={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")},pn={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 mn(e,t){let n=new v(e);try{let r=await n.listThemes({isInsight:t.is_insight});return C({themes:r,resolved_base_url:n.getResolvedBaseUrl(),tried_base_urls:n.getTriedBaseUrls()})}catch(r){return Ce(n,r,"listThemes")}}async function fn(e,t){let n=new v(e);try{let r=await n.query({themeId:t.theme_id,themeName:t.theme_name,message:t.message,sessionId:t.session_id,externalContext:t.external_context,fastMode:!0});return C({session_id:r.session_id,message_id:r.message_id,answer:r.answer,sql:r.sql,answer_status:r.answer_status,final_status:r.final_status,query_result:r.query_result,resolved_base_url:n.getResolvedBaseUrl(),tried_base_urls:n.getTriedBaseUrls()})}catch(r){return Ce(n,r,"query")}}async function gn(e,t){let n=new v(e);try{let r=hn({caller_scope:In(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=os(r);if(i)return C({...i,deduped:!0,retry_after_ms:$,next_action:"\u540C\u4E00\u6D1E\u5BDF\u95EE\u9898\u521A\u521A\u5DF2\u7ECF\u53D1\u8D77\uFF0C\u5DF2\u590D\u7528\u5DF2\u6709 message_id\u3002\u8BF7\u4F7F\u7528 chatbi_insight_poll \u67E5\u8BE2\u7ED3\u679C\u3002"});let s=Qe.get(r);if(s){let c=await s;return C({...c,deduped:!0,retry_after_ms:$,next_action:"\u540C\u4E00\u6D1E\u5BDF\u95EE\u9898\u6B63\u5728\u53D1\u8D77\u4E2D\uFF0C\u5DF2\u590D\u7528\u5DF2\u6709\u8BF7\u6C42\u7ED3\u679C\u3002\u8BF7\u4F7F\u7528 chatbi_insight_poll \u67E5\u8BE2\u7ED3\u679C\u3002"})}let o=n.startInsight({themeId:t.theme_id,themeName:t.theme_name,message:t.message,sessionId:t.session_id,externalContext:t.external_context}).then(c=>{let u={theme_id:c.theme_id,message_id:c.message_id,session_id:c.session_id,status:"started"};return as(r,u),u}).finally(()=>{Qe.delete(r)});Qe.set(r,o);let a=await o;return C({...a,deduped:!1,retry_after_ms:$,next_action:"\u6D1E\u5BDF\u4EFB\u52A1\u5DF2\u53D1\u8D77\u3002\u6D1E\u5BDF\u901A\u5E38\u8017\u65F6 2-3 \u5206\u949F\uFF0C\u8BF7\u4F7F\u7528 chatbi_insight_poll \u643A\u5E26 theme_id \u548C message_id \u67E5\u8BE2\u7ED3\u679C\uFF1B5 \u5206\u949F\u540E\u4ECD\u672A\u6210\u529F\u53EF\u89C6\u4E3A\u8D85\u65F6\u3002",resolved_base_url:n.getResolvedBaseUrl(),tried_base_urls:n.getTriedBaseUrls()})}catch(r){return Ce(n,r,"insight.start")}}async function _n(e,t){let n=new v(e);try{let r=hn({caller_scope:In(e),message_id:t.message_id}),i=cs(r);if(i){let p=Ye(i.result),g=Xe(i.result,!0);return C({message_id:i.result.message_id,session_id:i.result.session_id,status:i.result.status,detail:We(i.result),question:i.result.question,answer:i.result.answer,throttled:!0,retry_after_ms:i.retryAfterMs,...p,next_action:g})}let s=Ke.get(r);if(s){let p=await s,g=Ze(p.status),I=Ye(p),y=Xe(p,!0);return C({message_id:p.message_id,session_id:p.session_id,status:p.status,detail:We(p),question:p.question,answer:p.answer,throttled:!0,retry_after_ms:g?0:$,...I,next_action:y})}let o=n.pollInsight({themeId:t.theme_id,themeName:t.theme_name,messageId:t.message_id}).then(p=>(us(r,p),p)).finally(()=>{Ke.delete(r)});Ke.set(r,o);let a=await o,c=Ze(a.status),u=Ye(a),d=Xe(a,!1);return C({message_id:a.message_id,session_id:a.session_id,status:a.status,detail:We(a),question:a.question,answer:a.answer,throttled:!1,retry_after_ms:c?0:$,...u,next_action:d,resolved_base_url:n.getResolvedBaseUrl(),tried_base_urls:n.getTriedBaseUrls()})}catch(r){return Ce(n,r,"insight.poll")}}function Ye(e){return e.status!=="success"?{}:{final_result:{format:"markdown",content:yn(e)}}}function We(e){return e.detail!=null?e.detail:e.status==="failure"||e.status==="stopped"?ds(e):e.detail}function Xe(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 os(e){Te();let t=ye.get(e);if(!(!t||Date.now()-t.createdAt>=ss))return t.result}function as(e,t){Te(),ye.set(e,{createdAt:Date.now(),result:t})}function cs(e){Te();let t=be.get(e);if(!t)return;let n=Date.now()-t.checkedAt,r=Ze(t.result.status);if(!(!r&&n>=$))return{result:t.result,retryAfterMs:r?0:Math.max(0,$-n)}}function Ze(e){return e==="success"||e==="failure"||e==="stopped"}function us(e,t){Te(),be.set(e,{checkedAt:Date.now(),result:t})}function Te(){let e=Date.now();for(let[t,n]of ye)e-n.createdAt>=tn&&ye.delete(t);for(let[t,n]of be)e-n.checkedAt>=tn&&be.delete(t)}function hn(e){return JSON.stringify(Object.keys(e).sort().reduce((t,n)=>{let r=e[n];return typeof r<"u"&&(t[n]=r),t},{}))}function In(e){return e.BI_UID_TOKEN?`uid:${nn(e.BI_UID_TOKEN)}`:`login:${nn(`${e.BI_LOGIN_DOMAIN??""}\0${e.BI_LOGIN_ID??""}`)}`}function nn(e){return is("sha256").update(e).digest("hex").slice(0,16)}function yn(e){let t=e.answer?.trim();if(t)return gs(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 ds(e){switch(e.status){case"success":return yn(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 ls(e,t){let n=[`| ${e.join(" | ")} |`,`|${e.map(()=>" --- ").join("|")}|`];for(let r of t)n.push(`| ${e.map((i,s)=>ms(ps(r[s]))).join(" | ")} |`);return n.join(`
6
- `)}function ps(e){return e===null||typeof e>"u"||e===""?"-":String(e)}function ms(e){return e.replaceAll(`\r
2
+ import"dotenv/config";import{createRequire as So}from"module";import{z as C}from"zod";var yr="http://guandata-web:8088",Tr=C.object({BI_BASE_URL:C.string().url().optional().default(yr),BI_PUBLIC_PATH:C.string().optional().default(""),BI_PAT:C.string().optional(),BI_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 Tt(e=process.env){let t=Tr.parse(e),n=t.MCP_TRANSPORT==="streamable-http";return{...t,BI_BASE_URL:t.BI_BASE_URL?.replace(/\/+$/,""),BI_PUBLIC_PATH:Cr(t.BI_PUBLIC_PATH),BI_PAT:n?void 0:t.BI_PAT?.trim()||void 0,BI_CLIENT:t.BI_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":yt(t.BI_LOGIN_ID_HEADER),BI_USER_PROPERTY_HEADER:yt(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 Cr(e){let t=e?.trim().replace(/^\/+|\/+$/g,"")??"";return t?`/${t}`:""}function yt(e){return e?.trim().toLowerCase()||void 0}import{createRequire as uo}from"module";import{createHash as lo,randomUUID as po}from"crypto";import{createServer as mo}from"http";import{McpServer as fo}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as go}from"@modelcontextprotocol/sdk/server/stdio.js";import{StreamableHTTPServerTransport as _o}from"@modelcontextprotocol/sdk/server/streamableHttp.js";var de=class{record(t){console.error(JSON.stringify({audit:Br({...t})}))}},le=class{record(){}};function xe(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"?Er(i):void 0}}function Er(e){return e instanceof Error?e.name||"Error":typeof e}function Br(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}import{AsyncLocalStorage as wr}from"async_hooks";var K={client:"X-Guandata-Client",clientVersion:"X-Guandata-Client-Version",command:"X-Guandata-Command"},Ct=new wr;function Et(e,t){return Ct.run(e,t)}function re(e,t="mcp"){e=Ct.getStore()??e;let n={};n[K.client]=e?.client.trim()||t.trim()||"mcp";let r=e?.clientVersion?.trim();r&&(n[K.clientVersion]=r);let i=e?.command?.trim();return i&&(n[K.command]=i),n}function j(e,t,n="mcp"){let r=re(t,n),i=new Set(Object.values(K).map(s=>s.toLowerCase()));return{...Object.fromEntries(Object.entries(e).filter(([s])=>!i.has(s.toLowerCase()))),...r}}async function pe(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(Sr(e,"/api/user/sign-in"),{method:"POST",headers:{"Content-Type":"application/json","raw-backend-response":"TRUE",...re(e.BI_REQUEST_METADATA,e.BI_CLIENT)},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} ${xr(n)}`);let r=Rr(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 Sr(e,t){return`${e.BI_BASE_URL}${e.BI_PUBLIC_PATH}${t}`}function Rr(e,t){let n=Ar(e.headers);if(n)return n;let r=Or(t);return r||kr(e.headers)}function Ar(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 Or(e){try{let t=JSON.parse(e);return Bt(t)??Bt(vr(t.response))}catch{return}}function kr(e){return[...e.getSetCookie?.()??[],...Pr(e.get("set-cookie"))].map(n=>n.trim().match(/(?:^|;\s*)uIdToken=([^;]+)/)?.[1]).find(Boolean)}function Pr(e){return e?e.split(/,(?=\s*[^;,]+=)/):[]}function Bt(e){if(e)for(let t of["uIdToken","authToken","token"]){let n=e[t];if(typeof n=="string"&&n)return n}}function vr(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function xr(e,t=500){return e.length>t?`${e.slice(0,t)}...`:e}var Mr="guanbi_mcp_chatbi",A=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?Dr(`${t.BI_BASE_URL}${t.BI_PUBLIC_PATH}`):[]}config;token;resolvedBaseUrl;candidates;triedBaseUrls=new Set;lastError;loginPromise;refreshPromise;getRegisteredTools(){return["chatbi_list_themes","chatbi_query","chatbi_insight_start","chatbi_insight_poll"]}getResolvedBaseUrl(){return this.resolvedBaseUrl}getTriedBaseUrls(){return[...this.triedBaseUrls]}getLastError(){return this.lastError}async probe(){try{return await this.listThemes(),{available:!0,resolvedBaseUrl:this.resolvedBaseUrl,triedBaseUrls:this.getTriedBaseUrls(),registeredTools:this.getRegisteredTools()}}catch(t){let n=wt(t,"probe");return{available:!1,lastError:n,failureType:Wr(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:St({fast_mode:t.fastMode??!0,n_samples:t.nSamples})};t.sessionId&&(r.session_id=t.sessionId),t.externalContext&&(r.external_context=t.externalContext);let i=await this.request("/chat/send-message-sync",{operation:"query",body:r,includeDeviceId:!0});try{Xr(i)}catch(s){throw this.operationError("query","/chat/send-message-sync",s)}return i}async insight(t){let n=t.timeoutMs??3e5,r=t.pollIntervalMs??2e3,i=Date.now()+n,s=await this.startInsight({...t,requestTimeoutMs:Rt(i)});if(!s.theme_id)throw this.operationError("insight.send","/chat/send-message","ChatBI insight response missing theme_id");if(!s.message_id?.trim())throw this.operationError("insight.send","/chat/send-message","ChatBI insight response missing message_id");for(;;){let o=await this.getAgentAnswer(s.theme_id,s.message_id,Rt(i));switch(o.message_id??=s.message_id,o.session_id??=s.session_id,o.status){case"success":return o;case"failure":case"stopped":throw this.operationError("insight.poll","/chat/get-agent-answer",o.detail?.trim()||"Insight request failed")}await ti(i,r,n)}}async startInsight(t){let n=await this.resolveThemeId(t.themeId,t.themeName,!0),r={attachments:[],theme_id:n,message:t.message,is_insight:1};t.sessionId&&(r.session_id=t.sessionId),t.externalContext&&(r.external_context=t.externalContext);let i=St({analysis_expert_id:t.analysisExpertId,agent_mode:t.agentMode,analysis_confirmation_enabled:t.analysisConfirmationEnabled});Object.keys(i).length&&(r.config=i);let s=await this.request("/chat/send-message",{operation:"insight.send",body:r,includeDeviceId:!0,requestTimeoutMs:t.requestTimeoutMs});if(!s.message_id?.trim())throw this.operationError("insight.send","/chat/send-message","ChatBI insight response missing message_id");return s.theme_id=n,s}async pollInsight(t){let n=await this.resolveThemeId(t.themeId,t.themeName,!0),r=await this.getAgentAnswer(n,t.messageId,t.requestTimeoutMs);return r.message_id||(r.message_id=t.messageId),r}async getAgentAnswer(t,n,r){let i=new URLSearchParams({theme_id:t,message_id:n});try{return await this.request(`/chat/get-agent-answer?${i.toString()}`,{operation:"insight.poll",retrySafeBaseUrlFallback:!0,requestTimeoutMs:r})}catch(s){if($r(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 Yr(o,s)}async request(t,n){this.assertUsableConfig();let r=this.resolvedBaseUrl?[this.resolvedBaseUrl]:this.candidates,i;for(let s of r){this.triedBaseUrls.add(s);try{let o=await this.requestToBaseUrlWithAuthRetry(s,t,n);return n.validateResponse?.(o,{operation:n.operation,baseUrl:s,path:t}),this.resolvedBaseUrl=s,this.lastError=void 0,o}catch(o){if(i=o,this.lastError=wt(o,n.operation),!qr(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 A&&(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 A(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(!Gr(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:Ur(r,i,this.config.BI_REQUEST_METADATA,this.config.BI_CLIENT),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 A(d instanceof Error?d.message:String(d),{operation:s.operation,base_url:s.baseUrl,path:s.path,token_refreshed:s.tokenRefreshed,detail:d instanceof Error?d.message:String(d)})}let c=await a.text(),u=jr(c,a,s);if(!a.ok||Nr(u))throw Lr(u,c,a,s);return r.type==="uid"&&this.refreshTokenFromResponse(a,u),u.data}async ensureToken(){return this.token?this.token:(this.loginPromise??=this.signInForToken().finally(()=>{this.loginPromise=void 0}),this.loginPromise)}async refreshToken(){return this.refreshPromise??=this.refreshTokenOnce().finally(()=>{this.refreshPromise=void 0}),this.refreshPromise}async refreshTokenOnce(){if(this.config.BI_UID_TOKEN_REFRESH){let t=await this.config.BI_UID_TOKEN_REFRESH();return this.token=t,t}return this.signInForToken()}async signInForToken(){this.token=void 0;let t=await pe(this.config);return this.token=t.token,t.token}refreshTokenFromResponse(t,n){let r=Qr(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 Dr(e){let t=new URL(e),n=[],r=s=>{let o=new URL(t.toString());o.pathname=s,o.search="",o.hash="";let a=o.toString().replace(/\/+$/,"");n.includes(a)||n.push(a)},i=t.pathname.replace(/\/+$/,"");return r("/api/chat/public-api"),i&&r(`${i}/api/chat/public-api`),r(i?`${i}/public-api`:"/public-api"),r("/public-api"),n}function me(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 Ur(e,t,n,r){let i={"User-Agent":"guanbi-mcp-server",...e.type==="pat"?{"X-Personal-Token":e.token}:{Cookie:`uIdToken=${e.token}`},...re(n,r)};return t.body!==void 0&&(i["Content-Type"]="application/json"),t.includeDeviceId&&(i["Device-ID"]=Mr),i}function jr(e,t,n){if(!e)return{};try{return JSON.parse(e)}catch{throw new A("ChatBI response is not valid JSON",{operation:n.operation,base_url:n.baseUrl,path:n.path,http_status:t.status,token_refreshed:n.tokenRefreshed,detail:kt(e)},{retryableForBaseUrl:!0})}}function Nr(e){let t=At(e);return typeof t=="number"&&![0,200].includes(t)||e.result==="fail"||e.success===!1}function Lr(e,t,n,r){let i=At(e),s=Fr(e),o=s||t||`ChatBI request failed with status ${n.status}`,a={operation:r.operation,base_url:r.baseUrl,path:r.path,http_status:n.status,chatbi_code:i,chatbi_message:s,token_refreshed:r.tokenRefreshed,detail:kt(t)},c=Vr(o),u=!c&&Hr(n.status,i);return new A(o,a,{authExpired:u,retryableForBaseUrl:c||Jr(n.status,i)})}function qr(e,t){return!!(t&&e instanceof A&&e.retryableForBaseUrl)}function Gr(e){return e instanceof A&&e.authExpired}function Hr(e,t){return e===401||e===403||t===401||t===403||t===5001}function Jr(e,t){return[401,403,404,405].includes(e)||typeof t=="number"&&[401,403,404,405].includes(t)}function $r(e){return e instanceof A&&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=fe(e.error);return typeof t?.status=="number"?t.status:void 0}function Fr(e){if(typeof e.message=="string"&&e.message.trim())return e.message;let t=fe(e.error);return typeof t?.message=="string"&&t.message.trim()?t.message:void 0}function Vr(e){return/No static resource/i.test(e)}function fe(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function zr(e,t){let n=fe(e);if(!Array.isArray(n?.themes))throw new A("ChatBI list-theme response missing themes",{operation:t.operation,base_url:t.baseUrl,path:t.path,detail:"missing themes"},{retryableForBaseUrl:!0})}function Qr(e,t){let r=[...e.headers.getSetCookie?.()??[],...Kr(e.headers.get("set-cookie"))].map(s=>Me(s.trim().match(/(?:^|;\s*)uIdToken=([^;]+)/)?.[1])).find(Boolean);if(r)return r;let i=Me(e.headers.get("x-auth-token"));return i||Ot(t)}function Kr(e){return e?e.split(/,(?=\s*[^;,]+=)/):[]}function Me(e){if(typeof e!="string")return;let t=e.trim();return t&&!/\s/.test(t)?t:void 0}function Ot(e){let t=fe(e);if(t){for(let n of["uIdToken","authToken"]){let r=Me(t[n]);if(r)return r}for(let n of["data","response"]){let r=Ot(t[n]);if(r)return r}}}function wt(e,t){return e instanceof A?e.detail:{operation:t,detail:e instanceof Error?e.message:String(e)}}function kt(e,t=1e3){return e.length>t?`${e.slice(0,t)}...`:e}function Wr(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 Yr(e,t){let n=t.trim().toLowerCase(),r,i=[];for(let s of e){let o=s.theme_name.trim().toLowerCase();o===n?r=s:o.includes(n)&&i.push(s)}if(r)return r.theme_id;if(i.length===1)return i[0].theme_id;throw i.length>1?new Error(`\u4E3B\u9898\u540D\u5339\u914D\u5230\u591A\u4E2A\u7ED3\u679C\uFF1A${t}`):new Error(`\u672A\u627E\u5230\u4E3B\u9898\uFF1A${t}`)}function St(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>typeof t<"u"))}function Xr(e){if([e.final_status,e.answer_status,e.query_status].some(ei))throw new Error(`ChatBI query failed: ${Zr(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 Zr(...e){return e.find(t=>typeof t=="string"&&t.trim())?.trim()}function ei(e){return typeof e=="string"&&e.trim().toLowerCase()==="failure"}function Rt(e){let t=e-Date.now();if(t<=0)throw new Error("Insight request timed out");return t}async function ti(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 ie="8.2.0",Ue=["search_metrics","list_metric_catalog","get_metric_detail","query_metric_data","search_metric_trees","get_metric_tree_detail","query_metric_tree_attribution"],ni=["get_bi_capabilities","global_search",...Ue,"execute_sql_query","get_dataset_detail","get_card_info","query_card_data","get_page_info"],ri=6e4,ii="PAT \u6A21\u5F0F\u4EC5\u652F\u6301\u666E\u901A BI \u63A5\u53E3\uFF0C\u4E0D\u652F\u6301 ChatBI public-api\u3002",De=new WeakMap;async function se(e,t){let n=De.get(e);return(!n||n.expiresAt<=Date.now())&&De.set(e,{expiresAt:Date.now()+ri,promise:oi(e,t).catch(r=>si(r,t))}),De.get(e).promise}function xt(e){let t=!e.BI_BASE_URL,n="HTTP \u6A21\u5F0F\u4E0B execute_sql_query \u4F1A\u5728\u8C03\u7528\u65F6\u4F7F\u7528\u5F53\u524D\u7528\u6237 token \u5224\u65AD BI \u7248\u672C/\u80FD\u529B\u3002",r="HTTP \u6A21\u5F0F\u542F\u52A8\u671F\u5C1A\u672A\u89E3\u6790\u8BF7\u6C42\u8C03\u7528\u8005\u3002";return{ok:!t,error:t?"\u914D\u7F6E\u4E0D\u5B8C\u6574\uFF1A\u7F3A\u5C11 BI_BASE_URL\u3002":void 0,versionSource:"api",dataVersion:e.BI_DATA_VERSION,service:Ne(e,t?["get_bi_capabilities"]:je(e)),caller:{ok:!1,error:r,features:{executeSqlQuery:{enabled:!1,minVersion:ie,reason:r}},chatbi:W(e,r)},features:{executeSqlQuery:{enabled:!t,minVersion:ie,reason:t?"\u914D\u7F6E\u4E0D\u5B8C\u6574\uFF1A\u7F3A\u5C11 BI_BASE_URL\u3002":n}},metricPlatform:{registeredTools:t?[]:Ue,readOnly:!0,lastError:t?"\u914D\u7F6E\u4E0D\u5B8C\u6574\uFF1A\u7F3A\u5C11 BI_BASE_URL\u3002":void 0},chatbi:W(e,"HTTP \u6A21\u5F0F\u542F\u52A8\u671F\u4E0D\u4F7F\u7528\u67D0\u4E2A\u7528\u6237 token \u63A2\u6D4B ChatBI \u80FD\u529B\u3002")}}async function Mt(e,t,n){let i=(await se(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 si(e,t){let n=e instanceof Error?e.message:String(e);return{ok:!1,error:n,versionSource:"api",features:{executeSqlQuery:{enabled:!1,minVersion:ie,reason:`\u65E0\u6CD5\u786E\u8BA4 BI \u80FD\u529B\uFF1A${n}`}},metricPlatform:{registeredTools:[],readOnly:!0,lastError:n},chatbi:W(t,n),service:Ne(t,je(t)),caller:{ok:!1,error:n,features:{executeSqlQuery:{enabled:!1,minVersion:ie,reason:`\u65E0\u6CD5\u786E\u8BA4 BI \u80FD\u529B\uFF1A${n}`}},chatbi:W(t,n)}}}async function oi(e,t){let n=ci(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 ui(e),s=di(i.capabilityVersion,ie),o=await ai(t);return{ok:!0,appVersion:i.appVersion,dataVersion:i.dataVersion,versionSource:r,service:Ne(t,je(t)),caller:{ok:!0,features:{executeSqlQuery:s},chatbi:o},features:{executeSqlQuery:s},metricPlatform:{registeredTools:Ue,readOnly:!0},chatbi:o}}function je(e){let t=new Set(ni);if(!e.BI_PAT&&(me(e)||e.MCP_TRANSPORT==="streamable-http"))for(let n of new v(e).getRegisteredTools())t.add(n);return[...t]}function Ne(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 ai(e){if(e.BI_PAT)return W(e,ii);let t=new v(e);return me(e)?t.probe():W(e,"\u7F3A\u5C11 BI_BASE_URL \u6216\u9274\u6743\u914D\u7F6E\u3002")}function W(e,t){return{available:!1,registeredTools:e.BI_PAT||!me(e)?[]:new v(e).getRegisteredTools(),failureType:"unknown",triedBaseUrls:[],lastError:{operation:"probe",chatbi_message:t,detail:t}}}function ci(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 ui(e){let t=await e.get("/api/server-version"),n=vt(t.version),r=vt(t.dataVersion)??n;if(!r)throw new Error("BI \u7248\u672C\u63A5\u53E3\u672A\u8FD4\u56DE version \u6216 dataVersion\u3002");return{appVersion:n,dataVersion:r,capabilityVersion:r}}function di(e,t){let n=Pt(e),r=Pt(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=li(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 Pt(e){let t=e.match(/(\d+)\.(\d+)\.(\d+)/);if(t)return[Number(t[1]),Number(t[2]),Number(t[3])]}function li(e,t){for(let n=0;n<e.length;n+=1){let r=e[n]-t[n];if(r!==0)return r}return 0}function vt(e){return typeof e=="string"&&e.trim()?e.trim():void 0}var ge=class{constructor(t){this.config=t}config;cache=new Map;async exchange(t){let n=Dt(t),r=this.cache.get(this.cacheKey(n));if(r&&r.expiresAtMs>Date.now())return this.result(n,r.token,r.biExpireAt);let i=await this.fetchLoginIdToken(n);return this.cache.set(this.cacheKey(n),{token:i.token,expiresAtMs:this.resolveCacheExpiresAt(i.expireAt),biExpireAt:i.expireAt}),this.result(n,i.token,i.expireAt)}async exchangeUserProperty(t){let n=await this.fetchLoginIdByUserProperty(t);return this.exchange(n)}async refresh(t){return this.cache.delete(this.cacheKey(t)),(await this.exchange(t)).token}result(t,n,r){return{token:n,expireAt:r,refresh:()=>this.refresh(t)}}async fetchLoginIdByUserProperty(t){let n=pi(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:j({"Content-Type":"application/json","raw-backend-response":"TRUE"},this.config.BI_REQUEST_METADATA,this.config.BI_CLIENT),body:JSON.stringify(s),signal:AbortSignal.timeout(this.config.BI_REQUEST_TIMEOUT_MS)})}catch(p){throw this.debugError(`BI user property lookup request failed: ${p instanceof Error?p.message:String(p)}`,{operation:"userPropertyLookup",request:{method:"POST",url:i,body:s},error:p instanceof Error?p.message:String(p)},[this.config.BI_APP_TOKEN])}let a=await o.text(),c=Ut(a);if(!o.ok||jt(c))throw this.debugError(`BI user property lookup failed: HTTP ${o.status} ${Le(a,[this.config.BI_APP_TOKEN,r,n])}`,{operation:"userPropertyLookup",request:{method:"POST",url:i,body:s},response:{status:o.status,body:a}},[this.config.BI_APP_TOKEN]);let u=c?.response?.list??[],d=c?.response?.total??u.length;if(d!==1||u.length!==1)throw this.debugError(`BI user property lookup must match exactly one user: matched ${d} user(s) for ${r}.`,{operation:"userPropertyLookup",request:{method:"POST",url:i,body:s},response:{status:o.status,total:d,listCount:u.length,matchedLoginIds:u.map(p=>p.loginId).filter(Boolean)}},[this.config.BI_APP_TOKEN]);return Dt(u[0]?.loginId??"")}async fetchLoginIdToken(t){if(!this.config.BI_BASE_URL)throw this.debugError("BI_BASE_URL is required for loginId identity exchange.",{operation:"loginIdSignIn",request:{loginId:t}});if(!this.config.BI_APP_TOKEN)throw this.debugError("BI_APP_TOKEN is required for loginId identity exchange.",{operation:"loginIdSignIn",request:{loginId:t}});let n=this.buildUrl("/public-api/user/loginId/sign-in"),r={token:this.config.BI_APP_TOKEN,loginId:t},i;try{i=await fetch(n,{method:"POST",headers:j({"Content-Type":"application/json","raw-backend-response":"TRUE"},this.config.BI_REQUEST_METADATA,this.config.BI_CLIENT),body:JSON.stringify(r),signal:AbortSignal.timeout(this.config.BI_REQUEST_TIMEOUT_MS)})}catch(c){throw this.debugError(`BI loginId token exchange request failed: ${c instanceof Error?c.message:String(c)}`,{operation:"loginIdSignIn",request:{method:"POST",url:n,body:r},error:c instanceof Error?c.message:String(c)},[this.config.BI_APP_TOKEN])}let s=await i.text(),o=Ut(s),a=o?.response?.token?.trim();if(!i.ok||jt(o)||!a)throw this.debugError(`BI loginId token exchange failed: HTTP ${i.status} ${Le(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=mi(t);return r?Math.min(n,r):n}debugError(t,n,r=[]){if(!gi(this.config))return new Error(t);let i=qe(n,[this.config.BI_APP_TOKEN,...r]);return console.error(JSON.stringify({identityExchangeDebug:i})),new Error(`${t}
3
+ identity_debug=${JSON.stringify(i,null,2)}`)}};function Dt(e){let t=e.trim();if(!t)throw new Error("GuanBI loginId is required for loginId identity exchange.");return t}function pi(e){let t=e.trim();if(!t)throw new Error("BI user property value is required for user property identity exchange.");return t}function Ut(e){if(e.trim())try{return JSON.parse(e)}catch{return}}function jt(e){return!e||e.result&&!["ok","success"].includes(e.result.toLowerCase())?!0:e.success===!1}function mi(e){if(!e)return;let t=e.replace(" ","T"),n=Date.parse(t);return Number.isFinite(n)?n:void 0}function Le(e,t){let n=t.filter(r=>!!r).reduce((r,i)=>r.split(i).join("[redacted]"),e);return _i(n)}function qe(e,t){let n=t.filter(r=>!!r);return typeof e=="string"?Le(e,n):Array.isArray(e)?e.map(r=>qe(r,n)):!e||typeof e!="object"?e:Object.fromEntries(Object.entries(e).map(([r,i])=>[r,fi(r)?"[redacted]":qe(i,n)]))}function fi(e){return["token","authorization","cookie","uidtoken","uIdToken".toLowerCase()].includes(e.toLowerCase())}function gi(e){return["1","true","yes","on"].includes(e.BI_IDENTITY_DEBUG?.trim().toLowerCase()??"")}function _i(e,t=1e3){return e.length>t?`${e.slice(0,t)}\u2026`:e}var Z="x-personal-token";function hi(e){return{transport:"stdio",...e.BI_PAT?{biPatToken:e.BI_PAT}:{},biUidToken:e.BI_UID_TOKEN,audit:{}}}function Lt(e){return{resolve:()=>hi(e)}}function _e(e){let t=oe(e);if(t)return{transport:"streamable-http",biPatToken:t,audit:Y(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:Y(e)}}function qt(e,t={}){let n=e?new ge(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=oe(o);if(a)return{transport:"streamable-http",biPatToken:a,audit:Y(o)};if(e?.BI_PAT)return{transport:"streamable-http",biPatToken:e.BI_PAT,audit:Y(o)};if(N(o,"x-guanbi-uid-token")?.trim()||!e)return _e(o);let u=e.BI_LOGIN_ID_HEADER,d=u?X(N(o,u)):void 0;if(d){let I=await r?.(d);return I?{transport:"streamable-http",biUidToken:I.token,biUidTokenRefresh:I.refresh,loginId:d,audit:Y(o)}:_e(o)}let p=e.BI_USER_PROPERTY_HEADER,_=p?X(N(o,p)):void 0;if(_){let I=await i?.(_);return I?{transport:"streamable-http",biUidToken:I.token,biUidTokenRefresh:I.refresh,audit:Y(o)}:_e(o)}throw Ii(o,e)}}}function oe(e){return X(N(e,Z))}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 X(e){return e?.trim()||void 0}function Y(e){return{tenantId:X(N(e,"x-tenant-id")),endUserId:X(N(e,"x-end-user-id")),traceId:X(N(e,"x-trace-id"))}}function Ii(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(!Ei(t))return new Error(n);let r={operation:"resolveHttpCallerContext",expectedIdentityHeaders:bi(e,t),receivedHeaderNames:yi(e),receivedIdentityLikeHeaders:Nt(Object.fromEntries(Ge(e).filter(([i])=>Ci(i.toLowerCase()))),[Z,"x-guanbi-uid-token",t.BI_LOGIN_ID_HEADER,t.BI_USER_PROPERTY_HEADER]),receivedHeaders:Nt(e,[Z,"x-guanbi-uid-token",t.BI_LOGIN_ID_HEADER,t.BI_USER_PROPERTY_HEADER])};return console.error(JSON.stringify({identityExchangeDebug:r})),new Error(`${n}
4
+ identity_debug=${JSON.stringify(r,null,2)}`)}function bi(e,t){return[{source:"pat",name:Z,present:he(e,Z)},{source:"uidToken",name:"x-guanbi-uid-token",present:he(e,"x-guanbi-uid-token")},...t.BI_LOGIN_ID_HEADER?[{source:"loginId",name:t.BI_LOGIN_ID_HEADER,present:he(e,t.BI_LOGIN_ID_HEADER)}]:[],...t.BI_USER_PROPERTY_HEADER?[{source:"userProperty",name:t.BI_USER_PROPERTY_HEADER,present:he(e,t.BI_USER_PROPERTY_HEADER),userPropertyKey:t.BI_USER_PROPERTY_KEY}]:[]]}function he(e,t){return N(e,t)!==void 0}function yi(e){return[...new Set(Ge(e).map(([t])=>t.toLowerCase()))].sort()}function Nt(e,t){let n=new Set(t.filter(r=>!!r).map(r=>r.toLowerCase()));return Object.fromEntries(Ge(e).map(([r,i])=>{let s=r.toLowerCase();return Ti(s)?[s,"<redacted>"]:[s,n.has(s)?i:"<present>"]}))}function Ge(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 Ti(e){return["authorization","cookie","set-cookie","x-guanbi-uid-token",Z].includes(e)}function Ci(e){return e.startsWith("x-")||e.includes("auth")||e.includes("login")||e.includes("token")||e.includes("uid")||e.includes("user")}function Ei(e){return["1","true","yes","on"].includes(e.BI_IDENTITY_DEBUG?.trim().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:j({"raw-backend-response":"TRUE","X-Personal-Token":this.config.BI_PAT},this.config.BI_REQUEST_METADATA,this.config.BI_CLIENT),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} ${Ie(o)}`);return o}let n=await this.ensureToken(),r=await fetch(this.buildUrl(t),{method:"GET",headers:j({"raw-backend-response":"TRUE",Cookie:`uIdToken=${n}`},this.config.BI_REQUEST_METADATA,this.config.BI_CLIENT),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:j({"raw-backend-response":"TRUE",Cookie:`uIdToken=${s}`},this.config.BI_REQUEST_METADATA,this.config.BI_CLIENT),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} ${Ie(i)}`);return this.refreshTokenFromResponse(r),i}async request(t,n,r,i){if(this.config.BI_PAT){let c=await this.fetchWithPat(t,n,this.config.BI_PAT,r,i),u=await c.text();if(!c.ok)throw new Error(`BI \u8BF7\u6C42\u5931\u8D25\uFF1A${t} ${n} HTTP ${c.status} ${Ie(u)}`);return Gt(u)}let s=await this.ensureToken(),o=await this.fetchWithToken(t,n,s,r,i);if(this.shouldRefreshToken(o)){let c=await this.refreshToken();o=await this.fetchWithToken(t,n,c,r,i)}let a=await o.text();if(!o.ok)throw new Error(`BI \u8BF7\u6C42\u5931\u8D25\uFF1A${t} ${n} HTTP ${o.status} ${Ie(a)}`);return this.refreshTokenFromResponse(o),Gt(a)}async fetchWithToken(t,n,r,i,s){return fetch(this.buildUrl(n),{method:t,headers:j({"Content-Type":"application/json","raw-backend-response":"TRUE",Cookie:`uIdToken=${r}`,...s?.headers},this.config.BI_REQUEST_METADATA,this.config.BI_CLIENT),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:j({"Content-Type":"application/json","raw-backend-response":"TRUE","X-Personal-Token":r,...s?.headers},this.config.BI_REQUEST_METADATA,this.config.BI_CLIENT),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 pe(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=wi(t);!n||n===this.token||(this.token=n)}shouldRefreshToken(t){return(!!this.config.BI_UID_TOKEN_REFRESH||this.hasPasswordLogin())&&t.status===401}hasPasswordLogin(){return!!(this.config.BI_LOGIN_DOMAIN&&this.config.BI_LOGIN_ID&&this.config.BI_LOGIN_PASSWORD)}buildUrl(t){let n=t.startsWith("/")?t:`/${t}`;return`${this.config.BI_BASE_URL}${this.config.BI_PUBLIC_PATH}${n}`}};function Gt(e){if(!e)return;let t=JSON.parse(e);if(!Bi(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 Bi(e){return!e||typeof e!="object"||Array.isArray(e)?!1:"response"in e||"result"in e||"success"in e}function wi(e){return Si(e.headers)??Ai(e.headers)}function Si(e){return[...e.getSetCookie?.()??[],...Ri(e.get("set-cookie"))].map(n=>Ht(n.trim().match(/(?:^|;\s*)uIdToken=([^;]+)/)?.[1])).find(Boolean)}function Ri(e){return e?e.split(/,(?=\s*[^;,]+=)/):[]}function Ai(e){return Ht(e.get("x-auth-token"))}function Ht(e){if(typeof e!="string")return;let t=e.trim();return t&&!/\s/.test(t)?t:void 0}function Ie(e,t=1e3){return e.length>t?`${e.slice(0,t)}...`:e}var ye=class{constructor(t,n={}){this.baseConfig=t;this.options=n}baseConfig;options;stdioClient;create(t,n){let r=this.resolveRequestMetadata(n);if(t.transport==="stdio"&&this.stdioClient)return{...this.stdioClient,config:{...this.stdioClient.config,BI_REQUEST_METADATA:r}};let i=this.resolveConfig(t,t.transport==="stdio"?this.resolveRequestMetadata(void 0):r),s={client:this.options.clientFactory?.(i)??new 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 Jt={endpoint:"https://www.google-analytics.com/mp/collect",measurementId:"G-800H8JWDPP",apiSecret:"poAwpMEhQteDl1rXKtNIqg",eventName:"guanbi_mcp_tool_call",clientId:"0000000000.0000000000",sessionId:1,engagementTimeMsec:1,timeoutMs:3e3,maxResponseBytes:1024},Te=class{serviceDomain;appVersion;enabled;sender;now;constructor({config:t,appVersion:n,sender:r=Pi(),now:i=Date.now}){this.serviceDomain=xi(t.BI_BASE_URL),this.appVersion=n,this.enabled=vi(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:Mi(this.now()-t.startedAtMs),error_type:n.success?"none":Ui(n.error)};try{Promise.resolve(this.sender(r)).catch(()=>{})}catch{}}};function Oi(e=Jt){return t=>ki(t,e)}async function ki(e,t=Jt){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 Di(i,t.maxResponseBytes)}catch{}}function Pi(){return ji(process.env)?()=>{}:Oi()}function vi(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 $t(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 xi(e){if(e)try{return new URL(e).hostname}catch{return}}function Mi(e){return e<1e3?"<1s":e<5e3?"1-5s":e<3e4?"5-30s":e<12e4?"30-120s":">120s"}async function Di(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 Ui(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 ji(e){return e.NODE_ENV==="test"||e.VITEST==="true"}var Ce=class{constructor(t,n,r=new le){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 Et(o.config.BI_REQUEST_METADATA,()=>t(o));if(r){let c=Ni(a)?"error":"success";this.auditLogger.record(xe(r,s,i,c,a))}return a}catch(a){throw r&&this.auditLogger.record(xe(r,s,i,"error",a)),a}}};function Ni(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=Je(e);return{content:[{type:"text",text:JSON.stringify(t,null,2)}],structuredContent:t}}function G(e){let t=Je(e);return{content:[{type:"text",text:JSON.stringify(t,null,2)}],isError:!0}}function Ee(e,t,n={}){return G({status:"error",diagnostic:He(e,t,n)})}function He(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 Je({operation:e,path:i?.groups?.path,status:i?.groups?.status?Number(i.groups.status):void 0,message:r,...n})}function Je(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}var Ft={};async function Vt(e,t){return M(await se(e,t))}import{z as T}from"zod";var J=class extends Error{constructor(n,r){super(n.message,{cause:r});this.detail=n;this.name="MetricPlatformRequestError"}detail},D=class{constructor(t,n){this.client=t;this.config=n}client;config;contextHeadersPromise;listProjects(){return this.get("listProjects","/api/metric-platform/projects")}searchMetrics(t){let n=h({projectId:t.projectId,dirId:t.dirId,status:t.status,nameLike:t.keyword,subTypes:t.subTypes?.join(","),orderBy:t.orderBy});return this.post("searchMetrics","/api/metric-platform/metrics",n)}listMetricFullTree(t){return this.get("listMetricFullTree",Fe("/api/metric-platform/metrics/full-tree",{projectId:t.projectId,nameLike:t.keyword}))}listMetricDirectoryTree(t){return this.get("listMetricDirectoryTree",Fe("/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",Fe("/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 $e(t,n,s)}}async get(t,n,r){try{return await this.client.get(n,r?{headers:r}:void 0)}catch(i){throw $e(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 $e(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"]=ee(this.config.BI_LOGIN_DOMAIN)),this.config.BI_LOGIN_ID&&(t["user-id"]=ee(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=zt(n.domId,n.domainId,n.domain,n.dom_id),i=zt(n.email,n.loginId,n.userId,n.uId,n.uid);!t["x-dom-id"]&&r&&(t["x-dom-id"]=ee(r)),!t["user-id"]&&i&&(t["user-id"]=ee(i))}catch{}return t["x-dom-id"]||(t["x-dom-id"]=ee(this.config.BI_LOGIN_DOMAIN||"guanbi")),t["user-id"]||(t["user-id"]=ee(this.config.BI_LOGIN_ID||"unknown")),t}};function $e(e,t,n){let r=n instanceof Error?n.message:String(n),i=r.match(/\bHTTP\s+(\d{3})\b/);return new J({operation:e,path:t,status:i?Number(i[1]):void 0,message:r},n)}function Fe(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 ee(e){return Buffer.from(e,"utf8").toString("base64")}function zt(...e){for(let t of e)if(typeof t=="string"&&t.trim())return t.trim()}var Li=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"]),Qt=new Set(["BT","CLOSE_BT_OPEN","OPEN_BT_CLOSE","OPEN_BT_OPEN"]),ze=new Set(["IS_NULL","NOT_NULL"]),qi=T.object({field:T.string().min(1).describe("\u7B5B\u9009\u5B57\u6BB5\u540D\u79F0\u3001\u522B\u540D\u6216\u5B57\u6BB5 ID\u3002"),operator:Li.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;ze.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`}),Qt.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`}),!Qt.has(e.operator)&&!ze.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`})}),Xt={cd_id:T.string().min(1).describe("\u5361\u7247 ID\u3002"),filters:T.array(qi).optional().describe("\u7ED3\u6784\u5316\u7B5B\u9009\u6761\u4EF6\u3002\u4E0D\u652F\u6301 CLI \u98CE\u683C\u7B5B\u9009\u5B57\u7B26\u4E32\u3002"),columns:T.array(T.string().min(1)).optional().describe("\u5BF9\u5DF2\u5C55\u5E73\u7ED3\u679C\u505A\u672C\u5730\u5217\u88C1\u526A\uFF0C\u4E0D\u53C2\u4E0E BI \u67E5\u8BE2\u8BED\u4E49\u3002"),limit:T.number().int().positive().max(1e4).optional().default(100).describe("\u6700\u591A\u8FD4\u56DE\u884C\u6570\uFF0C\u9ED8\u8BA4 100\uFF0C\u4E0A\u9650 10000\u3002"),raw:T.boolean().optional().describe("\u662F\u5426\u8FD4\u56DE\u539F\u59CB\u54CD\u5E94\u3002")},Zt={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 en(e,t){try{let n=t.limit??100,r=await e.get(`/api/card/${encodeURIComponent(t.cd_id)}`),i=Ji(r);if(i==="TEXT")return Gi(t.cd_id,r,t.columns,t.raw);let s=Zi(t.filters??[],is(r),i);if("unsupported"in s)return Hi("query_card_data",s.unsupported);let o=i==="CHART"?await Fi(e,t.cd_id,n,s.filters):await $i(e,tn(t.cd_id,i,n,s.filters)),{endpoint:a,requestBody:c}=o.requests[0],u=o.data,d=i==="CHART"?zi(y(u.chartMain)):Yi(u),p=sn(d.slice(0,n),t.columns);return E({summary:h({cd_id:t.cd_id,card_type:i,chart_type:i==="CHART"?R(y(r.content).chartType):void 0,row_count:p.length,truncated:os(i,u,p.length)}),columns:on(p),rows:p,diagnostic:{mode:Vi(i),card_type:i,endpoint:a,request_body:c,request_count:o.requests.length,request_bodies:o.requests.length>1?o.requests.map(_=>_.requestBody):void 0,raw_returned:t.raw===!0},raw:t.raw?o.raw:void 0})}catch(n){return G({status:"error",diagnostic:He("query_card_data",n)})}}function Gi(e,t,n,r){let i=y(t.content),s=Xi(i),o=sn(s?[{content:s}]:[],n);return E({summary:{cd_id:e,card_type:"TEXT",row_count:o.length,truncated:!1},columns:on(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 Hi(e,t){return E({status:"unsupported",diagnostic:{tool:e,...t}})}function Ji(e){let t=R(e.cdType).toUpperCase();if(t==="SELECTOR"){let n=R(y(e.content).selectorType).toUpperCase();return n==="TREE"||n==="TREE_SELECTOR"?"TREE_SELECTOR":"SELECTOR"}return t==="TREE_SELECTOR"?"TREE_SELECTOR":t==="TEXT"?"TEXT":"CHART"}function tn(e,t,n,r,i=0){let s=encodeURIComponent(e);return t==="SELECTOR"?{endpoint:`/api/selector/${s}/data`,requestBody:h({fieldQuery:{offset:0,limit:n},filters:r.length?r:void 0})}:t==="TREE_SELECTOR"?{endpoint:`/api/treeSelector/${s}/data`,requestBody:h({limit:n,filters:r.length?r:void 0})}:{endpoint:`/api/card/${s}/data`,requestBody:h({view:"GRID",isUniversalStructure:!0,offset:i>0?i:void 0,limit:n,filters:r.length?r:void 0})}}async function $i(e,t){let n=await e.post(t.endpoint,t.requestBody);return{raw:n,data:nn(n),requests:[t]}}async function Fi(e,t,n,r){let s=[],o=[],a,c=0,u,d=!1,p=!1;for(;c<n;){let b=Math.min(1e3,n-c),S=tn(t,"CHART",b,r,c);s.push(S);let P=await e.post(S.endpoint,S.requestBody);o.push(P);let Q=nn(P),ne=y(Q.chartMain);if(!Object.keys(ne).length)return{raw:P,data:Q,requests:s};a?Qi(y(a.chartMain),ne):a=as(Q);let ve=Ki(ne);c+=ve,u=We(ne.count)??u;let bt=Ke(ne.hasMoreData);if(p=bt!==void 0,d=bt??!1,ve===0||ve<b||u!==void 0&&c>=u||p&&!d)break}let _=a??{},I=y(_.chartMain);return Object.keys(I).length&&(I.offset=0,I.limit=n,I.hasMoreData=u!==void 0?c<u:d),{raw:o.length>1?{pages:o,merged:_}:o[0],data:_,requests:s}}function Vi(e){return e==="SELECTOR"?"selector_card_data":e==="TREE_SELECTOR"?"tree_selector_card_data":"chart_card_data"}function nn(e){let t=y(e),n=y(t.data),r=y(y(t.content).data);return Object.keys(n).length?n:Object.keys(r).length?r:t}function zi(e){if(!Object.keys(e).length)return[];let t=y(e.row),n=y(e.column),r=k(t.data??t.values),i=k(e.data),s=ae(t.fields??t.meta).map(Qe).filter(Boolean),o=Wi(n),a=cs([...s,...o]),c=Math.max(r.length,i.length),u=[];for(let d=0;d<c;d+=1){let p=[];p.push(...k(r[d]).map(Yt)),p.push(...k(i[d]).map(Yt)),p.length&&u.push(Object.fromEntries(p.map((_,I)=>[a[I]??`column_${I+1}`,_])))}return u}function Qi(e,t){Ve(e,t,"data");let n=y(e.row),r=y(t.row);Ve(n,r,"data"),Ve(n,r,"values")}function Ve(e,t,n){let r=k(t[n]);r.length&&(e[n]=[...k(e[n]),...r])}function Ki(e){let t=k(e.data);if(t.length)return t.length;let n=y(e.row);return k(n.data).length||k(n.values).length}function Wi(e){let n=k(e.data??e.values).map((r,i)=>{let s=k(r).map(rn).filter(Boolean).join("/");return s||Qe(ae(e.fields??e.meta)[i])||`metric_${i+1}`}).filter(Boolean);return n.length?n:ae(e.fields??e.meta).map(Qe).filter(Boolean)}function Yi(e){return ae(e.result)}function Xi(e){let n=k(y(e.body).blocks).map(r=>R(y(r).text)).filter(r=>r!=="");return n.length?n.join(`
5
+ `):R(e.text)}function Zi(e,t,n){let r=[];for(let i of e){let s=ns(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"?ts(s.field.metaType):void 0,filterType:i.operator,filterValue:es(i)}))}return{filters:r}}function es(e){return ze.has(e.operator)?[]:(e.values??[]).map(R)}function ts(e){return e.toUpperCase()==="METRIC"?"AGGREGATION":"DETAIL"}function ns(e,t,n){let r=rs(e,t,n);if(!r)return{unsupported:{capability:"unsupported_filter_field",parameter:t,message:`\u7B5B\u9009\u5B57\u6BB5\u65E0\u6CD5\u4ECE\u5F53\u524D\u5361\u7247\u4E0A\u4E0B\u6587\u89E3\u6790\uFF1A${t}`,supported_fields:e.map(u=>h({name:R(u.name),fd_id:R(u.fd_id),meta_type:R(u.meta_type)}))}};let i=R(r.name),s=R(r.fd_id),o=R(r.fd_type),a=R(r.meta_type).toUpperCase(),c=[i?void 0:"name",s?void 0:"fdId",o?void 0:"fdType",a?void 0:"metaType"].filter(u=>!!u);return c.length?{unsupported:{capability:"unsupported_filter_field",parameter:t,message:`\u7B5B\u9009\u5B57\u6BB5\u7F3A\u5C11\u5FC5\u8981 BI \u5143\u4FE1\u606F\uFF1A${t}`,missing_metadata:c}}:{field:{name:i,fdId:s,fdType:o,metaType:a}}}function rs(e,t,n){if(n){let i=e.find(s=>R(s.fd_id)===n||R(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(R).includes(r))}function is(e){let t=y(e.content),n=[],r=y(y(t.source).field);Object.keys(r).length&&n.push(Kt(r));let i=y(y(t.meta).chartMain),s=y(i.zoneData);for(let[o,a]of Object.entries(s))n.push(...ae(a).map(c=>Kt(c,o)));return ss(n)}function Kt(e,t){return h({name:L(e.name,e.title,e.originTitle,e.alias),alias:L(e.alias,e.title),id:R(e.id),fd_id:L(e.fdId,e.fd_id,e.id),fd_type:L(e.fdType,e.fd_type),meta_type:L(e.metaType,e.meta_type),zone_id:L(e.zoneId,e.zone_id,t)})}function ss(e){let t=new Set;return e.filter(n=>{let r=L(n.fd_id,n.id,n.name,n.alias);return!r||t.has(r)?!1:(t.add(r),!0)})}function os(e,t,n){if(e==="SELECTOR"||e==="TREE_SELECTOR")return Ke(t.exceedLimit)?!0:Wt(t,n);let r=y(t.chartMain);return Ke(r.hasMoreData)?!0:Wt(r,n)}function Wt(e,t){let n=We(e.count),r=We(e.limit);return n!==void 0&&r!==void 0&&r>0?n>r:n!==void 0&&n>t}function Qe(e){return L(e.alias,e.title,e.originTitle,e.name,e.fdId,e.id)??""}function rn(e){let t=y(e);return Object.keys(t).length?L(t.title,t.name,t.originTitle,t.alias,t.v,t.value)??"":R(e)}function Yt(e){let t=y(e);return Object.keys(t).length?"v"in t?t.v:"value"in t?t.value:rn(e):e}function ae(e){return Array.isArray(e)?e.map(y).filter(t=>Object.keys(t).length):[]}function k(e){return Array.isArray(e)?e:[]}function as(e){return JSON.parse(JSON.stringify(e))}function y(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function R(e){return typeof e=="string"?e:e==null?"":String(e)}function L(...e){return e.map(R).find(t=>t.trim())?.trim()}function Ke(e){return typeof e=="boolean"?e:void 0}function We(e){return typeof e=="number"&&Number.isFinite(e)?e:void 0}function sn(e,t){return t?.length?e.map(n=>Object.fromEntries(t.map(r=>[r,n[r]]))):e}function on(e){return[...new Set(e.flatMap(t=>Object.keys(t)))]}function cs(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 us}from"crypto";import{z as f}from"zod";var ds=6e4,$=1e4,an=10*6e4,Be=new Map,we=new Map,Ye=new Map,Xe=new Map,cn=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")}),un={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()},dn={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()},fa={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:cn.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()},ln={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()},pn={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:cn.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()},mn={is_insight:f.boolean().optional().describe("\u662F\u5426\u53EA\u5217\u51FA\u6D1E\u5BDF\u4E3B\u9898\u3002")},fn={theme_id:f.string().min(1).optional().describe("ChatBI \u4E3B\u9898 ID\u3002"),theme_name:f.string().min(1).optional().describe("ChatBI \u4E3B\u9898\u540D\u79F0\u3002"),message:f.string().min(1).describe("\u81EA\u7136\u8BED\u8A00\u95EE\u6570\u95EE\u9898\u3002"),session_id:f.string().min(1).optional().describe("\u53EF\u9009\u4F1A\u8BDD ID\uFF0C\u7528\u4E8E\u95EE\u6570\u7EED\u95EE\u3002\u540C\u4E00\u4E2A session_id \u53EA\u80FD\u7EE7\u7EED\u95EE\u6570\uFF0C\u4E0D\u80FD\u518D\u7528\u4E8E\u6D1E\u5BDF\u3002"),external_context:f.string().min(1).optional().describe("\u53EF\u9009\u5916\u90E8\u4E0A\u4E0B\u6587\u3002")},ga={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")},gn={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")},_n={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 hn(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 Re(n,r,"listThemes")}}async function In(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 Re(n,r,"query")}}async function bn(e,t){let n=new v(e);try{let r=Tn({caller_scope:Cn(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=ls(r);if(i)return E({...i,deduped:!0,retry_after_ms:$,next_action:"\u540C\u4E00\u6D1E\u5BDF\u95EE\u9898\u521A\u521A\u5DF2\u7ECF\u53D1\u8D77\uFF0C\u5DF2\u590D\u7528\u5DF2\u6709 message_id\u3002\u8BF7\u4F7F\u7528 chatbi_insight_poll \u67E5\u8BE2\u7ED3\u679C\u3002"});let s=Ye.get(r);if(s){let c=await s;return E({...c,deduped:!0,retry_after_ms:$,next_action:"\u540C\u4E00\u6D1E\u5BDF\u95EE\u9898\u6B63\u5728\u53D1\u8D77\u4E2D\uFF0C\u5DF2\u590D\u7528\u5DF2\u6709\u8BF7\u6C42\u7ED3\u679C\u3002\u8BF7\u4F7F\u7528 chatbi_insight_poll \u67E5\u8BE2\u7ED3\u679C\u3002"})}let o=n.startInsight({themeId:t.theme_id,themeName:t.theme_name,message:t.message,sessionId:t.session_id,externalContext:t.external_context}).then(c=>{let u={theme_id:c.theme_id,message_id:c.message_id,session_id:c.session_id,status:"started"};return ps(r,u),u}).finally(()=>{Ye.delete(r)});Ye.set(r,o);let a=await o;return E({...a,deduped:!1,retry_after_ms:$,next_action:"\u6D1E\u5BDF\u4EFB\u52A1\u5DF2\u53D1\u8D77\u3002\u6D1E\u5BDF\u901A\u5E38\u8017\u65F6 2-3 \u5206\u949F\uFF0C\u8BF7\u4F7F\u7528 chatbi_insight_poll \u643A\u5E26 theme_id \u548C message_id \u67E5\u8BE2\u7ED3\u679C\uFF1B5 \u5206\u949F\u540E\u4ECD\u672A\u6210\u529F\u53EF\u89C6\u4E3A\u8D85\u65F6\u3002",resolved_base_url:n.getResolvedBaseUrl(),tried_base_urls:n.getTriedBaseUrls()})}catch(r){return Re(n,r,"insight.start")}}async function yn(e,t){let n=new v(e);try{let r=Tn({caller_scope:Cn(e),message_id:t.message_id}),i=ms(r);if(i){let p=Ze(i.result),_=tt(i.result,!0);return E({message_id:i.result.message_id,session_id:i.result.session_id,status:i.result.status,detail:et(i.result),question:i.result.question,answer:i.result.answer,throttled:!0,retry_after_ms:i.retryAfterMs,...p,next_action:_})}let s=Xe.get(r);if(s){let p=await s,_=rt(p.status),I=Ze(p),b=tt(p,!0);return E({message_id:p.message_id,session_id:p.session_id,status:p.status,detail:et(p),question:p.question,answer:p.answer,throttled:!0,retry_after_ms:_?0:$,...I,next_action:b})}let o=n.pollInsight({themeId:t.theme_id,themeName:t.theme_name,messageId:t.message_id}).then(p=>(fs(r,p),p)).finally(()=>{Xe.delete(r)});Xe.set(r,o);let a=await o,c=rt(a.status),u=Ze(a),d=tt(a,!1);return E({message_id:a.message_id,session_id:a.session_id,status:a.status,detail:et(a),question:a.question,answer:a.answer,throttled:!1,retry_after_ms:c?0:$,...u,next_action:d,resolved_base_url:n.getResolvedBaseUrl(),tried_base_urls:n.getTriedBaseUrls()})}catch(r){return Re(n,r,"insight.poll")}}function Ze(e){return e.status!=="success"?{}:{final_result:{format:"markdown",content:En(e)}}}function et(e){return e.detail!=null?e.detail:e.status==="failure"||e.status==="stopped"?gs(e):e.detail}function tt(e,t){if(e.status!=="success")return e.status==="waiting"?t?"\u540C\u4E00 message_id \u6B63\u5728\u67E5\u8BE2\u4E2D\u6216\u521A\u521A\u67E5\u8BE2\u8FC7\uFF0C\u5DF2\u8FD4\u56DE\u5DF2\u6709\u7ED3\u679C\uFF1B\u8BF7\u81F3\u5C11\u95F4\u9694 10 \u79D2\u518D\u67E5\u3002":"\u6D1E\u5BDF\u4EFB\u52A1\u4ECD\u5728\u6267\u884C\u4E2D\uFF0C\u8BF7\u7A0D\u540E\u7EE7\u7EED\u8C03\u7528 chatbi_insight_poll \u67E5\u8BE2\u7ED3\u679C\u3002":e.status==="failure"||e.status==="stopped"?"\u6D1E\u5BDF\u4EFB\u52A1\u672A\u6210\u529F\u5B8C\u6210\uFF0C\u8BF7\u67E5\u770B detail\uFF1B\u5982\u9700\u91CD\u8BD5\u8BF7\u91CD\u65B0\u8C03\u7528 chatbi_insight_start\u3002":"\u6D1E\u5BDF\u4EFB\u52A1\u5904\u4E8E\u975E\u6210\u529F\u72B6\u6001\uFF0C\u8BF7\u67E5\u770B status \u548C detail \u540E\u51B3\u5B9A\u662F\u5426\u7EE7\u7EED\u67E5\u8BE2\u3002"}function ls(e){Se();let t=Be.get(e);if(!(!t||Date.now()-t.createdAt>=ds))return t.result}function ps(e,t){Se(),Be.set(e,{createdAt:Date.now(),result:t})}function ms(e){Se();let t=we.get(e);if(!t)return;let n=Date.now()-t.checkedAt,r=rt(t.result.status);if(!(!r&&n>=$))return{result:t.result,retryAfterMs:r?0:Math.max(0,$-n)}}function rt(e){return e==="success"||e==="failure"||e==="stopped"}function fs(e,t){Se(),we.set(e,{checkedAt:Date.now(),result:t})}function Se(){let e=Date.now();for(let[t,n]of Be)e-n.createdAt>=an&&Be.delete(t);for(let[t,n]of we)e-n.checkedAt>=an&&we.delete(t)}function Tn(e){return JSON.stringify(Object.keys(e).sort().reduce((t,n)=>{let r=e[n];return typeof r<"u"&&(t[n]=r),t},{}))}function Cn(e){return e.BI_PAT?`pat:${nt(e.BI_PAT)}`:e.BI_UID_TOKEN?`uid:${nt(e.BI_UID_TOKEN)}`:`login:${nt(`${e.BI_LOGIN_DOMAIN??""}\0${e.BI_LOGIN_ID??""}`)}`}function nt(e){return us("sha256").update(e).digest("hex").slice(0,16)}function En(e){let t=e.answer?.trim();if(t)return ys(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 gs(e){switch(e.status){case"success":return En(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 _s(e,t){let n=[`| ${e.join(" | ")} |`,`|${e.map(()=>" --- ").join("|")}|`];for(let r of t)n.push(`| ${e.map((i,s)=>Is(hs(r[s]))).join(" | ")} |`);return n.join(`
6
+ `)}function hs(e){return e===null||typeof e>"u"||e===""?"-":String(e)}function Is(e){return e.replaceAll(`\r
7
7
  `,"<br>").replaceAll(`
8
- `,"<br>").replaceAll("\r","<br>").replaceAll("|","\\|")}function fs(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 gs(e){let t=/```GuanViz\.json\n([\s\S]*?)\n```/g;return e.replace(t,(n,r)=>_s(r)??n)}function _s(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=Is(t.viz_config),o=ys(i,r,s),a=r.map(d=>i.map((p,g)=>bs(d[g],s.get(p),o.get(p)))),c=ls(i,a),u=fs(!!t.data_info?.truncated,t.data_info?.row_limit);return u?`${c}
8
+ `,"<br>").replaceAll("\r","<br>").replaceAll("|","\\|")}function bs(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 ys(e){let t=/```GuanViz\.json\n([\s\S]*?)\n```/g;return e.replace(t,(n,r)=>Ts(r)??n)}function Ts(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=Es(t.viz_config),o=Bs(i,r,s),a=r.map(d=>i.map((p,_)=>ws(d[_],s.get(p),o.get(p)))),c=_s(i,a),u=bs(!!t.data_info?.truncated,t.data_info?.row_limit);return u?`${c}
9
9
 
10
- ${u}`:c}catch{return}}var et=new Map([["k",1e3],["K",1e3],["M",1e6],["B",1e9],["\u4E07",1e4],["\u4EBF",1e8]]),hs=[[1e8,"\u4EBF"],[1e4,"\u4E07"]];function Is(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 ys(e,t,n){let r=new Map;for(let[i,s]of e.entries()){let o=n.get(s);if(o?.prefixUnit!=="auto")continue;let a=0;for(let u of t){let d=bn(u[i]);typeof d=="number"&&(a=Math.max(a,Math.abs(d/Tn(o))))}let c=Bs(a);c&&r.set(s,c)}return r}function bs(e,t,n){if(!t)return e;let r=bn(e);return typeof r!="number"?e:Ts(r,t,n)}function bn(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 Ts(e,t,n){let r=Tn(t),{unit:i,shouldScale:s}=Cs(t,n),o=s&&i?et.get(i)??1:1,a=e/r/o,c=Es(t.decimalPlaces),u=t.useThousandsSeparator?a.toLocaleString("en-US",{minimumFractionDigits:c,maximumFractionDigits:c}):a.toFixed(c),d=i&&t.showPrefixUnit!==!1?i:"",p=t.showSuffix===!1||typeof t.suffix!="string"?"":t.suffix;return`${u}${d}${p}`}function Tn(e){if(e.showPrefixUnit!==!1&&typeof e.prefixUnit=="string"&&e.prefixUnit!=="auto"&&et.has(e.prefixUnit))return 1;let t=Number(e.divideDataBy??1);return Number.isFinite(t)&&t!==0?t:1}function Cs(e,t){return e.showPrefixUnit===!1?{unit:"",shouldScale:!1}:e.prefixUnit==="auto"?{unit:t??"",shouldScale:!0}:typeof e.prefixUnit=="string"&&et.has(e.prefixUnit)?{unit:e.prefixUnit,shouldScale:!0}:{unit:"",shouldScale:!1}}function Es(e){return typeof e!="number"||!Number.isFinite(e)?2:Math.max(0,Math.min(100,Math.trunc(e)))}function Bs(e){return hs.find(([t])=>e>=t)?.[1]??""}function Ce(e,t,n){let r=ws(e,t,n);return q({error:"chatbi_request_failed",requested_operation:n,...r,tried_base_urls:r.tried_base_urls??e.getTriedBaseUrls()})}function ws(e,t,n){return t instanceof O?t.detail:e.getLastError()??{operation:n,detail:t instanceof Error?t.message:String(t)}}import{z as tt}from"zod";var Cn={dsId:tt.string().min(1).describe("\u6570\u636E\u96C6 ID\u3002")},En={cdId:tt.string().min(1).describe("\u5361\u7247 ID\u3002")},Bn={pageId:tt.string().min(1).describe("\u9875\u9762/\u4EEA\u8868\u677F ID\u3002")};async function wn(e,t){let n=await e.get(`/api/data-source/${encodeURIComponent(t.dsId)}`);return M(n)}async function Sn(e,t){let n=await e.get(`/api/card/${encodeURIComponent(t.cdId)}`);return M(n)}async function Rn(e,t){let n=await e.get(`/api/page/${encodeURIComponent(t.pageId)}`);return M(n)}import{z as N}from"zod";var Ss=N.object({name:N.string().min(1),query:N.string().min(1)}),On={query:N.string().min(1).describe("\u8981\u6267\u884C\u7684\u67E5\u8BE2 SQL\u3002FROM \u540E\u5199\u6570\u636E\u96C6\u540D\u79F0/name\uFF1B\u4E2D\u6587\u6216\u7279\u6B8A\u5B57\u7B26\u540D\u79F0\u7528\u53CD\u5F15\u53F7\u3002\u652F\u6301\u5355\u8868\u6216\u591A\u8868\u8054\u67E5\uFF0C\u4EC5\u9650\u67E5\u8BE2\u8BED\u53E5\uFF0C\u5EFA\u8BAE\u663E\u5F0F\u5199 LIMIT\u3002\u591A\u8868\u8054\u67E5\u8981\u6C42\u53C2\u4E0E\u7684\u6570\u636E\u96C6\u8981\u4E48\u5747\u4E3A\u62BD\u53D6\u6570\u636E\u96C6\uFF0C\u8981\u4E48\u5747\u4E3A\u6765\u81EA\u540C\u4E00\u6570\u636E\u8D26\u6237\u548C\u6570\u636E\u5E93\u7684\u76F4\u8FDE\u6570\u636E\u96C6\u3002"),inputs:N.array(N.string().min(1)).min(1).describe("SQL \u67E5\u8BE2\u4F9D\u8D56\u7684\u6570\u636E\u96C6 ID \u5217\u8868\uFF0C\u7528\u4E8E BI \u7ED1\u5B9A/\u6388\u6743\u6570\u636E\u96C6\uFF1B\u5355\u8868\u67E5\u8BE2\u4F20 1 \u4E2A\uFF0C\u591A\u8868\u8054\u67E5\u4F20\u591A\u4E2A\u3002\u591A\u8868\u8054\u67E5\u8981\u6C42\u8FD9\u4E9B\u6570\u636E\u96C6\u8981\u4E48\u5747\u4E3A\u62BD\u53D6\uFF0C\u8981\u4E48\u5747\u4E3A\u6765\u81EA\u540C\u4E00\u6570\u636E\u8D26\u6237\u548C\u6570\u636E\u5E93\u7684\u76F4\u8FDE\u3002"),queryStructure:N.object({ctes:N.array(Ss).optional(),mainQuery:N.string().optional()}).optional().describe("\u7ED3\u6784\u5316\u67E5\u8BE2\u4FE1\u606F\uFF0C\u53EF\u7528\u4E8E\u62C6\u5206 CTE \u548C\u4E3B\u67E5\u8BE2\u3002")};async function An(e,t,n){try{await At(e,t,"executeSqlQuery");let r=await e.post("/api/data-source/execute-sql-query",{...n,limit:t.BI_MAX_ROWS});return M({maxRowsHint:t.BI_MAX_ROWS,result:r})}catch(r){if(Rs(r))return Ie("execute_sql_query",r,{hint:"\u8BF7\u5728\u7BA1\u7406\u540E\u53F0 -> \u9AD8\u7EA7\u8BBE\u7F6E -> \u5BF9\u5E94\u57DF\u540D\u4E0B\uFF0C\u6253\u5F00\u9AD8\u7EA7SQL\u67E5\u8BE2\u529F\u80FD\u3002"});throw r}}function Rs(e){return e instanceof Error&&e.message.includes("POST /api/data-source/execute-sql-query HTTP 404")}import{z as U}from"zod";var kn={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 Pn(e,t){let{cardType:n,...r}=t,i={...r,specificResourceFilters:n?{cardType:n}:void 0},s=await e.post("/api/global-search",i);return M(s)}import{z as m}from"zod";var at=m.enum(["asc","desc"]),Os=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"]),vn=new Set(["BT","CLOSE_BT_OPEN","OPEN_BT_CLOSE","OPEN_BT_OPEN"]),rt=new Set(["IS_NULL","NOT_NULL"]),qn=m.object({field:m.string().min(1).describe("\u7B5B\u9009\u5B57\u6BB5\u540D\u79F0\u6216\u5B57\u6BB5 ID\u3002"),operator:Os.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;rt.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`}),vn.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`}),!vn.has(e.operator)&&!rt.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`})}),As=m.object({field:m.string().min(1).describe("\u6392\u5E8F\u5B57\u6BB5\u540D\u79F0\u6216\u5B57\u6BB5 ID\u3002"),direction:at.describe("\u6392\u5E8F\u65B9\u5411\u3002")}),ks=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:at.optional(),rank_dim:m.string().min(1).optional()}),Gn={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")},Hn={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")},Jn={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")},$n={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(qn).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(As).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:ks.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")},Fn={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")},Vn={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")},zn={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(qn).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:at.optional().default("desc").describe("\u6309\u8D21\u732E\u503C\u6392\u5E8F\u65B9\u5411\u3002"),raw:m.boolean().optional().describe("\u662F\u5426\u8FD4\u56DE\u539F\u59CB\u54CD\u5E94\u3002")},G={summary:m.unknown().optional(),items:m.array(m.unknown()).optional(),tree:m.unknown().optional(),detail:m.unknown().optional(),columns:m.array(m.unknown()).optional(),rows:m.array(m.unknown()).optional(),raw:m.unknown().optional(),diagnostic:m.unknown().optional(),status:m.string().optional()};async function Qn(e,t,n){let r=new D(e,t);try{let i=n.project_id?[n.project_id]:await Ps(r),s=[];for(let a of i){let c=await r.searchMetrics({projectId:a,dirId:n.dir_id,keyword:n.keyword,status:n.status,subTypes:n.sub_types,orderBy:n.order_by});if(s.push(...vs(c)),s.length>=n.limit)break}let o=ro(s.map(it),"metric_id").slice(0,n.limit);return C({summary:{keyword:n.keyword,project_id:n.project_id,count:o.length,searched_project_count:i.length,truncated:o.length<s.length},items:o})}catch(i){return V(i,"search_metrics")}}async function Kn(e,t,n){let r=new D(e,t);try{try{let i=await r.listMetricFullTree({projectId:n.project_id,keyword:n.keyword});return C({summary:{source:"full-tree"},tree:Ms(i),raw:n.raw?i:void 0})}catch(i){let s=n.project_id?[{id:n.project_id}]:await tr(r),o=[];for(let a of s){let c=l(a.id);if(!c)continue;let u=await r.listMetricDirectoryTree(c);o.push({id:c,name:l(a.name)||c,type:"project",project_id:c,children:Ds(u,c)})}return C({summary:{source:"directory-fallback",fallback_reason:i instanceof Error?i.message:String(i)},tree:o})}}catch(i){return V(i,"list_metric_catalog")}}async function Yn(e,t,n){let r=new D(e,t);try{let i=await r.getMetricDetail(n.metric_id),s=Us(i),o,a;if(!n.brief){let c=l(i.uniformResourceType)||"METRIC_PLATFORM_METRIC";try{o=js(await r.getMetricLineage(n.metric_id,c))}catch(u){a=u instanceof J?u.detail:String(u)}}return C({detail:{...s,lineage:o,lineage_error:a},raw:n.raw?i:void 0})}catch(i){return V(i,"get_metric_detail")}}async function Wn(e,t,n){let r=new D(e,t);try{let i=await r.getMetricDetail(n.metric_id);if(!n.advanced_calc){let a=Mn(i,n);if("unsupported"in a)return x("query_metric_data",a.unsupported);let c=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 Ns(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=Mn(i,{...n,combine_type:"AND",filters:[I]});if("unsupported"in y)return x("query_metric_data",y.unsupported);let{raw:S}=await c(y.body);g.push(S),p.push(...Dn(S))}return Ee(i,p,n,{mode:"metric_card_preview_data",card_id:a.cardId,card_kind:a.cardKind,combine_type:"OR",query_count:g.length},n.raw?g:void 0)}let{raw:u,sessionId:d}=await c(a.body);return Ee(i,Dn(u),n,{mode:"metric_card_preview_data",card_id:a.cardId,card_kind:a.cardKind,session_id:d,request_body:a.body},n.raw?u:void 0)}let s=xn(i,n);if("unsupported"in s)return x("query_metric_data",s.unsupported);if(n.combine_type==="OR"&&(n.filters?.length??0)>1){let a=[],c=[];for(let u of n.filters??[]){let d=xn(i,{...n,combine_type:"AND",filters:[u]});if("unsupported"in d)return x("query_metric_data",d.unsupported);let p=await r.queryMetricData(d.input);c.push(p),a.push(...ie(p))}return Ee(i,a,n,{mode:"metric_data_v2",combine_type:"OR",query_count:c.length},n.raw?c:void 0)}let o=await r.queryMetricData(s.input);return Ee(i,ie(o),n,{mode:"metric_data_v2",request_body:s.input},n.raw?o:void 0)}catch(i){return no(i)?x("query_metric_data",{capability:"metric_data_v2_unavailable",message:"\u5F53\u524D BI \u73AF\u5883\u672A\u63D0\u4F9B /api/metric-platform/metric-data/v2\uFF0C\u65E0\u6CD5\u6267\u884C\u9AD8\u7EA7\u8BA1\u7B97\u67E5\u8BE2\u3002",diagnostic:i.detail}):V(i,"query_metric_data")}}async function Xn(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=xs(i).map(or).slice(0,n.limit);return C({summary:{keyword:n.keyword,count:s.length},items:s})}catch(i){return V(i,"search_metric_trees")}}async function Zn(e,t,n){let r=new D(e,t);try{let i=await r.getMetricTreeDetail(n.metric_tree_id);return C({detail:Fs(i),raw:n.raw?i:void 0})}catch(i){return V(i,"get_metric_tree_detail")}}async function er(e,t,n){let r=new D(e,t);try{if(n.target==="dimension"&&!n.dimension&&!n.dimension_fd_id)return x("query_metric_tree_attribution",{capability:"dimension_attribution_requires_dimension",message:"target=dimension \u65F6\u5FC5\u987B\u6307\u5B9A dimension \u6216 dimension_fd_id\u3002"});let i=await r.getMetricTreeDetail(n.metric_tree_id),s=l(i.metricId);if(!s)return x("query_metric_tree_attribution",{capability:"missing_root_metric",message:"\u6307\u6807\u6811\u8BE6\u60C5\u7F3A\u5C11\u6839\u6307\u6807 ID\uFF0C\u65E0\u6CD5\u6267\u884C\u5F52\u56E0\u3002"});let o=await r.getMetricDetail(s),a=se(o),c=ct(n.filters??[],a);if("unsupported"in c)return x("query_metric_tree_attribution",c.unsupported);let u=c.filters,d=Vs(i,n);if("unsupported"in d)return x("query_metric_tree_attribution",d.unsupported);if(n.target==="metric"){let y=zs(i,d.value,u),S=await r.queryMetricTreeDecompose(n.metric_tree_id,y);return nt(i,"metric",Qs(S),n,n.raw?S:void 0)}if(n.target==="dimension"){let y=Y(a,n.dimension,n.dimension_fd_id);if(!y)return x("query_metric_tree_attribution",{capability:"unknown_dimension",message:`\u7EF4\u5EA6\u4E0D\u5B58\u5728\u6216\u4E0D\u9002\u7528\u4E8E\u6839\u6307\u6807\uFF1A${n.dimension??n.dimension_fd_id}`});let S=jn(i,y,d.value,u,n.limit,n.sort),P=await r.queryMetricTreeDrill(n.metric_tree_id,S);return nt(i,"dimension",Nn(P,l(y.name)),n,n.raw?P:void 0)}let p=Ks(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 y of p){let S=jn(i,y,d.value,u,n.group_limit,n.sort),P=await r.queryMetricTreeDrill(n.metric_tree_id,S);I.push({dimension:l(y.name),raw:P}),g.push(...Nn(P,l(y.name)).slice(0,n.group_limit))}return nt(i,"scan",g,n,n.raw?I:void 0,{scanned_dimensions:p.map(y=>l(y.name))})}catch(i){return V(i,"query_metric_tree_attribution")}}async function Ps(e){return(await tr(e)).map(t=>l(t.id)).filter(Boolean)}async function tr(e){return w(await e.listProjects()).map(_).filter(Boolean)}function vs(e){let t=_(e);return w(t.contents??t.items??t.data)}function xs(e){let t=_(e);return w(t.data??t.contents??t.items)}function it(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:ur(e.dsInfo),statistics:e.statisticsData,creator:we(e.creator),business_owner:we(e.businessOwner),updated_at:l(e.utime),raw:e})}function Ms(e){return w(e).map(t=>nr(t,void 0))}function nr(e,t){let n=!!e.isMetric,r=l(e.id),i=!t&&!n?r:t;return h({id:r,name:l(e.name),type:n?"metric":t?"directory":"project",project_id:i,dir_id:!n&&t?r:void 0,metric_id:n?r:void 0,parent_id:l(e.parentId),children:w(e.children).map(s=>nr(s,i))})}function Ds(e,t){let n=_(e);return l(n.id)?[st(n,t)]:w(n.contents??n.children).map(r=>st(r,t))}function st(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:Ln(e.metricCnt),all_metric_count:Ln(e.allMetricCnt),children:w(e.contents??e.children).map(n=>st(n,t))})}function Us(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:dr(e.dirPath),dataset:ur(e.dsInfo),source_fields:w(e.fdInfos).map(Be),aggregation:B(e.aggrType,e.aggregationType),formula:B(e.formula,e.expression),derive_setting:e.deriveSetting,format:e.format,applicable_dimensions:se(e),time_dimension:_(e.timeDim)?Be(_(e.timeDim)):void 0,business_attributes:w(e.bizAttrs).map(to),business_owner:we(e.businessOwner),creator:we(e.creator),referenced_metrics:w(e.referencedMetrics).map(it),base_metric:_(e.baseMetric)?it(_(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 js(e){let t=_(e);return h({current:t.crtNode,upstream:t.backwardAtlas,downstream:t.forwardAtlas})}function xn(e,t){let n=l(e.name),r=l(e.projectId);if(!n||!r)return{unsupported:{capability:"metric_detail_incomplete",message:"\u6307\u6807\u8BE6\u60C5\u7F3A\u5C11 name \u6216 projectId\u3002"}};let i=se(e),s=[...i,...ar(e)],o=[];for(let d of t.dimensions??[]){let p=Y(i,d);if(!p)return{unsupported:{capability:"unsupported_dimension",parameter:d,supported_dimensions:i}};o.push(Ys(p))}let a=qs(e,i,t.advanced_calc);if("unsupported"in a)return{unsupported:a.unsupported};let c=ct(t.filters??[],s);if("unsupported"in c)return{unsupported:c.unsupported};let u=rr(t.sort??[],s);return"unsupported"in u?{unsupported:u.unsupported}:{input:{projectId:r,metricId:t.metric_id,metricName:n,metricItems:[h({name:n,alias:Gs(n,t.advanced_calc),advCalc:a.value})],dimensions:o,filters:c.filters,sorting:u.sorting,limit:t.limit}}}function Mn(e,t){let n=_(e.metricChartConfig),r=l(n.metricChartCdId),i=l(n.metricValueCdId),s=r||i;if(!s)return{unsupported:{capability:"missing_metric_card",message:"\u6307\u6807\u8BE6\u60C5\u7F3A\u5C11 metricChartConfig.metricChartCdId \u6216 metricValueCdId\uFF0C\u65E0\u6CD5\u8D70\u53EA\u8BFB\u5361\u7247\u53D6\u6570\u3002"}};let o=[...se(e),...ar(e)],a=[];for(let g of t.dimensions??[]){let I=Y(o,g);if(!I||l(I.meta_type).toUpperCase()==="METRIC")return{unsupported:{capability:"unsupported_dimension",parameter:g,supported_dimensions:se(e)}};a.push(Ws(I))}let c=ct(t.filters??[],o);if("unsupported"in c)return{unsupported:c.unsupported};let u=c.filters,d=rr(t.sort??[],o);if("unsupported"in d)return{unsupported:d.unsupported};let p=d.sorting;return{cardId:s,cardKind:r?"chart":"value",dimensions:a,body:h({limit:t.limit,filters:u.length?u:void 0,combineType:t.filters?.length?t.combine_type:void 0,sorting:p.length?p:void 0})}}async function Ns(e,t,n,r){let i=lr(await e.getCardEditMeta(t))??{},s=Ls(i);s.row=r,s.sorting=[],await e.modifyCardEditMeta(t,n,i)}function Ls(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 qs(e,t,n){if(!n)return{value:void 0};let r=_(e.timeDim),i=l(r?.fdId);if(["compare","last"].includes(n.type)&&!i)return{unsupported:{capability:"advanced_calc_requires_time_dimension",parameter:n.type}};if(n.type==="compare"){let a=n.compare??"yoy",c={yoy:["YEAR","YEAR"],mom:["MONTH","MONTH"],qoq:["QUARTER","QUARTER"],wow:["WEEK","WEEK"],dod:["DAY","DAY"]},[u,d]=c[a];return{value:{advType:"COMPARATIVE",advValue:{advType:"COMPARATIVE",dateFdId:i,valueType:(n.compare_value??"value").toUpperCase(),offset:1,offsetType:u,granularity:d}}}}if(n.type==="xtd")return{value:{advType:"XTD",advValue:{advType:"XTD",granularity:{ytd:"YEAR",qtd:"QUARTER",mtd:"MONTH",wtd:"WEEK",dtd:"DAY"}[n.xtd??"ytd"],includeCurrentValue:!0}}};if(n.type==="last")return{value:{advType:"LAST",advValue:{advType:"LAST",dateFdId:i}}};if(n.type==="recent"){let a=Hs(n.recent??"7d");return a?{value:{advType:"RECENT_X",advValue:{advType:"RECENT_X",granularity:a.granularity,baselineOffset:[a.count-1,0],includeCurrentValue:!0,baseline:n.recent_base}}}:{unsupported:{capability:"invalid_recent_spec",parameter:n.recent}}}if(n.type==="percentage"){let a=n.percentage_dim?Y(t,n.percentage_dim):void 0;return n.percentage_dim&&!a?{unsupported:{capability:"unknown_percentage_dimension",parameter:n.percentage_dim}}:{value:{advType:"LEVEL_PERCENTAGE",advValue:h({advType:"LEVEL_PERCENTAGE",auto:!a,tfdId:l(a?.fd_id)})}}}let o=n.rank_dim?Y(t,n.rank_dim):void 0;return n.rank_dim&&!o?{unsupported:{capability:"unknown_rank_dimension",parameter:n.rank_dim}}:{value:{advType:"RANK",advValue:h({advType:"RANK",calDimension:"FIELD",rankType:"RANK",sorting:(n.rank_order??"desc").toUpperCase(),tfdId:l(o?.fd_id),topN:{topType:"CUSTOM_NUMBER",count:n.rank_top??10,calculationType:"COUNT"}})}}}function Gs(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 Hs(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 ct(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:Js(r)}))}return{filters:n}}function Js(e){return rt.has(e.operator)?[]:e.values??[]}function rr(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=Y(e,t,n),s=r==="filter"?"unsupported_filter_field":"unsupported_sort_field",o=r==="filter"?"\u7B5B\u9009":"\u6392\u5E8F";if(!i)return{unsupported:{capability:s,parameter:t,message:`${o}\u5B57\u6BB5\u65E0\u6CD5\u4ECE\u5F53\u524D\u67E5\u8BE2\u4E0A\u4E0B\u6587\u89E3\u6790\uFF1A${t}`,supported_fields:e.map(g=>h({name:l(g.name),fd_id:l(g.fd_id),meta_type:l(g.meta_type)}))}};let a=l(i.name),c=l(i.fd_id),u=l(i.fd_type),d=l(i.meta_type).toUpperCase(),p=[a?void 0:"name",c?void 0:"fdId",u?void 0:"fdType",d?void 0:"metaType"].filter(g=>!!g);return p.length?{unsupported:{capability:s,parameter:t,message:`${o}\u5B57\u6BB5\u7F3A\u5C11\u5FC5\u8981 BI \u5143\u4FE1\u606F\uFF1A${t}`,missing_metadata:p}}:{field:{name:a,fdId:c,fdType:u,metaType:d}}}function Ee(e,t,n,r,i){let s=Xs(t.slice(0,n.limit),n.columns);return C({summary:{metric_id:n.metric_id,metric_name:l(e.name),row_count:s.length,truncated:t.length>s.length},columns:cr(s),rows:s,diagnostic:r,raw:i})}function ie(e){let t=_(e),n=_(t.data)??t,r=w(n.values??n.rows??t.values??t.rows);if(r.length)return r;let i=w(n.columns??t.columns).map(o=>l(_(o)?.name??o)).filter(Boolean),s=w(n.preview??n.contents);return i.length?s.map(o=>{let a=Array.isArray(o)?o:[];return Object.fromEntries(i.map((c,u)=>[c,a[u]]))}):s}function Dn(e){let t=_(e),n=_(t.data)??t,r=_(n.chartMain??t.chartMain??_(_(t.content).data).chartMain);if(!Object.keys(r).length)return ie(e);let i=_(r.row),s=_(r.column),o=w(i.fields),a=F(i.data),c=F(r.data),u=$s(s),d=o.map(ot).filter(Boolean),p=Zs([...d,...u]),g=Math.max(a.length,c.length),I=[];for(let y=0;y<g;y+=1){let S=[];S.push(...F(a[y]).map(Un)),S.push(...F(c[y]).map(Un)),S.length&&I.push(Object.fromEntries(S.map((P,Q)=>[p[Q]??`column_${Q+1}`,P])))}return I}function $s(e){let n=F(e.data).map((r,i)=>{let s=F(r).map(sr).filter(Boolean).join("/");return s||ot(w(e.fields)[i])||`metric_${i+1}`}).filter(Boolean);return n.length?n:w(e.fields).map(ot).filter(Boolean)}function ot(e){return B(e.alias,e.title,e.originTitle,e.name,e.fdId,e.id)??""}function sr(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 Un(e){let t=_(e);return Object.keys(t).length?"v"in t?t.v:"value"in t?t.value:sr(e):e}function or(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:dr(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 Fs(e){let t=_(e.config)??{};return h({...or(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 Vs(e,t){let n=_(e.config)??{},r=t.time_comparison_json??lr(_(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=eo(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 zs(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 jn(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 Qs(e){return ie(e).map(t=>h({child_metric:l(_(t.metricInfo)?.name),child_metric_id:l(_(t.metricInfo)?.metricId),current_value:t.currentValue,comparison_value:t.comparisonValue,change_value:t.changeValue,change_rate:t.changeRate,contribution_value:t.contributionValue,contribution_rate:t.contributionRate}))}function Nn(e,t){return ie(e).map((n,r)=>h({dimension:t,dimension_value:Array.isArray(n.dimensionValue)?n.dimensionValue.join("/"):n.dimensionValue,current_value:n.currentValue,comparison_value:n.comparisonValue,change_value:n.changeValue,change_rate:n.changeRate,contribution_value:n.contributionValue,contribution_rate:n.contributionRate,rank:r+1}))}function nt(e,t,n,r,i,s){let o=t==="scan"?n:n.slice(0,r.limit);return C({summary:{metric_tree_id:r.metric_tree_id,metric_tree_name:l(e.metricTreeName),root_metric_id:l(e.metricId),root_metric_name:l(e.metricName),target:t,row_count:o.length,...s},columns:cr(o),rows:o,raw:i})}function Ks(e,t,n,r){let i=new Set((n??[]).map(u=>u.trim()).filter(Boolean)),s=new Set((r??[]).map(u=>u.trim()).filter(Boolean)),o=new Map(t.map(u=>[l(u.name),u])),a=new Map(t.map(u=>[l(u.fd_id),u])),c=i.size?[...i].map(u=>o.get(u)).filter(u=>!!u):[];if(!c.length){let u=_(e.config)??{},d=_(u.dimensionDecompositionContent)??{};c=F(d.decomposableDimensionIds).map(p=>a.get(String(p))).filter(p=>!!p)}return c.length||(c=t),c.filter(u=>!s.has(l(u.name)))}function se(e){let t=new Set,n=[],r=i=>{if(!i)return;let s=l(i.fdId),o=l(i.name),a=s||o;if(!(!a||t.has(a))){t.add(a),n.push(Be(i));for(let c of w(i.subs))r(c)}};for(let i of w(e.applicableDims))r(i);return r(_(e.timeDim)),n}function ar(e){let t=w(e.fdInfos).map(Be);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 Be(e){return h({id:B(e.id,e.fdId),fd_id:l(e.fdId),name:l(e.name),fd_type:l(e.fdType),meta_type:l(e.metaType),ds_id:l(e.dsId),granularity:l(e.granularity)})}function Y(e,t,n){let r=(n??t)?.trim();if(r)return e.find(i=>[i.fd_id,i.id,i.name].map(l).includes(r))}function Ys(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 Ws(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 Xs(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 Zs(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 eo(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 ur(e){let t=_(e);if(t)return h({dataset_id:l(t.dsId),name:l(t.name)})}function we(e){let t=_(e);if(t)return h({user_id:B(t.uId,t.id),name:l(t.name),deleted:A(t.isDel)})}function to(e){return h({id:l(e.id),name:l(e.name),type:l(e.valueType),values:w(e.values)})}function dr(e){return w(e).map(t=>l(t.dirName??t.name)).filter(Boolean)}function x(e,t){return C({status:"unsupported",diagnostic:{tool:e,...t}})}function V(e,t){return e instanceof J?q({operation:t,diagnostic:e.detail}):q({operation:t,message:e instanceof Error?e.message:String(e)})}function no(e){return e instanceof J&&e.detail.operation==="queryMetricData"&&e.detail.path==="/api/metric-platform/metric-data/v2"&&/No static resource metric-platform\/metric-data\/v2/i.test(e.detail.message)}function w(e){return Array.isArray(e)?e.map(_).filter(Boolean):[]}function F(e){return Array.isArray(e)?e:[]}function _(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function l(e){return typeof e=="string"?e:e==null?"":String(e)}function B(...e){return e.map(l).find(t=>t.trim())?.trim()}function A(e){return typeof e=="boolean"?e:void 0}function Ln(e){return typeof e=="number"&&Number.isFinite(e)?e:void 0}function ro(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 lr(e){return e?JSON.parse(JSON.stringify(e)):void 0}function pr(e,t,n,r,i={}){let s=i.usageTelemetry??new _e({config:n,appVersion:i.appVersion??"unknown"}),o=(c,u,d)=>{let p=e.registerTool,g=Lt(c,d,s),I=async(...y)=>{try{return await g(...y)}catch(S){return Ie(c,S)}};p.call(e,c,u,I)},a=c=>!r.service||r.service.toolList.includes(c);o("get_bi_capabilities",{title:"Get BI Capabilities",description:"\u83B7\u53D6\u5F53\u524D BI \u73AF\u5883\u7248\u672C\u548C MCP \u529F\u80FD\u542F\u7528\u72B6\u6001\u3002",inputSchema:qt},(c,u)=>t.run(({client:d,config:p})=>Gt(d,p),u,"get_bi_capabilities")),["chatbi_list_themes","chatbi_query","chatbi_insight_start","chatbi_insight_poll"].some(a)&&(o("chatbi_list_themes",{title:"List ChatBI Themes",description:"\u5217\u51FA\u5F53\u524D\u767B\u5F55\u7528\u6237\u53EF\u8BBF\u95EE\u7684 ChatBI \u4E3B\u9898\uFF0C\u53EF\u7B5B\u9009\u6D1E\u5BDF\u4E3B\u9898\u3002",inputSchema:un,outputSchema:sn},(c,u)=>t.run(({config:d})=>mn(d,c),u,"chatbi_list_themes")),o("chatbi_query",{title:"ChatBI Query",description:"\u6267\u884C ChatBI L1 \u540C\u6B65\u95EE\u6570\uFF0C\u7528\u81EA\u7136\u8BED\u8A00\u76F4\u63A5\u63D0\u95EE\uFF0C\u6700\u7701\u4E8B\uFF0C\u9002\u5408\u4E1A\u52A1\u95EE\u9898\u8868\u8FF0\u660E\u786E\u3001\u65E0\u9700\u7CBE\u786E\u63A7\u5236\u7EF4\u5EA6\u6216 SQL \u7684\u573A\u666F\uFF1B\u9700\u8981\u7CBE\u786E\u6307\u5B9A\u7EF4\u5EA6/\u7B5B\u9009\u7528 query_metric_data\uFF0C\u9700\u8981\u81EA\u5B9A\u4E49 SQL \u7528 execute_sql_query\u3002\u652F\u6301\u4E3B\u9898 ID \u6216\u4E3B\u9898\u540D\u3002\u6210\u529F\u7ED3\u679C\u76F4\u63A5\u900F\u51FA answer\u3001sql\u3001query_result \u7B49\u7ED3\u6784\u5316\u5B57\u6BB5\uFF0C\u7531\u8C03\u7528\u65B9\u81EA\u884C\u7EC4\u7EC7\u6700\u7EC8\u56DE\u590D\u3002session_id \u53EA\u80FD\u7528\u4E8E\u95EE\u6570\u7EED\u95EE\uFF0C\u4E0D\u80FD\u4E0E ChatBI \u6D1E\u5BDF\u4F1A\u8BDD\u6DF7\u7528\u3002",inputSchema:dn,outputSchema:on},(c,u)=>t.run(({config:d})=>fn(d,c),u,"chatbi_query")),o("chatbi_insight_start",{title:"Start ChatBI Insight",description:"\u53D1\u8D77 ChatBI L2 \u6D1E\u5BDF\u5206\u6790\u5E76\u5728\u8BF7\u6C42\u53D7\u7406\u540E\u7ACB\u5373\u8FD4\u56DE message_id\uFF0C\u4E0D\u7B49\u5F85\u6700\u7EC8\u62A5\u544A\uFF0C\u4E5F\u4E0D\u8FD4\u56DE final_result\u3002\u6D1E\u5BDF\u901A\u5E38\u8017\u65F6 2-3 \u5206\u949F\uFF0C5 \u5206\u949F\u89C6\u4E3A\u8D85\u65F6\uFF1B\u540C\u4E00\u95EE\u9898\u53EA\u8C03\u7528\u4E00\u6B21\uFF0C\u540E\u7EED\u4F7F\u7528 chatbi_insight_poll \u67E5\u8BE2\u7ED3\u679C\u3002",inputSchema:ln,outputSchema:an},(c,u)=>t.run(({config:d})=>gn(d,c),u,"chatbi_insight_start")),o("chatbi_insight_poll",{title:"Poll ChatBI Insight",description:"\u67E5\u8BE2 ChatBI L2 \u6D1E\u5BDF\u4EFB\u52A1\u72B6\u6001\u548C\u6700\u7EC8\u62A5\u544A\u3002status=success \u65F6\u6700\u7EC8\u5C55\u793A\u5185\u5BB9\u8BFB\u53D6 structuredContent.final_result.content\uFF1Banswer \u4E3A\u540E\u7AEF\u539F\u59CB\u7B54\u6848\u3002\u4F7F\u7528 chatbi_insight_start \u8FD4\u56DE\u7684 theme_id \u548C message_id\uFF1B\u4E0D\u8981\u9AD8\u9891\u8C03\u7528\uFF0C\u5EFA\u8BAE\u81F3\u5C11\u95F4\u9694 10 \u79D2\uFF0C\u6D1E\u5BDF\u901A\u5E38\u8017\u65F6 2-3 \u5206\u949F\uFF0C5 \u5206\u949F\u540E\u505C\u6B62\u7B49\u5F85\u3002",inputSchema:pn,outputSchema:cn},(c,u)=>t.run(({config:d})=>_n(d,c),u,"chatbi_insight_poll"))),r.ok&&(a("global_search")&&o("global_search",{title:"Global Search",description:"\u6309\u5173\u952E\u8BCD\u641C\u7D22 BI \u4E2D\u7684\u5361\u7247\u3001\u4EEA\u8868\u677F\u3001\u6570\u636E\u96C6\u548C ETL \u8D44\u6E90\uFF0C\u9002\u5408\u5B9A\u4F4D\u67D0\u4E2A\u5DF2\u6709\u8D44\u4EA7\u6216\u5176 ID\u3002\u8FD4\u56DE\u7684\u5361\u7247 ID \u53EF\u4EA4\u7ED9 get_card_info/query_card_data\uFF0C\u6570\u636E\u96C6 ID \u53EF\u4EA4\u7ED9 get_dataset_detail/execute_sql_query\u3002\u6307\u6807\u76F8\u5173\u68C0\u7D22\u8BF7\u7528 search_metrics\u3002",inputSchema:kn},(c,u)=>t.run(({client:d})=>Pn(d,c),u,"global_search")),a("search_metrics")&&o("search_metrics",{title:"Search Metrics",description:"\u6309\u5173\u952E\u8BCD\u641C\u7D22\u6307\u6807\u5E73\u53F0\u6307\u6807\uFF0C\u8FD4\u56DE metric_id\u3001\u540D\u79F0\u3001\u4E3B\u9898\u3001\u76EE\u5F55\u3001\u7C7B\u578B\u3001\u72B6\u6001\u548C\u4E1A\u52A1\u53E3\u5F84\u6458\u8981\u3002\u5DF2\u6709\u5173\u952E\u8BCD\u65F6\u4F18\u5148\u7528\u672C\u5DE5\u5177\uFF1B\u4E0D\u6E05\u695A\u6709\u54EA\u4E9B\u6307\u6807\u65F6\u6539\u7528 list_metric_catalog \u6D4F\u89C8\u3002\u8FD4\u56DE\u7684 metric_id \u53EF\u7EE7\u7EED\u4EA4\u7ED9 get_metric_detail \u770B\u53E3\u5F84\u3001query_metric_data \u53D6\u6570\u3002",inputSchema:Gn,outputSchema:G},(c,u)=>t.run(({client:d,config:p})=>Qn(d,p,c),u,"search_metrics")),a("list_metric_catalog")&&o("list_metric_catalog",{title:"List Metric Catalog",description:"\u6309\u4E3B\u9898/\u76EE\u5F55\u5C42\u7EA7\u6D4F\u89C8\u6307\u6807\u8282\u70B9\uFF0C\u9002\u5408\u4E0D\u77E5\u9053\u5173\u952E\u8BCD\u3001\u9700\u8981\u5148\u53D1\u73B0\u6709\u54EA\u4E9B\u53EF\u7528\u6307\u6807\u7684\u573A\u666F\u3002\u5DF2\u6709\u660E\u786E\u5173\u952E\u8BCD\u65F6\u6539\u7528 search_metrics\u3002\u8FD4\u56DE\u7684 metric_id \u53EF\u7EE7\u7EED\u4EA4\u7ED9 get_metric_detail\u3001query_metric_data\u3002",inputSchema:Hn,outputSchema:G},(c,u)=>t.run(({client:d,config:p})=>Kn(d,p,c),u,"list_metric_catalog")),a("get_metric_detail")&&o("get_metric_detail",{title:"Get Metric Detail",description:"\u6309 metric_id \u83B7\u53D6\u6307\u6807\u7684\u4E1A\u52A1\u53E3\u5F84\u3001\u8BA1\u7B97\u53E3\u5F84\u3001\u9002\u7528\u7EF4\u5EA6\u3001\u65F6\u95F4\u7EF4\u3001\u8840\u7F18/\u5F15\u7528\u6458\u8981\u548C\u6743\u9650\u4FE1\u606F\u3002\u5EFA\u8BAE\u5728 query_metric_data \u53D6\u6570\u524D\u5148\u8C03\u7528\uFF0C\u786E\u8BA4\u53EF\u7528\u7EF4\u5EA6\u4E0E\u53E3\u5F84\u3002metric_id \u6765\u81EA search_metrics \u6216 list_metric_catalog\u3002",inputSchema:Jn,outputSchema:G},(c,u)=>t.run(({client:d,config:p})=>Yn(d,p,c),u,"get_metric_detail")),a("query_metric_data")&&o("query_metric_data",{title:"Query Metric Data",description:"\u6309\u5DF2\u77E5 metric_id \u7CBE\u786E\u67E5\u8BE2\u6307\u6807\u6570\u636E\uFF0C\u9002\u5408\u9700\u8981\u6307\u5B9A\u7EF4\u5EA6\u3001\u7B5B\u9009\u3001\u6392\u5E8F\u7684\u53D6\u6570\u573A\u666F\uFF1B\u7EF4\u5EA6\u5EFA\u8BAE\u5148\u7528 get_metric_detail \u786E\u8BA4\u3002\u53EA\u8BFB\u5B89\u5168\uFF1A\u8BFB\u53D6\u6307\u6807\u5361\u9884\u89C8\u6570\u636E\uFF0C\u7EF4\u5EA6\u67E5\u8BE2\u53EA\u6539\u4E34\u65F6 session\uFF0C\u4E0D\u89E6\u53D1 save\u3001update\u3001delete\u3001publish \u7B49\u6301\u4E45\u5316\u64CD\u4F5C\u3002\u9700\u8981\u81EA\u7136\u8BED\u8A00\u95EE\u6570\u7528 chatbi_query\uFF0C\u9700\u8981\u5199 SQL \u7528 execute_sql_query\u3002",inputSchema:$n,outputSchema:G},(c,u)=>t.run(({client:d,config:p})=>Wn(d,p,c),u,"query_metric_data")),a("search_metric_trees")&&o("search_metric_trees",{title:"Search Metric Trees",description:"\u6309\u5173\u952E\u8BCD\u641C\u7D22\u6307\u6807\u6811\u8D44\u6E90\uFF0C\u8FD4\u56DE metric_tree_id\u3002\u5F52\u56E0\u5206\u6790\u7684\u5165\u53E3\u5DE5\u5177\uFF1A\u62FF\u5230 metric_tree_id \u540E\u7528 get_metric_tree_detail \u770B\u7ED3\u6784\u3001query_metric_tree_attribution \u505A\u5F52\u56E0\u3002",inputSchema:Fn,outputSchema:G},(c,u)=>t.run(({client:d,config:p})=>Xn(d,p,c),u,"search_metric_trees")),a("get_metric_tree_detail")&&o("get_metric_tree_detail",{title:"Get Metric Tree Detail",description:"\u6309 metric_tree_id \u83B7\u53D6\u6307\u6807\u6811\u8BE6\u60C5\u3001\u6839\u6307\u6807\u3001\u65F6\u95F4\u5BF9\u6BD4\u914D\u7F6E\u3001\u7EF4\u5EA6\u62C6\u89E3\u914D\u7F6E\u548C\u6307\u6807\u5173\u7CFB\u6811\u3002\u5EFA\u8BAE\u5728 query_metric_tree_attribution \u5F52\u56E0\u524D\u5148\u8C03\u7528\uFF0C\u786E\u8BA4\u53EF\u62C6\u89E3\u7EF4\u5EA6\u4E0E\u5BF9\u6BD4\u914D\u7F6E\u3002metric_tree_id \u6765\u81EA search_metric_trees\u3002",inputSchema:Vn,outputSchema:G},(c,u)=>t.run(({client:d,config:p})=>Zn(d,p,c),u,"get_metric_tree_detail")),a("query_metric_tree_attribution")&&o("query_metric_tree_attribution",{title:"Query Metric Tree Attribution",description:"\u6309\u5DF2\u77E5 metric_tree_id \u6267\u884C\u6307\u6807\u62C6\u89E3\u3001\u5355\u7EF4\u62C6\u89E3\u6216\u5168\u7EF4\u626B\u63CF\u5F52\u56E0\uFF0C\u9002\u5408\u5206\u6790\u67D0\u6307\u6807\u53D8\u5316\u7531\u54EA\u4E9B\u56E0\u7D20/\u7EF4\u5EA6\u8D21\u732E\u3002\u5EFA\u8BAE\u5148\u7528 get_metric_tree_detail \u786E\u8BA4\u53EF\u62C6\u89E3\u7EF4\u5EA6\u3002",inputSchema:zn,outputSchema:G},(c,u)=>t.run(({client:d,config:p})=>er(d,p,c),u,"query_metric_tree_attribution")),a("execute_sql_query")&&o("execute_sql_query",{title:"Execute SQL Query",description:`\u57FA\u4E8E\u4E00\u4E2A\u6216\u591A\u4E2A\u6570\u636E\u96C6\u6267\u884C\u67E5\u8BE2 SQL\u3002SQL FROM \u540E\u5199\u6570\u636E\u96C6\u540D\u79F0/name\uFF1B\u4E2D\u6587\u6216\u7279\u6B8A\u5B57\u7B26\u540D\u79F0\u7528\u53CD\u5F15\u53F7\uFF0C\u4F8B\u5982 SELECT * FROM \`\u9500\u552E\u6570\u636E\u96C6\` LIMIT 20\u3002\u652F\u6301\u591A\u8868\u8054\u67E5\uFF0C\u4F46\u8981\u6C42\u53C2\u4E0E\u7684\u6570\u636E\u96C6\u8981\u4E48\u5747\u4E3A\u62BD\u53D6\u6570\u636E\u96C6\uFF0C\u8981\u4E48\u5747\u4E3A\u6765\u81EA\u540C\u4E00\u6570\u636E\u8D26\u6237\u548C\u6570\u636E\u5E93\u7684\u76F4\u8FDE\u6570\u636E\u96C6\u3002inputs \u4F20\u6570\u636E\u96C6 ID \u5217\u8868\uFF0C\u4EC5\u7528\u4E8E BI \u7ED1\u5B9A/\u6388\u6743\u3002\u8FD4\u56DE\u884C\u6570\u53D7 BI_MAX_ROWS \u63A7\u5236\uFF0C\u5F53\u524D\u914D\u7F6E\u4E3A ${n.BI_MAX_ROWS} \u884C\uFF0C\u9ED8\u8BA4\u503C\u4E3A 1000 \u884C\u3002`,inputSchema:On},(c,u)=>t.run(({client:d,config:p})=>An(d,p,c),u,"execute_sql_query")),a("get_dataset_detail")&&o("get_dataset_detail",{title:"Get Dataset Detail",description:"\u6309\u6570\u636E\u96C6 ID \u83B7\u53D6\u57FA\u7840\u4FE1\u606F\u3001\u5B57\u6BB5\u7ED3\u6784\u548C\u76F8\u5173\u914D\u7F6E\u3002\u5EFA\u8BAE\u5728 execute_sql_query \u5199 SQL \u524D\u5148\u8C03\u7528\uFF0C\u786E\u8BA4\u6570\u636E\u96C6\u540D\u79F0\u4E0E\u53EF\u7528\u5B57\u6BB5\u3002\u6570\u636E\u96C6 ID \u6765\u81EA global_search\u3002",inputSchema:Cn},(c,u)=>t.run(({client:d})=>wn(d,c),u,"get_dataset_detail")),a("get_card_info")&&o("get_card_info",{title:"Get Card Info",description:"\u6309\u5361\u7247 ID \u83B7\u53D6\u57FA\u7840\u4FE1\u606F\u3001\u56FE\u8868\u7C7B\u578B\u3001\u6570\u636E\u6765\u6E90\u548C\u914D\u7F6E\u3002\u5EFA\u8BAE\u5728 query_card_data \u53D6\u6570\u524D\u5148\u8C03\u7528\uFF0C\u786E\u8BA4\u5B57\u6BB5\u4E0E\u6570\u636E\u6765\u6E90\u3002\u5361\u7247 ID \u6765\u81EA global_search \u6216 get_page_info\u3002",inputSchema:En},(c,u)=>t.run(({client:d})=>Sn(d,c),u,"get_card_info")),a("query_card_data")&&o("query_card_data",{title:"Query Card Data",description:"\u6309\u5DF2\u77E5\u5361\u7247 ID \u5B89\u5168\u53EA\u8BFB\u67E5\u8BE2 BI \u5361\u7247\u9884\u89C8\u6570\u636E\uFF0C\u8FD4\u56DE\u7ED3\u6784\u5316 columns\u3001rows\u3001summary \u548C diagnostic\uFF0C\u9002\u5408\u8BFB\u53D6\u5DF2\u6709\u5361\u7247\u80CC\u540E\u7684\u6570\u636E\u3002\u5361\u7247 ID \u6765\u81EA global_search \u6216 get_page_info\uFF1B\u5EFA\u8BAE\u5148\u7528 get_card_info \u4E86\u89E3\u5B57\u6BB5\u3002",inputSchema:zt,outputSchema:Qt},(c,u)=>t.run(({client:d})=>Kt(d,c),u,"query_card_data")),a("get_page_info")&&o("get_page_info",{title:"Get Page Info",description:"\u6309\u9875\u9762/\u4EEA\u8868\u677F ID \u83B7\u53D6\u57FA\u7840\u4FE1\u606F\u3001\u5E03\u5C40\u3001\u5361\u7247\u5217\u8868\u548C\u76F8\u5173\u914D\u7F6E\uFF0C\u53EF\u4ECE\u4E2D\u62FF\u5230\u5361\u7247 ID \u518D\u4EA4\u7ED9 get_card_info/query_card_data\u3002\u9875\u9762 ID \u6765\u81EA global_search\u3002",inputSchema:Bn},(c,u)=>t.run(({client:d})=>Rn(d,c),u,"get_page_info")))}var po=io(import.meta.url),mo=po("../package.json"),dt=class{record(t){console.error(JSON.stringify({runtime:Io(t)}))}};function fr(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 pt(e,r):new lt(e,r)}var fo=`\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
+ ${u}`:c}catch{return}}var it=new Map([["k",1e3],["K",1e3],["M",1e6],["B",1e9],["\u4E07",1e4],["\u4EBF",1e8]]),Cs=[[1e8,"\u4EBF"],[1e4,"\u4E07"]];function Es(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 Bs(e,t,n){let r=new Map;for(let[i,s]of e.entries()){let o=n.get(s);if(o?.prefixUnit!=="auto")continue;let a=0;for(let u of t){let d=Bn(u[i]);typeof d=="number"&&(a=Math.max(a,Math.abs(d/wn(o))))}let c=Os(a);c&&r.set(s,c)}return r}function ws(e,t,n){if(!t)return e;let r=Bn(e);return typeof r!="number"?e:Ss(r,t,n)}function Bn(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 Ss(e,t,n){let r=wn(t),{unit:i,shouldScale:s}=Rs(t,n),o=s&&i?it.get(i)??1:1,a=e/r/o,c=As(t.decimalPlaces),u=t.useThousandsSeparator?a.toLocaleString("en-US",{minimumFractionDigits:c,maximumFractionDigits:c}):a.toFixed(c),d=i&&t.showPrefixUnit!==!1?i:"",p=t.showSuffix===!1||typeof t.suffix!="string"?"":t.suffix;return`${u}${d}${p}`}function wn(e){if(e.showPrefixUnit!==!1&&typeof e.prefixUnit=="string"&&e.prefixUnit!=="auto"&&it.has(e.prefixUnit))return 1;let t=Number(e.divideDataBy??1);return Number.isFinite(t)&&t!==0?t:1}function Rs(e,t){return e.showPrefixUnit===!1?{unit:"",shouldScale:!1}:e.prefixUnit==="auto"?{unit:t??"",shouldScale:!0}:typeof e.prefixUnit=="string"&&it.has(e.prefixUnit)?{unit:e.prefixUnit,shouldScale:!0}:{unit:"",shouldScale:!1}}function As(e){return typeof e!="number"||!Number.isFinite(e)?2:Math.max(0,Math.min(100,Math.trunc(e)))}function Os(e){return Cs.find(([t])=>e>=t)?.[1]??""}function Re(e,t,n){let r=ks(e,t,n);return G({error:"chatbi_request_failed",requested_operation:n,...r,tried_base_urls:r.tried_base_urls??e.getTriedBaseUrls()})}function ks(e,t,n){return t instanceof A?t.detail:e.getLastError()??{operation:n,detail:t instanceof Error?t.message:String(t)}}import{z as st}from"zod";var Sn={dsId:st.string().min(1).describe("\u6570\u636E\u96C6 ID\u3002")},Rn={cdId:st.string().min(1).describe("\u5361\u7247 ID\u3002")},An={pageId:st.string().min(1).describe("\u9875\u9762/\u4EEA\u8868\u677F ID\u3002")};async function On(e,t){let n=await e.get(`/api/data-source/${encodeURIComponent(t.dsId)}`);return M(n)}async function kn(e,t){let n=await e.get(`/api/card/${encodeURIComponent(t.cdId)}`);return M(n)}async function Pn(e,t){let n=await e.get(`/api/page/${encodeURIComponent(t.pageId)}`);return M(n)}import{z as q}from"zod";var Ps=q.object({name:q.string().min(1),query:q.string().min(1)}),vn={query:q.string().min(1).describe("\u8981\u6267\u884C\u7684\u67E5\u8BE2 SQL\u3002FROM \u540E\u5199\u6570\u636E\u96C6\u540D\u79F0/name\uFF1B\u4E2D\u6587\u6216\u7279\u6B8A\u5B57\u7B26\u540D\u79F0\u7528\u53CD\u5F15\u53F7\u3002\u652F\u6301\u5355\u8868\u6216\u591A\u8868\u8054\u67E5\uFF0C\u4EC5\u9650\u67E5\u8BE2\u8BED\u53E5\uFF0C\u5EFA\u8BAE\u663E\u5F0F\u5199 LIMIT\u3002\u591A\u8868\u8054\u67E5\u8981\u6C42\u53C2\u4E0E\u7684\u6570\u636E\u96C6\u8981\u4E48\u5747\u4E3A\u62BD\u53D6\u6570\u636E\u96C6\uFF0C\u8981\u4E48\u5747\u4E3A\u6765\u81EA\u540C\u4E00\u6570\u636E\u8D26\u6237\u548C\u6570\u636E\u5E93\u7684\u76F4\u8FDE\u6570\u636E\u96C6\u3002"),inputs:q.array(q.string().min(1)).min(1).describe("SQL \u67E5\u8BE2\u4F9D\u8D56\u7684\u6570\u636E\u96C6 ID \u5217\u8868\uFF0C\u7528\u4E8E BI \u7ED1\u5B9A/\u6388\u6743\u6570\u636E\u96C6\uFF1B\u5355\u8868\u67E5\u8BE2\u4F20 1 \u4E2A\uFF0C\u591A\u8868\u8054\u67E5\u4F20\u591A\u4E2A\u3002\u591A\u8868\u8054\u67E5\u8981\u6C42\u8FD9\u4E9B\u6570\u636E\u96C6\u8981\u4E48\u5747\u4E3A\u62BD\u53D6\uFF0C\u8981\u4E48\u5747\u4E3A\u6765\u81EA\u540C\u4E00\u6570\u636E\u8D26\u6237\u548C\u6570\u636E\u5E93\u7684\u76F4\u8FDE\u3002"),queryStructure:q.object({ctes:q.array(Ps).optional(),mainQuery:q.string().optional()}).optional().describe("\u7ED3\u6784\u5316\u67E5\u8BE2\u4FE1\u606F\uFF0C\u53EF\u7528\u4E8E\u62C6\u5206 CTE \u548C\u4E3B\u67E5\u8BE2\u3002")};async function xn(e,t,n){try{await Mt(e,t,"executeSqlQuery");let r=await e.post("/api/data-source/execute-sql-query",{...n,limit:t.BI_MAX_ROWS});return M({maxRowsHint:t.BI_MAX_ROWS,result:r})}catch(r){if(vs(r))return Ee("execute_sql_query",r,{hint:"\u8BF7\u5728\u7BA1\u7406\u540E\u53F0 -> \u9AD8\u7EA7\u8BBE\u7F6E -> \u5BF9\u5E94\u57DF\u540D\u4E0B\uFF0C\u6253\u5F00\u9AD8\u7EA7SQL\u67E5\u8BE2\u529F\u80FD\u3002"});throw r}}function vs(e){return e instanceof Error&&e.message.includes("POST /api/data-source/execute-sql-query HTTP 404")}import{z as U}from"zod";var Mn={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 Dn(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 lt=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"]),Un=new Set(["BT","CLOSE_BT_OPEN","OPEN_BT_CLOSE","OPEN_BT_OPEN"]),at=new Set(["IS_NULL","NOT_NULL"]),$n=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;at.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`}),Un.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`}),!Un.has(e.operator)&&!at.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`})}),Ms=m.object({field:m.string().min(1).describe("\u6392\u5E8F\u5B57\u6BB5\u540D\u79F0\u6216\u5B57\u6BB5 ID\u3002"),direction:lt.describe("\u6392\u5E8F\u65B9\u5411\u3002")}),Ds=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:lt.optional(),rank_dim:m.string().min(1).optional()}),Fn={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")},Vn={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")},zn={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")},Qn={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($n).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(Ms).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:Ds.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")},Kn={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")},Wn={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")},Yn={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($n).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:lt.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")},H={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 Xn(e,t,n){let r=new D(e,t);try{let i=n.project_id?[n.project_id]:await Us(r),s=[];for(let a of i){let c=await r.searchMetrics({projectId:a,dirId:n.dir_id,keyword:n.keyword,status:n.status,subTypes:n.sub_types,orderBy:n.order_by});if(s.push(...js(c)),s.length>=n.limit)break}let o=co(s.map(ct),"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 V(i,"search_metrics")}}async function Zn(e,t,n){let r=new D(e,t);try{try{let i=await r.listMetricFullTree({projectId:n.project_id,keyword:n.keyword});return E({summary:{source:"full-tree"},tree:Ls(i),raw:n.raw?i:void 0})}catch(i){let s=n.project_id?[{id:n.project_id}]:await sr(r),o=[];for(let a of s){let c=l(a.id);if(!c)continue;let u=await r.listMetricDirectoryTree(c);o.push({id:c,name:l(a.name)||c,type:"project",project_id:c,children:qs(u,c)})}return E({summary:{source:"directory-fallback",fallback_reason:i instanceof Error?i.message:String(i)},tree:o})}}catch(i){return V(i,"list_metric_catalog")}}async function er(e,t,n){let r=new D(e,t);try{let i=await r.getMetricDetail(n.metric_id),s=Gs(i),o,a;if(!n.brief){let c=l(i.uniformResourceType)||"METRIC_PLATFORM_METRIC";try{o=Hs(await r.getMetricLineage(n.metric_id,c))}catch(u){a=u instanceof J?u.detail:String(u)}}return E({detail:{...s,lineage:o,lineage_error:a},raw:n.raw?i:void 0})}catch(i){return V(i,"get_metric_detail")}}async function tr(e,t,n){let r=new D(e,t);try{let i=await r.getMetricDetail(n.metric_id);if(!n.advanced_calc){let a=Nn(i,n);if("unsupported"in a)return x("query_metric_data",a.unsupported);let c=async p=>{let _=await r.getCardEditSession(a.cardId),I=l(_.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 Js(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=[],_=[];for(let I of n.filters??[]){let b=Nn(i,{...n,combine_type:"AND",filters:[I]});if("unsupported"in b)return x("query_metric_data",b.unsupported);let{raw:S}=await c(b.body);_.push(S),p.push(...Ln(S))}return Ae(i,p,n,{mode:"metric_card_preview_data",card_id:a.cardId,card_kind:a.cardKind,combine_type:"OR",query_count:_.length},n.raw?_:void 0)}let{raw:u,sessionId:d}=await c(a.body);return Ae(i,Ln(u),n,{mode:"metric_card_preview_data",card_id:a.cardId,card_kind:a.cardKind,session_id:d,request_body:a.body},n.raw?u:void 0)}let s=jn(i,n);if("unsupported"in s)return x("query_metric_data",s.unsupported);if(n.combine_type==="OR"&&(n.filters?.length??0)>1){let a=[],c=[];for(let u of n.filters??[]){let d=jn(i,{...n,combine_type:"AND",filters:[u]});if("unsupported"in d)return x("query_metric_data",d.unsupported);let p=await r.queryMetricData(d.input);c.push(p),a.push(...ce(p))}return Ae(i,a,n,{mode:"metric_data_v2",combine_type:"OR",query_count:c.length},n.raw?c:void 0)}let o=await r.queryMetricData(s.input);return Ae(i,ce(o),n,{mode:"metric_data_v2",request_body:s.input},n.raw?o:void 0)}catch(i){return ao(i)?x("query_metric_data",{capability:"metric_data_v2_unavailable",message:"\u5F53\u524D BI \u73AF\u5883\u672A\u63D0\u4F9B /api/metric-platform/metric-data/v2\uFF0C\u65E0\u6CD5\u6267\u884C\u9AD8\u7EA7\u8BA1\u7B97\u67E5\u8BE2\u3002",diagnostic:i.detail}):V(i,"query_metric_data")}}async function nr(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=Ns(i).map(dr).slice(0,n.limit);return E({summary:{keyword:n.keyword,count:s.length},items:s})}catch(i){return V(i,"search_metric_trees")}}async function rr(e,t,n){let r=new D(e,t);try{let i=await r.getMetricTreeDetail(n.metric_tree_id);return E({detail:Ws(i),raw:n.raw?i:void 0})}catch(i){return V(i,"get_metric_tree_detail")}}async function ir(e,t,n){let r=new D(e,t);try{if(n.target==="dimension"&&!n.dimension&&!n.dimension_fd_id)return x("query_metric_tree_attribution",{capability:"dimension_attribution_requires_dimension",message:"target=dimension \u65F6\u5FC5\u987B\u6307\u5B9A dimension \u6216 dimension_fd_id\u3002"});let i=await r.getMetricTreeDetail(n.metric_tree_id),s=l(i.metricId);if(!s)return x("query_metric_tree_attribution",{capability:"missing_root_metric",message:"\u6307\u6807\u6811\u8BE6\u60C5\u7F3A\u5C11\u6839\u6307\u6807 ID\uFF0C\u65E0\u6CD5\u6267\u884C\u5F52\u56E0\u3002"});let o=await r.getMetricDetail(s),a=ue(o),c=pt(n.filters??[],a);if("unsupported"in c)return x("query_metric_tree_attribution",c.unsupported);let u=c.filters,d=Ys(i,n);if("unsupported"in d)return x("query_metric_tree_attribution",d.unsupported);if(n.target==="metric"){let b=Xs(i,d.value,u),S=await r.queryMetricTreeDecompose(n.metric_tree_id,b);return ot(i,"metric",Zs(S),n,n.raw?S:void 0)}if(n.target==="dimension"){let b=te(a,n.dimension,n.dimension_fd_id);if(!b)return x("query_metric_tree_attribution",{capability:"unknown_dimension",message:`\u7EF4\u5EA6\u4E0D\u5B58\u5728\u6216\u4E0D\u9002\u7528\u4E8E\u6839\u6307\u6807\uFF1A${n.dimension??n.dimension_fd_id}`});let S=Gn(i,b,d.value,u,n.limit,n.sort),P=await r.queryMetricTreeDrill(n.metric_tree_id,S);return ot(i,"dimension",Hn(P,l(b.name)),n,n.raw?P:void 0)}let p=eo(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 _=[],I=[];for(let b of p){let S=Gn(i,b,d.value,u,n.group_limit,n.sort),P=await r.queryMetricTreeDrill(n.metric_tree_id,S);I.push({dimension:l(b.name),raw:P}),_.push(...Hn(P,l(b.name)).slice(0,n.group_limit))}return ot(i,"scan",_,n,n.raw?I:void 0,{scanned_dimensions:p.map(b=>l(b.name))})}catch(i){return V(i,"query_metric_tree_attribution")}}async function Us(e){return(await sr(e)).map(t=>l(t.id)).filter(Boolean)}async function sr(e){return w(await e.listProjects()).map(g).filter(Boolean)}function js(e){let t=g(e);return w(t.contents??t.items??t.data)}function Ns(e){let t=g(e);return w(t.data??t.contents??t.items)}function ct(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:mr(e.dsInfo),statistics:e.statisticsData,creator:ke(e.creator),business_owner:ke(e.businessOwner),updated_at:l(e.utime),raw:e})}function Ls(e){return w(e).map(t=>or(t,void 0))}function or(e,t){let n=!!e.isMetric,r=l(e.id),i=!t&&!n?r:t;return h({id:r,name:l(e.name),type:n?"metric":t?"directory":"project",project_id:i,dir_id:!n&&t?r:void 0,metric_id:n?r:void 0,parent_id:l(e.parentId),children:w(e.children).map(s=>or(s,i))})}function qs(e,t){let n=g(e);return l(n.id)?[ut(n,t)]:w(n.contents??n.children).map(r=>ut(r,t))}function ut(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:O(e.canUse),can_manage:O(e.canManage),metric_count:Jn(e.metricCnt),all_metric_count:Jn(e.allMetricCnt),children:w(e.contents??e.children).map(n=>ut(n,t))})}function Gs(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:fr(e.dirPath),dataset:mr(e.dsInfo),source_fields:w(e.fdInfos).map(Oe),aggregation:B(e.aggrType,e.aggregationType),formula:B(e.formula,e.expression),derive_setting:e.deriveSetting,format:e.format,applicable_dimensions:ue(e),time_dimension:g(e.timeDim)?Oe(g(e.timeDim)):void 0,business_attributes:w(e.bizAttrs).map(oo),business_owner:ke(e.businessOwner),creator:ke(e.creator),referenced_metrics:w(e.referencedMetrics).map(ct),base_metric:g(e.baseMetric)?ct(g(e.baseMetric)):void 0,linked_metric_id:l(e.linkMetricId),statistics:e.statisticsData,permissions:h({can_use:O(e.canUse),can_manage:O(e.canManage)}),created_at:l(e.ctime),updated_at:l(e.utime),has_draft:O(e.hasDraft)})}function Hs(e){let t=g(e);return h({current:t.crtNode,upstream:t.backwardAtlas,downstream:t.forwardAtlas})}function jn(e,t){let n=l(e.name),r=l(e.projectId);if(!n||!r)return{unsupported:{capability:"metric_detail_incomplete",message:"\u6307\u6807\u8BE6\u60C5\u7F3A\u5C11 name \u6216 projectId\u3002"}};let i=ue(e),s=[...i,...lr(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=Fs(e,i,t.advanced_calc);if("unsupported"in a)return{unsupported:a.unsupported};let c=pt(t.filters??[],s);if("unsupported"in c)return{unsupported:c.unsupported};let u=ar(t.sort??[],s);return"unsupported"in u?{unsupported:u.unsupported}:{input:{projectId:r,metricId:t.metric_id,metricName:n,metricItems:[h({name:n,alias:Vs(n,t.advanced_calc),advCalc:a.value})],dimensions:o,filters:c.filters,sorting:u.sorting,limit:t.limit}}}function Nn(e,t){let n=g(e.metricChartConfig),r=l(n.metricChartCdId),i=l(n.metricValueCdId),s=r||i;if(!s)return{unsupported:{capability:"missing_metric_card",message:"\u6307\u6807\u8BE6\u60C5\u7F3A\u5C11 metricChartConfig.metricChartCdId \u6216 metricValueCdId\uFF0C\u65E0\u6CD5\u8D70\u53EA\u8BFB\u5361\u7247\u53D6\u6570\u3002"}};let o=[...ue(e),...lr(e)],a=[];for(let _ of t.dimensions??[]){let I=te(o,_);if(!I||l(I.meta_type).toUpperCase()==="METRIC")return{unsupported:{capability:"unsupported_dimension",parameter:_,supported_dimensions:ue(e)}};a.push(no(I))}let c=pt(t.filters??[],o);if("unsupported"in c)return{unsupported:c.unsupported};let u=c.filters,d=ar(t.sort??[],o);if("unsupported"in d)return{unsupported:d.unsupported};let p=d.sorting;return{cardId:s,cardKind:r?"chart":"value",dimensions:a,body:h({limit:t.limit,filters:u.length?u:void 0,combineType:t.filters?.length?t.combine_type:void 0,sorting:p.length?p:void 0})}}async function Js(e,t,n,r){let i=gr(await e.getCardEditMeta(t))??{},s=$s(i);s.row=r,s.sorting=[],await e.modifyCardEditMeta(t,n,i)}function $s(e){let t=g(e.content),n=g(t.meta),r=g(n.chartMain),i=g(r.zoneData);if(!Object.keys(i).length)throw new Error("\u6307\u6807\u5361\u7247\u7F16\u8F91\u914D\u7F6E\u7F3A\u5C11 content.meta.chartMain.zoneData\u3002");return t.meta=n,n.chartMain=r,r.zoneData=i,e.content=t,i}function Fs(e,t,n){if(!n)return{value:void 0};let r=g(e.timeDim),i=l(r?.fdId);if(["compare","last"].includes(n.type)&&!i)return{unsupported:{capability:"advanced_calc_requires_time_dimension",parameter:n.type}};if(n.type==="compare"){let a=n.compare??"yoy",c={yoy:["YEAR","YEAR"],mom:["MONTH","MONTH"],qoq:["QUARTER","QUARTER"],wow:["WEEK","WEEK"],dod:["DAY","DAY"]},[u,d]=c[a];return{value:{advType:"COMPARATIVE",advValue:{advType:"COMPARATIVE",dateFdId:i,valueType:(n.compare_value??"value").toUpperCase(),offset:1,offsetType:u,granularity:d}}}}if(n.type==="xtd")return{value:{advType:"XTD",advValue:{advType:"XTD",granularity:{ytd:"YEAR",qtd:"QUARTER",mtd:"MONTH",wtd:"WEEK",dtd:"DAY"}[n.xtd??"ytd"],includeCurrentValue:!0}}};if(n.type==="last")return{value:{advType:"LAST",advValue:{advType:"LAST",dateFdId:i}}};if(n.type==="recent"){let a=zs(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 Vs(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 zs(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 pt(e,t){let n=[];for(let r of e){let i=cr(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:Qs(r)}))}return{filters:n}}function Qs(e){return at.has(e.operator)?[]:e.values??[]}function ar(e,t){let n=[];for(let r of e){let i=cr(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 cr(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(_=>h({name:l(_.name),fd_id:l(_.fd_id),meta_type:l(_.meta_type)}))}};let a=l(i.name),c=l(i.fd_id),u=l(i.fd_type),d=l(i.meta_type).toUpperCase(),p=[a?void 0:"name",c?void 0:"fdId",u?void 0:"fdType",d?void 0:"metaType"].filter(_=>!!_);return p.length?{unsupported:{capability:s,parameter:t,message:`${o}\u5B57\u6BB5\u7F3A\u5C11\u5FC5\u8981 BI \u5143\u4FE1\u606F\uFF1A${t}`,missing_metadata:p}}:{field:{name:a,fdId:c,fdType:u,metaType:d}}}function Ae(e,t,n,r,i){let s=ro(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:pr(s),rows:s,diagnostic:r,raw:i})}function ce(e){let t=g(e),n=g(t.data)??t,r=w(n.values??n.rows??t.values??t.rows);if(r.length)return r;let i=w(n.columns??t.columns).map(o=>l(g(o)?.name??o)).filter(Boolean),s=w(n.preview??n.contents);return i.length?s.map(o=>{let a=Array.isArray(o)?o:[];return Object.fromEntries(i.map((c,u)=>[c,a[u]]))}):s}function Ln(e){let t=g(e),n=g(t.data)??t,r=g(n.chartMain??t.chartMain??g(g(t.content).data).chartMain);if(!Object.keys(r).length)return ce(e);let i=g(r.row),s=g(r.column),o=w(i.fields),a=F(i.data),c=F(r.data),u=Ks(s),d=o.map(dt).filter(Boolean),p=io([...d,...u]),_=Math.max(a.length,c.length),I=[];for(let b=0;b<_;b+=1){let S=[];S.push(...F(a[b]).map(qn)),S.push(...F(c[b]).map(qn)),S.length&&I.push(Object.fromEntries(S.map((P,Q)=>[p[Q]??`column_${Q+1}`,P])))}return I}function Ks(e){let n=F(e.data).map((r,i)=>{let s=F(r).map(ur).filter(Boolean).join("/");return s||dt(w(e.fields)[i])||`metric_${i+1}`}).filter(Boolean);return n.length?n:w(e.fields).map(dt).filter(Boolean)}function dt(e){return B(e.alias,e.title,e.originTitle,e.name,e.fdId,e.id)??""}function ur(e){let t=g(e);return Object.keys(t).length?B(t.title,t.name,t.originTitle,t.alias,t.v,t.value)??"":l(e)}function qn(e){let t=g(e);return Object.keys(t).length?"v"in t?t.v:"value"in t?t.value:ur(e):e}function dr(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:fr(e.dirPath),creator_id:l(e.creatorId),creator_name:l(e.creatorName),can_use:O(e.canUse),can_manage:O(e.canManage),updated_at:l(e.utime)})}function Ws(e){let t=g(e.config)??{};return h({...dr(e),dom_id:l(e.domId),created_at:l(e.ctime),time_comparison:t.timeComparisonSetting,comparison_enabled:O(t.comparisonEnabled),contribution_calc_enabled:O(t.contributionCalcEnabled),dimension_decomposition:t.dimensionDecompositionContent,metric_decomposition:t.metricDecompositionContent,permissions:h({can_use:O(e.canUse),can_manage:O(e.canManage)})})}function Ys(e,t){let n=g(e.config)??{},r=t.time_comparison_json??gr(g(n.timeComparisonSetting)),i=O(n.comparisonEnabled)??!!r,s=O(n.contributionCalcEnabled)??!1;if(t.period||t.last_period){if(!t.period||!t.last_period)return{unsupported:{capability:"period_requires_last_period",message:"period \u548C last_period \u9700\u8981\u540C\u65F6\u6307\u5B9A\u3002"}};r=r??{};let o=g(r.advValue)??{};r.advValue=o,o.window={period:[t.period],withMacro:!1};let a=so(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 Xs(e,t,n){let r=g(e.config)??{},i=g(r.metricDecompositionContent)??{};return h({timeComparisonSetting:t.setting,comparisonEnabled:t.comparisonEnabled,contributionCalcEnabled:!1,metricDecomposeInfo:{metricRelationTree:i.metricRelationTree,filters:n}})}function Gn(e,t,n,r,i,s){return h({timeComparisonSetting:n.setting,comparisonEnabled:n.comparisonEnabled,contributionCalcEnabled:n.contributionEnabled,drillInfo:{dimensionFdId:l(t.fd_id),drillFilters:r,nodeNum:i,orderBy:s==="asc"?"contributionAsc":"contributionDesc"}})}function Zs(e){return ce(e).map(t=>h({child_metric:l(g(t.metricInfo)?.name),child_metric_id:l(g(t.metricInfo)?.metricId),current_value:t.currentValue,comparison_value:t.comparisonValue,change_value:t.changeValue,change_rate:t.changeRate,contribution_value:t.contributionValue,contribution_rate:t.contributionRate}))}function Hn(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 ot(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:pr(o),rows:o,raw:i})}function eo(e,t,n,r){let i=new Set((n??[]).map(u=>u.trim()).filter(Boolean)),s=new Set((r??[]).map(u=>u.trim()).filter(Boolean)),o=new Map(t.map(u=>[l(u.name),u])),a=new Map(t.map(u=>[l(u.fd_id),u])),c=i.size?[...i].map(u=>o.get(u)).filter(u=>!!u):[];if(!c.length){let u=g(e.config)??{},d=g(u.dimensionDecompositionContent)??{};c=F(d.decomposableDimensionIds).map(p=>a.get(String(p))).filter(p=>!!p)}return c.length||(c=t),c.filter(u=>!s.has(l(u.name)))}function ue(e){let t=new Set,n=[],r=i=>{if(!i)return;let s=l(i.fdId),o=l(i.name),a=s||o;if(!(!a||t.has(a))){t.add(a),n.push(Oe(i));for(let c of w(i.subs))r(c)}};for(let i of w(e.applicableDims))r(i);return r(g(e.timeDim)),n}function lr(e){let t=w(e.fdInfos).map(Oe);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 Oe(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 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: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 no(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 ro(e,t){return t?.length?e.map(n=>Object.fromEntries(t.map(r=>[r,n[r]]))):e}function pr(e){return[...new Set(e.flatMap(t=>Object.keys(t)))]}function io(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 so(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 mr(e){let t=g(e);if(t)return h({dataset_id:l(t.dsId),name:l(t.name)})}function ke(e){let t=g(e);if(t)return h({user_id:B(t.uId,t.id),name:l(t.name),deleted:O(t.isDel)})}function oo(e){return h({id:l(e.id),name:l(e.name),type:l(e.valueType),values:w(e.values)})}function fr(e){return w(e).map(t=>l(t.dirName??t.name)).filter(Boolean)}function x(e,t){return E({status:"unsupported",diagnostic:{tool:e,...t}})}function V(e,t){return e instanceof J?G({operation:t,diagnostic:e.detail}):G({operation:t,message:e instanceof Error?e.message:String(e)})}function ao(e){return e instanceof J&&e.detail.operation==="queryMetricData"&&e.detail.path==="/api/metric-platform/metric-data/v2"&&/No static resource metric-platform\/metric-data\/v2/i.test(e.detail.message)}function w(e){return Array.isArray(e)?e.map(g).filter(Boolean):[]}function F(e){return Array.isArray(e)?e:[]}function g(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 O(e){return typeof e=="boolean"?e:void 0}function Jn(e){return typeof e=="number"&&Number.isFinite(e)?e:void 0}function co(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 gr(e){return e?JSON.parse(JSON.stringify(e)):void 0}function _r(e,t,n,r,i={}){let s=i.usageTelemetry??new Te({config:n,appVersion:i.appVersion??"unknown"}),o=(c,u,d)=>{let p=e.registerTool,_=$t(c,d,s),I=async(...b)=>{try{return await _(...b)}catch(S){return Ee(c,S)}};p.call(e,c,u,I)},a=c=>!r.service||r.service.toolList.includes(c);o("get_bi_capabilities",{title:"Get BI Capabilities",description:"\u83B7\u53D6\u5F53\u524D BI \u73AF\u5883\u7248\u672C\u548C MCP \u529F\u80FD\u542F\u7528\u72B6\u6001\u3002",inputSchema:Ft},(c,u)=>t.run(({client:d,config:p})=>Vt(d,p),u,"get_bi_capabilities")),["chatbi_list_themes","chatbi_query","chatbi_insight_start","chatbi_insight_poll"].some(a)&&(o("chatbi_list_themes",{title:"List ChatBI Themes",description:"\u5217\u51FA\u5F53\u524D\u767B\u5F55\u7528\u6237\u53EF\u8BBF\u95EE\u7684 ChatBI \u4E3B\u9898\uFF0C\u53EF\u7B5B\u9009\u6D1E\u5BDF\u4E3B\u9898\u3002",inputSchema:mn,outputSchema:un},(c,u)=>t.run(({config:d})=>hn(d,c),u,"chatbi_list_themes")),o("chatbi_query",{title:"ChatBI Query",description:"\u6267\u884C ChatBI L1 \u540C\u6B65\u95EE\u6570\uFF0C\u7528\u81EA\u7136\u8BED\u8A00\u76F4\u63A5\u63D0\u95EE\uFF0C\u6700\u7701\u4E8B\uFF0C\u9002\u5408\u4E1A\u52A1\u95EE\u9898\u8868\u8FF0\u660E\u786E\u3001\u65E0\u9700\u7CBE\u786E\u63A7\u5236\u7EF4\u5EA6\u6216 SQL \u7684\u573A\u666F\uFF1B\u9700\u8981\u7CBE\u786E\u6307\u5B9A\u7EF4\u5EA6/\u7B5B\u9009\u7528 query_metric_data\uFF0C\u9700\u8981\u81EA\u5B9A\u4E49 SQL \u7528 execute_sql_query\u3002\u652F\u6301\u4E3B\u9898 ID \u6216\u4E3B\u9898\u540D\u3002\u6210\u529F\u7ED3\u679C\u76F4\u63A5\u900F\u51FA answer\u3001sql\u3001query_result \u7B49\u7ED3\u6784\u5316\u5B57\u6BB5\uFF0C\u7531\u8C03\u7528\u65B9\u81EA\u884C\u7EC4\u7EC7\u6700\u7EC8\u56DE\u590D\u3002session_id \u53EA\u80FD\u7528\u4E8E\u95EE\u6570\u7EED\u95EE\uFF0C\u4E0D\u80FD\u4E0E ChatBI \u6D1E\u5BDF\u4F1A\u8BDD\u6DF7\u7528\u3002",inputSchema:fn,outputSchema:dn},(c,u)=>t.run(({config:d})=>In(d,c),u,"chatbi_query")),o("chatbi_insight_start",{title:"Start ChatBI Insight",description:"\u53D1\u8D77 ChatBI L2 \u6D1E\u5BDF\u5206\u6790\u5E76\u5728\u8BF7\u6C42\u53D7\u7406\u540E\u7ACB\u5373\u8FD4\u56DE message_id\uFF0C\u4E0D\u7B49\u5F85\u6700\u7EC8\u62A5\u544A\uFF0C\u4E5F\u4E0D\u8FD4\u56DE final_result\u3002\u6D1E\u5BDF\u901A\u5E38\u8017\u65F6 2-3 \u5206\u949F\uFF0C5 \u5206\u949F\u89C6\u4E3A\u8D85\u65F6\uFF1B\u540C\u4E00\u95EE\u9898\u53EA\u8C03\u7528\u4E00\u6B21\uFF0C\u540E\u7EED\u4F7F\u7528 chatbi_insight_poll \u67E5\u8BE2\u7ED3\u679C\u3002",inputSchema:gn,outputSchema:ln},(c,u)=>t.run(({config:d})=>bn(d,c),u,"chatbi_insight_start")),o("chatbi_insight_poll",{title:"Poll ChatBI Insight",description:"\u67E5\u8BE2 ChatBI L2 \u6D1E\u5BDF\u4EFB\u52A1\u72B6\u6001\u548C\u6700\u7EC8\u62A5\u544A\u3002status=success \u65F6\u6700\u7EC8\u5C55\u793A\u5185\u5BB9\u8BFB\u53D6 structuredContent.final_result.content\uFF1Banswer \u4E3A\u540E\u7AEF\u539F\u59CB\u7B54\u6848\u3002\u4F7F\u7528 chatbi_insight_start \u8FD4\u56DE\u7684 theme_id \u548C message_id\uFF1B\u4E0D\u8981\u9AD8\u9891\u8C03\u7528\uFF0C\u5EFA\u8BAE\u81F3\u5C11\u95F4\u9694 10 \u79D2\uFF0C\u6D1E\u5BDF\u901A\u5E38\u8017\u65F6 2-3 \u5206\u949F\uFF0C5 \u5206\u949F\u540E\u505C\u6B62\u7B49\u5F85\u3002",inputSchema:_n,outputSchema:pn},(c,u)=>t.run(({config:d})=>yn(d,c),u,"chatbi_insight_poll"))),r.ok&&(a("global_search")&&o("global_search",{title:"Global Search",description:"\u6309\u5173\u952E\u8BCD\u641C\u7D22 BI \u4E2D\u7684\u5361\u7247\u3001\u4EEA\u8868\u677F\u3001\u6570\u636E\u96C6\u548C ETL \u8D44\u6E90\uFF0C\u9002\u5408\u5B9A\u4F4D\u67D0\u4E2A\u5DF2\u6709\u8D44\u4EA7\u6216\u5176 ID\u3002\u8FD4\u56DE\u7684\u5361\u7247 ID \u53EF\u4EA4\u7ED9 get_card_info/query_card_data\uFF0C\u6570\u636E\u96C6 ID \u53EF\u4EA4\u7ED9 get_dataset_detail/execute_sql_query\u3002\u6307\u6807\u76F8\u5173\u68C0\u7D22\u8BF7\u7528 search_metrics\u3002",inputSchema:Mn},(c,u)=>t.run(({client:d})=>Dn(d,c),u,"global_search")),a("search_metrics")&&o("search_metrics",{title:"Search Metrics",description:"\u6309\u5173\u952E\u8BCD\u641C\u7D22\u6307\u6807\u5E73\u53F0\u6307\u6807\uFF0C\u8FD4\u56DE metric_id\u3001\u540D\u79F0\u3001\u4E3B\u9898\u3001\u76EE\u5F55\u3001\u7C7B\u578B\u3001\u72B6\u6001\u548C\u4E1A\u52A1\u53E3\u5F84\u6458\u8981\u3002\u5DF2\u6709\u5173\u952E\u8BCD\u65F6\u4F18\u5148\u7528\u672C\u5DE5\u5177\uFF1B\u4E0D\u6E05\u695A\u6709\u54EA\u4E9B\u6307\u6807\u65F6\u6539\u7528 list_metric_catalog \u6D4F\u89C8\u3002\u8FD4\u56DE\u7684 metric_id \u53EF\u7EE7\u7EED\u4EA4\u7ED9 get_metric_detail \u770B\u53E3\u5F84\u3001query_metric_data \u53D6\u6570\u3002",inputSchema:Fn,outputSchema:H},(c,u)=>t.run(({client:d,config:p})=>Xn(d,p,c),u,"search_metrics")),a("list_metric_catalog")&&o("list_metric_catalog",{title:"List Metric Catalog",description:"\u6309\u4E3B\u9898/\u76EE\u5F55\u5C42\u7EA7\u6D4F\u89C8\u6307\u6807\u8282\u70B9\uFF0C\u9002\u5408\u4E0D\u77E5\u9053\u5173\u952E\u8BCD\u3001\u9700\u8981\u5148\u53D1\u73B0\u6709\u54EA\u4E9B\u53EF\u7528\u6307\u6807\u7684\u573A\u666F\u3002\u5DF2\u6709\u660E\u786E\u5173\u952E\u8BCD\u65F6\u6539\u7528 search_metrics\u3002\u8FD4\u56DE\u7684 metric_id \u53EF\u7EE7\u7EED\u4EA4\u7ED9 get_metric_detail\u3001query_metric_data\u3002",inputSchema:Vn,outputSchema:H},(c,u)=>t.run(({client:d,config:p})=>Zn(d,p,c),u,"list_metric_catalog")),a("get_metric_detail")&&o("get_metric_detail",{title:"Get Metric Detail",description:"\u6309 metric_id \u83B7\u53D6\u6307\u6807\u7684\u4E1A\u52A1\u53E3\u5F84\u3001\u8BA1\u7B97\u53E3\u5F84\u3001\u9002\u7528\u7EF4\u5EA6\u3001\u65F6\u95F4\u7EF4\u3001\u8840\u7F18/\u5F15\u7528\u6458\u8981\u548C\u6743\u9650\u4FE1\u606F\u3002\u5EFA\u8BAE\u5728 query_metric_data \u53D6\u6570\u524D\u5148\u8C03\u7528\uFF0C\u786E\u8BA4\u53EF\u7528\u7EF4\u5EA6\u4E0E\u53E3\u5F84\u3002metric_id \u6765\u81EA search_metrics \u6216 list_metric_catalog\u3002",inputSchema:zn,outputSchema:H},(c,u)=>t.run(({client:d,config:p})=>er(d,p,c),u,"get_metric_detail")),a("query_metric_data")&&o("query_metric_data",{title:"Query Metric Data",description:"\u6309\u5DF2\u77E5 metric_id \u7CBE\u786E\u67E5\u8BE2\u6307\u6807\u6570\u636E\uFF0C\u9002\u5408\u9700\u8981\u6307\u5B9A\u7EF4\u5EA6\u3001\u7B5B\u9009\u3001\u6392\u5E8F\u7684\u53D6\u6570\u573A\u666F\uFF1B\u7EF4\u5EA6\u5EFA\u8BAE\u5148\u7528 get_metric_detail \u786E\u8BA4\u3002\u53EA\u8BFB\u5B89\u5168\uFF1A\u8BFB\u53D6\u6307\u6807\u5361\u9884\u89C8\u6570\u636E\uFF0C\u7EF4\u5EA6\u67E5\u8BE2\u53EA\u6539\u4E34\u65F6 session\uFF0C\u4E0D\u89E6\u53D1 save\u3001update\u3001delete\u3001publish \u7B49\u6301\u4E45\u5316\u64CD\u4F5C\u3002\u9700\u8981\u81EA\u7136\u8BED\u8A00\u95EE\u6570\u7528 chatbi_query\uFF0C\u9700\u8981\u5199 SQL \u7528 execute_sql_query\u3002",inputSchema:Qn,outputSchema:H},(c,u)=>t.run(({client:d,config:p})=>tr(d,p,c),u,"query_metric_data")),a("search_metric_trees")&&o("search_metric_trees",{title:"Search Metric Trees",description:"\u6309\u5173\u952E\u8BCD\u641C\u7D22\u6307\u6807\u6811\u8D44\u6E90\uFF0C\u8FD4\u56DE metric_tree_id\u3002\u5F52\u56E0\u5206\u6790\u7684\u5165\u53E3\u5DE5\u5177\uFF1A\u62FF\u5230 metric_tree_id \u540E\u7528 get_metric_tree_detail \u770B\u7ED3\u6784\u3001query_metric_tree_attribution \u505A\u5F52\u56E0\u3002",inputSchema:Kn,outputSchema:H},(c,u)=>t.run(({client:d,config:p})=>nr(d,p,c),u,"search_metric_trees")),a("get_metric_tree_detail")&&o("get_metric_tree_detail",{title:"Get Metric Tree Detail",description:"\u6309 metric_tree_id \u83B7\u53D6\u6307\u6807\u6811\u8BE6\u60C5\u3001\u6839\u6307\u6807\u3001\u65F6\u95F4\u5BF9\u6BD4\u914D\u7F6E\u3001\u7EF4\u5EA6\u62C6\u89E3\u914D\u7F6E\u548C\u6307\u6807\u5173\u7CFB\u6811\u3002\u5EFA\u8BAE\u5728 query_metric_tree_attribution \u5F52\u56E0\u524D\u5148\u8C03\u7528\uFF0C\u786E\u8BA4\u53EF\u62C6\u89E3\u7EF4\u5EA6\u4E0E\u5BF9\u6BD4\u914D\u7F6E\u3002metric_tree_id \u6765\u81EA search_metric_trees\u3002",inputSchema:Wn,outputSchema:H},(c,u)=>t.run(({client:d,config:p})=>rr(d,p,c),u,"get_metric_tree_detail")),a("query_metric_tree_attribution")&&o("query_metric_tree_attribution",{title:"Query Metric Tree Attribution",description:"\u6309\u5DF2\u77E5 metric_tree_id \u6267\u884C\u6307\u6807\u62C6\u89E3\u3001\u5355\u7EF4\u62C6\u89E3\u6216\u5168\u7EF4\u626B\u63CF\u5F52\u56E0\uFF0C\u9002\u5408\u5206\u6790\u67D0\u6307\u6807\u53D8\u5316\u7531\u54EA\u4E9B\u56E0\u7D20/\u7EF4\u5EA6\u8D21\u732E\u3002\u5EFA\u8BAE\u5148\u7528 get_metric_tree_detail \u786E\u8BA4\u53EF\u62C6\u89E3\u7EF4\u5EA6\u3002",inputSchema:Yn,outputSchema:H},(c,u)=>t.run(({client:d,config:p})=>ir(d,p,c),u,"query_metric_tree_attribution")),a("execute_sql_query")&&o("execute_sql_query",{title:"Execute SQL Query",description:`\u57FA\u4E8E\u4E00\u4E2A\u6216\u591A\u4E2A\u6570\u636E\u96C6\u6267\u884C\u67E5\u8BE2 SQL\u3002SQL FROM \u540E\u5199\u6570\u636E\u96C6\u540D\u79F0/name\uFF1B\u4E2D\u6587\u6216\u7279\u6B8A\u5B57\u7B26\u540D\u79F0\u7528\u53CD\u5F15\u53F7\uFF0C\u4F8B\u5982 SELECT * FROM \`\u9500\u552E\u6570\u636E\u96C6\` LIMIT 20\u3002\u652F\u6301\u591A\u8868\u8054\u67E5\uFF0C\u4F46\u8981\u6C42\u53C2\u4E0E\u7684\u6570\u636E\u96C6\u8981\u4E48\u5747\u4E3A\u62BD\u53D6\u6570\u636E\u96C6\uFF0C\u8981\u4E48\u5747\u4E3A\u6765\u81EA\u540C\u4E00\u6570\u636E\u8D26\u6237\u548C\u6570\u636E\u5E93\u7684\u76F4\u8FDE\u6570\u636E\u96C6\u3002inputs \u4F20\u6570\u636E\u96C6 ID \u5217\u8868\uFF0C\u4EC5\u7528\u4E8E BI \u7ED1\u5B9A/\u6388\u6743\u3002\u8FD4\u56DE\u884C\u6570\u53D7 BI_MAX_ROWS \u63A7\u5236\uFF0C\u5F53\u524D\u914D\u7F6E\u4E3A ${n.BI_MAX_ROWS} \u884C\uFF0C\u9ED8\u8BA4\u503C\u4E3A 1000 \u884C\u3002`,inputSchema:vn},(c,u)=>t.run(({client:d,config:p})=>xn(d,p,c),u,"execute_sql_query")),a("get_dataset_detail")&&o("get_dataset_detail",{title:"Get Dataset Detail",description:"\u6309\u6570\u636E\u96C6 ID \u83B7\u53D6\u57FA\u7840\u4FE1\u606F\u3001\u5B57\u6BB5\u7ED3\u6784\u548C\u76F8\u5173\u914D\u7F6E\u3002\u5EFA\u8BAE\u5728 execute_sql_query \u5199 SQL \u524D\u5148\u8C03\u7528\uFF0C\u786E\u8BA4\u6570\u636E\u96C6\u540D\u79F0\u4E0E\u53EF\u7528\u5B57\u6BB5\u3002\u6570\u636E\u96C6 ID \u6765\u81EA global_search\u3002",inputSchema:Sn},(c,u)=>t.run(({client:d})=>On(d,c),u,"get_dataset_detail")),a("get_card_info")&&o("get_card_info",{title:"Get Card Info",description:"\u6309\u5361\u7247 ID \u83B7\u53D6\u57FA\u7840\u4FE1\u606F\u3001\u56FE\u8868\u7C7B\u578B\u3001\u6570\u636E\u6765\u6E90\u548C\u914D\u7F6E\u3002\u5EFA\u8BAE\u5728 query_card_data \u53D6\u6570\u524D\u5148\u8C03\u7528\uFF0C\u786E\u8BA4\u5B57\u6BB5\u4E0E\u6570\u636E\u6765\u6E90\u3002\u5361\u7247 ID \u6765\u81EA global_search \u6216 get_page_info\u3002",inputSchema:Rn},(c,u)=>t.run(({client:d})=>kn(d,c),u,"get_card_info")),a("query_card_data")&&o("query_card_data",{title:"Query Card Data",description:"\u6309\u5DF2\u77E5\u5361\u7247 ID \u5B89\u5168\u53EA\u8BFB\u67E5\u8BE2 BI \u5361\u7247\u9884\u89C8\u6570\u636E\uFF0C\u8FD4\u56DE\u7ED3\u6784\u5316 columns\u3001rows\u3001summary \u548C diagnostic\uFF0C\u9002\u5408\u8BFB\u53D6\u5DF2\u6709\u5361\u7247\u80CC\u540E\u7684\u6570\u636E\u3002\u5361\u7247 ID \u6765\u81EA global_search \u6216 get_page_info\uFF1B\u5EFA\u8BAE\u5148\u7528 get_card_info \u4E86\u89E3\u5B57\u6BB5\u3002",inputSchema:Xt,outputSchema:Zt},(c,u)=>t.run(({client:d})=>en(d,c),u,"query_card_data")),a("get_page_info")&&o("get_page_info",{title:"Get Page Info",description:"\u6309\u9875\u9762/\u4EEA\u8868\u677F ID \u83B7\u53D6\u57FA\u7840\u4FE1\u606F\u3001\u5E03\u5C40\u3001\u5361\u7247\u5217\u8868\u548C\u76F8\u5173\u914D\u7F6E\uFF0C\u53EF\u4ECE\u4E2D\u62FF\u5230\u5361\u7247 ID \u518D\u4EA4\u7ED9 get_card_info/query_card_data\u3002\u9875\u9762 ID \u6765\u81EA global_search\u3002",inputSchema:An},(c,u)=>t.run(({client:d})=>Pn(d,c),u,"get_page_info")))}var ho=uo(import.meta.url),It=ho("../package.json"),ft=class{record(t){console.error(JSON.stringify({runtime:Eo(t)}))}};function Ir(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 _t(e,r):new gt(e,r)}var Io=`\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,4 +26,5 @@ ${u}`:c}catch{return}}var et=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 gr(e,t={}){let n=t.appVersion??mo.version,r=t.callerContextResolver??Mt(e),i=t.guanBIClientFactory??new ge(e,{clientFactory:t.clientFactory,requestMetadata:{client:"guanbi-mcp-server",clientVersion:n}}),s=i.create(await r.resolve()),o=await(t.capabilityResolver??te)(s.client,s.config),a=new co({name:"guanbi-mcp-server",version:n},{instructions:fo});return pr(a,new he(r,i,new oe),s.config,o,{appVersion:n}),a}var lt=class{constructor(t,n){this.config=t;this.options=n}config;options;mode="stdio";health(){return{status:"ok",mode:this.mode,boundBISite:{configured:!!this.config.BI_BASE_URL,baseUrl:this.config.BI_BASE_URL,publicPath:this.config.BI_PUBLIC_PATH}}}async start(){await(await gr(this.config,this.options)).connect(this.options.transportFactory?.()??new uo)}},pt=class{constructor(t,n){this.config=t;this.options=n}config;options;mode="streamable-http";httpServer;sessions=new Map;logger=new dt;health(){return{status:"ok",mode:this.mode,boundBISite:{configured:!!this.config.BI_BASE_URL,baseUrl:this.config.BI_BASE_URL,publicPath:this.config.BI_PUBLIC_PATH}}}async start(){this.httpServer=ao((t,n)=>{this.handleRequest(t,n).catch(r=>{this.log("error","mcp_http_internal_error","Streamable HTTP request failed.",t,{statusCode:500,errorMessage:r instanceof Error?r.message:String(r)}),z(n,500,{error:"internal_error",message:r instanceof Error?r.message:String(r)})})}),await new Promise((t,n)=>{this.httpServer?.once("error",r=>{this.log("error","mcp_http_start_failed","Streamable HTTP server failed to start.",void 0,{host:this.config.MCP_HTTP_HOST??"127.0.0.1",port:this.config.MCP_HTTP_PORT??9090,errorMessage:r.message}),n(r)}),this.httpServer?.listen(this.config.MCP_HTTP_PORT??9090,this.config.MCP_HTTP_HOST??"127.0.0.1",()=>{this.httpServer?.removeAllListeners("error");let r=this.httpServer?.address(),i=typeof r=="object"&&r?r.port:this.config.MCP_HTTP_PORT??9090,s=this.config.MCP_HTTP_HOST??"127.0.0.1";this.log("info","mcp_http_started","Streamable HTTP server started.",void 0,{host:s,port:i,url:this.url(),boundBISite:bo(this.config),entrypointTokenConfigured:!!this.config.MCP_ENTRYPOINT_TOKEN,trustedGateway:Se(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://${ho(t,this.config.MCP_HTTP_HOST??"127.0.0.1")}:${t.port}`}async handleRequest(t,n){let r=mr(t);if(!r){z(n,400,{error:"bad_request"});return}if(yo(r)&&t.method==="GET"){if(r==="/sysmon/health/readiness"){let a=this.readiness();z(n,a.ready?200:503,a);return}z(n,200,this.health());return}if(r!=="/mcp"){z(n,404,{error:"not_found"});return}if(!go(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:Se(this.config.MCP_TRUSTED_GATEWAY)}),z(n,401,{error:"mcp_entrypoint_unauthorized"});return}let i=mt(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,...ut(i),sessionCount:this.sessions.size}),z(n,404,{error:"mcp_session_not_found"});return}let s=await this.resolveSession(t);await s.transport.handleRequest(t,n);let o=s.transport.sessionId;o&&t.method!=="DELETE"&&!this.sessions.has(o)&&(this.sessions.set(o,s),this.log("info","mcp_session_created","Created Streamable HTTP MCP session.",t,{...ut(o),sessionCount:this.sessions.size}))}async resolveSession(t){let n=mt(t.headers["mcp-session-id"]);if(n){let s=this.sessions.get(n);if(s)return s}let r=new lo({sessionIdGenerator:oo,onsessionclosed:async s=>{let o=this.sessions.get(s);this.sessions.delete(s),await o?.server.close(),this.log("info","mcp_session_closed","Closed Streamable HTTP MCP session.",void 0,{...ut(s),sessionCount:this.sessions.size})}}),i=await gr(this.config,{...this.options,callerContextResolver:this.options.callerContextResolver??Dt(this.config),capabilityResolver:this.options.capabilityResolver??(async()=>Ot(this.config))});return await i.connect(r),{server:i,transport:r}}readiness(){let t=_o(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?mr(i):void 0;this.logger.record({level:t,event:n,mode:this.mode,message:r,method:i?.method,path:o,...s})}};function go(e,t){if(Se(t.MCP_TRUSTED_GATEWAY))return!0;let n=t.MCP_ENTRYPOINT_TOKEN;return n?mt(e.authorization)?.trim()===`Bearer ${n}`:!1}function mt(e){return Array.isArray(e)?e[0]:e}function Se(e){return["1","true","yes","on"].includes(e?.trim().toLowerCase()??"")}function _o(e){let t=[];return e.BI_BASE_URL||t.push("BI_BASE_URL is required"),!Se(e.MCP_TRUSTED_GATEWAY)&&!e.MCP_ENTRYPOINT_TOKEN&&t.push("MCP_ENTRYPOINT_TOKEN is required unless MCP_TRUSTED_GATEWAY is true"),t}function z(e,t,n){e.headersSent||(e.writeHead(t,{"Content-Type":"application/json"}),e.end(JSON.stringify(n)))}function ho(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 Io(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}function mr(e){try{return new URL(e.url??"/",`http://${e.headers.host??"localhost"}`).pathname}catch{return}}function yo(e){return["/healthz","/sysmon/health/liveness","/sysmon/health/readiness"].includes(e)}function bo(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 ut(e){return{hasSessionId:!0,sessionIdHash:so("sha256").update(e).digest("hex").slice(0,12)}}async function To(){let e=_t();await fr(e).start()}To().catch(e=>{console.error(e instanceof Error?e.message:e),process.exit(1)});
29
+ \u901A\u7528\u5DE5\u4F5C\u6D41\uFF1A\u5148\u53D1\u73B0\u8D44\u4EA7 \u2192 \u518D\u770B\u8BE6\u60C5\u62FF\u53E3\u5F84\u4E0E\u5404\u7C7B id \u2192 \u6700\u540E\u6309\u573A\u666F\u53D6\u6570\u3002\u73AF\u5883\u80FD\u529B\uFF08\u542B\u5404\u589E\u8D2D\u6A21\u5757\u662F\u5426\u5F00\u901A\uFF09\u53EF\u5148\u7528 get_bi_capabilities \u67E5\u8BE2\uFF1B\u90E8\u5206\u5DE5\u5177\u4F1A\u968F BI \u7248\u672C\u4E0E\u6A21\u5757\u5F00\u901A\u72B6\u6001\u52A8\u6001\u542F\u7528\u3002`;async function br(e,t={}){let n=t.appVersion??It.version,r=t.callerContextResolver??Lt(e),i=t.guanBIClientFactory??new ye(e,{clientFactory:t.clientFactory,requestMetadata:{client:e.BI_CLIENT??"mcp",clientVersion:n}}),s=i.create(await r.resolve()),o=await(t.capabilityResolver??se)(s.client,s.config),a=new fo({name:"guanbi-mcp-server",version:n},{instructions:Io});return _r(a,new Ce(r,i,new de),s.config,o,{appVersion:n}),a}var gt=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??It.version,boundBISite:{configured:!!this.config.BI_BASE_URL,baseUrl:this.config.BI_BASE_URL,publicPath:this.config.BI_PUBLIC_PATH}}}async start(){await(await br(this.config,this.options)).connect(this.options.transportFactory?.()??new go)}},_t=class{constructor(t,n){this.config=t;this.options=n}config;options;mode="streamable-http";httpServer;sessions=new Map;logger=new ft;health(){return{status:"ok",mode:this.mode,version:this.options.appVersion??It.version,boundBISite:{configured:!!this.config.BI_BASE_URL,baseUrl:this.config.BI_BASE_URL,publicPath:this.config.BI_PUBLIC_PATH}}}async start(){this.httpServer=mo((t,n)=>{this.handleRequest(t,n).catch(r=>{this.log("error","mcp_http_internal_error","Streamable HTTP request failed.",t,{statusCode:500,errorMessage:r instanceof Error?r.message:String(r)}),z(n,500,{error:"internal_error",message:r instanceof Error?r.message:String(r)})})}),await new Promise((t,n)=>{this.httpServer?.once("error",r=>{this.log("error","mcp_http_start_failed","Streamable HTTP server failed to start.",void 0,{host:this.config.MCP_HTTP_HOST??"127.0.0.1",port:this.config.MCP_HTTP_PORT??9090,errorMessage:r.message}),n(r)}),this.httpServer?.listen(this.config.MCP_HTTP_PORT??9090,this.config.MCP_HTTP_HOST??"127.0.0.1",()=>{this.httpServer?.removeAllListeners("error");let r=this.httpServer?.address(),i=typeof r=="object"&&r?r.port:this.config.MCP_HTTP_PORT??9090,s=this.config.MCP_HTTP_HOST??"127.0.0.1";this.log("info","mcp_http_started","Streamable HTTP server started.",void 0,{host:s,port:i,url:this.url(),boundBISite:wo(this.config),entrypointTokenConfigured:!!this.config.MCP_ENTRYPOINT_TOKEN,trustedGateway:ht(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://${Co(t,this.config.MCP_HTTP_HOST??"127.0.0.1")}:${t.port}`}async handleRequest(t,n){let r=hr(t);if(!r){z(n,400,{error:"bad_request"});return}if(Bo(r)&&t.method==="GET"){if(r==="/sysmon/health/readiness"){let a=this.readiness();z(n,a.ready?200:503,a);return}z(n,200,this.health());return}if(r!=="/mcp"){z(n,404,{error:"not_found"});return}if(!bo(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:ht(this.config.MCP_TRUSTED_GATEWAY)}),z(n,401,{error:"mcp_entrypoint_unauthorized"});return}let i=Pe(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,...mt(i),sessionCount:this.sessions.size}),z(n,404,{error:"mcp_session_not_found"});return}let s=await this.resolveSession(t);await s.transport.handleRequest(t,n);let o=s.transport.sessionId;o&&t.method!=="DELETE"&&!this.sessions.has(o)&&(this.sessions.set(o,s),this.log("info","mcp_session_created","Created Streamable HTTP MCP session.",t,{...mt(o),sessionCount:this.sessions.size}))}async resolveSession(t){let n=Pe(t.headers["mcp-session-id"]);if(n){let o=this.sessions.get(n);if(o)return o}let r=new _o({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,{...mt(o),sessionCount:this.sessions.size})}}),i=To(this.config,t.headers),s=await br(i,{...this.options,callerContextResolver:this.options.callerContextResolver??qt(i),capabilityResolver:this.options.capabilityResolver??(async()=>xt(i))});return await s.connect(r),{server:s,transport:r}}readiness(){let t=yo(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?hr(i):void 0;this.logger.record({level:t,event:n,mode:this.mode,message:r,method:i?.method,path:o,...s})}};function bo(e,t){if(ht(t.MCP_TRUSTED_GATEWAY)||oe(e))return!0;let n=t.MCP_ENTRYPOINT_TOKEN;return n?Pe(e.authorization)?.trim()===`Bearer ${n}`:!1}function Pe(e){return Array.isArray(e)?e[0]:e}function ht(e){return["1","true","yes","on"].includes(e?.trim().toLowerCase()??"")}function yo(e){let t=[];return e.BI_BASE_URL||t.push("BI_BASE_URL is required"),t}function To(e,t){let n=oe(t),r=Pe(t[K.client.toLowerCase()])?.trim();return{...e,BI_PAT:n,...r?{BI_CLIENT:r}:{}}}function z(e,t,n){e.headersSent||(e.writeHead(t,{"Content-Type":"application/json"}),e.end(JSON.stringify(n)))}function Co(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 Eo(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}function hr(e){try{return new URL(e.url??"/",`http://${e.headers.host??"localhost"}`).pathname}catch{return}}function Bo(e){return["/healthz","/sysmon/health/liveness","/sysmon/health/readiness"].includes(e)}function wo(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 mt(e){return{hasSessionId:!0,sessionIdHash:lo("sha256").update(e).digest("hex").slice(0,12)}}var Ro=So(import.meta.url),{version:Ao}=Ro("../package.json");async function Oo(){if(process.argv.slice(2).some(t=>t==="--version"||t==="-v")){process.stdout.write(`${Ao}
30
+ `);return}let e=Tt();await Ir(e).start()}Oo().catch(e=>{console.error(e instanceof Error?e.message:e),process.exit(1)});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@guandata/guanbi-mcp-server",
3
- "version": "0.1.20",
3
+ "version": "0.1.22",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "MCP server for exposing GuanBI capabilities to AI agents.",
@@ -14,7 +14,7 @@
14
14
  "chatbi",
15
15
  "ai-agent"
16
16
  ],
17
- "license": "UNLICENSED",
17
+ "license": "SEE LICENSE IN LICENSE",
18
18
  "packageManager": "pnpm@10.30.3",
19
19
  "publishConfig": {
20
20
  "access": "public",
@@ -25,7 +25,9 @@
25
25
  },
26
26
  "files": [
27
27
  "dist",
28
- ".env.example"
28
+ ".env.example",
29
+ "LICENSE",
30
+ "LICENSE.zh-CN"
29
31
  ],
30
32
  "scripts": {
31
33
  "dev": "tsx src/index.ts",