@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/catalog.meta.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "count": 250,
3
- "generatedAt": "2026-10-16T04:35:07.554Z",
3
+ "generatedAt": "2026-11-05T09:41:45.018Z",
4
4
  "endpoint": "https://market.ft.tech/gateway/mcp",
5
- "catalogBytes": 362156,
5
+ "catalogBytes": 364984,
6
6
  "indexBytes": 22819
7
7
  }
package/lib/client.d.ts CHANGED
@@ -14,6 +14,9 @@
14
14
  * 这个模块是**只读子集**:不碰凭据、不碰网关地址、不维护接口表。它只认两样输入——
15
15
  * 随包的目录与被注入的 `fetch`;`@dsh-ft/dsh-fft-ftshare/route` 与网关常量都不在这里的
16
16
  * 依赖里,`scripts/test-crossplane.mjs` 会 grep 产物把这条钉住。
17
+ *
18
+ * 过桥时只做「形状收敛」,不解释内容:`notice.code` 可缺省(上游不给码就省略),
19
+ * `notice.upstream` 原样保留(面板要定位时用)。
17
20
  * @module @dsh-ft/dsh-fft-ftshare/client
18
21
  */
19
22
  import { type CatalogEntry } from './catalog.js';
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAgE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAA;AAC9G,OAAO,EAA8F,KAAK,kBAAkB,EAA4C,MAAM,eAAe,CAAA;AAE7L,oCAAoC;AACpC,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AAElF,kBAAkB;AAClB,MAAM,WAAW,oBAAoB;IACnC,2CAA2C;IAC3C,OAAO,EAAE,OAAO,CAAA;IAChB,iDAAiD;IACjD,KAAK,EAAE,YAAY,CAAA;IACnB,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,oCAAoC;IACpC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAA;CACjB;AAED,wDAAwD;AACxD,MAAM,WAAW,oBAAqB,SAAQ,kBAAkB;IAC9D;;;;;OAKG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE,CAAA;CACtD;AAmBD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,oBAAoB,CA6FvF"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAgE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAA;AAC9G,OAAO,EAA8F,KAAK,kBAAkB,EAA4C,MAAM,eAAe,CAAA;AAE7L,oCAAoC;AACpC,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AAElF,kBAAkB;AAClB,MAAM,WAAW,oBAAoB;IACnC,2CAA2C;IAC3C,OAAO,EAAE,OAAO,CAAA;IAChB,iDAAiD;IACjD,KAAK,EAAE,YAAY,CAAA;IACnB,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,oCAAoC;IACpC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAA;CACjB;AAED,wDAAwD;AACxD,MAAM,WAAW,oBAAqB,SAAQ,kBAAkB;IAC9D;;;;;OAKG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE,CAAA;CACtD;AAmDD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,oBAAoB,CA6FvF"}
package/lib/client.js CHANGED
@@ -14,6 +14,9 @@
14
14
  * 这个模块是**只读子集**:不碰凭据、不碰网关地址、不维护接口表。它只认两样输入——
15
15
  * 随包的目录与被注入的 `fetch`;`@dsh-ft/dsh-fft-ftshare/route` 与网关常量都不在这里的
16
16
  * 依赖里,`scripts/test-crossplane.mjs` 会 grep 产物把这条钉住。
17
+ *
18
+ * 过桥时只做「形状收敛」,不解释内容:`notice.code` 可缺省(上游不给码就省略),
19
+ * `notice.upstream` 原样保留(面板要定位时用)。
17
20
  * @module @dsh-ft/dsh-fft-ftshare/client
18
21
  */
19
22
  import { asCatalog, catalogEntryOf, missingRequiredArgs } from './catalog.js';
@@ -30,6 +33,37 @@ const STATES = new Set(['available', 'empty', 'denied', 'failed']);
30
33
  function isRecord(value) {
31
34
  return typeof value === 'object' && value !== null && !Array.isArray(value);
32
35
  }
