@v587d/capital-generation 2.6.2 → 2.6.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.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,41 @@
7
7
  - **第三位(patch)**:不破坏既有工具 / 配置 / 会话的新增与修复(如 2.1.1、2.1.2)。
8
8
  - **第二位(minor)**:有需要用户知晓的行为变更,且段内附迁移说明(如 2.1.0 的图表呈现通道重做、2.2.0 的数据源与检索来源扩容、2.4.0 的**必须换宿主版本**——本插件自己的工具与数据契约没变,所以只抬第二位)。
9
9
 
10
+ ## [2.6.3] - 2026-10-07
11
+
12
+ 自选股并入**港股与美股**,同时补上此前整块缺失的**港美股指数点位**(面板与 Agent 用同一颗能力取数)。
13
+ **既有工具入参、已有数据能力、四把密钥与凭据引用名、配置字段与会话日志格式都没变**,无需迁移,
14
+ 宿主仍要求 `0.2.0-rc.2`。自选股存储只给报价加了两格**可选**字段(`currency` / `source_time`),
15
+ 老清单照读、不必清空重加;新增的三种代码形状(`00700.HK` / `HSI.HK` / `AAPL.OQ`)走的是同一个 v1 schema。
16
+
17
+ ### Added
18
+
19
+ - **一个搜索入口、三市合并**:一次输入并发问同花顺(A 股 / A 股指数 / 场内 ETF)与腾讯公开检索
20
+ (港、美各一次),合并后按完整代码去重、命中的那条排最前。为什么港美要各问一次而不是一次
21
+ `t=all`:实测 `t=all&q=富通` 回 9 条 A 股 + 1 条港股、**0 条美股**——共用一次会让"美股这一档
22
+ 根本没进候选"从偶发变成常态。某一路挂了其余路照常给,下拉那一行点名挂的是哪一路;
23
+ **没配 Fuyao 密钥也能加、能刷港美股**(原先 `credential_missing` 锁的是整块面板,现在它的射程
24
+ 只剩 A 股那一路)。
25
+ - **两颗指数点位能力**(`tencent_hk_index_quote` / `tencent_us_index_quote`,能力总数 92 → 94、
26
+ 腾讯公开源 7 → 9):恒生 / 恒生科技 / 国企指数 / 恒指波动率 / 纳斯达克 / 道琼斯 / 标普500
27
+ 当场回行、盘中在动。口径刻意是窄的:只取点位、昨收、涨跌与时刻,**成交量 / 成交额 / 换手率 /
28
+ 市值四列一律不进表**——实测指数行那两列相等且是万元级(美指那一列 2.1e14),谁也说不出单位。
29
+ ⛔ 指数写法不许猜:`usSSPX` 会回一只真 ETF 且**不报错**,所以只认搜索回来的写法,回包形状再核一遍。
30
+ - **种子清单换成 上证指数 / 恒生指数 / 纳斯达克 / 标普500**(只对新出现的清单生效,已有清单不动)。
31
+
32
+ ### Changed
33
+
34
+ - **面板每一行现在标市场**:`A股 / A指 / 港股 / 港指 / 美股 / 美指` 六档、三市三种底色。场内 ETF
35
+ 归进 A股那一档(它的报价就是二级市场的价格);"这是 ETF"那一层挪进行内「预测」「复盘」递进
36
+ 输入框的那句话里,Agent 仍靠它选端点。
37
+ - **一次搜索给到 20 条候选**(原先 10 条)。A 股那一路按 20 要(Fuyao `limit` 官方取值 1~50),
38
+ 腾讯那两路实测**硬顶 10 条**(`&n=` / `&count=` / `&size=` 等六种写法逐条试过,全部无效),
39
+ 所以"还有更多"分两种情形判:合并后撞一屏,或某一路被上游砍在自己那一档——后者合并结果
40
+ 不到 20 条,也照样要告诉用户缩小输入。
41
+ - 停牌 / 无成交的行上游回的是 `0.00`,那一格现在画**破折号**而不是 0.00%;港美股与港美股指数行的
42
+ tooltip 多一句**交易所当地时间**(原样给,不做时区换算)。
43
+ - README 的自选股截图换成三市同屏那一张。
44
+
10
45
  ## [2.6.2] - 2026-10-07
11
46
 
12
47
  新增一份示例报告([假期后研判报告](docs/sample/假期后研判报告.md)),README 首页的样例链接指向它;
@@ -16,12 +51,14 @@
16
51
  ### Changed
17
52
 
18
53
  - **README**:首页样例链接换成新报告;桌面端「添加插件」补上直接填 `v587d/capital-generation`
19
- 这一种写法(实测可用);FAQ 新增「刚发布的新版本装不到」——桌面端取包会**跳过刚发布不久的版本**
20
- (宿主侧包管理器的发布冷却策略,实测静默降级到上一版),这一条此前被写成了"镜像延迟",不准确。
21
- - **发版后自动通知 npmmirror 同步**。桌面端经国内镜像取 npm 包,而镜像同步是异步的:2.6.1 那次实测
22
- 镜像恰好在官方源出现新版本**前两秒**完成过一次同步,之后十几小时没再碰这个包。CI 发版成功后 PUT
23
- 一次 sync 端点(owner 的标准动作,无需鉴权,实测约 25 秒生效);同步失败不判红——官方源已可用,
24
- 镜像晚点追上只是延迟。
54
+ 这一种写法(实测可用);FAQ 新增「刚发布的新版本装不到」。原因有两条,此前只写了一条:
55
+ ① 宿主侧包管理器有**发布冷却策略**(pnpm 的 `minimumReleaseAge`),刚发布的新版本会被跳过、
56
+ 静默装成上一版——实测**写全版本号也不能绕过**;② 国内镜像同步滞后。急着用最新代码走仓库地址。
57
+ - **发版后自动通知 npmmirror 同步**。镜像同步是异步的:2.6.1 那次实测镜像恰好在官方源出现新版本
58
+ **前两秒**完成过一次同步,之后十几小时没再碰这个包。CI 发版成功后 PUT 一次 sync 端点(owner 的
59
+ 标准动作,无需鉴权);同步失败不判红——官方源已可用,镜像晚点追上只是延迟。
60
+ **踢的时机**要排在"官方源认账"之后:`npm publish` 回执是 202"处理中",官方源自己要几分钟才认
61
+ 这个版本,2.6.2 那次 CI 一发布完就踢,镜像同步到的是还没有新版本的包。
25
62
 
26
63
  ## [2.6.1] - 2026-10-06
27
64
 
package/README.md CHANGED
@@ -15,7 +15,7 @@
15
15
  <p align="center">
16
16
  <a href="https://awesome-dsh-plugin.com"><img src="https://awesome-dsh-plugin.com/badge.svg" alt="awesome · DSH plugin"></a>
17
17
  <a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-green" alt="License"></a>
18
- <a href="https://github.com/v587d/capital-generation/releases"><img src="https://img.shields.io/badge/version-2.6.2-9cf" alt="Version"></a>
18
+ <a href="https://github.com/v587d/capital-generation/releases"><img src="https://img.shields.io/badge/version-2.6.3-9cf" alt="Version"></a>
19
19
  </p>
20
20
 
21
21
  # Capital Generation
