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