@dsh-ft/dsh-fft-ftshare 0.0.0-stage → 0.4.0

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.
Files changed (61) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +82 -2
  3. package/catalog.json +9762 -0
  4. package/catalog.meta.json +7 -0
  5. package/catalog.txt +250 -0
  6. package/cordis.patch.yml +27 -0
  7. package/lib/capabilities.d.ts +47 -0
  8. package/lib/capabilities.d.ts.map +1 -0
  9. package/lib/capabilities.js +145 -0
  10. package/lib/capabilities.js.map +1 -0
  11. package/lib/catalog-host.d.ts +19 -0
  12. package/lib/catalog-host.d.ts.map +1 -0
  13. package/lib/catalog-host.js +31 -0
  14. package/lib/catalog-host.js.map +1 -0
  15. package/lib/catalog.d.ts +51 -0
  16. package/lib/catalog.d.ts.map +1 -0
  17. package/lib/catalog.js +60 -0
  18. package/lib/catalog.js.map +1 -0
  19. package/lib/client.d.ts +55 -0
  20. package/lib/client.d.ts.map +1 -0
  21. package/lib/client.js +184 -0
  22. package/lib/client.js.map +1 -0
  23. package/lib/contract.d.ts +143 -0
  24. package/lib/contract.d.ts.map +1 -0
  25. package/lib/contract.js +26 -0
  26. package/lib/contract.js.map +1 -0
  27. package/lib/errors.d.ts +87 -0
  28. package/lib/errors.d.ts.map +1 -0
  29. package/lib/errors.js +271 -0
  30. package/lib/errors.js.map +1 -0
  31. package/lib/index.d.ts +89 -0
  32. package/lib/index.d.ts.map +1 -0
  33. package/lib/index.js +271 -0
  34. package/lib/index.js.map +1 -0
  35. package/lib/mask.d.ts +66 -0
  36. package/lib/mask.d.ts.map +1 -0
  37. package/lib/mask.js +106 -0
  38. package/lib/mask.js.map +1 -0
  39. package/lib/project.d.ts +101 -0
  40. package/lib/project.d.ts.map +1 -0
  41. package/lib/project.js +335 -0
  42. package/lib/project.js.map +1 -0
  43. package/lib/route.d.ts +48 -0
  44. package/lib/route.d.ts.map +1 -0
  45. package/lib/route.js +90 -0
  46. package/lib/route.js.map +1 -0
  47. package/lib/status.d.ts +103 -0
  48. package/lib/status.d.ts.map +1 -0
  49. package/lib/status.js +134 -0
  50. package/lib/status.js.map +1 -0
  51. package/lib/tools.d.ts +38 -0
  52. package/lib/tools.d.ts.map +1 -0
  53. package/lib/tools.js +178 -0
  54. package/lib/tools.js.map +1 -0
  55. package/lib/transport.d.ts +65 -0
  56. package/lib/transport.d.ts.map +1 -0
  57. package/lib/transport.js +161 -0
  58. package/lib/transport.js.map +1 -0
  59. package/locale/en.json +6 -0
  60. package/locale/zh.json +6 -0
  61. package/package.json +93 -4
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Ben
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,83 @@
1
- # Temporary Holding Version
1
+ # @dsh-ft/dsh-fft-ftshare
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ FTShare 数据底座:bundle 内所有 FTShare 取数都经过它。
4
+
5
+ - **一处凭据**:只走 `ctx.ftshareSettings.apiKey.resolve()`,本包不读任何凭据文件。
6
+ - **一处出站**:唯一的 StreamableHTTP MCP 会话,打到 `market.ft.tech/gateway/mcp`。
7
+ - **一处结局语义**:`available / empty / denied / failed` 四态 + `notice`;只有 `empty`
8
+ 才允许下游说「没有数据」,且 `empty` 必须有正向证据(已知容器存在且为空数组)。
9
+ - **失败只说上游原话**:401/403 → `denied`,其余 → `failed`;`notice` 带上游码、HTTP 状态、
10
+ 指纹与原文。不维护码表、不按文案猜配额/权限、不编 remedy。
11
+ - **两处接口定义**:接口表(策展,决定下发哪些模型工具)与目录(上游全量快照,随包发布)。
12
+ - **一条跨平面通路**:两个助手,由消费方自己挂。
13
+
14
+ ## 从 npm 安装
15
+
16
+ ```sh
17
+ dsh plugin add @dsh-ft/dsh-fft-ftshare
18
+ ```
19
+
20
+ 外部用户从公共 npm 安装,不需要 ssh、也不需要改 pnpm 配置。本包自带 `dsh.bundle.patch`,可单独装,但运行时仍需 settings 提供 `ftshareSettings`;工具行(`/tools`、`/mask`、`/project`)属 preset 作用域,只随模拟盘 / 工作台等入口包的 patch 挂载,单独安装只有全局 `ftshareData` 服务,不会出现 `ftshare_*` 工具。
21
+
22
+ ## 入口
23
+
24
+ | 入口 | 平面 | 职责 |
25
+ |---|---|---|
26
+ | 裸包名 `@dsh-ft/dsh-fft-ftshare` | **全局** | `provide('ftshareData')`,`inject: ['ftshareSettings']`。唯一出站、唯一四态。 |
27
+ | `/tools` | preset | 接口表里带 `expose` 的条目 → `ftshare_*` 工具;外加长尾直调 `ftshare_call(interface, args)` 与失败现场查询 `ftshare_status()`(只读进程内账本,不联网)。 |
28
+ | `/mask` | preset | 按 agent 掩掉 `dsh_kline` 的三个 FTShare wrapper 工具(`market_pulse` / `market_board_detail` / `security_intelligence`)。 |
29
+ | `/project` | preset | `tools/post-execute` 钩子:把保留的 kline 摘要式结果投影成模型可见文本,不输出裸计数。 |
30
+ | `/route` · 助手 | 消费方自挂 | `registerFtshareRoute(ctx, data)`:注册精确路由 `/api/ftshare-data`,四态原样过桥。 |
31
+ | `/client` · 助手 | 消费方自挂 | `createFtshareClient({ catalog, fetch })`:浏览器侧同名同形的实现 + 本地 `search()`。 |
32
+
33
+ **服务行必须挂全局**:preset 内 `provide` 会抛 `Preset services require isolate realms`
34
+ (`agent-preset-registry` 的 `mount.ts`),而加 `isolate` 之后服务变成 preset 私有,
35
+ preset 之外的消费方再也 inject 不到。工具、掩码、投影三行都是 preset 作用域内的注册,
36
+ 所以标准模式看不到它们。
37
+
38
+ 本包**不声明 `dsh.client`**:它不是客户端面,只发布两个助手;谁需要面板取数谁自己挂。
39
+
40
+ ## 消费方式
41
+
42
+ 宿主侧:
43
+
44
+ ```ts
45
+ import type { FtshareCallResult } from '@dsh-ft/dsh-fft-ftshare/contract'
46
+
47
+ export const inject = ['ftshareData']
48
+
49
+ const result: FtshareCallResult = await ctx.ftshareData.call('ft_v1_finance_income', { stock_code })
50
+ if (result.state === 'available') render(result.rows)
51
+ else showNotice(result.notice) // denied 带 upgradeUrl,empty 才是「没有数据」
52
+ ```
53
+
54
+ 浏览器侧:
55
+
56
+ ```ts
57
+ // 宿主半:一行挂载路由
58
+ ctx.inject(['connection', 'ftshareData'], scope =>
59
+ scope.effect(() => registerFtshareRoute(scope.ctx, scope.ftshareData), 'ftshare: /api route'))
60
+
61
+ // 客户端半:一行提供同名服务,此后面板与宿主消费方写法一致
62
+ ctx.provide('ftshareData', createFtshareClient({ catalog, fetch: window.fetch.bind(window) }))
63
+ ```
64
+
65
+ 要暴露新接口就把条目加进 `src/capabilities.ts`,不要自己注册模型工具,也不要自己连网关。
66
+
67
+ ## 目录产物
68
+
69
+ `catalog.json`(完整,含 `description` 与 `inputSchema`)、`catalog.txt`(一线索引:
70
+ `接口名 | 标题 | 入参名`,必填带 `*`)、`catalog.meta.json`(条目数与生成时间)都由
71
+ `scripts/build-catalog.mjs` 从 `tools/list` 生成,随包发布:模型用 `grep` 查索引,
72
+ 不需要为发现能力多花一个工具定义。
73
+
74
+ ## 开发
75
+
76
+ ```bash
77
+ pnpm build # tsc,产物 lib/(git 安装只送达被跟踪文件,lib/ 必须入库)
78
+ pnpm test # build + 投影/归一/目录/掩码/跨平面五组断言
79
+ pnpm catalog # 匿名会话重新生成目录产物(联网)
80
+ pnpm catalog:check # 重新生成并与盘上产物比对(联网;失败说明上游漂了)
81
+ ```
82
+
83
+ `scripts/` 下每个用例都只做断言、不发数据请求:假 transport、假服务、进程内路由。