36
+ /** 读一个非空字符串;其余 undefined。 */
37
+ function asText(value) {
38
+ return typeof value === 'string' && value.trim() !== '' ? value : undefined;
39
+ }
40
+ /**
41
+ * 收敛宿主过桥的 `notice`:只校验「有说明」,不要求「有码」。
42
+ * @param value - 过桥的 notice。
43
+ * @returns 收敛后的 notice;形状不符时 undefined。
44
+ */
45
+ function normalizeNotice(value) {
46
+ if (!isRecord(value) || typeof value.message !== 'string')
47
+ return undefined;
48
+ const code = asText(value.code);
49
+ const requiredPlan = asText(value.requiredPlan);
50
+ const upgradeUrl = asText(value.upgradeUrl);
51
+ const upstream = isRecord(value.upstream) && typeof value.upstream.raw === 'string'
52
+ ? {
53
+ raw: value.upstream.raw,
54
+ ...typeof value.upstream.status === 'number' ? { status: value.upstream.status } : {},
55
+ fingerprint: typeof value.upstream.fingerprint === 'string' ? value.upstream.fingerprint : '',
56
+ }
57
+ : undefined;
58
+ return {
59
+ ...code !== undefined ? { code } : {},
60
+ message: value.message,
61
+ ...requiredPlan !== undefined ? { requiredPlan } : {},
62
+ ...upgradeUrl !== undefined ? { upgradeUrl } : {},
63
+ retryable: value.retryable === true,
64
+ ...upstream !== undefined ? { upstream } : {},
65
+ };
66
+ }
33
67
  /**
34
68
  * 造一个客户端 `ftshareData`。
35
69
  * @param options - 见 {@link FtshareClientOptions}。
@@ -62,16 +96,17 @@ export function createFtshareClient(options) {
62
96
  if (!isRecord(value.source))
63
97
  return undefined;
64
98
  const notice = value.notice;
65
- const normalized = {
99
+ const normalizedNotice = notice === undefined ? undefined : normalizeNotice(notice);
100
+ // notice 存在但形状不对(没有 message)时按形状不符处理,不吞掉失败原因。
101
+ if (notice !== undefined && normalizedNotice === undefined)
102
+ return undefined;
103
+ return {
66
104
  ok: value.ok,
67
105
  state: state,
68
106
  rows: value.rows.filter(isRecord),
69
107
  source: value.source,
70
- ...isRecord(notice) && typeof notice.code === 'string' && typeof notice.message === 'string'
71
- ? { notice: { ...notice, retryable: notice.retryable === true } }
72
- : {},
108
+ ...normalizedNotice === undefined ? {} : { notice: normalizedNotice },
73
109
  };
74
- return normalized;
75
110
  };
76
111
  return {
77
112
  async call(interfaceName, args = {}, callOptions) {
package/lib/client.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/lib/contract.d.ts CHANGED
@@ -5,10 +5,12 @@
5
5
  * 不依赖本包的实现、传输层或 MCP SDK。本模块只有类型与常量,没有运行时依赖,
6
6
  * 因此宿主插件与测试都能安全引用。
7
7
  *
8
- * 设计要点是 **四态归一**:FTShare 网关把「真的没有数据」「套餐无权限(403
9
- * route_not_allowed)」「取数失败」三种情况都表现为「空」,调用方若只判断空数组就
10
- * 会把「无权限」误读成「没有数据」。{@link FtshareCallResult.state} 强制区分这四种
11
- * 结局,并把权限提示挂在 {@link FtshareCallResult.notice} 上。
8
+ * 设计要点是 **四态归一**:FTShare 网关把「真的没有数据」「上游拒绝(401/403)」
9
+ * 「取数失败」三种情况都表现为「空」,调用方若只判断空数组就会把「拒绝」误读成
10
+ * 「没有数据」。{@link FtshareCallResult.state} 强制区分这四种结局。
11
+ *
12
+ * 失败说明({@link FtshareNotice})只**抄上游事实**:码、HTTP 状态、原文、重试提示。
13
+ * 本包不翻译、不归因、不编造 remedy;是不是配额、要不要升级,由原文与消费方判断。
12
14
  * @module @dsh-ft/dsh-fft-ftshare/contract
13
15
  */
