@dsh-ft/dsh-fft-ftshare 0.3.0 → 0.4.1

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/lib/tools.d.ts CHANGED
@@ -1,14 +1,14 @@
1
1
  /**
2
2
  * preset 平面:把接口表里带 `expose` 的条目注册成 `ctx.tools` 里的 `ftshare_*` 工具,
3
- * 外加一个长尾入口 `ftshare_call`。
3
+ * 外加一个长尾入口 `ftshare_call` 与一个失败现场入口 `ftshare_status`。
4
4
  *
5
5
  * 由 preset 行以子路径名 `@dsh-ft/dsh-fft-ftshare/tools` 挂载,因此这些工具只存在于
6
6
  * 所选 preset 的 agent 作用域内(标准模式下不存在)。取数走全局平面提供的
7
- * `ctx.ftshareData`,本平面不开连接、不碰凭据。
7
+ * `ctx.ftshareData`,本平面不开连接、不碰凭据;`ftshare_status` 只读进程内账本,
8
+ * 不联网。
8
9
  *
9
10
  * 每个工具都把 {@link FtshareCallResult} 的四态结局原样印进正文:`denied` 说
10
- * 「当前套餐无权访问」,`empty` 才说「没有记录」。这是 P8 的教训——两种结局不能
11
- * 长得一样。
11
+ * 「无权访问」,`empty` 才说「没有记录」。这是 P8 的教训——两种结局不能长得一样。
12
12
  * @module @dsh-ft/dsh-fft-ftshare/tools
13
13
  */
14
14
  import type { Context } from '@deepseek-ai/cordis';
@@ -23,9 +23,16 @@ export declare const inject: string[];
23
23
  export declare const FTSHARE_EXPOSED_CAPABILITIES: readonly Capability[];
24
24
  /** 长尾接口的通用直调工具名。 */
25
25
  export declare const FTSHARE_CALL_TOOL = "ftshare_call";
26
+ /** 失败现场查询工具名。 */
27
+ export declare const FTSHARE_STATUS_TOOL = "ftshare_status";
26
28
  /**
27
- * 注册接口表里每一个暴露条目,外加一个通用直调。
29
+ * 注册接口表里每一个暴露条目,外加通用直调与失败现场查询。
28
30
  * @param ctx - preset 子树的上下文。
29
31
  */
30
32
  export declare function apply(ctx: Context): void;
33
+ /**
34
+ * 渲染失败账本。
35
+ * @returns 模型可见文本。
36
+ */
37
+ export declare function renderStatus(): string;
31
38
  //# sourceMappingURL=tools.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAU,MAAM,qBAAqB,CAAA;AAI1D,OAAO,EAAwB,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAMzE,cAAc,mBAAmB,CAAA;AACjC,cAAc,cAAc,CAAA;AAE5B,kBAAkB;AAClB,eAAO,MAAM,IAAI,kCAAkC,CAAA;AAEnD,iDAAiD;AACjD,eAAO,MAAM,MAAM,UAA2B,CAAA;AAwB9C,oCAAoC;AACpC,eAAO,MAAM,4BAA4B,EAAE,SAAS,UAAU,EACI,CAAA;AAElE,oBAAoB;AACpB,eAAO,MAAM,iBAAiB,iBAAiB,CAAA;AAE/C;;;GAGG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAIxC"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAIlD,OAAO,EAAwB,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAOzE,cAAc,mBAAmB,CAAA;AACjC,cAAc,cAAc,CAAA;AAE5B,kBAAkB;AAClB,eAAO,MAAM,IAAI,kCAAkC,CAAA;AAEnD,iDAAiD;AACjD,eAAO,MAAM,MAAM,UAA2B,CAAA;AAwB9C,oCAAoC;AACpC,eAAO,MAAM,4BAA4B,EAAE,SAAS,UAAU,EACI,CAAA;AAElE,oBAAoB;AACpB,eAAO,MAAM,iBAAiB,iBAAiB,CAAA;AAE/C,iBAAiB;AACjB,eAAO,MAAM,mBAAmB,mBAAmB,CAAA;AAEnD;;;GAGG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAIxC;AAuFD;;;GAGG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAwBrC"}
