openclaw-glance-plugin 0.1.3 → 0.1.5

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/README.md CHANGED
@@ -1,24 +1,21 @@
1
1
  # openclaw-glance
2
2
 
3
- 智能盯盘:OpenClaw 插件客户端(连接 `openclaw-bridge`)。
3
+ 智能盯盘:OpenClaw 插件连接 `openclaw-bridge`。
4
4
 
5
- OpenClaw 集成引导请看:[docs/openclaw-install-guide.md](./docs/openclaw-install-guide.md)
5
+ 安装与接入文档:
6
6
 
7
- ## 插件定位
7
+ - OpenClaw 插件模式:[docs/openclaw-install-guide.md](./docs/openclaw-install-guide.md)
8
8
 
9
- 这个插件用于让 OpenClaw 在“用户提出盯盘需求”时,快速完成以下动作:
9
+ ## 插件定位
10
10
 
11
- - 建立与 `openclaw-bridge` 的长连接
12
- - 把用户自然语言需求转成结构化策略并提交(`watch.create`)
13
- - 在触发后实时接收 `watch.triggered` 回调给 OpenClaw 业务层
14
- - 支持策略控制(激活、暂停、删除)
11
+ 本项目当前以 OpenClaw 插件模式运行(`index.js` + `openclaw.plugin.json`),保持长连接并接收 `watch.triggered`,并对同一 `baseWsUrl + token` 启用严格单活锁,防止重复实例。
15
12
 
16
- ## OpenClaw 调用时机
13
+ ## OpenClaw 调用时机(插件模式)
17
14
 
18
15
  - 用户新建盯盘:调用 `submitWatchDemand` 或 `createWatch`
19
16
  - 用户修改状态:调用 `activate` / `pause`
20
17
  - 用户删除盯盘:调用 `remove`
21
- - 需要接收触发消息:注册 `onTriggered` 并保持连接在线
18
+ - 需要接收触发消息:由插件后台运行时持续接收
22
19
 
23
20
  ## 功能
24
21
 
