@guandata/guanbi-mcp-server 0.1.32 → 0.1.35

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/LICENSE ADDED
@@ -0,0 +1,133 @@
1
+ Guandata Developer Tools Free Evaluation License
2
+
3
+ Copyright (c) Hangzhou Guandata Co., Ltd.
4
+
5
+ This software and its related source code, documentation, examples, packages,
6
+ configuration files, command-line tools, MCP servers, SDKs, plugins, and tool
7
+ integrations are proprietary software of Hangzhou Guandata Co., Ltd. or its
8
+ licensors.
9
+
10
+ This license applies to Guandata developer tools, including but not limited to
11
+ Guandata CLI, Guandata MCP Server, related npm packages, source code,
12
+ documentation, examples, configuration files, and tool integrations.
13
+
14
+ 1. Free Personal Evaluation Use
15
+
16
+ Hangzhou Guandata Co., Ltd. grants you a limited, non-exclusive,
17
+ non-transferable, revocable license to use this software free of charge solely
18
+ for personal learning, local testing, technical evaluation, and non-production
19
+ experiments.
20
+
21
+ This free license does not permit enterprise, commercial, production, internal
22
+ business, team, organizational, hosted, customer-facing, or revenue-generating
23
+ use.
24
+
25
+ 2. Enterprise and Commercial Use
26
+
27
+ Any use by or for a company, organization, institution, government entity, team,
28
+ client, or other non-individual entity requires a separate commercial license
29
+ from Hangzhou Guandata Co., Ltd.
30
+
31
+ Enterprise or commercial use includes, but is not limited to:
32
+
33
+ - use in production, staging, shared, or hosted environments;
34
+ - use for internal business operations or automated business workflows;
35
+ - use by employees, contractors, consultants, service providers, or
36
+ representatives on behalf of an organization;
37
+ - integration into commercial products, services, platforms, workflows, AI
38
+ agents, MCP clients, or customer deliverables;
39
+ - connection to, access to, processing of, exposure of, or operation on
40
+ enterprise data, business systems, customer data, or production data;
41
+ - redistribution, hosting, resale, sublicensing, or provision of this software
42
+ as part of a paid or unpaid service.
43
+
44
+ To obtain an enterprise or commercial license, please contact Hangzhou Guandata
45
+ Co., Ltd. through its official sales, support, or business channels.
46
+
47
+ 3. MCP Server and Agent Integration
48
+
49
+ For Guandata MCP Server or any MCP-compatible tool integration, the free license
50
+ is limited to local personal testing, learning, and non-production evaluation.
51
+
52
+ The free license does not permit use of the MCP Server in enterprise agent
53
+ platforms, production AI applications, shared team environments,
54
+ customer-facing systems, hosted services, automated business workflows, or
55
+ integrations that access, process, expose, or operate on enterprise data.
56
+
57
+ Any organizational, commercial, hosted, production, or data-connected use of the
58
+ MCP Server requires a separate commercial license from Hangzhou Guandata Co., Ltd.
59
+
60
+ 4. Restrictions
61
+
62
+ Unless expressly permitted by this license, reasonably necessary to install and
63
+ use the software as allowed by this license, or expressly permitted by a
64
+ separate written agreement with Hangzhou Guandata Co., Ltd., you may not:
65
+
66
+ - copy, distribute, sublicense, sell, lease, host, or provide this software to
67
+ third parties;
68
+ - modify, adapt, translate, create derivative works of, or otherwise alter this
69
+ software;
70
+ - reverse engineer, decompile, disassemble, or attempt to derive the source
71
+ code, structure, sequence, organization, or underlying ideas of this software,
72
+ except to the extent such restriction is prohibited by applicable law;
73
+ - remove or alter copyright, trademark, license, or proprietary notices;
74
+ - use Guandata names, logos, trademarks, product names, or brand assets without
75
+ permission;
76
+ - use this software in violation of applicable laws, regulations, or third-party
77
+ rights;
78
+ - circumvent license, access control, usage limitation, telemetry, audit, or
79
+ security mechanisms, if any.
80
+
81
+ 5. Ownership
82
+
83
+ Hangzhou Guandata Co., Ltd. and its licensors retain all rights, title, and
84
+ interest in and to this software. No rights are granted except as expressly
85
+ stated in this license.
86
+
87
+ 6. Third-Party Components
88
+
89
+ Third-party open source components, if any, are licensed under their respective
90
+ licenses. This license applies only to software owned by Hangzhou Guandata Co., Ltd.
91
+ and does not modify any third-party license terms.
92
+
93
+ 7. No Warranty
94
+
95
+ This software is provided "as is" and "as available", without warranties of any
96
+ kind, whether express, implied, statutory, or otherwise, including but not
97
+ limited to warranties of merchantability, fitness for a particular purpose,
98
+ accuracy, availability, security, and non-infringement.
99
+
100
+ 8. Limitation of Liability
101
+
102
+ To the maximum extent permitted by applicable law, Hangzhou Guandata Co., Ltd.
103
+ shall not be liable for any indirect, incidental, special, consequential,
104
+ exemplary, or punitive damages, or for any loss of profits, revenue, data,
105
+ goodwill, business opportunity, or business interruption arising from or related
106
+ to this software, even if Hangzhou Guandata Co., Ltd. has been advised of the
107
+ possibility of such damages.
108
+
109
+ 9. Termination
110
+
111
+ Your rights under this license terminate automatically if you violate any term of
112
+ this license. Upon termination, you must stop using the software and delete all
113
+ copies in your possession or control.
114
+
115
+ 10. Governing Law and Dispute Resolution
116
+
117
+ This license shall be governed by the laws of the People's Republic of China,
118
+ without regard to its conflict of laws principles.
119
+
120
+ Any dispute arising from or related to this license or the software shall be
121
+ submitted to the competent court with jurisdiction in Hangzhou, Zhejiang
122
+ Province, China, unless otherwise required by applicable law.
123
+
124
+ 11. Contact
125
+
126
+ For enterprise licensing, commercial authorization, partnership, procurement, or
127
+ other questions, please contact Hangzhou Guandata Co., Ltd. through its official
128
+ website or official business channels.
129
+
130
+ 12. Language
131
+
132
+ If this license is provided in multiple languages, the English version controls
133
+ unless Hangzhou Guandata Co., Ltd. expressly states otherwise in writing.
package/LICENSE.zh-CN ADDED
@@ -0,0 +1,82 @@
1
+ 观远开发者工具免费评估许可协议
2
+
3
+ 版权所有 (c) 杭州观远数据有限公司。
4
+
5
+ 本软件及其相关源代码、文档、示例、软件包、配置文件、命令行工具、MCP Server、SDK、插件和工具集成,属于杭州观远数据有限公司或其授权方的专有软件。
6
+
7
+ 本协议适用于观远开发者工具,包括但不限于观远 CLI、观远 MCP Server、相关 npm 包、源代码、文档、示例、配置文件和工具集成。
8
+
9
+ 1. 免费个人评估使用
10
+
11
+ 杭州观远数据有限公司授予你一项有限的、非独占的、不可转让的、可撤销的许可,允许你免费使用本软件,但仅限于个人学习、本地测试、技术评估和非生产环境实验。
12
+
13
+ 本免费许可不允许企业使用、商业使用、生产环境使用、内部业务使用、团队使用、组织使用、托管使用、面向客户的使用,或任何直接或间接产生商业收益的使用。
14
+
15
+ 2. 企业及商业使用
16
+
17
+ 任何由公司、组织、机构、政府单位、团队、客户或其他非个人主体进行的使用,或代表上述主体进行的使用,均需事先取得杭州观远数据有限公司的单独商业授权。
18
+
19
+ 企业或商业使用包括但不限于:
20
+
21
+ - 在生产环境、预发布环境、共享环境或托管环境中使用;
22
+ - 用于内部业务运营或自动化业务流程;
23
+ - 由员工、承包商、顾问、服务商或代理人代表组织使用;
24
+ - 集成到商业产品、服务、平台、工作流、AI 智能体、MCP 客户端或客户交付物中;
25
+ - 连接、访问、处理、暴露或操作企业数据、业务系统、客户数据或生产数据;
26
+ - 对本软件进行分发、托管、转售、再许可,或作为任何付费或免费的服务的一部分提供。
27
+
28
+ 如需企业或商业授权,请通过观远官方销售、支持或商务渠道联系杭州观远数据有限公司。
29
+
30
+ 3. MCP Server 与智能体集成
31
+
32
+ 对于观远 MCP Server 或任何兼容 MCP 的工具集成,免费许可仅限于个人本地测试、学习和非生产环境评估。
33
+
34
+ 免费许可不允许将 MCP Server 用于企业级智能体平台、生产环境 AI 应用、团队共享环境、面向客户的系统、托管服务、自动化业务流程,或任何访问、处理、暴露、操作企业数据的集成场景。
35
+
36
+ 任何组织用途、商业用途、托管用途、生产用途,或涉及企业数据连接的 MCP Server 使用,均需取得杭州观远数据有限公司的单独商业授权。
37
+
38
+ 4. 限制
39
+
40
+ 除非本协议明确允许、为按照本协议安装和使用本软件所合理必需,或杭州观远数据有限公司通过单独书面协议明确允许,你不得:
41
+
42
+ - 复制、分发、再许可、销售、出租、托管本软件,或向第三方提供本软件;
43
+ - 修改、改编、翻译本软件,创作本软件的衍生作品,或以其他方式变更本软件;
44
+ - 对本软件进行反向工程、反编译、反汇编,或试图获取本软件的源代码、结构、顺序、组织方式或底层思想,但适用法律禁止限制的情形除外;
45
+ - 删除或修改版权、商标、许可或专有权利声明;
46
+ - 未经许可使用杭州观远数据有限公司或观远品牌的名称、标识、商标、产品名称或品牌资产;
47
+ - 以违反适用法律法规或第三方权利的方式使用本软件;
48
+ - 绕过任何许可、访问控制、使用限制、遥测、审计或安全机制。
49
+
50
+ 5. 权利归属
51
+
52
+ 本软件的所有权利、所有权和利益均归杭州观远数据有限公司及其授权方所有。除本协议明确授予的权利外,不授予任何其他权利。
53
+
54
+ 6. 第三方组件
55
+
56
+ 本软件中如包含第三方开源组件,该等组件适用其各自的许可协议。本协议仅适用于杭州观远数据有限公司拥有权利的软件部分,并不修改任何第三方许可条款。
57
+
58
+ 7. 无担保
59
+
60
+ 本软件按“现状”和“现有”基础提供,不作任何明示、默示、法定或其他形式的担保,包括但不限于适销性、特定用途适用性、准确性、可用性、安全性和不侵权担保。
61
+
62
+ 8. 责任限制
63
+
64
+ 在适用法律允许的最大范围内,杭州观远数据有限公司不对因本软件引起或与本软件相关的任何间接、附带、特殊、后果性、惩罚性或惩戒性损害承担责任,也不对利润、收入、数据、商誉、商业机会损失或业务中断承担责任,即使杭州观远数据有限公司已被告知可能发生该等损害。
65
+
66
+ 9. 终止
67
+
68
+ 如果你违反本协议的任何条款,你在本协议项下的权利将自动终止。终止后,你必须停止使用本软件,并删除你持有或控制的所有副本。
69
+
70
+ 10. 适用法律与争议解决
71
+
72
+ 本协议适用中华人民共和国法律,但不包括其冲突法规则。
73
+
74
+ 因本协议或本软件引起或与之相关的任何争议,应提交中国浙江省杭州市有管辖权的人民法院解决,除非适用法律另有强制性规定。
75
+
76
+ 11. 联系方式
77
+
78
+ 如需企业授权、商业许可、合作、采购或有其他问题,请通过观远官方网站或官方商务渠道联系杭州观远数据有限公司。
79
+
80
+ 12. 语言
81
+
82
+ 如本协议提供多个语言版本,除非杭州观远数据有限公司另有明确书面说明,以英文版本为准。
package/README.md CHANGED
@@ -130,12 +130,25 @@ BI_USER_PROPERTY_KEY=email
130
130
  - `execute_sql_query`:在支持的环境中执行单条只读 SQL 查询;建议先用 `get_dataset_detail` 确认数据集名称和字段名。`inputs` 只传对应数据集 ID,SQL 通常先用数据集名称作为表引用;若返回表名错误,按 `diagnostic.tableBindings` 提供的执行链路引用修正。支持无表查询和兼容的多数据集查询。
131
131
  - `get_dataset_detail`:获取数据集详情。
132
132
  - `get_card_info`:获取卡片元信息。
133
- - `query_card_data`:只读查询图表卡、筛选器、树筛选器和文本卡片数据,支持使用卡片关联数据集的任意字段构造结构化 filters,以及 columns 投影和 raw 诊断;图表卡按需自动分页,显式 limit 不设一万行硬上限。
133
+ - `query_card_data`:只读查询图表卡、筛选器、树筛选器和文本卡片的一页数据;支持结构化筛选、动态参数,以及当前图表卡自身的动态维度覆盖;单次最多 1000 行并受响应字节预算保护,text 和 `structuredContent` 都会返回 `columns` 与 `rows`,通过 `page.next_offset` 续页。
134
134
  - `get_page_info`:获取页面或仪表板元信息。
135
135
  - `search_metrics`、`list_metric_catalog`、`get_metric_detail`、`query_metric_data`:发现并查询指标平台指标。
136
136
  - `search_metric_trees`、`get_metric_tree_detail`、`query_metric_tree_attribution`:发现指标树并执行归因分析。
137
137
  - `chatbi_list_themes`、`chatbi_query`、`chatbi_insight_start`、`chatbi_insight_poll`:使用 ChatBI 主题、同步问数和异步洞察分析。
138
138
 
139
+ 动态维度覆盖示例:
140
+
141
+ ```json
142
+ {
143
+ "cd_id": "card-id",
144
+ "dynamic_fields": [
145
+ { "dimension": "区域维度", "fields": ["省份", "城市"] }
146
+ ]
147
+ }
148
+ ```
149
+
150
+ `dimension` 可传动态维度名或 `dzId`,`fields` 可传字段名、别名、`fdId` 或 `key`。CHART / METRIC_CHART 图表卡中未覆盖的动态维度会保留卡片默认值;带 `sourceDzIds` 的来源动态维度暂不支持。该参数可与 `dynamic_params` 和结构化 `filters` 同时使用;续页时除更新 `offset` 外,必须原样重传这些查询条件。
151
+
139
152
  ## 说明
140
153
 
141
154
  服务默认只发送匿名、聚合的使用统计事件。不会采集 SQL、自然语言问题、tool 参数、token、cookie、完整 URL、资源 ID、返回内容、用户 ID、账号或长期客户端标识。
package/dist/index.js CHANGED
@@ -1,20 +1,20 @@
1
1
  #!/usr/bin/env node