@@ -67,7 +67,7 @@ Capital Generation 是运行在 [DeepSeek Harness(DSH)](https://github.com/d
67
67
  </a>
68
68
  </p>
69
69
 
70
- 3. **新建会话。** 在 Agent Preset 选择器中选 **Capital**,然后直接描述研究问题。也可以到「设置」→「Agent 预设」把它设为默认模式。
70
+ 3. **新建会话。** 在 Agent Preset 选择器中选 **Capital 模式**,然后直接描述研究问题。也可以到「设置」→「Agent 预设」把它设为默认模式。
71
71
 
72
72
  <p align="center">
73
73
  <a href="assets/mode_selector.png">
@@ -77,10 +77,10 @@ Capital Generation 是运行在 [DeepSeek Harness(DSH)](https://github.com/d
77
77
 
78
78
  ## 能做什么
79
79
 
80
- - **查数据和资料:** 覆盖A股、港股、美股,按需获取行情、财务、指数、基金与宏观行业数据,检索公告、新闻和研报。共计 **92** 个数据收集能力和 **14** 个网页检索能力,部分公开数据源无需额外密钥;具体覆盖范围见 [数据收集能力表](docs/data-collector-capabilities.md) 和 [网页检索能力表](docs/web-retriever-capabilities.md)。
80
+ - **查数据和资料:** 覆盖A股、港股、美股,按需获取行情、财务、指数、基金与宏观行业数据,检索公告、新闻和研报。共计 **94** 个数据收集能力和 **14** 个网页检索能力,部分公开数据源无需额外密钥;具体覆盖范围见 [数据收集能力表](docs/data-collector-capabilities.md) 和 [网页检索能力表](docs/web-retriever-capabilities.md)。
81
81
  - **数据分析:** 所有 Agents 均不直接接触原始结构数据,Agents 按需读取数据、校验数据,并写脚本挖掘数据背后含义。
82
82
  - **可视化:** 将数据交给不同角色处理,再生成可交互图表。图表会作为本轮交付物出现在会话中,可在侧栏查看或离线打开。了解处理流程可看 [Agent 角色说明](docs/agent-roles.md)。
83
- - **管理自选股:** 在 Capital 会话中输入 `/` 或点击输入框旁的 `+`,从「指令」中打开「自选股」。刷新失败时已有报价仍显示为旧快照,并标明时间;请勿当作实时价格。
83
+ - **管理自选股:** 在 Capital 会话中输入 `/` 或点击输入框旁的 `+`,从「指令」中打开「自选股」。A股、港股、美股共用这一个入口:直接敲代码或名称,候选列表会写清它属于哪个市场;清单里每一行都带市场标注,指数另标一行。某一个市场取数失败时,其余市场照常刷新,页面会说明失败的是哪一路;整体刷新失败时已有报价仍显示为旧快照,并标明时间,请勿当作实时价格。
84
84
 
85
85
  会话中的图表效果:
86
86
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@v587d/capital-config",
3
- "version": "2.6.2",
3
+ "version": "2.6.3",
4
4
  "description": "Capital 模式的取数凭据与偏好配置行:卡片坐在 @v587d/capital-generation 插件主页的「配置」段,点这一行本身没有表单。",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -5,7 +5,7 @@ window.__ModuleLoader__.load({
5
5
  var module = { exports: {} }
6
6
  var exports = module.exports
7
7
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' })
8
- "use strict";var{createElement:e,useEffect:F,useState:q}=require("react"),{createSnapshotStore:D}=require("@deepseek-ai/dsh-client-store"),{IconChecklistOutlineRegular:Q,IconCloseOutlineRegular:k,IconEllipsisOutlineRegular:L,IconGoalOutlineRegular:H,IconListPenOutlineRegular:B,IconPinOutlineRegular:U,IconRefreshOutlineRegular:Y,IconSearchOutlineRegular:W,IconTrashOutlineRegular:G,Menu:K,Modal:J}=require("@deepseek-ai/dsh-client-ui-primitives"),m="capital-watchlist",b="capital.watchlist",N="conversation.input.overlay",_="/capital-watchlist",V="capital-generation",X=300,S="capital-watchlist-css",Z={"command.label":"\u81EA\u9009\u80A1","command.description":"\u6DFB\u52A0 / \u67E5\u770B / \u5220\u9664\u81EA\u9009\u80A1",title:"\u81EA\u9009\u80A1",close:"\u5173\u95ED",searchPlaceholder:"\u8F93\u5165\u8BC1\u5238\u4EE3\u7801\u6216\u4E2D\u6587\u540D\uFF0C\u652F\u6301A\u80A1/\u6307\u6570/ETF",add:"\u6DFB\u52A0",added:"\u5DF2\u6DFB\u52A0",refreshing:"\u5237\u65B0\u4E2D\u2026",refresh:"\u5237\u65B0\u62A5\u4EF7",loading:"\u6B63\u5728\u8BFB\u53D6\u6E05\u5355\u2026",empty:"\u8FD8\u6CA1\u6709\u81EA\u9009\u80A1\uFF0C\u7528\u4E0A\u9762\u7684\u8F93\u5165\u6846\u6DFB\u52A0\u3002",colName:"\u540D\u79F0",colQuote:"\u6700\u65B0\u4EF7 / \u6DA8\u8DCC\u5E45",colAction:"\u64CD\u4F5C",updated:"\u66F4\u65B0\u65F6\u95F4",notRefreshed:"\u672A\u5237\u65B0",stale:"\u4E0A\u4E00\u6B21\u5FEB\u7167",noChangePct:"\u6682\u65E0\u6DA8\u8DCC\u6570\u636E",typeStock:"\u80A1\u7968",typeIndex:"\u6307\u6570",typeEtf:"ETF",remove:"\u79FB\u9664",more:"\u66F4\u591A",pin:"\u7F6E\u9876",predict:"\u9884\u6D4B",predictTip:"AI\u9884\u6D4B\u8BE5\u8BC1\u5238\u6807\u7684",review:"\u590D\u76D8",reviewTip:"AI\u590D\u76D8\u8BE5\u8BC1\u5238\u6807\u7684",predictPromptPrefix:"\u8BF7\u9884\u6D4B ",predictPromptSuffix:"\uFF1A\u672A\u6765 5 \u4E2A\u4EA4\u6613\u65E5\u7684\u8D70\u52BF\u4E0E\u5173\u952E\u70B9\u4F4D\uFF0C\u8BF4\u660E\u4F9D\u636E\uFF0C\u5E76\u7ED9\u51FA\u5224\u65AD\u7684\u4E0D\u786E\u5B9A\u6027\u3002",reviewPromptPrefix:"\u8BF7\u590D\u76D8 ",reviewPromptSuffix:"\uFF1A\u4ECA\u65E5\u8D70\u52BF\u4E0E\u91CF\u4EF7\u3001\u8FD1 20 \u65E5\u8D8B\u52BF\u3001\u57FA\u7840\u9762\u3001\u6D88\u606F\u9762\uFF0C\u7ED9\u51FA\u7ED3\u8BBA\u548C\u5FC5\u8981\u98CE\u9669\u8BC4\u4F30\u3002",searching:"\u641C\u7D22\u4E2D\u2026",composingHint:"\u8F93\u5165\u5B8C\u6210\u540E\u81EA\u52A8\u641C\u7D22",clearInput:"\u6E05\u7A7A\u8F93\u5165",confirmTitle:"\u786E\u8BA4\u79FB\u9664\uFF1F",confirmDescPrefix:"\u786E\u5B9A\u5C06 ",confirmDescSuffix:" \u4ECE\u81EA\u9009\u4E2D\u79FB\u9664\u5417\uFF1F",confirmCancel:"\u53D6\u6D88",confirmOk:"\u786E\u8BA4\u79FB\u9664",truncated:"\u5019\u9009\u8D85\u8FC7 10 \u6761\uFF0C\u8BF7\u8F93\u5165\u51C6\u786E\u8BC1\u5238\u4EE3\u7801\u6216\u540D\u79F0\u3002",noHit:"\u6CA1\u6709\u5339\u914D\u7684\u6807\u7684\uFF08\u652F\u6301\u6CAA\u6DF1 A \u80A1 / \u6307\u6570 / \u573A\u5185 ETF\uFF09\u3002","error.invalid_query":"\u8F93\u5165\u4E0D\u88AB\u63A5\u53D7","error.not_found":"\u6CA1\u6709\u627E\u5230\u8BE5\u6807\u7684","error.ambiguous":"\u547D\u4E2D\u591A\u6761\uFF0C\u8BF7\u4ECE\u5019\u9009\u91CC\u9009\u4E00\u6761","error.list_full":"\u81EA\u9009\u80A1\u6700\u591A {max} \u6761\uFF0C\u5148\u5220\u4E00\u6761\u518D\u52A0","error.list_full_noMax":"\u81EA\u9009\u80A1\u5DF2\u8FBE\u4E0A\u9650\uFF0C\u5148\u5220\u4E00\u6761\u518D\u52A0","error.credential_missing":"\u672A\u914D\u7F6E Fuyao \u5BC6\u94A5\uFF1A\u5728\u300C\u63D2\u4EF6\u300D\u9875\u7684 Capital \u6A21\u5F0F\u5361\u7247\u91CC\u586B API Key","error.rate_limited":"\u884C\u60C5\u670D\u52A1\u9650\u6D41\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5","error.fuyao_unavailable":"\u884C\u60C5\u670D\u52A1\u6682\u65F6\u4E0D\u53EF\u7528\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5","error.quote_unavailable":"\u8BE5\u6807\u7684\u6CA1\u6709\u53EF\u7528\u62A5\u4EF7","error.refresh_timeout":"\u5237\u65B0\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5","error.store_unavailable":"\u81EA\u9009\u80A1\u5B58\u50A8\u4E0D\u53EF\u7528","error.unauthorized":"\u767B\u5F55\u72B6\u6001\u5DF2\u5931\u6548\uFF1A\u8BF7\u5148\u56DE\u5230\u5BBF\u4E3B\u7A97\u53E3\u91CD\u65B0\u767B\u5F55",errorSuffix:"\uFF08\u5176\u4ED6\u6807\u7684\u4ECD\u662F\u4E0A\u4E00\u6B21\u6210\u529F\u5FEB\u7167\uFF09"},aa={"command.label":"Watchlist","command.description":"Add / view / remove watched symbols",title:"Watchlist",close:"Close",searchPlaceholder:"Symbol code or Chinese name \u2014 A-share / index / ETF",add:"Add",added:"Added",refreshing:"Refreshing\u2026",refresh:"Refresh quotes",loading:"Loading list\u2026",empty:"No symbols yet \u2014 use the input above to add one.",colName:"Symbol",colQuote:"Last / change",colAction:"Actions",updated:"Updated",notRefreshed:"Not refreshed",stale:"last snapshot",noChangePct:"No change data yet",typeStock:"Stock",typeIndex:"Index",typeEtf:"ETF",remove:"Remove",more:"More",pin:"Pin to top",predict:"Predict",predictTip:"AI prediction for this symbol",review:"Review",reviewTip:"AI review of this symbol",predictPromptPrefix:"Predict ",predictPromptSuffix:" over the next 5 sessions: the likely path and key levels, the evidence behind the call, and how uncertain it is.",reviewPromptPrefix:"Review ",reviewPromptSuffix:" with today's trend and volume, the last 20 sessions, fundamental, news, then a conclusion and the necessary risks analysis.",searching:"Searching\u2026",composingHint:"Search runs when you finish typing",clearInput:"Clear input",confirmTitle:"Remove this symbol?",confirmDescPrefix:"Remove ",confirmDescSuffix:" from your watchlist?",confirmCancel:"Cancel",confirmOk:"Remove",truncated:"More than 10 candidates \u2014 enter the exact code or name.",noHit:"No matching symbol (A-share / index / on-exchange ETF).","error.invalid_query":"Input not accepted","error.not_found":"Symbol not found","error.ambiguous":"Multiple hits \u2014 pick one candidate","error.list_full":"Watchlist holds at most {max} symbols \u2014 remove one first","error.list_full_noMax":"Watchlist is full \u2014 remove one first","error.credential_missing":"No Fuyao API key: set it on the Capital card in the Plugins page","error.rate_limited":"Quote service is rate limited \u2014 try again later","error.fuyao_unavailable":"Quote service unavailable \u2014 try again later","error.quote_unavailable":"No quote for this symbol","error.refresh_timeout":"Refresh timed out \u2014 try again later","error.store_unavailable":"Watchlist storage unavailable","error.unauthorized":"Session expired \u2014 sign back in to the host first",errorSuffix:" (other symbols still show their last good snapshot)"},ta={"a-share":"typeStock","a-share-index":"typeIndex","fund-etf":"typeEtf"};function $(r,t){let a=ta[r];return a===void 0?String(r??""):t(a)}var ea=/[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F-\u009F\u00AD\u200B-\u200F\u2028\u2029\u202A-\u202E\u2060-\u2064\u2066-\u2069\uFEFF]/gu;function v(r){return String(r??"").replace(ea,"")}function g(r){return Array.isArray(r)?r.map(t=>t===null||typeof t!="object"?t:{...t,name:v(t.name)}):r}var ia={"a-share":"capital-watchlist-tag-stock","a-share-index":"capital-watchlist-tag-index","fund-etf":"capital-watchlist-tag-etf"},ra=`
8
+ "use strict";var{createElement:e,useEffect:j,useState:H}=require("react"),{createSnapshotStore:U}=require("@deepseek-ai/dsh-client-store"),{IconChecklistOutlineRegular:D,IconCloseOutlineRegular:k,IconEllipsisOutlineRegular:q,IconGoalOutlineRegular:F,IconListPenOutlineRegular:Q,IconPinOutlineRegular:L,IconRefreshOutlineRegular:K,IconSearchOutlineRegular:B,IconTrashOutlineRegular:Y,Menu:W,Modal:G}=require("@deepseek-ai/dsh-client-ui-primitives"),f="capital-watchlist",b="capital.watchlist",S="conversation.input.overlay",N="/capital-watchlist",J="capital-generation",V=300,_="capital-watchlist-css",X={"command.label":"\u81EA\u9009\u80A1","command.description":"\u6DFB\u52A0 / \u67E5\u770B / \u5220\u9664\u81EA\u9009\u80A1",title:"\u81EA\u9009\u80A1",close:"\u5173\u95ED",searchPlaceholder:"\u8F93\u5165\u8BC1\u5238\u4EE3\u7801\u6216\u540D\u79F0\uFF0C\u652F\u6301A\u80A1/\u6E2F\u80A1/\u7F8E\u80A1",add:"\u6DFB\u52A0",added:"\u5DF2\u6DFB\u52A0",refreshing:"\u5237\u65B0\u4E2D\u2026",refresh:"\u5237\u65B0\u62A5\u4EF7",loading:"\u6B63\u5728\u8BFB\u53D6\u6E05\u5355\u2026",empty:"\u8FD8\u6CA1\u6709\u81EA\u9009\u80A1\uFF0C\u7528\u4E0A\u9762\u7684\u8F93\u5165\u6846\u6DFB\u52A0\u3002",colName:"\u540D\u79F0",colQuote:"\u6700\u65B0\u4EF7 / \u6DA8\u8DCC\u5E45",colAction:"\u64CD\u4F5C",updated:"\u66F4\u65B0\u65F6\u95F4",notRefreshed:"\u672A\u5237\u65B0",stale:"\u4E0A\u4E00\u6B21\u5FEB\u7167",exchangeTime:"\u4EA4\u6613\u6240\u65F6\u95F4",noChangePct:"\u6682\u65E0\u6DA8\u8DCC\u6570\u636E",typeAShare:"A\u80A1",typeHkStock:"\u6E2F\u80A1",typeUsStock:"\u7F8E\u80A1",typeAIndex:"A\u6307",typeHkIndex:"\u6E2F\u6307",typeUsIndex:"\u7F8E\u6307",kindStock:"\u80A1\u7968",kindIndex:"\u6307\u6570",kindEtf:"ETF",remove:"\u79FB\u9664",more:"\u66F4\u591A",pin:"\u7F6E\u9876",predict:"\u9884\u6D4B",predictTip:"AI\u9884\u6D4B\u8BE5\u8BC1\u5238\u6807\u7684",review:"\u590D\u76D8",reviewTip:"AI\u590D\u76D8\u8BE5\u8BC1\u5238\u6807\u7684",predictPromptPrefix:"\u8BF7\u9884\u6D4B ",predictPromptSuffix:"\uFF1A\u672A\u6765 5 \u4E2A\u4EA4\u6613\u65E5\u7684\u8D70\u52BF\u4E0E\u5173\u952E\u70B9\u4F4D\uFF0C\u8BF4\u660E\u4F9D\u636E\uFF0C\u5E76\u7ED9\u51FA\u5224\u65AD\u7684\u4E0D\u786E\u5B9A\u6027\u3002",reviewPromptPrefix:"\u8BF7\u590D\u76D8 ",reviewPromptSuffix:"\uFF1A\u4ECA\u65E5\u8D70\u52BF\u4E0E\u91CF\u4EF7\u3001\u8FD1 20 \u65E5\u8D8B\u52BF\u3001\u57FA\u7840\u9762\u3001\u6D88\u606F\u9762\uFF0C\u7ED9\u51FA\u7ED3\u8BBA\u548C\u5FC5\u8981\u98CE\u9669\u8BC4\u4F30\u3002",searching:"\u641C\u7D22\u4E2D\u2026",composingHint:"\u8F93\u5165\u5B8C\u6210\u540E\u81EA\u52A8\u641C\u7D22",clearInput:"\u6E05\u7A7A\u8F93\u5165",confirmTitle:"\u786E\u8BA4\u79FB\u9664\uFF1F",confirmDescPrefix:"\u786E\u5B9A\u5C06 ",confirmDescSuffix:" \u4ECE\u81EA\u9009\u4E2D\u79FB\u9664\u5417\uFF1F",confirmCancel:"\u53D6\u6D88",confirmOk:"\u786E\u8BA4\u79FB\u9664",truncated:"\u5019\u9009\u4E0D\u6B62\u8FD9\u4E9B\uFF0C\u8BF7\u8F93\u5165\u66F4\u51C6\u786E\u7684\u8BC1\u5238\u4EE3\u7801\u6216\u540D\u79F0\u3002",noHit:"\u6CA1\u6709\u5339\u914D\u7684\u6807\u7684\uFF08A\u80A1 / \u6E2F\u80A1 / \u7F8E\u80A1\uFF0C\u542B\u6307\u6570\u4E0E\u573A\u5185\u57FA\u91D1\uFF09\u3002","error.invalid_query":"\u8F93\u5165\u4E0D\u88AB\u63A5\u53D7","error.not_found":"\u6CA1\u6709\u627E\u5230\u8BE5\u6807\u7684","error.ambiguous":"\u547D\u4E2D\u591A\u6761\uFF0C\u8BF7\u4ECE\u5019\u9009\u91CC\u9009\u4E00\u6761","error.list_full":"\u81EA\u9009\u80A1\u6700\u591A {max} \u6761\uFF0C\u5148\u5220\u4E00\u6761\u518D\u52A0","error.list_full_noMax":"\u81EA\u9009\u80A1\u5DF2\u8FBE\u4E0A\u9650\uFF0C\u5148\u5220\u4E00\u6761\u518D\u52A0","error.credential_missing":"\u672A\u914D\u7F6E Fuyao \u5BC6\u94A5\uFF1A\u5728\u300C\u63D2\u4EF6\u300D\u9875\u7684 Capital \u6A21\u5F0F\u5361\u7247\u91CC\u586B API Key\uFF08\u53EA\u5F71\u54CD A \u80A1\u90A3\u4E00\u8DEF\uFF0C\u6E2F\u7F8E\u80A1\u7167\u5E38\u7528\uFF09","error.rate_limited":"\u884C\u60C5\u670D\u52A1\u9650\u6D41\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5","error.fuyao_unavailable":"A \u80A1\u884C\u60C5\u6682\u65F6\u53D6\u4E0D\u5230\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5","error.tencent_unavailable":"\u6E2F\u7F8E\u80A1\u884C\u60C5\u6682\u65F6\u53D6\u4E0D\u5230\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5","error.quote_unavailable":"\u8BE5\u6807\u7684\u6CA1\u6709\u53EF\u7528\u62A5\u4EF7","error.refresh_timeout":"\u5237\u65B0\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5","error.store_unavailable":"\u81EA\u9009\u80A1\u5B58\u50A8\u4E0D\u53EF\u7528","error.unauthorized":"\u767B\u5F55\u72B6\u6001\u5DF2\u5931\u6548\uFF1A\u8BF7\u5148\u56DE\u5230\u5BBF\u4E3B\u7A97\u53E3\u91CD\u65B0\u767B\u5F55",errorSuffix:"\uFF08\u5176\u4ED6\u6807\u7684\u4ECD\u662F\u4E0A\u4E00\u6B21\u6210\u529F\u5FEB\u7167\uFF09","partial.a-share":"A \u80A1\u68C0\u7D22\u4E0D\u53EF\u7528\uFF1A","partial.hk":"\u6E2F\u80A1\u68C0\u7D22\u4E0D\u53EF\u7528\uFF1A","partial.us":"\u7F8E\u80A1\u68C0\u7D22\u4E0D\u53EF\u7528\uFF1A"},Z={"command.label":"Watchlist","command.description":"Add / view / remove watched symbols",title:"Watchlist",close:"Close",searchPlaceholder:"Symbol code or name \u2014 A-share / HK / US",add:"Add",added:"Added",refreshing:"Refreshing\u2026",refresh:"Refresh quotes",loading:"Loading list\u2026",empty:"No symbols yet \u2014 use the input above to add one.",colName:"Symbol",colQuote:"Last / change",colAction:"Actions",updated:"Updated",notRefreshed:"Not refreshed",stale:"last snapshot",exchangeTime:"exchange time",noChangePct:"No change data yet",typeAShare:"A-Share",typeHkStock:"HK",typeUsStock:"US",typeAIndex:"A-Index",typeHkIndex:"HK-Index",typeUsIndex:"US-Index",kindStock:"stock",kindIndex:"index",kindEtf:"ETF",remove:"Remove",more:"More",pin:"Pin to top",predict:"Predict",predictTip:"AI prediction for this symbol",review:"Review",reviewTip:"AI review of this symbol",predictPromptPrefix:"Predict ",predictPromptSuffix:" over the next 5 sessions: the likely path and key levels, the evidence behind the call, and how uncertain it is.",reviewPromptPrefix:"Review ",reviewPromptSuffix:" with today's trend and volume, the last 20 sessions, fundamental, news, then a conclusion and the necessary risks analysis.",searching:"Searching\u2026",composingHint:"Search runs when you finish typing",clearInput:"Clear input",confirmTitle:"Remove this symbol?",confirmDescPrefix:"Remove ",confirmDescSuffix:" from your watchlist?",confirmCancel:"Cancel",confirmOk:"Remove",truncated:"More candidates exist than shown \u2014 enter a more exact code or name.",noHit:"No matching symbol (A-share / HK / US, including indices and listed funds).","error.invalid_query":"Input not accepted","error.not_found":"Symbol not found","error.ambiguous":"Multiple hits \u2014 pick one candidate","error.list_full":"Watchlist holds at most {max} symbols \u2014 remove one first","error.list_full_noMax":"Watchlist is full \u2014 remove one first","error.credential_missing":"No Fuyao API key: set it on the Capital card in the Plugins page (A-share quotes only \u2014 HK and US keep working)","error.rate_limited":"Quote service is rate limited \u2014 try again later","error.fuyao_unavailable":"A-share quotes unavailable \u2014 try again later","error.tencent_unavailable":"HK / US quotes unavailable \u2014 try again later","error.quote_unavailable":"No quote for this symbol","error.refresh_timeout":"Refresh timed out \u2014 try again later","error.store_unavailable":"Watchlist storage unavailable","error.unauthorized":"Session expired \u2014 sign back in to the host first",errorSuffix:" (other symbols still show their last good snapshot)","partial.a-share":"A-share search unavailable: ","partial.hk":"HK search unavailable: ","partial.us":"US search unavailable: "},aa={"a-share":"typeAShare","hk-stock":"typeHkStock","us-stock":"typeUsStock","a-share-index":"typeAIndex","hk-index":"typeHkIndex","us-index":"typeUsIndex","fund-etf":"typeAShare"},ta={"a-share":"kindStock","hk-stock":"kindStock","us-stock":"kindStock","a-share-index":"kindIndex","hk-index":"kindIndex","us-index":"kindIndex","fund-etf":"kindEtf"};function ea(r,t){let a=aa[r];return a===void 0?String(r??""):t(a)}function ia(r,t){let a=ta[r];return a===void 0?String(r??""):t(a)}var ra=/[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F-\u009F\u00AD\u200B-\u200F\u2028\u2029\u202A-\u202E\u2060-\u2064\u2066-\u2069\uFEFF]/gu;function y(r){return String(r??"").replace(ra,"")}function g(r){return Array.isArray(r)?r.map(t=>t===null||typeof t!="object"?t:{...t,name:y(t.name)}):r}var la={"a-share":"capital-watchlist-tag-cn","a-share-index":"capital-watchlist-tag-cn","fund-etf":"capital-watchlist-tag-cn","hk-stock":"capital-watchlist-tag-hk","hk-index":"capital-watchlist-tag-hk","us-stock":"capital-watchlist-tag-us","us-index":"capital-watchlist-tag-us"},sa=`
9
9
  /* \u5BBD 420 / \u5706\u89D2 18 / \u65E0\u5185\u8FB9\u8DDD\uFF08\u5185\u8FB9\u8DDD\u4F4F\u5728\u5404\u6BB5\u81EA\u5DF1\u5934\u4E0A\uFF0C\u597D\u8BA9\u8868\u5934\u4E0E\u5206\u9694\u7EBF\u5BF9\u9F50\uFF09\u3002
10
10
  \u9650\u9AD8\u6309\u5B98\u65B9\u53E3\u5F84\u8D70 max-height: 100%\uFF08\u5BF9 .root \u7684 padding box\uFF09\uFF0C\u4E0D\u81EA\u5DF1\u7B97 vh\u3002 */
11
11
  .capital-watchlist-dialog.capital-watchlist-dialog { width: min(420px, 92vw); max-height: 100%; padding: 0; gap: 0; border-radius: 18px; }
@@ -57,9 +57,15 @@ window.__ModuleLoader__.load({
57
57
  /* \u7C7B\u578B\u5FBD\u6807 = \u5B98\u65B9\u72B6\u6001\u5FBD\u6807\u90A3\u5BF9\u5199\u6CD5\uFF1A\u5E95\u8272\u7528 state-*-tertiary\uFF08\u4E3B\u9898\u5305\u4E3A"\u72B6\u6001\u8272\u7684\u5E95"\u51C6\u5907\u7684\u5B9E\u5FC3\u6863\uFF0C
58
58
  \u81EA\u5DF1 color-mix \u51FA\u6765\u7684\u900F\u660E\u6863\u538B\u5728\u767D\u5361\u7247\u4E0A\u7B49\u4E8E\u6CA1\u6DF7\uFF09\uFF0C\u6587\u5B57\u7528\u540C\u8272\u7CFB primary\uFF1B
59
59
  amber \u4F8B\u5916\u8D70 warn-label\u2014\u2014warn-primary \u538B\u767D\u5E95\u53EA\u6709 2:1\uFF0C\u5B98\u65B9"\u72B6\u6001\u8272\u5F53\u6587\u5B57"\u53E6\u6709 label \u4E00\u6863\u3002 */
60
- .capital-watchlist-tag-index { color: var(--dsw-alias-state-business-primary); background: var(--dsw-alias-state-business-tertiary); }
61
- .capital-watchlist-tag-stock { color: var(--dsw-alias-state-warn-label); background: var(--dsw-alias-state-warn-tertiary); }
62
- .capital-watchlist-tag-etf { color: var(--dsw-alias-state-success-primary); background: var(--dsw-alias-state-success-tertiary); }
60
+ /* \u4E09\u6863\u5FBD\u6807\u6309**\u5E02\u573A**\u914D\u8272\uFF0C\u53D6\u7684\u662F"\u949E\u7968\u7684\u4E3B\u8272"\u8FD9\u628A\u76F4\u89C9\uFF1A\u4EBA\u6C11\u5E01=\u7EA2\u3001\u6E2F\u5E01=\u91D1\u7425\u73C0\u3001\u7F8E\u5143=\u7EFF
61
+ \uFF082026-10-07 \u7528\u6237\u70B9\u540D\uFF0C\u5E76\u660E\u786E\u7EFF\u90A3\u4E00\u6863"\u548C\u7F8E\u5143\u5F88\u50CF"\uFF09\u3002\u80A1\u7968\u4E0E\u6307\u6570\u540C\u5E02\u540C\u8272\uFF0C\u54C1\u79CD\u53EA\u7531\u6587\u5B57\u5206\u3002
62
+ \u26A0\uFE0F \u7EA2\u6863\u4E0E"\u7EA2\u6DA8"\u90A3\u9897\u7EA2\u662F\u4E24\u79CD\u4E1C\u897F\uFF1A\u5FBD\u6807\u662F\u6574\u884C\u56FA\u5B9A\u7684\u5E95\uFF0C\u4EF7\u683C\u53EA\u5728\u6DA8\u8DCC\u65F6\u4E0A\u8272\u3002
63
+ state-*-tertiary \u662F\u4E3B\u9898\u5305\u7ED9\u72B6\u6001\u8272\u51C6\u5907\u7684**\u5B9E\u5FC3\u5E95**\uFF1Berror \u90A3\u4E00\u65CF\u7684 tertiary \u672C\u4ED3\u4ECE\u672A\u7528\u8FC7\u3001
64
+ \u65E0\u6CD5\u5728\u6B64\u786E\u8BA4\u5B58\u5728\uFF0C\u4E8E\u662F\u7ED9\u4E00\u6761 color-mix \u515C\u5E95\u2014\u2014\u731C\u9519 token \u7684\u75C7\u72B6\u662F"\u5E95\u8272\u6CA1\u4E86"\uFF0C\u4E0D\u4F1A\u62A5\u9519\u3002
65
+ \u26A0\uFE0F \u8FD9\u6BB5 CSS \u4F4F\u5728\u6A21\u677F\u5B57\u7B26\u4E32\u91CC\uFF1A\u6CE8\u91CA\u91CC\u4E0D\u8BB8\u51FA\u73B0\u53CD\u5F15\u53F7\uFF0C\u51FA\u73B0\u5C31\u628A\u6574\u6BB5\u6837\u5F0F\u622A\u65AD\uFF08\u672C\u8F6E\u8E29\u8FC7\uFF09\u3002 */
66
+ .capital-watchlist-tag-cn { color: var(--dsw-alias-state-error-primary); background: var(--dsw-alias-state-error-tertiary, color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, transparent)); }
67
+ .capital-watchlist-tag-hk { color: var(--dsw-alias-state-warn-label); background: var(--dsw-alias-state-warn-tertiary); }
68
+ .capital-watchlist-tag-us { color: var(--dsw-alias-state-success-primary); background: var(--dsw-alias-state-success-tertiary); }
63
69
  /* \u8868\u5934\u4E0E\u6570\u636E\u884C\u5171\u7528\u540C\u4E00\u4E2A grid \u5B9A\u4E49\uFF1A\u5BBD\u5EA6\u53EA\u5728\u8FD9\u4E00\u5904\uFF0C\u4E24\u5904\u5404\u81EA\u6392\u7248\u5C31\u4F1A\u4E32\u884C\uFF08\u5B9E\u673A\u8E29\u8FC7\uFF09\u3002
64
70
  \u4E09\u5217\uFF1A\u540D\u79F0\uFF08\u7B2C\u4E8C\u884C\u662F\u300C\u4EE3\u7801 \xB7 \u5FBD\u6807\u300D\uFF09/ \u62A5\u4EF7 / \u300C\u64CD\u4F5C\u300D\u90A3\u4E00\u7C07\uFF08\u300C\u9884\u6D4B\u300D\u300C\u590D\u76D8\u300D\u300C\u66F4\u591A\u300D\u4E09\u679A\uFF09\u3002
65
71
  92px \u4E0E 84px \u5FC5\u987B\u662F**\u5B9A\u503C**\uFF1A\u8868\u5934\u4E0E\u6570\u636E\u884C\u662F\u4E24\u4E2A\u72EC\u7ACB\u7684 grid \u5BB9\u5668\uFF0C\u53EA\u6709\u5B9A\u503C\u624D\u8BA9\u4E24\u884C\u7684\u5217\u8FB9\u7EBF\u5BF9\u9F50\uFF1B
@@ -81,8 +87,8 @@ window.__ModuleLoader__.load({
81
87
  .capital-watchlist-row:hover { background: var(--dsw-alias-interactive-bg-hover); }
82
88
  .capital-watchlist-namewrap { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
83
89
  .capital-watchlist-name { font-size: 14px; font-weight: 500; color: var(--dsw-alias-label-primary); overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
84
- /* \u4EE3\u7801\u4E0E\u7C7B\u578B\u5FBD\u6807\u540C\u5904\u7B2C\u4E8C\u884C\uFF1Agap \u662F\u8FD9\u4E00\u5BF9\u552F\u4E00\u7684\u95F4\u8DDD\u6765\u6E90\uFF0C\u5FBD\u6807\u81EA\u5E26\u5185\u8FB9\u8DDD\uFF0C\u522B\u518D\u5404\u5199 margin\u3002 */
85
- .capital-watchlist-codeline { display: flex; align-items: center; gap: 6px; min-width: 0; }
90
+ /* \u4EE3\u7801\u4E0E\u7C7B\u578B\u5FBD\u6807\u540C\u5904\u7B2C\u4E8C\u884C\uFF082026-10-07 \u8D77\u8FD9\u4E00\u884C\u5C31\u8FD9\u4E24\u6837\uFF0C\u5E01\u79CD\u4E0D\u8FDB\u9762\u677F\uFF09\uFF1Agap \u662F\u8FD9\u4E00\u5BF9\u552F\u4E00\u7684\u95F4\u8DDD\u6765\u6E90\uFF0C\u5FBD\u6807\u81EA\u5E26\u5185\u8FB9\u8DDD\uFF0C\u522B\u518D\u5404\u5199 margin\u300210px \u4E0E\u5019\u9009\u884C capital-watchlist-option \u90A3\u6761 gap \u540C\u503C\u2014\u2014\u540C\u4E00\u4EF6\u4E8B\u7684\u4E24\u79CD\u6392\u6CD5\uFF0C\u4E0D\u8BE5\u4E00\u5904\u7D27\u4E00\u5904\u677E\uFF1B6px \u5728\u5B9E\u673A\u4E0A\u8BFB\u8D77\u6765\u662F"\u8D34\u7740"\uFF082026-10-07 \u7528\u6237\u70B9\u540D\uFF09\u3002 */
91
+ .capital-watchlist-codeline { display: flex; align-items: center; gap: 10px; min-width: 0; }
86
92
  .capital-watchlist-code { font-size: 11px; color: var(--dsw-alias-label-tertiary); overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
87
93
  /* \u6700\u65B0\u4EF7\u5728\u4E0A\u3001\u6DA8\u8DCC\u5E45\u5728\u4E0B\uFF0C\u53F3\u5BF9\u9F50\uFF1A\u4E24\u884C\u90FD\u540C\u4E00\u5217\u91CC\u6392\uFF0C\u5217\u5BBD\u624D\u4E0D\u9700\u8981\u8DDF\u7740\u6DA8\u8DCC\u4F4D\u6570\u6296\u3002
88
94
  padding-right \u662F**\u6570\u5B57\u4E0E\u52A8\u4F5C\u533A\u4E4B\u95F4\u90A3\u53E3\u6C14\u7684\u552F\u4E00\u6765\u6E90**\uFF082026-10-01 \u7528\u6237\u70B9\u540D\uFF1A\u62A5\u4EF7\u548C\u9884\u6D4B/\u590D\u76D8\u592A\u8FD1\uFF0C
@@ -175,8 +181,8 @@ window.__ModuleLoader__.load({
175
181
  .capital-watchlist-confirmbtn:hover { background: var(--dsw-alias-interactive-bg-hover-accent); }
176
182
  .capital-watchlist-confirmdanger { border: 1px solid color-mix(in srgb, var(--dsw-alias-state-error-primary) 25%, transparent); background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 15%, transparent); color: var(--dsw-alias-state-error-primary); }
177
183
  .capital-watchlist-confirmdanger:hover { background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 25%, transparent); }
178
- `;function la(){let r=globalThis.document;if(!r||typeof r.createElement!="function"||r.querySelector(`style[data-${S}]`))return;let t=r.createElement("style");t.setAttribute(`data-${S}`,""),t.textContent=ra;let a=r.head??r.body;if(!(a===void 0||typeof a.appendChild!="function"))return a.appendChild(t),()=>t.remove()}async function f(r,{query:t,body:a,signal:s}={}){let i=t!==void 0?`${_}${r}?${t}`:`${_}${r}`,p=a===void 0?{method:"GET",cache:"no-store",credentials:"same-origin",signal:s}:{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(a),credentials:"same-origin",signal:s},n=await fetch(i,p),o=await n.text(),c={};try{c=o.length>0?JSON.parse(o):{}}catch{c={}}if(n.ok===!0&&c.ok===!0)return c;let d=typeof c.code=="string"&&c.code.length>0?c.code:n.status===401||n.status===403?"unauthorized":"fuyao_unavailable",u=new Error(d);throw u.code=d,u.candidates=c.candidates,u.limit=c.limit,u}var E=()=>({open:!1,loading:!1,refreshing:!1,searching:!1,items:[],candidates:[],truncated:!1,query:"",dropdownOpen:!1,rowMenu:null,pendingRemove:null,refreshed_at:null,error:null,searchError:null,addError:null,loadError:null,failures:{},composing:!1,pendingSearch:!1}),y=class{constructor(){this.store=D(E()),this.searchController=null,this.timer=null,this.pending=null,this.lastQuery=null}get state(){return this.store}get snapshot(){return this.store.getSnapshot()}patch(t){this.store.update(a=>Object.assign(a,t))}open(){this.patch({...E(),open:!0,loading:!0}),this.load().then(()=>this.refresh(),()=>this.patch({loading:!1}))}close(){this.timer!==null&&clearTimeout(this.timer),this.searchController!==null&&this.searchController.abort(),this.lastQuery=null,this.patch({open:!1,rowMenu:null,composing:!1,pendingSearch:!1})}async load(){try{let t=await f("/list");this.patch({items:g(t.items)??[],seeded_at:t.seeded_at,loading:!1,loadError:null})}catch(t){throw this.patch({loading:!1,loadError:{code:t.code??"fuyao_unavailable"}}),t}}refresh(){if(this.pending!==null)return this.pending;this.patch({refreshing:!0});let t=f("/refresh",{body:{}}).then(a=>{let s={};for(let p of a.failures??[])s[p.thscode]=p.code;let i=g(a.items)??this.snapshot.items;this.patch({items:i,refreshed_at:a.refreshed_at??this.snapshot.refreshed_at,failures:s,error:a.error?{code:a.error.code,partial:i.length>0&&i.some(p=>s[p.thscode]===void 0)}:null})}).catch(a=>{this.patch({error:{code:a.code??"fuyao_unavailable",partial:this.snapshot.items.some(s=>s.quote!==null)}})}).finally(()=>{this.patch({refreshing:!1}),this.pending=null});return this.pending=t,t}onQueryChange(t,a){let s=t.trim(),i=a===void 0?this.snapshot.composing===!0:a===!0;if(this.patch({query:t,searchError:null,composing:i,dropdownOpen:s.length>0}),this.timer!==null&&clearTimeout(this.timer),s.length===0){this.searchController!==null&&this.searchController.abort(),this.lastQuery=null,this.patch({candidates:[],truncated:!1,searching:!1,pendingSearch:!1});return}s===this.lastQuery&&this.snapshot.pendingSearch===!1||(this.patch({candidates:[],truncated:!1,pendingSearch:!i}),i!==!0&&(this.timer=setTimeout(()=>this.search(s),X)))}beginComposition(){this.timer!==null&&clearTimeout(this.timer),this.patch({composing:!0})}endComposition(t){this.onQueryChange(t,!1)}hideDropdown(){this.patch({dropdownOpen:!1})}toggleRowMenu(t){this.patch({rowMenu:this.snapshot.rowMenu===t?null:t})}closeRowMenu(){this.snapshot.rowMenu!==null&&this.patch({rowMenu:null})}setPendingRemove(t){this.patch({pendingRemove:t??null})}async search(t){this.lastQuery=t,this.searchController!==null&&this.searchController.abort();let a=new AbortController;this.searchController=a,this.patch({searching:!0,searchError:null});let s=()=>this.snapshot.query.trim()===t;try{let i=await f("/search",{query:`q=${encodeURIComponent(t)}`,signal:a.signal});if(!s()){this.patch({searching:!1});return}this.patch({candidates:g(i.items)??[],truncated:i.truncated===!0,searching:!1,pendingSearch:!1})}catch(i){if(i.name==="AbortError"||(this.lastQuery===t&&(this.lastQuery=null),!s()))return;this.patch({candidates:[],truncated:!1,searching:!1,pendingSearch:!1,searchError:{code:i.code??"fuyao_unavailable"}})}}async add(t){try{await f("/add",{body:{thscode:t.thscode}})}catch(s){this.patch({addError:{code:s.code??"fuyao_unavailable",candidates:s.candidates,limit:s.limit}}),s.candidates!==void 0&&this.patch({candidates:s.candidates,truncated:!1});return}this.patch({addError:null,candidates:[],query:"",dropdownOpen:!1,pendingSearch:!1}),this.lastQuery=null,await this.load().catch(()=>{}),await this.refresh();let a=this.snapshot.items.find(s=>s.thscode===t.thscode);a!==void 0&&a.quote===null&&this.snapshot.failures[t.thscode]===void 0&&await this.refresh()}async remove(t){let a=this.snapshot.items;this.patch({items:a.filter(s=>s.thscode!==t),rowMenu:null});try{await f("/remove",{body:{thscode:t}}),this.snapshot.addError?.code==="list_full"&&this.patch({addError:null})}catch{this.patch({items:a})}}async pin(t){let a=this.snapshot.items,s=a.find(i=>i.thscode===t);if(s!==void 0){this.patch({items:[s,...a.filter(i=>i.thscode!==t)],rowMenu:null});try{let i=await f("/pin",{body:{thscode:t}});Array.isArray(i.items)&&this.patch({items:g(i.items)})}catch{this.patch({items:a})}}}async copyToClipboard(){let t=this.snapshot.items.map(a=>[a.thscode,v(a.name),a.asset_type,a.quote?.price??"",a.quote?.change_pct??"",a.quote?.captured_at??""].join(" ")).join(`
179
- `);return await navigator.clipboard.writeText(t),t}dispose(){this.timer!==null&&clearTimeout(this.timer),this.searchController!==null&&this.searchController.abort()}};function P(r){if(typeof r!="number"||!Number.isFinite(r))return"";let t=new Date(r),a=s=>String(s).padStart(2,"0");return`${a(t.getMonth()+1)}-${a(t.getDate())} ${a(t.getHours())}:${a(t.getMinutes())}`}function C({assetType:r,t}){return e("span",{className:`capital-watchlist-tag ${ia[r]??"capital-watchlist-tag-stock"}`},$(r,t))}function sa(r,t,a){let s=v(r.name);return`${t(`${a}PromptPrefix`)}${s} (${r.thscode} \xB7 ${$(r.asset_type,t)})${t(`${a}PromptSuffix`)}`}function na({quote:r,failureCode:t,refreshing:a,t:s}){let i=t!==void 0;if(r==null)return a===!0?e("div",{className:"capital-watchlist-quote"},e("span",{className:"capital-watchlist-skeleton capital-watchlist-skeleton-price"}),e("span",{className:"capital-watchlist-skeleton capital-watchlist-skeleton-change"})):i?e("div",{className:"capital-watchlist-quote",title:s(`error.${t}`)},e("div",{className:"capital-watchlist-price capital-watchlist-quotefailed"},"\u2014")):e("div",{className:"capital-watchlist-quote"},e("div",{className:"capital-watchlist-price"},s("notRefreshed")));let p=typeof r.change_pct=="number"&&Number.isFinite(r.change_pct),n=p?`${r.change_pct>0?"+":""}${r.change_pct.toFixed(2)}%`:"\u2014",o=i?"capital-watchlist-stale":p?r.change_pct>0?"capital-watchlist-up":r.change_pct<0?"capital-watchlist-down":"capital-watchlist-flat":"capital-watchlist-nodata";return e("div",{className:"capital-watchlist-quote",title:i?`${s(`error.${t}`)} \xB7 ${s("stale")} ${P(r.captured_at)}`:p?void 0:s("noChangePct")},e("div",{className:i?"capital-watchlist-price capital-watchlist-stale":"capital-watchlist-price"},r.price.toFixed(2)),e("div",{className:`capital-watchlist-change ${o}`},n))}function oa(r,t){if(t.code!=="list_full")return r(`error.${t.code}`);let a=t.limit;return typeof a!="number"||!Number.isFinite(a)?r("error.list_full_noMax"):r("error.list_full").replace("{max}",String(a))}function ca({useDialog:r,surface:t,t:a,inputActions:s}){let i=r(l=>l),[p,n]=q(!1),o=i.pendingRemove??null;if(F(()=>()=>t.dispose(),[t]),!i.open)return null;let c=i.dropdownOpen===!0,d=o!==null,u=l=>{if(l.key==="Escape"){if(d){l.stopPropagation(),t.setPendingRemove(null);return}c&&(l.stopPropagation(),t.hideDropdown())}},R=l=>{if(!c)return;let h=l.relatedTarget;h!=null&&l.currentTarget?.contains?.(h)===!0||t.hideDropdown()},w=i.error,T=w==null?null:e("p",{className:"capital-watchlist-notice",role:"alert","data-code":w.code},`${a(`error.${w.code}`)}${w.partial===!0?a("errorSuffix"):""}`),x=(l,h)=>{s.insertText(sa(l,a,h),s.captureInsertion())===!0&&t.close()},z=c?e("div",{className:"capital-watchlist-dropdown",role:"listbox","aria-label":a("title"),"data-menu-material":"translucent"},i.candidates.map(l=>e("button",{key:l.thscode,type:"button",role:"option",className:"capital-watchlist-option",title:l.in_list===!0?a("added"):a("add"),disabled:l.in_list===!0||p,onClick:()=>{n(!0),t.add(l).finally(()=>n(!1))}},e("span",{className:"capital-watchlist-optionmain"},e("span",{className:"capital-watchlist-optionname"},l.name),e("span",{className:"capital-watchlist-optioncode"},l.in_list===!0?`${l.ticker} \xB7 ${a("added")}`:l.ticker)),e(C,{assetType:l.asset_type,t:a}))),i.composing===!0?e("div",{className:"capital-watchlist-hint"},a("composingHint")):i.searching===!0||i.pendingSearch===!0?e("div",{className:"capital-watchlist-hint"},a("searching")):i.searchError!==null&&i.searchError!==void 0?e("div",{className:"capital-watchlist-hint capital-watchlist-searcherror",role:"alert","data-code":i.searchError.code},a(`error.${i.searchError.code}`)):i.candidates.length===0?e("div",{className:"capital-watchlist-hint"},a("noHit")):null,i.truncated?e("div",{className:"capital-watchlist-hint"},a("truncated")):null):null,I=i.items.length===0?null:e("div",{className:"capital-watchlist-grid capital-watchlist-head"},e("span",null,a("colName")),e("span",{className:"capital-watchlist-quote"},a("colQuote")),e("span",{className:"capital-watchlist-headaction"},a("colAction"))),M=i.loadError!==null&&i.loadError!==void 0?e("p",{className:"capital-watchlist-empty capital-watchlist-loaderror",role:"alert","data-code":i.loadError.code},a(`error.${i.loadError.code}`)):e("p",{className:"capital-watchlist-empty"},a("empty")),A=i.loading?e("p",{className:"capital-watchlist-empty"},a("loading")):i.items.length===0?M:e("div",{className:c?"capital-watchlist-list capital-watchlist-list-open":"capital-watchlist-list"},i.items.map((l,h)=>e("div",{key:l.thscode,className:"capital-watchlist-grid capital-watchlist-row","data-thscode":l.thscode},e("span",{className:"capital-watchlist-namewrap"},e("span",{className:"capital-watchlist-name",title:`${l.name} ${l.ticker}`},l.name),e("span",{className:"capital-watchlist-codeline"},e("span",{className:"capital-watchlist-code"},l.ticker),e(C,{assetType:l.asset_type,t:a}))),e(na,{quote:l.quote,failureCode:i.failures[l.thscode],refreshing:i.refreshing,t:a}),e("span",{className:"capital-watchlist-rowactions"},e("button",{type:"button",className:"capital-watchlist-predict",disabled:p,title:a("predictTip"),"aria-label":`${a("predict")} ${l.name}`,onClick:()=>x(l,"predict")},e(H,{size:14})),e("button",{type:"button",className:"capital-watchlist-review",disabled:p,title:a("reviewTip"),"aria-label":`${a("review")} ${l.name}`,onClick:()=>x(l,"review")},e(B,{size:14})),e(K,{open:i.rowMenu===l.thscode,anchor:e("button",{type:"button",className:"capital-watchlist-more",disabled:p,title:a("more"),"aria-label":`${a("more")} ${l.name}`,"aria-haspopup":"menu","aria-expanded":i.rowMenu===l.thscode,onClick:()=>t.toggleRowMenu(l.thscode)},e(L,{size:14})),items:[{id:"pin",label:a("pin"),icon:e(U,{size:14}),disabled:h===0},{id:"remove",label:a("remove"),icon:e(G,{size:14}),danger:!0}],onSelect:j=>{t.closeRowMenu(),j==="pin"?t.pin(l.thscode):t.setPendingRemove(l)},onClose:()=>t.closeRowMenu(),align:"end",portal:!0,className:"capital-watchlist-actions"}))))),O=e("div",{className:d?"capital-watchlist-confirm capital-watchlist-confirm-open":"capital-watchlist-confirm","aria-hidden":d?void 0:"true"},e("div",{className:"capital-watchlist-confirmbox",role:d?"alertdialog":void 0,"aria-label":a("confirmTitle")},e("div",{className:"capital-watchlist-confirmtitle"},a("confirmTitle")),d?e("p",{className:"capital-watchlist-confirmdesc"},a("confirmDescPrefix"),e("strong",null,`${o.name} \xB7 ${o.ticker}`),a("confirmDescSuffix")):null,e("div",{className:"capital-watchlist-confirmactions"},e("button",{type:"button",className:"capital-watchlist-confirmbtn",onClick:()=>t.setPendingRemove(null)},a("confirmCancel")),e("button",{type:"button",className:"capital-watchlist-confirmbtn capital-watchlist-confirmdanger",onClick:()=>{let l=o;t.setPendingRemove(null),l!==null&&t.remove(l.thscode)}},a("confirmOk")))));return e(J,{open:!0,onClose:()=>t.close(),title:a("title"),headless:!0,shortcutModal:"watchlist",className:"capital-watchlist-dialog"},e("div",{className:"capital-watchlist-card",onKeyDown:u},e("div",{className:"capital-watchlist-header"},e("h2",{className:"capital-watchlist-title"},a("title")),e("button",{type:"button",className:"capital-watchlist-close","aria-label":a("close"),onClick:()=>t.close()},e(k,{size:14}))),e("div",{className:"capital-watchlist-search",onBlur:R},e("div",{className:"capital-watchlist-field"},e("span",{className:"capital-watchlist-searchicon"},e(W,{size:16})),e("input",{className:"capital-watchlist-input","data-modal-autofocus":!0,value:i.query,placeholder:a("searchPlaceholder"),onChange:l=>t.onQueryChange(l.target.value,l.isComposing),onCompositionStart:()=>t.beginComposition(),onCompositionEnd:l=>t.endComposition(l.target.value)}),i.query.length>0?e("button",{type:"button",className:"capital-watchlist-clear",title:a("clearInput"),"aria-label":a("clearInput"),onMouseDown:l=>l.preventDefault(),onClick:()=>t.onQueryChange("",!1)},e(k,{size:12})):null),z),i.addError!==null&&i.addError!==void 0?e("p",{className:"capital-watchlist-adderror",role:"status","data-code":i.addError.code},oa(a,i.addError)):null,I,A,e("div",{className:"capital-watchlist-footer"},e("div",{className:"capital-watchlist-footcol"},e("button",{type:"button",className:"capital-watchlist-refresh",disabled:i.refreshing||p,onClick:()=>{t.refresh()}},e(Y,{size:14}),i.refreshing?a("refreshing"):a("refresh")),T),e("span",{className:"capital-watchlist-updated"},`${a("updated")} ${i.refreshed_at===null||i.refreshed_at===void 0?a("notRefreshed"):P(i.refreshed_at)}`)),O))}function pa(r){r.effect(la,`${m}: styles`),r.effect(()=>r.locale.register(b,{zh:Z,en:aa}),`${m}: dictionaries`);let t=new Map,a=n=>{let o=t.get(n);return o===void 0&&(o=new y,t.set(n,o)),o};r.effect(()=>()=>{for(let n of t.values())n.dispose();t.clear()},`${m}: per-session surfaces`);let s=n=>{let c=r.sessions?.list?.getSnapshot?.().byId?.[n]?.projectionValues?.agentPreset;return typeof c=="string"?c:void 0},i=new Set,p=n=>{let o=s(n);return o!==void 0?o===V:(i.has(n)||(i.add(n),Promise.resolve(r.sessions?.refreshProjections?.(n)).catch(()=>{})),!1)};r.slots.inject(N,()=>r.slots.register({name:N,id:"capital-watchlist-dialog",order:3,locale:b,inject:n=>{let o=a(n);return{hooks:{dialog:o.state},surface:o}}},ca)),r.inject(["commandUi"],n=>{let o=r.locale.bind(b);n.effect(()=>n.commandUi.register({name:"watchlist",label:()=>o("command.label"),description:()=>o("command.description"),icon:Q,available:c=>p(c.sessionId),ui:{kind:"action",run:c=>{a(c.sessionId).open()}}}),`${m}: /watchlist contribution`)}),r.logger?.info?.(`${m}: \u5BA2\u6237\u7AEF\u534A\u8FB9\u5DF2\u6302\u8F7D\uFF08/watchlist \u83DC\u5355\u884C + \u81EA\u9009\u80A1\u5F39\u7A97\uFF09`)}exports.name=m;exports.inject=["slots","locale","commandUi","sessions"];exports.apply=pa;
184
+ `;function na(){let r=globalThis.document;if(!r||typeof r.createElement!="function"||r.querySelector(`style[data-${_}]`))return;let t=r.createElement("style");t.setAttribute(`data-${_}`,""),t.textContent=sa;let a=r.head??r.body;if(!(a===void 0||typeof a.appendChild!="function"))return a.appendChild(t),()=>t.remove()}async function m(r,{query:t,body:a,signal:s}={}){let i=t!==void 0?`${N}${r}?${t}`:`${N}${r}`,p=a===void 0?{method:"GET",cache:"no-store",credentials:"same-origin",signal:s}:{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(a),credentials:"same-origin",signal:s},n=await fetch(i,p),o=await n.text(),c={};try{c=o.length>0?JSON.parse(o):{}}catch{c={}}if(n.ok===!0&&c.ok===!0)return c;let d=typeof c.code=="string"&&c.code.length>0?c.code:n.status===401||n.status===403?"unauthorized":"fuyao_unavailable",u=new Error(d);throw u.code=d,u.candidates=c.candidates,u.limit=c.limit,u}var C=()=>({open:!1,loading:!1,refreshing:!1,searching:!1,items:[],candidates:[],truncated:!1,query:"",dropdownOpen:!1,rowMenu:null,pendingRemove:null,refreshed_at:null,error:null,searchError:null,searchPartial:null,addError:null,loadError:null,failures:{},composing:!1,pendingSearch:!1}),x=class{constructor(){this.store=U(C()),this.searchController=null,this.timer=null,this.pending=null,this.lastQuery=null}get state(){return this.store}get snapshot(){return this.store.getSnapshot()}patch(t){this.store.update(a=>Object.assign(a,t))}open(){this.patch({...C(),open:!0,loading:!0}),this.load().then(()=>this.refresh(),()=>this.patch({loading:!1}))}close(){this.timer!==null&&clearTimeout(this.timer),this.searchController!==null&&this.searchController.abort(),this.lastQuery=null,this.patch({open:!1,rowMenu:null,composing:!1,pendingSearch:!1})}async load(){try{let t=await m("/list");this.patch({items:g(t.items)??[],seeded_at:t.seeded_at,loading:!1,loadError:null})}catch(t){throw this.patch({loading:!1,loadError:{code:t.code??"fuyao_unavailable"}}),t}}refresh(){if(this.pending!==null)return this.pending;this.patch({refreshing:!0});let t=m("/refresh",{body:{}}).then(a=>{let s={};for(let p of a.failures??[])s[p.thscode]=p.code;let i=g(a.items)??this.snapshot.items;this.patch({items:i,refreshed_at:a.refreshed_at??this.snapshot.refreshed_at,failures:s,error:a.error?{code:a.error.code,partial:i.length>0&&i.some(p=>s[p.thscode]===void 0)}:null})}).catch(a=>{this.patch({error:{code:a.code??"fuyao_unavailable",partial:this.snapshot.items.some(s=>s.quote!==null)}})}).finally(()=>{this.patch({refreshing:!1}),this.pending=null});return this.pending=t,t}onQueryChange(t,a){let s=t.trim(),i=a===void 0?this.snapshot.composing===!0:a===!0;if(this.patch({query:t,searchError:null,composing:i,dropdownOpen:s.length>0}),this.timer!==null&&clearTimeout(this.timer),s.length===0){this.searchController!==null&&this.searchController.abort(),this.lastQuery=null,this.patch({candidates:[],truncated:!1,searching:!1,pendingSearch:!1});return}s===this.lastQuery&&this.snapshot.pendingSearch===!1||(this.patch({candidates:[],truncated:!1,pendingSearch:!i}),i!==!0&&(this.timer=setTimeout(()=>this.search(s),V)))}beginComposition(){this.timer!==null&&clearTimeout(this.timer),this.patch({composing:!0})}endComposition(t){this.onQueryChange(t,!1)}hideDropdown(){this.patch({dropdownOpen:!1})}toggleRowMenu(t){this.patch({rowMenu:this.snapshot.rowMenu===t?null:t})}closeRowMenu(){this.snapshot.rowMenu!==null&&this.patch({rowMenu:null})}setPendingRemove(t){this.patch({pendingRemove:t??null})}async search(t){this.lastQuery=t,this.searchController!==null&&this.searchController.abort();let a=new AbortController;this.searchController=a,this.patch({searching:!0,searchError:null,searchPartial:null});let s=()=>this.snapshot.query.trim()===t;try{let i=await m("/search",{query:`q=${encodeURIComponent(t)}`,signal:a.signal});if(!s()){this.patch({searching:!1});return}this.patch({candidates:g(i.items)??[],truncated:i.truncated===!0,searching:!1,pendingSearch:!1,searchPartial:Array.isArray(i.partial)&&i.partial.length>0?i.partial:null})}catch(i){if(i.name==="AbortError"||(this.lastQuery===t&&(this.lastQuery=null),!s()))return;this.patch({candidates:[],truncated:!1,searching:!1,pendingSearch:!1,searchError:{code:i.code??"fuyao_unavailable"},searchPartial:null})}}async add(t){try{await m("/add",{body:{thscode:t.thscode}})}catch(s){this.patch({addError:{code:s.code??"fuyao_unavailable",candidates:s.candidates,limit:s.limit}}),s.candidates!==void 0&&this.patch({candidates:s.candidates,truncated:!1});return}this.patch({addError:null,candidates:[],query:"",dropdownOpen:!1,pendingSearch:!1,searchError:null,searchPartial:null}),this.lastQuery=null,await this.load().catch(()=>{}),await this.refresh();let a=this.snapshot.items.find(s=>s.thscode===t.thscode);a!==void 0&&a.quote===null&&this.snapshot.failures[t.thscode]===void 0&&await this.refresh()}async remove(t){let a=this.snapshot.items;this.patch({items:a.filter(s=>s.thscode!==t),rowMenu:null});try{await m("/remove",{body:{thscode:t}}),this.snapshot.addError?.code==="list_full"&&this.patch({addError:null})}catch{this.patch({items:a})}}async pin(t){let a=this.snapshot.items,s=a.find(i=>i.thscode===t);if(s!==void 0){this.patch({items:[s,...a.filter(i=>i.thscode!==t)],rowMenu:null});try{let i=await m("/pin",{body:{thscode:t}});Array.isArray(i.items)&&this.patch({items:g(i.items)})}catch{this.patch({items:a})}}}async copyToClipboard(){let t=this.snapshot.items.map(a=>[a.thscode,y(a.name),a.asset_type,a.quote?.price??"",a.quote?.change_pct??"",a.quote?.captured_at??""].join(" ")).join(`
185
+ `);return await navigator.clipboard.writeText(t),t}dispose(){this.timer!==null&&clearTimeout(this.timer),this.searchController!==null&&this.searchController.abort()}};function $(r){if(typeof r!="number"||!Number.isFinite(r))return"";let t=new Date(r),a=s=>String(s).padStart(2,"0");return`${a(t.getMonth()+1)}-${a(t.getDate())} ${a(t.getHours())}:${a(t.getMinutes())}`}function E({assetType:r,t}){return e("span",{className:`capital-watchlist-tag ${la[r]??"capital-watchlist-tag-cn"}`},ea(r,t))}function oa(r,t,a){let s=y(r.name);return`${t(`${a}PromptPrefix`)}${s} (${r.thscode} \xB7 ${ia(r.asset_type,t)})${t(`${a}PromptSuffix`)}`}function ca({quote:r,failureCode:t,refreshing:a,t:s}){let i=t!==void 0;if(r==null)return a===!0?e("div",{className:"capital-watchlist-quote"},e("span",{className:"capital-watchlist-skeleton capital-watchlist-skeleton-price"}),e("span",{className:"capital-watchlist-skeleton capital-watchlist-skeleton-change"})):i?e("div",{className:"capital-watchlist-quote",title:s(`error.${t}`)},e("div",{className:"capital-watchlist-price capital-watchlist-quotefailed"},"\u2014")):e("div",{className:"capital-watchlist-quote"},e("div",{className:"capital-watchlist-price"},s("notRefreshed")));let p=typeof r.change_pct=="number"&&Number.isFinite(r.change_pct),n=p?`${r.change_pct>0?"+":""}${r.change_pct.toFixed(2)}%`:"\u2014",o=i?"capital-watchlist-stale":p?r.change_pct>0?"capital-watchlist-up":r.change_pct<0?"capital-watchlist-down":"capital-watchlist-flat":"capital-watchlist-nodata",c=typeof r.source_time=="string"&&r.source_time.length>0?`${s("exchangeTime")} ${r.source_time}`:"",d=[];return i?d.push(`${s(`error.${t}`)} \xB7 ${s("stale")} ${$(r.captured_at)}`):p||d.push(s("noChangePct")),c.length>0&&d.push(c),e("div",{className:"capital-watchlist-quote",title:d.length===0?void 0:d.join(" \xB7 ")},e("div",{className:i?"capital-watchlist-price capital-watchlist-stale":"capital-watchlist-price"},r.price.toFixed(2)),e("div",{className:`capital-watchlist-change ${o}`},n))}function pa(r,t){if(t.code!=="list_full")return r(`error.${t.code}`);let a=t.limit;return typeof a!="number"||!Number.isFinite(a)?r("error.list_full_noMax"):r("error.list_full").replace("{max}",String(a))}function da({useDialog:r,surface:t,t:a,inputActions:s}){let i=r(l=>l),[p,n]=H(!1),o=i.pendingRemove??null;if(j(()=>()=>t.dispose(),[t]),!i.open)return null;let c=i.dropdownOpen===!0,d=o!==null,u=l=>{if(l.key==="Escape"){if(d){l.stopPropagation(),t.setPendingRemove(null);return}c&&(l.stopPropagation(),t.hideDropdown())}},P=l=>{if(!c)return;let h=l.relatedTarget;h!=null&&l.currentTarget?.contains?.(h)===!0||t.hideDropdown()},w=i.error,A=w==null?null:e("p",{className:"capital-watchlist-notice",role:"alert","data-code":w.code},`${a(`error.${w.code}`)}${w.partial===!0?a("errorSuffix"):""}`),v=(l,h)=>{s.insertText(oa(l,a,h),s.captureInsertion())===!0&&t.close()},I=c?e("div",{className:"capital-watchlist-dropdown",role:"listbox","aria-label":a("title"),"data-menu-material":"translucent"},i.candidates.map(l=>e("button",{key:l.thscode,type:"button",role:"option",className:"capital-watchlist-option",title:l.in_list===!0?a("added"):a("add"),disabled:l.in_list===!0||p,onClick:()=>{n(!0),t.add(l).finally(()=>n(!1))}},e("span",{className:"capital-watchlist-optionmain"},e("span",{className:"capital-watchlist-optionname"},l.name),e("span",{className:"capital-watchlist-optioncode"},l.in_list===!0?`${l.thscode} \xB7 ${a("added")}`:l.thscode)),e(E,{assetType:l.asset_type,t:a}))),i.composing===!0?e("div",{className:"capital-watchlist-hint"},a("composingHint")):i.searching===!0||i.pendingSearch===!0?e("div",{className:"capital-watchlist-hint"},a("searching")):i.searchError!==null&&i.searchError!==void 0?e("div",{className:"capital-watchlist-hint capital-watchlist-searcherror",role:"alert","data-code":i.searchError.code},a(`error.${i.searchError.code}`)):i.candidates.length===0?e("div",{className:"capital-watchlist-hint"},a("noHit")):null,...(i.searchPartial??[]).map(l=>e("div",{key:`partial-${l.market}`,className:"capital-watchlist-hint capital-watchlist-searcherror",role:"status","data-market":l.market,"data-code":l.code},`${a(`partial.${l.market}`)}${a(`error.${l.code}`)}`)),i.truncated?e("div",{className:"capital-watchlist-hint"},a("truncated")):null):null,R=i.items.length===0?null:e("div",{className:"capital-watchlist-grid capital-watchlist-head"},e("span",null,a("colName")),e("span",{className:"capital-watchlist-quote"},a("colQuote")),e("span",{className:"capital-watchlist-headaction"},a("colAction"))),T=i.loadError!==null&&i.loadError!==void 0?e("p",{className:"capital-watchlist-empty capital-watchlist-loaderror",role:"alert","data-code":i.loadError.code},a(`error.${i.loadError.code}`)):e("p",{className:"capital-watchlist-empty"},a("empty")),z=i.loading?e("p",{className:"capital-watchlist-empty"},a("loading")):i.items.length===0?T:e("div",{className:c?"capital-watchlist-list capital-watchlist-list-open":"capital-watchlist-list"},i.items.map((l,h)=>e("div",{key:l.thscode,className:"capital-watchlist-grid capital-watchlist-row","data-thscode":l.thscode},e("span",{className:"capital-watchlist-namewrap"},e("span",{className:"capital-watchlist-name",title:`${l.name} ${l.ticker}`},l.name),e("span",{className:"capital-watchlist-codeline"},e("span",{className:"capital-watchlist-code"},l.ticker),e(E,{assetType:l.asset_type,t:a}))),e(ca,{quote:l.quote,failureCode:i.failures[l.thscode],refreshing:i.refreshing,t:a}),e("span",{className:"capital-watchlist-rowactions"},e("button",{type:"button",className:"capital-watchlist-predict",disabled:p,title:a("predictTip"),"aria-label":`${a("predict")} ${l.name}`,onClick:()=>v(l,"predict")},e(F,{size:14})),e("button",{type:"button",className:"capital-watchlist-review",disabled:p,title:a("reviewTip"),"aria-label":`${a("review")} ${l.name}`,onClick:()=>v(l,"review")},e(Q,{size:14})),e(W,{open:i.rowMenu===l.thscode,anchor:e("button",{type:"button",className:"capital-watchlist-more",disabled:p,title:a("more"),"aria-label":`${a("more")} ${l.name}`,"aria-haspopup":"menu","aria-expanded":i.rowMenu===l.thscode,onClick:()=>t.toggleRowMenu(l.thscode)},e(q,{size:14})),items:[{id:"pin",label:a("pin"),icon:e(L,{size:14}),disabled:h===0},{id:"remove",label:a("remove"),icon:e(Y,{size:14}),danger:!0}],onSelect:O=>{t.closeRowMenu(),O==="pin"?t.pin(l.thscode):t.setPendingRemove(l)},onClose:()=>t.closeRowMenu(),align:"end",portal:!0,className:"capital-watchlist-actions"}))))),M=e("div",{className:d?"capital-watchlist-confirm capital-watchlist-confirm-open":"capital-watchlist-confirm","aria-hidden":d?void 0:"true"},e("div",{className:"capital-watchlist-confirmbox",role:d?"alertdialog":void 0,"aria-label":a("confirmTitle")},e("div",{className:"capital-watchlist-confirmtitle"},a("confirmTitle")),d?e("p",{className:"capital-watchlist-confirmdesc"},a("confirmDescPrefix"),e("strong",null,`${o.name} \xB7 ${o.ticker}`),a("confirmDescSuffix")):null,e("div",{className:"capital-watchlist-confirmactions"},e("button",{type:"button",className:"capital-watchlist-confirmbtn",onClick:()=>t.setPendingRemove(null)},a("confirmCancel")),e("button",{type:"button",className:"capital-watchlist-confirmbtn capital-watchlist-confirmdanger",onClick:()=>{let l=o;t.setPendingRemove(null),l!==null&&t.remove(l.thscode)}},a("confirmOk")))));return e(G,{open:!0,onClose:()=>t.close(),title:a("title"),headless:!0,shortcutModal:"watchlist",className:"capital-watchlist-dialog"},e("div",{className:"capital-watchlist-card",onKeyDown:u},e("div",{className:"capital-watchlist-header"},e("h2",{className:"capital-watchlist-title"},a("title")),e("button",{type:"button",className:"capital-watchlist-close","aria-label":a("close"),onClick:()=>t.close()},e(k,{size:14}))),e("div",{className:"capital-watchlist-search",onBlur:P},e("div",{className:"capital-watchlist-field"},e("span",{className:"capital-watchlist-searchicon"},e(B,{size:16})),e("input",{className:"capital-watchlist-input","data-modal-autofocus":!0,value:i.query,placeholder:a("searchPlaceholder"),onChange:l=>t.onQueryChange(l.target.value,l.isComposing),onCompositionStart:()=>t.beginComposition(),onCompositionEnd:l=>t.endComposition(l.target.value)}),i.query.length>0?e("button",{type:"button",className:"capital-watchlist-clear",title:a("clearInput"),"aria-label":a("clearInput"),onMouseDown:l=>l.preventDefault(),onClick:()=>t.onQueryChange("",!1)},e(k,{size:12})):null),I),i.addError!==null&&i.addError!==void 0?e("p",{className:"capital-watchlist-adderror",role:"status","data-code":i.addError.code},pa(a,i.addError)):null,R,z,e("div",{className:"capital-watchlist-footer"},e("div",{className:"capital-watchlist-footcol"},e("button",{type:"button",className:"capital-watchlist-refresh",disabled:i.refreshing||p,onClick:()=>{t.refresh()}},e(K,{size:14}),i.refreshing?a("refreshing"):a("refresh")),A),e("span",{className:"capital-watchlist-updated"},`${a("updated")} ${i.refreshed_at===null||i.refreshed_at===void 0?a("notRefreshed"):$(i.refreshed_at)}`)),M))}function ha(r){r.effect(na,`${f}: styles`),r.effect(()=>r.locale.register(b,{zh:X,en:Z}),`${f}: dictionaries`);let t=new Map,a=n=>{let o=t.get(n);return o===void 0&&(o=new x,t.set(n,o)),o};r.effect(()=>()=>{for(let n of t.values())n.dispose();t.clear()},`${f}: per-session surfaces`);let s=n=>{let c=r.sessions?.list?.getSnapshot?.().byId?.[n]?.projectionValues?.agentPreset;return typeof c=="string"?c:void 0},i=new Set,p=n=>{let o=s(n);return o!==void 0?o===J:(i.has(n)||(i.add(n),Promise.resolve(r.sessions?.refreshProjections?.(n)).catch(()=>{})),!1)};r.slots.inject(S,()=>r.slots.register({name:S,id:"capital-watchlist-dialog",order:3,locale:b,inject:n=>{let o=a(n);return{hooks:{dialog:o.state},surface:o}}},da)),r.inject(["commandUi"],n=>{let o=r.locale.bind(b);n.effect(()=>n.commandUi.register({name:"watchlist",label:()=>o("command.label"),description:()=>o("command.description"),icon:D,available:c=>p(c.sessionId),ui:{kind:"action",run:c=>{a(c.sessionId).open()}}}),`${f}: /watchlist contribution`)}),r.logger?.info?.(`${f}: \u5BA2\u6237\u7AEF\u534A\u8FB9\u5DF2\u6302\u8F7D\uFF08/watchlist \u83DC\u5355\u884C + \u81EA\u9009\u80A1\u5F39\u7A97\uFF09`)}exports.name=f;exports.inject=["slots","locale","commandUi","sessions"];exports.apply=ha;
180
186
  return module.exports
181
187
  },
182
188
  })