echopai 2.2.0 → 2.3.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.
- package/dist/_generated/commands.js +96 -0
- package/dist/_generated/help.js +107 -7
- package/dist/_generated/operations.js +883 -27
- package/dist/bin.js +53 -8
- package/dist/runtime/invoker.js +4 -0
- package/dist/runtime/update_check.js +120 -0
- package/dist/runtime/update_worker.js +63 -0
- package/dist/runtime/verb_cmd.js +2 -0
- package/dist/tools/upgrade.js +103 -0
- package/dist/tools/welcome.js +42 -7
- package/dist/verbs/announcements.js +195 -0
- package/dist/verbs/concepts.js +393 -0
- package/dist/verbs/digest.js +9 -2
- package/dist/verbs/index.js +37 -6
- package/dist/verbs/limit_up.js +156 -0
- package/dist/verbs/lookup.js +1 -1
- package/dist/verbs/market.js +185 -0
- package/dist/verbs/news.js +17 -3
- package/dist/verbs/quote.js +1 -1
- package/dist/verbs/sentiment.js +191 -6
- package/dist/verbs/views.js +5 -3
- package/dist/version.js +1 -1
- package/package.json +1 -1
|
@@ -75,6 +75,22 @@ export function buildCommandTree(program, dispatch) {
|
|
|
75
75
|
attachOperation(cmd, OPERATIONS["agent.session-usage"], dispatch);
|
|
76
76
|
}
|
|
77
77
|
}
|
|
78
|
+
{
|
|
79
|
+
const noun = program.command("announcements");
|
|
80
|
+
noun.description("announcements commands");
|
|
81
|
+
{
|
|
82
|
+
const cmd = noun.command("detail");
|
|
83
|
+
attachOperation(cmd, OPERATIONS["announcements.detail"], dispatch);
|
|
84
|
+
}
|
|
85
|
+
{
|
|
86
|
+
const cmd = noun.command("feed");
|
|
87
|
+
attachOperation(cmd, OPERATIONS["announcements.feed"], dispatch);
|
|
88
|
+
}
|
|
89
|
+
{
|
|
90
|
+
const cmd = noun.command("stock");
|
|
91
|
+
attachOperation(cmd, OPERATIONS["announcements.stock"], dispatch);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
78
94
|
{
|
|
79
95
|
const noun = program.command("auth");
|
|
80
96
|
noun.description("auth commands");
|
|
@@ -103,6 +119,46 @@ export function buildCommandTree(program, dispatch) {
|
|
|
103
119
|
attachOperation(cmd, OPERATIONS["bars.minute-batch"], dispatch);
|
|
104
120
|
}
|
|
105
121
|
}
|
|
122
|
+
{
|
|
123
|
+
const noun = program.command("concepts");
|
|
124
|
+
noun.description("concepts commands");
|
|
125
|
+
{
|
|
126
|
+
const cmd = noun.command("alerts");
|
|
127
|
+
attachOperation(cmd, OPERATIONS["concepts.alerts"], dispatch);
|
|
128
|
+
}
|
|
129
|
+
{
|
|
130
|
+
const cmd = noun.command("alerts-history");
|
|
131
|
+
attachOperation(cmd, OPERATIONS["concepts.alerts-history"], dispatch);
|
|
132
|
+
}
|
|
133
|
+
{
|
|
134
|
+
const cmd = noun.command("daily-bars");
|
|
135
|
+
attachOperation(cmd, OPERATIONS["concepts.daily-bars"], dispatch);
|
|
136
|
+
}
|
|
137
|
+
{
|
|
138
|
+
const cmd = noun.command("list");
|
|
139
|
+
attachOperation(cmd, OPERATIONS["concepts.list"], dispatch);
|
|
140
|
+
}
|
|
141
|
+
{
|
|
142
|
+
const cmd = noun.command("minute-bars");
|
|
143
|
+
attachOperation(cmd, OPERATIONS["concepts.minute-bars"], dispatch);
|
|
144
|
+
}
|
|
145
|
+
{
|
|
146
|
+
const cmd = noun.command("news");
|
|
147
|
+
attachOperation(cmd, OPERATIONS["concepts.news"], dispatch);
|
|
148
|
+
}
|
|
149
|
+
{
|
|
150
|
+
const cmd = noun.command("show");
|
|
151
|
+
attachOperation(cmd, OPERATIONS["concepts.show"], dispatch);
|
|
152
|
+
}
|
|
153
|
+
{
|
|
154
|
+
const cmd = noun.command("snapshot");
|
|
155
|
+
attachOperation(cmd, OPERATIONS["concepts.snapshot"], dispatch);
|
|
156
|
+
}
|
|
157
|
+
{
|
|
158
|
+
const cmd = noun.command("views");
|
|
159
|
+
attachOperation(cmd, OPERATIONS["concepts.views"], dispatch);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
106
162
|
{
|
|
107
163
|
const noun = program.command("digest");
|
|
108
164
|
noun.description("digest commands");
|
|
@@ -147,6 +203,46 @@ export function buildCommandTree(program, dispatch) {
|
|
|
147
203
|
attachOperation(cmd, OPERATIONS["index.snapshot"], dispatch);
|
|
148
204
|
}
|
|
149
205
|
}
|
|
206
|
+
{
|
|
207
|
+
const noun = program.command("industries");
|
|
208
|
+
noun.description("industries commands");
|
|
209
|
+
{
|
|
210
|
+
const cmd = noun.command("alerts");
|
|
211
|
+
attachOperation(cmd, OPERATIONS["industries.alerts"], dispatch);
|
|
212
|
+
}
|
|
213
|
+
{
|
|
214
|
+
const cmd = noun.command("daily-bars");
|
|
215
|
+
attachOperation(cmd, OPERATIONS["industries.daily-bars"], dispatch);
|
|
216
|
+
}
|
|
217
|
+
{
|
|
218
|
+
const cmd = noun.command("list");
|
|
219
|
+
attachOperation(cmd, OPERATIONS["industries.list"], dispatch);
|
|
220
|
+
}
|
|
221
|
+
{
|
|
222
|
+
const cmd = noun.command("show");
|
|
223
|
+
attachOperation(cmd, OPERATIONS["industries.show"], dispatch);
|
|
224
|
+
}
|
|
225
|
+
{
|
|
226
|
+
const cmd = noun.command("snapshot");
|
|
227
|
+
attachOperation(cmd, OPERATIONS["industries.snapshot"], dispatch);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
{
|
|
231
|
+
const noun = program.command("limit-up");
|
|
232
|
+
noun.description("limit-up commands");
|
|
233
|
+
{
|
|
234
|
+
const cmd = noun.command("history");
|
|
235
|
+
attachOperation(cmd, OPERATIONS["limit-up.history"], dispatch);
|
|
236
|
+
}
|
|
237
|
+
{
|
|
238
|
+
const cmd = noun.command("pool");
|
|
239
|
+
attachOperation(cmd, OPERATIONS["limit-up.pool"], dispatch);
|
|
240
|
+
}
|
|
241
|
+
{
|
|
242
|
+
const cmd = noun.command("summary");
|
|
243
|
+
attachOperation(cmd, OPERATIONS["limit-up.summary"], dispatch);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
150
246
|
{
|
|
151
247
|
const noun = program.command("market");
|
|
152
248
|
noun.description("market commands");
|
package/dist/_generated/help.js
CHANGED
|
@@ -17,6 +17,21 @@ export const HELP = {
|
|
|
17
17
|
"description": "返回 session 内累计 billable 调用次数、各 scope 配额消耗。",
|
|
18
18
|
"example": "echopai agent session-usage VALUE"
|
|
19
19
|
},
|
|
20
|
+
"announcements.detail": {
|
|
21
|
+
"summary": "Fetch a single announcement by id",
|
|
22
|
+
"description": "返回公告完整内容:content_md、content_text、cninfo 元数据、解析状态。",
|
|
23
|
+
"example": "echopai announcements detail VALUE"
|
|
24
|
+
},
|
|
25
|
+
"announcements.feed": {
|
|
26
|
+
"summary": "List recent A-share announcements",
|
|
27
|
+
"description": "A 股公告 feed,按 published_at 降序、同日按 cninfo source_id 降序。可按 type / since 过滤。需要 `announcements:read` scope。",
|
|
28
|
+
"example": "echopai announcements feed"
|
|
29
|
+
},
|
|
30
|
+
"announcements.stock": {
|
|
31
|
+
"summary": "List announcements for a specific A-share security",
|
|
32
|
+
"description": "指定股票代码的公告列表(含历史窗口)。代码接受 6 位纯数字或 SSE:600519 / SZSE:000001 / BSE:430000 形式。需要 `announcements:read` scope。",
|
|
33
|
+
"example": "echopai announcements stock --code SSE:600519"
|
|
34
|
+
},
|
|
20
35
|
"auth.whoami": {
|
|
21
36
|
"summary": "Token introspection (CLI/MCP capability discovery)",
|
|
22
37
|
"description": "Returns the calling token's kind, scopes, audience, app metadata,\nrate_limit, allowed_clients, agent_budget (if kind=agent), api_version,\nfeature_flags. Any valid JWT can call — no specific scope required.\n\nCLI/MCP call this once at startup, cache 5 minutes in-process, and use\nthe response to derive `verbs.available` (intersection of curated verb\nscopes with token scopes) and to populate `echopai doctor` checks.\n\nSee `docs/PLAN_CLI_V2_AGENT_SURFACE.md` §5.1.\n",
|
|
@@ -42,10 +57,55 @@ export const HELP = {
|
|
|
42
57
|
"description": "Batch minute OHLC bars for multiple A-share securities. Up to 20 codes\nper call, up to 7 calendar days (≈5 trading days) date range. Single\nClickHouse round-trip; app groups rows by canonical_code.\n\nPartial success envelope same as daily-batch: codes denied by\n`allowed_securities` go to `errors[]`; others to `items[]` with flat\n`bars[]` (each bar carries its own `trade_date` for client grouping).\n\nRequires `bars:30d` or `bars:full` scope.\n",
|
|
43
58
|
"example": "echopai bars minute-batch --codes ['SSE:600519', 'SZSE:000001']"
|
|
44
59
|
},
|
|
60
|
+
"concepts.alerts": {
|
|
61
|
+
"summary": "Currently active concept alerts (big_move / limit_up_cluster)",
|
|
62
|
+
"description": "Returns the live `concept_alerts:active` hash. Two rules:\n - big_move: abs(pct_change) > 3%\n - limit_up_cluster: limit_up_count >= 3 AND stock_count >= 5\nSee PLAN_CONCEPT_INDUSTRY_QUOTE §5.5 \"异动检测与推送\".\n",
|
|
63
|
+
"example": "echopai concepts alerts"
|
|
64
|
+
},
|
|
65
|
+
"concepts.alerts-history": {
|
|
66
|
+
"summary": "Concept alerts history (last 24h)",
|
|
67
|
+
"description": "Concept异动 historical events (default last 24h). Filter by rule (big_move / limit_up_cluster) and time window. Used by AI agent / admin review.",
|
|
68
|
+
"example": "echopai concepts alerts-history"
|
|
69
|
+
},
|
|
70
|
+
"concepts.daily-bars": {
|
|
71
|
+
"summary": "Concept index daily bars (chain-linked equal-weight, base 1000)",
|
|
72
|
+
"description": "Returns daily OHLC (concept index points, not stock prices average),\nbreadth fields, and is_backfilled flag. See PLAN §5.4 algorithm.\n",
|
|
73
|
+
"example": "echopai concepts daily-bars VALUE"
|
|
74
|
+
},
|
|
75
|
+
"concepts.list": {
|
|
76
|
+
"summary": "List concepts with live snapshot (6 fields)",
|
|
77
|
+
"description": "Concept list joining CH `v_concept_meta` with Redis snapshot hash\n`stockpulse:concept_snapshots:latest`. Each item includes 6 live\nfields (pct_change / index_value / up/down_count / limit_up_count /\namount) refreshed every ~15s by stockpulse-rs collector.\n\nSource / status / index are computed per PLAN_CONCEPT_INDUSTRY_QUOTE\n§5.4 algorithm (chain-linked equal-weight returns, base = 1000).\n",
|
|
78
|
+
"example": "echopai concepts list"
|
|
79
|
+
},
|
|
80
|
+
"concepts.minute-bars": {
|
|
81
|
+
"summary": "Concept index minute bars (max 7 days)",
|
|
82
|
+
"description": "Concept index minute-level OHLC (chain-linked equal-weight, base = 1000), max 7 days per request. See PLAN_CONCEPT_INDUSTRY_QUOTE §5.4.",
|
|
83
|
+
"example": "echopai concepts minute-bars VALUE"
|
|
84
|
+
},
|
|
85
|
+
"concepts.news": {
|
|
86
|
+
"summary": "Related news matching concept name (ILIKE)",
|
|
87
|
+
"description": "Short-term implementation: ILIKE on news.title + content with the\nconcept name and full_name. Long-term: news AI tagging.\n",
|
|
88
|
+
"example": "echopai concepts news VALUE"
|
|
89
|
+
},
|
|
90
|
+
"concepts.show": {
|
|
91
|
+
"summary": "Concept detail (meta + member securities)",
|
|
92
|
+
"description": "Detail view for one concept: meta (full_name / source / status / approved_at / first_listed_at) plus current member securities with their latest snapshots.",
|
|
93
|
+
"example": "echopai concepts show VALUE"
|
|
94
|
+
},
|
|
95
|
+
"concepts.snapshot": {
|
|
96
|
+
"summary": "Bulk Redis snapshot of all concepts",
|
|
97
|
+
"description": "Returns the full concept_snapshots:latest hash. Use ?codes= to filter.",
|
|
98
|
+
"example": "echopai concepts snapshot"
|
|
99
|
+
},
|
|
100
|
+
"concepts.views": {
|
|
101
|
+
"summary": "Broker views associated with this concept",
|
|
102
|
+
"description": "JOIN concept_views × broker_views (ai_status=done) sorted by published_at desc.",
|
|
103
|
+
"example": "echopai concepts views VALUE"
|
|
104
|
+
},
|
|
45
105
|
"digest.get": {
|
|
46
106
|
"summary": "One-shot research digest for a single security (composite)",
|
|
47
107
|
"description": "Composite endpoint: in one HTTP call returns views (PRIMARY research),\nreal-time quote, valuation snapshot (PE/PB/PS/换手率/股息率/量比 等 14 字段),\nmarket sentiment context, and supplementary news.\nPartial-failure tolerant:\neach bucket is independently fetched and per-bucket failures surface\nin `meta.partial_failures[]` rather than poisoning the response. If\nevery sub-bucket fails the endpoint returns 502.\n\nBucket scopes are checked *per bucket* (not at gateway level): a\ntoken with only `views:read` gets the views bucket populated and the\nrest reported as `scope_insufficient` partial failures. This mirrors\nthe CLI fan-out contract exactly so `echopai digest` can either call\nthis endpoint (preferred, single round-trip) or fall back to local\nfan-out without behavior drift.\n\nSee `docs/PLAN_CLI_V2_AGENT_SURFACE.md` §3.3 (digest spec) and §11\nPhase 5.2 (server endpoint).\n",
|
|
48
|
-
"example": "echopai digest get
|
|
108
|
+
"example": "echopai digest get SSE:600519"
|
|
49
109
|
},
|
|
50
110
|
"financials.pit": {
|
|
51
111
|
"summary": "Point-in-time financial indicators for one A-share at a given date",
|
|
@@ -59,7 +119,7 @@ export const HELP = {
|
|
|
59
119
|
},
|
|
60
120
|
"financials.reports": {
|
|
61
121
|
"summary": "Recent financial reports for one A-share security",
|
|
62
|
-
"description": "返回该股票最近 N 期财务报告的核心指标(EPS/BPS/ROE/毛利率/营收/净利润/总\n资产/归母权益/经营现金流/总股本 等 ~25 字段)。可按 `kind` 过滤季报/半年报/\n年报。每期 `announce_date` 字段告知何时市场可见,建议结合回测时使用。\n",
|
|
122
|
+
"description": "返回该股票最近 N 期财务报告的核心指标(EPS/BPS/ROE/毛利率/营收/净利润/总\n资产/归母权益/经营现金流/总股本 等 ~25 字段)。可按 `kind` 过滤季报/半年报/\n年报。每期 `announce_date` 字段告知何时市场可见,建议结合回测时使用。\n\n**`kind` 口径说明**:\n\n- `Q1` / `H1` / `Q3` / `annual` —— 四个标准季度末快照(3-31 / 6-30 /\n 9-30 / 12-31),TDX 财务源数据全部落在这四个 report_date。\n- `preliminary` —— **当前数据源结构上不存在**。业绩预告 / 快报 是 indicators\n 行内的字段(`forecast_ni_lower` / `forecast_ni_upper` /\n `express_ni_parent` / `express_revenue` 等),通过 `financials.series`\n metric 参数访问,不是单独的 report_kind 行。`kind=preliminary` 会返\n 空列表 + meta.note。\n",
|
|
63
123
|
"example": "echopai financials reports --code SSE:600519"
|
|
64
124
|
},
|
|
65
125
|
"financials.series": {
|
|
@@ -82,6 +142,46 @@ export const HELP = {
|
|
|
82
142
|
"description": "Returns the latest real-time snapshot for the 172 indices that Sina\nexposes a quote for (SSE / SZSE / BSE — includes 北证50 `BSE:899050`\nand 专精特新 `899601.BJ`). Source is the Redis hash\n`stockpulse:index_snapshots:latest` which the Rust collector refreshes\nevery ~15 seconds during market hours; outside trading hours the last\nintraday snapshot is returned.\n\nUse `codes` to narrow to a subset (canonical format `SSE:000001` (exchange-prefix; legacy `000001.SH` is also accepted but discouraged)).\nOmit to receive all 172.\n\nNote: CSI-series indices (e.g. `CSI:000922`) are not available here —\nSina has no quote feed for them. Daily/minute history for those still\nlives behind `/api/internal/index/{daily-bars,minute-bars-range}`.\n\nRequires `quote:l1`, `quote:l2`, or `quote:delayed` scope.\n",
|
|
83
143
|
"example": "echopai index snapshot --codes SSE:000001,SZSE:399001,BSE:899050"
|
|
84
144
|
},
|
|
145
|
+
"industries.alerts": {
|
|
146
|
+
"summary": "Currently active industry alerts",
|
|
147
|
+
"description": "Currently active industry alerts (big_move / limit_up_cluster). Same rule set as concepts.",
|
|
148
|
+
"example": "echopai industries alerts"
|
|
149
|
+
},
|
|
150
|
+
"industries.daily-bars": {
|
|
151
|
+
"summary": "Industry index daily bars",
|
|
152
|
+
"description": "Industry index daily OHLC (chain-linked equal-weight, base = 1000). Path key format `<sw_industry_code>:<sw_level>` (e.g. `401001:1`).",
|
|
153
|
+
"example": "echopai industries daily-bars 401001:1"
|
|
154
|
+
},
|
|
155
|
+
"industries.list": {
|
|
156
|
+
"summary": "List industries (申万 L1/L2) with live snapshot",
|
|
157
|
+
"description": "Industry index list joining CH `v_industry_meta` with Redis snapshot.\n申万一级 (level=1) ≈ 127 industries, 申万二级 (level=2) ≈ 348.\nChain-linked equal-weight algorithm identical to concepts (PLAN §5.4).\n",
|
|
158
|
+
"example": "echopai industries list"
|
|
159
|
+
},
|
|
160
|
+
"industries.show": {
|
|
161
|
+
"summary": "Industry detail (meta + today members)",
|
|
162
|
+
"description": "Path key format: `<sw_industry_code>:<sw_level>` (e.g. `401001:1`).",
|
|
163
|
+
"example": "echopai industries show 401001:1"
|
|
164
|
+
},
|
|
165
|
+
"industries.snapshot": {
|
|
166
|
+
"summary": "Bulk Redis snapshot of all industries",
|
|
167
|
+
"description": "Bulk Redis snapshot for 申万 industries (level 1 ≈ 127, level 2 ≈ 348). Use `codes` to narrow. Mirrors `/v1/concepts/snapshot` shape.",
|
|
168
|
+
"example": "echopai industries snapshot"
|
|
169
|
+
},
|
|
170
|
+
"limit-up.history": {
|
|
171
|
+
"summary": "A-share limit-up daily trend (last N days)",
|
|
172
|
+
"description": "近 N 个交易日每日涨停数 + 最高连板 + 炸板数。涨停数 / 最高连板来源\n`market_limit_up_pool` (仅 status=limit_up);炸板数来源\n`market_breadth_intraday`(all_a_ex_st 当日最新分钟行)。\n\n响应按 trade_date asc 排序(旧日期在前)。需要 `quote:*` scope。\n",
|
|
173
|
+
"example": "echopai limit-up history"
|
|
174
|
+
},
|
|
175
|
+
"limit-up.pool": {
|
|
176
|
+
"summary": "A-share limit-up pool (per-stock detail) for a given trade date",
|
|
177
|
+
"description": "当日(或指定 `trade_date`)涨停股池逐股明细:首/末次封板时间、最终涨幅、\n封单金额/封单量、炸板次数、连板数、N 日板内统计、一字板标记、当前 status\n(limit_up / broken)、板块分类。\n\n盘前回退规则(与所有行情类页面一致):\n - `< 9:00`:返回 max(trade_date) 的最新一日数据(昨日)\n - `9:00-9:14`:集合竞价前空窗期,items=[] / trade_date=null\n - `>= 9:15`:collector 已写入今日数据\n\n排序:连板数 desc → 板内板数 desc → 封单金额 desc。需要 `quote:*` scope。\n",
|
|
178
|
+
"example": "echopai limit-up pool"
|
|
179
|
+
},
|
|
180
|
+
"limit-up.summary": {
|
|
181
|
+
"summary": "A-share limit-up summary (counts + height ladder) for a given trade date",
|
|
182
|
+
"description": "涨停股池聚合统计:涨停数、炸板数、跌停数、最高连板高度、连板梯队\n`ladder: [{ height, count }, ...]`。\n\n炸板数 / 跌停数 与情绪页同源(`market_breadth_intraday` 当日最新分钟行);\n连板梯队仅统计当前封板 status=limit_up 的个股。\n\n盘前回退规则与 `limit-up/pool` 一致。需要 `quote:*` scope。\n",
|
|
183
|
+
"example": "echopai limit-up summary"
|
|
184
|
+
},
|
|
85
185
|
"market.status": {
|
|
86
186
|
"summary": "Current A-share market session state",
|
|
87
187
|
"description": "Current A-share market session: pre-open / open / lunch / closed; current and next trading day; holiday flag. Requires `market:read` or any `quote:*` scope.",
|
|
@@ -100,7 +200,7 @@ export const HELP = {
|
|
|
100
200
|
"news.list": {
|
|
101
201
|
"summary": "List news mentioning a specific security",
|
|
102
202
|
"description": "List news mentioning a specific A-share security, ordered by published_at desc. Requires `news:read` scope.",
|
|
103
|
-
"example": "echopai news list --security
|
|
203
|
+
"example": "echopai news list --security HK:00700"
|
|
104
204
|
},
|
|
105
205
|
"news.search": {
|
|
106
206
|
"summary": "Full-text search recent news",
|
|
@@ -139,12 +239,12 @@ export const HELP = {
|
|
|
139
239
|
},
|
|
140
240
|
"sentiment.breadth": {
|
|
141
241
|
"summary": "Intraday breadth time series",
|
|
142
|
-
"description": "Intraday breadth time series
|
|
242
|
+
"description": "Intraday breadth time series for one trading day.\n`trade_date` 缺省 → 今日(盘前 9:00 前返回空 items);显式传 YYYY-MM-DD 可\n拉历史任意交易日(来源 ClickHouse `market_breadth_intraday`,剔除 13:00\n稀疏分钟,单日最多 241 行)。Requires `sentiment:read` scope.\n",
|
|
143
243
|
"example": "echopai sentiment breadth"
|
|
144
244
|
},
|
|
145
245
|
"sentiment.overview": {
|
|
146
246
|
"summary": "Aggregate market sentiment indicators",
|
|
147
|
-
"description": "Aggregate sentiment
|
|
247
|
+
"description": "Aggregate sentiment snapshot for one trading day's latest minute:\nlimit-up/down counts, breadth, divergence index, MA / 52w breadth.\n`trade_date` 缺省 → 今日(Redis 实时,盘前 9:00 前返空结构);显式传\nYYYY-MM-DD 拉历史任意日(最后一分钟聚合行,来源 ClickHouse\n`market_breadth_intraday`)。Requires `sentiment:read` scope.\n",
|
|
148
248
|
"example": "echopai sentiment overview --scope main_board"
|
|
149
249
|
},
|
|
150
250
|
"sentiment.pct-distribution": {
|
|
@@ -154,7 +254,7 @@ export const HELP = {
|
|
|
154
254
|
},
|
|
155
255
|
"sentiment.turnover": {
|
|
156
256
|
"summary": "Intraday turnover time series",
|
|
157
|
-
"description": "Intraday turnover time series
|
|
257
|
+
"description": "Intraday turnover time series across one or more trading days.\n`trade_date` 缺省 → 今日(盘前 9:00 前返空 items);显式 YYYY-MM-DD 拉\n历史任意交易日的当日 + 之前 `days-1` 天。Response 含 `current_turnover`\n/ `predicted_total` / `delta_vs_yesterday` headline 字段。Requires\n`sentiment:read` scope.\n",
|
|
158
258
|
"example": "echopai sentiment turnover"
|
|
159
259
|
},
|
|
160
260
|
"squawk.audio": {
|
|
@@ -190,6 +290,6 @@ export const HELP = {
|
|
|
190
290
|
"views.recent": {
|
|
191
291
|
"summary": "Recent broker / analyst views",
|
|
192
292
|
"description": "List recent broker / analyst views (research notes, price targets, ratings). Filter by analyst, institution, or a specific security. Requires `views:read` scope.",
|
|
193
|
-
"example": "echopai views recent"
|
|
293
|
+
"example": "echopai views recent --security HK:00700"
|
|
194
294
|
}
|
|
195
295
|
};
|