timarai-dashboard-mcp 1.0.3

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-range.js","sourceRoot":"","sources":["../src/date-range.ts"],"names":[],"mappings":"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"}
package/dist/format.js ADDED
@@ -0,0 +1,369 @@
1
+ /**
2
+ * 输出渲染。
3
+ *
4
+ * 为什么默认用 Markdown 而不是裸 JSON:
5
+ * 驾驶舱一次查询可能返回 90 天 × 多字段的数据,原样塞回上下文会挤占大量 token。
6
+ * Markdown 表格在保持可读性的同时体量更小;需要完整结构时再显式要求 `format=json`。
7
+ */
8
+ const MAX_CELL = 60;
9
+ // 序列里的日期字段可能是字符串 / Unix 秒 / Unix 毫秒,归一化逻辑收在 date-range.ts。
10
+ import { statDateLabel } from "./date-range.js";
11
+ /**
12
+ * meta.appliedFilters / ignoredFilters 的维度标识 → 中文维度名。
13
+ *
14
+ * 接口侧先后给过两种写法,这里**两种都认**:
15
+ * - 早期:单字母码 `D` / `B` / `M` / `C` / `Y` / `A`
16
+ * (注意 **C=渠道、Y=币种**,与字面直觉相反,最容易读错)
17
+ * - 现在:可读名 `date` / `businessType` / `merchant` / `channel` / `currency` /
18
+ * `accountType`,另可能带 `realtimeOverlay`
19
+ */
20
+ export const FILTER_CODE_LABELS = {
21
+ // 单字母码(旧)
22
+ D: "日期范围",
23
+ B: "业务类型",
24
+ M: "商户",
25
+ C: "渠道",
26
+ Y: "币种",
27
+ A: "账户类型",
28
+ // 可读名(现)
29
+ date: "日期范围",
30
+ businessType: "业务类型",
31
+ merchant: "商户",
32
+ channel: "渠道",
33
+ currency: "币种",
34
+ accountType: "账户类型",
35
+ realtimeOverlay: "实时覆盖",
36
+ };
37
+ /** 只取中文维度名(用于告警文案)。 */
38
+ function filterLabel(code) {
39
+ return FILTER_CODE_LABELS[code] ?? code;
40
+ }
41
+ function decodeFilterCodes(codes) {
42
+ return codes.map((c) => {
43
+ const raw = String(c);
44
+ const label = FILTER_CODE_LABELS[raw];
45
+ // 可读名已经自解释,不再拼成 channel=渠道 这种冗余形式
46
+ return label ? (raw.length === 1 ? `${raw}=${label}` : label) : raw;
47
+ }).join("、");
48
+ }
49
+ function isPlainObject(value) {
50
+ return typeof value === "object" && value !== null && !Array.isArray(value);
51
+ }
52
+ function formatScalar(value) {
53
+ if (value === null || value === undefined)
54
+ return "-";
55
+ if (typeof value === "number") {
56
+ return Number.isInteger(value) ? String(value) : String(Number(value.toFixed(4)));
57
+ }
58
+ if (typeof value === "boolean")
59
+ return value ? "是" : "否";
60
+ if (typeof value === "string") {
61
+ // ISO 日期时间 → 只保留日期部分
62
+ if (/^\d{4}-\d{2}-\d{2}T/.test(value))
63
+ return value.slice(0, 10);
64
+ return value;
65
+ }
66
+ return String(value);
67
+ }
68
+ function cell(value) {
69
+ const text = formatScalar(value).replace(/\|/g, "\\|").replace(/\n/g, " ");
70
+ return text.length > MAX_CELL ? `${text.slice(0, MAX_CELL - 1)}…` : text;
71
+ }
72
+ /** 字段名看着像日期/时间(如 statDate、lastRefreshTime)时,值可能是 Unix 时间戳。 */
73
+ const DATE_LIKE_KEY = /(^|_)(date|time|at)$|date$|time$/i;
74
+ /**
75
+ * 表格单元格的时间戳要还原成人能读的日期。
76
+ * 否则 Agent 拿到的是 `1789171200000` 这种数字——它不是错的,但没法读、更没法核对。
77
+ */
78
+ function readableCell(header, value) {
79
+ if (typeof value === "number" && Number.isFinite(value) && DATE_LIKE_KEY.test(header)) {
80
+ const label = statDateLabel(value);
81
+ if (label)
82
+ return cell(label);
83
+ }
84
+ return cell(value);
85
+ }
86
+ function renderTable(rows) {
87
+ const headers = Array.from(new Set(rows.flatMap((r) => Object.keys(r))));
88
+ if (headers.length === 0)
89
+ return "_(空集合)_";
90
+ const head = `| ${headers.join(" | ")} |`;
91
+ const sep = `| ${headers.map(() => "---").join(" | ")} |`;
92
+ const body = rows
93
+ .map((row) => `| ${headers.map((h) => readableCell(h, row[h])).join(" | ")} |`)
94
+ .join("\n");
95
+ return [head, sep, body].join("\n");
96
+ }
97
+ /** 等距抽样,始终保留首尾点,保证趋势不失真。 */
98
+ function downsample(rows, maxRows) {
99
+ if (rows.length <= maxRows || maxRows <= 1)
100
+ return rows;
101
+ const step = (rows.length - 1) / (maxRows - 1);
102
+ const picked = [];
103
+ for (let i = 0; i < maxRows; i += 1) {
104
+ const row = rows[Math.round(i * step)];
105
+ if (row !== undefined)
106
+ picked.push(row);
107
+ }
108
+ return picked;
109
+ }
110
+ /**
111
+ * 时间类字段的三种历史写法:ISO 字符串、毫秒时间戳、以及无数据时的 null。
112
+ * 只处理字符串会让时间戳那一版显示成「-」,看起来像字段丢了。
113
+ */
114
+ function stampLabel(value) {
115
+ if (value === null || value === undefined || value === 0 || value === "")
116
+ return "无数据";
117
+ if (typeof value === "number" && Number.isFinite(value)) {
118
+ const ms = value < 1e11 ? value * 1000 : value;
119
+ const iso = new Date(ms).toISOString();
120
+ return Number.isNaN(new Date(ms).getTime()) ? String(value) : `${iso.slice(0, 10)} ${iso.slice(11, 19)} UTC`;
121
+ }
122
+ return String(value).replace("T", " ").slice(0, 19);
123
+ }
124
+ /**
125
+ * 计数 / 比率类指标:跨币种「相加」在数学上是对的(两币种笔数相加=总笔数),
126
+ * 或根本不涉及金额。给它们套「不可相加」的警告属于误报。
127
+ */
128
+ const NON_MONEY_METRICS = new Set([
129
+ "TransactionCount",
130
+ "ActiveMerchantCount",
131
+ "NewMerchantCount",
132
+ "SuccessRate",
133
+ ]);
134
+ /**
135
+ * 曾经不带 `currency` 字段的金额类路由(2026-09-21 第七轮实测:不返回字段 + 仍是硬加总)。
136
+ *
137
+ * **第九轮(同日)这些路由已全部带上 `currency` 并按币种拆行**,
138
+ * 因此这里**不再无条件报警**——保留名单只是为了让「万一哪天 currency 又被去掉」时,
139
+ * 还能识别出来这是一种已知的静默错值,而不是当作普通数据。
140
+ * 是否真的报警由 `rankingCurrencyHint` 依据响应**当场判断**(见下)。
141
+ */
142
+ const MONEY_RANKING_PATHS = new Set([
143
+ "ceo/top-merchants",
144
+ "finance/top-merchant-balances",
145
+ "finance/top-reconciliation-merchants",
146
+ "operation/channel-analysis",
147
+ "operation/fail-reason-breakdown",
148
+ "finance/reconciliation-analysis",
149
+ ]);
150
+ function detectMixedCurrency(data) {
151
+ const hit = (v) => Array.isArray(v) && v.some((it) => isPlainObject(it) && it.currency === "MIXED");
152
+ const isCount = typeof data.metricType === "string" && NON_MONEY_METRICS.has(data.metricType);
153
+ if (hit(data.points) || hit(data.items))
154
+ return isCount ? "count" : "summed";
155
+ if (data.currency === "MIXED") {
156
+ const abc = data.amountsByCurrency;
157
+ return Array.isArray(abc) && abc.length > 0 ? "split" : "summed";
158
+ }
159
+ return null;
160
+ }
161
+ /** 行里的「主体」字段:同一主体在不同币种下各占一行时,用它判断是否重复出现。 */
162
+ const SUBJECT_KEYS = [
163
+ "merchantName",
164
+ "merchantId",
165
+ "channel",
166
+ "reasonCode",
167
+ "reason",
168
+ "label",
169
+ "dimension",
170
+ "accountType",
171
+ "businessType",
172
+ "name",
173
+ ];
174
+ /**
175
+ * 金额类路由在没有 `currency` 字段时的兜底提示。
176
+ *
177
+ * 曾经只要命中路由名单就报警;第九轮这些路由都补了 `currency`,
178
+ * 无条件报警会变成**对着正确数据报假警**——比漏报更消耗信任。
179
+ * 所以改成三个条件同时成立才提示:
180
+ * 1. 是已知曾经不带 currency 的金额类路由;
181
+ * 2. 本次指标不是计数/比率类(笔数排行跨币种相加本来就没问题);
182
+ * 3. **响应里确实没有 currency 字段**(这条最关键,由数据说了算)。
183
+ */
184
+ function rankingCurrencyHint(endpointPath, data) {
185
+ if (!endpointPath || !MONEY_RANKING_PATHS.has(endpointPath))
186
+ return null;
187
+ if (typeof data.metricType === "string" && NON_MONEY_METRICS.has(data.metricType))
188
+ return null;
189
+ const rows = Array.isArray(data.items) ? data.items.filter(isPlainObject) : [];
190
+ if (rows.length === 0)
191
+ return null;
192
+ if (rows.some((row) => "currency" in row))
193
+ return null; // 已带币种,数据安全,不报警
194
+ return [
195
+ "> ⚠️ 本路由**未返回 `currency` 字段**,无法从响应判断是否跨币种:",
196
+ "> 未指定 `currencies` 时,金额是接口侧把各币种**按原值相加**的合计",
197
+ "> (USD 与 USDT 会被当作同一单位累加)。要单一币种口径请用 `currencies` 重查。",
198
+ ].join("\n");
199
+ }
200
+ /**
201
+ * 响应已按币种拆行时,同一主体会出现多行——不说明就会被当成重复数据或接口 bug。
202
+ * 实测 `ceo/top-merchants` 不筛选返回 6 行 = 3 个商户 × 2 个币种,
203
+ * 且 `rank` 在币种内重新编号(USD 1,2,3 / USDT 1,2,3)。
204
+ */
205
+ function currencySplitNote(data) {
206
+ const rows = Array.isArray(data.items) ? data.items.filter(isPlainObject) : [];
207
+ if (rows.length === 0)
208
+ return null;
209
+ const currencies = new Set(rows.map((row) => row.currency).filter((c) => typeof c === "string" && c !== "MIXED"));
210
+ if (currencies.size < 2)
211
+ return null;
212
+ const key = SUBJECT_KEYS.find((k) => rows.some((row) => row[k] !== undefined));
213
+ let duplicated = false;
214
+ if (key) {
215
+ const seen = new Map();
216
+ for (const row of rows) {
217
+ const subject = String(row[key]);
218
+ const set = seen.get(subject) ?? new Set();
219
+ if (typeof row.currency === "string")
220
+ set.add(row.currency);
221
+ seen.set(subject, set);
222
+ }
223
+ duplicated = Array.from(seen.values()).some((s) => s.size > 1);
224
+ }
225
+ const lines = [
226
+ "> ℹ️ 本响应**已按币种拆行**(出现币种:" + Array.from(currencies).join(" / ") + ")。",
227
+ ];
228
+ if (duplicated && key) {
229
+ lines.push("> 同一「" + key + "」会在不同币种下**各占一行**,不是重复数据;" +
230
+ "跨币种不可直接相加,`rank` 也是币种内编号。");
231
+ }
232
+ else {
233
+ lines.push("> 各行金额属于各自币种,跨币种不可直接相加。");
234
+ }
235
+ lines.push("> 要单一币种合计请用 `currencies` 重查。");
236
+ return lines.join("\n");
237
+ }
238
+ function renderValue(value, opts, key, depth = 0) {
239
+ if (Array.isArray(value)) {
240
+ if (value.length === 0)
241
+ return `**${key}**:_(空集合)_`;
242
+ const original = value.length;
243
+ const rows = downsample(value, opts.maxRows).filter(isPlainObject);
244
+ if (rows.length === 0) {
245
+ const scalars = downsample(value, opts.maxRows).map((v) => formatScalar(v));
246
+ return `**${key}**(${original} 项):${scalars.join("、")}`;
247
+ }
248
+ const note = original > rows.length
249
+ ? `\n\n> 已按等距抽样从 ${original} 项压缩到 ${rows.length} 项,如需完整明细请用 format=json。`
250
+ : "";
251
+ return `**${key}**(${original} 项)\n\n${renderTable(rows)}${note}`;
252
+ }
253
+ if (isPlainObject(value)) {
254
+ if (depth >= 2)
255
+ return `**${key}**:${cell(JSON.stringify(value))}`;
256
+ const inner = Object.entries(value)
257
+ .map(([k, v]) => renderValue(v, opts, k, depth + 1))
258
+ .join("\n\n");
259
+ return `### ${key}\n\n${inner}`;
260
+ }
261
+ return `**${key}**:${cell(value)}`;
262
+ }
263
+ export function renderPayload(data, opts) {
264
+ if (opts.format === "json") {
265
+ return { text: JSON.stringify(data, null, 2), truncatedFrom: null };
266
+ }
267
+ if (!isPlainObject(data)) {
268
+ return { text: formatScalar(data), truncatedFrom: null };
269
+ }
270
+ const meta = data.meta;
271
+ const sections = [];
272
+ if (isPlainObject(meta)) {
273
+ const parts = [
274
+ `数据截止:${stampLabel(meta.dataAsOf)}`,
275
+ `最近刷新:${stampLabel(meta.lastRefreshTime)}`,
276
+ `时区:${formatScalar(meta.reportTimeZone)}`,
277
+ `数据版本:${formatScalar(meta.dataVersion)}`,
278
+ `已封板:${formatScalar(meta.isFinal)}`,
279
+ // 基准是 lastRefreshTime,不是 dataAsOf;措辞要能区分「刷新没跑」和「数据本身旧」。
280
+ `刷新滞后:${formatScalar(meta.isStale)}`,
281
+ ];
282
+ const applied = Array.isArray(meta.appliedFilters) ? meta.appliedFilters : [];
283
+ const ignored = Array.isArray(meta.ignoredFilters) ? meta.ignoredFilters : [];
284
+ if (applied.length > 0)
285
+ parts.push(`生效筛选:${decodeFilterCodes(applied)}`);
286
+ if (ignored.length > 0)
287
+ parts.push(`忽略筛选:${decodeFilterCodes(ignored)}`);
288
+ sections.push(`> ${parts.join(" | ")}`);
289
+ if (ignored.length > 0) {
290
+ sections.push(`> ⚠️ 本舱不支持 ${ignored.map((c) => `「${filterLabel(String(c))}」`).join("、")}` +
291
+ `筛选,即使传了也会被忽略——回答时不要声称已按该维度过滤。`);
292
+ }
293
+ // 覆盖度:区间里没有统计产出的日期现在不再补 0,接口会明确列出缺哪几天。
294
+ // 不提示就会被当成「那几天真的是零」。
295
+ const missing = Array.isArray(meta.missingDates) ? meta.missingDates : [];
296
+ const covered = Array.isArray(meta.coveredDates) ? meta.coveredDates : [];
297
+ if (missing.length > 0) {
298
+ const shown = missing.slice(0, 8).map((d) => String(d).slice(0, 10)).join("、");
299
+ const more = missing.length > 8 ? ` 等 ${missing.length} 天` : "";
300
+ sections.push(`> ⚠️ 区间内有 ${missing.length} 天无统计产出(${shown}${more}),已**不再返回 0 填充**;` +
301
+ `有数据的是 ${covered.length} 天。不要把缺失当成「那天是零」。`);
302
+ }
303
+ else if (covered.length === 0 && missing.length === 0 && meta.dataAsOf === null) {
304
+ sections.push(`> ⚠️ 该区间内**完全没有统计产出**,返回为空,不是「全为零」。`);
305
+ }
306
+ }
307
+ const mixed = detectMixedCurrency(data);
308
+ if (mixed === "split") {
309
+ sections.push("> ⚠️ 金额未收敛到单一币种(\`currency=MIXED\`)。此时**金额标量(gmv / revenue / grossProfit / aum)为 null**," +
310
+ "接口不再给跨币种加总值——请读 \`amountsByCurrency\` 里的分币种明细。\n" +
311
+ "> 同一份数据里不同币种**不可相加、占比也不可跨币种比较**;要单一口径用 \`currencies\` 重查。");
312
+ }
313
+ else if (mixed === "summed") {
314
+ sections.push("> ⚠️ 金额未收敛到单一币种(\`currency=MIXED\`)。" +
315
+ "**这个数值是接口侧把各币种按原值直接相加的结果**——它既不是任何单一币种的口径," +
316
+ "也不是一个有意义的合计(USD 与 BRL 会被当成同一单位累加),占比同样不可靠。\n" +
317
+ "> 只有 \`currency\` 是具体币种码(如 \`USDT\`)时金额才能相加或算占比;" +
318
+ "要合计请用 \`currencies\` 指定单一币种后重查。");
319
+ }
320
+ const rankingHint = rankingCurrencyHint(opts.endpointPath, data);
321
+ if (rankingHint)
322
+ sections.push(rankingHint);
323
+ const splitNote = currencySplitNote(data);
324
+ if (splitNote)
325
+ sections.push(splitNote);
326
+ for (const [key, value] of Object.entries(data)) {
327
+ if (key === "meta")
328
+ continue;
329
+ sections.push(renderValue(value, opts, key));
330
+ }
331
+ const points = Array.isArray(data.points) ? data.points.length : null;
332
+ return {
333
+ text: sections.join("\n\n"),
334
+ truncatedFrom: points !== null && points > opts.maxRows ? points : null,
335
+ };
336
+ }
337
+ /**
338
+ * 把 ApiError 转成 Agent 可直接据以行动的文案。
339
+ *
340
+ * HTTP 状态要显式说出来,因为两类失败要求 Agent 做**完全相反**的事:
341
+ * 4xx = 本次入参有问题,重试同样的参数必然再失败,应先改参数;
342
+ * 5xx = 平台侧异常,换时间重试是合理的(客户端已做指数退避)。
343
+ * 不区分的话,Agent 会对着一个 400 反复重试,或对 500 直接放弃。
344
+ */
345
+ export function renderError(error) {
346
+ if (error instanceof Error && error.name === "ApiError") {
347
+ const detail = error.detail;
348
+ const http = detail?.httpStatus ?? null;
349
+ const action = http === null
350
+ ? null
351
+ : http >= 500
352
+ ? "平台侧异常,可稍后重试(客户端已按指数退避自动重试若干次)。"
353
+ : http >= 400
354
+ ? "本次入参有问题:重试同样的参数必然再失败,请先修正参数再调用。"
355
+ : null;
356
+ return [
357
+ `❌ ${error.message}`,
358
+ "",
359
+ http !== null ? `HTTP 状态:${http}` : null,
360
+ action,
361
+ detail?.hint ? `排查建议:${detail.hint}` : null,
362
+ detail?.requestId ? `requestId:${detail.requestId}(可用于对账平台侧日志)` : null,
363
+ ]
364
+ .filter(Boolean)
365
+ .join("\n");
366
+ }
367
+ return `❌ ${error instanceof Error ? error.message : String(error)}`;
368
+ }
369
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,63 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * 进程入口(本文件也是 npm bin 的可执行入口,首行 shebang 不可删)。
4
+ *
5
+ * 支持两种传输:
6
+ * - stdio(默认):本地 Agent(WorkBuddy / Claude Desktop / Cursor)逐进程拉起。
7
+ * - http:Streamable HTTP,适合一个服务被多个使用者复用。
8
+ */
9
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
10
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
11
+ import { createRequire } from "node:module";
12
+ import { applyCliOverrides, ConfigError, firstRunGuidance, loadConfig } from "./config.js";
13
+ import { DashboardClient } from "./client.js";
14
+ import { createServer } from "./server.js";
15
+ async function main() {
16
+ // 少数客户端不传 env,允许改用 --url= / --key= 之类的参数配;写了就以命令行参数为准。
17
+ applyCliOverrides();
18
+ const cfg = loadConfig();
19
+ const client = new DashboardClient(cfg);
20
+ const server = createServer(cfg, client);
21
+ if (cfg.MCP_TRANSPORT === "http") {
22
+ const http = await import("node:http");
23
+ // enableJsonResponse:单响应模式,避免为简单查询维持 SSE 长连接。
24
+ const transport = new StreamableHTTPServerTransport({
25
+ sessionIdGenerator: undefined,
26
+ enableJsonResponse: true,
27
+ });
28
+ await server.connect(transport);
29
+ const httpServer = http.createServer((req, res) => {
30
+ if ((req.url ?? "").replace(/\?.*$/, "") !== "/mcp") {
31
+ res.writeHead(404, { "Content-Type": "application/json" });
32
+ res.end(JSON.stringify({ error: "not_found", expected: "/mcp" }));
33
+ return;
34
+ }
35
+ transport.handleRequest(req, res).catch((error) => {
36
+ process.stderr.write(`[TimarAI-Dashboard-MCP] handleRequest 失败:${String(error)}\n`);
37
+ if (!res.headersSent)
38
+ res.writeHead(500, { "Content-Type": "application/json" });
39
+ res.end(JSON.stringify({ error: "internal_error" }));
40
+ });
41
+ });
42
+ httpServer.listen(cfg.MCP_HTTP_PORT, "127.0.0.1", () => {
43
+ process.stderr.write(`[TimarAI-Dashboard-MCP] Streamable HTTP listening on http://127.0.0.1:${cfg.MCP_HTTP_PORT}/mcp\n`);
44
+ });
45
+ return;
46
+ }
47
+ const transport = new StdioServerTransport();
48
+ await server.connect(transport);
49
+ process.stderr.write("[TimarAI-Dashboard-MCP] stdio transport ready\n");
50
+ }
51
+ const require_ = createRequire(import.meta.url);
52
+ const pkg = require_("../package.json");
53
+ main().catch((error) => {
54
+ if (error instanceof ConfigError) {
55
+ // 缺配置项时先给「人能照着做」的引导,再附上机器可读的缺失明细。
56
+ // 宿主把 stderr 显示在界面上,所以引导写在最前面。
57
+ process.stderr.write(`\n[${pkg.name}] ${firstRunGuidance(error.issues)}\n\n${error.message}\n`);
58
+ process.exit(2);
59
+ }
60
+ process.stderr.write(`[${pkg.name}] 启动失败:${error instanceof Error ? (error.stack ?? error.message) : String(error)}\n`);
61
+ process.exit(1);
62
+ });
63
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/output.js ADDED
@@ -0,0 +1,46 @@
1
+ /**
2
+ * 图表与报表的落盘。
3
+ *
4
+ * MCP 工具不能只「返回文本」——图表和报告必须落成文件,用户才能打开、转发、打印。
5
+ * 默认是运行目录下的 `out/`,可用 `TIMARAI_OUTPUT_DIR` 覆盖(相对路径按**进程工作目录**解析)。
6
+ */
7
+ import { mkdirSync, statSync, writeFileSync } from "node:fs";
8
+ import { dirname, isAbsolute, join, resolve } from "node:path";
9
+ import { fileURLToPath } from "node:url";
10
+ export const REPO_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "..");
11
+ /**
12
+ * 相对路径一律按 **进程工作目录** 解析,而不是包的安装目录。
13
+ *
14
+ * 原因:以 npm 全局安装 / npx 拉起时,进程 cwd 在使用者的工作区,
15
+ * 若按安装目录解析,产物会写进 `node_modules/timarai-dashboard-mcp/out/`,
16
+ * 用户根本找不到、也不该往那里写。想要固定位置就填**绝对路径**。
17
+ */
18
+ export function resolveOutputDir(outputDir) {
19
+ return isAbsolute(outputDir) ? outputDir : resolve(process.cwd(), outputDir);
20
+ }
21
+ export function writeArtifact(dir, fileName, content) {
22
+ mkdirSync(dir, { recursive: true });
23
+ const path = join(dir, fileName);
24
+ writeFileSync(path, content, "utf8");
25
+ return { path, fileName, bytes: statSync(path).size };
26
+ }
27
+ /** 生成不含冲突的文件名:同名时追加 -2、-3。 */
28
+ export function uniqueName(existing, base, ext) {
29
+ let name = `${base}.${ext}`;
30
+ let n = 2;
31
+ while (existing.has(name)) {
32
+ name = `${base}-${n}.${ext}`;
33
+ n += 1;
34
+ }
35
+ existing.add(name);
36
+ return name;
37
+ }
38
+ export function slug(input, fallback = "artifact") {
39
+ const cleaned = input
40
+ .trim()
41
+ .replace(/[\\/:*?"<>|\s]+/g, "-")
42
+ .replace(/-+/g, "-")
43
+ .replace(/^-|-$/g, "");
44
+ return cleaned || fallback;
45
+ }
46
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,CAAC,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAShF;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAiB;IAChD,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,QAAgB,EAAE,OAAe;IAC1E,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACjC,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACrC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;AACxD,CAAC;AAED,8BAA8B;AAC9B,MAAM,UAAU,UAAU,CAAC,QAAqB,EAAE,IAAY,EAAE,GAAW;IACzE,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC;IAC5B,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,IAAI,GAAG,GAAG,IAAI,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;QAC7B,CAAC,IAAI,CAAC,CAAC;IACT,CAAC;IACD,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACnB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,KAAa,EAAE,QAAQ,GAAG,UAAU;IACvD,MAAM,OAAO,GAAG,KAAK;SAClB,IAAI,EAAE;SACN,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC;SAChC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACzB,OAAO,OAAO,IAAI,QAAQ,CAAC;AAC7B,CAAC"}