@round2ai/r2-cli 1.0.0 → 1.0.2
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 +101 -80
- package/dist/api.d.ts +45 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +90 -0
- package/dist/api.js.map +1 -0
- package/dist/auth.d.ts +35 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +240 -0
- package/dist/auth.js.map +1 -0
- package/dist/commands/ai/chat.d.ts +9 -0
- package/dist/commands/ai/chat.d.ts.map +1 -0
- package/dist/commands/ai/chat.js +16 -0
- package/dist/commands/ai/chat.js.map +1 -0
- package/dist/commands/ai/skills.d.ts +9 -0
- package/dist/commands/ai/skills.d.ts.map +1 -0
- package/dist/commands/ai/skills.js +16 -0
- package/dist/commands/ai/skills.js.map +1 -0
- package/dist/commands/auth/login.d.ts +24 -0
- package/dist/commands/auth/login.d.ts.map +1 -0
- package/dist/commands/auth/login.js +288 -0
- package/dist/commands/auth/login.js.map +1 -0
- package/dist/commands/auth/logout.d.ts +16 -0
- package/dist/commands/auth/logout.d.ts.map +1 -0
- package/dist/commands/auth/logout.js +49 -0
- package/dist/commands/auth/logout.js.map +1 -0
- package/dist/commands/auth/status.d.ts +28 -0
- package/dist/commands/auth/status.d.ts.map +1 -0
- package/dist/commands/auth/status.js +92 -0
- package/dist/commands/auth/status.js.map +1 -0
- package/dist/commands/base.d.ts +107 -0
- package/dist/commands/base.d.ts.map +1 -0
- package/dist/commands/base.js +153 -0
- package/dist/commands/base.js.map +1 -0
- package/dist/commands/business/pricing.d.ts +9 -0
- package/dist/commands/business/pricing.d.ts.map +1 -0
- package/dist/commands/business/pricing.js +16 -0
- package/dist/commands/business/pricing.js.map +1 -0
- package/dist/commands/business/report.d.ts +9 -0
- package/dist/commands/business/report.d.ts.map +1 -0
- package/dist/commands/business/report.js +16 -0
- package/dist/commands/business/report.js.map +1 -0
- package/dist/commands/inventory/risk.d.ts +9 -0
- package/dist/commands/inventory/risk.d.ts.map +1 -0
- package/dist/commands/inventory/risk.js +16 -0
- package/dist/commands/inventory/risk.js.map +1 -0
- package/dist/config.d.ts +54 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +111 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +127 -81
- package/dist/index.js.map +1 -1
- package/dist/query/executor.d.ts +138 -0
- package/dist/query/executor.d.ts.map +1 -0
- package/dist/query/executor.js +232 -0
- package/dist/query/executor.js.map +1 -0
- package/dist/query/types.d.ts +116 -0
- package/dist/query/types.d.ts.map +1 -0
- package/dist/query/types.js +15 -0
- package/dist/query/types.js.map +1 -0
- package/dist/query/utils.d.ts +99 -0
- package/dist/query/utils.d.ts.map +1 -0
- package/dist/query/utils.js +151 -0
- package/dist/query/utils.js.map +1 -0
- package/dist/services/ServiceContainer.d.ts +110 -0
- package/dist/services/ServiceContainer.d.ts.map +1 -0
- package/dist/services/ServiceContainer.js +242 -0
- package/dist/services/ServiceContainer.js.map +1 -0
- package/dist/services/api/client.d.ts +88 -0
- package/dist/services/api/client.d.ts.map +1 -0
- package/dist/services/api/client.js +188 -0
- package/dist/services/api/client.js.map +1 -0
- package/dist/services/api/types.d.ts +233 -0
- package/dist/services/api/types.d.ts.map +1 -0
- package/dist/services/api/types.js +83 -0
- package/dist/services/api/types.js.map +1 -0
- package/dist/services/auth/provider.d.ts +73 -0
- package/dist/services/auth/provider.d.ts.map +1 -0
- package/dist/services/auth/provider.js +339 -0
- package/dist/services/auth/provider.js.map +1 -0
- package/dist/services/auth/session.d.ts +73 -0
- package/dist/services/auth/session.d.ts.map +1 -0
- package/dist/services/auth/session.js +200 -0
- package/dist/services/auth/session.js.map +1 -0
- package/dist/services/business/demand.d.ts +70 -0
- package/dist/services/business/demand.d.ts.map +1 -0
- package/dist/services/business/demand.js +240 -0
- package/dist/services/business/demand.js.map +1 -0
- package/dist/services/business/fulfillment.d.ts +122 -0
- package/dist/services/business/fulfillment.d.ts.map +1 -0
- package/dist/services/business/fulfillment.js +267 -0
- package/dist/services/business/fulfillment.js.map +1 -0
- package/dist/services/business/inventory.d.ts +54 -0
- package/dist/services/business/inventory.d.ts.map +1 -0
- package/dist/services/business/inventory.js +245 -0
- package/dist/services/business/inventory.js.map +1 -0
- package/dist/services/business/pricing.d.ts +41 -0
- package/dist/services/business/pricing.d.ts.map +1 -0
- package/dist/services/business/pricing.js +133 -0
- package/dist/services/business/pricing.js.map +1 -0
- package/dist/services/business/report.d.ts +74 -0
- package/dist/services/business/report.d.ts.map +1 -0
- package/dist/services/business/report.js +380 -0
- package/dist/services/business/report.js.map +1 -0
- package/dist/services/config/manager.d.ts +105 -0
- package/dist/services/config/manager.d.ts.map +1 -0
- package/dist/services/config/manager.js +324 -0
- package/dist/services/config/manager.js.map +1 -0
- package/dist/services/config/types.d.ts +128 -0
- package/dist/services/config/types.d.ts.map +1 -0
- package/dist/services/config/types.js +209 -0
- package/dist/services/config/types.js.map +1 -0
- package/dist/services/index.d.ts +17 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +44 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/storage/index.d.ts +63 -0
- package/dist/services/storage/index.d.ts.map +1 -0
- package/dist/services/storage/index.js +136 -0
- package/dist/services/storage/index.js.map +1 -0
- package/dist/types/api.d.ts +58 -0
- package/dist/types/api.d.ts.map +1 -0
- package/dist/types/api.js +5 -0
- package/dist/types/api.js.map +1 -0
- package/dist/types/auth.d.ts +59 -0
- package/dist/types/auth.d.ts.map +1 -0
- package/dist/types/auth.js +11 -0
- package/dist/types/auth.js.map +1 -0
- package/dist/types/business.d.ts +201 -0
- package/dist/types/business.d.ts.map +1 -0
- package/dist/types/business.js +5 -0
- package/dist/types/business.js.map +1 -0
- package/dist/types/command.d.ts +106 -0
- package/dist/types/command.d.ts.map +1 -0
- package/dist/types/command.js +5 -0
- package/dist/types/command.js.map +1 -0
- package/dist/types/config.d.ts +66 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +5 -0
- package/dist/types/config.js.map +1 -0
- package/dist/utils/async.d.ts +79 -0
- package/dist/utils/async.d.ts.map +1 -0
- package/dist/utils/async.js +179 -0
- package/dist/utils/async.js.map +1 -0
- package/dist/utils/format.d.ts +90 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +227 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/logger.d.ts +136 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +249 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/validation.d.ts +100 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +334 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +11 -6
package/README.md
CHANGED
|
@@ -1,116 +1,137 @@
|
|
|
1
|
-
Round2AI 正式开源 R2-CLI,向 AI 开放二手潮奢交易全链路能力
|
|
1
|
+
# Round2AI 正式开源 R2-CLI,向 AI 开放二手潮奢交易全链路能力
|
|
2
|
+
|
|
2
3
|
2026 年 3 月,Anthropic、Google、字节跳动、阿里巴巴、腾讯等公司相继开源 CLI 工具,将办公、协作、开发等核心能力以命令行形式向 AI Agent 开放。
|
|
3
|
-
今天,Round2AI 正式开源 R2-CLI,将二手潮奢交易场景中的数据、市场、价格、库存、履约、决策等核心能力,以同样的方式向 AI Agent 开放。
|
|
4
|
-
GitHub:github.com/Round2AI/r2-cli协议:MIT
|
|
5
4
|
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
今天,Round2AI 正式开源 **R2-CLI**,将二手潮奢交易场景中的数据、市场、价格、库存、履约、决策等核心能力,以同样的方式向 AI Agent 开放。
|
|
6
|
+
|
|
7
|
+
***
|
|
8
|
+
|
|
9
|
+
## 关于 Round2AI
|
|
10
|
+
|
|
8
11
|
Round2AI 由 PURESNAKE 团队开发。
|
|
9
|
-
|
|
12
|
+
|
|
13
|
+
**使命:让潮奢循环交易没有摩擦。**
|
|
14
|
+
|
|
10
15
|
PURESNAKE 深耕二手潮奢交易流通 6 年,累计鉴定超 400 万单,自建 6 座质检云仓,全国员工超 100 人,B2B 平台年成交规模超 1 亿。业务覆盖回收、鉴定、质检、仓储、定价、销售全链路。
|
|
16
|
+
|
|
11
17
|
这些能力正在被抽象为系统能力。R2-CLI 是这些能力面向 AI Agent 的开放入口。
|
|
12
18
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
对接主流 ERP,统一线上电商、线下门店、仓储履约等多渠道经营数据
|
|
22
|
-
📈
|
|
23
|
-
r2
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
r2
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
r2
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
r2 sell optimize
|
|
42
|
-
在售商品的定价与渠道优化建议
|
|
43
|
-
📦 库存与履约
|
|
44
|
-
r2 inventory risk
|
|
45
|
-
库存风险识别:滞销预警、贬值通道、库龄超期
|
|
46
|
-
|
|
47
|
-
r2 fulfillment
|
|
48
|
-
履约全链路追踪:收货 → 质检 → 入库 → 发货
|
|
49
|
-
🧠 经营决策
|
|
50
|
-
r2 decide
|
|
51
|
-
综合数据输出经营动作建议:补货 / 清仓 / 调价 / 风控
|
|
52
|
-
|
|
53
|
-
---
|
|
54
|
-
快速开始
|
|
55
|
-
安装
|
|
19
|
+
***
|
|
20
|
+
|
|
21
|
+
## 开放能力一览
|
|
22
|
+
|
|
23
|
+
R2-CLI 开放 **6 大业务域、40+ 命令、12 个 AI Agent Skills**,覆盖二手潮奢交易全链路。
|
|
24
|
+
|
|
25
|
+
| 业务域 | 能力 | 说明 |
|
|
26
|
+
| ------------ | --------------------- | --------------------------------- |
|
|
27
|
+
| 📊 **数据对接** | `r2 ingest` | 对接主流 ERP,统一线上电商、线下门店、仓储履约等多渠道经营数据 |
|
|
28
|
+
| 📈 **经营分析** | `r2 report` | 生成经营日报 / 周报,涵盖销售、毛利、库龄、异常波动 |
|
|
29
|
+
| | `r2 ask` | 自然语言查询经营数据,实时返回结果 |
|
|
30
|
+
| 🔍 **市场分析** | `r2 demand` | 按 SKU / 品类 / 区域扫描市场需求热度与供需缺口 |
|
|
31
|
+
| | `r2 simulate` | 竞价成交模拟,输入出价返回预估成交率与利润空间 |
|
|
32
|
+
| | `r2 bidding strategy` | 基于预算与品类生成竞价策略建议 |
|
|
33
|
+
| 💰 **价格分析** | `r2 pricing` | 基于真实成交数据给出收货价与售卖价建议 |
|
|
34
|
+
| | `r2 sell optimize` | 在售商品的定价与渠道优化建议 |
|
|
35
|
+
| 📦 **库存与履约** | `r2 inventory risk` | 库存风险识别:滞销预警、贬值通道、库龄超期 |
|
|
36
|
+
| | `r2 fulfillment` | 履约全链路追踪:收货 → 质检 → 入库 → 发货 |
|
|
37
|
+
| 🧠 **经营决策** | `r2 decide` | 综合数据输出经营动作建议:补货 / 清仓 / 调价 / 风控 |
|
|
38
|
+
|
|
39
|
+
***
|
|
40
|
+
|
|
41
|
+
## 快速开始
|
|
42
|
+
|
|
43
|
+
**安装**
|
|
44
|
+
|
|
45
|
+
```bash
|
|
56
46
|
npm install -g @round2ai/r2-cli
|
|
57
47
|
|
|
58
|
-
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**授权**
|
|
51
|
+
|
|
52
|
+
```bash
|
|
59
53
|
r2 auth login
|
|
60
54
|
|
|
61
|
-
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**查看今日经营概况**
|
|
58
|
+
|
|
59
|
+
```bash
|
|
62
60
|
r2 report --type daily
|
|
63
61
|
|
|
64
|
-
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
**查询某个 SKU 的市场行情和建议价格**
|
|
65
|
+
|
|
66
|
+
```bash
|
|
65
67
|
r2 demand --sku "Chanel Classic Flap" --region east-china
|
|
66
68
|
r2 pricing --sku "Chanel Classic Flap" --condition A
|
|
67
69
|
|
|
68
|
-
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**竞价前模拟成交概率**
|
|
73
|
+
|
|
74
|
+
```bash
|
|
69
75
|
r2 simulate --sku "Air Jordan 1 Retro High OG" --price 1200
|
|
70
76
|
|
|
71
|
-
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**检查仓库库存风险**
|
|
80
|
+
|
|
81
|
+
```bash
|
|
72
82
|
r2 inventory risk --warehouse sz-01
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
````plain text
|
|
73
86
|
|
|
74
87
|
**获取未来 7 天经营建议**
|
|
75
88
|
|
|
76
89
|
```bash
|
|
77
90
|
r2 decide --store shanghai-01 --horizon 7d
|
|
78
91
|
|
|
92
|
+
````
|
|
93
|
+
|
|
94
|
+
***
|
|
95
|
+
|
|
96
|
+
## AI Agent 集成
|
|
79
97
|
|
|
80
|
-
---
|
|
81
|
-
AI Agent 集成
|
|
82
98
|
R2-CLI 支持 Claude Code、OpenClaw、Codex 等主流 AI Agent 框架。
|
|
99
|
+
|
|
83
100
|
安装 Agent Skills:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
84
103
|
npx skills add Round2AI/r2-cli --all -y
|
|
85
104
|
|
|
86
|
-
|
|
87
|
-
R2-CLI 帮商家解决三件事:买什么,卖多少钱,怎么卖掉。
|
|
105
|
+
```
|
|
88
106
|
|
|
89
|
-
|
|
90
|
-
技术信息
|
|
107
|
+
安装后,AI Agent 可以直接调用 R2-CLI 的全部交易能力。一句"帮我看看这周哪些款在亏钱",Agent 会自动调用 `r2 ask`、`r2 pricing`、`r2 inventory risk`,给出完整的分析和建议。
|
|
91
108
|
|
|
109
|
+
**R2-CLI 帮商家解决三件事:买什么,卖多少钱,怎么卖掉。**
|
|
110
|
+
|
|
111
|
+
***
|
|
112
|
+
|
|
113
|
+
## 技术信息
|
|
114
|
+
|
|
115
|
+
| | |
|
|
116
|
+
| --------------- | --------------------------------- |
|
|
117
|
+
| 语言 | Node.js |
|
|
118
|
+
| 协议 | MIT |
|
|
119
|
+
| 安装 | `npm install -g @round2ai/r2-cli` |
|
|
120
|
+
| 授权 | `r2 auth login` |
|
|
121
|
+
| 命令数 | 40+ |
|
|
122
|
+
| AI Agent Skills | 12 |
|
|
123
|
+
| 数据源 | 通过 ERP 对接各电商平台、线下 POS、自营仓储 WMS |
|
|
124
|
+
|
|
125
|
+
***
|
|
92
126
|
|
|
93
|
-
语言
|
|
94
|
-
Go
|
|
95
|
-
协议
|
|
96
|
-
MIT
|
|
97
|
-
安装
|
|
98
|
-
npm install -g @round2ai/r2-cli
|
|
99
|
-
授权
|
|
100
|
-
r2 auth login
|
|
101
|
-
命令数
|
|
102
|
-
40+
|
|
103
|
-
AI Agent Skills
|
|
104
|
-
12
|
|
105
|
-
数据源
|
|
106
|
-
通过 ERP 对接各电商平台、线下 POS、自营仓储 WMS
|
|
107
|
-
|
|
108
|
-
---
|
|
109
127
|
Already used by merchants in production.
|
|
128
|
+
|
|
110
129
|
Across online and offline channels.
|
|
130
|
+
|
|
111
131
|
Including ourselves.
|
|
112
132
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
133
|
+
***
|
|
134
|
+
|
|
135
|
+
*Round2AI — 让潮奢循环交易没有摩擦。*
|
|
136
|
+
|
|
137
|
+
*Reduce friction in circular commerce.*
|
package/dist/api.d.ts
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export interface ApiResponse<T = unknown> {
|
|
2
|
+
code: number;
|
|
3
|
+
message: string;
|
|
4
|
+
data: T;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* API 客户端
|
|
8
|
+
*/
|
|
9
|
+
export declare class ApiClient {
|
|
10
|
+
private baseUrl;
|
|
11
|
+
constructor(baseUrl?: string);
|
|
12
|
+
/**
|
|
13
|
+
* 获取基础 URL
|
|
14
|
+
*/
|
|
15
|
+
getBaseUrl(): Promise<string>;
|
|
16
|
+
/**
|
|
17
|
+
* 获取请求头
|
|
18
|
+
*/
|
|
19
|
+
private getHeaders;
|
|
20
|
+
/**
|
|
21
|
+
* 发送请求
|
|
22
|
+
*/
|
|
23
|
+
private request;
|
|
24
|
+
/**
|
|
25
|
+
* GET 请求
|
|
26
|
+
*/
|
|
27
|
+
get<T>(endpoint: string): Promise<ApiResponse<T>>;
|
|
28
|
+
/**
|
|
29
|
+
* POST 请求
|
|
30
|
+
*/
|
|
31
|
+
post<T>(endpoint: string, data?: unknown): Promise<ApiResponse<T>>;
|
|
32
|
+
/**
|
|
33
|
+
* PUT 请求
|
|
34
|
+
*/
|
|
35
|
+
put<T>(endpoint: string, data?: unknown): Promise<ApiResponse<T>>;
|
|
36
|
+
/**
|
|
37
|
+
* DELETE 请求
|
|
38
|
+
*/
|
|
39
|
+
delete<T>(endpoint: string): Promise<ApiResponse<T>>;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* 创建 API 客户端实例
|
|
43
|
+
*/
|
|
44
|
+
export declare const apiClient: ApiClient;
|
|
45
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,CAAC,CAAC;CACT;AAED;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,CAAC,EAAE,MAAM;IAI5B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAKnC;;OAEG;YACW,UAAU;IAaxB;;OAEG;YACW,OAAO;IA8BrB;;OAEG;IACG,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAIvD;;OAEG;IACG,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAOxE;;OAEG;IACG,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAOvE;;OAEG;IACG,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;CAG3D;AAED;;GAEG;AACH,eAAO,MAAM,SAAS,WAAkB,CAAC"}
|
package/dist/api.js
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { getAccessToken, readConfig } from "./config.js";
|
|
2
|
+
/**
|
|
3
|
+
* API 客户端
|
|
4
|
+
*/
|
|
5
|
+
export class ApiClient {
|
|
6
|
+
baseUrl;
|
|
7
|
+
constructor(baseUrl) {
|
|
8
|
+
this.baseUrl = baseUrl || process.env.R2_API_BASE_URL || "https://api.round2ai.com";
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* 获取基础 URL
|
|
12
|
+
*/
|
|
13
|
+
async getBaseUrl() {
|
|
14
|
+
const config = await readConfig();
|
|
15
|
+
return config.api?.baseUrl || this.baseUrl;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 获取请求头
|
|
19
|
+
*/
|
|
20
|
+
async getHeaders() {
|
|
21
|
+
const headers = {
|
|
22
|
+
"Content-Type": "application/json",
|
|
23
|
+
};
|
|
24
|
+
const token = await getAccessToken();
|
|
25
|
+
if (token) {
|
|
26
|
+
headers["Authorization"] = `Bearer ${token}`;
|
|
27
|
+
}
|
|
28
|
+
return headers;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 发送请求
|
|
32
|
+
*/
|
|
33
|
+
async request(endpoint, options = {}) {
|
|
34
|
+
const baseUrl = await this.getBaseUrl();
|
|
35
|
+
const url = `${baseUrl}${endpoint}`;
|
|
36
|
+
const headers = await this.getHeaders();
|
|
37
|
+
try {
|
|
38
|
+
const response = await fetch(url, {
|
|
39
|
+
...options,
|
|
40
|
+
headers: { ...headers, ...options.headers },
|
|
41
|
+
});
|
|
42
|
+
const result = await response.json();
|
|
43
|
+
if (!response.ok || result.code !== 0) {
|
|
44
|
+
throw new Error(result.message || "请求失败");
|
|
45
|
+
}
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
if (error instanceof Error) {
|
|
50
|
+
throw error;
|
|
51
|
+
}
|
|
52
|
+
throw new Error("未知错误");
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* GET 请求
|
|
57
|
+
*/
|
|
58
|
+
async get(endpoint) {
|
|
59
|
+
return this.request(endpoint, { method: "GET" });
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* POST 请求
|
|
63
|
+
*/
|
|
64
|
+
async post(endpoint, data) {
|
|
65
|
+
return this.request(endpoint, {
|
|
66
|
+
method: "POST",
|
|
67
|
+
body: JSON.stringify(data),
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* PUT 请求
|
|
72
|
+
*/
|
|
73
|
+
async put(endpoint, data) {
|
|
74
|
+
return this.request(endpoint, {
|
|
75
|
+
method: "PUT",
|
|
76
|
+
body: JSON.stringify(data),
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* DELETE 请求
|
|
81
|
+
*/
|
|
82
|
+
async delete(endpoint) {
|
|
83
|
+
return this.request(endpoint, { method: "DELETE" });
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* 创建 API 客户端实例
|
|
88
|
+
*/
|
|
89
|
+
export const apiClient = new ApiClient();
|
|
90
|
+
//# sourceMappingURL=api.js.map
|
package/dist/api.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
package/dist/auth.d.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export interface QrCodeResponse {
|
|
2
|
+
qrCodeUrl: string;
|
|
3
|
+
qrCodeData: string;
|
|
4
|
+
expireIn: number;
|
|
5
|
+
loginId: string;
|
|
6
|
+
}
|
|
7
|
+
export interface LoginStatusResponse {
|
|
8
|
+
status: "pending" | "scanned" | "confirmed" | "expired" | "canceled";
|
|
9
|
+
userId?: string;
|
|
10
|
+
username?: string;
|
|
11
|
+
accessToken?: string;
|
|
12
|
+
refreshToken?: string;
|
|
13
|
+
expiresIn?: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 生成登录二维码
|
|
17
|
+
*/
|
|
18
|
+
export declare function generateQrCode(): Promise<QrCodeResponse>;
|
|
19
|
+
/**
|
|
20
|
+
* 检查登录状态
|
|
21
|
+
*/
|
|
22
|
+
export declare function checkLoginStatus(loginId: string): Promise<LoginStatusResponse>;
|
|
23
|
+
/**
|
|
24
|
+
* 执行扫码登录
|
|
25
|
+
*/
|
|
26
|
+
export declare function performQrCodeLogin(): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* 退出登录
|
|
29
|
+
*/
|
|
30
|
+
export declare function logout(): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* 获取当前登录用户信息
|
|
33
|
+
*/
|
|
34
|
+
export declare function getCurrentUser(): Promise<void>;
|
|
35
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,UAAU,CAAC;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,cAAc,CAAC,CAe9D;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,mBAAmB,CAAC,CAkB9B;AAwDD;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CA8DxD;AAED;;GAEG;AACH,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAiB5C;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAkCpD"}
|
package/dist/auth.js
ADDED
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import open from "open";
|
|
3
|
+
import inquirer from "inquirer";
|
|
4
|
+
import qrcode from "qrcode-terminal";
|
|
5
|
+
import { apiClient } from "./api.js";
|
|
6
|
+
import { clearAuthInfo, getAuthStatus, getUserInfo, saveAuthInfo, } from "./config.js";
|
|
7
|
+
/**
|
|
8
|
+
* 生成登录二维码
|
|
9
|
+
*/
|
|
10
|
+
export async function generateQrCode() {
|
|
11
|
+
try {
|
|
12
|
+
const response = await apiClient.post("/auth/qrcode");
|
|
13
|
+
return response.data;
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
// 模拟响应(实际使用时移除)
|
|
17
|
+
const timestamp = Date.now();
|
|
18
|
+
console.log(chalk.yellow("⚠️ 使用模拟模式(请配置正确的 API 地址)"));
|
|
19
|
+
return {
|
|
20
|
+
qrCodeUrl: `https://round2ai.com/auth/qr/${timestamp}`,
|
|
21
|
+
qrCodeData: `r2://auth/login/${timestamp}`,
|
|
22
|
+
expireIn: 300,
|
|
23
|
+
loginId: `login-${timestamp}`,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 检查登录状态
|
|
29
|
+
*/
|
|
30
|
+
export async function checkLoginStatus(loginId) {
|
|
31
|
+
try {
|
|
32
|
+
const response = await apiClient.get(`/auth/qrcode/${loginId}/status`);
|
|
33
|
+
return response.data;
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
// 模拟响应(实际使用时移除)
|
|
37
|
+
const mockData = {
|
|
38
|
+
status: "confirmed",
|
|
39
|
+
userId: "user-123456",
|
|
40
|
+
username: "test_user",
|
|
41
|
+
accessToken: "mock-access-token-" + Date.now(),
|
|
42
|
+
refreshToken: "mock-refresh-token-" + Date.now(),
|
|
43
|
+
expiresIn: 7200,
|
|
44
|
+
};
|
|
45
|
+
return mockData;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 显示二维码
|
|
50
|
+
*/
|
|
51
|
+
function displayQrCode(qrCodeUrl, qrCodeData) {
|
|
52
|
+
console.log(chalk.blue("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"));
|
|
53
|
+
console.log(chalk.cyan(" 📱 扫码登录 Round2AI"));
|
|
54
|
+
console.log(chalk.blue("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n"));
|
|
55
|
+
// 使用 qrcode-terminal 在终端显示二维码
|
|
56
|
+
qrcode.generate(qrCodeData, { small: true });
|
|
57
|
+
console.log(chalk.yellow("\n🔗 登录链接:"));
|
|
58
|
+
console.log(chalk.cyan(` ${qrCodeUrl}\n`));
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* 轮询登录状态
|
|
62
|
+
*/
|
|
63
|
+
async function pollLoginStatus(loginId, onStatusChange) {
|
|
64
|
+
const maxAttempts = 60; // 最多轮询 60 次(5 分钟)
|
|
65
|
+
const interval = 5000; // 每 5 秒轮询一次
|
|
66
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
67
|
+
const status = await checkLoginStatus(loginId);
|
|
68
|
+
if (onStatusChange && status.status !== "pending") {
|
|
69
|
+
onStatusChange(status.status);
|
|
70
|
+
}
|
|
71
|
+
switch (status.status) {
|
|
72
|
+
case "confirmed":
|
|
73
|
+
return status;
|
|
74
|
+
case "expired":
|
|
75
|
+
throw new Error("二维码已过期,请重新获取");
|
|
76
|
+
case "canceled":
|
|
77
|
+
throw new Error("用户取消登录");
|
|
78
|
+
case "scanned":
|
|
79
|
+
console.log(chalk.yellow("⏳ 已扫码,请在手机上确认登录..."));
|
|
80
|
+
break;
|
|
81
|
+
case "pending":
|
|
82
|
+
console.log(chalk.gray("⏳ 等待扫码..."));
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
// 等待下次轮询
|
|
86
|
+
await new Promise((resolve) => setTimeout(resolve, interval));
|
|
87
|
+
}
|
|
88
|
+
throw new Error("登录超时,请重试");
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* 执行扫码登录
|
|
92
|
+
*/
|
|
93
|
+
export async function performQrCodeLogin() {
|
|
94
|
+
// 检查是否已登录
|
|
95
|
+
const isLoggedIn = await getAuthStatus();
|
|
96
|
+
if (isLoggedIn) {
|
|
97
|
+
const userInfo = await getUserInfo();
|
|
98
|
+
if (userInfo) {
|
|
99
|
+
console.log(chalk.green("✅ 您已登录"));
|
|
100
|
+
console.log(chalk.cyan(` 用户: ${userInfo.username}`));
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
try {
|
|
105
|
+
// 生成二维码
|
|
106
|
+
const qrCode = await generateQrCode();
|
|
107
|
+
displayQrCode(qrCode.qrCodeUrl, qrCode.qrCodeData);
|
|
108
|
+
// 询问是否自动打开浏览器
|
|
109
|
+
console.log(chalk.yellow("💡 提示: 您可以手动访问上方链接,或按回车自动打开浏览器"));
|
|
110
|
+
// 轮询登录状态
|
|
111
|
+
const result = await pollLoginStatus(qrCode.loginId, (status) => {
|
|
112
|
+
if (status === "scanned") {
|
|
113
|
+
console.log(chalk.yellow("📱 已扫描二维码,请在手机上确认登录"));
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
// 保存登录信息
|
|
117
|
+
if (result.accessToken && result.refreshToken && result.userId && result.username) {
|
|
118
|
+
await saveAuthInfo({
|
|
119
|
+
accessToken: result.accessToken,
|
|
120
|
+
refreshToken: result.refreshToken,
|
|
121
|
+
userId: result.userId,
|
|
122
|
+
username: result.username,
|
|
123
|
+
expiresIn: result.expiresIn || 7200,
|
|
124
|
+
});
|
|
125
|
+
console.log(chalk.green("\n✅ 登录成功!"));
|
|
126
|
+
console.log(chalk.cyan(` 欢迎,${result.username}!\n`));
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
throw new Error("登录信息不完整");
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
console.error(chalk.red(`\n❌ 登录失败: ${error instanceof Error ? error.message : "未知错误"}`));
|
|
134
|
+
// 提供模拟登录选项
|
|
135
|
+
console.log(chalk.blue("\n💡 是否使用模拟登录演示功能?"));
|
|
136
|
+
const { mockLogin } = await inquirer.prompt([
|
|
137
|
+
{
|
|
138
|
+
type: "confirm",
|
|
139
|
+
name: "mockLogin",
|
|
140
|
+
message: "使用模拟登录(仅演示)",
|
|
141
|
+
default: true,
|
|
142
|
+
},
|
|
143
|
+
]);
|
|
144
|
+
if (mockLogin) {
|
|
145
|
+
await mockQrCodeLogin();
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
throw error;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* 退出登录
|
|
154
|
+
*/
|
|
155
|
+
export async function logout() {
|
|
156
|
+
const userInfo = await getUserInfo();
|
|
157
|
+
if (!userInfo) {
|
|
158
|
+
console.log(chalk.yellow("⚠️ 您尚未登录"));
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
try {
|
|
162
|
+
// 调用后端登出接口
|
|
163
|
+
await apiClient.post("/auth/logout");
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
// 即使后端调用失败也清除本地缓存
|
|
167
|
+
console.log(chalk.yellow("⚠️ 后端登出请求失败,仅清除本地缓存"));
|
|
168
|
+
}
|
|
169
|
+
await clearAuthInfo();
|
|
170
|
+
console.log(chalk.green("✅ 已退出登录"));
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* 获取当前登录用户信息
|
|
174
|
+
*/
|
|
175
|
+
export async function getCurrentUser() {
|
|
176
|
+
const isLoggedIn = await getAuthStatus();
|
|
177
|
+
if (!isLoggedIn) {
|
|
178
|
+
console.log(chalk.yellow("⚠️ 您尚未登录,请使用 'r2 auth login' 登录"));
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
const userInfo = await getUserInfo();
|
|
182
|
+
if (!userInfo) {
|
|
183
|
+
console.log(chalk.yellow("⚠️ 无法获取用户信息,请重新登录"));
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
try {
|
|
187
|
+
// 调用后端获取用户详细信息
|
|
188
|
+
const response = await apiClient.get("/auth/user");
|
|
189
|
+
const userData = response.data;
|
|
190
|
+
console.log(chalk.green("✅ 已登录"));
|
|
191
|
+
console.log(chalk.cyan(` 用户名: ${userInfo.username}`));
|
|
192
|
+
console.log(chalk.cyan(` 用户ID: ${userInfo.userId}`));
|
|
193
|
+
if (userData.email) {
|
|
194
|
+
console.log(chalk.cyan(` 邮箱: ${userData.email}`));
|
|
195
|
+
}
|
|
196
|
+
if (userData.phone) {
|
|
197
|
+
console.log(chalk.cyan(` 手机: ${userData.phone}`));
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
// 后端请求失败时显示缓存信息
|
|
202
|
+
console.log(chalk.green("✅ 已登录"));
|
|
203
|
+
console.log(chalk.cyan(` 用户名: ${userInfo.username}`));
|
|
204
|
+
console.log(chalk.cyan(` 用户ID: ${userInfo.userId}`));
|
|
205
|
+
console.log(chalk.gray(" (离线模式)"));
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* 模拟扫码登录
|
|
210
|
+
*/
|
|
211
|
+
async function mockQrCodeLogin() {
|
|
212
|
+
console.log(chalk.blue("\n📱 模拟扫码登录演示"));
|
|
213
|
+
console.log(chalk.blue("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n"));
|
|
214
|
+
// 生成模拟的二维码数据
|
|
215
|
+
const mockQrCodeData = `r2://auth/mock/${Date.now()}`;
|
|
216
|
+
const mockQrCodeUrl = `https://round2ai.com/auth/demo/${Date.now()}`;
|
|
217
|
+
// 使用 qrcode-terminal 显示真实二维码
|
|
218
|
+
qrcode.generate(mockQrCodeData, { small: true });
|
|
219
|
+
console.log(chalk.yellow("\n🔗 演示链接:"));
|
|
220
|
+
console.log(chalk.cyan(` ${mockQrCodeUrl}`));
|
|
221
|
+
console.log(chalk.gray(" (此为演示二维码,扫码无实际效果)\n"));
|
|
222
|
+
// 模拟等待扫码和确认
|
|
223
|
+
console.log(chalk.yellow("⏳ 模拟扫码中..."));
|
|
224
|
+
await new Promise((resolve) => setTimeout(resolve, 1500));
|
|
225
|
+
console.log(chalk.yellow("⏳ 模拟手机确认中..."));
|
|
226
|
+
await new Promise((resolve) => setTimeout(resolve, 1500));
|
|
227
|
+
// 模拟登录成功
|
|
228
|
+
const mockUserInfo = {
|
|
229
|
+
accessToken: "mock-access-token-" + Date.now(),
|
|
230
|
+
refreshToken: "mock-refresh-token-" + Date.now(),
|
|
231
|
+
userId: "user-123456",
|
|
232
|
+
username: "demo_user",
|
|
233
|
+
expiresIn: 7200,
|
|
234
|
+
};
|
|
235
|
+
// 保存登录信息
|
|
236
|
+
await saveAuthInfo(mockUserInfo);
|
|
237
|
+
console.log(chalk.green("\n✅ 模拟登录成功!"));
|
|
238
|
+
console.log(chalk.cyan(` 欢迎,${mockUserInfo.username}!\n`));
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../../src/commands/ai/chat.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,GAAG,GAAG,OAAO,CASzD"}
|