14
16
  /** 服务在 cordis `Context` 上的名字,也是 `ctx.provide` 的键。 */
@@ -19,16 +21,18 @@ export declare const FTSHARE_DATA_SERVICE: "ftshareData";
19
21
  * Host/Origin 围栏与浏览器鉴权由载体负责。
20
22
  */
21
23
  export declare const FTSHARE_DATA_ROUTE: "/api/ftshare-data";
22
- /** 用户可升级订阅的页面,{@link FtshareNotice.upgradeUrl} 的默认值。 */
23
- export declare const FTSHARE_UPGRADE_URL: "https://ftai.chat/me/profile?tab=subscription";
24
+ /**
25
+ * 用户可升级订阅的页面,{@link FtshareNotice.upgradeUrl} 的默认值(仅 `denied` 带)。
26
+ * `utm_source=dsh-fft` 与申请页同口径:站点据此把「从插件来的购买」和自然流量分开。
27
+ */
28
+ export declare const FTSHARE_UPGRADE_URL: "https://ftai.chat/me/profile?tab=subscription&utm_source=dsh-fft";
24
29
  /**
25
30
  * 一次取数的四态结局。
26
31
  *
27
32
  * - `available`:调用成功且至少返回了一行;
28
- * - `empty`:调用成功但确实没有数据;
29
- * - `denied`:上游拒绝(API Key 无效或套餐未开通该接口,HTTP 403
30
- * route_not_allowed / capability_limited)—— **不是**「没有数据」;
31
- * - `failed`:连接、超时、参数或上游 5xx 等其他失败。
33
+ * - `empty`:调用成功,且载荷里有**正向证据**(已知数据容器存在且为空数组);
34
+ * - `denied`:上游以 HTTP 401/403 拒绝—— **不是**「没有数据」;
35
+ * - `failed`:连接、超时、参数、上游 5xx 等其他失败,或成功信封无法识别。
32
36
  */
33
37
  export type FtshareCallState = 'available' | 'empty' | 'denied' | 'failed';
34
38
  /**
@@ -48,23 +52,43 @@ export interface FtshareCallResult {
48
52
  state: FtshareCallState;
49
53
  /** 归一后的明细行;`available` 之外通常为空数组,绝不是权限判断依据。 */
50
54
  rows: Record<string, unknown>[];
51
- /** 需要向用户/模型解释的异常,权限与失败各有措辞;成功时为 undefined。 */
55
+ /** 需要向用户/模型解释的异常;成功时为 undefined。 */
52
56
  notice?: FtshareNotice;
53
57
  /** 取数来源与时点,用于在报告里给出处。 */
54
58
  source: FtshareSource;
55
59
  }
60
+ /**
61
+ * 上游失败的现场。
62
+ *
63
+ * 只放事实:网关说了什么、HTTP 状态是多少、同一类失败怎么聚在一起。不存
64
+ * 「原因」或「补救办法」——那两样会随上游文案一起失效。
65
+ */
66
+ export interface FtshareUpstream {
67
+ /** 上游原文(剥掉 SDK 包装后的可读报文),最多 2 KB。 */
68
+ raw: string;
69
+ /** HTTP 状态:`Error.code`、信封 `upstream_code`,或文本里带分界的写法。 */
70
+ status?: number;
71
+ /** 失败指纹:同工具、同状态、同码、同归一文案的失败聚合用(数字已归一)。 */
72
+ fingerprint: string;
73
+ }
56
74
  /** 面向用户/模型的异常说明。 */