2
- import"dotenv/config";import{createRequire as na}from"module";import{z as w}from"zod";var qr="http://guandata-web:8088",Hr=w.object({BI_BASE_URL:w.string().url().optional().default(qr),BI_PUBLIC_PATH:w.string().optional().default(""),BI_PAT:w.string().optional(),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_APP_TOKEN:w.string().optional(),BI_LOGIN_ID_HEADER:w.string().optional(),BI_USER_PROPERTY_HEADER:w.string().optional(),BI_USER_PROPERTY_KEY:w.string().optional(),BI_IDENTITY_DEBUG:w.string().optional(),BI_IDENTITY_TOKEN_CACHE_TTL_MS:w.coerce.number().int().positive().default(6e5),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 Mt(e=process.env){let t=Hr.parse(e),n=t.MCP_TRANSPORT==="streamable-http";return{...t,BI_BASE_URL:t.BI_BASE_URL?.replace(/\/+$/,""),BI_PUBLIC_PATH:Gr(t.BI_PUBLIC_PATH),BI_PAT:n?void 0:t.BI_PAT?.trim()||void 0,BI_UID_TOKEN:t.BI_UID_TOKEN?.trim()||void 0,BI_LOGIN_DOMAIN:t.BI_LOGIN_DOMAIN?.trim()||"guanbi",BI_LOGIN_ID:t.BI_LOGIN_ID?.trim()||void 0,BI_LOGIN_PASSWORD:t.BI_LOGIN_PASSWORD?.trim()||void 0,BI_APP_TOKEN:t.BI_APP_TOKEN?.trim()||void 0,BI_LOGIN_ID_HEADER:t.BI_LOGIN_ID_HEADER===void 0?"x-guanbi-login-id":xt(t.BI_LOGIN_ID_HEADER),BI_USER_PROPERTY_HEADER:xt(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 xt(e){return e?.trim().toLowerCase()||void 0}import{createRequire as Lo}from"module";import{createHash as qo,randomUUID as Ho}from"crypto";import{createServer as Go}from"http";import{McpServer as Jo}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as $o}from"@modelcontextprotocol/sdk/server/stdio.js";import{StreamableHTTPServerTransport as Vo}from"@modelcontextprotocol/sdk/server/streamableHttp.js";var _e=class{record(t){console.error(JSON.stringify({audit:$r({...t})}))}},he=class{record(){}};function Ge(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"?Jr(i):void 0}}function Jr(e){return e instanceof Error?e.name||"Error":typeof e}function $r(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}async function Ie(e){if(!e.BI_LOGIN_ID||!e.BI_LOGIN_PASSWORD||!e.BI_LOGIN_DOMAIN)throw new Error("\u5BC6\u7801\u767B\u5F55\u9700\u8981\u914D\u7F6E BI_LOGIN_DOMAIN\u3001BI_LOGIN_ID\u3001BI_LOGIN_PASSWORD\u3002");let t=await fetch(Vr(e,"/api/user/sign-in"),{method:"POST",headers:{"Content-Type":"application/json","raw-backend-response":"TRUE"},body:JSON.stringify({domain:e.BI_LOGIN_DOMAIN,loginId:e.BI_LOGIN_ID,password:Buffer.from(e.BI_LOGIN_PASSWORD,"utf8").toString("base64")}),signal:AbortSignal.timeout(e.BI_REQUEST_TIMEOUT_MS)}),n=await t.text();if(!t.ok)throw new Error(`BI \u767B\u5F55\u5931\u8D25\uFF1AHTTP ${t.status} ${Xr(n)}`);let r=Fr(t,n);if(!r)throw new Error("BI \u767B\u5F55\u54CD\u5E94\u4E2D\u672A\u627E\u5230 X-Auth-Token/Authorization/uIdToken/authToken/token\u3002");return{token:r}}function Vr(e,t){return`${e.BI_BASE_URL}${e.BI_PUBLIC_PATH}${t}`}function Fr(e,t){let n=zr(e.headers);if(n)return n;let r=Qr(t);return r||Kr(e.headers)}function zr(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 Qr(e){try{let t=JSON.parse(e);return Dt(t)??Dt(Yr(t.response))}catch{return}}function Kr(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 Dt(e){if(e)for(let t of["uIdToken","authToken","token"]){let n=e[t];if(typeof n=="string"&&n)return n}}function Yr(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function Xr(e,t=500){return e.length>t?`${e.slice(0,t)}...`:e}var Zr="guanbi_mcp_chatbi",v=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}},M=class{constructor(t){this.config=t;this.token=t.BI_UID_TOKEN,this.candidates=t.BI_BASE_URL?ei(`${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=jt(t,"probe");return{available:!1,lastError:n,failureType:gi(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:pi})).themes}async query(t){let n=await this.resolveThemeId(t.themeId,t.themeName,!1),r={attachments:[],theme_id:n,message:t.message,config:Ut({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{hi(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:Nt(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,Nt(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 bi(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=Ut({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(ci(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 _i(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=jt(o,n.operation),!si(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 v&&(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 v(i,{operation:t,base_url:this.resolvedBaseUrl,path:n,chatbi_message:i,tried_base_urls:this.getTriedBaseUrls(),detail:i})}async requestToBaseUrlWithAuthRetry(t,n,r){if(this.config.BI_PAT)return this.requestToBaseUrl(t,n,{type:"pat",token:this.config.BI_PAT},r,{operation:r.operation,baseUrl:t,path:n});let i=await this.ensureToken(),s={operation:r.operation,baseUrl:t,path:n};try{return await this.requestToBaseUrl(t,n,{type:"uid",token:i},r,s)}catch(o){if(!oi(o)||!this.canRefreshToken())throw o;let a=await this.refreshToken();return this.requestToBaseUrl(t,n,{type:"uid",token:a},r,{...s,tokenRefreshed:!0})}}async requestToBaseUrl(t,n,r,i,s){let o=i.body===void 0?"GET":"POST",a;try{a=await fetch(`${t}${n}`,{method:o,headers:ti(r,i),body:i.body===void 0?void 0:JSON.stringify(i.body),signal:AbortSignal.timeout(i.requestTimeoutMs??this.config.BI_REQUEST_TIMEOUT_MS)})}catch(d){throw new v(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=ni(u,a,s);if(!a.ok||ri(c))throw ii(c,u,a,s);return r.type==="uid"&&this.refreshTokenFromResponse(a,c),c.data}async ensureToken(){return this.token?this.token:(this.loginPromise??=this.signInForToken().finally(()=>{this.loginPromise=void 0}),this.loginPromise)}async refreshToken(){return this.refreshPromise??=this.refreshTokenOnce().finally(()=>{this.refreshPromise=void 0}),this.refreshPromise}async refreshTokenOnce(){if(this.config.BI_UID_TOKEN_REFRESH){let t=await this.config.BI_UID_TOKEN_REFRESH();return this.token=t,t}return this.signInForToken()}async signInForToken(){this.token=void 0;let t=await Ie(this.config);return this.token=t.token,t.token}refreshTokenFromResponse(t,n){let r=mi(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 ei(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 ye(e){return e.BI_BASE_URL?e.BI_PAT||e.BI_UID_TOKEN?!0:!!(e.BI_LOGIN_DOMAIN&&e.BI_LOGIN_ID&&e.BI_LOGIN_PASSWORD):!1}function ti(e,t){let n={"User-Agent":"guanbi-mcp-server",...e.type==="pat"?{"X-Personal-Token":e.token}:{Cookie:`uIdToken=${e.token}`}};return t.body!==void 0&&(n["Content-Type"]="application/json"),t.includeDeviceId&&(n["Device-ID"]=Zr),n}function ni(e,t,n){if(!e)return{};try{return JSON.parse(e)}catch{throw new v("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:Ht(e)},{retryableForBaseUrl:!0})}}function ri(e){let t=Lt(e);return typeof t=="number"&&![0,200].includes(t)||e.result==="fail"||e.success===!1}function ii(e,t,n,r){let i=Lt(e),s=di(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:Ht(t)},u=li(o),c=!u&&ai(n.status,i);return new v(o,a,{authExpired:c,retryableForBaseUrl:u||ui(n.status,i)})}function si(e,t){return!!(t&&e instanceof v&&e.retryableForBaseUrl)}function oi(e){return e instanceof v&&e.authExpired}function ai(e,t){return e===401||e===403||t===401||t===403||t===5001}function ui(e,t){return[401,403,404,405].includes(e)||typeof t=="number"&&[401,403,404,405].includes(t)}function ci(e){return e instanceof v&&e.detail.http_status===200&&e.detail.chatbi_code===404&&e.detail.chatbi_message==="Message not found."}function Lt(e){if(typeof e.code=="number")return e.code;let t=be(e.error);return typeof t?.status=="number"?t.status:void 0}function di(e){if(typeof e.message=="string"&&e.message.trim())return e.message;let t=be(e.error);return typeof t?.message=="string"&&t.message.trim()?t.message:void 0}function li(e){return/No static resource/i.test(e)}function be(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function pi(e,t){let n=be(e);if(!Array.isArray(n?.themes))throw new v("ChatBI list-theme response missing themes",{operation:t.operation,base_url:t.baseUrl,path:t.path,detail:"missing themes"},{retryableForBaseUrl:!0})}function mi(e,t){let r=[...e.headers.getSetCookie?.()??[],...fi(e.headers.get("set-cookie"))].map(s=>Je(s.trim().match(/(?:^|;\s*)uIdToken=([^;]+)/)?.[1])).find(Boolean);if(r)return r;let i=Je(e.headers.get("x-auth-token"));return i||qt(t)}function fi(e){return e?e.split(/,(?=\s*[^;,]+=)/):[]}function Je(e){if(typeof e!="string")return;let t=e.trim();return t&&!/\s/.test(t)?t:void 0}function qt(e){let t=be(e);if(t){for(let n of["uIdToken","authToken"]){let r=Je(t[n]);if(r)return r}for(let n of["data","response"]){let r=qt(t[n]);if(r)return r}}}function jt(e,t){return e instanceof v?e.detail:{operation:t,detail:e instanceof Error?e.message:String(e)}}function Ht(e,t=1e3){return e.length>t?`${e.slice(0,t)}...`:e}function gi(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 _i(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 Ut(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>typeof t<"u"))}function hi(e){if([e.final_status,e.answer_status,e.query_status].some(yi))throw new Error(`ChatBI query failed: ${Ii(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 Ii(...e){return e.find(t=>typeof t=="string"&&t.trim())?.trim()}function yi(e){return typeof e=="string"&&e.trim().toLowerCase()==="failure"}function Nt(e){let t=e-Date.now();if(t<=0)throw new Error("Insight request timed out");return t}async function bi(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 ae="8.2.0",Ve=["search_metrics","list_metric_catalog","get_metric_detail","query_metric_data","search_metric_trees","get_metric_tree_detail","query_metric_tree_attribution"],Ti=["get_bi_capabilities","global_search",...Ve,"execute_sql_query","get_dataset_detail","get_card_info","query_card_data","get_page_info"],Ci=6e4,Ei="PAT \u6A21\u5F0F\u4EC5\u652F\u6301\u666E\u901A BI \u63A5\u53E3\uFF0C\u4E0D\u652F\u6301 ChatBI public-api\u3002",$e=new WeakMap;async function ue(e,t){let n=$e.get(e);return(!n||n.expiresAt<=Date.now())&&$e.set(e,{expiresAt:Date.now()+Ci,promise:wi(e,t).catch(r=>Bi(r,t))}),$e.get(e).promise}function $t(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:ze(e,t?["get_bi_capabilities"]:Fe(e)),caller:{ok:!1,error:r,features:{executeSqlQuery:{enabled:!1,minVersion:ae,reason:r}},chatbi:X(e,r)},features:{executeSqlQuery:{enabled:!t,minVersion:ae,reason:t?"\u914D\u7F6E\u4E0D\u5B8C\u6574\uFF1A\u7F3A\u5C11 BI_BASE_URL\u3002":n}},metricPlatform:{registeredTools:t?[]:Ve,readOnly:!0,lastError:t?"\u914D\u7F6E\u4E0D\u5B8C\u6574\uFF1A\u7F3A\u5C11 BI_BASE_URL\u3002":void 0},chatbi:X(e,"HTTP \u6A21\u5F0F\u542F\u52A8\u671F\u4E0D\u4F7F\u7528\u67D0\u4E2A\u7528\u6237 token \u63A2\u6D4B ChatBI \u80FD\u529B\u3002")}}async function Vt(e,t,n){let i=(await ue(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 Bi(e,t){let n=e instanceof Error?e.message:String(e);return{ok:!1,error:n,versionSource:"api",features:{executeSqlQuery:{enabled:!1,minVersion:ae,reason:`\u65E0\u6CD5\u786E\u8BA4 BI \u80FD\u529B\uFF1A${n}`}},metricPlatform:{registeredTools:[],readOnly:!0,lastError:n},chatbi:X(t,n),service:ze(t,Fe(t)),caller:{ok:!1,error:n,features:{executeSqlQuery:{enabled:!1,minVersion:ae,reason:`\u65E0\u6CD5\u786E\u8BA4 BI \u80FD\u529B\uFF1A${n}`}},chatbi:X(t,n)}}}async function wi(e,t){let n=Ri(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 Oi(e),s=Ai(i.capabilityVersion,ae),o=await Si(t);return{ok:!0,appVersion:i.appVersion,dataVersion:i.dataVersion,versionSource:r,service:ze(t,Fe(t)),caller:{ok:!0,features:{executeSqlQuery:s},chatbi:o},features:{executeSqlQuery:s},metricPlatform:{registeredTools:Ve,readOnly:!0},chatbi:o}}function Fe(e){let t=new Set(Ti);if(!e.BI_PAT&&(ye(e)||e.MCP_TRANSPORT==="streamable-http"))for(let n of new M(e).getRegisteredTools())t.add(n);return[...t]}function ze(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 Si(e){if(e.BI_PAT)return X(e,Ei);let t=new M(e);return ye(e)?t.probe():X(e,"\u7F3A\u5C11 BI_BASE_URL \u6216\u9274\u6743\u914D\u7F6E\u3002")}function X(e,t){return{available:!1,registeredTools:e.BI_PAT||!ye(e)?[]:new M(e).getRegisteredTools(),failureType:"unknown",triedBaseUrls:[],lastError:{operation:"probe",chatbi_message:t,detail:t}}}function Ri(e){let t=[];if(e.BI_BASE_URL||t.push("\u7F3A\u5C11 BI_BASE_URL"),!e.BI_PAT&&!e.BI_UID_TOKEN){let n=[["BI_LOGIN_DOMAIN",e.BI_LOGIN_DOMAIN],["BI_LOGIN_ID",e.BI_LOGIN_ID],["BI_LOGIN_PASSWORD",e.BI_LOGIN_PASSWORD]].filter(([,r])=>!r).map(([r])=>r);n.length&&t.push(`\u7F3A\u5C11\u9274\u6743\u914D\u7F6E\uFF1A\u8BF7\u914D\u7F6E BI_PAT\u3001BI_UID_TOKEN\uFF0C\u6216\u8865\u5168\u8D26\u53F7\u5BC6\u7801\u767B\u5F55\u914D\u7F6E\uFF08\u7F3A\u5C11 ${n.join("\u3001")}\uFF09`)}return t}async function Oi(e){let t=await e.get("/api/server-version"),n=Jt(t.version),r=Jt(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 Ai(e,t){let n=Gt(e),r=Gt(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=ki(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 Gt(e){let t=e.match(/(\d+)\.(\d+)\.(\d+)/);if(t)return[Number(t[1]),Number(t[2]),Number(t[3])]}function ki(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 Jt(e){return typeof e=="string"&&e.trim()?e.trim():void 0}var Te=class{constructor(t){this.config=t}config;cache=new Map;async exchange(t){let n=Ft(t),r=this.cache.get(this.cacheKey(n));if(r&&r.expiresAtMs>Date.now())return this.result(n,r.token,r.biExpireAt);let i=await this.fetchLoginIdToken(n);return this.cache.set(this.cacheKey(n),{token:i.token,expiresAtMs:this.resolveCacheExpiresAt(i.expireAt),biExpireAt:i.expireAt}),this.result(n,i.token,i.expireAt)}async exchangeUserProperty(t){let n=await this.fetchLoginIdByUserProperty(t);return this.exchange(n)}async refresh(t){return this.cache.delete(this.cacheKey(t)),(await this.exchange(t)).token}result(t,n,r){return{token:n,expireAt:r,refresh:()=>this.refresh(t)}}async fetchLoginIdByUserProperty(t){let n=Pi(t);if(!this.config.BI_BASE_URL)throw this.debugError("BI_BASE_URL is required for user property identity exchange.",{operation:"userPropertyLookup",request:{userPropertyValue:n}});if(!this.config.BI_APP_TOKEN)throw this.debugError("BI_APP_TOKEN is required for user property identity exchange.",{operation:"userPropertyLookup",request:{userPropertyValue:n}});let r=this.config.BI_USER_PROPERTY_KEY?.trim();if(!r)throw this.debugError("BI_USER_PROPERTY_KEY is required for user property identity exchange.",{operation:"userPropertyLookup",request:{userPropertyValue:n}});let i=this.buildUrl("/public-api/user/properties/list"),s={token:this.config.BI_APP_TOKEN,userPropertyKey:r,userPropertyValue:n,enabled:!0,offset:0,limit:2},o;try{o=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json","raw-backend-response":"TRUE"},body:JSON.stringify(s),signal:AbortSignal.timeout(this.config.BI_REQUEST_TIMEOUT_MS)})}catch(p){throw this.debugError(`BI user property lookup request failed: ${p instanceof Error?p.message:String(p)}`,{operation:"userPropertyLookup",request:{method:"POST",url:i,body:s},error:p instanceof Error?p.message:String(p)},[this.config.BI_APP_TOKEN])}let a=await o.text(),u=zt(a);if(!o.ok||Qt(u))throw this.debugError(`BI user property lookup failed: HTTP ${o.status} ${Qe(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 Ft(c[0]?.loginId??"")}async fetchLoginIdToken(t){if(!this.config.BI_BASE_URL)throw this.debugError("BI_BASE_URL is required for loginId identity exchange.",{operation:"loginIdSignIn",request:{loginId:t}});if(!this.config.BI_APP_TOKEN)throw this.debugError("BI_APP_TOKEN is required for loginId identity exchange.",{operation:"loginIdSignIn",request:{loginId:t}});let n=this.buildUrl("/public-api/user/loginId/sign-in"),r={token:this.config.BI_APP_TOKEN,loginId:t},i;try{i=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json","raw-backend-response":"TRUE"},body:JSON.stringify(r),signal:AbortSignal.timeout(this.config.BI_REQUEST_TIMEOUT_MS)})}catch(u){throw this.debugError(`BI loginId token exchange request failed: ${u instanceof Error?u.message:String(u)}`,{operation:"loginIdSignIn",request:{method:"POST",url:n,body:r},error:u instanceof Error?u.message:String(u)},[this.config.BI_APP_TOKEN])}let s=await i.text(),o=zt(s),a=o?.response?.token?.trim();if(!i.ok||Qt(o)||!a)throw this.debugError(`BI loginId token exchange failed: HTTP ${i.status} ${Qe(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=vi(t);return r?Math.min(n,r):n}debugError(t,n,r=[]){if(!Mi(this.config))return new Error(t);let i=Ke(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 Ft(e){let t=e.trim();if(!t)throw new Error("GuanBI loginId is required for loginId identity exchange.");return t}function Pi(e){let t=e.trim();if(!t)throw new Error("BI user property value is required for user property identity exchange.");return t}function zt(e){if(e.trim())try{return JSON.parse(e)}catch{return}}function Qt(e){return!e||e.result&&!["ok","success"].includes(e.result.toLowerCase())?!0:e.success===!1}function vi(e){if(!e)return;let t=e.replace(" ","T"),n=Date.parse(t);return Number.isFinite(n)?n:void 0}function Qe(e,t){let n=t.filter(r=>!!r).reduce((r,i)=>r.split(i).join("[redacted]"),e);return Di(n)}function Ke(e,t){let n=t.filter(r=>!!r);return typeof e=="string"?Qe(e,n):Array.isArray(e)?e.map(r=>Ke(r,n)):!e||typeof e!="object"?e:Object.fromEntries(Object.entries(e).map(([r,i])=>[r,xi(r)?"[redacted]":Ke(i,n)]))}function xi(e){return["token","authorization","cookie","uidtoken","uIdToken".toLowerCase()].includes(e.toLowerCase())}function Mi(e){return["1","true","yes","on"].includes(e.BI_IDENTITY_DEBUG?.trim().toLowerCase()??"")}function Di(e,t=1e3){return e.length>t?`${e.slice(0,t)}\u2026`:e}var te="x-personal-token";function ji(e){return{transport:"stdio",...e.BI_PAT?{biPatToken:e.BI_PAT}:{},biUidToken:e.BI_UID_TOKEN,audit:{}}}function Wt(e){return{resolve:()=>ji(e)}}function Ce(e){let t=ce(e);if(t)return{transport:"streamable-http",biPatToken:t,audit:Z(e)};let n=G(e,"x-guanbi-uid-token")?.trim();if(!n)throw new Error("\u7F3A\u5C11 GuanBI \u7528\u6237\u4EE4\u724C\uFF1A\u8BF7\u901A\u8FC7 X-GuanBI-Uid-Token \u4F20\u5165\u5F53\u524D\u7528\u6237 uIdToken\u3002");return{transport:"streamable-http",biUidToken:n,audit:Z(e)}}function Yt(e,t={}){let n=e?new Te(e):void 0,r=t.exchangeLoginId??t.exchange??(n?n.exchange.bind(n):void 0),i=t.exchangeUserProperty??(n?n.exchangeUserProperty.bind(n):void 0);return{resolve:async s=>{if(!s?.requestInfo?.headers)return e?.BI_PAT?{transport:"streamable-http",biPatToken:e.BI_PAT,audit:{}}:{transport:"streamable-http",audit:{}};let o=s.requestInfo.headers,a=ce(o);if(a)return{transport:"streamable-http",biPatToken:a,audit:Z(o)};if(e?.BI_PAT)return{transport:"streamable-http",biPatToken:e.BI_PAT,audit:Z(o)};if(G(o,"x-guanbi-uid-token")?.trim()||!e)return Ce(o);let c=e.BI_LOGIN_ID_HEADER,d=c?ee(G(o,c)):void 0;if(d){let h=await r?.(d);return h?{transport:"streamable-http",biUidToken:h.token,biUidTokenRefresh:h.refresh,loginId:d,audit:Z(o)}:Ce(o)}let p=e.BI_USER_PROPERTY_HEADER,g=p?ee(G(o,p)):void 0;if(g){let h=await i?.(g);return h?{transport:"streamable-http",biUidToken:h.token,biUidTokenRefresh:h.refresh,audit:Z(o)}:Ce(o)}throw Ui(o,e)}}}function ce(e){return ee(G(e,te))}function G(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 ee(e){return e?.trim()||void 0}function Z(e){return{tenantId:ee(G(e,"x-tenant-id")),endUserId:ee(G(e,"x-end-user-id")),traceId:ee(G(e,"x-trace-id"))}}function Ui(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:Ni(e,t),receivedHeaderNames:Li(e),receivedIdentityLikeHeaders:Kt(Object.fromEntries(We(e).filter(([i])=>Hi(i.toLowerCase()))),[te,"x-guanbi-uid-token",t.BI_LOGIN_ID_HEADER,t.BI_USER_PROPERTY_HEADER]),receivedHeaders:Kt(e,[te,"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 Ni(e,t){return[{source:"pat",name:te,present:Ee(e,te)},{source:"uidToken",name:"x-guanbi-uid-token",present:Ee(e,"x-guanbi-uid-token")},...t.BI_LOGIN_ID_HEADER?[{source:"loginId",name:t.BI_LOGIN_ID_HEADER,present:Ee(e,t.BI_LOGIN_ID_HEADER)}]:[],...t.BI_USER_PROPERTY_HEADER?[{source:"userProperty",name:t.BI_USER_PROPERTY_HEADER,present:Ee(e,t.BI_USER_PROPERTY_HEADER),userPropertyKey:t.BI_USER_PROPERTY_KEY}]:[]]}function Ee(e,t){return G(e,t)!==void 0}function Li(e){return[...new Set(We(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(We(e).map(([r,i])=>{let s=r.toLowerCase();return qi(s)?[s,"<redacted>"]:[s,n.has(s)?i:"<present>"]}))}function We(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 qi(e){return["authorization","cookie","set-cookie","x-guanbi-uid-token",te].includes(e)}function Hi(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()??"")}import{AsyncLocalStorage as Ji}from"async_hooks";var ne={client:"X-Guandata-Client",clientVersion:"X-Guandata-Client-Version",command:"X-Guandata-Command"},$i=new Set(Object.values(ne).map(e=>e.toLowerCase())),Xt=new Ji;function Zt(e,t){return Xt.run(e,t)}function Vi(e,t="mcp"){e=Xt.getStore()??e;let n={};n[ne.client]=e?.client.trim()||t.trim()||"mcp";let r=e?.clientVersion?.trim();r&&(n[ne.clientVersion]=r);let i=e?.command?.trim();return i&&(n[ne.command]=i),n}function en(e,t,n="mcp"){let r=Vi(t,n);return{...Ye(e),...r}}function Ye(e){return Object.fromEntries(Object.entries(e).filter(([t])=>!$i.has(t.toLowerCase())))}var we=class{constructor(t){this.config=t;this.token=t.BI_UID_TOKEN}config;token;async get(t,n){return this.request("GET",t,void 0,n)}async post(t,n,r){return this.request("POST",t,n,r)}async put(t,n,r){return this.request("PUT",t,n,r)}async getText(t){if(this.config.BI_PAT){let s=await fetch(this.buildUrl(t),{method:"GET",headers:this.patHeaders(this.config.BI_PAT,{"raw-backend-response":"TRUE"}),signal:AbortSignal.timeout(this.config.BI_REQUEST_TIMEOUT_MS)}),o=await s.text();if(!s.ok)throw new Error(`BI \u8BF7\u6C42\u5931\u8D25\uFF1AGET ${t} HTTP ${s.status} ${Be(o)}`);return o}let n=await this.ensureToken(),r=await fetch(this.buildUrl(t),{method:"GET",headers:this.uidHeaders(n,{"raw-backend-response":"TRUE"}),signal:AbortSignal.timeout(this.config.BI_REQUEST_TIMEOUT_MS)});if(this.shouldRefreshToken(r)){let s=await this.refreshToken();r=await fetch(this.buildUrl(t),{method:"GET",headers:this.uidHeaders(s,{"raw-backend-response":"TRUE"}),signal:AbortSignal.timeout(this.config.BI_REQUEST_TIMEOUT_MS)})}let i=await r.text();if(!r.ok)throw new Error(`BI \u8BF7\u6C42\u5931\u8D25\uFF1AGET ${t} HTTP ${r.status} ${Be(i)}`);return this.refreshTokenFromResponse(r),i}async request(t,n,r,i){if(this.config.BI_PAT){let u=await this.fetchWithPat(t,n,this.config.BI_PAT,r,i),c=await u.text();if(!u.ok)throw new Error(`BI \u8BF7\u6C42\u5931\u8D25\uFF1A${t} ${n} HTTP ${u.status} ${Be(c)}`);return tn(c)}let s=await this.ensureToken(),o=await this.fetchWithToken(t,n,s,r,i);if(this.shouldRefreshToken(o)){let u=await this.refreshToken();o=await this.fetchWithToken(t,n,u,r,i)}let a=await o.text();if(!o.ok)throw new Error(`BI \u8BF7\u6C42\u5931\u8D25\uFF1A${t} ${n} HTTP ${o.status} ${Be(a)}`);return this.refreshTokenFromResponse(o),tn(a)}async fetchWithToken(t,n,r,i,s){return fetch(this.buildUrl(n),{method:t,headers:this.uidHeaders(r,{"Content-Type":"application/json","raw-backend-response":"TRUE",...s?.headers}),body:t==="POST"||t==="PUT"?JSON.stringify(i??{}):void 0,signal:AbortSignal.timeout(this.config.BI_REQUEST_TIMEOUT_MS)})}async fetchWithPat(t,n,r,i,s){return fetch(this.buildUrl(n),{method:t,headers:this.patHeaders(r,{"Content-Type":"application/json","raw-backend-response":"TRUE",...s?.headers}),body:t==="POST"||t==="PUT"?JSON.stringify(i??{}):void 0,signal:AbortSignal.timeout(this.config.BI_REQUEST_TIMEOUT_MS)})}async ensureToken(){if(this.token)return this.token;let t=await Ie(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=zi(t);!n||n===this.token||(this.token=n)}shouldRefreshToken(t){return(!!this.config.BI_UID_TOKEN_REFRESH||this.hasPasswordLogin())&&t.status===401}hasPasswordLogin(){return!!(this.config.BI_LOGIN_DOMAIN&&this.config.BI_LOGIN_ID&&this.config.BI_LOGIN_PASSWORD)}uidHeaders(t,n){return{...Ye(n),Cookie:`uIdToken=${t}`}}patHeaders(t,n){return en({...n,"X-Personal-Token":t},this.config.BI_REQUEST_METADATA,this.config.BI_PAT_CLIENT)}buildUrl(t){let n=t.startsWith("/")?t:`/${t}`;return`${this.config.BI_BASE_URL}${this.config.BI_PUBLIC_PATH}${n}`}};function tn(e){if(!e)return;let t=JSON.parse(e);if(!Fi(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 Fi(e){return!e||typeof e!="object"||Array.isArray(e)?!1:"response"in e||"result"in e||"success"in e}function zi(e){return Qi(e.headers)??Wi(e.headers)}function Qi(e){return[...e.getSetCookie?.()??[],...Ki(e.get("set-cookie"))].map(n=>nn(n.trim().match(/(?:^|;\s*)uIdToken=([^;]+)/)?.[1])).find(Boolean)}function Ki(e){return e?e.split(/,(?=\s*[^;,]+=)/):[]}function Wi(e){return nn(e.get("x-auth-token"))}function nn(e){if(typeof e!="string")return;let t=e.trim();return t&&!/\s/.test(t)?t:void 0}function Be(e,t=1e3){return e.length>t?`${e.slice(0,t)}...`:e}var Se=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 we(i),config:{...i,BI_REQUEST_METADATA:r},context:t};return t.transport==="stdio"&&(this.stdioClient={...s,config:i}),s}resolveConfig(t,n){let r=t.biPatToken??this.baseConfig.BI_PAT,i=t.biUidToken??(t.transport==="stdio"?this.baseConfig.BI_UID_TOKEN:void 0),s=!!r;return{...this.baseConfig,BI_PAT:r,BI_UID_TOKEN:s?void 0:i,BI_UID_TOKEN_REFRESH:!s&&t.transport==="streamable-http"?t.biUidTokenRefresh:void 0,BI_LOGIN_DOMAIN:!s&&t.transport==="stdio"?this.baseConfig.BI_LOGIN_DOMAIN:"",BI_LOGIN_ID:!s&&t.transport==="stdio"?this.baseConfig.BI_LOGIN_ID:void 0,BI_LOGIN_PASSWORD:!s&&t.transport==="stdio"?this.baseConfig.BI_LOGIN_PASSWORD:void 0,BI_REQUEST_METADATA:n}}resolveRequestMetadata(t){let n=this.options.requestMetadata;if(n)return t?{...n,command:t}:{...n}}};var rn={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},Re=class{serviceDomain;appVersion;enabled;sender;now;constructor({config:t,appVersion:n,sender:r=Zi(),now:i=Date.now}){this.serviceDomain=ts(t.BI_BASE_URL),this.appVersion=n,this.enabled=es(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:ns(this.now()-t.startedAtMs),error_type:n.success?"none":is(n.error)};try{Promise.resolve(this.sender(r)).catch(()=>{})}catch{}}};function Yi(e=rn){return t=>Xi(t,e)}async function Xi(e,t=rn){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 rs(i,t.maxResponseBytes)}catch{}}function Zi(){return ss(process.env)?()=>{}:Yi()}function es(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 sn(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 ts(e){if(e)try{return new URL(e).hostname}catch{return}}function ns(e){return e<1e3?"<1s":e<5e3?"1-5s":e<3e4?"5-30s":e<12e4?"30-120s":">120s"}async function rs(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 is(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 ss(e){return e.NODE_ENV==="test"||e.VITEST==="true"}var Oe=class{constructor(t,n,r=new he){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 Zt(o.config.BI_REQUEST_METADATA,()=>t(o));if(r){let u=os(a)?"error":"success";this.auditLogger.record(Ge(r,s,i,u,a))}return a}catch(a){throw r&&this.auditLogger.record(Ge(r,s,i,"error",a)),a}}};function os(e){return!!(e&&typeof e=="object"&&e.isError===!0)}function N(e){return{content:[{type:"text",text:JSON.stringify(e,null,2)}]}}function S(e){let t=Ze(e);return{content:[{type:"text",text:JSON.stringify(t,null,2)}],structuredContent:t}}function $(e){let t=Ze(e);return{content:[{type:"text",text:JSON.stringify(t,null,2)}],isError:!0}}function de(e,t,n={}){return $({status:"error",diagnostic:Xe(e,t,n)})}function Xe(e,t,n={}){let r=t instanceof Error?t.message:String(t),i=r.match(/BI 请求失败:(?<method>[A-Z]+) (?<path>\S+) HTTP (?<status>\d+)/);return Ze({operation:e,path:i?.groups?.path,status:i?.groups?.status?Number(i.groups.status):void 0,message:r,...n})}function Ze(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}var on={};async function an(e,t){return N(await ue(e,t))}import{z as T}from"zod";var z=class extends Error{constructor(n,r){super(n.message,{cause:r});this.detail=n;this.name="MetricPlatformRequestError"}detail},L=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=I({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",tt("/api/metric-platform/metrics/full-tree",{projectId:t.projectId,nameLike:t.keyword}))}listMetricDirectoryTree(t){return this.get("listMetricDirectoryTree",tt("/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(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",tt("/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 et(t,n,s)}}async get(t,n,r){try{return await this.client.get(n,r?{headers:r}:void 0)}catch(i){throw et(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 et(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"]=re(this.config.BI_LOGIN_DOMAIN)),this.config.BI_LOGIN_ID&&(t["user-id"]=re(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=un(n.domId,n.domainId,n.domain,n.dom_id),i=un(n.email,n.loginId,n.userId,n.uId,n.uid);!t["x-dom-id"]&&r&&(t["x-dom-id"]=re(r)),!t["user-id"]&&i&&(t["user-id"]=re(i))}catch{}return t["x-dom-id"]||(t["x-dom-id"]=re(this.config.BI_LOGIN_DOMAIN||"guanbi")),t["user-id"]||(t["user-id"]=re(this.config.BI_LOGIN_ID||"unknown")),t}};function et(e,t,n){let r=n instanceof Error?n.message:String(n),i=r.match(/\bHTTP\s+(\d{3})\b/);return new z({operation:e,path:t,status:i?Number(i[1]):void 0,message:r},n)}function tt(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 I(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}function re(e){return Buffer.from(e,"utf8").toString("base64")}function un(...e){for(let t of e)if(typeof t=="string"&&t.trim())return t.trim()}var as=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"]),cn=new Set(["BT","CLOSE_BT_OPEN","OPEN_BT_CLOSE","OPEN_BT_OPEN"]),it=new Set(["IS_NULL","NOT_NULL"]),us=T.object({field:T.string().min(1).describe("\u5361\u7247\u5173\u8054\u6570\u636E\u96C6\u4E2D\u7684\u7B5B\u9009\u5B57\u6BB5\u540D\u79F0\u3001\u522B\u540D\u6216\u5B57\u6BB5 ID\u3002"),operator:as.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;it.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`}),cn.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`}),!cn.has(e.operator)&&!it.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`})}),cs=T.object({parameter:T.string().min(1).describe("\u52A8\u6001\u53C2\u6570\u540D\u79F0\u6216 dpId\u3002"),value:T.union([T.string(),T.number(),T.boolean()]).describe("\u52A8\u6001\u53C2\u6570\u8986\u76D6\u503C\uFF0C\u4F1A\u6309 BI dynamicParams.defaultValue \u4EE5\u5B57\u7B26\u4E32\u53D1\u9001\u3002")}),mn={cd_id:T.string().min(1).describe("\u5361\u7247 ID\u3002"),filters:T.array(us).optional().describe("\u7ED3\u6784\u5316\u7B5B\u9009\u6761\u4EF6\u3002\u4E0D\u652F\u6301 CLI \u98CE\u683C\u7B5B\u9009\u5B57\u7B26\u4E32\u3002"),dynamic_params:T.array(cs).optional().describe("\u56FE\u8868\u5361\u52A8\u6001\u53C2\u6570\u8986\u76D6\uFF0Cparameter \u53EF\u4F20\u53C2\u6570\u540D\u6216 dpId\uFF1B\u4EC5\u652F\u6301 CHART \u5361\u7247\u3002"),columns:T.array(T.string().min(1)).optional().describe("\u5BF9\u5DF2\u5C55\u5E73\u7ED3\u679C\u505A\u672C\u5730\u5217\u88C1\u526A\uFF0C\u4E0D\u53C2\u4E0E BI \u67E5\u8BE2\u8BED\u4E49\u3002"),limit:T.number().int().positive().optional().default(100).describe("\u6700\u591A\u8FD4\u56DE\u884C\u6570\uFF0C\u9ED8\u8BA4 100\uFF1B\u6570\u636E\u91CF\u8F83\u5927\u65F6\u4F1A\u81EA\u52A8\u5206\u9875\u8BFB\u53D6\u3002"),raw:T.boolean().optional().describe("\u662F\u5426\u8FD4\u56DE\u539F\u59CB\u54CD\u5E94\u3002")},fn={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 gn(e,t){try{let n=t.limit??100,r=await e.get(`/api/card/${encodeURIComponent(t.cd_id)}`),i=ls(r);if(i==="TEXT")return t.dynamic_params?.length?Ae("query_card_data",dn(i)):ds(t.cd_id,r,t.columns,t.raw);if(t.dynamic_params?.length&&i!=="CHART")return Ae("query_card_data",dn(i));let s=t.filters??[],o=await Os(e,r,s),a=Ts(s,o,i);if("unsupported"in a)return Ae("query_card_data",a.unsupported);let u=await Cs(e,t.dynamic_params??[]);if("unsupported"in u)return Ae("query_card_data",u.unsupported);let c=i==="CHART"?await ms(e,t.cd_id,n,a.filters,u.dynamicParams):await ps(e,_n(t.cd_id,i,n,a.filters,u.dynamicParams)),{endpoint:d,requestBody:p}=c.requests[0],g=c.data,h=i==="CHART"?gs(b(g.chartMain)):void 0,y=h?.rows??ys(g),C=Cn(y.slice(0,n),t.columns);return S({summary:I({cd_id:t.cd_id,card_type:i,chart_type:i==="CHART"?E(b(r.content).chartType):void 0,row_count:C.length,truncated:xs(i,g,C.length)}),columns:En(C),rows:C,diagnostic:I({mode:fs(i),card_type:i,endpoint:d,request_body:p,request_count:c.requests.length,request_bodies:c.requests.length>1?c.requests.map(k=>k.requestBody):void 0,alignment_issue_count:h?.alignmentIssueCount||void 0,alignment_issues:h?.alignmentIssues.length?h.alignmentIssues:void 0,raw_returned:t.raw===!0}),raw:t.raw?c.raw:void 0})}catch(n){return $({status:"error",diagnostic:Xe("query_card_data",n)})}}function ds(e,t,n,r){let i=b(t.content),s=bs(i),o=Cn(s?[{content:s}]:[],n);return S({summary:{cd_id:e,card_type:"TEXT",row_count:o.length,truncated:!1},columns:En(o),rows:o,diagnostic:{mode:"text_card_content",card_type:"TEXT",endpoint:`/api/card/${encodeURIComponent(e)}`,raw_returned:r===!0},raw:r?t:void 0})}function Ae(e,t){return S({status:"unsupported",diagnostic:{tool:e,...t}})}function dn(e){return{capability:"unsupported_dynamic_params",message:`dynamic_params \u4EC5\u652F\u6301 CHART \u56FE\u8868\u5361\u7247\uFF0C\u5F53\u524D\u5361\u7247\u7C7B\u578B\u4E3A ${e}`,card_type:e}}function ls(e){let t=E(e.cdType).toUpperCase();if(t==="SELECTOR"){let n=E(b(e.content).selectorType).toUpperCase();return n==="TREE"||n==="TREE_SELECTOR"?"TREE_SELECTOR":"SELECTOR"}return t==="TREE_SELECTOR"?"TREE_SELECTOR":t==="TEXT"?"TEXT":"CHART"}function _n(e,t,n,r,i,s=0){let o=encodeURIComponent(e);return t==="SELECTOR"?{endpoint:`/api/selector/${o}/data`,requestBody:I({fieldQuery:{offset:0,limit:n},filters:r.length?r:void 0})}:t==="TREE_SELECTOR"?{endpoint:`/api/treeSelector/${o}/data`,requestBody:I({limit:n,filters:r.length?r:void 0})}:{endpoint:`/api/card/${o}/data`,requestBody:I({view:"GRID",isUniversalStructure:!0,offset:s>0?s:void 0,limit:n,filters:r.length?r:void 0,dynamicParams:i.length?i:void 0})}}async function ps(e,t){let n=await e.post(t.endpoint,t.requestBody);return{raw:n,data:hn(n),requests:[t]}}async function ms(e,t,n,r,i){let o=[],a=[],u,c=0,d,p=!1,g=!1;for(;c<n;){let C=Math.min(1e3,n-c),k=_n(t,"CHART",C,r,i,c);o.push(k);let H=await e.post(k.endpoint,k.requestBody);a.push(H);let R=hn(H),B=b(R.chartMain);if(!Object.keys(B).length)return{raw:H,data:R,requests:o};u?_s(b(u.chartMain),B):u=Tn(R);let J=hs(B);c+=J,d=at(B.count)??d;let F=ke(B.hasMoreData);g=F!==void 0,p=F??!1;let Le=d!==void 0&&c>=d,qe=g?!p:Le||J<C;if(J===0||qe)break}let h=u??{},y=b(h.chartMain);return Object.keys(y).length&&(y.offset=0,y.limit=n,y.hasMoreData=g?p:d!==void 0&&c<d),{raw:a.length>1?{pages:a,merged:h}:a[0],data:h,requests:o}}function fs(e){return e==="SELECTOR"?"selector_card_data":e==="TREE_SELECTOR"?"tree_selector_card_data":"chart_card_data"}function hn(e){let t=b(e),n=b(t.data),r=b(b(t.content).data);return Object.keys(n).length?n:Object.keys(r).length?r:t}function gs(e){if(!Object.keys(e).length)return{rows:[],alignmentIssueCount:0,alignmentIssues:[]};let t=b(e.row),n=b(e.column),r=P(t.data??t.values),i=P(e.data),o=se(t.fields??t.meta).map((R,B)=>({header:ot(R)||`row_${B+1}`,shrinked:ke(R.isShrinkedInGroupTable)===!0})),a=Is(n),u=o.filter(R=>!R.shrinked).length,c=r.reduce((R,B)=>Math.max(R,P(B).length),u),d=Array.from({length:c-u},(R,B)=>`row_extra_${B+1}`),p=i.reduce((R,B)=>Math.max(R,P(B).length),a.length),g=Array.from({length:p},(R,B)=>a[B]||`metric_${B+1}`),h=Ms([...o.map(R=>R.header),...d,...g]),y=Math.max(r.length,i.length),C=[],k=[],H=0;for(let R=0;R<y;R+=1){let B=P(r[R]),J=P(i[R]),F=0,Le=o.map(ge=>{if(ge.shrinked)return null;let U=F<B.length?rt(B[F]):null;return F+=1,U}),qe=d.map((ge,U)=>{let vt=F+U;return vt<B.length?rt(B[vt]):null}),Nr=g.map((ge,U)=>U<J.length?rt(J[U]):null),He=[...Le,...qe,...Nr];if(!He.length)continue;let kt=B.length!==u,Pt=J.length!==a.length;(kt||Pt)&&(H+=1,k.length<20&&k.push(I({row_number:R+1,row_value_count:kt?{expected:u,actual:B.length}:void 0,metric_value_count:Pt?{expected:a.length,actual:J.length}:void 0})));let Lr=Math.max(h.length,He.length);C.push(Object.fromEntries(Array.from({length:Lr},(ge,U)=>[h[U]??`column_${U+1}`,He[U]??null])))}return{rows:C,alignmentIssueCount:H,alignmentIssues:k}}function _s(e,t){nt(e,t,"data");let n=b(e.row),r=b(t.row);nt(n,r,"data"),nt(n,r,"values")}function nt(e,t,n){let r=P(t[n]);r.length&&(e[n]=[...P(e[n]),...r])}function hs(e){let t=P(e.data);if(t.length)return t.length;let n=b(e.row);return P(n.data).length||P(n.values).length}function Is(e){let n=P(e.data??e.values).map((r,i)=>{let s=P(r).map(bn).filter(Boolean).join("/");return s||ot(se(e.fields??e.meta)[i])||`metric_${i+1}`}).filter(Boolean);return n.length?n:se(e.fields??e.meta).map(ot).filter(Boolean)}function ys(e){return se(e.result)}function bs(e){let n=P(b(e.body).blocks).map(r=>E(b(r).text)).filter(r=>r!=="");return n.length?n.join(`
5
- `):E(e.text)}function Ts(e,t,n){let r=[];for(let i of e){let s=ks(t,i.field,i.fd_id);if("unsupported"in s)return{unsupported:s.unsupported};r.push(I({name:s.field.name,fdId:s.field.fdId,fdType:s.field.fdType,filterLevel:n==="CHART"?As(s.field.metaType):void 0,filterType:i.operator,filterValue:Rs(i)}))}return{filters:r}}async function Cs(e,t){if(!t.length)return{dynamicParams:[]};let n=new Map,r=[];for(let a of t){let u=a.parameter.trim();if(n.has(u))return{unsupported:{capability:"unsupported_dynamic_params",parameter:u,message:`\u52A8\u6001\u53C2\u6570\u88AB\u91CD\u590D\u6307\u5B9A\uFF1A${u}`}};r.push(u),n.set(u,E(a.value))}let i=[...Es(await e.get("/api/dynamic-parameter/query")),...Bs()],s=[],o=new Map;for(let a of r){let u=ws(i,a);if("unsupported"in u)return{unsupported:u.unsupported};let c=Tn(u.param),d=ie(c,"dpId","dp_id"),p=o.get(d);if(p)return{unsupported:{capability:"unsupported_dynamic_params",parameter:a,message:`\u52A8\u6001\u53C2\u6570 ${p} \u548C ${a} \u6307\u5411\u540C\u4E00\u4E2A dpId\uFF1A${d}`}};o.set(d,a),c.defaultValue=n.get(a)??"";let g=Ss(c,a);if("unsupported"in g)return{unsupported:g.unsupported};s.push(c)}return{dynamicParams:s}}function Es(e){if(Array.isArray(e))return e.map(b).filter(n=>Object.keys(n).length);let t=b(e);for(let n of["response","data"]){let r=P(t[n]).map(b).filter(i=>Object.keys(i).length);if(r.length)return r}return[]}function Bs(){return[{dpId:"DATE_RANGE_PARAM_LEFT",name:"\u5F00\u59CB\u65E5\u671F\u53C2\u6570",valueType:"DATE",defaultValue:"",optionValue:[]},{dpId:"DATE_RANGE_PARAM_RIGHT",name:"\u7ED3\u675F\u65E5\u671F\u53C2\u6570",valueType:"DATE",defaultValue:"",optionValue:[]}]}function ws(e,t){let n=e.find(i=>ie(i,"dpId","dp_id")===t);if(n)return{param:n};let r=e.filter(i=>ie(i,"name")===t);return r.length===1?{param:r[0]}:r.length>1?{unsupported:{capability:"unsupported_dynamic_params",parameter:t,message:`\u52A8\u6001\u53C2\u6570\u540D\u5B58\u5728\u591A\u4E2A\u5339\u914D\u9879\uFF0C\u8BF7\u6539\u7528 dpId\uFF1A${t}`}}:{unsupported:{capability:"unsupported_dynamic_params",parameter:t,message:`\u672A\u627E\u5230\u52A8\u6001\u53C2\u6570\uFF1A${t}`}}}function Ss(e,t){let n=[ie(e,"dpId","dp_id")?void 0:"dpId",ie(e,"name")?void 0:"name",ie(e,"valueType","value_type")?void 0:"valueType"].filter(r=>!!r);return n.length?{unsupported:{capability:"unsupported_dynamic_params",parameter:t,message:`\u52A8\u6001\u53C2\u6570\u7F3A\u5C11\u5FC5\u8981 BI \u5143\u4FE1\u606F\uFF1A${t}`,missing_metadata:n}}:typeof e.defaultValue!="string"?{unsupported:{capability:"unsupported_dynamic_params",parameter:t,message:`\u52A8\u6001\u53C2\u6570 defaultValue \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\uFF1A${t}`}}:{ok:!0}}function ie(e,...t){for(let n of t){let r=E(e[n]);if(r)return r}return""}function Rs(e){return it.has(e.operator)?[]:(e.values??[]).map(E)}async function Os(e,t,n){let r=Ps(t);if(!n.some(o=>{let a=In(r,o.field,o.fd_id);return!a||!E(a.fd_id)}))return r;let i=b(b(t.content).dsInfo),s=D(i.dsId,i.ds_id);if(!s)return r;try{let o=await e.get(`/api/data-source/${encodeURIComponent(s)}`);return[...r,...yn(o)]}catch{return r}}function As(e){return e.toUpperCase()==="METRIC"?"AGGREGATION":"DETAIL"}function ks(e,t,n){let r=In(e,t,n);if(!r)return{unsupported:{capability:"unsupported_filter_field",parameter:t,message:`\u7B5B\u9009\u5B57\u6BB5\u65E0\u6CD5\u4ECE\u5361\u7247\u5173\u8054\u6570\u636E\u96C6\u89E3\u6790\uFF1A${t}`,supported_fields:e.map(c=>I({name:E(c.name),fd_id:E(c.fd_id),meta_type:E(c.meta_type)}))}};let i=E(r.name),s=E(r.fd_id),o=E(r.fd_type),a=E(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 In(e,t,n){if(n)return e.find(i=>E(i.fd_id)===n||E(i.id)===n);let r=t.trim();return e.find(i=>[i.fd_id,i.id].map(E).includes(r))??ln(e.filter(i=>E(i.name)===r))??ln(e.filter(i=>E(i.alias)===r))}function ln(e){return e.find(t=>E(t.fd_id))??e[0]}function Ps(e){let t=b(e.content),n=yn(b(t.dsInfo)),r=b(b(t.source).field);Object.keys(r).length&&n.push(st(r));let i=b(b(t.meta).chartMain),s=b(i.zoneData);for(let[o,a]of Object.entries(s))n.push(...se(a).map(u=>st(u,o)));return vs(n)}function yn(e){return se(e.columns).map(t=>({...st(t),meta_type:D(t.metaType,t.meta_type)??"DIM"}))}function st(e,t){return I({name:D(e.name,e.title,e.originTitle,e.alias),alias:D(e.alias,e.title),id:E(e.id),fd_id:D(e.fdId,e.fd_id,e.id),fd_type:D(e.fdType,e.fd_type),meta_type:D(e.metaType,e.meta_type),zone_id:D(e.zoneId,e.zone_id,t)})}function vs(e){let t=new Set;return e.filter(n=>{let r=D(n.fd_id,n.id,n.name,n.alias);return!r||t.has(r)?!1:(t.add(r),!0)})}function xs(e,t,n){if(e==="SELECTOR"||e==="TREE_SELECTOR")return ke(t.exceedLimit)?!0:pn(t,n);let r=b(t.chartMain);return ke(r.hasMoreData)?!0:pn(r,n)}function pn(e,t){let n=at(e.count),r=at(e.limit);return n!==void 0&&r!==void 0&&r>0?n>r:n!==void 0&&n>t}function ot(e){return D(e.title,e.alias,e.originTitle,e.name,e.fdId,e.id)??""}function bn(e){let t=b(e);return Object.keys(t).length?D(t.title,t.name,t.originTitle,t.alias,t.v,t.value)??"":E(e)}function rt(e){let t=b(e);return Object.keys(t).length?"v"in t?t.v:"value"in t?t.value:bn(e):e}function se(e){return Array.isArray(e)?e.map(b).filter(t=>Object.keys(t).length):[]}function P(e){return Array.isArray(e)?e:[]}function Tn(e){return JSON.parse(JSON.stringify(e))}function b(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function E(e){return typeof e=="string"?e:e==null?"":String(e)}function D(...e){return e.map(E).find(t=>t.trim())?.trim()}function ke(e){return typeof e=="boolean"?e:void 0}function at(e){return typeof e=="number"&&Number.isFinite(e)?e:void 0}function Cn(e,t){return t?.length?e.map(n=>Object.fromEntries(t.map(r=>[r,n[r]??null]))):e}function En(e){return[...new Set(e.flatMap(t=>Object.keys(t)))]}function Ms(e){let t=e.map((i,s)=>i||`column_${s+1}`),n=new Set(t),r=new Set;return t.map(i=>{if(!r.has(i))return r.add(i),i;for(let s=2;;s+=1){let o=`${i}_${s}`;if(!n.has(o)&&!r.has(o))return r.add(o),o}})}import{createHash as Ds}from"crypto";import{z as f}from"zod";var js=6e4,Q=1e4,Bn=10*6e4,Pe=new Map,ve=new Map,ut=new Map,ct=new Map,wn=f.object({format:f.literal("markdown").describe("\u6700\u7EC8\u7ED3\u679C\u683C\u5F0F\u3002"),content:f.string().describe("\u6700\u7EC8\u5C55\u793A\u7ED9\u8C03\u7528\u8005\u6216\u7528\u6237\u7684 markdown \u5185\u5BB9\u3002")}),Sn={themes:f.array(f.object({theme_id:f.string().optional(),theme_name:f.string().optional(),is_insight_enabled:f.boolean().optional()}).passthrough()),resolved_base_url:f.string().optional(),tried_base_urls:f.array(f.string()).optional()},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()},Ha={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:wn.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()},On={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()},An={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:wn.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()},kn={is_insight:f.boolean().optional().describe("\u662F\u5426\u53EA\u5217\u51FA\u6D1E\u5BDF\u4E3B\u9898\u3002")},Pn={theme_id:f.string().min(1).optional().describe("ChatBI \u4E3B\u9898 ID\u3002"),theme_name:f.string().min(1).optional().describe("ChatBI \u4E3B\u9898\u540D\u79F0\u3002"),message:f.string().min(1).describe("\u81EA\u7136\u8BED\u8A00\u95EE\u6570\u95EE\u9898\u3002"),session_id:f.string().min(1).optional().describe("\u53EF\u9009\u4F1A\u8BDD ID\uFF0C\u7528\u4E8E\u95EE\u6570\u7EED\u95EE\u3002\u540C\u4E00\u4E2A session_id \u53EA\u80FD\u7EE7\u7EED\u95EE\u6570\uFF0C\u4E0D\u80FD\u518D\u7528\u4E8E\u6D1E\u5BDF\u3002"),external_context:f.string().min(1).optional().describe("\u53EF\u9009\u5916\u90E8\u4E0A\u4E0B\u6587\u3002")},Ga={theme_id:f.string().min(1).optional().describe("ChatBI \u4E3B\u9898 ID\u3002"),theme_name:f.string().min(1).optional().describe("ChatBI \u4E3B\u9898\u540D\u79F0\u3002"),message:f.string().min(1).describe("\u81EA\u7136\u8BED\u8A00\u6D1E\u5BDF\u95EE\u9898\u3002"),session_id:f.string().min(1).optional().describe("\u53EF\u9009\u4F1A\u8BDD ID\uFF0C\u7528\u4E8E\u6D1E\u5BDF\u7EED\u95EE\u3002\u540C\u4E00\u4E2A session_id \u53EA\u80FD\u7EE7\u7EED\u6D1E\u5BDF\uFF0C\u4E0D\u80FD\u518D\u7528\u4E8E\u95EE\u6570\u3002"),external_context:f.string().min(1).optional().describe("\u53EF\u9009\u5916\u90E8\u4E0A\u4E0B\u6587\u3002"),timeout_ms:f.number().int().positive().optional().describe("\u7B49\u5F85\u6D1E\u5BDF\u5B8C\u6210\u7684\u8D85\u65F6\u65F6\u95F4\uFF0C\u9ED8\u8BA4 300000ms\u3002"),poll_interval_ms:f.number().int().positive().optional().describe("\u8F6E\u8BE2\u95F4\u9694\uFF0C\u9ED8\u8BA4 2000ms\u3002")},vn={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")},xn={theme_id:f.string().min(1).optional().describe("ChatBI \u4E3B\u9898 ID\u3002\u4F18\u5148\u4F7F\u7528 chatbi_insight_start \u8FD4\u56DE\u7684 theme_id\u3002"),theme_name:f.string().min(1).optional().describe("ChatBI \u4E3B\u9898\u540D\u79F0\uFF1B\u672A\u63D0\u4F9B theme_id \u65F6\u4F1A\u6309\u540D\u79F0\u67E5\u627E\u6D1E\u5BDF\u4E3B\u9898\u3002"),message_id:f.string().min(1).describe("chatbi_insight_start \u8FD4\u56DE\u7684\u6D88\u606F ID\u3002\u5EFA\u8BAE\u81F3\u5C11\u95F4\u9694 10 \u79D2\u67E5\u8BE2\u4E00\u6B21\uFF0C5 \u5206\u949F\u540E\u505C\u6B62\u7B49\u5F85\u3002")};async function Mn(e,t){let n=new M(e);try{let r=await n.listThemes({isInsight:t.is_insight});return S({themes:r,resolved_base_url:n.getResolvedBaseUrl(),tried_base_urls:n.getTriedBaseUrls()})}catch(r){return Me(n,r,"listThemes")}}async function Dn(e,t){let n=new M(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 S({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 Me(n,r,"query")}}async function jn(e,t){let n=new M(e);try{let r=Nn({caller_scope:Ln(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=Us(r);if(i)return S({...i,deduped:!0,retry_after_ms:Q,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=ut.get(r);if(s){let u=await s;return S({...u,deduped:!0,retry_after_ms:Q,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 Ns(r,c),c}).finally(()=>{ut.delete(r)});ut.set(r,o);let a=await o;return S({...a,deduped:!1,retry_after_ms:Q,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 Me(n,r,"insight.start")}}async function Un(e,t){let n=new M(e);try{let r=Nn({caller_scope:Ln(e),message_id:t.message_id}),i=Ls(r);if(i){let p=dt(i.result),g=pt(i.result,!0);return S({message_id:i.result.message_id,session_id:i.result.session_id,status:i.result.status,detail:lt(i.result),question:i.result.question,answer:i.result.answer,throttled:!0,retry_after_ms:i.retryAfterMs,...p,next_action:g})}let s=ct.get(r);if(s){let p=await s,g=ft(p.status),h=dt(p),y=pt(p,!0);return S({message_id:p.message_id,session_id:p.session_id,status:p.status,detail:lt(p),question:p.question,answer:p.answer,throttled:!0,retry_after_ms:g?0:Q,...h,next_action:y})}let o=n.pollInsight({themeId:t.theme_id,themeName:t.theme_name,messageId:t.message_id}).then(p=>(qs(r,p),p)).finally(()=>{ct.delete(r)});ct.set(r,o);let a=await o,u=ft(a.status),c=dt(a),d=pt(a,!1);return S({message_id:a.message_id,session_id:a.session_id,status:a.status,detail:lt(a),question:a.question,answer:a.answer,throttled:!1,retry_after_ms:u?0:Q,...c,next_action:d,resolved_base_url:n.getResolvedBaseUrl(),tried_base_urls:n.getTriedBaseUrls()})}catch(r){return Me(n,r,"insight.poll")}}function dt(e){return e.status!=="success"?{}:{final_result:{format:"markdown",content:qn(e)}}}function lt(e){return e.detail!=null?e.detail:e.status==="failure"||e.status==="stopped"?Hs(e):e.detail}function pt(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 Us(e){xe();let t=Pe.get(e);if(!(!t||Date.now()-t.createdAt>=js))return t.result}function Ns(e,t){xe(),Pe.set(e,{createdAt:Date.now(),result:t})}function Ls(e){xe();let t=ve.get(e);if(!t)return;let n=Date.now()-t.checkedAt,r=ft(t.result.status);if(!(!r&&n>=Q))return{result:t.result,retryAfterMs:r?0:Math.max(0,Q-n)}}function ft(e){return e==="success"||e==="failure"||e==="stopped"}function qs(e,t){xe(),ve.set(e,{checkedAt:Date.now(),result:t})}function xe(){let e=Date.now();for(let[t,n]of Pe)e-n.createdAt>=Bn&&Pe.delete(t);for(let[t,n]of ve)e-n.checkedAt>=Bn&&ve.delete(t)}function Nn(e){return JSON.stringify(Object.keys(e).sort().reduce((t,n)=>{let r=e[n];return typeof r<"u"&&(t[n]=r),t},{}))}function Ln(e){return e.BI_PAT?`pat:${mt(e.BI_PAT)}`:e.BI_UID_TOKEN?`uid:${mt(e.BI_UID_TOKEN)}`:`login:${mt(`${e.BI_LOGIN_DOMAIN??""}\0${e.BI_LOGIN_ID??""}`)}`}function mt(e){return Ds("sha256").update(e).digest("hex").slice(0,16)}function qn(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 Hs(e){switch(e.status){case"success":return qn(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 Gs(e,t){let n=[`| ${e.join(" | ")} |`,`|${e.map(()=>" --- ").join("|")}|`];for(let r of t)n.push(`| ${e.map((i,s)=>$s(Js(r[s]))).join(" | ")} |`);return n.join(`
6
- `)}function Js(e){return e===null||typeof e>"u"||e===""?"-":String(e)}function $s(e){return e.replaceAll(`\r
2
+ import"dotenv/config";import{createRequire as $a}from"module";import{z as B}from"zod";var li="http://guandata-web:8088",pi=B.object({BI_BASE_URL:B.string().url().optional().default(li),BI_PUBLIC_PATH:B.string().optional().default(""),BI_PAT:B.string().optional(),BI_UID_TOKEN:B.string().optional(),BI_LOGIN_DOMAIN:B.string().optional().default("guanbi"),BI_LOGIN_ID:B.string().optional(),BI_LOGIN_PASSWORD:B.string().optional(),BI_APP_TOKEN:B.string().optional(),BI_LOGIN_ID_HEADER:B.string().optional(),BI_USER_PROPERTY_HEADER:B.string().optional(),BI_USER_PROPERTY_KEY:B.string().optional(),BI_IDENTITY_DEBUG:B.string().optional(),BI_IDENTITY_TOKEN_CACHE_TTL_MS:B.coerce.number().int().positive().default(6e5),BI_REQUEST_TIMEOUT_MS:B.coerce.number().int().positive().default(12e4),BI_MAX_ROWS:B.coerce.number().int().positive().default(1e3),BI_DATA_VERSION:B.string().optional(),GUANBI_MCP_USAGE_STATS:B.string().optional(),MCP_TRANSPORT:B.enum(["stdio","streamable-http"]).optional().default("stdio"),MCP_HTTP_HOST:B.string().optional().default("127.0.0.1"),MCP_HTTP_PORT:B.coerce.number().int().nonnegative().optional().default(9090),MCP_ENTRYPOINT_TOKEN:B.string().optional(),MCP_TRUSTED_GATEWAY:B.string().optional()});function Kt(e=process.env){let t=pi.parse(e),n=t.MCP_TRANSPORT==="streamable-http";return{...t,BI_BASE_URL:t.BI_BASE_URL?.replace(/\/+$/,""),BI_PUBLIC_PATH:mi(t.BI_PUBLIC_PATH),BI_PAT:n?void 0:t.BI_PAT?.trim()||void 0,BI_UID_TOKEN:t.BI_UID_TOKEN?.trim()||void 0,BI_LOGIN_DOMAIN:t.BI_LOGIN_DOMAIN?.trim()||"guanbi",BI_LOGIN_ID:t.BI_LOGIN_ID?.trim()||void 0,BI_LOGIN_PASSWORD:t.BI_LOGIN_PASSWORD?.trim()||void 0,BI_APP_TOKEN:t.BI_APP_TOKEN?.trim()||void 0,BI_LOGIN_ID_HEADER:t.BI_LOGIN_ID_HEADER===void 0?"x-guanbi-login-id":Qt(t.BI_LOGIN_ID_HEADER),BI_USER_PROPERTY_HEADER:Qt(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 mi(e){let t=e?.trim().replace(/^\/+|\/+$/g,"")??"";return t?`/${t}`:""}function Qt(e){return e?.trim().toLowerCase()||void 0}import{createRequire as Aa}from"module";import{createHash as ka,randomUUID as Pa}from"crypto";import{createServer as xa}from"http";import{McpServer as va}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as Da}from"@modelcontextprotocol/sdk/server/stdio.js";import{StreamableHTTPServerTransport as Ma}from"@modelcontextprotocol/sdk/server/streamableHttp.js";var Oe=class{record(t){console.error(JSON.stringify({audit:gi({...t})}))}},Ae=class{record(){}};function et(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"?fi(i):void 0}}function fi(e){return e instanceof Error?e.name||"Error":typeof e}function gi(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}async function ke(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(_i(e,"/api/user/sign-in"),{method:"POST",headers:{"Content-Type":"application/json","raw-backend-response":"TRUE"},body:JSON.stringify({domain:e.BI_LOGIN_DOMAIN,loginId:e.BI_LOGIN_ID,password:Buffer.from(e.BI_LOGIN_PASSWORD,"utf8").toString("base64")}),signal:AbortSignal.timeout(e.BI_REQUEST_TIMEOUT_MS)}),n=await t.text();if(!t.ok)throw new Error(`BI \u767B\u5F55\u5931\u8D25\uFF1AHTTP ${t.status} ${wi(n)}`);let r=hi(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 _i(e,t){return`${e.BI_BASE_URL}${e.BI_PUBLIC_PATH}${t}`}function hi(e,t){let n=yi(e.headers);if(n)return n;let r=Ii(t);return r||bi(e.headers)}function yi(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 Ii(e){try{let t=JSON.parse(e);return Wt(t)??Wt(Ci(t.response))}catch{return}}function bi(e){return[...e.getSetCookie?.()??[],...Ti(e.get("set-cookie"))].map(n=>n.trim().match(/(?:^|;\s*)uIdToken=([^;]+)/)?.[1]).find(Boolean)}function Ti(e){return e?e.split(/,(?=\s*[^;,]+=)/):[]}function Wt(e){if(e)for(let t of["uIdToken","authToken","token"]){let n=e[t];if(typeof n=="string"&&n)return n}}function Ci(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function wi(e,t=500){return e.length>t?`${e.slice(0,t)}...`:e}var Ei="guanbi_mcp_chatbi",x=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}},M=class{constructor(t){this.config=t;this.token=t.BI_UID_TOKEN,this.candidates=t.BI_BASE_URL?Bi(`${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=Yt(t,"probe");return{available:!1,lastError:n,failureType:qi(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:Ui})).themes}async query(t){let n=await this.resolveThemeId(t.themeId,t.themeName,!1),r={attachments:[],theme_id:n,message:t.message,config:Xt({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{Ji(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:Zt(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,Zt(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 zi(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=Xt({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(Di(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 Hi(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=Yt(o,n.operation),!ki(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 x&&(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 x(i,{operation:t,base_url:this.resolvedBaseUrl,path:n,chatbi_message:i,tried_base_urls:this.getTriedBaseUrls(),detail:i})}async requestToBaseUrlWithAuthRetry(t,n,r){if(this.config.BI_PAT)return this.requestToBaseUrl(t,n,{type:"pat",token:this.config.BI_PAT},r,{operation:r.operation,baseUrl:t,path:n});let i=await this.ensureToken(),s={operation:r.operation,baseUrl:t,path:n};try{return await this.requestToBaseUrl(t,n,{type:"uid",token:i},r,s)}catch(o){if(!Pi(o)||!this.canRefreshToken())throw o;let a=await this.refreshToken();return this.requestToBaseUrl(t,n,{type:"uid",token:a},r,{...s,tokenRefreshed:!0})}}async requestToBaseUrl(t,n,r,i,s){let o=i.body===void 0?"GET":"POST",a;try{a=await fetch(`${t}${n}`,{method:o,headers:Ri(r,i),body:i.body===void 0?void 0:JSON.stringify(i.body),signal:AbortSignal.timeout(i.requestTimeoutMs??this.config.BI_REQUEST_TIMEOUT_MS)})}catch(d){throw new x(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=Si(u,a,s);if(!a.ok||Oi(c))throw Ai(c,u,a,s);return r.type==="uid"&&this.refreshTokenFromResponse(a,c),c.data}async ensureToken(){return this.token?this.token:(this.loginPromise??=this.signInForToken().finally(()=>{this.loginPromise=void 0}),this.loginPromise)}async refreshToken(){return this.refreshPromise??=this.refreshTokenOnce().finally(()=>{this.refreshPromise=void 0}),this.refreshPromise}async refreshTokenOnce(){if(this.config.BI_UID_TOKEN_REFRESH){let t=await this.config.BI_UID_TOKEN_REFRESH();return this.token=t,t}return this.signInForToken()}async signInForToken(){this.token=void 0;let t=await ke(this.config);return this.token=t.token,t.token}refreshTokenFromResponse(t,n){let r=Ni(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 Bi(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 Pe(e){return e.BI_BASE_URL?e.BI_PAT||e.BI_UID_TOKEN?!0:!!(e.BI_LOGIN_DOMAIN&&e.BI_LOGIN_ID&&e.BI_LOGIN_PASSWORD):!1}function Ri(e,t){let n={"User-Agent":"guanbi-mcp-server",...e.type==="pat"?{"X-Personal-Token":e.token}:{Cookie:`uIdToken=${e.token}`}};return t.body!==void 0&&(n["Content-Type"]="application/json"),t.includeDeviceId&&(n["Device-ID"]=Ei),n}function Si(e,t,n){if(!e)return{};try{return JSON.parse(e)}catch{throw new x("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:nn(e)},{retryableForBaseUrl:!0})}}function Oi(e){let t=en(e);return typeof t=="number"&&![0,200].includes(t)||e.result==="fail"||e.success===!1}function Ai(e,t,n,r){let i=en(e),s=Mi(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:nn(t)},u=ji(o),c=!u&&xi(n.status,i);return new x(o,a,{authExpired:c,retryableForBaseUrl:u||vi(n.status,i)})}function ki(e,t){return!!(t&&e instanceof x&&e.retryableForBaseUrl)}function Pi(e){return e instanceof x&&e.authExpired}function xi(e,t){return e===401||e===403||t===401||t===403||t===5001}function vi(e,t){return[401,403,404,405].includes(e)||typeof t=="number"&&[401,403,404,405].includes(t)}function Di(e){return e instanceof x&&e.detail.http_status===200&&e.detail.chatbi_code===404&&e.detail.chatbi_message==="Message not found."}function en(e){if(typeof e.code=="number")return e.code;let t=xe(e.error);return typeof t?.status=="number"?t.status:void 0}function Mi(e){if(typeof e.message=="string"&&e.message.trim())return e.message;let t=xe(e.error);return typeof t?.message=="string"&&t.message.trim()?t.message:void 0}function ji(e){return/No static resource/i.test(e)}function xe(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function Ui(e,t){let n=xe(e);if(!Array.isArray(n?.themes))throw new x("ChatBI list-theme response missing themes",{operation:t.operation,base_url:t.baseUrl,path:t.path,detail:"missing themes"},{retryableForBaseUrl:!0})}function Ni(e,t){let r=[...e.headers.getSetCookie?.()??[],...Li(e.headers.get("set-cookie"))].map(s=>tt(s.trim().match(/(?:^|;\s*)uIdToken=([^;]+)/)?.[1])).find(Boolean);if(r)return r;let i=tt(e.headers.get("x-auth-token"));return i||tn(t)}function Li(e){return e?e.split(/,(?=\s*[^;,]+=)/):[]}function tt(e){if(typeof e!="string")return;let t=e.trim();return t&&!/\s/.test(t)?t:void 0}function tn(e){let t=xe(e);if(t){for(let n of["uIdToken","authToken"]){let r=tt(t[n]);if(r)return r}for(let n of["data","response"]){let r=tn(t[n]);if(r)return r}}}function Yt(e,t){return e instanceof x?e.detail:{operation:t,detail:e instanceof Error?e.message:String(e)}}function nn(e,t=1e3){return e.length>t?`${e.slice(0,t)}...`:e}function qi(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 Hi(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 Xt(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>typeof t<"u"))}function Ji(e){if([e.final_status,e.answer_status,e.query_status].some(Fi))throw new Error(`ChatBI query failed: ${Gi(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 Gi(...e){return e.find(t=>typeof t=="string"&&t.trim())?.trim()}function Fi(e){return typeof e=="string"&&e.trim().toLowerCase()==="failure"}function Zt(e){let t=e-Date.now();if(t<=0)throw new Error("Insight request timed out");return t}async function zi(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 _e="8.2.0",rt=["search_metrics","list_metric_catalog","get_metric_detail","query_metric_data","search_metric_trees","get_metric_tree_detail","query_metric_tree_attribution"],$i=["get_bi_capabilities","global_search",...rt,"execute_sql_query","get_dataset_detail","get_card_info","query_card_data","get_page_info"],Vi=6e4,Qi="PAT \u6A21\u5F0F\u4EC5\u652F\u6301\u666E\u901A BI \u63A5\u53E3\uFF0C\u4E0D\u652F\u6301 ChatBI public-api\u3002",nt=new WeakMap;async function he(e,t){let n=nt.get(e);return(!n||n.expiresAt<=Date.now())&&nt.set(e,{expiresAt:Date.now()+Vi,promise:Wi(e,t).catch(r=>Ki(r,t))}),nt.get(e).promise}function on(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:st(e,t?["get_bi_capabilities"]:it(e)),caller:{ok:!1,error:r,features:{executeSqlQuery:{enabled:!1,minVersion:_e,reason:r}},chatbi:ie(e,r)},features:{executeSqlQuery:{enabled:!t,minVersion:_e,reason:t?"\u914D\u7F6E\u4E0D\u5B8C\u6574\uFF1A\u7F3A\u5C11 BI_BASE_URL\u3002":n}},metricPlatform:{registeredTools:t?[]:rt,readOnly:!0,lastError:t?"\u914D\u7F6E\u4E0D\u5B8C\u6574\uFF1A\u7F3A\u5C11 BI_BASE_URL\u3002":void 0},chatbi:ie(e,"HTTP \u6A21\u5F0F\u542F\u52A8\u671F\u4E0D\u4F7F\u7528\u67D0\u4E2A\u7528\u6237 token \u63A2\u6D4B ChatBI \u80FD\u529B\u3002")}}async function an(e,t,n){let i=(await he(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 Ki(e,t){let n=e instanceof Error?e.message:String(e);return{ok:!1,error:n,versionSource:"api",features:{executeSqlQuery:{enabled:!1,minVersion:_e,reason:`\u65E0\u6CD5\u786E\u8BA4 BI \u80FD\u529B\uFF1A${n}`}},metricPlatform:{registeredTools:[],readOnly:!0,lastError:n},chatbi:ie(t,n),service:st(t,it(t)),caller:{ok:!1,error:n,features:{executeSqlQuery:{enabled:!1,minVersion:_e,reason:`\u65E0\u6CD5\u786E\u8BA4 BI \u80FD\u529B\uFF1A${n}`}},chatbi:ie(t,n)}}}async function Wi(e,t){let n=Xi(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 Zi(e),s=es(i.capabilityVersion,_e),o=await Yi(t);return{ok:!0,appVersion:i.appVersion,dataVersion:i.dataVersion,versionSource:r,service:st(t,it(t)),caller:{ok:!0,features:{executeSqlQuery:s},chatbi:o},features:{executeSqlQuery:s},metricPlatform:{registeredTools:rt,readOnly:!0},chatbi:o}}function it(e){let t=new Set($i);if(!e.BI_PAT&&(Pe(e)||e.MCP_TRANSPORT==="streamable-http"))for(let n of new M(e).getRegisteredTools())t.add(n);return[...t]}function st(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 Yi(e){if(e.BI_PAT)return ie(e,Qi);let t=new M(e);return Pe(e)?t.probe():ie(e,"\u7F3A\u5C11 BI_BASE_URL \u6216\u9274\u6743\u914D\u7F6E\u3002")}function ie(e,t){return{available:!1,registeredTools:e.BI_PAT||!Pe(e)?[]:new M(e).getRegisteredTools(),failureType:"unknown",triedBaseUrls:[],lastError:{operation:"probe",chatbi_message:t,detail:t}}}function Xi(e){let t=[];if(e.BI_BASE_URL||t.push("\u7F3A\u5C11 BI_BASE_URL"),!e.BI_PAT&&!e.BI_UID_TOKEN){let n=[["BI_LOGIN_DOMAIN",e.BI_LOGIN_DOMAIN],["BI_LOGIN_ID",e.BI_LOGIN_ID],["BI_LOGIN_PASSWORD",e.BI_LOGIN_PASSWORD]].filter(([,r])=>!r).map(([r])=>r);n.length&&t.push(`\u7F3A\u5C11\u9274\u6743\u914D\u7F6E\uFF1A\u8BF7\u914D\u7F6E BI_PAT\u3001BI_UID_TOKEN\uFF0C\u6216\u8865\u5168\u8D26\u53F7\u5BC6\u7801\u767B\u5F55\u914D\u7F6E\uFF08\u7F3A\u5C11 ${n.join("\u3001")}\uFF09`)}return t}async function Zi(e){let t=await e.get("/api/server-version"),n=sn(t.version),r=sn(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 es(e,t){let n=rn(e),r=rn(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=ts(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 rn(e){let t=e.match(/(\d+)\.(\d+)\.(\d+)/);if(t)return[Number(t[1]),Number(t[2]),Number(t[3])]}function ts(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 sn(e){return typeof e=="string"&&e.trim()?e.trim():void 0}var ve=class{constructor(t){this.config=t}config;cache=new Map;async exchange(t){let n=un(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=ns(t);if(!this.config.BI_BASE_URL)throw this.debugError("BI_BASE_URL is required for user property identity exchange.",{operation:"userPropertyLookup",request:{userPropertyValue:n}});if(!this.config.BI_APP_TOKEN)throw this.debugError("BI_APP_TOKEN is required for user property identity exchange.",{operation:"userPropertyLookup",request:{userPropertyValue:n}});let r=this.config.BI_USER_PROPERTY_KEY?.trim();if(!r)throw this.debugError("BI_USER_PROPERTY_KEY is required for user property identity exchange.",{operation:"userPropertyLookup",request:{userPropertyValue:n}});let i=this.buildUrl("/public-api/user/properties/list"),s={token:this.config.BI_APP_TOKEN,userPropertyKey:r,userPropertyValue:n,enabled:!0,offset:0,limit:2},o;try{o=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json","raw-backend-response":"TRUE"},body:JSON.stringify(s),signal:AbortSignal.timeout(this.config.BI_REQUEST_TIMEOUT_MS)})}catch(l){throw this.debugError(`BI user property lookup request failed: ${l instanceof Error?l.message:String(l)}`,{operation:"userPropertyLookup",request:{method:"POST",url:i,body:s},error:l instanceof Error?l.message:String(l)},[this.config.BI_APP_TOKEN])}let a=await o.text(),u=cn(a);if(!o.ok||dn(u))throw this.debugError(`BI user property lookup failed: HTTP ${o.status} ${ot(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(l=>l.loginId).filter(Boolean)}},[this.config.BI_APP_TOKEN]);return un(c[0]?.loginId??"")}async fetchLoginIdToken(t){if(!this.config.BI_BASE_URL)throw this.debugError("BI_BASE_URL is required for loginId identity exchange.",{operation:"loginIdSignIn",request:{loginId:t}});if(!this.config.BI_APP_TOKEN)throw this.debugError("BI_APP_TOKEN is required for loginId identity exchange.",{operation:"loginIdSignIn",request:{loginId:t}});let n=this.buildUrl("/public-api/user/loginId/sign-in"),r={token:this.config.BI_APP_TOKEN,loginId:t},i;try{i=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json","raw-backend-response":"TRUE"},body:JSON.stringify(r),signal:AbortSignal.timeout(this.config.BI_REQUEST_TIMEOUT_MS)})}catch(u){throw this.debugError(`BI loginId token exchange request failed: ${u instanceof Error?u.message:String(u)}`,{operation:"loginIdSignIn",request:{method:"POST",url:n,body:r},error:u instanceof Error?u.message:String(u)},[this.config.BI_APP_TOKEN])}let s=await i.text(),o=cn(s),a=o?.response?.token?.trim();if(!i.ok||dn(o)||!a)throw this.debugError(`BI loginId token exchange failed: HTTP ${i.status} ${ot(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=rs(t);return r?Math.min(n,r):n}debugError(t,n,r=[]){if(!ss(this.config))return new Error(t);let i=at(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 un(e){let t=e.trim();if(!t)throw new Error("GuanBI loginId is required for loginId identity exchange.");return t}function ns(e){let t=e.trim();if(!t)throw new Error("BI user property value is required for user property identity exchange.");return t}function cn(e){if(e.trim())try{return JSON.parse(e)}catch{return}}function dn(e){return!e||e.result&&!["ok","success"].includes(e.result.toLowerCase())?!0:e.success===!1}function rs(e){if(!e)return;let t=e.replace(" ","T"),n=Date.parse(t);return Number.isFinite(n)?n:void 0}function ot(e,t){let n=t.filter(r=>!!r).reduce((r,i)=>r.split(i).join("[redacted]"),e);return os(n)}function at(e,t){let n=t.filter(r=>!!r);return typeof e=="string"?ot(e,n):Array.isArray(e)?e.map(r=>at(r,n)):!e||typeof e!="object"?e:Object.fromEntries(Object.entries(e).map(([r,i])=>[r,is(r)?"[redacted]":at(i,n)]))}function is(e){return["token","authorization","cookie","uidtoken","uIdToken".toLowerCase()].includes(e.toLowerCase())}function ss(e){return["1","true","yes","on"].includes(e.BI_IDENTITY_DEBUG?.trim().toLowerCase()??"")}function os(e,t=1e3){return e.length>t?`${e.slice(0,t)}\u2026`:e}var ae="x-personal-token";function as(e){return{transport:"stdio",...e.BI_PAT?{biPatToken:e.BI_PAT}:{},biUidToken:e.BI_UID_TOKEN,audit:{}}}function pn(e){return{resolve:()=>as(e)}}function De(e){let t=ye(e);if(t)return{transport:"streamable-http",biPatToken:t,audit:se(e)};let n=$(e,"x-guanbi-uid-token")?.trim();if(!n)throw new Error("\u7F3A\u5C11 GuanBI \u7528\u6237\u4EE4\u724C\uFF1A\u8BF7\u901A\u8FC7 X-GuanBI-Uid-Token \u4F20\u5165\u5F53\u524D\u7528\u6237 uIdToken\u3002");return{transport:"streamable-http",biUidToken:n,audit:se(e)}}function mn(e,t={}){let n=e?new ve(e):void 0,r=t.exchangeLoginId??t.exchange??(n?n.exchange.bind(n):void 0),i=t.exchangeUserProperty??(n?n.exchangeUserProperty.bind(n):void 0);return{resolve:async s=>{if(!s?.requestInfo?.headers)return e?.BI_PAT?{transport:"streamable-http",biPatToken:e.BI_PAT,audit:{}}:{transport:"streamable-http",audit:{}};let o=s.requestInfo.headers,a=ye(o);if(a)return{transport:"streamable-http",biPatToken:a,audit:se(o)};if(e?.BI_PAT)return{transport:"streamable-http",biPatToken:e.BI_PAT,audit:se(o)};if($(o,"x-guanbi-uid-token")?.trim()||!e)return De(o);let c=e.BI_LOGIN_ID_HEADER,d=c?oe($(o,c)):void 0;if(d){let h=await r?.(d);return h?{transport:"streamable-http",biUidToken:h.token,biUidTokenRefresh:h.refresh,loginId:d,audit:se(o)}:De(o)}let l=e.BI_USER_PROPERTY_HEADER,g=l?oe($(o,l)):void 0;if(g){let h=await i?.(g);return h?{transport:"streamable-http",biUidToken:h.token,biUidTokenRefresh:h.refresh,audit:se(o)}:De(o)}throw us(o,e)}}}function ye(e){return oe($(e,ae))}function $(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 oe(e){return e?.trim()||void 0}function se(e){return{tenantId:oe($(e,"x-tenant-id")),endUserId:oe($(e,"x-end-user-id")),traceId:oe($(e,"x-trace-id"))}}function us(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(!ms(t))return new Error(n);let r={operation:"resolveHttpCallerContext",expectedIdentityHeaders:cs(e,t),receivedHeaderNames:ds(e),receivedIdentityLikeHeaders:ln(Object.fromEntries(ut(e).filter(([i])=>ps(i.toLowerCase()))),[ae,"x-guanbi-uid-token",t.BI_LOGIN_ID_HEADER,t.BI_USER_PROPERTY_HEADER]),receivedHeaders:ln(e,[ae,"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 cs(e,t){return[{source:"pat",name:ae,present:Me(e,ae)},{source:"uidToken",name:"x-guanbi-uid-token",present:Me(e,"x-guanbi-uid-token")},...t.BI_LOGIN_ID_HEADER?[{source:"loginId",name:t.BI_LOGIN_ID_HEADER,present:Me(e,t.BI_LOGIN_ID_HEADER)}]:[],...t.BI_USER_PROPERTY_HEADER?[{source:"userProperty",name:t.BI_USER_PROPERTY_HEADER,present:Me(e,t.BI_USER_PROPERTY_HEADER),userPropertyKey:t.BI_USER_PROPERTY_KEY}]:[]]}function Me(e,t){return $(e,t)!==void 0}function ds(e){return[...new Set(ut(e).map(([t])=>t.toLowerCase()))].sort()}function ln(e,t){let n=new Set(t.filter(r=>!!r).map(r=>r.toLowerCase()));return Object.fromEntries(ut(e).map(([r,i])=>{let s=r.toLowerCase();return ls(s)?[s,"<redacted>"]:[s,n.has(s)?i:"<present>"]}))}function ut(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 ls(e){return["authorization","cookie","set-cookie","x-guanbi-uid-token",ae].includes(e)}function ps(e){return e.startsWith("x-")||e.includes("auth")||e.includes("login")||e.includes("token")||e.includes("uid")||e.includes("user")}function ms(e){return["1","true","yes","on"].includes(e.BI_IDENTITY_DEBUG?.trim().toLowerCase()??"")}import{AsyncLocalStorage as fs}from"async_hooks";var ue={client:"X-Guandata-Client",clientVersion:"X-Guandata-Client-Version",command:"X-Guandata-Command"},gs=new Set(Object.values(ue).map(e=>e.toLowerCase())),fn=new fs;function gn(e,t){return fn.run(e,t)}function _s(e,t="mcp"){e=fn.getStore()??e;let n={};n[ue.client]=e?.client.trim()||t.trim()||"mcp";let r=e?.clientVersion?.trim();r&&(n[ue.clientVersion]=r);let i=e?.command?.trim();return i&&(n[ue.command]=i),n}function _n(e,t,n="mcp"){let r=_s(t,n);return{...ct(e),...r}}function ct(e){return Object.fromEntries(Object.entries(e).filter(([t])=>!gs.has(t.toLowerCase())))}var hn=64*1024,dt=16*1024*1024,hs=8*1024,lt=class extends Error{constructor(n,r){super(r);this.status=n;this.name="BIHttpResponseError"}status},Ue=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,n){if(this.config.BI_PAT){let s=await fetch(this.buildUrl(t),{method:"GET",headers:this.patHeaders(this.config.BI_PAT,{"raw-backend-response":"TRUE"}),signal:Ie(this.config.BI_REQUEST_TIMEOUT_MS,n?.signal)});return s.ok||await je(s,"GET",t),s.text()}let r=await this.ensureToken(),i=await fetch(this.buildUrl(t),{method:"GET",headers:this.uidHeaders(r,{"raw-backend-response":"TRUE"}),signal:Ie(this.config.BI_REQUEST_TIMEOUT_MS,n?.signal)});if(this.shouldRefreshToken(i)){await pt(i,"retrying after BI authentication expired");let s=await this.refreshToken();i=await fetch(this.buildUrl(t),{method:"GET",headers:this.uidHeaders(s,{"raw-backend-response":"TRUE"}),signal:Ie(this.config.BI_REQUEST_TIMEOUT_MS,n?.signal)})}return i.ok||await je(i,"GET",t),this.refreshTokenFromResponse(i),i.text()}async request(t,n,r,i){if(this.config.BI_PAT){let u=await this.fetchWithPat(t,n,this.config.BI_PAT,r,i);u.ok||await je(u,t,n);let c=await yn(u,t,n);return Tn(c)}let s=await this.ensureToken(),o=await this.fetchWithToken(t,n,s,r,i);if(this.shouldRefreshToken(o)){await pt(o,"retrying after BI authentication expired");let u=await this.refreshToken();o=await this.fetchWithToken(t,n,u,r,i)}o.ok||await je(o,t,n);let a=await yn(o,t,n);return this.refreshTokenFromResponse(o),Tn(a)}async fetchWithToken(t,n,r,i,s){return fetch(this.buildUrl(n),{method:t,headers:this.uidHeaders(r,{"Content-Type":"application/json","raw-backend-response":"TRUE",...s?.headers}),body:t==="POST"||t==="PUT"?JSON.stringify(i??{}):void 0,signal:Ie(this.config.BI_REQUEST_TIMEOUT_MS,s?.signal)})}async fetchWithPat(t,n,r,i,s){return fetch(this.buildUrl(n),{method:t,headers:this.patHeaders(r,{"Content-Type":"application/json","raw-backend-response":"TRUE",...s?.headers}),body:t==="POST"||t==="PUT"?JSON.stringify(i??{}):void 0,signal:Ie(this.config.BI_REQUEST_TIMEOUT_MS,s?.signal)})}async ensureToken(){if(this.token)return this.token;let t=await ke(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=Ts(t);!n||n===this.token||(this.token=n)}shouldRefreshToken(t){return(!!this.config.BI_UID_TOKEN_REFRESH||this.hasPasswordLogin())&&t.status===401}hasPasswordLogin(){return!!(this.config.BI_LOGIN_DOMAIN&&this.config.BI_LOGIN_ID&&this.config.BI_LOGIN_PASSWORD)}uidHeaders(t,n){return{...ct(n),Cookie:`uIdToken=${t}`}}patHeaders(t,n){return _n({...n,"X-Personal-Token":t},this.config.BI_REQUEST_METADATA,this.config.BI_PAT_CLIENT)}buildUrl(t){let n=t.startsWith("/")?t:`/${t}`;return`${this.config.BI_BASE_URL}${this.config.BI_PUBLIC_PATH}${n}`}};function Ie(e,t){if(t?.aborted)return t;let n=AbortSignal.timeout(e);return t?AbortSignal.any([t,n]):n}async function je(e,t,n){let r=await Cn(e,hn),i=r.truncated?` [truncated after ${hn} bytes]`:"";throw new lt(e.status,`BI \u8BF7\u6C42\u5931\u8D25\uFF1A${t} ${n} HTTP ${e.status} ${Bs(r.text)}${i}`)}async function yn(e,t,n){let r=Is(e);r!==void 0&&r>dt&&(await pt(e,"BI JSON response exceeded byte limit"),In(t,n));let i=await Cn(e,dt);return i.truncated&&In(t,n),i.text}function In(e,t){throw new Error(`BI JSON \u54CD\u5E94\u8FC7\u5927\uFF1A${e} ${t} \u8D85\u8FC7 ${dt} \u5B57\u8282\uFF1B\u8BF7\u7F29\u5C0F\u67E5\u8BE2\u8303\u56F4\u6216\u964D\u4F4E query_card_data \u7684 limit/columns \u540E\u6309 next_offset \u5206\u9875\u8BFB\u53D6\u3002`)}async function Cn(e,t){if(!e.body)return{text:"",truncated:!1};let n=e.body.getReader(),r=new Uint8Array(Math.min(hs,t)),i=0;try{for(;;){let{done:s,value:o}=await n.read();if(s)return{text:new TextDecoder().decode(r.subarray(0,i)),truncated:!1};let a=t-i;if(o.byteLength>a)return a>0&&(r=bn(r,t,i+a),r.set(o.subarray(0,a),i),i+=a),await ys(n,"response body exceeded byte limit"),{text:new TextDecoder().decode(r.subarray(0,i)),truncated:!0};r=bn(r,t,i+o.byteLength),r.set(o,i),i+=o.byteLength}}finally{n.releaseLock()}}function bn(e,t,n){if(n<=e.byteLength)return e;let r=Math.min(t,Math.max(n,Math.max(1,e.byteLength)*2)),i=new Uint8Array(r);return i.set(e),i}async function ys(e,t){try{await e.cancel(new Error(t))}catch{}}async function pt(e,t){if(e.body)try{await e.body.cancel(new Error(t))}catch{}}function Is(e){let t=e.headers.get("content-length");if(!t)return;let n=Number(t);return Number.isSafeInteger(n)&&n>=0?n:void 0}function Tn(e){if(!e)return;let t=JSON.parse(e);if(!bs(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 bs(e){return!e||typeof e!="object"||Array.isArray(e)?!1:"response"in e||"result"in e||"success"in e}function Ts(e){return Cs(e.headers)??Es(e.headers)}function Cs(e){return[...e.getSetCookie?.()??[],...ws(e.get("set-cookie"))].map(n=>wn(n.trim().match(/(?:^|;\s*)uIdToken=([^;]+)/)?.[1])).find(Boolean)}function ws(e){return e?e.split(/,(?=\s*[^;,]+=)/):[]}function Es(e){return wn(e.get("x-auth-token"))}function wn(e){if(typeof e!="string")return;let t=e.trim();return t&&!/\s/.test(t)?t:void 0}function Bs(e,t=1e3){return e.length>t?`${e.slice(0,t)}...`:e}var Ne=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 Ue(i),config:{...i,BI_REQUEST_METADATA:r},context:t};return t.transport==="stdio"&&(this.stdioClient={...s,config:i}),s}resolveConfig(t,n){let r=t.biPatToken??this.baseConfig.BI_PAT,i=t.biUidToken??(t.transport==="stdio"?this.baseConfig.BI_UID_TOKEN:void 0),s=!!r;return{...this.baseConfig,BI_PAT:r,BI_UID_TOKEN:s?void 0:i,BI_UID_TOKEN_REFRESH:!s&&t.transport==="streamable-http"?t.biUidTokenRefresh:void 0,BI_LOGIN_DOMAIN:!s&&t.transport==="stdio"?this.baseConfig.BI_LOGIN_DOMAIN:"",BI_LOGIN_ID:!s&&t.transport==="stdio"?this.baseConfig.BI_LOGIN_ID:void 0,BI_LOGIN_PASSWORD:!s&&t.transport==="stdio"?this.baseConfig.BI_LOGIN_PASSWORD:void 0,BI_REQUEST_METADATA:n}}resolveRequestMetadata(t){let n=this.options.requestMetadata;if(n)return t?{...n,command:t}:{...n}}};var En={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},Le=class{serviceDomain;appVersion;enabled;sender;now;constructor({config:t,appVersion:n,sender:r=Os(),now:i=Date.now}){this.serviceDomain=ks(t.BI_BASE_URL),this.appVersion=n,this.enabled=As(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:Ps(this.now()-t.startedAtMs),error_type:n.success?"none":vs(n.error)};try{Promise.resolve(this.sender(r)).catch(()=>{})}catch{}}};function Rs(e=En){return t=>Ss(t,e)}async function Ss(e,t=En){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 xs(i,t.maxResponseBytes)}catch{}}function Os(){return Ds(process.env)?()=>{}:Rs()}function As(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 Bn(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 ks(e){if(e)try{return new URL(e).hostname}catch{return}}function Ps(e){return e<1e3?"<1s":e<5e3?"1-5s":e<3e4?"5-30s":e<12e4?"30-120s":">120s"}async function xs(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 vs(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 Ds(e){return e.NODE_ENV==="test"||e.VITEST==="true"}var qe=class{constructor(t,n,r=new Ae,i=12e4){this.callerContextResolver=t;this.clientFactory=n;this.auditLogger=r;this.requestTimeoutMs=i}callerContextResolver;clientFactory;auditLogger;requestTimeoutMs;async run(t,n,r){let i=Date.now(),s=Ms(n?.signal,this.requestTimeoutMs);s.throwIfAborted();let o=await Rn(this.callerContextResolver.resolve(n),s),a=this.clientFactory.create(o,r),u={...a,signal:s};try{let c=await Rn(gn(a.config.BI_REQUEST_METADATA,()=>t(u)),s);if(r){let d=js(c)?"error":"success";this.auditLogger.record(et(r,o,i,d,c))}return c}catch(c){throw r&&this.auditLogger.record(et(r,o,i,"error",c)),c}}};function Ms(e,t){let n=AbortSignal.timeout(t);return e?AbortSignal.any([e,n]):n}function Rn(e,t){return new Promise((n,r)=>{if(t.aborted){r(t.reason);return}let i=()=>r(t.reason);t.addEventListener("abort",i,{once:!0}),Promise.resolve(e).then(s=>{t.removeEventListener("abort",i),n(s)},s=>{t.removeEventListener("abort",i),r(s)})})}function js(e){return!!(e&&typeof e=="object"&&e.isError===!0)}function H(e){return{content:[{type:"text",text:JSON.stringify(e,null,2)}]}}function R(e,t={}){let n=ft(e),r=t.text===void 0?n:t.text;return{content:[{type:"text",text:typeof r=="string"?r:JSON.stringify(r,null,2)}],structuredContent:n}}function Q(e){let t=ft(e);return{content:[{type:"text",text:JSON.stringify(t,null,2)}],isError:!0}}function be(e,t,n={}){return Q({status:"error",diagnostic:mt(e,t,n)})}function mt(e,t,n={}){let r=t instanceof Error?t.message:String(t),i=r.match(/BI 请求失败:(?<method>[A-Z]+) (?<path>\S+) HTTP (?<status>\d+)/);return ft({operation:e,path:i?.groups?.path,status:i?.groups?.status?Number(i.groups.status):void 0,message:r,...n})}function ft(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}var Sn={};async function On(e,t){return H(await he(e,t))}import{z as I}from"zod";var W=class extends Error{constructor(n,r){super(n.message,{cause:r});this.detail=n;this.name="MetricPlatformRequestError"}detail},J=class{constructor(t,n){this.client=t;this.config=n}client;config;contextHeadersPromise;listProjects(){return this.get("listProjects","/api/metric-platform/projects")}searchMetrics(t){let n=_({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",_t("/api/metric-platform/metrics/full-tree",{projectId:t.projectId,nameLike:t.keyword}))}listMetricDirectoryTree(t){return this.get("listMetricDirectoryTree",_t("/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",_t("/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 gt(t,n,s)}}async get(t,n,r){try{return await this.client.get(n,r?{headers:r}:void 0)}catch(i){throw gt(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 gt(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"]=ce(this.config.BI_LOGIN_DOMAIN)),this.config.BI_LOGIN_ID&&(t["user-id"]=ce(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=An(n.domId,n.domainId,n.domain,n.dom_id),i=An(n.email,n.loginId,n.userId,n.uId,n.uid);!t["x-dom-id"]&&r&&(t["x-dom-id"]=ce(r)),!t["user-id"]&&i&&(t["user-id"]=ce(i))}catch{}return t["x-dom-id"]||(t["x-dom-id"]=ce(this.config.BI_LOGIN_DOMAIN||"guanbi")),t["user-id"]||(t["user-id"]=ce(this.config.BI_LOGIN_ID||"unknown")),t}};function gt(e,t,n){let r=n instanceof Error?n.message:String(n),i=r.match(/\bHTTP\s+(\d{3})\b/);return new W({operation:e,path:t,status:i?Number(i[1]):void 0,message:r},n)}function _t(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 ce(e){return Buffer.from(e,"utf8").toString("base64")}function An(...e){for(let t of e)if(typeof t=="string"&&t.trim())return t.trim()}import{z as He}from"zod";var xn=He.object({dimension:He.string().trim().min(1).max(512).describe("\u52A8\u6001\u7EF4\u5EA6\u540D\u79F0\u6216 dzId\u3002"),fields:He.array(He.string().trim().min(1).max(512)).min(1).max(100).describe("\u52A8\u6001\u7EF4\u5EA6\u5019\u9009\u5B57\u6BB5\u540D\u79F0\u3001\u522B\u540D\u3001fdId \u6216 key\uFF1BmultiSelect=true \u65F6\u53EF\u4F20\u591A\u4E2A\u3002")}),Je=100,ht=512;function vn(e,t,n){if(!n.length)return{dynamicFieldFilters:[]};let r=Us(e);if(!r.size){let o=n[0].dimension;return{unsupported:{capability:"unsupported_dynamic_fields",dimension:O(o),diagnostic_values_truncated:V(o),message:"\u5F53\u524D\u5361\u7247\u672A\u66B4\u9732\u52A8\u6001\u7EF4\u5EA6\u914D\u7F6E\uFF1B\u8BF7\u5148\u7528 get_card_info \u67E5\u770B dynamicZoneInfo\u3002"}}}for(let o of r.values()){let a=o.name||o.dzId;if(o.sourceRefsInvalid)return{unsupported:{capability:"unsupported_dynamic_fields",dimension:O(a),dz_id:O(o.dzId),diagnostic_values_truncated:V(a,o.dzId),reason:"invalid_source_dz_ids",message:"\u52A8\u6001\u7EF4\u5EA6 sourceDzIds \u5143\u6570\u636E\u683C\u5F0F\u975E\u6CD5\uFF0C\u65E0\u6CD5\u5B89\u5168\u6784\u5EFA\u5B8C\u6574\u9009\u62E9\u96C6\u3002"}};if(o.sourceRefs.length){let u=o.sourceRefs[0];return{unsupported:{capability:"unsupported_dynamic_fields",dimension:O(a),dz_id:O(o.dzId),source_cd_id:O(u.cdId),source_dz_id:O(u.dzId),diagnostic_values_truncated:V(a,o.dzId,u.cdId,u.dzId),message:"\u5F53\u524D\u4EC5\u652F\u6301\u6240\u6709\u52A8\u6001\u7EF4\u5EA6\u5747\u65E0 sourceDzIds \u7684\u5361\u7247\u81EA\u8EAB\u52A8\u6001\u7EF4\u5EA6\u3002"}}}}let i=new Map;for(let o of n){let a=Ns(r,o.dimension);if("unsupported"in a)return a;let u=a.meta;if(!u.keys.size){let d=o.dimension;return{unsupported:{capability:"unsupported_dynamic_fields",dimension:O(d),dz_id:O(u.dzId),diagnostic_values_truncated:V(d,u.dzId),message:"\u52A8\u6001\u7EF4\u5EA6\u672A\u66B4\u9732\u53EF\u7528\u5B57\u6BB5\uFF1B\u8BF7\u5148\u7528 get_card_info \u67E5\u770B\u5019\u9009 key\u3002"}}}let c=i.get(u.dzId);c||(c={meta:u,keys:[],seen:new Set},i.set(u.dzId,c));for(let d of o.fields){let l=Ls(u,d);if("unsupported"in l)return l;c.seen.has(l.key)||(c.seen.add(l.key),c.keys.push(l.key))}}let s=[];for(let o of r.values()){let u=i.get(o.dzId)?.keys??o.defaultKeys;if(!o.multiSelect&&u.length>1){let c=o.name||o.dzId;return{unsupported:{capability:"unsupported_dynamic_fields",dimension:O(c),dz_id:O(o.dzId),diagnostic_values_truncated:V(c,o.dzId),message:"\u8BE5\u52A8\u6001\u7EF4\u5EA6\u662F\u5355\u9009\u914D\u7F6E\uFF0C\u4E0D\u80FD\u540C\u65F6\u6307\u5B9A\u591A\u4E2A\u5B57\u6BB5\u3002"}}}s.push(...u.map(c=>({dzId:o.dzId,key:c,sourceCdId:t})))}return{dynamicFieldFilters:s}}function Us(e){let t=Y(Y(Y(e.content).meta).chartMain),n=kn(Y(t.dynamicZoneInfo).dzMappings),r=new Map;for(let s of n){let o=G(s.dzId);if(!o)continue;let a=r.get(o)??{dzId:o,name:"",keys:new Set,defaultKeys:[],options:[],multiSelect:!1,sourceRefs:[],sourceRefsInvalid:!1};a.name=G(s.name),a.multiSelect=qs(s.multiSelect)===!0;for(let u of Pn(s.defaultValue).map(G).filter(Boolean))a.keys.has(u)||a.defaultKeys.push(u),a.keys.add(u);"sourceDzIds"in s&&!Array.isArray(s.sourceDzIds)?a.sourceRefsInvalid=!0:a.sourceRefs.push(...Pn(s.sourceDzIds).map(Y).map(u=>({cdId:G(u.cdId),dzId:G(u.dzId)}))),r.set(o,a)}let i=new Set;for(let s of Object.values(Y(t.zoneData)))for(let o of kn(s)){let a=G(o.dzId),u=G(o.key),c=r.get(a);if(!c||!u)continue;c.keys.add(u);let d=`${a}\0${u}`;i.has(d)||(i.add(d),c.options.push({key:u,fdId:G(o.fdId),name:G(o.name),alias:G(o.alias)}))}return r}function Ns(e,t){let n=t.trim(),r=new Map,i=e.get(n);i&&r.set(i.dzId,i);for(let u of e.values())u.name===n&&r.set(u.dzId,u);if(r.size===1)return{meta:r.values().next().value};let s=[...e.values()].map(u=>_({name:u.name?O(u.name):void 0,dz_id:O(u.dzId)})),o=[...e.values()].some(u=>V(u.name,u.dzId)),a=O(n);return{unsupported:{capability:"unsupported_dynamic_fields",dimension:a,diagnostic_values_truncated:V(n),message:r.size>1?`\u52A8\u6001\u7EF4\u5EA6\u6807\u8BC6\u540C\u65F6\u5339\u914D\u540D\u79F0\u548C dzId\uFF0C\u5F53\u524D\u65E0\u6CD5\u5B89\u5168\u6D88\u6B67\uFF1A${a}`:`\u672A\u627E\u5230\u52A8\u6001\u7EF4\u5EA6\uFF1A${a}`,supported_dimensions:s.slice(0,Je),supported_dimension_count:s.length,supported_dimensions_truncated:s.length>Je,supported_dimension_values_truncated:o}}}function Ls(e,t){let n=t.trim(),r=new Map;e.keys.has(n)&&r.set(n,{key:n,fdId:"",name:"",alias:""});for(let c of e.options)(c.fdId===n||c.name===n||c.alias===n)&&r.set(c.key,c);if(r.size===1)return{key:r.keys().next().value};let i=e.options.map(c=>_({name:c.name?O(c.name):void 0,alias:c.alias?O(c.alias):void 0,fd_id:c.fdId?O(c.fdId):void 0,key:O(c.key)})),s=e.options.some(c=>V(c.name,c.alias,c.fdId,c.key)),o=e.name||e.dzId,a=O(o),u=O(n);return{unsupported:{capability:"unsupported_dynamic_fields",dimension:a,dz_id:O(e.dzId),field:u,diagnostic_values_truncated:V(o,e.dzId,n),message:r.size>1?`\u52A8\u6001\u7EF4\u5EA6\u5B57\u6BB5\u6807\u8BC6\u540C\u65F6\u5339\u914D key \u4E0E\u540D\u79F0\u3001\u522B\u540D\u6216 fdId\uFF0C\u5F53\u524D\u65E0\u6CD5\u5B89\u5168\u6D88\u6B67\uFF1A${u}`:`\u5B57\u6BB5\u4E0D\u5C5E\u4E8E\u52A8\u6001\u7EF4\u5EA6 ${a}\uFF1A${u}`,supported_fields:i.slice(0,Je),supported_field_count:i.length,supported_fields_truncated:i.length>Je,supported_field_values_truncated:s}}}function kn(e){return Array.isArray(e)?e.map(Y).filter(t=>Object.keys(t).length):[]}function Pn(e){return Array.isArray(e)?e:[]}function Y(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function G(e){return typeof e=="string"?e:""}function qs(e){return typeof e=="boolean"?e:void 0}function O(e){return e.length<=ht?e:`${e.slice(0,ht-1)}\u2026`}function V(...e){return e.some(t=>t.length>ht)}var Hs=I.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"]),Dn=new Set(["BT","CLOSE_BT_OPEN","OPEN_BT_CLOSE","OPEN_BT_OPEN"]),It=new Set(["IS_NULL","NOT_NULL"]),Js=I.object({field:I.string().min(1).describe("\u5361\u7247\u5173\u8054\u6570\u636E\u96C6\u4E2D\u7684\u7B5B\u9009\u5B57\u6BB5\u540D\u79F0\u3001\u522B\u540D\u6216\u5B57\u6BB5 ID\u3002"),operator:Hs.describe("BI \u539F\u751F\u7B5B\u9009\u64CD\u4F5C\u7B26\uFF0C\u4F8B\u5982 EQ/NI/GE/BT/CONTAINS\u3002"),values:I.array(I.union([I.string(),I.number(),I.boolean()])).optional().describe("\u7B5B\u9009\u503C\u3002IS_NULL/NOT_NULL \u4E0D\u9700\u8981\u4F20\u503C\u3002"),fd_id:I.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;It.has(e.operator)&&n>0&&t.addIssue({code:I.ZodIssueCode.custom,path:["values"],message:`${e.operator} \u64CD\u4F5C\u7B26\u4E0D\u63A5\u53D7\u7B5B\u9009\u503C\u3002`}),Dn.has(e.operator)&&n!==2&&t.addIssue({code:I.ZodIssueCode.custom,path:["values"],message:`${e.operator} \u64CD\u4F5C\u7B26\u9700\u8981\u6070\u597D 2 \u4E2A\u503C\u3002`}),!Dn.has(e.operator)&&!It.has(e.operator)&&n<1&&t.addIssue({code:I.ZodIssueCode.custom,path:["values"],message:`${e.operator} \u64CD\u4F5C\u7B26\u81F3\u5C11\u9700\u8981 1 \u4E2A\u503C\u3002`})}),Gs=I.object({parameter:I.string().min(1).describe("\u52A8\u6001\u53C2\u6570\u540D\u79F0\u6216 dpId\u3002"),value:I.union([I.string(),I.number(),I.boolean()]).describe("\u52A8\u6001\u53C2\u6570\u8986\u76D6\u503C\uFF0C\u4F1A\u6309 BI dynamicParams.defaultValue \u4EE5\u5B57\u7B26\u4E32\u53D1\u9001\u3002")}),Fs=I.object({returned_count:I.number().int().nonnegative(),offset:I.number().int().nonnegative(),limit:I.number().int().positive(),has_more:I.boolean(),next_offset:I.number().int().nonnegative().optional(),total_count:I.number().int().nonnegative().optional()}),Nn={cd_id:I.string().min(1).max(512).describe("\u5361\u7247 ID\u3002"),filters:I.array(Js).optional().describe("\u7ED3\u6784\u5316\u7B5B\u9009\u6761\u4EF6\u3002\u4E0D\u652F\u6301 CLI \u98CE\u683C\u7B5B\u9009\u5B57\u7B26\u4E32\u3002"),dynamic_params:I.array(Gs).optional().describe("\u56FE\u8868\u5361\u52A8\u6001\u53C2\u6570\u8986\u76D6\uFF0Cparameter \u53EF\u4F20\u53C2\u6570\u540D\u6216 dpId\uFF1B\u4EC5\u652F\u6301 CHART \u5361\u7247\u3002"),dynamic_fields:I.array(xn).max(100).optional().describe("\u56FE\u8868\u5361\u52A8\u6001\u7EF4\u5EA6\u8986\u76D6\uFF0Cdimension \u53EF\u4F20\u52A8\u6001\u7EF4\u5EA6\u540D\u6216 dzId\uFF0Cfields \u53EF\u4F20\u5B57\u6BB5\u540D\u3001\u522B\u540D\u3001fdId \u6216 key\u3002"),columns:I.array(I.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"),offset:I.number().int().nonnegative().optional().default(0).describe("\u5F53\u524D\u9875\u8D77\u59CB\u504F\u79FB\u91CF\uFF0C\u9ED8\u8BA4 0\u3002"),limit:I.number().int().positive().optional().default(100).describe("\u5F53\u524D\u9875\u671F\u671B\u8FD4\u56DE\u884C\u6570\uFF0C\u9ED8\u8BA4 100\uFF1B\u5927\u4E8E 1000 \u65F6\u4ECD\u6309\u5355\u9875 1000 \u884C\u67E5\u8BE2\uFF0C\u5E76\u901A\u8FC7 next_offset \u7EED\u9875\u3002"),raw:I.boolean().optional().describe("\u662F\u5426\u8FD4\u56DE\u539F\u59CB\u54CD\u5E94\u3002")},Ln={summary:I.unknown().optional(),columns:I.array(I.unknown()).optional(),rows:I.array(I.unknown()).optional(),page:Fs.optional(),diagnostic:I.unknown().optional(),raw:I.unknown().optional(),status:I.string().optional(),next_action:I.string().optional()},zs=1e3,Te=4*1024*1024,Ge=1024*1024,qn=64*1024,Mn=512;async function Hn(e,t,n){try{let r=t.limit??100,i=Math.min(r,zs),s=t.offset??0,o=await $s(e,t.cd_id,t.filters??[],t.dynamic_params??[],t.dynamic_fields??[],n);if("unsupported"in o)return Ks("query_card_data",o.unsupported);let{card:a,cardType:u,filters:c,dynamicParams:d,dynamicFieldFilters:l}=o;if(u==="TEXT")return Qs(t.cd_id,a,t.columns,t.raw,s,i);let g=await to(e,eo(t.cd_id,u,i,c,d,l,s),n),{endpoint:h}=g.requests[0],y=g.data,C=u==="CHART"?io(T(y.chartMain)):void 0,P=C?.rows??oo(y),D=Kn(P.slice(0,i),t.columns),k=Te-qn-(t.raw?Ge:0),E=zn(D,k),N=To(u,y,s,i,D.length);if(u==="TREE_SELECTOR"&&E.truncated)return Vs(t.cd_id,s,i,N.page.total_count);if(E.oversizedFirstRow)return Jn(t.cd_id,u,s,i,N.page.total_count);let L=E.rows,me=E.truncated||N.page.has_more===!0,fe=N.backendLimitReached&&!E.truncated,ge=me&&L.length>0&&!fe?s+(u==="TREE_SELECTOR"?i:L.length):void 0,ne=_({...N.page,returned_count:L.length,has_more:me,next_offset:ge}),re=t.raw===!0&&$n(g.raw,Ge)&&!E.truncated;return Fe({summary:_({cd_id:t.cd_id,card_type:u,chart_type:u==="CHART"?w(T(a.content).chartType):void 0,row_count:L.length,truncated:ne.has_more}),columns:E.columns,rows:L,page:ne,diagnostic:_({mode:no(u),card_type:u,endpoint:h,request:{offset:s,limit:i,requested_limit:r>i?r:void 0,filter_count:c.length,dynamic_param_count:d.length},request_count:1,partial_reason:E.truncated?"response_bytes":fe?"backend_limit":r>i&&me?"page_limit":void 0,response_byte_limit:E.truncated?Te:void 0,alignment_issue_count:C?.alignmentIssueCount||void 0,alignment_issues:C?.alignmentIssues.length?C.alignmentIssues:void 0,raw_returned:re,raw_omitted_reason:t.raw===!0&&!re?"response_bytes":void 0}),raw:re?g.raw:void 0,next_action:fe?"BI \u5DF2\u8FBE\u5230\u7B5B\u9009\u5668\u540E\u7AEF\u884C\u6570\u4E0A\u9650\uFF1B\u8BF7\u589E\u52A0 filters \u7F29\u5C0F\u67E5\u8BE2\u8303\u56F4\u540E\u4ECE offset=0 \u91CD\u65B0\u5206\u9875\u3002":r>i&&ge!==void 0?`\u8BF7\u6C42\u7684 limit=${r} \u5DF2\u6309\u5355\u9875\u4E0A\u9650 ${i} \u6267\u884C\uFF1B\u7EE7\u7EED\u8C03\u7528 query_card_data\uFF0C\u5E76\u4F20\u5165 offset=${ge} \u83B7\u53D6\u4E0B\u4E00\u9875\u3002`:void 0})}catch(r){return Q({status:"error",diagnostic:mt("query_card_data",r)})}}async function $s(e,t,n=[],r=[],i=[],s){s?.throwIfAborted();let o=await Et(e,`/api/card/${encodeURIComponent(t)}`,s);s?.throwIfAborted();let a=Zs(o);if(r.length&&a!=="CHART")return{unsupported:Ws(a)};let u=w(o.cdType).toUpperCase()||"UNKNOWN";if(i.length&&!["CHART","METRIC_CHART"].includes(u))return{unsupported:Ys(u)};let c=a==="SELECTOR"?Xs(o):void 0;if(c)return{unsupported:c};if(a==="TEXT")return{card:o,cardType:a,filters:[],dynamicParams:[],dynamicFieldFilters:[]};let d=vn(o,t,i);if("unsupported"in d)return d;let l=await _o(e,o,n,s);s?.throwIfAborted();let g=uo(n,l,a);if("unsupported"in g)return g;let h=await co(e,r,s);return s?.throwIfAborted(),"unsupported"in h?h:{card:o,cardType:a,filters:g.filters,dynamicParams:h.dynamicParams,dynamicFieldFilters:d.dynamicFieldFilters}}function Jn(e,t,n,r,i){return Fe({status:"response_too_large",summary:{cd_id:e,card_type:t,row_count:0,truncated:!0},columns:[],rows:[],page:_({returned_count:0,offset:n,limit:r,has_more:!0,total_count:i}),next_action:"\u5355\u884C\u6570\u636E\u5DF2\u8D85\u8FC7 MCP \u5185\u8054\u54CD\u5E94\u9884\u7B97\uFF0C\u8BF7\u4F7F\u7528 columns \u88C1\u526A\u5217\u3001\u51CF\u5C0F limit \u6216\u589E\u52A0\u7B5B\u9009\u6761\u4EF6\u540E\u91CD\u8BD5\u3002",diagnostic:{mode:"response_too_large",reason:"response_bytes",response_byte_limit:Te}})}function Vs(e,t,n,r){return Fe({status:"response_too_large",summary:{cd_id:e,card_type:"TREE_SELECTOR",row_count:0,truncated:!0},columns:[],rows:[],page:_({returned_count:0,offset:t,limit:n,has_more:!0,total_count:r}),next_action:"\u6811\u7B5B\u9009\u5668\u5F53\u524D\u9875\u8D85\u8FC7 MCP \u5185\u8054\u54CD\u5E94\u9884\u7B97\uFF1B\u8BF7\u4FDD\u6301 offset \u4E0D\u53D8\u5E76\u51CF\u5C0F limit \u540E\u91CD\u8BD5\u3002",diagnostic:{mode:"response_too_large",reason:"response_bytes",response_byte_limit:Te}})}function Fe(e){let t=T(e.page),n=T(e.diagnostic),r=Qn(t.next_offset),i=Ce(t.has_more)===!0,s=w(e.status)||(i?"partial":"success");return R({...e,status:s},{text:_({status:s,summary:e.summary,columns:e.columns,rows:e.rows,page:e.page,next_action:e.next_action??(r===void 0?void 0:`\u7EE7\u7EED\u8C03\u7528 query_card_data\uFF0C\u5E76\u4F20\u5165 offset=${r} \u83B7\u53D6\u4E0B\u4E00\u9875\u3002`),diagnostic:_({mode:n.mode,endpoint:n.endpoint,partial_reason:n.partial_reason,response_byte_limit:n.response_byte_limit,raw_returned:n.raw_returned,raw_omitted_reason:n.raw_omitted_reason})})})}function Qs(e,t,n,r,i,s){let o=T(t.content),a=ao(o),u=a?[{content:a}]:[],c=Kn(u.slice(i,i+s),n),d=r===!0&&$n(t,Ge),l=Te-qn-(d?Ge:0),g=zn(c,l);if(g.oversizedFirstRow)return Jn(e,"TEXT",i,s,u.length);let h=g.rows,y=g.truncated||i+h.length<u.length,C=d&&!g.truncated;return Fe({summary:{cd_id:e,card_type:"TEXT",row_count:h.length,truncated:y},columns:g.columns,rows:h,page:_({returned_count:h.length,offset:i,limit:s,has_more:y,next_offset:y?i+h.length:void 0,total_count:u.length}),diagnostic:{mode:"text_card_content",card_type:"TEXT",endpoint:`/api/card/${encodeURIComponent(e)}`,raw_returned:C,raw_omitted_reason:r===!0&&!C?"response_bytes":void 0},raw:C?t:void 0})}function Ks(e,t){return R({status:"unsupported",diagnostic:{tool:e,...t}})}function Ws(e){return{capability:"unsupported_dynamic_params",message:`dynamic_params \u4EC5\u652F\u6301 CHART \u56FE\u8868\u5361\u7247\uFF0C\u5F53\u524D\u5361\u7247\u7C7B\u578B\u4E3A ${e}`,card_type:e}}function Ys(e){let t=Eo(e);return{capability:"unsupported_dynamic_fields",message:`dynamic_fields \u4EC5\u652F\u6301 CHART/METRIC_CHART \u56FE\u8868\u5361\u7247\uFF0C\u5F53\u524D\u5361\u7247\u7C7B\u578B\u4E3A ${t}`,card_type:t,diagnostic_values_truncated:t!==e}}function Xs(e){let t=T(e.content);if(w(t.selectorType).toUpperCase()!=="PARAMETER")return;let n=T(t.parameter);if(!(["STRING","TEXT"].includes(w(n.valueType).toUpperCase())&&Ce(n.customize)!==!0&&w(T(t.source).dsId)!==""))return{capability:"unsupported_parameter_selector_data",message:"\u56FA\u5B9A\u9009\u9879\u3001\u81EA\u5B9A\u4E49\u503C\u6216\u975E\u6587\u672C\u53C2\u6570\u9009\u62E9\u5668\u6CA1\u6709\u53EF\u9760\u7684\u540E\u7AEF offset \u7EED\u9875\u8BED\u4E49\u3002",card_type:"SELECTOR",selector_type:"PARAMETER"}}function Zs(e){let t=w(e.cdType).toUpperCase();if(t==="SELECTOR"){let n=w(T(e.content).selectorType).toUpperCase();return n==="TREE"||n==="TREE_SELECTOR"?"TREE_SELECTOR":"SELECTOR"}return t==="TREE_SELECTOR"?"TREE_SELECTOR":t==="TEXT"?"TEXT":"CHART"}function eo(e,t,n,r,i,s,o=0){let a=encodeURIComponent(e);return t==="SELECTOR"?{endpoint:`/api/selector/${a}/data`,requestBody:_({fieldQuery:{offset:o,limit:n},filters:r.length?r:void 0})}:t==="TREE_SELECTOR"?{endpoint:`/api/treeSelector/${a}/data`,requestBody:_({offset:o,limit:n,filters:r.length?r:void 0})}:{endpoint:`/api/card/${a}/data`,requestBody:_({view:"GRID",isUniversalStructure:!0,offset:o>0?o:void 0,limit:n,filters:r.length?r:void 0,dynamicParams:i.length?i:void 0,dynamicFieldFilters:s.length?s:void 0})}}async function to(e,t,n){let r=await wo(e,t.endpoint,t.requestBody,n);return{raw:r,data:ro(r),requests:[t]}}function no(e){return e==="SELECTOR"?"selector_card_data":e==="TREE_SELECTOR"?"tree_selector_card_data":"chart_card_data"}function ro(e){let t=T(e),n=T(t.data),r=T(T(t.content).data);return Object.keys(n).length?n:Object.keys(r).length?r:t}function io(e){if(!Object.keys(e).length)return{rows:[],alignmentIssueCount:0,alignmentIssues:[]};let t=T(e.row),n=T(e.column),r=F(t.data??t.values),i=F(e.data),o=le(t.fields??t.meta).map((k,E)=>({header:Tt(k)||`row_${E+1}`,shrinked:Ce(k.isShrinkedInGroupTable)===!0})),a=so(n),u=o.filter(k=>!k.shrinked).length,c=r.reduce((k,E)=>Math.max(k,F(E).length),u),d=Array.from({length:c-u},(k,E)=>`row_extra_${E+1}`),l=i.reduce((k,E)=>Math.max(k,F(E).length),a.length),g=Array.from({length:l},(k,E)=>a[E]||`metric_${E+1}`),h=Bo([...o.map(k=>k.header),...d,...g]),y=Math.max(r.length,i.length),C=[],P=[],D=0;for(let k=0;k<y;k+=1){let E=F(r[k]),N=F(i[k]),L=0,me=o.map(Se=>{if(Se.shrinked)return null;let q=L<E.length?yt(E[L]):null;return L+=1,q}),fe=d.map((Se,q)=>{let Vt=L+q;return Vt<E.length?yt(E[Vt]):null}),ge=g.map((Se,q)=>q<N.length?yt(N[q]):null),ne=[...me,...fe,...ge];if(!ne.length)continue;let Ze=E.length!==u,re=N.length!==a.length;(Ze||re)&&(D+=1,P.length<20&&P.push(_({row_number:k+1,row_value_count:Ze?{expected:u,actual:E.length}:void 0,metric_value_count:re?{expected:a.length,actual:N.length}:void 0})));let di=Math.max(h.length,ne.length);C.push(Object.fromEntries(Array.from({length:di},(Se,q)=>[h[q]??`column_${q+1}`,ne[q]??null])))}return{rows:C,alignmentIssueCount:D,alignmentIssues:P}}function so(e){let n=F(e.data??e.values).map((r,i)=>{let s=F(r).map(Vn).filter(Boolean).join("/");return s||Tt(le(e.fields??e.meta)[i])||`metric_${i+1}`}).filter(Boolean);return n.length?n:le(e.fields??e.meta).map(Tt).filter(Boolean)}function oo(e){return le(e.result)}function ao(e){let n=F(T(e.body).blocks).map(r=>w(T(r).text)).filter(r=>r!=="");return n.length?n.join(`
5
+ `):w(e.text)}function uo(e,t,n){let r=[];for(let i of e){let s=yo(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"?ho(s.field.metaType):void 0,filterType:i.operator,filterValue:go(i)}))}return{filters:r}}async function co(e,t,n){if(!t.length)return{dynamicParams:[]};let r=new Map,i=[];for(let c of t){let d=c.parameter.trim();if(r.has(d))return{unsupported:{capability:"unsupported_dynamic_params",parameter:d,message:`\u52A8\u6001\u53C2\u6570\u88AB\u91CD\u590D\u6307\u5B9A\uFF1A${d}`}};i.push(d),r.set(d,w(c.value))}n?.throwIfAborted();let s=await Et(e,"/api/dynamic-parameter/query",n);n?.throwIfAborted();let o=[...lo(s),...po()],a=[],u=new Map;for(let c of i){let d=mo(o,c);if("unsupported"in d)return{unsupported:d.unsupported};let l=Co(d.param),g=de(l,"dpId","dp_id"),h=u.get(g);if(h)return{unsupported:{capability:"unsupported_dynamic_params",parameter:c,message:`\u52A8\u6001\u53C2\u6570 ${h} \u548C ${c} \u6307\u5411\u540C\u4E00\u4E2A dpId\uFF1A${g}`}};u.set(g,c),l.defaultValue=r.get(c)??"";let y=fo(l,c);if("unsupported"in y)return{unsupported:y.unsupported};a.push(l)}return{dynamicParams:a}}function lo(e){if(Array.isArray(e))return e.map(T).filter(n=>Object.keys(n).length);let t=T(e);for(let n of["response","data"]){let r=F(t[n]).map(T).filter(i=>Object.keys(i).length);if(r.length)return r}return[]}function po(){return[{dpId:"DATE_RANGE_PARAM_LEFT",name:"\u5F00\u59CB\u65E5\u671F\u53C2\u6570",valueType:"DATE",defaultValue:"",optionValue:[]},{dpId:"DATE_RANGE_PARAM_RIGHT",name:"\u7ED3\u675F\u65E5\u671F\u53C2\u6570",valueType:"DATE",defaultValue:"",optionValue:[]}]}function mo(e,t){let n=e.find(i=>de(i,"dpId","dp_id")===t);if(n)return{param:n};let r=e.filter(i=>de(i,"name")===t);return r.length===1?{param:r[0]}:r.length>1?{unsupported:{capability:"unsupported_dynamic_params",parameter:t,message:`\u52A8\u6001\u53C2\u6570\u540D\u5B58\u5728\u591A\u4E2A\u5339\u914D\u9879\uFF0C\u8BF7\u6539\u7528 dpId\uFF1A${t}`}}:{unsupported:{capability:"unsupported_dynamic_params",parameter:t,message:`\u672A\u627E\u5230\u52A8\u6001\u53C2\u6570\uFF1A${t}`}}}function fo(e,t){let n=[de(e,"dpId","dp_id")?void 0:"dpId",de(e,"name")?void 0:"name",de(e,"valueType","value_type")?void 0:"valueType"].filter(r=>!!r);return n.length?{unsupported:{capability:"unsupported_dynamic_params",parameter:t,message:`\u52A8\u6001\u53C2\u6570\u7F3A\u5C11\u5FC5\u8981 BI \u5143\u4FE1\u606F\uFF1A${t}`,missing_metadata:n}}:typeof e.defaultValue!="string"?{unsupported:{capability:"unsupported_dynamic_params",parameter:t,message:`\u52A8\u6001\u53C2\u6570 defaultValue \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\uFF1A${t}`}}:{ok:!0}}function de(e,...t){for(let n of t){let r=w(e[n]);if(r)return r}return""}function go(e){return It.has(e.operator)?[]:(e.values??[]).map(w)}async function _o(e,t,n,r){let i=Io(t);if(!n.some(a=>{let u=Gn(i,a.field,a.fd_id);return!u||!w(u.fd_id)}))return i;let s=T(T(t.content).dsInfo),o=j(s.dsId,s.ds_id);if(!o)return i;try{r?.throwIfAborted();let a=await Et(e,`/api/data-source/${encodeURIComponent(o)}`,r);return r?.throwIfAborted(),[...i,...Fn(a)]}catch{return r?.throwIfAborted(),i}}function ho(e){return e.toUpperCase()==="METRIC"?"AGGREGATION":"DETAIL"}function yo(e,t,n){let r=Gn(e,t,n);if(!r)return{unsupported:{capability:"unsupported_filter_field",parameter:t,message:`\u7B5B\u9009\u5B57\u6BB5\u65E0\u6CD5\u4ECE\u5361\u7247\u5173\u8054\u6570\u636E\u96C6\u89E3\u6790\uFF1A${t}`,supported_fields:e.map(c=>_({name:w(c.name),fd_id:w(c.fd_id),meta_type:w(c.meta_type)}))}};let i=w(r.name),s=w(r.fd_id),o=w(r.fd_type),a=w(r.meta_type).toUpperCase(),u=[i?void 0:"name",s?void 0:"fdId",o?void 0:"fdType",a?void 0:"metaType"].filter(c=>!!c);return u.length?{unsupported:{capability:"unsupported_filter_field",parameter:t,message:`\u7B5B\u9009\u5B57\u6BB5\u7F3A\u5C11\u5FC5\u8981 BI \u5143\u4FE1\u606F\uFF1A${t}`,missing_metadata:u}}:{field:{name:i,fdId:s,fdType:o,metaType:a}}}function Gn(e,t,n){if(n)return e.find(i=>w(i.fd_id)===n||w(i.id)===n);let r=t.trim();return e.find(i=>[i.fd_id,i.id].map(w).includes(r))??jn(e.filter(i=>w(i.name)===r))??jn(e.filter(i=>w(i.alias)===r))}function jn(e){return e.find(t=>w(t.fd_id))??e[0]}function Io(e){let t=T(e.content),n=Fn(T(t.dsInfo)),r=T(T(t.source).field);Object.keys(r).length&&n.push(bt(r));let i=T(T(t.meta).chartMain),s=T(i.zoneData);for(let[o,a]of Object.entries(s))n.push(...le(a).map(u=>bt(u,o)));return bo(n)}function Fn(e){return le(e.columns).map(t=>({...bt(t),meta_type:j(t.metaType,t.meta_type)??"DIM"}))}function bt(e,t){return _({name:j(e.name,e.title,e.originTitle,e.alias),alias:j(e.alias,e.title),id:w(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 bo(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 To(e,t,n,r,i){let s=e==="CHART"?T(t.chartMain):t,o=Qn(s.count),a=e==="TREE_SELECTOR"?r:i,u=o===void 0?void 0:n+a<o,c=e!=="CHART"&&Ce(s.exceedLimit)===!0,d=c&&(o===void 0||n+a>=o),l=d||(e==="CHART"?Ce(s.hasMoreData)??u??i===r:u??i===r);return{backendLimitReached:d,page:_({returned_count:i,offset:n,limit:r,has_more:l,next_offset:l&&!d&&i>0?n+(e==="TREE_SELECTOR"?r:i):void 0,total_count:c?void 0:o})}}function zn(e,t){let n=[],r=[],i=new Set,s=2,o=2;for(let a of e){let u=n.length?1:0,c=t-s-o-u,d=Ct(a,c),l=Object.keys(a).filter(y=>!i.has(y)),g=0,h=!0;for(let y=0;y<l.length;y+=1){let C=r.length+y>0?1:0,P=t-s-o-u-d-g-C,D=wt(l[y],P);if(D>P){h=!1;break}g+=C+D}if(d>c||!h)return{rows:n,columns:r,truncated:!0,oversizedFirstRow:n.length===0};n.push(a),s+=u+d,o+=g;for(let y of l)r.push(y),i.add(y)}return{rows:n,columns:r,truncated:!1,oversizedFirstRow:!1}}function $n(e,t){return Ct(e,t)<=t}function Ct(e,t){if(t<0)return t+1;if(e==null)return 4;if(typeof e=="string")return wt(e,t);if(typeof e=="number"||typeof e=="boolean")return Buffer.byteLength(JSON.stringify(e));if(Array.isArray(e))return Un(e.map(n=>[void 0,n]),t);if(typeof e=="object"){let n=Object.entries(e).filter(([,r])=>r!==void 0);return Un(n,t)}return 4}function Un(e,t){let n=2;for(let r=0;r<e.length;r+=1){let[i,s]=e[r];if(n+=r>0?1:0,i!==void 0){let a=wt(i,t-n);n+=a+1}let o=Ct(s,t-n);if(n+=o,n>t)return t+1}return n}function wt(e,t){let n=2;for(let r of e){let i=r.codePointAt(0)??0;if(i===34||i===92?n+=2:i<=31||i>=55296&&i<=57343?n+=6:n+=Buffer.byteLength(r),n>t)return t+1}return n}function Tt(e){return j(e.title,e.alias,e.originTitle,e.name,e.fdId,e.id)??""}function Vn(e){let t=T(e);return Object.keys(t).length?j(t.title,t.name,t.originTitle,t.alias,t.v,t.value)??"":w(e)}function yt(e){let t=T(e);return Object.keys(t).length?"v"in t?t.v:"value"in t?t.value:Vn(e):e}function le(e){return Array.isArray(e)?e.map(T).filter(t=>Object.keys(t).length):[]}function F(e){return Array.isArray(e)?e:[]}function Co(e){return JSON.parse(JSON.stringify(e))}function T(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function Et(e,t,n){return n?e.get(t,{signal:n}):e.get(t)}function wo(e,t,n,r){return r?e.post(t,n,{signal:r}):e.post(t,n)}function w(e){return typeof e=="string"?e:e==null?"":String(e)}function j(...e){return e.map(w).find(t=>t.trim())?.trim()}function Ce(e){return typeof e=="boolean"?e:void 0}function Eo(e){return e.length<=Mn?e:`${e.slice(0,Mn-1)}\u2026`}function Qn(e){return typeof e=="number"&&Number.isFinite(e)?e:void 0}function Kn(e,t){return t?.length?e.map(n=>Object.fromEntries(t.map(r=>[r,n[r]??null]))):e}function Bo(e){let t=e.map((i,s)=>i||`column_${s+1}`),n=new Set(t),r=new Set;return t.map(i=>{if(!r.has(i))return r.add(i),i;for(let s=2;;s+=1){let o=`${i}_${s}`;if(!n.has(o)&&!r.has(o))return r.add(o),o}})}import{createHash as Ro}from"crypto";import{z as f}from"zod";var So=6e4,X=1e4,Wn=10*6e4,ze=new Map,$e=new Map,Bt=new Map,Rt=new Map,Yn=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")}),Xn={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()},Zn={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()},Mu={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:Yn.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()},er={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()},tr={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:Yn.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()},nr={is_insight:f.boolean().optional().describe("\u662F\u5426\u53EA\u5217\u51FA\u6D1E\u5BDF\u4E3B\u9898\u3002")},rr={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")},ju={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")},ir={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")},sr={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 or(e,t){let n=new M(e);try{let r=await n.listThemes({isInsight:t.is_insight});return R({themes:r,resolved_base_url:n.getResolvedBaseUrl(),tried_base_urls:n.getTriedBaseUrls()})}catch(r){return Qe(n,r,"listThemes")}}async function ar(e,t){let n=new M(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 R({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 Qe(n,r,"query")}}async function ur(e,t){let n=new M(e);try{let r=dr({caller_scope:lr(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=Oo(r);if(i)return R({...i,deduped:!0,retry_after_ms:X,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=Bt.get(r);if(s){let u=await s;return R({...u,deduped:!0,retry_after_ms:X,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 Ao(r,c),c}).finally(()=>{Bt.delete(r)});Bt.set(r,o);let a=await o;return R({...a,deduped:!1,retry_after_ms:X,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 Qe(n,r,"insight.start")}}async function cr(e,t){let n=new M(e);try{let r=dr({caller_scope:lr(e),message_id:t.message_id}),i=ko(r);if(i){let l=St(i.result),g=At(i.result,!0);return R({message_id:i.result.message_id,session_id:i.result.session_id,status:i.result.status,detail:Ot(i.result),question:i.result.question,answer:i.result.answer,throttled:!0,retry_after_ms:i.retryAfterMs,...l,next_action:g})}let s=Rt.get(r);if(s){let l=await s,g=Pt(l.status),h=St(l),y=At(l,!0);return R({message_id:l.message_id,session_id:l.session_id,status:l.status,detail:Ot(l),question:l.question,answer:l.answer,throttled:!0,retry_after_ms:g?0:X,...h,next_action:y})}let o=n.pollInsight({themeId:t.theme_id,themeName:t.theme_name,messageId:t.message_id}).then(l=>(Po(r,l),l)).finally(()=>{Rt.delete(r)});Rt.set(r,o);let a=await o,u=Pt(a.status),c=St(a),d=At(a,!1);return R({message_id:a.message_id,session_id:a.session_id,status:a.status,detail:Ot(a),question:a.question,answer:a.answer,throttled:!1,retry_after_ms:u?0:X,...c,next_action:d,resolved_base_url:n.getResolvedBaseUrl(),tried_base_urls:n.getTriedBaseUrls()})}catch(r){return Qe(n,r,"insight.poll")}}function St(e){return e.status!=="success"?{}:{final_result:{format:"markdown",content:pr(e)}}}function Ot(e){return e.detail!=null?e.detail:e.status==="failure"||e.status==="stopped"?xo(e):e.detail}function At(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 Oo(e){Ve();let t=ze.get(e);if(!(!t||Date.now()-t.createdAt>=So))return t.result}function Ao(e,t){Ve(),ze.set(e,{createdAt:Date.now(),result:t})}function ko(e){Ve();let t=$e.get(e);if(!t)return;let n=Date.now()-t.checkedAt,r=Pt(t.result.status);if(!(!r&&n>=X))return{result:t.result,retryAfterMs:r?0:Math.max(0,X-n)}}function Pt(e){return e==="success"||e==="failure"||e==="stopped"}function Po(e,t){Ve(),$e.set(e,{checkedAt:Date.now(),result:t})}function Ve(){let e=Date.now();for(let[t,n]of ze)e-n.createdAt>=Wn&&ze.delete(t);for(let[t,n]of $e)e-n.checkedAt>=Wn&&$e.delete(t)}function dr(e){return JSON.stringify(Object.keys(e).sort().reduce((t,n)=>{let r=e[n];return typeof r<"u"&&(t[n]=r),t},{}))}function lr(e){return e.BI_PAT?`pat:${kt(e.BI_PAT)}`:e.BI_UID_TOKEN?`uid:${kt(e.BI_UID_TOKEN)}`:`login:${kt(`${e.BI_LOGIN_DOMAIN??""}\0${e.BI_LOGIN_ID??""}`)}`}function kt(e){return Ro("sha256").update(e).digest("hex").slice(0,16)}function pr(e){let t=e.answer?.trim();if(t)return Uo(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 xo(e){switch(e.status){case"success":return pr(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 vo(e,t){let n=[`| ${e.join(" | ")} |`,`|${e.map(()=>" --- ").join("|")}|`];for(let r of t)n.push(`| ${e.map((i,s)=>Mo(Do(r[s]))).join(" | ")} |`);return n.join(`
6
+ `)}function Do(e){return e===null||typeof e>"u"||e===""?"-":String(e)}function Mo(e){return e.replaceAll(`\r
7
7
  `,"<br>").replaceAll(`
8
- `,"<br>").replaceAll("\r","<br>").replaceAll("|","\\|")}function Vs(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)=>zs(r)??n)}function zs(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=Ks(t.viz_config),o=Ws(i,r,s),a=r.map(d=>i.map((p,g)=>Ys(d[g],s.get(p),o.get(p)))),u=Gs(i,a),c=Vs(!!t.data_info?.truncated,t.data_info?.row_limit);return c?`${u}
8
+ `,"<br>").replaceAll("\r","<br>").replaceAll("|","\\|")}function jo(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 Uo(e){let t=/```GuanViz\.json\n([\s\S]*?)\n```/g;return e.replace(t,(n,r)=>No(r)??n)}function No(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=qo(t.viz_config),o=Ho(i,r,s),a=r.map(d=>i.map((l,g)=>Jo(d[g],s.get(l),o.get(l)))),u=vo(i,a),c=jo(!!t.data_info?.truncated,t.data_info?.row_limit);return c?`${u}
9
9
 
10
- ${c}`:u}catch{return}}var gt=new Map([["k",1e3],["K",1e3],["M",1e6],["B",1e9],["\u4E07",1e4],["\u4EBF",1e8]]),Qs=[[1e8,"\u4EBF"],[1e4,"\u4E07"]];function Ks(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 Ws(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=Hn(c[i]);typeof d=="number"&&(a=Math.max(a,Math.abs(d/Gn(o))))}let u=to(a);u&&r.set(s,u)}return r}function Ys(e,t,n){if(!t)return e;let r=Hn(e);return typeof r!="number"?e:Xs(r,t,n)}function Hn(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 Xs(e,t,n){let r=Gn(t),{unit:i,shouldScale:s}=Zs(t,n),o=s&&i?gt.get(i)??1:1,a=e/r/o,u=eo(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 Gn(e){if(e.showPrefixUnit!==!1&&typeof e.prefixUnit=="string"&&e.prefixUnit!=="auto"&&gt.has(e.prefixUnit))return 1;let t=Number(e.divideDataBy??1);return Number.isFinite(t)&&t!==0?t:1}function Zs(e,t){return e.showPrefixUnit===!1?{unit:"",shouldScale:!1}:e.prefixUnit==="auto"?{unit:t??"",shouldScale:!0}:typeof e.prefixUnit=="string"&&gt.has(e.prefixUnit)?{unit:e.prefixUnit,shouldScale:!0}:{unit:"",shouldScale:!1}}function eo(e){return typeof e!="number"||!Number.isFinite(e)?2:Math.max(0,Math.min(100,Math.trunc(e)))}function to(e){return Qs.find(([t])=>e>=t)?.[1]??""}function Me(e,t,n){let r=no(e,t,n);return $({error:"chatbi_request_failed",requested_operation:n,...r,tried_base_urls:r.tried_base_urls??e.getTriedBaseUrls()})}function no(e,t,n){return t instanceof v?t.detail:e.getLastError()??{operation:n,detail:t instanceof Error?t.message:String(t)}}import{z as _t}from"zod";var Jn={dsId:_t.string().min(1).describe("\u6570\u636E\u96C6 ID\u3002")},$n={cdId:_t.string().min(1).describe("\u5361\u7247 ID\u3002")},Vn={pageId:_t.string().min(1).describe("\u9875\u9762/\u4EEA\u8868\u677F ID\u3002")};async function Fn(e,t){let n=await e.get(`/api/data-source/${encodeURIComponent(t.dsId)}`);return N(n)}async function zn(e,t){let n=await e.get(`/api/card/${encodeURIComponent(t.cdId)}`);return N(n)}async function Qn(e,t){let n=await e.get(`/api/page/${encodeURIComponent(t.pageId)}`);return N(n)}import{z as le}from"zod";var pe=le.string().trim().min(1),ro=le.object({name:pe.describe("CTE \u540D\u79F0\uFF0C\u4E0D\u80FD\u4E0E\u4EFB\u4E00\u8F93\u5165\u6570\u636E\u96C6\u7684\u7CBE\u786E\u540D\u79F0/name \u76F8\u540C\u3002"),query:pe.describe("\u8BE5 CTE \u7684\u67E5\u8BE2\u4F53\uFF0C\u4E0D\u5305\u542B CTE \u540D\u79F0\u548C AS \u5916\u5C42\u3002")}).strict(),Kn={query:pe.describe("\u5B8C\u6574\u7684\u5355\u6761\u67E5\u8BE2 SQL\uFF0C\u4EC5\u9650 SELECT/WITH\u3002inputs \u53EA\u7ED1\u5B9A\u6570\u636E\u96C6\uFF0CdsId\u3001fdId \u6216 input0 \u4E0D\u80FD\u76F4\u63A5\u4F5C\u4E3A\u8868\u540D\uFF1B\u901A\u5E38\u5148\u4F7F\u7528 get_dataset_detail \u8FD4\u56DE\u7684\u6570\u636E\u96C6\u540D\u79F0/name \u548C columns[].name\u3002\u82E5 TABLE_OR_VIEW_NOT_FOUND \u7684 diagnostic.tableBindings[] \u63D0\u4F9B sqlReference\uFF0C\u6309\u8BE5\u503C\u4FEE\u6B63\u8868\u5F15\u7528\uFF1B\u5355\u6570\u636E\u96C6 Spark \u67E5\u8BE2\u53EF\u80FD\u8FD4\u56DE __THIS__\u3002\u4E2D\u6587\u6216\u7279\u6B8A\u5B57\u7B26\u540D\u79F0\u7528\u53CD\u5F15\u53F7\u3002\u8FD4\u56DE\u884C\u6570\u7531 MCP \u63A7\u5236\uFF0C\u901A\u5E38\u65E0\u9700\u81EA\u884C\u6DFB\u52A0 LIMIT\u3002"),inputs:le.array(pe).describe("query \u5B9E\u9645\u5F15\u7528\u7684\u5168\u90E8\u6570\u636E\u96C6 ID\uFF0C\u7528\u4E8E BI \u7ED1\u5B9A\u548C\u6743\u9650\u6821\u9A8C\uFF0C\u4E0D\u80FD\u4F5C\u4E3A SQL \u8868\u540D\u3002\u6BCF\u4E2A FROM/JOIN \u6570\u636E\u96C6\u90FD\u8981\u4F20\u5BF9\u5E94 ID\uFF0C\u4E0D\u8981\u591A\u4F20\u6216\u91CD\u590D\uFF1BSELECT 1 \u7B49\u65E0\u8868\u67E5\u8BE2\u4F20\u7A7A\u6570\u7EC4\u3002\u540E\u7AEF\u9ED8\u8BA4\u6700\u591A\u652F\u6301 10 \u4E2A\u4E0D\u540C\u6570\u636E\u96C6\uFF0C\u5B9E\u9645\u9650\u5236\u4EE5\u90E8\u7F72\u914D\u7F6E\u4E3A\u51C6\u3002"),queryStructure:le.object({ctes:le.array(ro).min(1),mainQuery:pe.describe("\u79FB\u9664\u9876\u5C42 WITH/CTE \u5B9A\u4E49\u540E\u7684\u6700\u7EC8 SELECT \u67E5\u8BE2\u3002")}).strict().optional().describe("\u4EC5\u5F53\u5B8C\u6574 query \u662F\u9876\u5C42 WITH/CTE \u67E5\u8BE2\u65F6\u63D0\u4F9B\u3002query \u4ECD\u4FDD\u7559\u5B8C\u6574\u539F\u59CB SQL\uFF1Bctes \u548C mainQuery \u662F\u540C\u4E00 SQL \u7684\u7ED3\u6784\u5316\u62C6\u5206\u3002\u6CA1\u6709 CTE \u65F6\u7701\u7565\u6574\u4E2A\u5B57\u6BB5\u3002")};async function Wn(e,t,n){try{await Vt(e,t,"executeSqlQuery");let r=await e.post("/api/data-source/execute-sql-query",{...n,query:n.query.trim(),inputs:[...new Set(n.inputs.map(i=>i.trim()))],limit:t.BI_MAX_ROWS,disableCache:!0});return N({maxRowsHint:t.BI_MAX_ROWS,result:r})}catch(r){if(io(r))return de("execute_sql_query",r,{hint:"\u8BF7\u5728\u7BA1\u7406\u540E\u53F0 -> \u9AD8\u7EA7\u8BBE\u7F6E -> \u5BF9\u5E94\u57DF\u540D\u4E0B\uFF0C\u6253\u5F00\u9AD8\u7EA7SQL\u67E5\u8BE2\u529F\u80FD\u3002"});if(so(r)){let i=await ao(e,n.inputs),s=Yn(r)&&i.length===1,o=i.map(a=>s?{...a,sqlReference:"__THIS__"}:a);return de("execute_sql_query",r,{hint:oo(r,s),tableBindings:o.length>0?o:void 0})}throw r}}function io(e){return e instanceof Error&&e.message.includes("POST /api/data-source/execute-sql-query HTTP 404")}function so(e){return e instanceof Error&&e.message.includes("TABLE_OR_VIEW_NOT_FOUND")}function Yn(e){return e instanceof Error&&e.message.includes("SparkViewDataset")}function oo(e,t){return t?"\u8BE5\u8BF7\u6C42\u8D70 Spark \u6570\u636E\u96C6\u6267\u884C\u94FE\u8DEF\u3002\u4FDD\u6301 inputs \u4E0D\u53D8\uFF0C\u5C06 SQL \u4E2D\u8BE5\u6570\u636E\u96C6\u7684 FROM/JOIN \u8868\u5F15\u7528\u6539\u4E3A diagnostic.tableBindings[0].sqlReference\uFF08__THIS__\uFF09\u540E\u91CD\u8BD5\uFF1B\u4E0D\u8981\u518D\u6B21\u4F7F\u7528\u76F8\u540C\u7684\u663E\u793A\u540D\u79F0\u3002":Yn(e)?"\u8BE5\u8BF7\u6C42\u8D70 Spark \u591A\u6570\u636E\u96C6\u6267\u884C\u94FE\u8DEF\uFF0C\u6570\u636E\u96C6\u663E\u793A\u540D\u79F0\u4E0D\u4FDD\u8BC1\u7B49\u4E8E\u5DF2\u6CE8\u518C\u7684 SQL \u5173\u7CFB\u540D\uFF0CMCP \u65E0\u6CD5\u53EF\u9760\u63A8\u5BFC\u5168\u90E8\u8868\u5F15\u7528\uFF1B\u8BF7\u52FF\u539F\u6837\u91CD\u590D\u8C03\u7528\uFF0C\u9700\u8981\u540E\u7AEF\u63D0\u4F9B\u7A33\u5B9A\u522B\u540D\u3002":"\u6570\u636E\u96C6 ID \u53EA\u7528\u4E8E BI \u7ED1\u5B9A\u548C\u6388\u6743\uFF0C\u4E0D\u80FD\u76F4\u63A5\u4F5C\u4E3A\u8868\u540D\u3002\u53EF\u6838\u5BF9 diagnostic.tableBindings[].displayName\uFF0C\u4F46\u663E\u793A\u540D\u79F0\u4E0D\u4FDD\u8BC1\u662F\u5F53\u524D\u6267\u884C\u94FE\u8DEF\u53EF\u7528\u7684 SQL \u5F15\u7528\u3002"}async function ao(e,t){let n=[...new Set(t.map(r=>r.trim()))];return Promise.all(n.map(async r=>{try{let i=await e.get(`/api/data-source/${encodeURIComponent(r)}`);if(!i||typeof i!="object"||!("name"in i)||typeof i.name!="string")return{dsId:r};let s=i.name.trim();return s?{dsId:r,displayName:s}:{dsId:r}}catch{return{dsId:r}}}))}import{z as q}from"zod";var Xn={keyword:q.string().default("").describe("\u641C\u7D22\u5173\u952E\u8BCD\uFF0C\u7559\u7A7A\u65F6\u8FD4\u56DE\u8D44\u6E90\u5217\u8868\u3002"),resourceType:q.enum(["ALL","CARD","DASHBOARD","DATA_SET","ETL"]).optional().default("ALL"),limit:q.number().int().min(1).max(100).optional().default(20),offset:q.number().int().min(0).optional().default(0),utimeStartTime:q.number().int().optional().describe("\u66F4\u65B0\u65F6\u95F4\u8D77\u70B9\uFF0C\u6BEB\u79D2\u65F6\u95F4\u6233\u3002"),utimeEndTime:q.number().int().optional().describe("\u66F4\u65B0\u65F6\u95F4\u7EC8\u70B9\uFF0C\u6BEB\u79D2\u65F6\u95F4\u6233\u3002"),cardType:q.string().optional().describe("\u5361\u7247\u7C7B\u578B\u8FC7\u6EE4\uFF0C\u4EC5 resourceType \u5305\u542B CARD \u65F6\u4F7F\u7528\u3002"),permissionType:q.string().optional(),orderBy:q.string().optional(),isDesc:q.boolean().optional()};async function Zn(e,t){let{cardType:n,...r}=t,i={...r,specificResourceFilters:n?{cardType:n}:void 0},s=await e.post("/api/global-search",i);return N(s)}import{z as m}from"zod";var Ct=m.enum(["asc","desc"]),uo=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"]),er=new Set(["BT","CLOSE_BT_OPEN","OPEN_BT_CLOSE","OPEN_BT_OPEN"]),It=new Set(["IS_NULL","NOT_NULL"]),ur=m.object({field:m.string().min(1).describe("\u7B5B\u9009\u5B57\u6BB5\u540D\u79F0\u6216\u5B57\u6BB5 ID\u3002"),operator:uo.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;It.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`}),er.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`}),!er.has(e.operator)&&!It.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`})}),co=m.object({field:m.string().min(1).describe("\u6392\u5E8F\u5B57\u6BB5\u540D\u79F0\u6216\u5B57\u6BB5 ID\u3002"),direction:Ct.describe("\u6392\u5E8F\u65B9\u5411\u3002")}),lo=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:Ct.optional(),rank_dim:m.string().min(1).optional()}),cr={keyword:m.string().min(1).optional().describe("\u6307\u6807\u540D\u79F0\u5173\u952E\u8BCD\u3002"),project_id:m.string().min(1).optional().describe("\u6307\u6807\u4E3B\u9898 ID\uFF1B\u4E0D\u4F20\u5219\u8DE8\u53EF\u8BBF\u95EE\u4E3B\u9898\u641C\u7D22\u3002"),dir_id:m.string().min(1).optional().describe("\u76EE\u5F55 ID\u3002"),status:m.string().min(1).optional().describe("\u4E0A\u7EBF\u72B6\u6001\uFF0C\u4F20\u6307\u6807\u5E73\u53F0\u7684\u72B6\u6001\u4EE3\u7801\uFF1APUBLISHED\uFF08\u5DF2\u4E0A\u7EBF\uFF09\u3001UNPUBLISHED\uFF08\u672A\u4E0A\u7EBF\uFF09\u3002"),sub_types:m.array(m.string().min(1)).optional().describe("\u6307\u6807\u7C7B\u578B\u4EE3\u7801\u5217\u8868\uFF0C\u4F8B\u5982 ATOMIC\uFF08\u539F\u5B50\uFF09\u3001DERIVED\uFF08\u884D\u751F\uFF09\u3001COMPOSITE\uFF08\u590D\u5408\uFF09\u3002"),order_by:m.enum(["utimeDesc","utimeAsc"]).optional().describe("\u6392\u5E8F\u65B9\u5F0F\uFF1AutimeDesc \u6309\u66F4\u65B0\u65F6\u95F4\u5012\u5E8F\uFF0CutimeAsc \u6309\u66F4\u65B0\u65F6\u95F4\u6B63\u5E8F\u3002"),limit:m.number().int().positive().max(200).optional().default(20).describe("\u6700\u591A\u8FD4\u56DE\u6761\u6570\u3002")},dr={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")},lr={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")},pr={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(ur).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(co).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:lo.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")},mr={keyword:m.string().min(1).optional().describe("\u6307\u6807\u6811\u540D\u79F0\u5173\u952E\u8BCD\u3002"),project_id:m.string().min(1).optional().describe("\u6839\u6307\u6807\u6240\u5C5E\u4E3B\u9898 ID\u3002"),parent_dir_id:m.string().min(1).optional().describe("\u6307\u6807\u6811\u76EE\u5F55 ID\u3002"),order_by:m.enum(["utimeDesc","utimeAsc"]).optional().default("utimeDesc").describe("\u6392\u5E8F\u65B9\u5F0F\uFF1AutimeDesc \u6309\u66F4\u65B0\u65F6\u95F4\u5012\u5E8F\uFF08\u9ED8\u8BA4\uFF09\uFF0CutimeAsc \u6309\u66F4\u65B0\u65F6\u95F4\u6B63\u5E8F\u3002"),limit:m.number().int().positive().max(200).optional().default(20).describe("\u6700\u591A\u8FD4\u56DE\u6761\u6570\u3002")},fr={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")},gr={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(ur).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:Ct.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")},V={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 _r(e,t,n){let r=new L(e,t);try{let i=n.project_id?[n.project_id]:await po(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(...mo(u)),s.length>=n.limit)break}let o=No(s.map(yt),"metric_id").slice(0,n.limit);return S({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 W(i,"search_metrics")}}async function hr(e,t,n){let r=new L(e,t);try{try{let i=await r.listMetricFullTree({projectId:n.project_id,keyword:n.keyword});return S({summary:{source:"full-tree"},tree:go(i),raw:n.raw?i:void 0})}catch(i){let s=n.project_id?[{id:n.project_id}]:await Er(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:_o(c,u)})}return S({summary:{source:"directory-fallback",fallback_reason:i instanceof Error?i.message:String(i)},tree:o})}}catch(i){return W(i,"list_metric_catalog")}}async function Ir(e,t,n){let r=new L(e,t);try{let i=await r.getMetricDetail(n.metric_id),s=ho(i),o,a;if(!n.brief){let u=l(i.uniformResourceType)||"METRIC_PLATFORM_METRIC";try{o=Io(await r.getMetricLineage(n.metric_id,u))}catch(c){a=c instanceof z?c.detail:String(c)}}return S({detail:{...s,lineage:o,lineage_error:a},raw:n.raw?i:void 0})}catch(i){return W(i,"get_metric_detail")}}async function yr(e,t,n){let r=new L(e,t);try{let i=await r.getMetricDetail(n.metric_id);if(!n.advanced_calc){let a=nr(i,n);if("unsupported"in a)return j("query_metric_data",a.unsupported);let u=async p=>{let g=await r.getCardEditSession(a.cardId),h=l(g.sessionId);if(!h)throw new Error("\u6307\u6807\u5361\u7247\u9884\u89C8\u4F1A\u8BDD\u54CD\u5E94\u7F3A\u5C11 sessionId\u3002");return a.dimensions.length&&await yo(r,a.cardId,h,a.dimensions),{raw:await r.queryCardEditData(a.cardId,h,p),sessionId:h}};if(n.combine_type==="OR"&&(n.filters?.length??0)>1){let p=[],g=[];for(let h of n.filters??[]){let y=nr(i,{...n,combine_type:"AND",filters:[h]});if("unsupported"in y)return j("query_metric_data",y.unsupported);let{raw:C}=await u(y.body);g.push(C),p.push(...rr(C))}return De(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 De(i,rr(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=tr(i,n);if("unsupported"in s)return j("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=tr(i,{...n,combine_type:"AND",filters:[c]});if("unsupported"in d)return j("query_metric_data",d.unsupported);let p=await r.queryMetricData(d.input);u.push(p),a.push(...me(p))}return De(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 De(i,me(o),n,{mode:"metric_data_v2",request_body:s.input},n.raw?o:void 0)}catch(i){return Uo(i)?j("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}):W(i,"query_metric_data")}}async function br(e,t,n){let r=new L(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=fo(i).map(Or).slice(0,n.limit);return S({summary:{keyword:n.keyword,count:s.length},items:s})}catch(i){return W(i,"search_metric_trees")}}async function Tr(e,t,n){let r=new L(e,t);try{let i=await r.getMetricTreeDetail(n.metric_tree_id);return S({detail:So(i),raw:n.raw?i:void 0})}catch(i){return W(i,"get_metric_tree_detail")}}async function Cr(e,t,n){let r=new L(e,t);try{if(n.target==="dimension"&&!n.dimension&&!n.dimension_fd_id)return j("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 j("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=fe(o),u=Et(n.filters??[],a);if("unsupported"in u)return j("query_metric_tree_attribution",u.unsupported);let c=u.filters,d=Ro(i,n);if("unsupported"in d)return j("query_metric_tree_attribution",d.unsupported);if(n.target==="metric"){let y=Oo(i,d.value,c),C=await r.queryMetricTreeDecompose(n.metric_tree_id,y);return ht(i,"metric",Ao(C),n,n.raw?C:void 0)}if(n.target==="dimension"){let y=oe(a,n.dimension,n.dimension_fd_id);if(!y)return j("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 C=sr(i,y,d.value,c,n.limit,n.sort),k=await r.queryMetricTreeDrill(n.metric_tree_id,C);return ht(i,"dimension",or(k,l(y.name)),n,n.raw?k:void 0)}let p=ko(i,a,n.scan_dimensions,n.exclude_dimensions);if(!p.length)return j("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=[],h=[];for(let y of p){let C=sr(i,y,d.value,c,n.group_limit,n.sort),k=await r.queryMetricTreeDrill(n.metric_tree_id,C);h.push({dimension:l(y.name),raw:k}),g.push(...or(k,l(y.name)).slice(0,n.group_limit))}return ht(i,"scan",g,n,n.raw?h:void 0,{scanned_dimensions:p.map(y=>l(y.name))})}catch(i){return W(i,"query_metric_tree_attribution")}}async function po(e){return(await Er(e)).map(t=>l(t.id)).filter(Boolean)}async function Er(e){return A(await e.listProjects()).map(_).filter(Boolean)}function mo(e){let t=_(e);return A(t.contents??t.items??t.data)}function fo(e){let t=_(e);return A(t.data??t.contents??t.items)}function yt(e){return I({metric_id:l(e.id),name:l(e.name),project_id:l(e.projectId),dir_id:O(e.parentDirId,e.dirId),status:l(e.status),sub_type:l(e.subType),description:l(e.desc),dataset:Pr(e.dsInfo),statistics:e.statisticsData,creator:Ue(e.creator),business_owner:Ue(e.businessOwner),updated_at:l(e.utime),raw:e})}function go(e){return A(e).map(t=>Br(t,void 0))}function Br(e,t){let n=!!e.isMetric,r=l(e.id),i=!t&&!n?r:t;return I({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:A(e.children).map(s=>Br(s,i))})}function _o(e,t){let n=_(e);return l(n.id)?[bt(n,t)]:A(n.contents??n.children).map(r=>bt(r,t))}function bt(e,t){return I({id:l(e.id),name:l(e.name),type:"directory",project_id:t,dir_id:l(e.id),parent_id:O(e.parentDirId,e.parentId),can_use:x(e.canUse),can_manage:x(e.canManage),metric_count:ar(e.metricCnt),all_metric_count:ar(e.allMetricCnt),children:A(e.contents??e.children).map(n=>bt(n,t))})}function ho(e){return I({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:O(e.parentDirId,e.dirId),dir_path:vr(e.dirPath),dataset:Pr(e.dsInfo),source_fields:A(e.fdInfos).map(je),aggregation:O(e.aggrType,e.aggregationType),formula:O(e.formula,e.expression),derive_setting:e.deriveSetting,format:e.format,applicable_dimensions:fe(e),time_dimension:_(e.timeDim)?je(_(e.timeDim)):void 0,business_attributes:A(e.bizAttrs).map(jo),business_owner:Ue(e.businessOwner),creator:Ue(e.creator),referenced_metrics:A(e.referencedMetrics).map(yt),base_metric:_(e.baseMetric)?yt(_(e.baseMetric)):void 0,linked_metric_id:l(e.linkMetricId),statistics:e.statisticsData,permissions:I({can_use:x(e.canUse),can_manage:x(e.canManage)}),created_at:l(e.ctime),updated_at:l(e.utime),has_draft:x(e.hasDraft)})}function Io(e){let t=_(e);return I({current:t.crtNode,upstream:t.backwardAtlas,downstream:t.forwardAtlas})}function tr(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=fe(e),s=[...i,...Ar(e)],o=[];for(let d of t.dimensions??[]){let p=oe(i,d);if(!p)return{unsupported:{capability:"unsupported_dimension",parameter:d,supported_dimensions:i}};o.push(Po(p))}let a=To(e,i,t.advanced_calc);if("unsupported"in a)return{unsupported:a.unsupported};let u=Et(t.filters??[],s);if("unsupported"in u)return{unsupported:u.unsupported};let c=wr(t.sort??[],s);return"unsupported"in c?{unsupported:c.unsupported}:{input:{projectId:r,metricId:t.metric_id,metricName:n,metricItems:[I({name:n,alias:Co(n,t.advanced_calc),advCalc:a.value})],dimensions:o,filters:u.filters,sorting:c.sorting,limit:t.limit}}}function nr(e,t){let n=_(e.metricChartConfig),r=l(n.metricChartCdId),i=l(n.metricValueCdId),s=r||i;if(!s)return{unsupported:{capability:"missing_metric_card",message:"\u6307\u6807\u8BE6\u60C5\u7F3A\u5C11 metricChartConfig.metricChartCdId \u6216 metricValueCdId\uFF0C\u65E0\u6CD5\u8D70\u53EA\u8BFB\u5361\u7247\u53D6\u6570\u3002"}};let o=[...fe(e),...Ar(e)],a=[];for(let g of t.dimensions??[]){let h=oe(o,g);if(!h||l(h.meta_type).toUpperCase()==="METRIC")return{unsupported:{capability:"unsupported_dimension",parameter:g,supported_dimensions:fe(e)}};a.push(vo(h))}let u=Et(t.filters??[],o);if("unsupported"in u)return{unsupported:u.unsupported};let c=u.filters,d=wr(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:I({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 yo(e,t,n,r){let i=xr(await e.getCardEditMeta(t))??{},s=bo(i);s.row=r,s.sorting=[],await e.modifyCardEditMeta(t,n,i)}function bo(e){let t=_(e.content),n=_(t.meta),r=_(n.chartMain),i=_(r.zoneData);if(!Object.keys(i).length)throw new Error("\u6307\u6807\u5361\u7247\u7F16\u8F91\u914D\u7F6E\u7F3A\u5C11 content.meta.chartMain.zoneData\u3002");return t.meta=n,n.chartMain=r,r.zoneData=i,e.content=t,i}function To(e,t,n){if(!n)return{value:void 0};let r=_(e.timeDim),i=l(r?.fdId);if(["compare","last"].includes(n.type)&&!i)return{unsupported:{capability:"advanced_calc_requires_time_dimension",parameter:n.type}};if(n.type==="compare"){let a=n.compare??"yoy",u={yoy:["YEAR","YEAR"],mom:["MONTH","MONTH"],qoq:["QUARTER","QUARTER"],wow:["WEEK","WEEK"],dod:["DAY","DAY"]},[c,d]=u[a];return{value:{advType:"COMPARATIVE",advValue:{advType:"COMPARATIVE",dateFdId:i,valueType:(n.compare_value??"value").toUpperCase(),offset:1,offsetType:c,granularity:d}}}}if(n.type==="xtd")return{value:{advType:"XTD",advValue:{advType:"XTD",granularity:{ytd:"YEAR",qtd:"QUARTER",mtd:"MONTH",wtd:"WEEK",dtd:"DAY"}[n.xtd??"ytd"],includeCurrentValue:!0}}};if(n.type==="last")return{value:{advType:"LAST",advValue:{advType:"LAST",dateFdId:i}}};if(n.type==="recent"){let a=Eo(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?oe(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:I({advType:"LEVEL_PERCENTAGE",auto:!a,tfdId:l(a?.fd_id)})}}}let o=n.rank_dim?oe(t,n.rank_dim):void 0;return n.rank_dim&&!o?{unsupported:{capability:"unknown_rank_dimension",parameter:n.rank_dim}}:{value:{advType:"RANK",advValue:I({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 Co(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 Eo(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 Et(e,t){let n=[];for(let r of e){let i=Sr(t,r.field,r.fd_id,"filter");if("unsupported"in i)return{unsupported:i.unsupported};n.push(I({name:i.field.name,fdId:i.field.fdId,fdType:i.field.fdType,metaType:i.field.metaType,filterType:r.operator,filterValue:Bo(r)}))}return{filters:n}}function Bo(e){return It.has(e.operator)?[]:e.values??[]}function wr(e,t){let n=[];for(let r of e){let i=Sr(t,r.field,void 0,"sort");if("unsupported"in i)return{unsupported:i.unsupported};n.push(I({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 Sr(e,t,n,r){let i=oe(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=>I({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 De(e,t,n,r,i){let s=xo(t.slice(0,n.limit),n.columns);return S({summary:{metric_id:n.metric_id,metric_name:l(e.name),row_count:s.length,truncated:t.length>s.length},columns:kr(s),rows:s,diagnostic:r,raw:i})}function me(e){let t=_(e),n=_(t.data)??t,r=A(n.values??n.rows??t.values??t.rows);if(r.length)return r;let i=A(n.columns??t.columns).map(o=>l(_(o)?.name??o)).filter(Boolean),s=A(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 rr(e){let t=_(e),n=_(t.data)??t,r=_(n.chartMain??t.chartMain??_(_(t.content).data).chartMain);if(!Object.keys(r).length)return me(e);let i=_(r.row),s=_(r.column),o=A(i.fields),a=K(i.data),u=K(r.data),c=wo(s),d=o.map(Tt).filter(Boolean),p=Mo([...d,...c]),g=Math.max(a.length,u.length),h=[];for(let y=0;y<g;y+=1){let C=[];C.push(...K(a[y]).map(ir)),C.push(...K(u[y]).map(ir)),C.length&&h.push(Object.fromEntries(C.map((k,H)=>[p[H]??`column_${H+1}`,k])))}return h}function wo(e){let n=K(e.data).map((r,i)=>{let s=K(r).map(Rr).filter(Boolean).join("/");return s||Tt(A(e.fields)[i])||`metric_${i+1}`}).filter(Boolean);return n.length?n:A(e.fields).map(Tt).filter(Boolean)}function Tt(e){return O(e.alias,e.title,e.originTitle,e.name,e.fdId,e.id)??""}function Rr(e){let t=_(e);return Object.keys(t).length?O(t.title,t.name,t.originTitle,t.alias,t.v,t.value)??"":l(e)}function ir(e){let t=_(e);return Object.keys(t).length?"v"in t?t.v:"value"in t?t.value:Rr(e):e}function Or(e){return I({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:vr(e.dirPath),creator_id:l(e.creatorId),creator_name:l(e.creatorName),can_use:x(e.canUse),can_manage:x(e.canManage),updated_at:l(e.utime)})}function So(e){let t=_(e.config)??{};return I({...Or(e),dom_id:l(e.domId),created_at:l(e.ctime),time_comparison:t.timeComparisonSetting,comparison_enabled:x(t.comparisonEnabled),contribution_calc_enabled:x(t.contributionCalcEnabled),dimension_decomposition:t.dimensionDecompositionContent,metric_decomposition:t.metricDecompositionContent,permissions:I({can_use:x(e.canUse),can_manage:x(e.canManage)})})}function Ro(e,t){let n=_(e.config)??{},r=t.time_comparison_json??xr(_(n.timeComparisonSetting)),i=x(n.comparisonEnabled)??!!r,s=x(n.contributionCalcEnabled)??!1;if(t.period||t.last_period){if(!t.period||!t.last_period)return{unsupported:{capability:"period_requires_last_period",message:"period \u548C last_period \u9700\u8981\u540C\u65F6\u6307\u5B9A\u3002"}};r=r??{};let o=_(r.advValue)??{};r.advValue=o,o.window={period:[t.period],withMacro:!1};let a=Do(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 Oo(e,t,n){let r=_(e.config)??{},i=_(r.metricDecompositionContent)??{};return I({timeComparisonSetting:t.setting,comparisonEnabled:t.comparisonEnabled,contributionCalcEnabled:!1,metricDecomposeInfo:{metricRelationTree:i.metricRelationTree,filters:n}})}function sr(e,t,n,r,i,s){return I({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 Ao(e){return me(e).map(t=>I({child_metric:l(_(t.metricInfo)?.name),child_metric_id:l(_(t.metricInfo)?.metricId),current_value:t.currentValue,comparison_value:t.comparisonValue,change_value:t.changeValue,change_rate:t.changeRate,contribution_value:t.contributionValue,contribution_rate:t.contributionRate}))}function or(e,t){return me(e).map((n,r)=>I({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 ht(e,t,n,r,i,s){let o=t==="scan"?n:n.slice(0,r.limit);return S({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:kr(o),rows:o,raw:i})}function ko(e,t,n,r){let i=new Set((n??[]).map(c=>c.trim()).filter(Boolean)),s=new Set((r??[]).map(c=>c.trim()).filter(Boolean)),o=new Map(t.map(c=>[l(c.name),c])),a=new Map(t.map(c=>[l(c.fd_id),c])),u=i.size?[...i].map(c=>o.get(c)).filter(c=>!!c):[];if(!u.length){let c=_(e.config)??{},d=_(c.dimensionDecompositionContent)??{};u=K(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 fe(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(je(i));for(let u of A(i.subs))r(u)}};for(let i of A(e.applicableDims))r(i);return r(_(e.timeDim)),n}function Ar(e){let t=A(e.fdInfos).map(je);return l(e.name)&&!t.some(n=>l(n.name)===l(e.name))&&t.push(I({id:O(e.id,e.name),fd_id:l(e.id),name:l(e.name),fd_type:O(t[0]?.fd_type,"DOUBLE"),meta_type:"METRIC"})),t}function je(e){return I({id:O(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 oe(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 Po(e){return I({name:l(e.name),alias:l(e.name),fdType:O(e.fd_type),metaType:"DIM",key:O(e.fd_id,e.id,e.name),fdId:O(e.fd_id),dsId:O(e.ds_id),granularity:O(e.granularity)})}function vo(e){return I({name:l(e.name),alias:O(e.name),fdType:O(e.fd_type),metaType:"DIM",key:O(e.fd_id,e.id,e.name),fdId:O(e.fd_id),dsId:O(e.ds_id),granularity:O(e.granularity)})}function xo(e,t){return t?.length?e.map(n=>Object.fromEntries(t.map(r=>[r,n[r]]))):e}function kr(e){return[...new Set(e.flatMap(t=>Object.keys(t)))]}function Mo(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 Do(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 Pr(e){let t=_(e);if(t)return I({dataset_id:l(t.dsId),name:l(t.name)})}function Ue(e){let t=_(e);if(t)return I({user_id:O(t.uId,t.id),name:l(t.name),deleted:x(t.isDel)})}function jo(e){return I({id:l(e.id),name:l(e.name),type:l(e.valueType),values:A(e.values)})}function vr(e){return A(e).map(t=>l(t.dirName??t.name)).filter(Boolean)}function j(e,t){return S({status:"unsupported",diagnostic:{tool:e,...t}})}function W(e,t){return e instanceof z?$({operation:t,diagnostic:e.detail}):$({operation:t,message:e instanceof Error?e.message:String(e)})}function Uo(e){return e instanceof z&&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 A(e){return Array.isArray(e)?e.map(_).filter(Boolean):[]}function K(e){return Array.isArray(e)?e:[]}function _(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function l(e){return typeof e=="string"?e:e==null?"":String(e)}function O(...e){return e.map(l).find(t=>t.trim())?.trim()}function x(e){return typeof e=="boolean"?e:void 0}function ar(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 xr(e){return e?JSON.parse(JSON.stringify(e)):void 0}function Mr(e,t,n,r,i={}){let s=i.usageTelemetry??new Re({config:n,appVersion:i.appVersion??"unknown"}),o=(u,c,d)=>{let p=e.registerTool,g=sn(u,d,s),h=async(...y)=>{try{return await g(...y)}catch(C){return de(u,C)}};p.call(e,u,c,h)},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:on},(u,c)=>t.run(({client:d,config:p})=>an(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:kn,outputSchema:Sn},(u,c)=>t.run(({config:d})=>Mn(d,u),c,"chatbi_list_themes")),o("chatbi_query",{title:"ChatBI Query",description:"\u6267\u884C ChatBI L1 \u540C\u6B65\u95EE\u6570\uFF0C\u7528\u81EA\u7136\u8BED\u8A00\u76F4\u63A5\u63D0\u95EE\uFF0C\u6700\u7701\u4E8B\uFF0C\u9002\u5408\u4E1A\u52A1\u95EE\u9898\u8868\u8FF0\u660E\u786E\u3001\u65E0\u9700\u7CBE\u786E\u63A7\u5236\u7EF4\u5EA6\u6216 SQL \u7684\u573A\u666F\uFF1B\u9700\u8981\u7CBE\u786E\u6307\u5B9A\u7EF4\u5EA6/\u7B5B\u9009\u7528 query_metric_data\uFF0C\u9700\u8981\u81EA\u5B9A\u4E49 SQL \u7528 execute_sql_query\u3002\u652F\u6301\u4E3B\u9898 ID \u6216\u4E3B\u9898\u540D\u3002\u6210\u529F\u7ED3\u679C\u76F4\u63A5\u900F\u51FA answer\u3001sql\u3001query_result \u7B49\u7ED3\u6784\u5316\u5B57\u6BB5\uFF0C\u7531\u8C03\u7528\u65B9\u81EA\u884C\u7EC4\u7EC7\u6700\u7EC8\u56DE\u590D\u3002session_id \u53EA\u80FD\u7528\u4E8E\u95EE\u6570\u7EED\u95EE\uFF0C\u4E0D\u80FD\u4E0E ChatBI \u6D1E\u5BDF\u4F1A\u8BDD\u6DF7\u7528\u3002",inputSchema:Pn,outputSchema:Rn},(u,c)=>t.run(({config:d})=>Dn(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:vn,outputSchema:On},(u,c)=>t.run(({config:d})=>jn(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:xn,outputSchema:An},(u,c)=>t.run(({config:d})=>Un(d,u),c,"chatbi_insight_poll"))),r.ok&&(a("global_search")&&o("global_search",{title:"Global Search",description:"\u6309\u5173\u952E\u8BCD\u641C\u7D22 BI \u4E2D\u7684\u5361\u7247\u3001\u4EEA\u8868\u677F\u3001\u6570\u636E\u96C6\u548C ETL \u8D44\u6E90\uFF0C\u9002\u5408\u5B9A\u4F4D\u67D0\u4E2A\u5DF2\u6709\u8D44\u4EA7\u6216\u5176 ID\u3002\u8FD4\u56DE\u7684\u5361\u7247 ID \u53EF\u4EA4\u7ED9 get_card_info/query_card_data\uFF0C\u6570\u636E\u96C6 ID \u53EF\u4EA4\u7ED9 get_dataset_detail/execute_sql_query\u3002\u6307\u6807\u76F8\u5173\u68C0\u7D22\u8BF7\u7528 search_metrics\u3002",inputSchema:Xn},(u,c)=>t.run(({client:d})=>Zn(d,u),c,"global_search")),a("search_metrics")&&o("search_metrics",{title:"Search Metrics",description:"\u6309\u5173\u952E\u8BCD\u641C\u7D22\u6307\u6807\u5E73\u53F0\u6307\u6807\uFF0C\u8FD4\u56DE metric_id\u3001\u540D\u79F0\u3001\u4E3B\u9898\u3001\u76EE\u5F55\u3001\u7C7B\u578B\u3001\u72B6\u6001\u548C\u4E1A\u52A1\u53E3\u5F84\u6458\u8981\u3002\u5DF2\u6709\u5173\u952E\u8BCD\u65F6\u4F18\u5148\u7528\u672C\u5DE5\u5177\uFF1B\u4E0D\u6E05\u695A\u6709\u54EA\u4E9B\u6307\u6807\u65F6\u6539\u7528 list_metric_catalog \u6D4F\u89C8\u3002\u8FD4\u56DE\u7684 metric_id \u53EF\u7EE7\u7EED\u4EA4\u7ED9 get_metric_detail \u770B\u53E3\u5F84\u3001query_metric_data \u53D6\u6570\u3002",inputSchema:cr,outputSchema:V},(u,c)=>t.run(({client:d,config:p})=>_r(d,p,u),c,"search_metrics")),a("list_metric_catalog")&&o("list_metric_catalog",{title:"List Metric Catalog",description:"\u6309\u4E3B\u9898/\u76EE\u5F55\u5C42\u7EA7\u6D4F\u89C8\u6307\u6807\u8282\u70B9\uFF0C\u9002\u5408\u4E0D\u77E5\u9053\u5173\u952E\u8BCD\u3001\u9700\u8981\u5148\u53D1\u73B0\u6709\u54EA\u4E9B\u53EF\u7528\u6307\u6807\u7684\u573A\u666F\u3002\u5DF2\u6709\u660E\u786E\u5173\u952E\u8BCD\u65F6\u6539\u7528 search_metrics\u3002\u8FD4\u56DE\u7684 metric_id \u53EF\u7EE7\u7EED\u4EA4\u7ED9 get_metric_detail\u3001query_metric_data\u3002",inputSchema:dr,outputSchema:V},(u,c)=>t.run(({client:d,config:p})=>hr(d,p,u),c,"list_metric_catalog")),a("get_metric_detail")&&o("get_metric_detail",{title:"Get Metric Detail",description:"\u6309 metric_id \u83B7\u53D6\u6307\u6807\u7684\u4E1A\u52A1\u53E3\u5F84\u3001\u8BA1\u7B97\u53E3\u5F84\u3001\u9002\u7528\u7EF4\u5EA6\u3001\u65F6\u95F4\u7EF4\u3001\u8840\u7F18/\u5F15\u7528\u6458\u8981\u548C\u6743\u9650\u4FE1\u606F\u3002\u5EFA\u8BAE\u5728 query_metric_data \u53D6\u6570\u524D\u5148\u8C03\u7528\uFF0C\u786E\u8BA4\u53EF\u7528\u7EF4\u5EA6\u4E0E\u53E3\u5F84\u3002metric_id \u6765\u81EA search_metrics \u6216 list_metric_catalog\u3002",inputSchema:lr,outputSchema:V},(u,c)=>t.run(({client:d,config:p})=>Ir(d,p,u),c,"get_metric_detail")),a("query_metric_data")&&o("query_metric_data",{title:"Query Metric Data",description:"\u6309\u5DF2\u77E5 metric_id \u7CBE\u786E\u67E5\u8BE2\u6307\u6807\u6570\u636E\uFF0C\u9002\u5408\u9700\u8981\u6307\u5B9A\u7EF4\u5EA6\u3001\u7B5B\u9009\u3001\u6392\u5E8F\u7684\u53D6\u6570\u573A\u666F\uFF1B\u7EF4\u5EA6\u5EFA\u8BAE\u5148\u7528 get_metric_detail \u786E\u8BA4\u3002\u53EA\u8BFB\u5B89\u5168\uFF1A\u8BFB\u53D6\u6307\u6807\u5361\u9884\u89C8\u6570\u636E\uFF0C\u7EF4\u5EA6\u67E5\u8BE2\u53EA\u6539\u4E34\u65F6 session\uFF0C\u4E0D\u89E6\u53D1 save\u3001update\u3001delete\u3001publish \u7B49\u6301\u4E45\u5316\u64CD\u4F5C\u3002\u9700\u8981\u81EA\u7136\u8BED\u8A00\u95EE\u6570\u7528 chatbi_query\uFF0C\u9700\u8981\u5199 SQL \u7528 execute_sql_query\u3002",inputSchema:pr,outputSchema:V},(u,c)=>t.run(({client:d,config:p})=>yr(d,p,u),c,"query_metric_data")),a("search_metric_trees")&&o("search_metric_trees",{title:"Search Metric Trees",description:"\u6309\u5173\u952E\u8BCD\u641C\u7D22\u6307\u6807\u6811\u8D44\u6E90\uFF0C\u8FD4\u56DE metric_tree_id\u3002\u5F52\u56E0\u5206\u6790\u7684\u5165\u53E3\u5DE5\u5177\uFF1A\u62FF\u5230 metric_tree_id \u540E\u7528 get_metric_tree_detail \u770B\u7ED3\u6784\u3001query_metric_tree_attribution \u505A\u5F52\u56E0\u3002",inputSchema:mr,outputSchema:V},(u,c)=>t.run(({client:d,config:p})=>br(d,p,u),c,"search_metric_trees")),a("get_metric_tree_detail")&&o("get_metric_tree_detail",{title:"Get Metric Tree Detail",description:"\u6309 metric_tree_id \u83B7\u53D6\u6307\u6807\u6811\u8BE6\u60C5\u3001\u6839\u6307\u6807\u3001\u65F6\u95F4\u5BF9\u6BD4\u914D\u7F6E\u3001\u7EF4\u5EA6\u62C6\u89E3\u914D\u7F6E\u548C\u6307\u6807\u5173\u7CFB\u6811\u3002\u5EFA\u8BAE\u5728 query_metric_tree_attribution \u5F52\u56E0\u524D\u5148\u8C03\u7528\uFF0C\u786E\u8BA4\u53EF\u62C6\u89E3\u7EF4\u5EA6\u4E0E\u5BF9\u6BD4\u914D\u7F6E\u3002metric_tree_id \u6765\u81EA search_metric_trees\u3002",inputSchema:fr,outputSchema:V},(u,c)=>t.run(({client:d,config:p})=>Tr(d,p,u),c,"get_metric_tree_detail")),a("query_metric_tree_attribution")&&o("query_metric_tree_attribution",{title:"Query Metric Tree Attribution",description:"\u6309\u5DF2\u77E5 metric_tree_id \u6267\u884C\u6307\u6807\u62C6\u89E3\u3001\u5355\u7EF4\u62C6\u89E3\u6216\u5168\u7EF4\u626B\u63CF\u5F52\u56E0\uFF0C\u9002\u5408\u5206\u6790\u67D0\u6307\u6807\u53D8\u5316\u7531\u54EA\u4E9B\u56E0\u7D20/\u7EF4\u5EA6\u8D21\u732E\u3002\u5EFA\u8BAE\u5148\u7528 get_metric_tree_detail \u786E\u8BA4\u53EF\u62C6\u89E3\u7EF4\u5EA6\u3002",inputSchema:gr,outputSchema:V},(u,c)=>t.run(({client:d,config:p})=>Cr(d,p,u),c,"query_metric_tree_attribution")),a("execute_sql_query")&&o("execute_sql_query",{title:"Execute SQL Query",description:`\u57FA\u4E8E\u4E00\u4E2A\u6216\u591A\u4E2A\u6570\u636E\u96C6\u6267\u884C\u67E5\u8BE2 SQL\u3002\u82E5\u672C\u8F6E\u5C1A\u672A\u8BFB\u53D6\u6570\u636E\u96C6\u8BE6\u60C5\uFF0C\u5148\u8C03\u7528 get_dataset_detail \u83B7\u53D6\u6570\u636E\u96C6\u540D\u79F0/name \u548C columns[].name\u3002inputs \u53EA\u4F20\u5BF9\u5E94\u6570\u636E\u96C6 ID\uFF0C\u4E0D\u5F97\u628A dsId\u3001fdId \u6216 input0 \u5F53\u8868\u540D\uFF1BSQL \u901A\u5E38\u5148\u7528\u6570\u636E\u96C6\u540D\u79F0\u4F5C\u4E3A FROM/JOIN \u8868\u5F15\u7528\u3002\u82E5 TABLE_OR_VIEW_NOT_FOUND \u7684 diagnostic.tableBindings[] \u63D0\u4F9B sqlReference\uFF0C\u5FC5\u987B\u6309\u8BE5\u503C\u4FEE\u6B63\uFF1B\u5355\u6570\u636E\u96C6 Spark \u67E5\u8BE2\u53EF\u80FD\u8FD4\u56DE\u7A33\u5B9A\u5F15\u7528 __THIS__\uFF0C\u4E0D\u8981\u539F\u6837\u91CD\u590D\u5931\u8D25 SQL\u3002\u4E2D\u6587\u6216\u7279\u6B8A\u5B57\u7B26\u540D\u79F0\u7528\u53CD\u5F15\u53F7\uFF0C\u4F8B\u5982 SELECT * FROM \`\u9500\u552E\u6570\u636E\u96C6\`\u3002\u65E0\u8868\u67E5\u8BE2\u4F20 inputs: []\u3002\u591A\u6570\u636E\u96C6\u67E5\u8BE2\u8981\u6C42\u6570\u636E\u96C6\u80FD\u5728\u540C\u4E00\u6267\u884C\u94FE\u8DEF\u4E2D\u67E5\u8BE2\u3002\u8FD4\u56DE\u884C\u6570\u7531 BI_MAX_ROWS \u63A7\u5236\uFF0C\u5F53\u524D\u4E3A ${n.BI_MAX_ROWS} \u884C\uFF0C\u65E0\u9700\u81EA\u884C\u6DFB\u52A0 LIMIT\u3002`,inputSchema:Kn},(u,c)=>t.run(({client:d,config:p})=>Wn(d,p,u),c,"execute_sql_query")),a("get_dataset_detail")&&o("get_dataset_detail",{title:"Get Dataset Detail",description:"\u6309\u6570\u636E\u96C6 ID \u83B7\u53D6\u57FA\u7840\u4FE1\u606F\u3001\u5B57\u6BB5\u7ED3\u6784\u548C\u76F8\u5173\u914D\u7F6E\u3002\u5EFA\u8BAE\u5728 execute_sql_query \u5199 SQL \u524D\u5148\u8C03\u7528\uFF0C\u786E\u8BA4\u6570\u636E\u96C6\u540D\u79F0\u4E0E\u53EF\u7528\u5B57\u6BB5\u3002\u6570\u636E\u96C6 ID \u6765\u81EA global_search\u3002",inputSchema:Jn},(u,c)=>t.run(({client:d})=>Fn(d,u),c,"get_dataset_detail")),a("get_card_info")&&o("get_card_info",{title:"Get Card Info",description:"\u6309\u5361\u7247 ID \u83B7\u53D6\u57FA\u7840\u4FE1\u606F\u3001\u56FE\u8868\u7C7B\u578B\u3001\u6570\u636E\u6765\u6E90\u548C\u914D\u7F6E\u3002\u5EFA\u8BAE\u5728 query_card_data \u53D6\u6570\u524D\u5148\u8C03\u7528\uFF0C\u786E\u8BA4\u5B57\u6BB5\u4E0E\u6570\u636E\u6765\u6E90\u3002\u5361\u7247 ID \u6765\u81EA global_search \u6216 get_page_info\u3002",inputSchema:$n},(u,c)=>t.run(({client:d})=>zn(d,u),c,"get_card_info")),a("query_card_data")&&o("query_card_data",{title:"Query Card Data",description:"\u6309\u5DF2\u77E5\u5361\u7247 ID \u5B89\u5168\u53EA\u8BFB\u67E5\u8BE2 BI \u5361\u7247\u9884\u89C8\u6570\u636E\uFF0C\u652F\u6301\u56FE\u8868\u5361\u52A8\u6001\u53C2\u6570\u8986\u76D6\uFF0C\u8FD4\u56DE\u7ED3\u6784\u5316 columns\u3001rows\u3001summary \u548C diagnostic\uFF0C\u9002\u5408\u8BFB\u53D6\u5DF2\u6709\u5361\u7247\u80CC\u540E\u7684\u6570\u636E\u3002\u5361\u7247 ID \u6765\u81EA global_search \u6216 get_page_info\uFF1B\u5EFA\u8BAE\u5148\u7528 get_card_info \u4E86\u89E3\u5B57\u6BB5\u3002",inputSchema:mn,outputSchema:fn},(u,c)=>t.run(({client:d})=>gn(d,u),c,"query_card_data")),a("get_page_info")&&o("get_page_info",{title:"Get Page Info",description:"\u6309\u9875\u9762/\u4EEA\u8868\u677F ID \u83B7\u53D6\u57FA\u7840\u4FE1\u606F\u3001\u5E03\u5C40\u3001\u5361\u7247\u5217\u8868\u548C\u76F8\u5173\u914D\u7F6E\uFF0C\u53EF\u4ECE\u4E2D\u62FF\u5230\u5361\u7247 ID \u518D\u4EA4\u7ED9 get_card_info/query_card_data\u3002\u9875\u9762 ID \u6765\u81EA global_search\u3002",inputSchema:Vn},(u,c)=>t.run(({client:d})=>Qn(d,u),c,"get_page_info")))}var Fo=Lo(import.meta.url),At=Fo("../package.json"),wt=class{record(t){console.error(JSON.stringify({runtime:Zo(t)}))}};function jr(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 Rt(e,r):new St(e,r)}var zo=`\u89C2\u8FDC BI\uFF08Guandata\uFF09MCP Server\uFF0C\u7528\u4E8E\u5728\u89C2\u8FDC BI \u5E73\u53F0\u4E0A\u505A\u6570\u636E\u53D1\u73B0\u3001\u770B\u8D44\u4EA7\u8BE6\u60C5\u3001\u5B89\u5168\u53EA\u8BFB\u53D6\u6570\u548C\u6307\u6807\u5206\u6790\u3002\u6240\u6709\u5DE5\u5177\u5747\u4E3A\u53EA\u8BFB\uFF0C\u4E0D\u4F1A\u4FEE\u6539\u3001\u4FDD\u5B58\u6216\u5220\u9664 BI \u8D44\u4EA7\u3002
10
+ ${c}`:u}catch{return}}var xt=new Map([["k",1e3],["K",1e3],["M",1e6],["B",1e9],["\u4E07",1e4],["\u4EBF",1e8]]),Lo=[[1e8,"\u4EBF"],[1e4,"\u4E07"]];function qo(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 Ho(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=mr(c[i]);typeof d=="number"&&(a=Math.max(a,Math.abs(d/fr(o))))}let u=$o(a);u&&r.set(s,u)}return r}function Jo(e,t,n){if(!t)return e;let r=mr(e);return typeof r!="number"?e:Go(r,t,n)}function mr(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 Go(e,t,n){let r=fr(t),{unit:i,shouldScale:s}=Fo(t,n),o=s&&i?xt.get(i)??1:1,a=e/r/o,u=zo(t.decimalPlaces),c=t.useThousandsSeparator?a.toLocaleString("en-US",{minimumFractionDigits:u,maximumFractionDigits:u}):a.toFixed(u),d=i&&t.showPrefixUnit!==!1?i:"",l=t.showSuffix===!1||typeof t.suffix!="string"?"":t.suffix;return`${c}${d}${l}`}function fr(e){if(e.showPrefixUnit!==!1&&typeof e.prefixUnit=="string"&&e.prefixUnit!=="auto"&&xt.has(e.prefixUnit))return 1;let t=Number(e.divideDataBy??1);return Number.isFinite(t)&&t!==0?t:1}function Fo(e,t){return e.showPrefixUnit===!1?{unit:"",shouldScale:!1}:e.prefixUnit==="auto"?{unit:t??"",shouldScale:!0}:typeof e.prefixUnit=="string"&&xt.has(e.prefixUnit)?{unit:e.prefixUnit,shouldScale:!0}:{unit:"",shouldScale:!1}}function zo(e){return typeof e!="number"||!Number.isFinite(e)?2:Math.max(0,Math.min(100,Math.trunc(e)))}function $o(e){return Lo.find(([t])=>e>=t)?.[1]??""}function Qe(e,t,n){let r=Vo(e,t,n);return Q({error:"chatbi_request_failed",requested_operation:n,...r,tried_base_urls:r.tried_base_urls??e.getTriedBaseUrls()})}function Vo(e,t,n){return t instanceof x?t.detail:e.getLastError()??{operation:n,detail:t instanceof Error?t.message:String(t)}}import{z as vt}from"zod";var gr={dsId:vt.string().min(1).describe("\u6570\u636E\u96C6 ID\u3002")},_r={cdId:vt.string().min(1).describe("\u5361\u7247 ID\u3002")},hr={pageId:vt.string().min(1).describe("\u9875\u9762/\u4EEA\u8868\u677F ID\u3002")};async function yr(e,t){let n=await e.get(`/api/data-source/${encodeURIComponent(t.dsId)}`);return H(n)}async function Ir(e,t){let n=await e.get(`/api/card/${encodeURIComponent(t.cdId)}`);return H(n)}async function br(e,t){let n=await e.get(`/api/page/${encodeURIComponent(t.pageId)}`);return H(n)}import{z as we}from"zod";var Ee=we.string().trim().min(1),Qo=we.object({name:Ee.describe("CTE \u540D\u79F0\uFF0C\u4E0D\u80FD\u4E0E\u4EFB\u4E00\u8F93\u5165\u6570\u636E\u96C6\u7684\u7CBE\u786E\u540D\u79F0/name \u76F8\u540C\u3002"),query:Ee.describe("\u8BE5 CTE \u7684\u67E5\u8BE2\u4F53\uFF0C\u4E0D\u5305\u542B CTE \u540D\u79F0\u548C AS \u5916\u5C42\u3002")}).strict(),Tr={query:Ee.describe("\u5B8C\u6574\u7684\u5355\u6761\u67E5\u8BE2 SQL\uFF0C\u4EC5\u9650 SELECT/WITH\u3002inputs \u53EA\u7ED1\u5B9A\u6570\u636E\u96C6\uFF0CdsId\u3001fdId \u6216 input0 \u4E0D\u80FD\u76F4\u63A5\u4F5C\u4E3A\u8868\u540D\uFF1B\u901A\u5E38\u5148\u4F7F\u7528 get_dataset_detail \u8FD4\u56DE\u7684\u6570\u636E\u96C6\u540D\u79F0/name \u548C columns[].name\u3002\u82E5 TABLE_OR_VIEW_NOT_FOUND \u7684 diagnostic.tableBindings[] \u63D0\u4F9B sqlReference\uFF0C\u6309\u8BE5\u503C\u4FEE\u6B63\u8868\u5F15\u7528\uFF1B\u5355\u6570\u636E\u96C6 Spark \u67E5\u8BE2\u53EF\u80FD\u8FD4\u56DE __THIS__\u3002\u4E2D\u6587\u6216\u7279\u6B8A\u5B57\u7B26\u540D\u79F0\u7528\u53CD\u5F15\u53F7\u3002\u8FD4\u56DE\u884C\u6570\u7531 MCP \u63A7\u5236\uFF0C\u901A\u5E38\u65E0\u9700\u81EA\u884C\u6DFB\u52A0 LIMIT\u3002"),inputs:we.array(Ee).describe("query \u5B9E\u9645\u5F15\u7528\u7684\u5168\u90E8\u6570\u636E\u96C6 ID\uFF0C\u7528\u4E8E BI \u7ED1\u5B9A\u548C\u6743\u9650\u6821\u9A8C\uFF0C\u4E0D\u80FD\u4F5C\u4E3A SQL \u8868\u540D\u3002\u6BCF\u4E2A FROM/JOIN \u6570\u636E\u96C6\u90FD\u8981\u4F20\u5BF9\u5E94 ID\uFF0C\u4E0D\u8981\u591A\u4F20\u6216\u91CD\u590D\uFF1BSELECT 1 \u7B49\u65E0\u8868\u67E5\u8BE2\u4F20\u7A7A\u6570\u7EC4\u3002\u540E\u7AEF\u9ED8\u8BA4\u6700\u591A\u652F\u6301 10 \u4E2A\u4E0D\u540C\u6570\u636E\u96C6\uFF0C\u5B9E\u9645\u9650\u5236\u4EE5\u90E8\u7F72\u914D\u7F6E\u4E3A\u51C6\u3002"),queryStructure:we.object({ctes:we.array(Qo).min(1),mainQuery:Ee.describe("\u79FB\u9664\u9876\u5C42 WITH/CTE \u5B9A\u4E49\u540E\u7684\u6700\u7EC8 SELECT \u67E5\u8BE2\u3002")}).strict().optional().describe("\u4EC5\u5F53\u5B8C\u6574 query \u662F\u9876\u5C42 WITH/CTE \u67E5\u8BE2\u65F6\u63D0\u4F9B\u3002query \u4ECD\u4FDD\u7559\u5B8C\u6574\u539F\u59CB SQL\uFF1Bctes \u548C mainQuery \u662F\u540C\u4E00 SQL \u7684\u7ED3\u6784\u5316\u62C6\u5206\u3002\u6CA1\u6709 CTE \u65F6\u7701\u7565\u6574\u4E2A\u5B57\u6BB5\u3002")};async function Cr(e,t,n){try{await an(e,t,"executeSqlQuery");let r=await e.post("/api/data-source/execute-sql-query",{...n,query:n.query.trim(),inputs:[...new Set(n.inputs.map(i=>i.trim()))],limit:t.BI_MAX_ROWS,disableCache:!0});return H({maxRowsHint:t.BI_MAX_ROWS,result:r})}catch(r){if(Ko(r))return be("execute_sql_query",r,{hint:"\u8BF7\u5728\u7BA1\u7406\u540E\u53F0 -> \u9AD8\u7EA7\u8BBE\u7F6E -> \u5BF9\u5E94\u57DF\u540D\u4E0B\uFF0C\u6253\u5F00\u9AD8\u7EA7SQL\u67E5\u8BE2\u529F\u80FD\u3002"});if(Wo(r)){let i=await Xo(e,n.inputs),s=wr(r)&&i.length===1,o=i.map(a=>s?{...a,sqlReference:"__THIS__"}:a);return be("execute_sql_query",r,{hint:Yo(r,s),tableBindings:o.length>0?o:void 0})}throw r}}function Ko(e){return e instanceof Error&&e.message.includes("POST /api/data-source/execute-sql-query HTTP 404")}function Wo(e){return e instanceof Error&&e.message.includes("TABLE_OR_VIEW_NOT_FOUND")}function wr(e){return e instanceof Error&&e.message.includes("SparkViewDataset")}function Yo(e,t){return t?"\u8BE5\u8BF7\u6C42\u8D70 Spark \u6570\u636E\u96C6\u6267\u884C\u94FE\u8DEF\u3002\u4FDD\u6301 inputs \u4E0D\u53D8\uFF0C\u5C06 SQL \u4E2D\u8BE5\u6570\u636E\u96C6\u7684 FROM/JOIN \u8868\u5F15\u7528\u6539\u4E3A diagnostic.tableBindings[0].sqlReference\uFF08__THIS__\uFF09\u540E\u91CD\u8BD5\uFF1B\u4E0D\u8981\u518D\u6B21\u4F7F\u7528\u76F8\u540C\u7684\u663E\u793A\u540D\u79F0\u3002":wr(e)?"\u8BE5\u8BF7\u6C42\u8D70 Spark \u591A\u6570\u636E\u96C6\u6267\u884C\u94FE\u8DEF\uFF0C\u6570\u636E\u96C6\u663E\u793A\u540D\u79F0\u4E0D\u4FDD\u8BC1\u7B49\u4E8E\u5DF2\u6CE8\u518C\u7684 SQL \u5173\u7CFB\u540D\uFF0CMCP \u65E0\u6CD5\u53EF\u9760\u63A8\u5BFC\u5168\u90E8\u8868\u5F15\u7528\uFF1B\u8BF7\u52FF\u539F\u6837\u91CD\u590D\u8C03\u7528\uFF0C\u9700\u8981\u540E\u7AEF\u63D0\u4F9B\u7A33\u5B9A\u522B\u540D\u3002":"\u6570\u636E\u96C6 ID \u53EA\u7528\u4E8E BI \u7ED1\u5B9A\u548C\u6388\u6743\uFF0C\u4E0D\u80FD\u76F4\u63A5\u4F5C\u4E3A\u8868\u540D\u3002\u53EF\u6838\u5BF9 diagnostic.tableBindings[].displayName\uFF0C\u4F46\u663E\u793A\u540D\u79F0\u4E0D\u4FDD\u8BC1\u662F\u5F53\u524D\u6267\u884C\u94FE\u8DEF\u53EF\u7528\u7684 SQL \u5F15\u7528\u3002"}async function Xo(e,t){let n=[...new Set(t.map(r=>r.trim()))];return Promise.all(n.map(async r=>{try{let i=await e.get(`/api/data-source/${encodeURIComponent(r)}`);if(!i||typeof i!="object"||!("name"in i)||typeof i.name!="string")return{dsId:r};let s=i.name.trim();return s?{dsId:r,displayName:s}:{dsId:r}}catch{return{dsId:r}}}))}import{z}from"zod";var Er={keyword:z.string().default("").describe("\u641C\u7D22\u5173\u952E\u8BCD\uFF0C\u7559\u7A7A\u65F6\u8FD4\u56DE\u8D44\u6E90\u5217\u8868\u3002"),resourceType:z.enum(["ALL","CARD","DASHBOARD","DATA_SET","ETL"]).optional().default("ALL"),limit:z.number().int().min(1).max(100).optional().default(20),offset:z.number().int().min(0).optional().default(0),utimeStartTime:z.number().int().optional().describe("\u66F4\u65B0\u65F6\u95F4\u8D77\u70B9\uFF0C\u6BEB\u79D2\u65F6\u95F4\u6233\u3002"),utimeEndTime:z.number().int().optional().describe("\u66F4\u65B0\u65F6\u95F4\u7EC8\u70B9\uFF0C\u6BEB\u79D2\u65F6\u95F4\u6233\u3002"),cardType:z.string().optional().describe("\u5361\u7247\u7C7B\u578B\u8FC7\u6EE4\uFF0C\u4EC5 resourceType \u5305\u542B CARD \u65F6\u4F7F\u7528\u3002"),permissionType:z.string().optional(),orderBy:z.string().optional(),isDesc:z.boolean().optional()};async function Br(e,t){let{cardType:n,...r}=t,i={...r,specificResourceFilters:n?{cardType:n}:void 0},s=await e.post("/api/global-search",i);return H(s)}import{z as m}from"zod";var Lt=m.enum(["asc","desc"]),Zo=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"]),Rr=new Set(["BT","CLOSE_BT_OPEN","OPEN_BT_CLOSE","OPEN_BT_OPEN"]),Mt=new Set(["IS_NULL","NOT_NULL"]),Dr=m.object({field:m.string().min(1).describe("\u7B5B\u9009\u5B57\u6BB5\u540D\u79F0\u6216\u5B57\u6BB5 ID\u3002"),operator:Zo.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;Mt.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`}),Rr.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`}),!Rr.has(e.operator)&&!Mt.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`})}),ea=m.object({field:m.string().min(1).describe("\u6392\u5E8F\u5B57\u6BB5\u540D\u79F0\u6216\u5B57\u6BB5 ID\u3002"),direction:Lt.describe("\u6392\u5E8F\u65B9\u5411\u3002")}),ta=m.object({type:m.enum(["compare","xtd","last","recent","percentage","rank_top"]),compare:m.enum(["yoy","mom","qoq","wow","dod"]).optional(),compare_value:m.enum(["value","rate","rawdata"]).optional(),xtd:m.enum(["ytd","qtd","mtd","wtd","dtd"]).optional(),recent:m.string().regex(/^[1-9]\d*[dwmqy]$/).optional(),recent_base:m.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),percentage_dim:m.string().min(1).optional(),rank_top:m.number().int().positive().optional(),rank_order:Lt.optional(),rank_dim:m.string().min(1).optional()}),Mr={keyword:m.string().min(1).optional().describe("\u6307\u6807\u540D\u79F0\u5173\u952E\u8BCD\u3002"),project_id:m.string().min(1).optional().describe("\u6307\u6807\u4E3B\u9898 ID\uFF1B\u4E0D\u4F20\u5219\u8DE8\u53EF\u8BBF\u95EE\u4E3B\u9898\u641C\u7D22\u3002"),dir_id:m.string().min(1).optional().describe("\u76EE\u5F55 ID\u3002"),status:m.string().min(1).optional().describe("\u4E0A\u7EBF\u72B6\u6001\uFF0C\u4F20\u6307\u6807\u5E73\u53F0\u7684\u72B6\u6001\u4EE3\u7801\uFF1APUBLISHED\uFF08\u5DF2\u4E0A\u7EBF\uFF09\u3001UNPUBLISHED\uFF08\u672A\u4E0A\u7EBF\uFF09\u3002"),sub_types:m.array(m.string().min(1)).optional().describe("\u6307\u6807\u7C7B\u578B\u4EE3\u7801\u5217\u8868\uFF0C\u4F8B\u5982 ATOMIC\uFF08\u539F\u5B50\uFF09\u3001DERIVED\uFF08\u884D\u751F\uFF09\u3001COMPOSITE\uFF08\u590D\u5408\uFF09\u3002"),order_by:m.enum(["utimeDesc","utimeAsc"]).optional().describe("\u6392\u5E8F\u65B9\u5F0F\uFF1AutimeDesc \u6309\u66F4\u65B0\u65F6\u95F4\u5012\u5E8F\uFF0CutimeAsc \u6309\u66F4\u65B0\u65F6\u95F4\u6B63\u5E8F\u3002"),limit:m.number().int().positive().max(200).optional().default(20).describe("\u6700\u591A\u8FD4\u56DE\u6761\u6570\u3002")},jr={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")},Ur={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")},Nr={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(Dr).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(ea).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:ta.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")},Lr={keyword:m.string().min(1).optional().describe("\u6307\u6807\u6811\u540D\u79F0\u5173\u952E\u8BCD\u3002"),project_id:m.string().min(1).optional().describe("\u6839\u6307\u6807\u6240\u5C5E\u4E3B\u9898 ID\u3002"),parent_dir_id:m.string().min(1).optional().describe("\u6307\u6807\u6811\u76EE\u5F55 ID\u3002"),order_by:m.enum(["utimeDesc","utimeAsc"]).optional().default("utimeDesc").describe("\u6392\u5E8F\u65B9\u5F0F\uFF1AutimeDesc \u6309\u66F4\u65B0\u65F6\u95F4\u5012\u5E8F\uFF08\u9ED8\u8BA4\uFF09\uFF0CutimeAsc \u6309\u66F4\u65B0\u65F6\u95F4\u6B63\u5E8F\u3002"),limit:m.number().int().positive().max(200).optional().default(20).describe("\u6700\u591A\u8FD4\u56DE\u6761\u6570\u3002")},qr={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")},Hr={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(Dr).optional().describe("\u5F52\u56E0\u7B5B\u9009\u6761\u4EF6\u3002"),limit:m.number().int().positive().max(200).optional().default(20).describe("metric/dimension \u8FD4\u56DE\u884C\u6570\u3002"),group_limit:m.number().int().positive().max(50).optional().default(5).describe("scan \u6BCF\u4E2A\u7EF4\u5EA6\u8FD4\u56DE\u884C\u6570\u3002"),sort:Lt.optional().default("desc").describe("\u6309\u8D21\u732E\u503C\u6392\u5E8F\u65B9\u5411\u3002"),raw:m.boolean().optional().describe("\u662F\u5426\u8FD4\u56DE\u539F\u59CB\u54CD\u5E94\u3002")},K={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 Jr(e,t,n){let r=new J(e,t);try{let i=n.project_id?[n.project_id]:await na(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(...ra(u)),s.length>=n.limit)break}let o=Oa(s.map(jt),"metric_id").slice(0,n.limit);return R({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 ee(i,"search_metrics")}}async function Gr(e,t,n){let r=new J(e,t);try{try{let i=await r.listMetricFullTree({projectId:n.project_id,keyword:n.keyword});return R({summary:{source:"full-tree"},tree:sa(i),raw:n.raw?i:void 0})}catch(i){let s=n.project_id?[{id:n.project_id}]:await Kr(r),o=[];for(let a of s){let u=p(a.id);if(!u)continue;let c=await r.listMetricDirectoryTree(u);o.push({id:u,name:p(a.name)||u,type:"project",project_id:u,children:oa(c,u)})}return R({summary:{source:"directory-fallback",fallback_reason:i instanceof Error?i.message:String(i)},tree:o})}}catch(i){return ee(i,"list_metric_catalog")}}async function Fr(e,t,n){let r=new J(e,t);try{let i=await r.getMetricDetail(n.metric_id),s=aa(i),o,a;if(!n.brief){let u=p(i.uniformResourceType)||"METRIC_PLATFORM_METRIC";try{o=ua(await r.getMetricLineage(n.metric_id,u))}catch(c){a=c instanceof W?c.detail:String(c)}}return R({detail:{...s,lineage:o,lineage_error:a},raw:n.raw?i:void 0})}catch(i){return ee(i,"get_metric_detail")}}async function zr(e,t,n){let r=new J(e,t);try{let i=await r.getMetricDetail(n.metric_id);if(!n.advanced_calc){let a=Or(i,n);if("unsupported"in a)return U("query_metric_data",a.unsupported);let u=async l=>{let g=await r.getCardEditSession(a.cardId),h=p(g.sessionId);if(!h)throw new Error("\u6307\u6807\u5361\u7247\u9884\u89C8\u4F1A\u8BDD\u54CD\u5E94\u7F3A\u5C11 sessionId\u3002");return a.dimensions.length&&await ca(r,a.cardId,h,a.dimensions),{raw:await r.queryCardEditData(a.cardId,h,l),sessionId:h}};if(n.combine_type==="OR"&&(n.filters?.length??0)>1){let l=[],g=[];for(let h of n.filters??[]){let y=Or(i,{...n,combine_type:"AND",filters:[h]});if("unsupported"in y)return U("query_metric_data",y.unsupported);let{raw:C}=await u(y.body);g.push(C),l.push(...Ar(C))}return Ke(i,l,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 Ke(i,Ar(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=Sr(i,n);if("unsupported"in s)return U("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=Sr(i,{...n,combine_type:"AND",filters:[c]});if("unsupported"in d)return U("query_metric_data",d.unsupported);let l=await r.queryMetricData(d.input);u.push(l),a.push(...Be(l))}return Ke(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 Ke(i,Be(o),n,{mode:"metric_data_v2",request_body:s.input},n.raw?o:void 0)}catch(i){return Sa(i)?U("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}):ee(i,"query_metric_data")}}async function $r(e,t,n){let r=new J(e,t);try{let i=await r.searchMetricTrees({keyword:n.keyword,projectId:n.project_id,parentDirId:n.parent_dir_id,orderBy:n.order_by}),s=ia(i).map(ei).slice(0,n.limit);return R({summary:{keyword:n.keyword,count:s.length},items:s})}catch(i){return ee(i,"search_metric_trees")}}async function Vr(e,t,n){let r=new J(e,t);try{let i=await r.getMetricTreeDetail(n.metric_tree_id);return R({detail:_a(i),raw:n.raw?i:void 0})}catch(i){return ee(i,"get_metric_tree_detail")}}async function Qr(e,t,n){let r=new J(e,t);try{if(n.target==="dimension"&&!n.dimension&&!n.dimension_fd_id)return U("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=p(i.metricId);if(!s)return U("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=Re(o),u=qt(n.filters??[],a);if("unsupported"in u)return U("query_metric_tree_attribution",u.unsupported);let c=u.filters,d=ha(i,n);if("unsupported"in d)return U("query_metric_tree_attribution",d.unsupported);if(n.target==="metric"){let y=ya(i,d.value,c),C=await r.queryMetricTreeDecompose(n.metric_tree_id,y);return Dt(i,"metric",Ia(C),n,n.raw?C:void 0)}if(n.target==="dimension"){let y=pe(a,n.dimension,n.dimension_fd_id);if(!y)return U("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 C=Pr(i,y,d.value,c,n.limit,n.sort),P=await r.queryMetricTreeDrill(n.metric_tree_id,C);return Dt(i,"dimension",xr(P,p(y.name)),n,n.raw?P:void 0)}let l=ba(i,a,n.scan_dimensions,n.exclude_dimensions);if(!l.length)return U("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=[],h=[];for(let y of l){let C=Pr(i,y,d.value,c,n.group_limit,n.sort),P=await r.queryMetricTreeDrill(n.metric_tree_id,C);h.push({dimension:p(y.name),raw:P}),g.push(...xr(P,p(y.name)).slice(0,n.group_limit))}return Dt(i,"scan",g,n,n.raw?h:void 0,{scanned_dimensions:l.map(y=>p(y.name))})}catch(i){return ee(i,"query_metric_tree_attribution")}}async function na(e){return(await Kr(e)).map(t=>p(t.id)).filter(Boolean)}async function Kr(e){return A(await e.listProjects()).map(b).filter(Boolean)}function ra(e){let t=b(e);return A(t.contents??t.items??t.data)}function ia(e){let t=b(e);return A(t.data??t.contents??t.items)}function jt(e){return _({metric_id:p(e.id),name:p(e.name),project_id:p(e.projectId),dir_id:S(e.parentDirId,e.dirId),status:p(e.status),sub_type:p(e.subType),description:p(e.desc),dataset:ri(e.dsInfo),statistics:e.statisticsData,creator:Ye(e.creator),business_owner:Ye(e.businessOwner),updated_at:p(e.utime),raw:e})}function sa(e){return A(e).map(t=>Wr(t,void 0))}function Wr(e,t){let n=!!e.isMetric,r=p(e.id),i=!t&&!n?r:t;return _({id:r,name:p(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:p(e.parentId),children:A(e.children).map(s=>Wr(s,i))})}function oa(e,t){let n=b(e);return p(n.id)?[Ut(n,t)]:A(n.contents??n.children).map(r=>Ut(r,t))}function Ut(e,t){return _({id:p(e.id),name:p(e.name),type:"directory",project_id:t,dir_id:p(e.id),parent_id:S(e.parentDirId,e.parentId),can_use:v(e.canUse),can_manage:v(e.canManage),metric_count:vr(e.metricCnt),all_metric_count:vr(e.allMetricCnt),children:A(e.contents??e.children).map(n=>Ut(n,t))})}function aa(e){return _({metric_id:p(e.id),name:p(e.name),english_name:p(e.engName),status:p(e.status),sub_type:p(e.subType),description:p(e.desc),project_id:p(e.projectId),project_name:p(e.projectName),dir_id:S(e.parentDirId,e.dirId),dir_path:ii(e.dirPath),dataset:ri(e.dsInfo),source_fields:A(e.fdInfos).map(We),aggregation:S(e.aggrType,e.aggregationType),formula:S(e.formula,e.expression),derive_setting:e.deriveSetting,format:e.format,applicable_dimensions:Re(e),time_dimension:b(e.timeDim)?We(b(e.timeDim)):void 0,business_attributes:A(e.bizAttrs).map(Ra),business_owner:Ye(e.businessOwner),creator:Ye(e.creator),referenced_metrics:A(e.referencedMetrics).map(jt),base_metric:b(e.baseMetric)?jt(b(e.baseMetric)):void 0,linked_metric_id:p(e.linkMetricId),statistics:e.statisticsData,permissions:_({can_use:v(e.canUse),can_manage:v(e.canManage)}),created_at:p(e.ctime),updated_at:p(e.utime),has_draft:v(e.hasDraft)})}function ua(e){let t=b(e);return _({current:t.crtNode,upstream:t.backwardAtlas,downstream:t.forwardAtlas})}function Sr(e,t){let n=p(e.name),r=p(e.projectId);if(!n||!r)return{unsupported:{capability:"metric_detail_incomplete",message:"\u6307\u6807\u8BE6\u60C5\u7F3A\u5C11 name \u6216 projectId\u3002"}};let i=Re(e),s=[...i,...ti(e)],o=[];for(let d of t.dimensions??[]){let l=pe(i,d);if(!l)return{unsupported:{capability:"unsupported_dimension",parameter:d,supported_dimensions:i}};o.push(Ta(l))}let a=la(e,i,t.advanced_calc);if("unsupported"in a)return{unsupported:a.unsupported};let u=qt(t.filters??[],s);if("unsupported"in u)return{unsupported:u.unsupported};let c=Yr(t.sort??[],s);return"unsupported"in c?{unsupported:c.unsupported}:{input:{projectId:r,metricId:t.metric_id,metricName:n,metricItems:[_({name:n,alias:pa(n,t.advanced_calc),advCalc:a.value})],dimensions:o,filters:u.filters,sorting:c.sorting,limit:t.limit}}}function Or(e,t){let n=b(e.metricChartConfig),r=p(n.metricChartCdId),i=p(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=[...Re(e),...ti(e)],a=[];for(let g of t.dimensions??[]){let h=pe(o,g);if(!h||p(h.meta_type).toUpperCase()==="METRIC")return{unsupported:{capability:"unsupported_dimension",parameter:g,supported_dimensions:Re(e)}};a.push(Ca(h))}let u=qt(t.filters??[],o);if("unsupported"in u)return{unsupported:u.unsupported};let c=u.filters,d=Yr(t.sort??[],o);if("unsupported"in d)return{unsupported:d.unsupported};let l=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:l.length?l:void 0})}}async function ca(e,t,n,r){let i=si(await e.getCardEditMeta(t))??{},s=da(i);s.row=r,s.sorting=[],await e.modifyCardEditMeta(t,n,i)}function da(e){let t=b(e.content),n=b(t.meta),r=b(n.chartMain),i=b(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 la(e,t,n){if(!n)return{value:void 0};let r=b(e.timeDim),i=p(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=ma(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?pe(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:p(a?.fd_id)})}}}let o=n.rank_dim?pe(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:p(o?.fd_id),topN:{topType:"CUSTOM_NUMBER",count:n.rank_top??10,calculationType:"COUNT"}})}}}function pa(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 ma(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 qt(e,t){let n=[];for(let r of e){let i=Xr(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:fa(r)}))}return{filters:n}}function fa(e){return Mt.has(e.operator)?[]:e.values??[]}function Yr(e,t){let n=[];for(let r of e){let i=Xr(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 Xr(e,t,n,r){let i=pe(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:p(g.name),fd_id:p(g.fd_id),meta_type:p(g.meta_type)}))}};let a=p(i.name),u=p(i.fd_id),c=p(i.fd_type),d=p(i.meta_type).toUpperCase(),l=[a?void 0:"name",u?void 0:"fdId",c?void 0:"fdType",d?void 0:"metaType"].filter(g=>!!g);return l.length?{unsupported:{capability:s,parameter:t,message:`${o}\u5B57\u6BB5\u7F3A\u5C11\u5FC5\u8981 BI \u5143\u4FE1\u606F\uFF1A${t}`,missing_metadata:l}}:{field:{name:a,fdId:u,fdType:c,metaType:d}}}function Ke(e,t,n,r,i){let s=wa(t.slice(0,n.limit),n.columns);return R({summary:{metric_id:n.metric_id,metric_name:p(e.name),row_count:s.length,truncated:t.length>s.length},columns:ni(s),rows:s,diagnostic:r,raw:i})}function Be(e){let t=b(e),n=b(t.data)??t,r=A(n.values??n.rows??t.values??t.rows);if(r.length)return r;let i=A(n.columns??t.columns).map(o=>p(b(o)?.name??o)).filter(Boolean),s=A(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 Ar(e){let t=b(e),n=b(t.data)??t,r=b(n.chartMain??t.chartMain??b(b(t.content).data).chartMain);if(!Object.keys(r).length)return Be(e);let i=b(r.row),s=b(r.column),o=A(i.fields),a=Z(i.data),u=Z(r.data),c=ga(s),d=o.map(Nt).filter(Boolean),l=Ea([...d,...c]),g=Math.max(a.length,u.length),h=[];for(let y=0;y<g;y+=1){let C=[];C.push(...Z(a[y]).map(kr)),C.push(...Z(u[y]).map(kr)),C.length&&h.push(Object.fromEntries(C.map((P,D)=>[l[D]??`column_${D+1}`,P])))}return h}function ga(e){let n=Z(e.data).map((r,i)=>{let s=Z(r).map(Zr).filter(Boolean).join("/");return s||Nt(A(e.fields)[i])||`metric_${i+1}`}).filter(Boolean);return n.length?n:A(e.fields).map(Nt).filter(Boolean)}function Nt(e){return S(e.alias,e.title,e.originTitle,e.name,e.fdId,e.id)??""}function Zr(e){let t=b(e);return Object.keys(t).length?S(t.title,t.name,t.originTitle,t.alias,t.v,t.value)??"":p(e)}function kr(e){let t=b(e);return Object.keys(t).length?"v"in t?t.v:"value"in t?t.value:Zr(e):e}function ei(e){return _({metric_tree_id:p(e.metricTreeId),name:p(e.metricTreeName),root_metric_id:p(e.metricId),root_metric_name:p(e.metricName),project_id:p(e.projectId),project_name:p(e.projectName),parent_dir_id:p(e.parentDirId),dir_path:ii(e.dirPath),creator_id:p(e.creatorId),creator_name:p(e.creatorName),can_use:v(e.canUse),can_manage:v(e.canManage),updated_at:p(e.utime)})}function _a(e){let t=b(e.config)??{};return _({...ei(e),dom_id:p(e.domId),created_at:p(e.ctime),time_comparison:t.timeComparisonSetting,comparison_enabled:v(t.comparisonEnabled),contribution_calc_enabled:v(t.contributionCalcEnabled),dimension_decomposition:t.dimensionDecompositionContent,metric_decomposition:t.metricDecompositionContent,permissions:_({can_use:v(e.canUse),can_manage:v(e.canManage)})})}function ha(e,t){let n=b(e.config)??{},r=t.time_comparison_json??si(b(n.timeComparisonSetting)),i=v(n.comparisonEnabled)??!!r,s=v(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=b(r.advValue)??{};r.advValue=o,o.window={period:[t.period],withMacro:!1};let a=Ba(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 ya(e,t,n){let r=b(e.config)??{},i=b(r.metricDecompositionContent)??{};return _({timeComparisonSetting:t.setting,comparisonEnabled:t.comparisonEnabled,contributionCalcEnabled:!1,metricDecomposeInfo:{metricRelationTree:i.metricRelationTree,filters:n}})}function Pr(e,t,n,r,i,s){return _({timeComparisonSetting:n.setting,comparisonEnabled:n.comparisonEnabled,contributionCalcEnabled:n.contributionEnabled,drillInfo:{dimensionFdId:p(t.fd_id),drillFilters:r,nodeNum:i,orderBy:s==="asc"?"contributionAsc":"contributionDesc"}})}function Ia(e){return Be(e).map(t=>_({child_metric:p(b(t.metricInfo)?.name),child_metric_id:p(b(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 xr(e,t){return Be(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 Dt(e,t,n,r,i,s){let o=t==="scan"?n:n.slice(0,r.limit);return R({summary:{metric_tree_id:r.metric_tree_id,metric_tree_name:p(e.metricTreeName),root_metric_id:p(e.metricId),root_metric_name:p(e.metricName),target:t,row_count:o.length,...s},columns:ni(o),rows:o,raw:i})}function ba(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=>[p(c.name),c])),a=new Map(t.map(c=>[p(c.fd_id),c])),u=i.size?[...i].map(c=>o.get(c)).filter(c=>!!c):[];if(!u.length){let c=b(e.config)??{},d=b(c.dimensionDecompositionContent)??{};u=Z(d.decomposableDimensionIds).map(l=>a.get(String(l))).filter(l=>!!l)}return u.length||(u=t),u.filter(c=>!s.has(p(c.name)))}function Re(e){let t=new Set,n=[],r=i=>{if(!i)return;let s=p(i.fdId),o=p(i.name),a=s||o;if(!(!a||t.has(a))){t.add(a),n.push(We(i));for(let u of A(i.subs))r(u)}};for(let i of A(e.applicableDims))r(i);return r(b(e.timeDim)),n}function ti(e){let t=A(e.fdInfos).map(We);return p(e.name)&&!t.some(n=>p(n.name)===p(e.name))&&t.push(_({id:S(e.id,e.name),fd_id:p(e.id),name:p(e.name),fd_type:S(t[0]?.fd_type,"DOUBLE"),meta_type:"METRIC"})),t}function We(e){return _({id:S(e.id,e.fdId),fd_id:p(e.fdId),name:p(e.name),fd_type:p(e.fdType),meta_type:p(e.metaType),ds_id:p(e.dsId),granularity:p(e.granularity)})}function pe(e,t,n){let r=(n??t)?.trim();if(r)return e.find(i=>[i.fd_id,i.id,i.name].map(p).includes(r))}function Ta(e){return _({name:p(e.name),alias:p(e.name),fdType:S(e.fd_type),metaType:"DIM",key:S(e.fd_id,e.id,e.name),fdId:S(e.fd_id),dsId:S(e.ds_id),granularity:S(e.granularity)})}function Ca(e){return _({name:p(e.name),alias:S(e.name),fdType:S(e.fd_type),metaType:"DIM",key:S(e.fd_id,e.id,e.name),fdId:S(e.fd_id),dsId:S(e.ds_id),granularity:S(e.granularity)})}function wa(e,t){return t?.length?e.map(n=>Object.fromEntries(t.map(r=>[r,n[r]]))):e}function ni(e){return[...new Set(e.flatMap(t=>Object.keys(t)))]}function Ea(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 Ba(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 ri(e){let t=b(e);if(t)return _({dataset_id:p(t.dsId),name:p(t.name)})}function Ye(e){let t=b(e);if(t)return _({user_id:S(t.uId,t.id),name:p(t.name),deleted:v(t.isDel)})}function Ra(e){return _({id:p(e.id),name:p(e.name),type:p(e.valueType),values:A(e.values)})}function ii(e){return A(e).map(t=>p(t.dirName??t.name)).filter(Boolean)}function U(e,t){return R({status:"unsupported",diagnostic:{tool:e,...t}})}function ee(e,t){return e instanceof W?Q({operation:t,diagnostic:e.detail}):Q({operation:t,message:e instanceof Error?e.message:String(e)})}function Sa(e){return e instanceof W&&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 A(e){return Array.isArray(e)?e.map(b).filter(Boolean):[]}function Z(e){return Array.isArray(e)?e:[]}function b(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function p(e){return typeof e=="string"?e:e==null?"":String(e)}function S(...e){return e.map(p).find(t=>t.trim())?.trim()}function v(e){return typeof e=="boolean"?e:void 0}function vr(e){return typeof e=="number"&&Number.isFinite(e)?e:void 0}function Oa(e,t){let n=new Set;return e.filter(r=>{let i=p(r[t]);return!i||n.has(i)?!1:(n.add(i),!0)})}function si(e){return e?JSON.parse(JSON.stringify(e)):void 0}function oi(e,t,n,r,i={}){let s=i.usageTelemetry??new Le({config:n,appVersion:i.appVersion??"unknown"}),o=(u,c,d)=>{let l=e.registerTool,g=Bn(u,d,s),h=async(...y)=>{try{return await g(...y)}catch(C){return be(u,C)}};l.call(e,u,c,h)},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:Sn},(u,c)=>t.run(({client:d,config:l})=>On(d,l),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:nr,outputSchema:Xn},(u,c)=>t.run(({config:d})=>or(d,u),c,"chatbi_list_themes")),o("chatbi_query",{title:"ChatBI Query",description:"\u6267\u884C ChatBI L1 \u540C\u6B65\u95EE\u6570\uFF0C\u7528\u81EA\u7136\u8BED\u8A00\u76F4\u63A5\u63D0\u95EE\uFF0C\u6700\u7701\u4E8B\uFF0C\u9002\u5408\u4E1A\u52A1\u95EE\u9898\u8868\u8FF0\u660E\u786E\u3001\u65E0\u9700\u7CBE\u786E\u63A7\u5236\u7EF4\u5EA6\u6216 SQL \u7684\u573A\u666F\uFF1B\u9700\u8981\u7CBE\u786E\u6307\u5B9A\u7EF4\u5EA6/\u7B5B\u9009\u7528 query_metric_data\uFF0C\u9700\u8981\u81EA\u5B9A\u4E49 SQL \u7528 execute_sql_query\u3002\u652F\u6301\u4E3B\u9898 ID \u6216\u4E3B\u9898\u540D\u3002\u6210\u529F\u7ED3\u679C\u76F4\u63A5\u900F\u51FA answer\u3001sql\u3001query_result \u7B49\u7ED3\u6784\u5316\u5B57\u6BB5\uFF0C\u7531\u8C03\u7528\u65B9\u81EA\u884C\u7EC4\u7EC7\u6700\u7EC8\u56DE\u590D\u3002session_id \u53EA\u80FD\u7528\u4E8E\u95EE\u6570\u7EED\u95EE\uFF0C\u4E0D\u80FD\u4E0E ChatBI \u6D1E\u5BDF\u4F1A\u8BDD\u6DF7\u7528\u3002",inputSchema:rr,outputSchema:Zn},(u,c)=>t.run(({config:d})=>ar(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:ir,outputSchema:er},(u,c)=>t.run(({config:d})=>ur(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:sr,outputSchema:tr},(u,c)=>t.run(({config:d})=>cr(d,u),c,"chatbi_insight_poll"))),r.ok&&(a("global_search")&&o("global_search",{title:"Global Search",description:"\u6309\u5173\u952E\u8BCD\u641C\u7D22 BI \u4E2D\u7684\u5361\u7247\u3001\u4EEA\u8868\u677F\u3001\u6570\u636E\u96C6\u548C ETL \u8D44\u6E90\uFF0C\u9002\u5408\u5B9A\u4F4D\u67D0\u4E2A\u5DF2\u6709\u8D44\u4EA7\u6216\u5176 ID\u3002\u8FD4\u56DE\u7684\u5361\u7247 ID \u53EF\u4EA4\u7ED9 get_card_info/query_card_data\uFF0C\u6570\u636E\u96C6 ID \u53EF\u4EA4\u7ED9 get_dataset_detail/execute_sql_query\u3002\u6307\u6807\u76F8\u5173\u68C0\u7D22\u8BF7\u7528 search_metrics\u3002",inputSchema:Er},(u,c)=>t.run(({client:d})=>Br(d,u),c,"global_search")),a("search_metrics")&&o("search_metrics",{title:"Search Metrics",description:"\u6309\u5173\u952E\u8BCD\u641C\u7D22\u6307\u6807\u5E73\u53F0\u6307\u6807\uFF0C\u8FD4\u56DE metric_id\u3001\u540D\u79F0\u3001\u4E3B\u9898\u3001\u76EE\u5F55\u3001\u7C7B\u578B\u3001\u72B6\u6001\u548C\u4E1A\u52A1\u53E3\u5F84\u6458\u8981\u3002\u5DF2\u6709\u5173\u952E\u8BCD\u65F6\u4F18\u5148\u7528\u672C\u5DE5\u5177\uFF1B\u4E0D\u6E05\u695A\u6709\u54EA\u4E9B\u6307\u6807\u65F6\u6539\u7528 list_metric_catalog \u6D4F\u89C8\u3002\u8FD4\u56DE\u7684 metric_id \u53EF\u7EE7\u7EED\u4EA4\u7ED9 get_metric_detail \u770B\u53E3\u5F84\u3001query_metric_data \u53D6\u6570\u3002",inputSchema:Mr,outputSchema:K},(u,c)=>t.run(({client:d,config:l})=>Jr(d,l,u),c,"search_metrics")),a("list_metric_catalog")&&o("list_metric_catalog",{title:"List Metric Catalog",description:"\u6309\u4E3B\u9898/\u76EE\u5F55\u5C42\u7EA7\u6D4F\u89C8\u6307\u6807\u8282\u70B9\uFF0C\u9002\u5408\u4E0D\u77E5\u9053\u5173\u952E\u8BCD\u3001\u9700\u8981\u5148\u53D1\u73B0\u6709\u54EA\u4E9B\u53EF\u7528\u6307\u6807\u7684\u573A\u666F\u3002\u5DF2\u6709\u660E\u786E\u5173\u952E\u8BCD\u65F6\u6539\u7528 search_metrics\u3002\u8FD4\u56DE\u7684 metric_id \u53EF\u7EE7\u7EED\u4EA4\u7ED9 get_metric_detail\u3001query_metric_data\u3002",inputSchema:jr,outputSchema:K},(u,c)=>t.run(({client:d,config:l})=>Gr(d,l,u),c,"list_metric_catalog")),a("get_metric_detail")&&o("get_metric_detail",{title:"Get Metric Detail",description:"\u6309 metric_id \u83B7\u53D6\u6307\u6807\u7684\u4E1A\u52A1\u53E3\u5F84\u3001\u8BA1\u7B97\u53E3\u5F84\u3001\u9002\u7528\u7EF4\u5EA6\u3001\u65F6\u95F4\u7EF4\u3001\u8840\u7F18/\u5F15\u7528\u6458\u8981\u548C\u6743\u9650\u4FE1\u606F\u3002\u5EFA\u8BAE\u5728 query_metric_data \u53D6\u6570\u524D\u5148\u8C03\u7528\uFF0C\u786E\u8BA4\u53EF\u7528\u7EF4\u5EA6\u4E0E\u53E3\u5F84\u3002metric_id \u6765\u81EA search_metrics \u6216 list_metric_catalog\u3002",inputSchema:Ur,outputSchema:K},(u,c)=>t.run(({client:d,config:l})=>Fr(d,l,u),c,"get_metric_detail")),a("query_metric_data")&&o("query_metric_data",{title:"Query Metric Data",description:"\u6309\u5DF2\u77E5 metric_id \u7CBE\u786E\u67E5\u8BE2\u6307\u6807\u6570\u636E\uFF0C\u9002\u5408\u9700\u8981\u6307\u5B9A\u7EF4\u5EA6\u3001\u7B5B\u9009\u3001\u6392\u5E8F\u7684\u53D6\u6570\u573A\u666F\uFF1B\u7EF4\u5EA6\u5EFA\u8BAE\u5148\u7528 get_metric_detail \u786E\u8BA4\u3002\u53EA\u8BFB\u5B89\u5168\uFF1A\u8BFB\u53D6\u6307\u6807\u5361\u9884\u89C8\u6570\u636E\uFF0C\u7EF4\u5EA6\u67E5\u8BE2\u53EA\u6539\u4E34\u65F6 session\uFF0C\u4E0D\u89E6\u53D1 save\u3001update\u3001delete\u3001publish \u7B49\u6301\u4E45\u5316\u64CD\u4F5C\u3002\u9700\u8981\u81EA\u7136\u8BED\u8A00\u95EE\u6570\u7528 chatbi_query\uFF0C\u9700\u8981\u5199 SQL \u7528 execute_sql_query\u3002",inputSchema:Nr,outputSchema:K},(u,c)=>t.run(({client:d,config:l})=>zr(d,l,u),c,"query_metric_data")),a("search_metric_trees")&&o("search_metric_trees",{title:"Search Metric Trees",description:"\u6309\u5173\u952E\u8BCD\u641C\u7D22\u6307\u6807\u6811\u8D44\u6E90\uFF0C\u8FD4\u56DE metric_tree_id\u3002\u5F52\u56E0\u5206\u6790\u7684\u5165\u53E3\u5DE5\u5177\uFF1A\u62FF\u5230 metric_tree_id \u540E\u7528 get_metric_tree_detail \u770B\u7ED3\u6784\u3001query_metric_tree_attribution \u505A\u5F52\u56E0\u3002",inputSchema:Lr,outputSchema:K},(u,c)=>t.run(({client:d,config:l})=>$r(d,l,u),c,"search_metric_trees")),a("get_metric_tree_detail")&&o("get_metric_tree_detail",{title:"Get Metric Tree Detail",description:"\u6309 metric_tree_id \u83B7\u53D6\u6307\u6807\u6811\u8BE6\u60C5\u3001\u6839\u6307\u6807\u3001\u65F6\u95F4\u5BF9\u6BD4\u914D\u7F6E\u3001\u7EF4\u5EA6\u62C6\u89E3\u914D\u7F6E\u548C\u6307\u6807\u5173\u7CFB\u6811\u3002\u5EFA\u8BAE\u5728 query_metric_tree_attribution \u5F52\u56E0\u524D\u5148\u8C03\u7528\uFF0C\u786E\u8BA4\u53EF\u62C6\u89E3\u7EF4\u5EA6\u4E0E\u5BF9\u6BD4\u914D\u7F6E\u3002metric_tree_id \u6765\u81EA search_metric_trees\u3002",inputSchema:qr,outputSchema:K},(u,c)=>t.run(({client:d,config:l})=>Vr(d,l,u),c,"get_metric_tree_detail")),a("query_metric_tree_attribution")&&o("query_metric_tree_attribution",{title:"Query Metric Tree Attribution",description:"\u6309\u5DF2\u77E5 metric_tree_id \u6267\u884C\u6307\u6807\u62C6\u89E3\u3001\u5355\u7EF4\u62C6\u89E3\u6216\u5168\u7EF4\u626B\u63CF\u5F52\u56E0\uFF0C\u9002\u5408\u5206\u6790\u67D0\u6307\u6807\u53D8\u5316\u7531\u54EA\u4E9B\u56E0\u7D20/\u7EF4\u5EA6\u8D21\u732E\u3002\u5EFA\u8BAE\u5148\u7528 get_metric_tree_detail \u786E\u8BA4\u53EF\u62C6\u89E3\u7EF4\u5EA6\u3002",inputSchema:Hr,outputSchema:K},(u,c)=>t.run(({client:d,config:l})=>Qr(d,l,u),c,"query_metric_tree_attribution")),a("execute_sql_query")&&o("execute_sql_query",{title:"Execute SQL Query",description:`\u57FA\u4E8E\u4E00\u4E2A\u6216\u591A\u4E2A\u6570\u636E\u96C6\u6267\u884C\u67E5\u8BE2 SQL\u3002\u82E5\u672C\u8F6E\u5C1A\u672A\u8BFB\u53D6\u6570\u636E\u96C6\u8BE6\u60C5\uFF0C\u5148\u8C03\u7528 get_dataset_detail \u83B7\u53D6\u6570\u636E\u96C6\u540D\u79F0/name \u548C columns[].name\u3002inputs \u53EA\u4F20\u5BF9\u5E94\u6570\u636E\u96C6 ID\uFF0C\u4E0D\u5F97\u628A dsId\u3001fdId \u6216 input0 \u5F53\u8868\u540D\uFF1BSQL \u901A\u5E38\u5148\u7528\u6570\u636E\u96C6\u540D\u79F0\u4F5C\u4E3A FROM/JOIN \u8868\u5F15\u7528\u3002\u82E5 TABLE_OR_VIEW_NOT_FOUND \u7684 diagnostic.tableBindings[] \u63D0\u4F9B sqlReference\uFF0C\u5FC5\u987B\u6309\u8BE5\u503C\u4FEE\u6B63\uFF1B\u5355\u6570\u636E\u96C6 Spark \u67E5\u8BE2\u53EF\u80FD\u8FD4\u56DE\u7A33\u5B9A\u5F15\u7528 __THIS__\uFF0C\u4E0D\u8981\u539F\u6837\u91CD\u590D\u5931\u8D25 SQL\u3002\u4E2D\u6587\u6216\u7279\u6B8A\u5B57\u7B26\u540D\u79F0\u7528\u53CD\u5F15\u53F7\uFF0C\u4F8B\u5982 SELECT * FROM \`\u9500\u552E\u6570\u636E\u96C6\`\u3002\u65E0\u8868\u67E5\u8BE2\u4F20 inputs: []\u3002\u591A\u6570\u636E\u96C6\u67E5\u8BE2\u8981\u6C42\u6570\u636E\u96C6\u80FD\u5728\u540C\u4E00\u6267\u884C\u94FE\u8DEF\u4E2D\u67E5\u8BE2\u3002\u8FD4\u56DE\u884C\u6570\u7531 BI_MAX_ROWS \u63A7\u5236\uFF0C\u5F53\u524D\u4E3A ${n.BI_MAX_ROWS} \u884C\uFF0C\u65E0\u9700\u81EA\u884C\u6DFB\u52A0 LIMIT\u3002`,inputSchema:Tr},(u,c)=>t.run(({client:d,config:l})=>Cr(d,l,u),c,"execute_sql_query")),a("get_dataset_detail")&&o("get_dataset_detail",{title:"Get Dataset Detail",description:"\u6309\u6570\u636E\u96C6 ID \u83B7\u53D6\u57FA\u7840\u4FE1\u606F\u3001\u5B57\u6BB5\u7ED3\u6784\u548C\u76F8\u5173\u914D\u7F6E\u3002\u5EFA\u8BAE\u5728 execute_sql_query \u5199 SQL \u524D\u5148\u8C03\u7528\uFF0C\u786E\u8BA4\u6570\u636E\u96C6\u540D\u79F0\u4E0E\u53EF\u7528\u5B57\u6BB5\u3002\u6570\u636E\u96C6 ID \u6765\u81EA global_search\u3002",inputSchema:gr},(u,c)=>t.run(({client:d})=>yr(d,u),c,"get_dataset_detail")),a("get_card_info")&&o("get_card_info",{title:"Get Card Info",description:"\u6309\u5361\u7247 ID \u83B7\u53D6\u57FA\u7840\u4FE1\u606F\u3001\u56FE\u8868\u7C7B\u578B\u3001\u6570\u636E\u6765\u6E90\u548C\u914D\u7F6E\u3002\u5EFA\u8BAE\u5728 query_card_data \u53D6\u6570\u524D\u5148\u8C03\u7528\uFF0C\u786E\u8BA4\u5B57\u6BB5\u4E0E\u6570\u636E\u6765\u6E90\u3002\u5361\u7247 ID \u6765\u81EA global_search \u6216 get_page_info\u3002",inputSchema:_r},(u,c)=>t.run(({client:d})=>Ir(d,u),c,"get_card_info")),a("query_card_data")&&o("query_card_data",{title:"Query Card Data",description:"\u6309\u5DF2\u77E5\u5361\u7247 ID \u5B89\u5168\u53EA\u8BFB\u67E5\u8BE2\u4E00\u9875 BI \u5361\u7247\u9884\u89C8\u6570\u636E\uFF0C\u652F\u6301\u7ED3\u6784\u5316\u7B5B\u9009\u3001\u52A8\u6001\u53C2\u6570\u548C\u5F53\u524D\u5361\u7247\u81EA\u8EAB\u7684\u52A8\u6001\u7EF4\u5EA6\u8986\u76D6\u3002\u5355\u6B21\u6700\u591A 1000 \u884C\uFF1Bpage.has_more=true \u65F6\u4F7F\u7528 next_offset \u7EED\u9875\u3002",inputSchema:Nn,outputSchema:Ln},(u,c)=>t.run(({client:d,signal:l})=>Hn(d,u,l),c,"query_card_data")),a("get_page_info")&&o("get_page_info",{title:"Get Page Info",description:"\u6309\u9875\u9762/\u4EEA\u8868\u677F ID \u83B7\u53D6\u57FA\u7840\u4FE1\u606F\u3001\u5E03\u5C40\u3001\u5361\u7247\u5217\u8868\u548C\u76F8\u5173\u914D\u7F6E\uFF0C\u53EF\u4ECE\u4E2D\u62FF\u5230\u5361\u7247 ID \u518D\u4EA4\u7ED9 get_card_info/query_card_data\u3002\u9875\u9762 ID \u6765\u81EA global_search\u3002",inputSchema:hr},(u,c)=>t.run(({client:d})=>br(d,u),c,"get_page_info")))}var ja=Aa(import.meta.url),$t=ja("../package.json"),Jt=class{record(t){console.error(JSON.stringify({runtime:Ga(t)}))}};function ui(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 Ft(e,r):new Gt(e,r)}var Ua=`\u89C2\u8FDC BI\uFF08Guandata\uFF09MCP Server\uFF0C\u7528\u4E8E\u5728\u89C2\u8FDC BI \u5E73\u53F0\u4E0A\u505A\u6570\u636E\u53D1\u73B0\u3001\u770B\u8D44\u4EA7\u8BE6\u60C5\u3001\u5B89\u5168\u53EA\u8BFB\u53D6\u6570\u548C\u6307\u6807\u5206\u6790\u3002\u6240\u6709\u5DE5\u5177\u5747\u4E3A\u53EA\u8BFB\uFF0C\u4E0D\u4F1A\u4FEE\u6539\u3001\u4FDD\u5B58\u6216\u5220\u9664 BI \u8D44\u4EA7\u3002
11
11
 
12
12
  \u5DE5\u5177\u6309\u6240\u5C5E\u6A21\u5757\u5206\u4E3A\u4E09\u7EC4\uFF0C\u5176\u4E2D\u300C\u6307\u6807\u300D\u548C\u300CChatBI\u300D\u662F BI \u7684\u72EC\u7ACB\u589E\u8D2D\u6A21\u5757\uFF0C\u53EF\u80FD\u672A\u5F00\u901A\uFF1B\u300CBI \u9ED8\u8BA4\u529F\u80FD\u300D\u968F BI \u6807\u914D\u63D0\u4F9B\uFF1A
13
13
 
14
14
  1. BI \u9ED8\u8BA4\u529F\u80FD\uFF08\u5361\u7247\u3001\u4EEA\u8868\u677F\u3001\u6570\u636E\u96C6\u3001ETL \u7B49\u6838\u5FC3\u8D44\u4EA7\uFF09
15
15
  - \u53D1\u73B0\uFF1Aglobal_search \u6309\u5173\u952E\u8BCD\u641C\u5361\u7247/\u4EEA\u8868\u677F/\u6570\u636E\u96C6/ETL\u3002
16
16
  - \u770B\u8BE6\u60C5\uFF1Aget_card_info\u3001get_page_info\u3001get_dataset_detail\u3002
17
- - \u53D6\u6570\uFF1Aquery_card_data \u8BFB\u5361\u7247\u9884\u89C8\u6570\u636E\uFF1Bexecute_sql_query \u57FA\u4E8E\u4E00\u4E2A\u6216\u591A\u4E2A\u6570\u636E\u96C6\u5199 SQL \u67E5\u8BE2\uFF08\u591A\u8868\u8054\u67E5\u8981\u6C42\u6570\u636E\u96C6\u5747\u4E3A\u62BD\u53D6\uFF0C\u6216\u5747\u4E3A\u6765\u81EA\u540C\u4E00\u6570\u636E\u8D26\u6237\u548C\u6570\u636E\u5E93\u7684\u76F4\u8FDE\uFF09\u3002
17
+ - \u53D6\u6570\uFF1Aquery_card_data \u5206\u9875\u8BFB\u53D6\u5361\u7247\u9884\u89C8\u6570\u636E\uFF1Bexecute_sql_query \u57FA\u4E8E\u4E00\u4E2A\u6216\u591A\u4E2A\u6570\u636E\u96C6\u5199 SQL \u67E5\u8BE2\uFF08\u591A\u8868\u8054\u67E5\u8981\u6C42\u6570\u636E\u96C6\u5747\u4E3A\u62BD\u53D6\uFF0C\u6216\u5747\u4E3A\u6765\u81EA\u540C\u4E00\u6570\u636E\u8D26\u6237\u548C\u6570\u636E\u5E93\u7684\u76F4\u8FDE\uFF09\u3002
18
18
 
19
19
  2. \u6307\u6807\u6A21\u5757\uFF08\u72EC\u7ACB\u589E\u8D2D\uFF0C\u6307\u6807\u5E73\u53F0 / \u6307\u6807\u6811\uFF0C\u9700\u5F00\u901A\u540E\u53EF\u7528\uFF09
20
20
  - \u53D1\u73B0\uFF1A\u5DF2\u6709\u5173\u952E\u8BCD\u7528 search_metrics\uFF08\u6307\u6807\uFF09\u3001search_metric_trees\uFF08\u6307\u6807\u6811\uFF09\uFF1B\u4E0D\u77E5\u9053\u5173\u952E\u8BCD\u7528 list_metric_catalog \u6D4F\u89C8\u6307\u6807\u76EE\u5F55\u3002
@@ -26,5 +26,5 @@ ${c}`:u}catch{return}}var gt=new Map([["k",1e3],["K",1e3],["M",1e6],["B",1e9],["
26
26
  - chatbi_query\uFF1AL1 \u540C\u6B65\u95EE\u6570\uFF0C\u81EA\u7136\u8BED\u8A00\u63D0\u95EE\u6700\u7701\u4E8B\uFF0C\u9002\u5408\u4E1A\u52A1\u95EE\u9898\u8868\u8FF0\u660E\u786E\u3001\u65E0\u9700\u7CBE\u786E\u63A7\u5236\u7EF4\u5EA6/SQL \u65F6\u3002
27
27
  - chatbi_insight_start + chatbi_insight_poll\uFF1AL2 \u6DF1\u5EA6\u6D1E\u5BDF\uFF0C\u8017\u65F6\u8F83\u957F\uFF0C\u5148\u53D1\u8D77\u518D\u8F6E\u8BE2\u3002
28
28
 
29
- \u901A\u7528\u5DE5\u4F5C\u6D41\uFF1A\u5148\u53D1\u73B0\u8D44\u4EA7 \u2192 \u518D\u770B\u8BE6\u60C5\u62FF\u53E3\u5F84\u4E0E\u5404\u7C7B id \u2192 \u6700\u540E\u6309\u573A\u666F\u53D6\u6570\u3002\u73AF\u5883\u80FD\u529B\uFF08\u542B\u5404\u589E\u8D2D\u6A21\u5757\u662F\u5426\u5F00\u901A\uFF09\u53EF\u5148\u7528 get_bi_capabilities \u67E5\u8BE2\uFF1B\u90E8\u5206\u5DE5\u5177\u4F1A\u968F BI \u7248\u672C\u4E0E\u6A21\u5757\u5F00\u901A\u72B6\u6001\u52A8\u6001\u542F\u7528\u3002`;async function Ur(e,t={}){let n=t.appVersion??At.version,r=t.callerContextResolver??Wt(e),i=t.guanBIClientFactory??new Se(e,{clientFactory:t.clientFactory,requestMetadata:{client:e.MCP_TRANSPORT==="streamable-http"?e.BI_PAT_CLIENT??"mcp":"mcp",clientVersion:n}}),s=i.create(await r.resolve()),o=await(t.capabilityResolver??ue)(s.client,s.config),a=new Jo({name:"guanbi-mcp-server",version:n},{instructions:zo});return Mr(a,new Oe(r,i,new _e),s.config,o,{appVersion:n}),a}var St=class{constructor(t,n){this.config=t;this.options=n}config;options;mode="stdio";health(){return{status:"ok",mode:this.mode,version:this.options.appVersion??At.version,boundBISite:{configured:!!this.config.BI_BASE_URL,baseUrl:this.config.BI_BASE_URL,publicPath:this.config.BI_PUBLIC_PATH}}}async start(){await(await Ur(this.config,this.options)).connect(this.options.transportFactory?.()??new $o)}},Rt=class{constructor(t,n){this.config=t;this.options=n}config;options;mode="streamable-http";httpServer;sessions=new Map;logger=new wt;health(){return{status:"ok",mode:this.mode,version:this.options.appVersion??At.version,boundBISite:{configured:!!this.config.BI_BASE_URL,baseUrl:this.config.BI_BASE_URL,publicPath:this.config.BI_PUBLIC_PATH}}}async start(){this.httpServer=Go((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)}),Y(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:ta(this.config),entrypointTokenConfigured:!!this.config.MCP_ENTRYPOINT_TOKEN,trustedGateway:Ot(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://${Xo(t,this.config.MCP_HTTP_HOST??"127.0.0.1")}:${t.port}`}async handleRequest(t,n){let r=Dr(t);if(!r){Y(n,400,{error:"bad_request"});return}if(ea(r)&&t.method==="GET"){if(r==="/sysmon/health/readiness"){let a=this.readiness();Y(n,a.ready?200:503,a);return}Y(n,200,this.health());return}if(r!=="/mcp"){Y(n,404,{error:"not_found"});return}if(!Qo(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:Ot(this.config.MCP_TRUSTED_GATEWAY)}),Y(n,401,{error:"mcp_entrypoint_unauthorized"});return}let i=Ne(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,...Bt(i),sessionCount:this.sessions.size}),Y(n,404,{error:"mcp_session_not_found"});return}let s=await this.resolveSession(t);Yo(n),await s.transport.handleRequest(t,n);let o=s.transport.sessionId;o&&t.method!=="DELETE"&&!this.sessions.has(o)&&(this.sessions.set(o,s),this.log("info","mcp_session_created","Created Streamable HTTP MCP session.",t,{...Bt(o),sessionCount:this.sessions.size}))}async resolveSession(t){let n=Ne(t.headers["mcp-session-id"]);if(n){let o=this.sessions.get(n);if(o)return o}let r=new Vo({sessionIdGenerator:Ho,onsessionclosed:async o=>{let a=this.sessions.get(o);this.sessions.delete(o),await a?.server.close(),this.log("info","mcp_session_closed","Closed Streamable HTTP MCP session.",void 0,{...Bt(o),sessionCount:this.sessions.size})}}),i=Wo(this.config,t.headers),s=await Ur(i,{...this.options,callerContextResolver:this.options.callerContextResolver??Yt(i),capabilityResolver:this.options.capabilityResolver??(async()=>$t(i))});return await s.connect(r),{server:s,transport:r}}readiness(){let t=Ko(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?Dr(i):void 0;this.logger.record({level:t,event:n,mode:this.mode,message:r,method:i?.method,path:o,...s})}};function Qo(e,t){if(Ot(t.MCP_TRUSTED_GATEWAY)||ce(e))return!0;let n=t.MCP_ENTRYPOINT_TOKEN;return n?Ne(e.authorization)?.trim()===`Bearer ${n}`:!1}function Ne(e){return Array.isArray(e)?e[0]:e}function Ot(e){return["1","true","yes","on"].includes(e?.trim().toLowerCase()??"")}function Ko(e){let t=[];return e.BI_BASE_URL||t.push("BI_BASE_URL is required"),t}function Wo(e,t){let n=ce(t),r=Ne(t[ne.client.toLowerCase()])?.trim();return{...e,BI_PAT:n,...n&&r?{BI_PAT_CLIENT:r}:{}}}function Y(e,t,n){e.headersSent||(e.writeHead(t,{"Content-Type":"application/json"}),e.end(JSON.stringify(n)))}function Yo(e){let t=e.writeHead.bind(e);e.writeHead=((n,r,i)=>(n===202&&e.setHeader("Content-Length","0"),typeof r=="string"?t(n,r,i):t(n,r)))}function Xo(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 Zo(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}function Dr(e){try{return new URL(e.url??"/",`http://${e.headers.host??"localhost"}`).pathname}catch{return}}function ea(e){return["/healthz","/sysmon/health/liveness","/sysmon/health/readiness"].includes(e)}function ta(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 Bt(e){return{hasSessionId:!0,sessionIdHash:qo("sha256").update(e).digest("hex").slice(0,12)}}var ra=na(import.meta.url),{version:ia}=ra("../package.json");async function sa(){if(process.argv.slice(2).some(t=>t==="--version"||t==="-v")){process.stdout.write(`${ia}
30
- `);return}let e=Mt();await jr(e).start()}sa().catch(e=>{console.error(e instanceof Error?e.message:e),process.exit(1)});
29
+ \u901A\u7528\u5DE5\u4F5C\u6D41\uFF1A\u5148\u53D1\u73B0\u8D44\u4EA7 \u2192 \u518D\u770B\u8BE6\u60C5\u62FF\u53E3\u5F84\u4E0E\u5404\u7C7B id \u2192 \u6700\u540E\u6309\u573A\u666F\u53D6\u6570\u3002\u73AF\u5883\u80FD\u529B\uFF08\u542B\u5404\u589E\u8D2D\u6A21\u5757\u662F\u5426\u5F00\u901A\uFF09\u53EF\u5148\u7528 get_bi_capabilities \u67E5\u8BE2\uFF1B\u90E8\u5206\u5DE5\u5177\u4F1A\u968F BI \u7248\u672C\u4E0E\u6A21\u5757\u5F00\u901A\u72B6\u6001\u52A8\u6001\u542F\u7528\u3002`;async function ci(e,t={}){let n=t.appVersion??$t.version,r=t.callerContextResolver??pn(e),i=t.guanBIClientFactory??new Ne(e,{clientFactory:t.clientFactory,requestMetadata:{client:e.MCP_TRANSPORT==="streamable-http"?e.BI_PAT_CLIENT??"mcp":"mcp",clientVersion:n}}),s=i.create(await r.resolve()),o=await(t.capabilityResolver??he)(s.client,s.config),a=new va({name:"guanbi-mcp-server",version:n},{instructions:Ua});return oi(a,new qe(r,i,new Oe,e.BI_REQUEST_TIMEOUT_MS),s.config,o,{appVersion:n}),a}var Gt=class{constructor(t,n){this.config=t;this.options=n}config;options;mode="stdio";health(){return{status:"ok",mode:this.mode,version:this.options.appVersion??$t.version,boundBISite:{configured:!!this.config.BI_BASE_URL,baseUrl:this.config.BI_BASE_URL,publicPath:this.config.BI_PUBLIC_PATH}}}async start(){await(await ci(this.config,this.options)).connect(this.options.transportFactory?.()??new Da)}},Ft=class{constructor(t,n){this.config=t;this.options=n}config;options;mode="streamable-http";httpServer;sessions=new Map;logger=new Jt;health(){return{status:"ok",mode:this.mode,version:this.options.appVersion??$t.version,boundBISite:{configured:!!this.config.BI_BASE_URL,baseUrl:this.config.BI_BASE_URL,publicPath:this.config.BI_PUBLIC_PATH}}}async start(){this.httpServer=xa((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)}),te(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:za(this.config),entrypointTokenConfigured:!!this.config.MCP_ENTRYPOINT_TOKEN,trustedGateway:zt(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://${Ja(t,this.config.MCP_HTTP_HOST??"127.0.0.1")}:${t.port}`}async handleRequest(t,n){let r=ai(t);if(!r){te(n,400,{error:"bad_request"});return}if(Fa(r)&&t.method==="GET"){if(r==="/sysmon/health/readiness"){let a=this.readiness();te(n,a.ready?200:503,a);return}te(n,200,this.health());return}if(r!=="/mcp"){te(n,404,{error:"not_found"});return}if(!Na(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:zt(this.config.MCP_TRUSTED_GATEWAY)}),te(n,401,{error:"mcp_entrypoint_unauthorized"});return}let i=Xe(t.headers["mcp-session-id"]);if(i&&!this.sessions.has(i)){this.log("warn","mcp_session_not_found","Rejected MCP request for an unknown session.",t,{statusCode:404,...Ht(i),sessionCount:this.sessions.size}),te(n,404,{error:"mcp_session_not_found"});return}let s=await this.resolveSession(t);Ha(n),await s.transport.handleRequest(t,n);let o=s.transport.sessionId;o&&t.method!=="DELETE"&&!this.sessions.has(o)&&(this.sessions.set(o,s),this.log("info","mcp_session_created","Created Streamable HTTP MCP session.",t,{...Ht(o),sessionCount:this.sessions.size}))}async resolveSession(t){let n=Xe(t.headers["mcp-session-id"]);if(n){let o=this.sessions.get(n);if(o)return o}let r=new Ma({sessionIdGenerator:Pa,onsessionclosed:async o=>{let a=this.sessions.get(o);this.sessions.delete(o),await a?.server.close(),this.log("info","mcp_session_closed","Closed Streamable HTTP MCP session.",void 0,{...Ht(o),sessionCount:this.sessions.size})}}),i=qa(this.config,t.headers),s=await ci(i,{...this.options,callerContextResolver:this.options.callerContextResolver??mn(i),capabilityResolver:this.options.capabilityResolver??(async()=>on(i))});return await s.connect(r),{server:s,transport:r}}readiness(){let t=La(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?ai(i):void 0;this.logger.record({level:t,event:n,mode:this.mode,message:r,method:i?.method,path:o,...s})}};function Na(e,t){if(zt(t.MCP_TRUSTED_GATEWAY)||ye(e))return!0;let n=t.MCP_ENTRYPOINT_TOKEN;return n?Xe(e.authorization)?.trim()===`Bearer ${n}`:!1}function Xe(e){return Array.isArray(e)?e[0]:e}function zt(e){return["1","true","yes","on"].includes(e?.trim().toLowerCase()??"")}function La(e){let t=[];return e.BI_BASE_URL||t.push("BI_BASE_URL is required"),t}function qa(e,t){let n=ye(t),r=Xe(t[ue.client.toLowerCase()])?.trim();return{...e,BI_PAT:n,...n&&r?{BI_PAT_CLIENT:r}:{}}}function te(e,t,n){e.headersSent||(e.writeHead(t,{"Content-Type":"application/json"}),e.end(JSON.stringify(n)))}function Ha(e){let t=e.writeHead.bind(e);e.writeHead=((n,r,i)=>(n===202&&e.setHeader("Content-Length","0"),typeof r=="string"?t(n,r,i):t(n,r)))}function Ja(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 Ga(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}function ai(e){try{return new URL(e.url??"/",`http://${e.headers.host??"localhost"}`).pathname}catch{return}}function Fa(e){return["/healthz","/sysmon/health/liveness","/sysmon/health/readiness"].includes(e)}function za(e){let t={configured:!!e.BI_BASE_URL,publicPath:e.BI_PUBLIC_PATH};if(!e.BI_BASE_URL)return t;try{t.origin=new URL(e.BI_BASE_URL).origin}catch{t.configured=!0}return t}function Ht(e){return{hasSessionId:!0,sessionIdHash:ka("sha256").update(e).digest("hex").slice(0,12)}}var Va=$a(import.meta.url),{version:Qa}=Va("../package.json");async function Ka(){if(process.argv.slice(2).some(t=>t==="--version"||t==="-v")){process.stdout.write(`${Qa}
30
+ `);return}let e=Kt();await ui(e).start()}Ka().catch(e=>{console.error(e instanceof Error?e.message:e),process.exit(1)});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@guandata/guanbi-mcp-server",
3
- "version": "0.1.32",
3
+ "version": "0.1.35",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "MCP server for exposing GuanBI capabilities to AI agents.",
@@ -43,7 +43,7 @@
43
43
  "start": "node dist/index.js"
44
44
  },
45
45
  "dependencies": {
46
- "@modelcontextprotocol/sdk": "^1.29.0",
46
+ "@modelcontextprotocol/sdk": "^1.30.0",
47
47
  "dotenv": "^17.4.2",
48
48
  "zod": "^4.4.3"
49
49
  },
@@ -53,7 +53,8 @@
53
53
  "tsup": "^8.5.1",
54
54
  "tsx": "^4.21.0",
55
55
  "typescript": "^6.0.3",
56
- "vitest": "^4.1.6"
56
+ "vite": "^8.0.16",
57
+ "vitest": "^4.1.11"
57
58
  },
58
59
  "engines": {
59
60
  "node": ">=20.0.0"