package/lib/tools.js CHANGED
@@ -1,14 +1,14 @@
1
1
  /**
2
2
  * preset 平面:把接口表里带 `expose` 的条目注册成 `ctx.tools` 里的 `ftshare_*` 工具,
3
- * 外加一个长尾入口 `ftshare_call`。
3
+ * 外加一个长尾入口 `ftshare_call` 与一个失败现场入口 `ftshare_status`。
4
4
  *
5
5
  * 由 preset 行以子路径名 `@dsh-ft/dsh-fft-ftshare/tools` 挂载,因此这些工具只存在于
6
6
  * 所选 preset 的 agent 作用域内(标准模式下不存在)。取数走全局平面提供的
7
- * `ctx.ftshareData`,本平面不开连接、不碰凭据。
7
+ * `ctx.ftshareData`,本平面不开连接、不碰凭据;`ftshare_status` 只读进程内账本,
8
+ * 不联网。
8
9
  *
9
10
  * 每个工具都把 {@link FtshareCallResult} 的四态结局原样印进正文:`denied` 说
10
- * 「当前套餐无权访问」,`empty` 才说「没有记录」。这是 P8 的教训——两种结局不能
11
- * 长得一样。
11
+ * 「无权访问」,`empty` 才说「没有记录」。这是 P8 的教训——两种结局不能长得一样。
12
12
  * @module @dsh-ft/dsh-fft-ftshare/tools
13
13
  */
14
14
  import { defineTool } from '@deepseek-ai/dsh-tools';
@@ -17,6 +17,7 @@ import { catalogEntryOf, missingRequiredArgs } from './catalog.js';
17
17
  import { FTSHARE_CATALOG_INDEX_PATH, loadCatalog } from './catalog-host.js';
18
18
  import { isRecord } from './errors.js';
19
19
  import { renderCallResult } from './project.js';
20
+ import { statusStore } from './status.js';
20
21
  export * from './capabilities.js';
21
22
  export * from './catalog.js';
22
23
  /** Cordis 插件名。 */