57
75
  export interface FtshareNotice {
58
- /** 上游或本包归一后的错误码,如 `route_not_allowed`、`capability_limited`。 */
59
- code: string;
60
- /** 中文说明,可直接展示。 */
76
+ /**
77
+ * 上游错误码,**照抄**(如 `UPSTREAM_UNAVAILABLE`);没有信封码但拿到 401/403 时,
78
+ * 用 HTTP 状态字符串 `"401"`/`"403"`(事实,不是编造)。本地失败码(目录外接口、
79
+ * 缺参、传输失败)由调用方自己给。
80
+ */
81
+ code?: string;
82
+ /** 面向展示的说明:上游原文(`上游原文:…`)或本地失败的事实描述。 */
61
83
  message: string;
62
- /** 建议订阅档位(Free/Basic/Advanced/Pro),由接口版本推断,属提示而非断言。 */
84
+ /** 上游信封真给了所需档位才写,不做推断。 */
63
85
  requiredPlan?: string;
64
- /** 升级入口。 */
86
+ /** 升级入口,只有 `denied` 带。 */
65
87
  upgradeUrl?: string;
66
- /** 是否值得原样重试:限流、超时、网络失败为真;权限与参数错误为假。 */
88
+ /** 是否值得原样重试:上游 hint,缺失时按 HTTP/传输事实推导。 */
67
89
  retryable: boolean;
90
+ /** 上游失败的现场;本地失败(目录外、缺参)没有。 */
91
+ upstream?: FtshareUpstream;
68
92
  }
69
93
  /** 取数来源与时点。 */
