@v587d/capital-generation 2.11.1 → 2.13.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/CHANGELOG.md +25 -0
- package/README.md +14 -14
- package/automation/builtins.js +147 -0
- package/automation/calendar.js +66 -0
- package/automation/client.js +68 -0
- package/automation/client.src.cjs +777 -0
- package/automation/defaults.js +71 -0
- package/automation/index.js +183 -0
- package/automation/owner.js +222 -0
- package/automation/package.json +50 -0
- package/automation/policy.js +105 -0
- package/automation/redact.js +25 -0
- package/automation/route.js +241 -0
- package/automation/runner.js +858 -0
- package/automation/scheduler.js +495 -0
- package/automation/schema.js +359 -0
- package/automation/service.js +338 -0
- package/automation/settings.js +48 -0
- package/automation/store.js +707 -0
- package/automation/time.js +220 -0
- package/automation/workspaces.js +154 -0
- package/chart-ui/package.json +1 -1
- package/config/client.js +4 -2
- package/config/client.src.cjs +90 -1
- package/config/index.js +15 -0
- package/config/package.json +1 -1
- package/cordis.patch.yml +8 -0
- package/lib/index.d.ts +38 -0
- package/lib/index.js +16 -0
- package/lib/web-retriever/local-fetch.d.ts +1 -1
- package/lib/web-retriever/local-fetch.js +1 -1
- package/lib/web-retriever/wind-client.d.ts +1 -1
- package/lib/web-retriever/wind-client.js +1 -1
- package/package.json +9 -7
- package/preset/capital-generation/README.md +1 -1
- package/watchlist/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,31 @@
|
|
|
7
7
|
- **第三位(patch)**:不破坏既有工具 / 配置 / 会话的新增与修复(如 2.1.1、2.1.2)。
|
|
8
8
|
- **第二位(minor)**:有需要用户知晓的行为变更,且段内附迁移说明(如 2.1.0 的图表呈现通道重做、2.2.0 的数据源与检索来源扩容、2.4.0 的**必须换宿主版本**、2.9.0 的选择器收敛与质检前置——本插件自己的工具与数据契约没变,所以只抬第二位)。
|
|
9
9
|
|
|
10
|
+
## [2.13.0] - 2026-10-27
|
|
11
|
+
|
|
12
|
+
新增 CapGen 投研自动化,目前还在实验阶段,存在诸多不稳定。
|
|
13
|
+
|
|
14
|
+
## [2.12.0] - 2026-10-26
|
|
15
|
+
|
|
16
|
+
宿主基线从 `0.2.1-rc.2` 抬到 `0.2.1-rc.3`。rc.3 只改客户端界面与 DeepSeek 模型列表,本插件消费的
|
|
17
|
+
扩展面(配置卡片、自选股弹窗、图表卡片、交付事件)逐条核对后没有形状变化,工具与数据契约不变。
|
|
18
|
+
|
|
19
|
+
### Changed
|
|
20
|
+
|
|
21
|
+
- **`peerDependencies` 的 `dsh-skill` / `dsh-skill-filesystem` 改成精确 pin `0.2.1-rc.3`**:
|
|
22
|
+
这两颗是运行时导入(`FileSystemSkillProvider`),与宿主同版才不会有"插件带 rc.3 的 provider
|
|
23
|
+
接 rc.2 的 skill 服务"这种跨版本组合。`devDependencies` 与 lockfile 同步到 rc.3。
|
|
24
|
+
- README 基线徽章、CONTRIBUTING、CI 安装版本、preset 维护文档同步到 rc.3。
|
|
25
|
+
|
|
26
|
+
### Migration
|
|
27
|
+
|
|
28
|
+
- **本次必须换宿主版本**:先 `dsh --version` 确认为 `0.2.1-rc.3`,再安装或更新本插件。在 rc.2 上
|
|
29
|
+
安装本版会被宿主的插件兼容预检直接拒绝;反过来,若先升宿主而插件仍是 2.11.1,启动时该插件行
|
|
30
|
+
会被禁用(stderr 一行 `disabling profile plugin ...`,界面上模式与工具整体消失),执行
|
|
31
|
+
`dsh plugin --profile <profile> update @v587d/capital-generation` 后重启即可恢复。
|
|
32
|
+
- rc.3 的 New Session 会复用 Workspace 里的空白会话:**更新插件后先重启宿主再新建会话**,
|
|
33
|
+
否则复用到的空白会话仍保留创建时的 preset 组合。
|
|
34
|
+
|
|
10
35
|
## [2.11.1] - 2026-10-26
|
|
11
36
|
|
|
12
37
|
### Fixed
|
package/README.md
CHANGED
|
@@ -13,12 +13,12 @@
|
|
|
13
13
|
<a href="https://github.com/deepseek-ai"><img src="https://img.shields.io/badge/DeepSeek_Harness-plugin-blue" alt="DSH Plugin"></a>
|
|
14
14
|
<a href="https://github.com/deepseek-ai"><img src="https://img.shields.io/badge/DeepSeek_Harness-web-orange" alt="DSH Web"></a>
|
|
15
15
|
<a href="https://github.com/deepseek-ai"><img src="https://img.shields.io/badge/DeepSeek_Harness-desktop-brightgreen" alt="DSH Desktop · 已实机验证"></a>
|
|
16
|
-
<a href="https://github.com/deepseek-ai"><img src="https://img.shields.io/badge/DSH%20Baseline-0.2.1--rc.
|
|
16
|
+
<a href="https://github.com/deepseek-ai"><img src="https://img.shields.io/badge/DSH%20Baseline-0.2.1--rc.3-blue" alt="DSH@0.2.1-rc.3"></a>
|
|
17
17
|
</p>
|
|
18
18
|
<p align="center">
|
|
19
19
|
<a href="https://awesome-dsh-plugin.com"><img src="https://awesome-dsh-plugin.com/badge.svg" alt="awesome · DSH plugin"></a>
|
|
20
20
|
<a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-green" alt="License"></a>
|
|
21
|
-
<a href="https://github.com/v587d/capital-generation/releases"><img src="https://img.shields.io/badge/version-2.
|
|
21
|
+
<a href="https://github.com/v587d/capital-generation/releases"><img src="https://img.shields.io/badge/version-2.13.0-9cf" alt="Version"></a>
|
|
22
22
|
<a href="https://www.npmjs.com/package/@v587d/capital-generation"><img src="https://img.shields.io/npm/v/%40v587d%2Fcapital-generation" alt="npm version"></a>
|
|
23
23
|
<a href="https://github.com/deepseek-ai/deepseek-harness"><img src="https://img.shields.io/badge/powered_by-dsh-4D6BFE?style=flat-square&logo=deepseek&logoColor=white" alt="powered-by-dsh"></a>
|
|
24
24
|
</p>
|
|
@@ -37,7 +37,16 @@ Capital Generation 是运行在 [DeepSeek Harness(DSH)](https://github.com/d
|
|
|
37
37
|
## 快速上手
|
|
38
38
|
|
|
39
39
|
> [!NOTE]
|
|
40
|
-
> 适配 DSH`@0.2.1-rc.
|
|
40
|
+
> 适配 DSH`@0.2.1-rc.3`。已在 Linux 的 Web profile 和 Windows 桌面端验证;其他环境尚未充分测试。建议使用 `Deepseek/deepseek-flash` ,思考推理能力为 High ;GPT / Claude 尚未充分测试。
|
|
41
|
+
|
|
42
|
+
> [!TIP]
|
|
43
|
+
> **建议用独立 profile 启动。** 安装到 `capital` 后,用下面的命令打开一个全新的 profile:
|
|
44
|
+
|
|
45
|
+
> ```bash
|
|
46
|
+
> dsh --profile capital --port 8888
|
|
47
|
+
> ```
|
|
48
|
+
>
|
|
49
|
+
> 然后访问 `http://localhost:8888`。本插件、密钥和默认模式都只属于这个 profile,不会和 DSH web profile 的默认设置冲突。
|
|
41
50
|
|
|
42
51
|
1. **安装插件。**
|
|
43
52
|
|
|
@@ -68,15 +77,6 @@ https://github.com/v587d/capital-generation
|
|
|
68
77
|
> [!NOTE]
|
|
69
78
|
> 本插件所有自带密钥均可免费申请、免费日常使用。 哪怕所有密钥留空也不影响插件核心功能,即缺哪个密钥,仅表示对应能力就不可用,其他功能照常。
|
|
70
79
|
|
|
71
|
-
> [!TIP]
|
|
72
|
-
> **建议用独立 profile 启动。** 安装到 `capital` 后,用下面的命令打开一个全新的 profile:
|
|
73
|
-
>
|
|
74
|
-
> ```bash
|
|
75
|
-
> dsh --profile capital --port 8888
|
|
76
|
-
> ```
|
|
77
|
-
>
|
|
78
|
-
> 然后访问 `http://localhost:8888`。本插件、密钥和默认模式都只属于这个 profile,不会和 DSH web profile 的默认设置冲突;如果已经装在 `web`,也可以继续用 `dsh --profile web` 启动,下面的配置步骤相同。
|
|
79
|
-
|
|
80
80
|
2. **选填密钥。** 打开 DSH 「插件」 → **Capital Generation** →「数据源」(进页面就停在这一格)。
|
|
81
81
|
|
|
82
82
|
| 密钥 | 用途 |
|
|
@@ -202,7 +202,7 @@ https://github.com/v587d/capital-generation
|
|
|
202
202
|
- **安装后找不到模式?** 确认插件出现在「插件」→ 已安装列表;Web / CLI profile 安装后要重启该 profile,并在新会话选择模式。选择器里应看到自动模式、行情专家、资讯专员;分析师和绘图专员是自动模式的内部角色,不会出现在这里。
|
|
203
203
|
- **配置在哪?** 打开「插件」→ 已安装的 **Capital Generation**,页面顶部就是「数据源 / 精选 Skills / 包含的组件」三格,五把密钥都在第一格;不在 DSH 的普通「设置」页面,也不用点进任何一行组件。保存密钥后新建会话再试。
|
|
204
204
|
- **升级到 2.9.0 后,分析师和绘图专员去哪了?** 这一版把它们收进自动模式内部,不再出现在选择器与预设管理里,避免误开一个没有取数入口的空会话。旧会话仍能按原身份恢复;新任务直接用自动模式提出即可。
|
|
205
|
-
- **桌面端升级后仍是旧版?** 桌面端安装时会固定所解析的版本,不会自动升级。卸载后重新安装,再到插件详情查看版本号;如需指定版本,可在地址末尾加 `#v2.
|
|
205
|
+
- **桌面端升级后仍是旧版?** 桌面端安装时会固定所解析的版本,不会自动升级。卸载后重新安装,再到插件详情查看版本号;如需指定版本,可在地址末尾加 `#v2.13.0` 或 `@2.13.0`。
|
|
206
206
|
- **刚发布的新版本装不到?** 桌面端取包时会跳过**刚发布不久**的版本(宿主侧包管理器的发布冷却策略,实测会静默装成上一个版本),国内镜像的同步也可能滞后一段时间。急着用最新代码,改用仓库地址安装最直接。
|
|
207
207
|
- **网页抓取失败?** 配置卡片中的「允许启动本地提取网页内容」默认开启:AnySearch 提取失败时可尝试本机直连。关闭后,本机直连的具名来源查询也不可用;请检查该开关和网络连接。
|
|
208
208
|
- **Wind 那部分会消耗积分?** 会。公告与新闻检索、宏观 / 行业 / 汇率指标、按日期区间取的历史 K 线都按次消耗你在 Wind 侧的额度;额度与条款以 Wind 为准,插件不做用量封顶。没配 `WIND_API_KEY` 时这几类不可用,其余功能照常。
|
|
@@ -233,4 +233,4 @@ npm run smoke:boot # 检查插件装配
|
|
|
233
233
|
- 会话里的可交互图表由 [TradingView Lightweight Charts](https://github.com/tradingview/lightweight-charts)(Apache-2.0)渲染,图上保留它自带的归属标识。
|
|
234
234
|
- 行情、财务、公告与网页材料来自五类需自备密钥的服务(同花顺 Fuyao、Wind Alice、AnySearch、PaddleOCR、FTShare 非凸科技)与一批公开口径的来源(东方财富、腾讯、新浪、财联社、华尔街见闻、巨潮互动易、上证 e互动、同花顺公开站点);数据版权归各服务方,额度与条款以服务方为准,本项目不重新分发原始数据。
|
|
235
235
|
|
|
236
|
-
第三方组件、版本与许可,以及宿主提供哪部分、构建期用什么、各服务的数据会出到哪些地方,逐条列在 [第三方组件与许可](THIRD_PARTY_NOTICES.md)。
|
|
236
|
+
第三方组件、版本与许可,以及宿主提供哪部分、构建期用什么、各服务的数据会出到哪些地方,逐条列在 [第三方组件与许可](THIRD_PARTY_NOTICES.md)。
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builtin task templates. Code is the only definition source: a profile record stores only the
|
|
3
|
+
* user override layer, so a shipped instruction fix reaches every dormant/reset task.
|
|
4
|
+
*/
|
|
5
|
+
import { BuiltinDefinitionSchema, parseStrict } from './schema.js'
|
|
6
|
+
import {
|
|
7
|
+
DEFAULT_IDLE_TIMEOUT_MINUTES,
|
|
8
|
+
DEFAULT_MAX_STEPS,
|
|
9
|
+
DEFAULT_MAX_TOOL_CALLS,
|
|
10
|
+
DEFAULT_RUN_TIMEOUT_MINUTES,
|
|
11
|
+
} from './defaults.js'
|
|
12
|
+
|
|
13
|
+
const DEFAULT_LIMITS = {
|
|
14
|
+
runTimeoutMinutes: DEFAULT_RUN_TIMEOUT_MINUTES,
|
|
15
|
+
idleTimeoutMinutes: DEFAULT_IDLE_TIMEOUT_MINUTES,
|
|
16
|
+
maxSteps: DEFAULT_MAX_STEPS,
|
|
17
|
+
maxToolCalls: DEFAULT_MAX_TOOL_CALLS,
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const DEFAULT_NOTIFICATIONS = {
|
|
21
|
+
inApp: true,
|
|
22
|
+
onFailure: true,
|
|
23
|
+
onSuccess: false,
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const SOURCE_RULES = `数据与来源纪律:
|
|
27
|
+
- 结构化行情、财务与宏观数据一律委派 data_collector 取回 DatasetRef,再交 data_junior 做质检与统计;
|
|
28
|
+
不在正文中复制原始数据行,不凭记忆填写数字。
|
|
29
|
+
- 新闻、公告与监管文件委派 web_retriever,逐条编号并标注来源、发布时间与核验状态;
|
|
30
|
+
媒体转述只能作为旁证。
|
|
31
|
+
- 关键数值必须带采集时间与来源标签;数据缺失或过期时明确写出,不用猜测补齐。
|
|
32
|
+
- 不给出买卖指令、收益承诺或目标价。`
|
|
33
|
+
|
|
34
|
+
const UNATTENDED_RULES = `无人值守执行策略(automation-v1):
|
|
35
|
+
- 这是定时触发的无人值守运行:不要调用 ask_user_question,不要等待审批,不要请求用户补充信息。
|
|
36
|
+
- 若关键输入缺失或存在歧义,选择最保守的可核查口径继续,并在答复开头用一句「需要用户确认」写明缺口。
|
|
37
|
+
- 只使用当前角色工具面;不尝试提权、不写文件、不修改系统配置。
|
|
38
|
+
- 最终答复必须自足:结论、证据与来源、局限与风险、后续观察点;不要写“见上”“已完成”这类指针句。`
|
|
39
|
+
|
|
40
|
+
const SCHEDULE_COMMON = {
|
|
41
|
+
kind: 'schedule',
|
|
42
|
+
cadence: 'daily',
|
|
43
|
+
time: '08:30',
|
|
44
|
+
timezone: 'Asia/Shanghai',
|
|
45
|
+
tradingDaysOnly: true,
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** @type {readonly import('./schema.js').BuiltinDefinition[]} */
|
|
49
|
+
export const BUILTIN_DEFINITIONS = [
|
|
50
|
+
{
|
|
51
|
+
id: 'morning-brief',
|
|
52
|
+
version: 1,
|
|
53
|
+
category: 'news',
|
|
54
|
+
defaults: {
|
|
55
|
+
state: 'dormant',
|
|
56
|
+
category: 'news',
|
|
57
|
+
title: '早间资讯',
|
|
58
|
+
description: '交易日开盘前汇总隔夜外盘、重要公告与政策信息,给出当日需要盯住的线索。',
|
|
59
|
+
trigger: { ...SCHEDULE_COMMON, time: '08:30' },
|
|
60
|
+
instruction: `任务:生成一份交易日早间资讯简报,供开盘前阅读。
|
|
61
|
+
|
|
62
|
+
覆盖范围(按重要性排序,不追求数量):
|
|
63
|
+
1. 隔夜外盘:美股主要指数、原油/黄金/美元与人民币汇率的关键变化。
|
|
64
|
+
2. 国内政策与监管:可能影响市场风险偏好的政策、会议、监管表态。
|
|
65
|
+
3. 重要公司公告:业绩预告、重大合同、并购重组、减持/回购、停复牌与风险提示。
|
|
66
|
+
4. 当日事件:宏观数据、重要会议、限售解禁与新股申购中值得提示的部分。
|
|
67
|
+
|
|
68
|
+
输出结构:
|
|
69
|
+
- 三到五条「今日要点」,每条一句话并标注依据来源。
|
|
70
|
+
- 分节展开上述范围;没有可靠信息的条目直接说明“未取得可靠信息”,不要用旧闻填充。
|
|
71
|
+
- 末尾列「需要继续跟踪」与「信息缺口」。
|
|
72
|
+
|
|
73
|
+
${SOURCE_RULES}
|
|
74
|
+
|
|
75
|
+
${UNATTENDED_RULES}`,
|
|
76
|
+
mode: 'news',
|
|
77
|
+
cwdKind: 'profile',
|
|
78
|
+
limits: { ...DEFAULT_LIMITS },
|
|
79
|
+
notifications: { ...DEFAULT_NOTIFICATIONS },
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
id: 'post-close-filings',
|
|
84
|
+
version: 1,
|
|
85
|
+
category: 'news',
|
|
86
|
+
defaults: {
|
|
87
|
+
state: 'dormant',
|
|
88
|
+
category: 'news',
|
|
89
|
+
title: '盘后公告',
|
|
90
|
+
description: '交易日收盘后梳理当日公告与盘面异动,筛出次日需要复核的事项。',
|
|
91
|
+
trigger: { ...SCHEDULE_COMMON, time: '18:30' },
|
|
92
|
+
instruction: `任务:生成一份交易日盘后公告与异动复盘。
|
|
93
|
+
|
|
94
|
+
覆盖范围:
|
|
95
|
+
1. 当日重要公告:业绩、订单、重组、诉讼、监管问询、股权变动、分红与回购。
|
|
96
|
+
2. 盘面异动:涨停/跌停、连板、成交额与换手异常的板块和个股;只描述可核查事实。
|
|
97
|
+
3. 公告与异动的交叉核对:哪些异动有公告支撑,哪些没有。
|
|
98
|
+
|
|
99
|
+
输出结构:
|
|
100
|
+
- 「次日复核清单」:逐条写明标的、事项、需要核对的下一条信息。
|
|
101
|
+
- 分节展开公告与异动;每条公告带交易所/公司披露来源。
|
|
102
|
+
- 对无法确认的传闻明确标注“未核验”,不得当作事实。
|
|
103
|
+
|
|
104
|
+
${SOURCE_RULES}
|
|
105
|
+
|
|
106
|
+
${UNATTENDED_RULES}`,
|
|
107
|
+
mode: 'news',
|
|
108
|
+
cwdKind: 'profile',
|
|
109
|
+
limits: { ...DEFAULT_LIMITS },
|
|
110
|
+
notifications: { ...DEFAULT_NOTIFICATIONS },
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
id: 'daily-review',
|
|
115
|
+
version: 1,
|
|
116
|
+
category: 'review',
|
|
117
|
+
defaults: {
|
|
118
|
+
state: 'dormant',
|
|
119
|
+
category: 'review',
|
|
120
|
+
title: '每日复盘',
|
|
121
|
+
description: '交易日收盘后复盘指数、量能、板块轮动与自选股表现,形成可验证的观察清单。',
|
|
122
|
+
trigger: { ...SCHEDULE_COMMON, time: '20:00' },
|
|
123
|
+
instruction: `任务:生成一份交易日复盘,重点是可验证的事实与下一交易日的观察条件。
|
|
124
|
+
|
|
125
|
+
覆盖范围:
|
|
126
|
+
1. 指数与量能:主要指数涨跌、成交额、涨跌家数、北向/主力资金(仅在有可靠数据时)。
|
|
127
|
+
2. 板块轮动:涨幅与跌幅居前的行业/概念,和近 5 个交易日的相对强弱。
|
|
128
|
+
3. 自选股:读取当前用户自选股清单,逐只给出当日表现与相对强弱;无自选股时跳过并说明。
|
|
129
|
+
4. 风险与异常:放量下跌、高位股退潮、公告风险与流动性异常。
|
|
130
|
+
|
|
131
|
+
输出结构:
|
|
132
|
+
- 「一句话结论」与「下一交易日观察清单」,每条观察都要有触发条件和失效条件。
|
|
133
|
+
- 分节给出证据;数值必须来自 Dataset 或受控行情工具并标注采集时间。
|
|
134
|
+
- 明确写出数据缺口与无法验证的部分;不要用“可能”“大概”替代缺失数据。
|
|
135
|
+
|
|
136
|
+
${SOURCE_RULES}
|
|
137
|
+
|
|
138
|
+
${UNATTENDED_RULES}`,
|
|
139
|
+
mode: 'review',
|
|
140
|
+
cwdKind: 'profile',
|
|
141
|
+
limits: { ...DEFAULT_LIMITS },
|
|
142
|
+
notifications: { ...DEFAULT_NOTIFICATIONS },
|
|
143
|
+
},
|
|
144
|
+
},
|
|
145
|
+
].map((definition) => parseStrict(BuiltinDefinitionSchema, definition, 'builtin definition'))
|
|
146
|
+
|
|
147
|
+
export const BUILTIN_BY_ID = new Map(BUILTIN_DEFINITIONS.map((definition) => [definition.id, definition]))
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fail-closed A-share trading calendar. The holiday list is an explicit exchange schedule, not a
|
|
3
|
+
* Mon–Fri guess: a date outside the published window returns `undefined`, and the scheduler
|
|
4
|
+
* records `skipped_calendar_unavailable` instead of running.
|
|
5
|
+
*
|
|
6
|
+
* Sources: SSE 2026 market-closure notice (上证公告〔2025〕45号 + the 2026 mid-autumn/national-day
|
|
7
|
+
* notice). Update this table when the exchange publishes the next year; do not infer holidays.
|
|
8
|
+
*/
|
|
9
|
+
const CN_HOLIDAYS_2026 = new Set([
|
|
10
|
+
// New Year
|
|
11
|
+
'2026-01-01', '2026-01-02', '2026-01-03',
|
|
12
|
+
// Spring Festival
|
|
13
|
+
'2026-02-15', '2026-02-16', '2026-02-17', '2026-02-18', '2026-02-19',
|
|
14
|
+
'2026-02-20', '2026-02-21', '2026-02-22', '2026-02-23',
|
|
15
|
+
// Qingming
|
|
16
|
+
'2026-04-04', '2026-04-05', '2026-04-06',
|
|
17
|
+
// Labour Day
|
|
18
|
+
'2026-05-01', '2026-05-02', '2026-05-03', '2026-05-04', '2026-05-05',
|
|
19
|
+
// Dragon Boat
|
|
20
|
+
'2026-06-19', '2026-06-20', '2026-06-21',
|
|
21
|
+
// Mid-Autumn
|
|
22
|
+
'2026-09-25', '2026-09-26', '2026-09-27',
|
|
23
|
+
// National Day
|
|
24
|
+
'2026-10-01', '2026-10-02', '2026-10-03', '2026-10-04', '2026-10-05', '2026-10-06', '2026-10-07',
|
|
25
|
+
])
|
|
26
|
+
|
|
27
|
+
const PUBLISHED = new Map([
|
|
28
|
+
[2026, { holidays: CN_HOLIDAYS_2026, through: '2026-12-31' }],
|
|
29
|
+
])
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
function weekdayOf(date) {
|
|
33
|
+
const [year, month, day] = date.split('-').map(Number)
|
|
34
|
+
const weekday = new Date(Date.UTC(year, month - 1, day)).getUTCDay()
|
|
35
|
+
return weekday === 0 ? 7 : weekday
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function createTradingCalendar(options = {}) {
|
|
39
|
+
const published = options.published ?? PUBLISHED
|
|
40
|
+
return {
|
|
41
|
+
isTradingDay(date) {
|
|
42
|
+
const year = Number(String(date).slice(0, 4))
|
|
43
|
+
const entry = published.get(year)
|
|
44
|
+
if (entry === undefined) return undefined
|
|
45
|
+
if (weekdayOf(date) >= 6) return false
|
|
46
|
+
return !entry.holidays.has(date)
|
|
47
|
+
},
|
|
48
|
+
/** The first date the table cannot answer; callers show this instead of pretending. */
|
|
49
|
+
status(at = new Date()) {
|
|
50
|
+
const today = at.toISOString().slice(0, 10)
|
|
51
|
+
if (this.isTradingDay(today) === undefined) {
|
|
52
|
+
return { available: false, source: 'CN-A-share-2026', through: null, firstUnknown: today }
|
|
53
|
+
}
|
|
54
|
+
const years = [...published.keys()].sort((a, b) => a - b)
|
|
55
|
+
const last = years.at(-1)
|
|
56
|
+
return {
|
|
57
|
+
available: true,
|
|
58
|
+
source: 'CN-A-share-2026',
|
|
59
|
+
through: `${last}-12-31`,
|
|
60
|
+
firstUnknown: `${last + 1}-01-01`,
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export const tradingCalendar = createTradingCalendar()
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
// 由 scripts/build-automation-client.mjs 生成,请勿手改;源码见 automation/client.src.cjs。
|
|
2
|
+
window.__ModuleLoader__.load({
|
|
3
|
+
id: '@v587d/capital-automation',
|
|
4
|
+
factory: (require) => {
|
|
5
|
+
var module = { exports: {} }
|
|
6
|
+
var exports = module.exports
|
|
7
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' })
|
|
8
|
+
"use strict";var{createElement:a,useEffect:M,useRef:I,useState:w}=require("react"),{IconChecklistOutlineRegular:Y,Modal:J,Switch:P}=require("@deepseek-ai/dsh-client-ui-primitives"),O="capital-automation",Q="/capital-automation",U="capital-automation",j="capital-automation-css",t={panel:"CapGen \u6295\u7814\u81EA\u52A8\u5316",title:"CapGen \u6295\u7814\u81EA\u52A8\u5316",subtitle:"\u72EC\u7ACB\u4E8E\u5B98\u65B9\u300C\u81EA\u52A8\u5316\u4EFB\u52A1\u300D\u7684\u5B9A\u65F6\u6295\u7814\u4EFB\u52A1\u3001\u8FD0\u884C\u8BB0\u5F55\u4E0E\u901A\u77E5",profile:"\u5F53\u524D profile",scheduler:"\u8C03\u5EA6\u5668",schedulerActive:"\u8FD0\u884C\u6743\u5DF2\u53D6\u5F97",schedulerStandby:"\u672A\u53D6\u5F97\u8FD0\u884C\u6743\uFF08\u53EA\u8BFB\uFF09",schedulerStarting:"\u542F\u52A8\u4E2D",schedulerStopped:"\u5DF2\u505C\u6B62",calendar:"\u4EA4\u6613\u65E5\u5386",calendarOk:"\u53EF\u7528",calendarMissing:"\u4E0D\u53EF\u7528\uFF08\u4EA4\u6613\u65E5\u4EFB\u52A1\u4F1A\u8DF3\u8FC7\uFF09",storageUnavailable:"\u5B58\u50A8\u4E0D\u53EF\u7528\uFF0C\u9875\u9762\u53EA\u8BFB",loading:"\u8BFB\u53D6\u4E2D\u2026",empty:"\u8FD8\u6CA1\u6709\u4EFB\u52A1\u3002",noSelection:"\u4ECE\u5DE6\u4FA7\u9009\u62E9\u4E00\u4E2A\u4EFB\u52A1\u3002",newTask:"\u65B0\u5EFA\u4EFB\u52A1",groups:{running:"\u8FD0\u884C\u4E2D",news:"\u8D44\u8BAF",market:"\u884C\u60C5",review:"\u590D\u76D8",research:"\u7814\u7A76",custom:"\u6211\u7684\u4EFB\u52A1"},stateLabel:"\u72B6\u6001",state:{dormant:"\u4F11\u7720",active:"\u542F\u7528",paused:"\u6682\u505C"},status:{queued:"\u6392\u961F\u4E2D",starting:"\u542F\u52A8\u4E2D",running:"\u8FD0\u884C\u4E2D",succeeded:"\u6210\u529F",failed:"\u5931\u8D25",canceled:"\u5DF2\u53D6\u6D88",timed_out:"\u8D85\u65F6",blocked_requires_user:"\u9700\u8981\u7528\u6237\u786E\u8BA4",unknown_after_restart:"\u91CD\u542F\u540E\u672A\u77E5",skipped_overlap:"\u91CD\u53E0\u8DF3\u8FC7",skipped_calendar_unavailable:"\u65E5\u5386\u4E0D\u53EF\u7528\u8DF3\u8FC7",missed:"\u9519\u8FC7"},mode:{news:"\u8D44\u8BAF",market:"\u884C\u60C5",review:"\u590D\u76D8",research:"\u7814\u7A76"},cadence:{daily:"\u6BCF\u5929",weekly:"\u6BCF\u5468",monthly:"\u6BCF\u6708"},nextRun:"\u4E0B\u6B21\u8FD0\u884C",lastResult:"\u4E0A\u6B21\u7ED3\u679C",unread:"\u672A\u8BFB",never:"\u6682\u65E0",overview:"\u6982\u89C8",config:"\u914D\u7F6E",runs:"\u8FD0\u884C\u8BB0\u5F55",policy:"\u6267\u884C\u7B56\u7565",notifications:"\u901A\u77E5",titleField:"\u6807\u9898",descriptionField:"\u8BF4\u660E",instructionField:"\u4EFB\u52A1\u6307\u4EE4",triggerField:"\u89E6\u53D1",timeField:"\u65F6\u95F4",timezoneField:"\u65F6\u533A",weekdayField:"\u661F\u671F\uFF08ISO 1\u20137\uFF09",dayField:"\u6BCF\u6708\u51E0\u53F7\uFF081\u201328\uFF09",tradingDaysField:"\u4EC5\u4EA4\u6613\u65E5",modeField:"\u8F93\u51FA\u4FA7\u91CD",modeHint:"\u53EA\u5F71\u54CD\u8F93\u51FA\u7ED3\u6784\uFF0C\u4E0D\u6539\u53D8 Agent preset\uFF1B\u6240\u6709\u8FD0\u884C\u56FA\u5B9A\u4F7F\u7528 Capital \u81EA\u52A8\u6A21\u5F0F\u3002",presetLabel:"Agent preset",presetValue:"capital-generation\uFF08\u81EA\u52A8\u6A21\u5F0F\uFF09",workspaceField:"\u5DE5\u4F5C\u533A",workspaceDefault:"\u8DDF\u968F\u9ED8\u8BA4\u5DE5\u4F5C\u533A",workspaceMissing:"\u5DF2\u79FB\u9664\u7684\u5DE5\u4F5C\u533A\uFF08\u8BF7\u91CD\u65B0\u9009\u62E9\uFF09",workspaceUnavailable:"\u5DE5\u4F5C\u533A\u670D\u52A1\u6682\u65F6\u4E0D\u53EF\u7528\uFF0C\u8FD0\u884C\u4F1A\u9000\u56DE\u9ED8\u8BA4\u76EE\u5F55\u3002",limitsField:"\u8FD0\u884C\u4E0A\u9650",runTimeout:"wall-clock\uFF08\u5206\u949F\uFF09",idleTimeout:"\u7A7A\u95F2\u8D85\u65F6\uFF08\u5206\u949F\uFF09",maxSteps:"\u6700\u5927\u6B65\u9AA4",maxToolCalls:"\u6700\u5927\u5DE5\u5177\u8C03\u7528",notifyField:"\u901A\u77E5",notifyInApp:"\u5E94\u7528\u5185\u901A\u77E5",notifyFailure:"\u5931\u8D25\u65F6\u901A\u77E5",notifySuccess:"\u6210\u529F\u65F6\u901A\u77E5",save:"\u4FDD\u5B58",saving:"\u4FDD\u5B58\u4E2D\u2026",saved:"\u5DF2\u4FDD\u5B58",activate:"\u542F\u7528",pause:"\u6682\u505C",hibernate:"\u4F11\u7720\u5E76\u6062\u590D\u9ED8\u8BA4",copy:"\u590D\u5236\u4E3A\u6211\u7684\u4EFB\u52A1",remove:"\u5220\u9664",runNow:"\u624B\u52A8\u8FD0\u884C",cancelRun:"\u53D6\u6D88\u8FD0\u884C",openSession:"\u6253\u5F00 session",detail:"\u8BE6\u60C5",close:"\u5173\u95ED",create:"\u521B\u5EFA",back:"\u4E0A\u4E00\u6B65",next:"\u4E0B\u4E00\u6B65",step1:"\u57FA\u672C\u4FE1\u606F",step2:"\u89E6\u53D1",step3:"\u6267\u884C",required:"\u6807\u9898\u3001\u6307\u4EE4\u4E0D\u80FD\u4E3A\u7A7A\u3002",inboxEmpty:"\u6CA1\u6709\u901A\u77E5\u3002",markRead:"\u5168\u90E8\u5DF2\u8BFB",noRuns:"\u8FD8\u6CA1\u6709\u8FD0\u884C\u8BB0\u5F55\u3002",duration:"\u8017\u65F6",steps:"\u6B65\u9AA4",tools:"\u5DE5\u5177\u8C03\u7528",errorTitle:"\u9519\u8BEF",policyText:"\u56FA\u5B9A preset\uFF1Acapital-generation\uFF08Capital \u81EA\u52A8\u6A21\u5F0F\uFF09\uFF1Bcwd\uFF1A\u4EFB\u52A1\u9009\u5B9A\u7684\u5DE5\u4F5C\u533A\uFF0C\u672A\u9009\u62E9\u65F6\u4F7F\u7528 CapGen \u6295\u7814\u81EA\u52A8\u5316\u5DE5\u4F5C\u533A\uFF1B\u53EA\u5141\u8BB8 Capital \u89D2\u8272\u5DE5\u5177\u65CF\uFF1B\u65E0\u4EBA\u503C\u5B88\u8FD0\u884C\u7981\u6B62\u63D0\u95EE\u3001\u5199\u6587\u4EF6\u4E0E shell \u63D0\u6743\u3002",budgetHint:"\u5DE5\u5177\u8C03\u7528\u4E0E\u6B65\u9AA4\u9884\u7B97\u8986\u76D6\u6574\u68F5\u8FD0\u884C\u5B50\u6811\uFF1A\u5B50 Agent \u4E0E PTC \u6D3E\u53D1\u90FD\u8BA1\u5165\u3002",errorGeneric:"\u64CD\u4F5C\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002",needConfirm:"\u9700\u8981\u7528\u6237\u786E\u8BA4"};function X(){if(typeof document>"u"||document.querySelector(`style[data-${j}]`))return()=>{};let n=document.createElement("style");return n.setAttribute(`data-${j}`,"true"),n.textContent=`
|
|
9
|
+
.capital-automation-page { display: flex; flex-direction: column; gap: 14px; min-height: 0; height: 100%; padding: 20px 24px 24px; color: var(--dsw-alias-label-primary); }
|
|
10
|
+
.capital-automation-head { display: flex; flex-wrap: wrap; align-items: flex-start; justify-content: space-between; gap: 12px; }
|
|
11
|
+
.capital-automation-title { margin: 0; font-size: 20px; line-height: 28px; font-weight: 600; letter-spacing: .2px; }
|
|
12
|
+
.capital-automation-sub { margin: 2px 0 0; color: var(--dsw-alias-label-tertiary); font-size: 12px; line-height: 18px; }
|
|
13
|
+
.capital-automation-meta { display: flex; flex-wrap: wrap; gap: 6px 12px; color: var(--dsw-alias-label-secondary); font-size: 12px; line-height: 20px; }
|
|
14
|
+
.capital-automation-badge { display: inline-flex; align-items: center; gap: 4px; padding: 2px 8px; border-radius: 999px; background: var(--dsw-alias-bg-module-platform); }
|
|
15
|
+
.capital-automation-badge[data-ok="false"] { color: var(--dsw-alias-state-warn-label); }
|
|
16
|
+
.capital-automation-badge[data-ok="true"] { color: var(--dsw-alias-state-success-primary); }
|
|
17
|
+
.capital-automation-banner { padding: 10px 14px; border: .5px solid var(--dsw-alias-state-error-primary); border-radius: 10px; color: var(--dsw-alias-state-error-primary); background: var(--dsw-alias-state-error-tertiary, transparent); font-size: 12px; line-height: 18px; }
|
|
18
|
+
.capital-automation-body { display: grid; grid-template-columns: minmax(260px, 340px) minmax(0, 1fr); gap: 16px; min-height: 0; flex: 1 1 auto; }
|
|
19
|
+
.capital-automation-list { display: flex; flex-direction: column; gap: 10px; min-height: 0; overflow: auto; padding-right: 4px; }
|
|
20
|
+
.capital-automation-group { display: flex; flex-direction: column; gap: 4px; }
|
|
21
|
+
.capital-automation-group-title { margin: 0; padding: 4px 2px; color: var(--dsw-alias-label-tertiary); font-size: 11px; font-weight: 600; letter-spacing: .3px; }
|
|
22
|
+
.capital-automation-task { display: flex; flex-direction: column; gap: 3px; width: 100%; padding: 10px 12px; border: .5px solid var(--dsw-alias-border-l1); border-radius: 10px; background: var(--dsw-alias-bg-layer-2); color: inherit; font: inherit; text-align: left; cursor: pointer; }
|
|
23
|
+
.capital-automation-task[aria-selected="true"] { border-color: var(--dsw-alias-brand-primary); box-shadow: inset 0 0 0 1px var(--dsw-alias-brand-primary); }
|
|
24
|
+
.capital-automation-task:hover { background: var(--dsw-alias-interactive-bg-hover); }
|
|
25
|
+
.capital-automation-task-row { display: flex; align-items: center; gap: 6px; min-width: 0; }
|
|
26
|
+
.capital-automation-task-title { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 13px; font-weight: 500; }
|
|
27
|
+
.capital-automation-task-meta { display: flex; flex-wrap: wrap; gap: 4px 10px; color: var(--dsw-alias-label-tertiary); font-size: 11px; line-height: 16px; }
|
|
28
|
+
.capital-automation-dot { flex: none; width: 6px; height: 6px; border-radius: 50%; background: var(--dsw-alias-label-tertiary); }
|
|
29
|
+
.capital-automation-dot[data-run="true"] { background: var(--dsw-alias-state-business-primary); }
|
|
30
|
+
.capital-automation-count { flex: none; min-width: 16px; padding: 0 5px; border-radius: 999px; background: var(--dsw-alias-state-business-primary); color: #fff; font-size: 10px; line-height: 16px; text-align: center; }
|
|
31
|
+
.capital-automation-detail { display: flex; flex-direction: column; gap: 14px; min-width: 0; overflow: auto; padding: 4px 4px 8px; }
|
|
32
|
+
.capital-automation-card { border: .5px solid var(--dsw-alias-border-l1); border-radius: 12px; background: var(--dsw-alias-bg-layer-2); padding: 14px 16px; display: flex; flex-direction: column; gap: 10px; }
|
|
33
|
+
.capital-automation-card h3 { margin: 0; font-size: 14px; font-weight: 600; }
|
|
34
|
+
.capital-automation-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 10px; }
|
|
35
|
+
.capital-automation-field { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
|
|
36
|
+
.capital-automation-field > span { color: var(--dsw-alias-label-tertiary); font-size: 11px; line-height: 16px; }
|
|
37
|
+
.capital-automation-field input, .capital-automation-field select, .capital-automation-field textarea { width: 100%; box-sizing: border-box; padding: 7px 9px; border: .5px solid var(--dsw-alias-border-l1); border-radius: 8px; background: var(--dsw-alias-bg-module-platform); color: var(--dsw-alias-label-primary); font: inherit; font-size: 12px; line-height: 18px; }
|
|
38
|
+
.capital-automation-field textarea { min-height: 120px; resize: vertical; }
|
|
39
|
+
.capital-automation-field input:focus-visible, .capital-automation-field select:focus-visible, .capital-automation-field textarea:focus-visible, .capital-automation-btn:focus-visible, .capital-automation-task:focus-visible { outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-brand-primary)); outline-offset: 1px; }
|
|
40
|
+
.capital-automation-actions { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
|
|
41
|
+
.capital-automation-btn { padding: 5px 11px; border: .5px solid var(--dsw-alias-border-l1); border-radius: 8px; background: var(--dsw-alias-bg-module-platform); color: var(--dsw-alias-label-primary); font: inherit; font-size: 12px; line-height: 18px; cursor: pointer; }
|
|
42
|
+
.capital-automation-btn:hover { background: var(--dsw-alias-interactive-bg-hover); }
|
|
43
|
+
.capital-automation-btn[data-primary="true"] { border-color: transparent; background: var(--dsw-alias-brand-primary); color: #fff; }
|
|
44
|
+
.capital-automation-btn[data-danger="true"] { color: var(--dsw-alias-state-error-primary); }
|
|
45
|
+
.capital-automation-btn:disabled { opacity: .5; cursor: not-allowed; }
|
|
46
|
+
.capital-automation-hint { margin: 0; color: var(--dsw-alias-label-tertiary); font-size: 11px; line-height: 17px; }
|
|
47
|
+
.capital-automation-notice { margin: 0; color: var(--dsw-alias-state-success-primary); font-size: 12px; line-height: 18px; }
|
|
48
|
+
.capital-automation-error { margin: 0; color: var(--dsw-alias-state-error-primary); font-size: 12px; line-height: 18px; }
|
|
49
|
+
.capital-automation-run { display: flex; flex-direction: column; gap: 4px; padding: 9px 0; border-bottom: .5px solid var(--dsw-alias-border-l2); }
|
|
50
|
+
.capital-automation-run:last-child { border-bottom: 0; }
|
|
51
|
+
.capital-automation-run-head { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; font-size: 12px; }
|
|
52
|
+
.capital-automation-run-status { font-weight: 600; }
|
|
53
|
+
.capital-automation-run-status[data-status="failed"], .capital-automation-run-status[data-status="timed_out"], .capital-automation-run-status[data-status="blocked_requires_user"] { color: var(--dsw-alias-state-error-primary); }
|
|
54
|
+
.capital-automation-run-status[data-status="succeeded"] { color: var(--dsw-alias-state-success-primary); }
|
|
55
|
+
.capital-automation-run-meta { color: var(--dsw-alias-label-tertiary); font-size: 11px; line-height: 16px; }
|
|
56
|
+
.capital-automation-error-item { color: var(--dsw-alias-state-error-primary); font-size: 11px; line-height: 16px; overflow-wrap: anywhere; }
|
|
57
|
+
.capital-automation-switch-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 2px 0; }
|
|
58
|
+
.capital-automation-switch-row span { font-size: 12px; }
|
|
59
|
+
.capital-automation-wizard { display: flex; flex-direction: column; gap: 12px; min-height: 0; }
|
|
60
|
+
.capital-automation-steps { display: flex; gap: 6px; }
|
|
61
|
+
.capital-automation-step { flex: 1 1 auto; padding: 5px 8px; border-radius: 8px; background: var(--dsw-alias-bg-module-platform); color: var(--dsw-alias-label-tertiary); font-size: 11px; text-align: center; }
|
|
62
|
+
.capital-automation-step[data-active="true"] { background: var(--dsw-alias-brand-primary); color: #fff; }
|
|
63
|
+
.capital-automation-empty { padding: 28px 0; color: var(--dsw-alias-label-tertiary); font-size: 12px; text-align: center; }
|
|
64
|
+
@media (max-width: 780px) { .capital-automation-body { grid-template-columns: 1fr; } }
|
|
65
|
+
`,document.head.appendChild(n),()=>n.remove()}function Z(){async function n(e,p={}){let s=typeof AbortController=="function"?new AbortController:void 0,c=setTimeout(()=>s?.abort(),2e4),u,d;try{u=await fetch(`${Q}${e}`,{method:p.method??"GET",credentials:"same-origin",headers:p.body===void 0?{}:{"content-type":"application/json"},body:p.body===void 0?void 0:JSON.stringify(p.body),...s===void 0?{}:{signal:s.signal}});try{d=await u.json()}catch{throw new Error(t.errorGeneric)}}finally{clearTimeout(c)}if(!u.ok||d?.ok===!1){let x=new Error(d?.message??t.errorGeneric);throw x.code=d?.code,x}return d}return{meta:()=>n("/meta"),tasks:()=>n("/tasks"),detail:e=>n(`/tasks/${encodeURIComponent(e)}`),create:e=>n("/tasks",{method:"POST",body:e}),patch:(e,p)=>n(`/tasks/${encodeURIComponent(e)}`,{method:"PATCH",body:p}),remove:e=>n(`/tasks/${encodeURIComponent(e)}`,{method:"DELETE"}),action:(e,p)=>n(`/tasks/${encodeURIComponent(e)}/${p}`,{method:"POST"}),run:e=>n(`/tasks/${encodeURIComponent(e)}/run`,{method:"POST"}),cancel:e=>n(`/runs/${encodeURIComponent(e)}/cancel`,{method:"POST"}),runs:(e="")=>n(`/runs${e}`),notifications:()=>n("/notifications"),markRead:e=>n("/notifications/read",{method:"POST",body:e})}}function q(n){return t.status[n]??n}function H(n){return t.state[n]??n}function V(n,e){let p=[{id:"",title:t.workspaceDefault}],s=Array.isArray(n?.workspaces)?n.workspaces:[];for(let c of s)typeof c?.id!="string"||c.id.length===0||p.push({id:c.id,title:c.default===!0?`${c.title}\uFF08\u9ED8\u8BA4\uFF09`:c.title});return typeof e=="string"&&e.length>0&&!p.some(c=>c.id===e)&&p.push({id:e,title:t.workspaceMissing}),p}function G(n){if(typeof n!="string"||n.length===0)return t.never;let e=new Date(n);return Number.isNaN(e.getTime())?n:new Intl.DateTimeFormat("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",hourCycle:"h23"}).format(e)}function aa(n){if(typeof n!="number"||n<0)return t.never;let e=Math.round(n/1e3);return e<60?`${e}s`:`${Math.floor(e/60)}m ${e%60}s`}function ta(n){let e=new Map,p=n.filter(c=>c.lastRun&&["queued","starting","running"].includes(c.lastRun.status));p.length>0&&e.set("running",p);let s=new Set(p.map(c=>c.id));for(let c of n){if(s.has(c.id))continue;let u=c.origin==="custom"?"custom":c.category==="market"?"market":c.category==="review"?"review":c.category==="research"?"research":"news",d=e.get(u)??[];d.push(c),e.set(u,d)}return e}function ea(n){let{task:e,selected:p,onSelect:s}=n,c=e.lastRun,u=c&&["queued","starting","running"].includes(c.status);return a("button",{type:"button",className:"capital-automation-task","aria-selected":p?"true":"false",onClick:()=>s(e.id)},a("span",{className:"capital-automation-task-row"},a("span",{className:"capital-automation-dot","data-run":u?"true":"false"}),a("span",{className:"capital-automation-task-title"},e.title),e.unread>0?a("span",{className:"capital-automation-count"},String(e.unread)):null,a("span",{className:"capital-automation-task-meta"},H(e.state))),a("span",{className:"capital-automation-task-meta"},a("span",null,`${t.nextRun}: ${e.nextRunLocal??(e.nextRunUnavailable?t.calendarMissing:t.never)}`),a("span",null,`${t.lastResult}: ${c?q(c.status):t.never}`)))}function F(n){return a("div",{className:"capital-automation-switch-row"},a("span",null,n.label),a(P,{checked:n.checked===!0,onChange:n.onChange,label:n.label,disabled:n.disabled}))}function W(n){let{trigger:e,onChange:p,disabled:s}=n,c=u=>p({...e,...u});return a("div",{className:"capital-automation-grid"},a("label",{className:"capital-automation-field"},a("span",null,"\u8282\u594F"),a("select",{value:e.cadence,disabled:s,onChange:u=>{let d=u.target.value;c({cadence:d,...d==="weekly"?{weekdays:e.weekdays??[1,3,5]}:{weekdays:void 0},...d==="monthly"?{dayOfMonth:e.dayOfMonth??1}:{dayOfMonth:void 0}})}},Object.entries(t.cadence).map(([u,d])=>a("option",{key:u,value:u},d)))),a("label",{className:"capital-automation-field"},a("span",null,t.timeField),a("input",{type:"time",value:e.time,disabled:s,onChange:u=>c({time:u.target.value})})),a("label",{className:"capital-automation-field"},a("span",null,t.timezoneField),a("input",{type:"text",value:e.timezone,disabled:s,onChange:u=>c({timezone:u.target.value})})),a("label",{className:"capital-automation-field"},a("span",null,t.tradingDaysField),a(P,{checked:e.tradingDaysOnly===!0,onChange:u=>c({tradingDaysOnly:u}),label:t.tradingDaysField,disabled:s})),e.cadence==="weekly"?a("label",{className:"capital-automation-field"},a("span",null,t.weekdayField),a("input",{type:"text",value:(e.weekdays??[]).join(","),disabled:s,onChange:u=>c({weekdays:u.target.value.split(",").map(d=>Number(d.trim())).filter(d=>Number.isInteger(d)&&d>=1&&d<=7)})})):null,e.cadence==="monthly"?a("label",{className:"capital-automation-field"},a("span",null,t.dayField),a("input",{type:"number",min:1,max:28,value:e.dayOfMonth??1,disabled:s,onChange:u=>c({dayOfMonth:Number(u.target.value)})})):null)}function ia(n){let{detail:e,meta:p,api:s,onChanged:c,openSession:u}=n,[d,x]=w(null),[m,T]=w(""),[k,S]=w(""),[g,$]=w("");if(M(()=>{x(e.task?{...e.task,trigger:{...e.task.trigger},limits:{...e.task.limits},notifications:{...e.task.notifications}}:null),S(""),$("")},[e]),d===null)return a("p",{className:"capital-automation-empty"},t.loading);let l=d,y=p?.storage?.state!=="unavailable",o=e.runs.some(i=>["queued","starting","running"].includes(i.status)),r=i=>x(f=>({...f,...typeof i=="function"?i(f):i}));async function v(i,f){if(!m){T(i),$(""),S("");try{await f(),S(t.saved),await c(e.task.id)}catch(R){$(R.message??t.errorGeneric)}finally{T("")}}}async function N(){await v("save",async()=>{let i={title:l.title.trim(),description:l.description??"",instruction:l.instruction,category:l.category,trigger:l.trigger,mode:l.mode,workspaceId:l.workspaceId??"",limits:l.limits,notifications:l.notifications};if(i.title.length===0||i.instruction.trim().length===0)throw new Error(t.required);await s.patch(l.id,i)})}return a("div",{className:"capital-automation-detail"},a("section",{className:"capital-automation-card"},a("h3",null,t.overview),a("div",{className:"capital-automation-grid"},a("div",{className:"capital-automation-field"},a("span",null,t.stateLabel),a("strong",null,H(l.state))),a("div",{className:"capital-automation-field"},a("span",null,t.nextRun),a("strong",null,e.task.nextRunLocal??t.never)),a("div",{className:"capital-automation-field"},a("span",null,t.lastResult),a("strong",null,e.runs[0]?q(e.runs[0].status):t.never)),a("div",{className:"capital-automation-field"},a("span",null,"\u6765\u6E90"),a("strong",null,l.origin==="builtin"?"\u5185\u7F6E\u6A21\u677F":"\u6211\u7684\u4EFB\u52A1"))),a("div",{className:"capital-automation-actions"},a("button",{type:"button",className:"capital-automation-btn","data-primary":"true",disabled:m||!y,onClick:()=>v("run",async()=>{await s.run(l.id)})},t.runNow),l.state==="active"?a("button",{type:"button",className:"capital-automation-btn",disabled:m||!y,onClick:()=>v("pause",async()=>{await s.action(l.id,"pause")})},t.pause):a("button",{type:"button",className:"capital-automation-btn",disabled:m||!y,onClick:()=>v("activate",async()=>{await s.action(l.id,"activate")})},t.activate),l.origin==="builtin"&&l.state!=="dormant"?a("button",{type:"button",className:"capital-automation-btn",disabled:m||o||!y,onClick:()=>v("hibernate",async()=>{await s.action(l.id,"hibernate")})},t.hibernate):null,l.origin==="builtin"?a("button",{type:"button",className:"capital-automation-btn",disabled:m||!y,onClick:()=>v("copy",async()=>{await s.action(l.id,"copy")})},t.copy):a("button",{type:"button",className:"capital-automation-btn","data-danger":"true",disabled:m||o||!y,onClick:()=>v("remove",async()=>{await s.remove(l.id)})},t.remove)),k.length>0?a("p",{className:"capital-automation-notice"},k):null,g.length>0?a("p",{className:"capital-automation-error"},g):null),a("section",{className:"capital-automation-card"},a("h3",null,t.config),a("label",{className:"capital-automation-field"},a("span",null,t.titleField),a("input",{value:l.title,disabled:m,onChange:i=>r({title:i.target.value})})),a("label",{className:"capital-automation-field"},a("span",null,t.descriptionField),a("textarea",{value:l.description??"",disabled:m,onChange:i=>r({description:i.target.value})})),a("label",{className:"capital-automation-field"},a("span",null,t.instructionField),a("textarea",{value:l.instruction,disabled:m,onChange:i=>r({instruction:i.target.value})})),a("h3",null,t.triggerField),a(W,{trigger:l.trigger,disabled:m,onChange:i=>r({trigger:i})}),a("div",{className:"capital-automation-grid"},a("label",{className:"capital-automation-field"},a("span",null,t.workspaceField),a("select",{value:l.workspaceId??"",disabled:m,onChange:i=>r({workspaceId:i.target.value})},V(p,l.workspaceId).map(i=>a("option",{key:i.id,value:i.id},i.title)))),a("label",{className:"capital-automation-field"},a("span",null,t.modeField),a("select",{value:l.mode,disabled:m,onChange:i=>r({mode:i.target.value})},Object.entries(t.mode).map(([i,f])=>a("option",{key:i,value:i},f)))),a("label",{className:"capital-automation-field"},a("span",null,t.runTimeout),a("input",{type:"number",min:5,max:120,value:l.limits.runTimeoutMinutes,disabled:m,onChange:i=>r(f=>({limits:{...f.limits,runTimeoutMinutes:Number(i.target.value)}}))})),a("label",{className:"capital-automation-field"},a("span",null,t.idleTimeout),a("input",{type:"number",min:1,max:30,value:l.limits.idleTimeoutMinutes,disabled:m,onChange:i=>r(f=>({limits:{...f.limits,idleTimeoutMinutes:Number(i.target.value)}}))})),a("label",{className:"capital-automation-field"},a("span",null,t.maxSteps),a("input",{type:"number",min:10,max:2e3,value:l.limits.maxSteps,disabled:m,onChange:i=>r(f=>({limits:{...f.limits,maxSteps:Number(i.target.value)}}))})),a("label",{className:"capital-automation-field"},a("span",null,t.maxToolCalls),a("input",{type:"number",min:10,max:6e3,value:l.limits.maxToolCalls,disabled:m,onChange:i=>r(f=>({limits:{...f.limits,maxToolCalls:Number(i.target.value)}}))}))),a("p",{className:"capital-automation-hint"},t.modeHint),p?.workspaceError?a("p",{className:"capital-automation-error"},t.workspaceUnavailable):null,a("h3",null,t.notifyField),a(F,{label:t.notifyInApp,checked:l.notifications.inApp,disabled:m,onChange:i=>r(f=>({notifications:{...f.notifications,inApp:i}}))}),a(F,{label:t.notifyFailure,checked:l.notifications.onFailure,disabled:m,onChange:i=>r(f=>({notifications:{...f.notifications,onFailure:i}}))}),a(F,{label:t.notifySuccess,checked:l.notifications.onSuccess,disabled:m,onChange:i=>r(f=>({notifications:{...f.notifications,onSuccess:i}}))}),a("div",{className:"capital-automation-actions"},a("button",{type:"button",className:"capital-automation-btn","data-primary":"true",disabled:m||!y,onClick:N},m==="save"?t.saving:t.save))),a("section",{className:"capital-automation-card"},a("h3",null,t.runs),e.runs.length===0?a("p",{className:"capital-automation-hint"},t.noRuns):null,e.runs.map(i=>a("div",{key:i.id,className:"capital-automation-run"},a("div",{className:"capital-automation-run-head"},a("span",{className:"capital-automation-run-status","data-status":i.status},q(i.status)),a("span",{className:"capital-automation-run-meta"},`${G(i.queuedAt)} \xB7 ${i.trigger==="manual"?"\u624B\u52A8":"\u5B9A\u65F6"}`),typeof i.durationMs=="number"?a("span",{className:"capital-automation-run-meta"},`${t.duration} ${aa(i.durationMs)}`):null,a("span",{className:"capital-automation-run-meta"},`${t.steps} ${i.steps} \xB7 ${t.tools} ${i.toolCalls}`),["queued","starting","running"].includes(i.status)?a("button",{type:"button",className:"capital-automation-btn","data-danger":"true",disabled:m,onClick:()=>v(`cancel-${i.id}`,async()=>{await s.cancel(i.id)})},t.cancelRun):i.sessionId&&u?a("button",{type:"button",className:"capital-automation-btn",onClick:()=>u(i.sessionId)},t.openSession):null),i.sessionTitle?a("span",{className:"capital-automation-run-meta"},i.sessionTitle):null,i.summary?a("span",{className:"capital-automation-run-meta"},i.summary):null,i.errors.map((f,R)=>a("span",{key:`${i.id}-${R}`,className:"capital-automation-error-item"},`${f.code}: ${f.message}`)))),a("section",{className:"capital-automation-card"},a("h3",null,t.policy),a("p",{className:"capital-automation-hint"},t.policyText),a("p",{className:"capital-automation-hint"},t.budgetHint),a("p",{className:"capital-automation-hint"},`profileKey: ${p?.profile?.key??"-"} \xB7 ${t.presetLabel}: ${t.presetValue} \xB7 cwdKind: profile`)),a("section",{className:"capital-automation-card"},a("div",{className:"capital-automation-actions"},a("h3",null,t.notifications),e.notifications.some(i=>i.readAt===void 0)?a("button",{type:"button",className:"capital-automation-btn",disabled:m,onClick:()=>v("read-notifications",async()=>{await s.markRead({all:!0})})},t.markRead):null),e.notifications.length===0?a("p",{className:"capital-automation-hint"},t.inboxEmpty):null,e.notifications.map(i=>a("div",{key:i.id,className:"capital-automation-run"},a("div",{className:"capital-automation-run-head"},a("strong",null,i.title),a("span",{className:"capital-automation-run-meta"},G(i.createdAt))),a("span",{className:"capital-automation-run-meta"},i.message))))))}function na(n){let{open:e,onClose:p,api:s,onCreated:c,meta:u}=n,[d,x]=w(0),[m,T]=w(!1),[k,S]=w(""),[g,$]=w({title:"",description:"",instruction:"",category:"research",trigger:{kind:"schedule",cadence:"daily",time:"09:00",timezone:"Asia/Shanghai",tradingDaysOnly:!0},mode:"research",workspaceId:"",limits:{runTimeoutMinutes:30,idleTimeoutMinutes:5,maxSteps:300,maxToolCalls:1200},notifications:{inApp:!0,onFailure:!0,onSuccess:!1}});M(()=>{e&&(x(0),S(""),T(!1),$({title:"",description:"",instruction:"",category:"research",trigger:{kind:"schedule",cadence:"daily",time:"09:00",timezone:"Asia/Shanghai",tradingDaysOnly:!0},mode:"research",workspaceId:"",limits:{runTimeoutMinutes:30,idleTimeoutMinutes:5,maxSteps:300,maxToolCalls:1200},notifications:{inApp:!0,onFailure:!0,onSuccess:!1}}))},[e]);let l=o=>$(r=>({...r,...typeof o=="function"?o(r):o}));async function y(){if(g.title.trim().length===0||g.instruction.trim().length===0){S(t.required);return}T(!0),S("");try{await s.create({title:g.title.trim(),description:g.description,instruction:g.instruction,category:g.category,trigger:g.trigger,mode:g.mode,workspaceId:g.workspaceId??"",limits:g.limits,notifications:g.notifications}),c()}catch(o){S(o.message??t.errorGeneric)}finally{T(!1)}}return e?a(J,{open:e,onClose:p,title:t.newTask,closeLabel:t.close,footer:a("div",{className:"capital-automation-actions"},d>0?a("button",{type:"button",className:"capital-automation-btn",onClick:()=>x(d-1),disabled:m},t.back):null,d<2?a("button",{type:"button",className:"capital-automation-btn","data-primary":"true",onClick:()=>x(d+1),disabled:m},t.next):a("button",{type:"button",className:"capital-automation-btn","data-primary":"true",onClick:y,disabled:m||u?.storage?.state==="unavailable"},m?t.saving:t.create))},a("div",{className:"capital-automation-wizard"},a("div",{className:"capital-automation-steps"},[t.step1,t.step2,t.step3].map((o,r)=>a("span",{key:o,className:"capital-automation-step","data-active":r===d?"true":"false"},`${r+1}. ${o}`))),d===0?a("div",{className:"capital-automation-grid"},a("label",{className:"capital-automation-field"},a("span",null,t.titleField),a("input",{value:g.title,onChange:o=>l({title:o.target.value})})),a("label",{className:"capital-automation-field"},a("span",null,t.descriptionField),a("textarea",{value:g.description,onChange:o=>l({description:o.target.value})})),a("label",{className:"capital-automation-field"},a("span",null,t.instructionField),a("textarea",{value:g.instruction,onChange:o=>l({instruction:o.target.value})}))):null,d===1?a("div",null,a(W,{trigger:g.trigger,onChange:o=>l({trigger:o})}),a("p",{className:"capital-automation-hint"},"\u4EA4\u6613\u65E5\u5386\u4E0D\u53EF\u7528\u65F6\u4EFB\u52A1\u4F1A\u8BB0\u4E3A skipped_calendar_unavailable\uFF0C\u4E0D\u6309\u5468\u4E00\u81F3\u5468\u4E94\u731C\u6D4B\u8FD0\u884C\u3002")):null,d===2?a("div",null,a("div",{className:"capital-automation-grid"},a("label",{className:"capital-automation-field"},a("span",null,t.workspaceField),a("select",{value:g.workspaceId??"",onChange:o=>l({workspaceId:o.target.value})},V(u,g.workspaceId).map(o=>a("option",{key:o.id,value:o.id},o.title)))),a("label",{className:"capital-automation-field"},a("span",null,t.modeField),a("select",{value:g.mode,onChange:o=>l({mode:o.target.value})},Object.entries(t.mode).map(([o,r])=>a("option",{key:o,value:o},r)))),a("label",{className:"capital-automation-field"},a("span",null,t.runTimeout),a("input",{type:"number",min:5,max:120,value:g.limits.runTimeoutMinutes,onChange:o=>l(r=>({limits:{...r.limits,runTimeoutMinutes:Number(o.target.value)}}))})),a("label",{className:"capital-automation-field"},a("span",null,t.idleTimeout),a("input",{type:"number",min:1,max:30,value:g.limits.idleTimeoutMinutes,onChange:o=>l(r=>({limits:{...r.limits,idleTimeoutMinutes:Number(o.target.value)}}))})),a("label",{className:"capital-automation-field"},a("span",null,t.maxSteps),a("input",{type:"number",min:10,max:2e3,value:g.limits.maxSteps,onChange:o=>l(r=>({limits:{...r.limits,maxSteps:Number(o.target.value)}}))})),a("label",{className:"capital-automation-field"},a("span",null,t.maxToolCalls),a("input",{type:"number",min:10,max:6e3,value:g.limits.maxToolCalls,onChange:o=>l(r=>({limits:{...r.limits,maxToolCalls:Number(o.target.value)}}))}))),a("p",{className:"capital-automation-hint"},t.modeHint),u?.workspaceError?a("p",{className:"capital-automation-error"},t.workspaceUnavailable):null,a(F,{label:t.notifyInApp,checked:g.notifications.inApp,onChange:o=>l(r=>({notifications:{...r.notifications,inApp:o}}))}),a(F,{label:t.notifyFailure,checked:g.notifications.onFailure,onChange:o=>l(r=>({notifications:{...r.notifications,onFailure:o}}))}),a(F,{label:t.notifySuccess,checked:g.notifications.onSuccess,onChange:o=>l(r=>({notifications:{...r.notifications,onSuccess:o}}))})):null,k.length>0?a("p",{className:"capital-automation-error"},k):null)):null}function la(n){let{api:e,openSession:p}=n,[s,c]=w(null),[u,d]=w([]),[x,m]=w(null),[T,k]=w(null),[S,g]=w(!1),[$,l]=w(""),y=I(!1),o=I(null),r=I(null),v=I(0),N=I(0);async function i(){if(r.current!==null)return r.current;let b=v.current+1;v.current=b;let h=(async()=>{try{let[C,L]=await Promise.all([e.meta(),e.tasks()]);if(!y.current||b!==v.current)return;let _=Array.isArray(L.tasks)?L.tasks:[];c(C),d(_),l("");let A=o.current,E=A!==null&&_.some(K=>K.id===A)?A:_[0]?.id??null;E!==A&&(o.current=E,N.current+=1,k(null),m(E))}catch(C){y.current&&b===v.current&&l(C.message??t.errorGeneric)}})();r.current=h;try{await h}finally{r.current===h&&(r.current=null)}}async function f(b){let h=N.current+1;N.current=h;try{let C=await e.detail(b);if(!y.current||h!==N.current||o.current!==b)return;k(C)}catch(C){y.current&&h===N.current&&o.current===b&&l(C.message??t.errorGeneric)}}function R(b){o.current!==b&&(o.current=b,N.current+=1,k(null),m(b))}M(()=>{y.current=!0,i();let b=setInterval(()=>{document.visibilityState!=="hidden"&&i()},15e3),h=()=>{document.visibilityState==="visible"&&i()};return document.addEventListener?.("visibilitychange",h),()=>{y.current=!1,v.current+=1,N.current+=1,r.current=null,clearInterval(b),document.removeEventListener?.("visibilitychange",h)}},[]),M(()=>{if(x===null){k(null),N.current+=1;return}return k(null),f(x),()=>{N.current+=1}},[x]);let B=ta(u),z=s?.scheduler?.state,D=s?.storage?.state!=="unavailable";return a("div",{className:"capital-automation-page"},a("header",{className:"capital-automation-head"},a("div",null,a("h1",{className:"capital-automation-title"},t.title),a("p",{className:"capital-automation-sub"},t.subtitle)),a("div",{className:"capital-automation-meta"},a("span",{className:"capital-automation-badge"},`${t.profile}: ${s?.profile?.name??"\u2014"}`),a("span",{className:"capital-automation-badge","data-ok":z==="active"?"true":"false"},`${t.scheduler}: ${z==="active"?t.schedulerActive:z==="standby"?t.schedulerStandby:z==="stopped"?t.schedulerStopped:t.schedulerStarting}`),a("span",{className:"capital-automation-badge","data-ok":s?.calendar?.available===!0?"true":"false"},`${t.calendar}: ${s?.calendar?.available===!0?t.calendarOk:t.calendarMissing}`),a("span",{className:"capital-automation-badge"},`v${s?.version??"\u2014"}`),a("button",{type:"button",className:"capital-automation-btn","data-primary":"true",disabled:!D,onClick:()=>g(!0)},t.newTask))),!D&&s?a("div",{className:"capital-automation-banner"},`${t.storageUnavailable}${s.storage?.error?`\uFF1A${s.storage.error}`:""}`):null,$.length>0?a("p",{className:"capital-automation-error"},$):null,a("div",{className:"capital-automation-body"},a("aside",{className:"capital-automation-list"},u.length===0?a("p",{className:"capital-automation-empty"},t.empty):null,[...B.entries()].map(([b,h])=>a("section",{key:b,className:"capital-automation-group"},a("h2",{className:"capital-automation-group-title"},t.groups[b]??b),h.map(C=>a(ea,{key:C.id,task:C,selected:C.id===x,onSelect:R}))))),a("main",{className:"capital-automation-detail"},T===null?a("p",{className:"capital-automation-empty"},t.noSelection):null,T!==null?a(ia,{detail:T,meta:s,api:e,openSession:p,onChanged:async b=>{await i();let h=b??o.current;h!==null&&o.current===h&&await f(h)}}):null)),a(na,{open:S,onClose:()=>g(!1),api:e,meta:s,onCreated:async()=>{g(!1),await i()}}))}function oa(){return a(Y,{width:18,height:18})}function sa(n){let e=Z(),p=s=>{try{n.get("uiWorkspace")?.openSession?.(s)}catch{}};n.effect(()=>X(),`${O}: styles`),n.slots.inject("main",()=>n.slots.register({name:"main",key:U,inject:()=>({api:e,openSession:p})},la)),n.slots.inject("sidebar.panellist",()=>n.slots.register({name:"sidebar.panellist",id:U,order:11,label:()=>t.panel},oa)),n.logger?.info?.(`${O}: \u5BA2\u6237\u7AEF\u534A\u8FB9\u5DF2\u6302\u8F7D\uFF08\u9875\u9762 + \u4FA7\u680F\u5165\u53E3\uFF09`)}exports.name=O;exports.inject=["slots"];exports.apply=sa;
|
|
66
|
+
return module.exports
|
|
67
|
+
},
|
|
68
|
+
})
|