@@ -47,23 +48,24 @@ const toolOutput = {
47
48
  export const FTSHARE_EXPOSED_CAPABILITIES = FTSHARE_CAPABILITIES.filter(entry => entry.expose !== undefined);
48
49
  /** 长尾接口的通用直调工具名。 */
49
50
  export const FTSHARE_CALL_TOOL = 'ftshare_call';
51
+ /** 失败现场查询工具名。 */
52
+ export const FTSHARE_STATUS_TOOL = 'ftshare_status';
50
53
  /**
51
- * 注册接口表里每一个暴露条目,外加一个通用直调。
54
+ * 注册接口表里每一个暴露条目,外加通用直调与失败现场查询。
52
55
  * @param ctx - preset 子树的上下文。
53
56
  */
54
57
  export function apply(ctx) {
55
- const logger = ctx.logger('dsh-fft-ftshare-tools');
56
58
  for (const entry of FTSHARE_EXPOSED_CAPABILITIES)
57
- register(ctx, logger, entry);
58
- registerCatalogTool(ctx, logger);
59
+ register(ctx, entry);
60
+ registerCatalogTool(ctx);
61
+ registerStatusTool(ctx);
59
62
  }
60
63
  /**
61
64
  * 注册单个接口表条目。
62
65
  * @param ctx - preset 子树的上下文。
63
- * @param logger - 具名 logger。
64
66
  * @param entry - 带 `expose` 的接口表条目。
65
67
  */
66
- function register(ctx, logger, entry) {
68
+ function register(ctx, entry) {
67
69
  const exposed = entry.expose;
68
70
  if (exposed === undefined)
69
71
  return;
@@ -74,9 +76,6 @@ function register(ctx, logger, entry) {
74
76
  output: toolOutput,
75
77
  async execute(args, exec) {
76
78
  const result = await ctx.ftshareData.call(entry.interface, (args ?? {}), { signal: exec.signal });
77
- if (result.state === 'denied' || result.state === 'failed') {
78
- logger.warn('ftshare.tool_result', { tool: entry.interface, state: result.state, code: result.notice?.code });
79
- }
80
79
  return { tool: entry.interface, state: result.state, text: renderCallResult(entry.title, entry.interface, result) };
81
80
  },
82
81
  }));
@@ -86,11 +85,10 @@ function register(ctx, logger, entry) {
86
85
  *
87
86
  * 它是长尾接口的唯一入口——一个工具定义换掉 250 份 schema。三种结局各有各的话:
88
87
  * 名字不在目录(给出索引文件路径,让模型去 `grep`,而不是猜第二个名字)、套餐无权
89
- * (由 {@link renderCallResult} 带上升级入口)、配额用尽(由 errors 层附文案)。
88
+ * (由 {@link renderCallResult} 带上升级入口)、上游原文(由 notice 直传)。
90
89
  * @param ctx - preset 子树的上下文。
91
- * @param logger - 具名 logger。
92
90
  */
93
- function registerCatalogTool(ctx, logger) {
91
+ function registerCatalogTool(ctx) {
94
92
  ctx.tools.register(defineTool({
95
93
  name: FTSHARE_CALL_TOOL,
96
94
  description: `直调 FTShare 目录里的任意接口。不要猜接口名:先在 ${FTSHARE_CATALOG_INDEX_PATH} 里 grep `
@@ -122,11 +120,59 @@ function registerCatalogTool(ctx, logger) {
122
120
  };
123
121
  }
124
122
  const result = await ctx.ftshareData.call(entry.name, callArgs, { signal: exec.signal });
125
- if (result.state === 'denied' || result.state === 'failed') {
126
- logger.warn('ftshare.tool_result', { tool: entry.name, state: result.state, code: result.notice?.code });
127
- }
128
123
  return { tool: entry.name, state: result.state, text: renderCallResult(entry.title, entry.name, result) };
129
124
  },
130
125
  }));
131
126
  }
127
+ /**
128
+ * 注册失败现场查询:只读进程内账本,不联网。
129
+ *
130
+ * 用户问「为什么取不到」时,模型需要的是「同一个失败打了几次、首末时间、原文」,
131
+ * 而不是再打一次上游。
132
+ * @param ctx - preset 子树的上下文。
133
+ */
134
+ function registerStatusTool(ctx) {
135
+ ctx.tools.register(defineTool({
136
+ name: FTSHARE_STATUS_TOOL,
137
+ description: '查看 FTShare 最近的失败聚合(指纹、次数、首末时间、上游原文)与目录漂移;不联网、不消耗配额。',
138
+ parameters: {},
139
+ output: toolOutput,
140
+ async execute() {
141
+ return { tool: FTSHARE_STATUS_TOOL, state: 'available', text: renderStatus() };
142
+ },
143
+ }));
144
+ }
145
+ /**
146
+ * 渲染失败账本。
147
+ * @returns 模型可见文本。
148
+ */
149
+ export function renderStatus() {
150
+ const snapshot = statusStore.snapshot();
151
+ const lines = [`FTShare 失败聚合(进程内,自 ${snapshot.since} 起共 ${snapshot.totalFailures} 次)`];
152
+ if (snapshot.failures.length === 0) {
153
+ lines.push('暂无失败记录。');
154
+ }
155
+ else {
156
+ const shown = snapshot.failures.slice(0, 10);
157
+ for (const [index, record] of shown.entries()) {
158
+ const facts = [`×${record.count}`, record.state, record.tool];
159
+ if (record.code !== undefined)
160
+ facts.push(`码 ${record.code}`);
161
+ if (record.status !== undefined)
162
+ facts.push(`HTTP ${record.status}`);
163
+ lines.push(`${index + 1}. ${facts.join(' · ')}`);
164
+ lines.push(` 首次 ${record.firstAt} · 末次 ${record.lastAt} · 最近耗时 ${record.lastDurationMs} ms`);
165
+ lines.push(` 指纹 ${record.fingerprint}`);
166
+ lines.push(` 原文 ${record.message}`);
167
+ }
168
+ if (snapshot.failures.length > shown.length)
169
+ lines.push(`(共 ${snapshot.failures.length} 个指纹,只列前 ${shown.length} 个)`);
170
+ }
171
+ const catalog = snapshot.catalog;
172
+ const live = catalog.liveCount === undefined
173
+ ? '上游清单未拉取'
174
+ : `上游 ${catalog.liveCount} 条(${catalog.liveHash})${catalog.changed === true ? ',与随包不一致' : ',与随包一致'}`;
175
+ lines.push(`目录:随包 ${catalog.shippedCount} 条(${catalog.shippedHash});${live}`);
176
+ return lines.join('\n');
177
+ }
132
178
  //# sourceMappingURL=tools.js.map
package/lib/tools.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,9 @@
10
10
  * 2. **每次调用开一个新会话**(`initialize` → `callTool` → `close`)。会话里带
11
11
  * 着凭据,缓存会话就等于缓存秘密,而设置契约要求「每次操作重新 resolve」;
12
12
  * 连接成本换正确性是划算的,这条与投研舱的既有做法一致。
13
+ *
14
+ * 本层只做传输,不解释失败:错误原样抛出(保留 `code`/`status`),由
15
+ * `./errors` 观测;日志也只留一行原始报文,分类与节流在上层做。
13
16
  * @module @dsh-ft/dsh-fft-ftshare/transport
14
17
  */
15
18
  import type { Logger } from '@deepseek-ai/cordis';
@@ -18,6 +21,13 @@ import type { FtshareToolInfo } from './contract.js';
18
21
  export declare const FTSHARE_GATEWAY_ENDPOINT = "https://market.ft.tech/gateway/mcp";
19
22
  /** 承载 API Key 的请求头名。 */
20
23
  export declare const FTSHARE_API_KEY_HEADER = "FTSHARE_API_KEY";
24
+ /**
25
+ * 单次 `callTool` 的默认上限。
26
+ *
27
+ * 实测会话失效/服务端超时会拖到约 950 s 才返回(见 `docs/thirdparty/
28
+ * ftshare-gateway-contract.md`),没有上限时一次取数能挂住 16 分钟。
29
+ */
30
+ export declare const FTSHARE_CALL_DEADLINE_MS = 60000;
21
31
  /** 一次上游调用的原始结果。`value` 是上游自己的结构化载荷,未做任何解释。 */
22
32
  export interface FtshareTransportResult {
23
33
  value: unknown;
@@ -43,6 +53,8 @@ export interface FtshareTransportOptions {
43
53
  clientName?: string;
44
54
  /** MCP 客户端版本。 */
45
55
  clientVersion?: string;
56
+ /** 单次 `callTool` 的上限,默认 {@link FTSHARE_CALL_DEADLINE_MS};0 表示不设。 */
57
+ deadlineMs?: number;
46
58
  }
47
59
  /**
48
60
  * 建一个到 FTShare 网关的传输层。
@@ -1 +1 @@
1
- {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAKjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAGpD,8CAA8C;AAC9C,eAAO,MAAM,wBAAwB,uCAAuC,CAAA;AAE5E,wBAAwB;AACxB,eAAO,MAAM,sBAAsB,oBAAoB,CAAA;AAEvD,8CAA8C;AAC9C,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,OAAO,CAAA;CACf;AAED,iCAAiC;AACjC,MAAM,WAAW,gBAAgB;IAC/B,gCAAgC;IAChC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAA;IACtH,wBAAwB;IACxB,SAAS,IAAI,OAAO,CAAC,SAAS,eAAe,EAAE,CAAC,CAAA;CACjD;AAED,iBAAiB;AACjB,MAAM,WAAW,uBAAuB;IACtC,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,sCAAsC;IACtC,aAAa,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IAChD,wBAAwB;IACxB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,4BAA4B;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,iBAAiB;IACjB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAyCD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,uBAAuB,GAAG,gBAAgB,CA6EzF"}
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAKjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAGpD,8CAA8C;AAC9C,eAAO,MAAM,wBAAwB,uCAAuC,CAAA;AAE5E,wBAAwB;AACxB,eAAO,MAAM,sBAAsB,oBAAoB,CAAA;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,QAAS,CAAA;AAE9C,8CAA8C;AAC9C,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,OAAO,CAAA;CACf;AAED,iCAAiC;AACjC,MAAM,WAAW,gBAAgB;IAC/B,gCAAgC;IAChC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAA;IACtH,wBAAwB;IACxB,SAAS,IAAI,OAAO,CAAC,SAAS,eAAe,EAAE,CAAC,CAAA;CACjD;AAED,iBAAiB;AACjB,MAAM,WAAW,uBAAuB;IACtC,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,sCAAsC;IACtC,aAAa,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IAChD,wBAAwB;IACxB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,4BAA4B;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,iBAAiB;IACjB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAsDD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,uBAAuB,GAAG,gBAAgB,CAoEzF"}
package/lib/transport.js CHANGED
@@ -10,6 +10,9 @@
10
10
  * 2. **每次调用开一个新会话**(`initialize` → `callTool` → `close`)。会话里带
11
11
  * 着凭据,缓存会话就等于缓存秘密,而设置契约要求「每次操作重新 resolve」;
12
12
  * 连接成本换正确性是划算的,这条与投研舱的既有做法一致。
13
+ *
14
+ * 本层只做传输,不解释失败:错误原样抛出(保留 `code`/`status`),由
15
+ * `./errors` 观测;日志也只留一行原始报文,分类与节流在上层做。
13
16
  * @module @dsh-ft/dsh-fft-ftshare/transport
14
17
  */
15
18
  import { Client } from '@modelcontextprotocol/sdk/client/index.js';
@@ -19,6 +22,13 @@ import { asText, isRecord } from './errors.js';
19
22
  export const FTSHARE_GATEWAY_ENDPOINT = 'https://market.ft.tech/gateway/mcp';
20
23
  /** 承载 API Key 的请求头名。 */
21
24
  export const FTSHARE_API_KEY_HEADER = 'FTSHARE_API_KEY';
25
+ /**
26
+ * 单次 `callTool` 的默认上限。
27
+ *
28
+ * 实测会话失效/服务端超时会拖到约 950 s 才返回(见 `docs/thirdparty/
29
+ * ftshare-gateway-contract.md`),没有上限时一次取数能挂住 16 分钟。
30
+ */
31
+ export const FTSHARE_CALL_DEADLINE_MS = 60_000;
22
32
  /**
23
33
  * 从 MCP 调用的错误结果里取出可读文本。
24
34
  * @param content - `callTool` 返回的 content 数组。
@@ -59,6 +69,20 @@ function payloadOf(result, tool, logger) {
59
69
  }
60
70
  return record.structuredContent ?? undefined;
61
71
  }
72
+ /**
73
+ * 把调用方取消信号与 deadline 合成一个信号。
74
+ * @param caller - 调用方信号。
75
+ * @param deadlineMs - 上限毫秒;0 表示不设。
76
+ * @returns 合并后的信号;两者都没有时 undefined。
77
+ */
78
+ function callSignal(caller, deadlineMs) {
79
+ const timeout = deadlineMs > 0 ? AbortSignal.timeout(deadlineMs) : undefined;
80
+ if (caller === undefined)
81
+ return timeout;
82
+ if (timeout === undefined)
83
+ return caller;
84
+ return AbortSignal.any([caller, timeout]);
85
+ }
62
86
  /**
63
87
  * 建一个到 FTShare 网关的传输层。
64
88
  * @param options - 见 {@link FtshareTransportOptions}。
@@ -68,6 +92,7 @@ export function createFtshareTransport(options) {
68
92
  const endpoint = options.endpoint?.trim() || FTSHARE_GATEWAY_ENDPOINT;
69
93
  const clientName = options.clientName ?? 'dsh-fft-ftshare';
70
94
  const clientVersion = options.clientVersion ?? '0.1.0';
95
+ const deadlineMs = options.deadlineMs ?? FTSHARE_CALL_DEADLINE_MS;
71
96
  /**
72
97
  * 开一个已握手的会话;调用方负责关闭。
73
98
  * @returns 已连接的 MCP 客户端。
@@ -85,15 +110,12 @@ export function createFtshareTransport(options) {
85
110
  }
86
111
  return {
87
112
  async call(tool, args, callOptions) {
88
- const signal = callOptions?.signal;
89
- if (signal?.aborted === true)
113
+ if (callOptions?.signal?.aborted === true)
90
114
  throw new Error(`FTShare ${tool} 调用前已被取消`);
91
- const startedAt = Date.now();
92
115
  const client = await connect();
93
116
  try {
94
- const result = await client.callTool({ name: tool, arguments: args }, undefined, {
95
- ...signal !== undefined ? { signal } : {},
96
- });
117
+ const signal = callSignal(callOptions?.signal, deadlineMs);
118
+ const result = await client.callTool({ name: tool, arguments: args }, undefined, signal === undefined ? {} : { signal });
97
119
  if (result.isError === true) {
98
120
  // 抛出一段文本:归一器既能读其中的 JSON 码,也能读纯文案。
99
121
  throw new Error(errorTextFromContent(result.content, `${tool} 返回 MCP 错误`));
@@ -103,14 +125,6 @@ export function createFtshareTransport(options) {
103
125
  throw new Error(`${tool} 未返回 structuredContent,也没有可解析的文本载荷`);
104
126
  return { value };
105
127
  }
106
- catch (error) {
107
- options.logger?.warn('ftshare.call_failed', {
108
- tool,
109
- durationMs: Date.now() - startedAt,
110
- message: error instanceof Error ? error.message : String(error),
111
- });
112
- throw error;
113
- }
114
128
  finally {
115
129
  await client.close().catch(() => undefined);
116
130
  }
@@ -1 +1 @@
1
- {"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
package/locale/en.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "meta": {
3
+ "title": "FTShare Data",
4
+ "description": "FTShare market-data access for the FT plugins, with a browsable API catalog."
5
+ }
6
+ }
package/locale/zh.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "meta": {
3
+ "title": "FTShare 数据",
4
+ "description": "为 FT 插件提供 FTShare 行情接口,并内置可浏览的接口目录。"
5
+ }
6
+ }
package/package.json CHANGED
@@ -1,19 +1,16 @@
1
1
  {
2
2
  "name": "@dsh-ft/dsh-fft-ftshare",
3
- "version": "0.3.0",
3
+ "version": "0.4.1",
4
4
  "description": "FTShare 数据底座:全 bundle 唯一出站、一处四态归一、一处模型可见面,并随包发布上游接口目录。",
5
- "type": "module",
6
- "main": "lib/index.js",
7
- "types": "lib/index.d.ts",
8
5
  "license": "MIT",
9
- "homepage": "https://github.com/gigaflw/dsh-fft-bundle/tree/dev/packages/dsh-fft-ftshare#readme",
6
+ "homepage": "https://github.com/gigaflw/dsh-fft-base/tree/dev/packages/dsh-fft-ftshare#readme",
10
7
  "repository": {
11
8
  "type": "git",
12
- "url": "git+https://github.com/gigaflw/dsh-fft-bundle.git",
9
+ "url": "git+https://github.com/gigaflw/dsh-fft-base.git",
13
10
  "directory": "packages/dsh-fft-ftshare"
14
11
  },
15
12
  "bugs": {
16
- "url": "https://github.com/gigaflw/dsh-fft-bundle/issues"
13
+ "url": "https://github.com/gigaflw/dsh-fft-base/issues"
17
14
  },
18
15
  "keywords": [
19
16
  "dsh-plugin",
@@ -21,6 +18,12 @@
21
18
  "ftshare",
22
19
  "mcp"
23
20
  ],
21
+ "publishConfig": {
22
+ "access": "public"
23
+ },
24
+ "type": "module",
25
+ "main": "lib/index.js",
26
+ "types": "lib/index.d.ts",
24
27
  "exports": {
25
28
  ".": {
26
29
  "types": "./lib/index.d.ts",
@@ -56,7 +59,8 @@
56
59
  },
57
60
  "./catalog.json": "./catalog.json",
58
61
  "./cordis.patch.yml": "./cordis.patch.yml",
59
- "./package.json": "./package.json"
62
+ "./package.json": "./package.json",
63
+ "./locale/*.json": "./locale/*.json"
60
64
  },
61
65
  "files": [
62
66
  "lib",
@@ -66,10 +70,16 @@
66
70
  "README.md",
67
71
  "LICENSE",
68
72
  "cordis.patch.yml",
73
+ "locale/*.json",
69
74
  "package.json"
70
75
  ],
71
- "publishConfig": {
72
- "access": "public"
76
+ "scripts": {
77
+ "build": "tsc -p tsconfig.json",
78
+ "prepare": "pnpm run build",
79
+ "typecheck": "tsc -p tsconfig.json --noEmit",
80
+ "catalog": "pnpm run build && node scripts/build-catalog.mjs",
81
+ "catalog:check": "pnpm run build && node scripts/build-catalog.mjs --check",
82
+ "test": "pnpm run build && node scripts/test-upstream.mjs && node scripts/test-projection.mjs && node scripts/test-service.mjs && node scripts/test-catalog.mjs && node scripts/test-mask.mjs && node scripts/test-crossplane.mjs"
73
83
  },
74
84
  "dependencies": {
75
85
  "@modelcontextprotocol/sdk": "^1.30.0"
@@ -79,6 +89,13 @@
79
89
  "@deepseek-ai/dsh-llm": ">=0.2.0-rc.2",
80
90
  "@deepseek-ai/dsh-tools": ">=0.2.0-rc.2"
81
91
  },
92
+ "devDependencies": {
93
+ "@types/node": "^22.15.0",
94
+ "typescript": "^5.8.3",
95
+ "@deepseek-ai/cordis": "catalog:",
96
+ "@deepseek-ai/dsh-llm": "catalog:",
97
+ "@deepseek-ai/dsh-tools": "catalog:"
98
+ },
82
99
  "engines": {
83
100
  "node": ">=22.19.0"
84
101
  },