70
94
  export interface FtshareSource {
@@ -74,7 +98,7 @@ export interface FtshareSource {
74
98
  }
75
99
  /** 单次调用的可选项。 */
76
100
  export interface FtshareCallOptions {
77
- /** 调用方取消信号;已取消时立刻抛出/返回 `failed`,不发起连接。 */
101
+ /** 调用方取消信号;已取消时立刻返回 `failed`,不发起连接。 */
78
102
  signal?: AbortSignal;
79
103
  }
80
104
  /** 上游 FTShare MCP 网关暴露的一个工具。 */
@@ -1 +1 @@
1
- {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,qDAAqD;AACrD,eAAO,MAAM,oBAAoB,EAAG,aAAsB,CAAA;AAE1D;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,EAAG,mBAA4B,CAAA;AAE9D,wDAAwD;AACxD,eAAO,MAAM,mBAAmB,EAAG,+CAAwD,CAAA;AAE3F;;;;;;;;GAQG;AACH,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAE1E;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;;OAKG;IACH,EAAE,EAAE,OAAO,CAAA;IACX,uCAAuC;IACvC,KAAK,EAAE,gBAAgB,CAAA;IACvB,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IAC/B,8CAA8C;IAC9C,MAAM,CAAC,EAAE,aAAa,CAAA;IACtB,yBAAyB;IACzB,MAAM,EAAE,aAAa,CAAA;CACtB;AAED,oBAAoB;AACpB,MAAM,WAAW,aAAa;IAC5B,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAA;IACZ,kBAAkB;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,uDAAuD;IACvD,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY;IACZ,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,uCAAuC;IACvC,SAAS,EAAE,OAAO,CAAA;CACnB;AAED,eAAe;AACf,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,SAAS,CAAA;IACf,qBAAqB;IACrB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,gBAAgB;AAChB,MAAM,WAAW,kBAAkB;IACjC,0CAA0C;IAC1C,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,gCAAgC;AAChC,MAAM,WAAW,eAAe;IAC9B,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAA;IACZ,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,6BAA6B;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,mDAAmD;IACnD,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;;;OAMG;IACH,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;IACrH;;;;;OAKG;IACH,SAAS,IAAI,OAAO,CAAC,SAAS,eAAe,EAAE,CAAC,CAAA;CACjD;AAED,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,OAAO;QACf,WAAW,EAAE,kBAAkB,CAAA;KAChC;CACF"}
1
+ {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,qDAAqD;AACrD,eAAO,MAAM,oBAAoB,EAAG,aAAsB,CAAA;AAE1D;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,EAAG,mBAA4B,CAAA;AAE9D;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAG,kEAA2E,CAAA;AAE9G;;;;;;;GAOG;AACH,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAE1E;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;;OAKG;IACH,EAAE,EAAE,OAAO,CAAA;IACX,uCAAuC;IACvC,KAAK,EAAE,gBAAgB,CAAA;IACvB,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IAC/B,oCAAoC;IACpC,MAAM,CAAC,EAAE,aAAa,CAAA;IACtB,yBAAyB;IACzB,MAAM,EAAE,aAAa,CAAA;CACtB;AAED;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,qCAAqC;IACrC,GAAG,EAAE,MAAM,CAAA;IACX,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,oBAAoB;AACpB,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAA;IACf,0BAA0B;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,0BAA0B;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,yCAAyC;IACzC,SAAS,EAAE,OAAO,CAAA;IAClB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,eAAe,CAAA;CAC3B;AAED,eAAe;AACf,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,SAAS,CAAA;IACf,qBAAqB;IACrB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,gBAAgB;AAChB,MAAM,WAAW,kBAAkB;IACjC,uCAAuC;IACvC,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,gCAAgC;AAChC,MAAM,WAAW,eAAe;IAC9B,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAA;IACZ,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,6BAA6B;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,mDAAmD;IACnD,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;;;OAMG;IACH,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;IACrH;;;;;OAKG;IACH,SAAS,IAAI,OAAO,CAAC,SAAS,eAAe,EAAE,CAAC,CAAA;CACjD;AAED,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,OAAO;QACf,WAAW,EAAE,kBAAkB,CAAA;KAChC;CACF"}
package/lib/contract.js CHANGED
@@ -5,10 +5,12 @@
5
5
  * 不依赖本包的实现、传输层或 MCP SDK。本模块只有类型与常量,没有运行时依赖,
6
6
  * 因此宿主插件与测试都能安全引用。
7
7
  *
8
- * 设计要点是 **四态归一**:FTShare 网关把「真的没有数据」「套餐无权限(403
9
- * route_not_allowed)」「取数失败」三种情况都表现为「空」,调用方若只判断空数组就
10
- * 会把「无权限」误读成「没有数据」。{@link FtshareCallResult.state} 强制区分这四种
11
- * 结局,并把权限提示挂在 {@link FtshareCallResult.notice} 上。
8
+ * 设计要点是 **四态归一**:FTShare 网关把「真的没有数据」「上游拒绝(401/403)」
9
+ * 「取数失败」三种情况都表现为「空」,调用方若只判断空数组就会把「拒绝」误读成
10
+ * 「没有数据」。{@link FtshareCallResult.state} 强制区分这四种结局。
11
+ *
12
+ * 失败说明({@link FtshareNotice})只**抄上游事实**:码、HTTP 状态、原文、重试提示。
13
+ * 本包不翻译、不归因、不编造 remedy;是不是配额、要不要升级,由原文与消费方判断。
12
14
  * @module @dsh-ft/dsh-fft-ftshare/contract
13
15
  */
14
16
  /** 服务在 cordis `Context` 上的名字,也是 `ctx.provide` 的键。 */
@@ -19,6 +21,9 @@ export const FTSHARE_DATA_SERVICE = 'ftshareData';
19
21
  * Host/Origin 围栏与浏览器鉴权由载体负责。
20
22
  */
21
23
  export const FTSHARE_DATA_ROUTE = '/api/ftshare-data';
22
- /** 用户可升级订阅的页面,{@link FtshareNotice.upgradeUrl} 的默认值。 */
23
- export const FTSHARE_UPGRADE_URL = 'https://ftai.chat/me/profile?tab=subscription';
24
+ /**
25
+ * 用户可升级订阅的页面,{@link FtshareNotice.upgradeUrl} 的默认值(仅 `denied` 带)。
26
+ * `utm_source=dsh-fft` 与申请页同口径:站点据此把「从插件来的购买」和自然流量分开。
27
+ */
28
+ export const FTSHARE_UPGRADE_URL = 'https://ftai.chat/me/profile?tab=subscription&utm_source=dsh-fft';
24
29
  //# sourceMappingURL=contract.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,qDAAqD;AACrD,MAAM,CAAC,MAAM,oBAAoB,GAAG,aAAsB,CAAA;AAE1D;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,mBAA4B,CAAA;AAE9D,wDAAwD;AACxD,MAAM,CAAC,MAAM,mBAAmB,GAAG,+CAAwD,CAAA"}
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,qDAAqD;AACrD,MAAM,CAAC,MAAM,oBAAoB,GAAG,aAAsB,CAAA;AAE1D;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,mBAA4B,CAAA;AAE9D;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,kEAA2E,CAAA"}
package/lib/errors.d.ts CHANGED
@@ -1,93 +1,87 @@
1
1
  /**
2
- * 上游失败的归一:把 FTShare 网关千奇百怪的报错折成 {@link FtshareNotice}
3
- * 加一个四态结局。
2
+ * 上游失败的观测与四态归一的**薄**层。
4
3
  *
5
- * 这是 P8 的解药所在。网关对「套餐没开通这个接口」返回的是 HTTP 403 +
6
- * `route_not_allowed`,`dsh-kline` 把它归类成 `capability_limited` 之后,摘要里
7
- * 只留下一个 `0`;调用方于是无法区分「今天真的没有涨停事件」和「这个套餐根本
8
- * 调不了这个接口」。本模块只做一件事:把权限失败与真实失败分开,并各自带上
9
- * 用户能看懂的中文说明。
4
+ * 只做四件事:抄事实、判 HTTP 语义、留现场、算指纹。**不解释上游**:不维护错误码表,
5
+ * 不按中文文案猜「配额/权限/凭据」,不编造 remedy。上游改名、改文案、加码,这里一行
6
+ * 都不用改。
7
+ *
8
+ * 判定只剩两条 HTTP 语义(稳定、不会随上游文案变):
9
+ *
10
+ * - `401` / `403` → `denied`(面板遮罩要用);
11
+ * - 其余 → `failed`。
12
+ *
13
+ * `empty` 不在这里判定:它由成功载荷的**正向证据**决定(见 `./index.ts` 的
14
+ * `observePayload`)。「成功信封里带权限标记」是载荷事实,由
15
+ * {@link permissionNoticeFromPayload} 识别,同样不是文案猜测。
10
16
  * @module @dsh-ft/dsh-fft-ftshare/errors
11
17
  */
12
18
  import { type FtshareNotice } from './contract.js';
13
- /** 上游返回的错误信封,字段全部按「可能不存在」处理。 */
14
- interface UpstreamErrorEnvelope {
15
- code?: string;
16
- /** 上游 HTTP 状态码(信封里的 `upstream_code`):429 这类码比归一码更能说明失败性质。 */
17
- upstreamCode?: string;
19
+ /** 失败从哪条通道来:成功信封内、HTTP 非 2xx、传输层、纯文本。 */
20
+ export type FailureSurface = 'envelope' | 'http' | 'transport' | 'text';
21
+ /** 一次失败的观测事实。只记事实,不下结论。 */
22
+ export interface UpstreamFailure {
23
+ /** 观测通道。 */
24
+ surface: FailureSurface;
25
+ /** 剥掉 SDK 包装后的可读文本;单行。 */
18
26
  message: string;
27
+ /** 上游信封里的码,原样大小写;不猜、不改写。 */
28
+ code?: string;
29
+ /** HTTP 状态:`Error.code`、信封 `upstream_code`,或文本里有分界的写法。 */
30
+ status?: number;
31
+ /** 上游自己的 retryable hint;只有信封里有,只作提示。 */
32
+ retryable?: boolean;
33
+ /** 上游真给了才带上。 */
19
34
  requiredPlan?: string;
35
+ /** 原始报文(未截断),用于指纹与 fixture 草稿。 */
36
+ raw: string;
37
+ /** 稳定短指纹,见 {@link fingerprintOf}。 */
38
+ fingerprint: string;
20
39
  }
21
- /** 配额用尽时附在失败提示后的文案。 */
22
- export declare const FTSHARE_QUOTA_NOTICE = "\u514D\u8D39\u914D\u989D\u7528\u5C3D\uFF0C\u914D\u7F6E FTShare API Key \u6216\u7A0D\u540E\u91CD\u8BD5";
23
- /**
24
- * 一个码或一句话是否表达「额度用尽」。
25
- * @param code - 归一后的上游错误码。
26
- * @param upstreamCode - 信封里的上游 HTTP 状态码,可能没有。
27
- * @param message - 上游说明。
28
- * @returns 是否属于额度用尽。
29
- */
30
- export declare function isQuotaSignal(code: string | undefined, upstreamCode: string | undefined, message: string): boolean;
31
40
  /** 判断一个值是不是可当对象读的记录。 */
32
41
  export declare function isRecord(value: unknown): value is Record<string, unknown>;
33
42
  /** 读一个非空字符串;其余一律 undefined。 */
34
43
  export declare function asText(value: unknown): string | undefined;
44
+ /** 不依赖 `node:crypto` 的稳定指纹:FNV-1a 64 位,十六进制 16 位。 */
45
+ export declare function hashText(text: string): string;
35
46
  /**
36
- * 一个码或一句话是否表达「无权访问」。
37
- * @param code - 上游错误码,可能没有。
38
- * @param message - 上游错误文案,可能为空串。
39
- * @returns 是否属于权限失败。
40
- */
41
- export declare function isPermissionSignal(code: string | undefined, message: string): boolean;
42
- /**
43
- * 一个码是否值得原样重试。
44
- * @param code - 归一后的上游错误码。
45
- * @param message - 上游说明。
46
- * @param upstreamCode - 信封里的上游 HTTP 状态码:`UPSTREAM_UNAVAILABLE` 包裹的 502/504 仍可重试。
47
- */
48
- export declare function isRetryableSignal(code: string | undefined, message: string, upstreamCode?: string): boolean;
49
- /**
50
- * 从 MCP 客户端抛出的错误(其 message 常是被字符串化的一段上游 JSON)里抽出码与说明。
47
+ * 失败指纹:同工具、同状态、同码、同归一文案的失败聚合用。
51
48
  *
52
- * 上游两种形态都出现过:结构化 `{"error":{"code":…,"message":…}}`,以及
53
- * 一行纯文本。两者都要能读,读不出来就保留原文。
54
- * @param value - 抛出物或上游返回的文本。
55
- * @returns 归一后的码与说明。
49
+ * 文案里的数字会归一成 `#`,否则「请等待 N 小时」会让每次失败都算新指纹。
50
+ * @param status - HTTP 状态。
51
+ * @param code - 上游码。
52
+ * @param message - 可读文案。
53
+ * @returns 16 位十六进制指纹。
56
54
  */
57
- export declare function parseUpstreamError(value: unknown): UpstreamErrorEnvelope;
55
+ export declare function fingerprintOf(status: number | undefined, code: string | undefined, message: string): string;
58
56
  /**
59
- * 造一条「无权访问」提示。措辞刻意把「不是没有数据」写进去:P8 的病根就是这句
60
- * 缺失,让「套餐没开通」看起来像「今天什么都没有」。
61
- *
62
- * 档位只在上游自己给了 `required_plan` 时才写进提示:接口名里的版本号与订阅档位
63
- * 没有可复核的对应关系,按它猜一个档位会把用户引向错误的套餐。
64
- * @param tool - 上游工具名。
65
- * @param code - 上游错误码,缺省按 `route_not_allowed` 记。
66
- * @param message - 上游说明。
67
- * @param requiredPlan - 上游信封里给出的所需档位;没给就不猜。
68
- * @returns 可直接展示的提示。
57
+ * 把一次抛出物归一成 {@link UpstreamFailure}(只记事实)。
58
+ * @param value - 抛出物或上游返回的文本。
59
+ * @returns 观测事实。
69
60
  */
70
- export declare function deniedNotice(tool: string, code: string | undefined, message: string, requiredPlan?: string): FtshareNotice;
61
+ export declare function observeFailure(value: unknown): UpstreamFailure;
71
62
  /**
72
63
  * 把一次失败折成结局与提示。
64
+ *
65
+ * 顺序即语义:`401/403` 是上游拒绝 → `denied`;其余一律 `failed`。不再按文案细分
66
+ * 配额/凭据/档位——原文已经带出这些信息。
73
67
  * @param error - 抛出物。
74
- * @param tool - 上游工具名,出现在提示正文里。
75
- * @returns 结局(`denied` 或 `failed`)与可直接展示的提示。
68
+ * @param tool - 上游工具名(只用于调用方日志,不写进提示)。
69
+ * @returns 结局与可直接展示的提示。
76
70
  */
77
71
  export declare function classifyFailure(error: unknown, tool: string): {
78
72
  state: 'denied' | 'failed';
79
73
  notice: FtshareNotice;
74
+ failure: UpstreamFailure;
80
75
  };
81
76
  /**
82
77
  * 从「调用成功但信封说自己无权」的载荷里读出权限提示。
83
78
  *
84
- * 部分网关把订阅门禁放在成功信封的 `metadata.permissions` 里,而不是返回错误;
85
- * 只看空数组就会把这种情况读成「没有数据」。这里的标记判定与投研舱既有实现保持
86
- * 同一口径:必须出现显式的权限标记或权限文案,普通空数组不算。
87
- * @param tool - 上游工具名。
79
+ * 部分网关把订阅门禁放在成功信封的 `metadata.permissions` 或 `permission` 里,而不是
80
+ * 返回错误;只看空数组就会把这种情况读成「没有数据」。这里只认**显式标记**(
81
+ * `access_denied` 之类布尔标记)或 `401/403` 状态码,不按文案猜。
82
+ * @param tool - 上游工具名(只用于调用方日志,不写进提示)。
88
83
  * @param value - 上游返回的结构化载荷。
89
84
  * @returns 权限提示;没有标记时 undefined。
90
85
  */
91
86
  export declare function permissionNoticeFromPayload(tool: string, value: unknown): FtshareNotice | undefined;
92
- export {};
93
87
  //# sourceMappingURL=errors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,eAAe,CAAA;AAEvE,gCAAgC;AAChC,UAAU,qBAAqB;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,6DAA6D;IAC7D,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AA8BD,uBAAuB;AACvB,eAAO,MAAM,oBAAoB,0GAAoC,CAAA;AAYrE;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,YAAY,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAMlH;AAcD,wBAAwB;AACxB,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAED,+BAA+B;AAC/B,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAEzD;AAQD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAGrF;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAI3G;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,qBAAqB,CAoCxE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,aAAa,CAa1H;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,CAgCnH;AAED;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,aAAa,GAAG,SAAS,CAsBnG"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAuB,KAAK,aAAa,EAAwB,MAAM,eAAe,CAAA;AAE7F,yCAAyC;AACzC,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAA;AAEvE,2BAA2B;AAC3B,MAAM,WAAW,eAAe;IAC9B,YAAY;IACZ,OAAO,EAAE,cAAc,CAAA;IACvB,0BAA0B;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,4BAA4B;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,wCAAwC;IACxC,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,gBAAgB;IAChB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,kCAAkC;IAClC,GAAG,EAAE,MAAM,CAAA;IACX,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAA;CACpB;AAoBD,wBAAwB;AACxB,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAED,+BAA+B;AAC/B,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAEzD;AAaD,qDAAqD;AACrD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO7C;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAG3G;AA8DD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,CA+B9D;AAiBD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAAC,MAAM,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,eAAe,CAAA;CAAE,CA6B7I;AAED;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,aAAa,GAAG,SAAS,CA+BnG"}