@@ -27,6 +24,7 @@ OpenClaw 集成引导请看:[docs/openclaw-install-guide.md](./docs/openclaw-i
27
24
  - 支持渠道:`openclaw` / `email` / `call`
28
25
  - 订阅推送:`watch.triggered`
29
26
  - 自动重连 + 心跳
27
+ - 严格单活(同 token 只允许一个活跃进程)
30
28
  - 断线请求排队(可配置),重连后自动冲刷
31
29
  - 提供业务适配层 `OpenClawPluginAdapter`
32
30
 
package/index.js ADDED
@@ -0,0 +1,3 @@
1
+ import plugin from './src/plugin/index.js';
2
+
3
+ export default plugin;
@@ -0,0 +1,20 @@
1
+ {
2
+ "id": "glance-bridge",
3
+ "skills": ["./skills"],
4
+ "configSchema": {
5
+ "type": "object",
6
+ "additionalProperties": true,
7
+ "properties": {
8
+ "baseWsUrl": {
9
+ "type": "string"
10
+ },
11
+ "token": {
12
+ "type": "string"
13
+ },
14
+ "lockDir": {
15
+ "type": "string"
16
+ }
17
+ },
18
+ "required": ["token"]
19
+ }
20
+ }
package/package.json CHANGED
@@ -1,13 +1,17 @@
1
1
  {
2
2
  "name": "openclaw-glance-plugin",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "OpenClaw plugin client for ticker-monitor openclaw-bridge",
5
5
  "type": "module",
6
- "main": "src/index.js",
6
+ "main": "index.js",
7
7
  "exports": {
8
- ".": "./src/index.js"
8
+ ".": "./index.js",
9
+ "./sdk": "./src/index.js"
9
10
  },
10
11
  "files": [
12
+ "index.js",
13
+ "openclaw.plugin.json",
14
+ "skills",
11
15
  "src",
12
16
  "README.md"
13
17
  ],
@@ -0,0 +1,290 @@
1
+ ---
2
+ name: glance-watch
3
+ description: 智能盯盘插件,用于监控A股、港股、比特币等金融市场行情并在条件触发时发送提醒。当用户要求盯盘、监控价格、设置提醒时自动触发,例如"帮我盯着比特币"、监控某只股票、涨跌幅提醒等。
4
+ ---
5
+
6
+ # Glance Watch 智能盯盘
7
+
8
+ ## 快速开始
9
+
10
+ 1. **前置条件**(已完成):
11
+ - 插件/包已安装并可用(由宿主环境预先完成)
12
+ - 宿主已启动插件运行时(长连接由插件后台维护)
13
+
14
+ 2. **用户请求盯盘时**,解析用户需求提取:
15
+ - `productCode`: 产品代码
16
+ - `productType`: 市场类型 (stock/index/hk_stock/crypto)
17
+ - `condition`: 条件表达式
18
+ - `variables`: 变量值
19
+
20
+ 3. **通过已安装运行时提交盯盘请求**(长连接由宿主运行时维护)
21
+
22
+ 4. **用户要求“查行情/看当前价格/报价”时**,优先调用 `queryTickerData` 获取实时数据,再决定是否创建盯盘策略。
23
+
24
+ ## 调用契约(必须遵循)
25
+
26
+ ### 统一动作名
27
+
28
+ 宿主需将已安装插件/包接口映射为以下动作名(建议保持一致):
29
+
30
+ - `watch.query_ticker`
31
+ - `watch.create`
32
+ - `watch.pause`
33
+ - `watch.activate`
34
+ - `watch.remove`
35
+
36
+ ### 调用顺序
37
+
38
+ 1. 用户是“查行情”意图:先调用 `watch.query_ticker`
39
+ 2. 用户是“盯盘创建”意图:先补齐参数后调用 `watch.create`
40
+ 3. 用户是“暂停/恢复/删除”意图:分别调用 `watch.pause` / `watch.activate` / `watch.remove`
41
+
42
+ 禁止跳步:创建盯盘前若缺关键字段必须先追问。
43
+
44
+ ### 动作参数与成功判定
45
+
46
+ #### `watch.query_ticker`
47
+
48
+ 参数:
49
+ - `stockCode`(或 `productCode`)
50
+ - `productType`
51
+ - `market`(`crypto` 可传空字符串)
52
+
53
+ 成功判定:
54
+ - 返回 `code = "000000"` 或 `success = true`
55
+
56
+ 失败处理:
57
+ - 返回失败原因
58
+ - 引导用户确认代码/市场后重试
59
+
60
+ #### `watch.create`
61
+
62
+ 参数(最少):
63
+ - `productCode`
64
+ - `productType`
65
+ - `condition`
66
+ - `variables`
67
+
68
+ 建议附加:
69
+ - `channels`(默认至少包含 `openclaw`)
70
+ - 对应渠道配置(`emailConfig/callConfig/smsConfig`)
71
+
72
+ 成功判定:
73
+ - 返回 `success = true`
74
+
75
+ 失败处理:
76
+ - 明确返回失败原因,不要静默重试
77
+ - 提示用户补充或修正参数
78
+
79
+ #### `watch.pause` / `watch.activate` / `watch.remove`
80
+
81
+ 参数:
82
+ - `strategyId`(或 `strategy_id`)
83
+
84
+ 成功判定:
85
+ - 返回 `success = true`
86
+
87
+ 失败处理:
88
+ - 返回失败原因并提示用户确认策略 ID
89
+
90
+ ## 调用判定规则
91
+
92
+ 只有在用户明确表达以下意图时调用插件:
93
+ - “帮我盯盘/监控/提醒”
94
+ - “涨到/跌到某个价格提醒我”
95
+ - “达到某个涨跌幅提醒我”
96
+
97
+ 调用前必须确认:
98
+ - `productCode`(标的代码)
99
+ - `productType`(`stock/index/hk_stock/crypto`)
100
+ - `condition`(规则表达式)
101
+ - `variables`(阈值变量)
102
+
103
+ 缺任一项时先追问,不要猜测阈值。
104
+
105
+ ### 买卖意图与条件方向
106
+
107
+ 用户设置价格提醒时,往往不会说"大于等于"或"小于等于",而是说"到了XX提醒我"。此时需要判断用户的**买卖意图**来决定条件方向:
108
+
109
+ | 用户意图 | 条件方向 | 说明 |
110
+ |---------|---------|------|
111
+ | 想买入(逢低买入) | `price <= threshold` | 价格**跌到**目标价时提醒,抄底机会 |
112
+ | 想卖出(止盈/止损) | `price >= threshold` | 价格**涨到**目标价时提醒,落袋为安 |
113
+
114
+ **判断流程:**
115
+
116
+ 1. 如果用户明确说了方向(如"涨到XX"、"跌到XX"),直接使用对应条件
117
+ 2. 如果用户只说"到了XX提醒我",**必须追问一句**:
118
+ - "你是想在价格涨到XX时卖出,还是跌到XX时买入?"
119
+ - 或者更简洁地问:"这个是准备买还是卖?买的话我帮你盯跌到XX,卖的话盯涨到XX"
120
+ 3. 根据用户回答设置条件:
121
+ - 买入 → `price <= threshold`
122
+ - 卖出 → `price >= threshold`
123
+
124
+ **常见表达映射:**
125
+ - "涨到/涨过/突破/冲到" → `price >= threshold`(卖出方向)
126
+ - "跌到/跌破/回调到/回到" → `price <= threshold`(买入方向)
127
+ - "到了/到达/价格到" → **方向不明确,需追问买还是卖**
128
+
129
+ ## 标的检索规则(必须遵循)
130
+
131
+ 当不能直接确定 `productCode`/`productType` 时,必须先在本地标的数据中检索,再和用户确认。
132
+
133
+ 数据文件(CSV,字段为 `类型,代码,名称,完整代码,市场`):
134
+ - `data/stock_a.csv`:A股个股列表(`productType=stock`)
135
+ - `data/stock_hk.csv`:港股个股列表(`productType=hk_stock`)
136
+ - `data/index_a.csv`:A股指数列表(`productType=index`)
137
+
138
+ ### 场景1:用户只说股票简称/名称
139
+ - 使用模糊搜索在上述 CSV 中查找名称。
140
+ - 若命中多条,必须把候选项(代码 + 名称 + 市场)发给用户确认,不要自行猜测。
141
+ - 用户确认后再创建策略。
142
+
143
+ ### 场景2:不知道某个标的代码或所属市场
144
+ - 使用 `rg`(或 `grep`)在三个 CSV 中搜索标的名称或代码。
145
+ - 根据命中结果判断市场并映射 `productType`:
146
+ - A股个股 -> `stock`
147
+ - 港股个股 -> `hk_stock`
148
+ - A股指数 -> `index`
149
+ - 若搜索结果不唯一或冲突,先向用户确认后再继续。
150
+
151
+ ### 推荐检索命令
152
+
153
+ ```bash
154
+ # 按名称模糊查找(推荐)
155
+ rg -n "平安银行|腾讯|沪深300|BTC" data/stock_a.csv data/stock_hk.csv data/index_a.csv
156
+
157
+ # 按代码查找
158
+ rg -n "000001|00700|399001" data/stock_a.csv data/stock_hk.csv data/index_a.csv
159
+
160
+ # grep 兜底(无 rg 时)
161
+ grep -nE "平安银行|腾讯|沪深300|000001|00700" data/stock_a.csv data/stock_hk.csv data/index_a.csv
162
+ ```
163
+
164
+ ## 行情查询(queryTickerData)
165
+
166
+ 当用户问“现在多少钱”“最新价格”“查一下某标的行情”等问题时,执行以下流程:
167
+
168
+ 1. 先根据用户输入确定标的代码与市场:
169
+ - 如果是简称/名称,先在 `data/*.csv` 里模糊搜索并向用户确认候选。
170
+ - 如果是明确代码,按代码在 `data/*.csv` 查对应 `市场`。
171
+
172
+ 2. 调用已安装插件/包暴露的查询接口(例如 `queryTickerData`):
173
+
174
+ ```javascript
175
+ await runtime.queryTickerData({
176
+ stockCode: '00700', // 或 productCode
177
+ market: 'HK', // SH/SZ/HK,crypto 可传 ''
178
+ productType: 'hk_stock'
179
+ })
180
+ ```
181
+
182
+ 3. 根据返回结果给用户反馈:
183
+ - `code = "000000"`:返回行情数据(如最新价格、涨跌幅等)。
184
+ - 非 `000000`:返回失败原因,并建议用户确认代码/市场后重试。
185
+
186
+ ## 渠道参数填写
187
+
188
+ `openclaw` 渠道必传,`email` / `call` / `sms` 可选。如用户没明确说明使用邮件(email)、电话/外呼(call)、短信(sms) 通知提醒,则只需要传入`openclaw` 渠道。
189
+
190
+ ### email 参数(emailConfig)
191
+ - `to_address`:收件人邮箱(必填)
192
+ - `template_id`:邮件模板 ID(必填,默认为4,不需要修改)
193
+ - `template_params`:模板变量(可选)
194
+
195
+ 示例:
196
+ ```javascript
197
+ emailConfig: {
198
+ to_address: 'demo@example.com',
199
+ template_id: 4,
200
+ template_params: {
201
+ title: '监控提醒',
202
+ product_name: '比特币'
203
+ }
204
+ }
205
+ ```
206
+
207
+ ### call 参数(callConfig)
208
+ - `phone`:手机号(必填)
209
+ - `customer_name`:客户名称(可选)
210
+ - `condition`:外呼内容(可选,默认用触发消息,如不需要自定义可使用默认消息)
211
+
212
+ 示例:
213
+ ```javascript
214
+ callConfig: {
215
+ phone: '13800138000',
216
+ customer_name: 'Demo',
217
+ condition: '比特币价格突破阈值'
218
+ }
219
+ ```
220
+
221
+ ### sms 参数(smsConfig)
222
+ - `receiver`:手机号(必填;也可传 `phone`,推荐 `receiver`)
223
+ - `template_id`:短信模板 ID(可选,默认 90010,不需要修改)
224
+ - `content`:短信变量内容(可选,默认用触发消息,如不需要自定义可使用默认消息)
225
+
226
+ 示例:
227
+ ```javascript
228
+ smsConfig: {
229
+ receiver: '13968617776',
230
+ template_id: 90010,
231
+ content: '测试消息1'
232
+ }
233
+ ```
234
+
235
+ ## 支持的市场
236
+
237
+ | 市场 | productType | 示例 | 说明 |
238
+ |------|-------------|------|------|
239
+ | A股个股 | stock | 000001 | 每3秒行情 |
240
+ | A股指数 | index | 000300 | 每3秒行情 |
241
+ | 港股 | hk_stock | 00700 | 延迟15分钟 |
242
+ | 加密货币 | crypto | BTCUSDT | 每10秒行情 |
243
+
244
+ 意图映射建议:
245
+ - 用户提到“指数/沪深300/上证” -> `index`
246
+ - 用户提到“港股” -> `hk_stock`
247
+ - 用户提到“比特币/BTC” -> `crypto`
248
+ - 其余股票默认先按 `stock` 处理并在必要时追问确认
249
+
250
+ 详细产品代码见 [references/markets.md](references/markets.md)
251
+
252
+ ## 使用示例
253
+
254
+ ### 比特币监控
255
+ ```javascript
256
+ // 条件: 价格 >= 73000 且涨幅 >= 1%
257
+ condition: 'price >= threshold and change_percent >= cp_threshold'
258
+ variables: { threshold: 73000, cp_threshold: 0.01, product_name: 'Bitcoin' }
259
+ // 注意: crypto 不支持 turnover_rate
260
+ ```
261
+
262
+ ### A股监控
263
+ ```javascript
264
+ // 条件: 价格 >= 12.5 且换手率 >= 1%
265
+ condition: 'price >= threshold and turnover_rate >= tr_threshold'
266
+ variables: { threshold: 12.5, tr_threshold: 0.01, product_name: '平安银行' }
267
+ ```
268
+
269
+ ### 港股监控
270
+ ```javascript
271
+ // 条件: 价格 >= 420
272
+ condition: 'price >= threshold'
273
+ variables: { threshold: 420, product_name: '腾讯控股' }
274
+ ```
275
+
276
+ ## 触发后操作
277
+
278
+ 当监控触发时:
279
+ 1. 解析 `market_data` 获取价格、涨跌幅等信息
280
+ 2. 发送提醒到用户当前对话的渠道(群聊/私聊)
281
+ 3. `openclaw` 渠道必传,`email/call/sms` 可按需附加
282
+ 4. 根据触发消息构建友好的提醒文案
283
+
284
+ 如果创建失败(`watch.create.result.success=false`):
285
+ - 明确返回失败原因给用户
286
+ - 引导用户补充或修正参数后再次创建
287
+
288
+ ## 相关资源
289
+
290
+ - 市场参考: [references/markets.md](references/markets.md)