@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.
Files changed (158) hide show
  1. package/README.md +101 -80
  2. package/dist/api.d.ts +45 -0
  3. package/dist/api.d.ts.map +1 -0
  4. package/dist/api.js +90 -0
  5. package/dist/api.js.map +1 -0
  6. package/dist/auth.d.ts +35 -0
  7. package/dist/auth.d.ts.map +1 -0
  8. package/dist/auth.js +240 -0
  9. package/dist/auth.js.map +1 -0
  10. package/dist/commands/ai/chat.d.ts +9 -0
  11. package/dist/commands/ai/chat.d.ts.map +1 -0
  12. package/dist/commands/ai/chat.js +16 -0
  13. package/dist/commands/ai/chat.js.map +1 -0
  14. package/dist/commands/ai/skills.d.ts +9 -0
  15. package/dist/commands/ai/skills.d.ts.map +1 -0
  16. package/dist/commands/ai/skills.js +16 -0
  17. package/dist/commands/ai/skills.js.map +1 -0
  18. package/dist/commands/auth/login.d.ts +24 -0
  19. package/dist/commands/auth/login.d.ts.map +1 -0
  20. package/dist/commands/auth/login.js +288 -0
  21. package/dist/commands/auth/login.js.map +1 -0
  22. package/dist/commands/auth/logout.d.ts +16 -0
  23. package/dist/commands/auth/logout.d.ts.map +1 -0
  24. package/dist/commands/auth/logout.js +49 -0
  25. package/dist/commands/auth/logout.js.map +1 -0
  26. package/dist/commands/auth/status.d.ts +28 -0
  27. package/dist/commands/auth/status.d.ts.map +1 -0
  28. package/dist/commands/auth/status.js +92 -0
  29. package/dist/commands/auth/status.js.map +1 -0
  30. package/dist/commands/base.d.ts +107 -0
  31. package/dist/commands/base.d.ts.map +1 -0
  32. package/dist/commands/base.js +153 -0
  33. package/dist/commands/base.js.map +1 -0
  34. package/dist/commands/business/pricing.d.ts +9 -0
  35. package/dist/commands/business/pricing.d.ts.map +1 -0
  36. package/dist/commands/business/pricing.js +16 -0
  37. package/dist/commands/business/pricing.js.map +1 -0
  38. package/dist/commands/business/report.d.ts +9 -0
  39. package/dist/commands/business/report.d.ts.map +1 -0
  40. package/dist/commands/business/report.js +16 -0
  41. package/dist/commands/business/report.js.map +1 -0
  42. package/dist/commands/inventory/risk.d.ts +9 -0
  43. package/dist/commands/inventory/risk.d.ts.map +1 -0
  44. package/dist/commands/inventory/risk.js +16 -0
  45. package/dist/commands/inventory/risk.js.map +1 -0
  46. package/dist/config.d.ts +54 -0
  47. package/dist/config.d.ts.map +1 -0
  48. package/dist/config.js +111 -0
  49. package/dist/config.js.map +1 -0
  50. package/dist/index.d.ts +5 -1
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +127 -81
  53. package/dist/index.js.map +1 -1
  54. package/dist/query/executor.d.ts +138 -0
  55. package/dist/query/executor.d.ts.map +1 -0
  56. package/dist/query/executor.js +232 -0
  57. package/dist/query/executor.js.map +1 -0
  58. package/dist/query/types.d.ts +116 -0
  59. package/dist/query/types.d.ts.map +1 -0
  60. package/dist/query/types.js +15 -0
  61. package/dist/query/types.js.map +1 -0
  62. package/dist/query/utils.d.ts +99 -0
  63. package/dist/query/utils.d.ts.map +1 -0
  64. package/dist/query/utils.js +151 -0
  65. package/dist/query/utils.js.map +1 -0
  66. package/dist/services/ServiceContainer.d.ts +110 -0
  67. package/dist/services/ServiceContainer.d.ts.map +1 -0
  68. package/dist/services/ServiceContainer.js +242 -0
  69. package/dist/services/ServiceContainer.js.map +1 -0
  70. package/dist/services/api/client.d.ts +88 -0
  71. package/dist/services/api/client.d.ts.map +1 -0
  72. package/dist/services/api/client.js +188 -0
  73. package/dist/services/api/client.js.map +1 -0
  74. package/dist/services/api/types.d.ts +233 -0
  75. package/dist/services/api/types.d.ts.map +1 -0
  76. package/dist/services/api/types.js +83 -0
  77. package/dist/services/api/types.js.map +1 -0
  78. package/dist/services/auth/provider.d.ts +73 -0
  79. package/dist/services/auth/provider.d.ts.map +1 -0
  80. package/dist/services/auth/provider.js +339 -0
  81. package/dist/services/auth/provider.js.map +1 -0
  82. package/dist/services/auth/session.d.ts +73 -0
  83. package/dist/services/auth/session.d.ts.map +1 -0
  84. package/dist/services/auth/session.js +200 -0
  85. package/dist/services/auth/session.js.map +1 -0
  86. package/dist/services/business/demand.d.ts +70 -0
  87. package/dist/services/business/demand.d.ts.map +1 -0
  88. package/dist/services/business/demand.js +240 -0
  89. package/dist/services/business/demand.js.map +1 -0
  90. package/dist/services/business/fulfillment.d.ts +122 -0
  91. package/dist/services/business/fulfillment.d.ts.map +1 -0
  92. package/dist/services/business/fulfillment.js +267 -0
  93. package/dist/services/business/fulfillment.js.map +1 -0
  94. package/dist/services/business/inventory.d.ts +54 -0
  95. package/dist/services/business/inventory.d.ts.map +1 -0
  96. package/dist/services/business/inventory.js +245 -0
  97. package/dist/services/business/inventory.js.map +1 -0
  98. package/dist/services/business/pricing.d.ts +41 -0
  99. package/dist/services/business/pricing.d.ts.map +1 -0
  100. package/dist/services/business/pricing.js +133 -0
  101. package/dist/services/business/pricing.js.map +1 -0
  102. package/dist/services/business/report.d.ts +74 -0
  103. package/dist/services/business/report.d.ts.map +1 -0
  104. package/dist/services/business/report.js +380 -0
  105. package/dist/services/business/report.js.map +1 -0
  106. package/dist/services/config/manager.d.ts +105 -0
  107. package/dist/services/config/manager.d.ts.map +1 -0
  108. package/dist/services/config/manager.js +324 -0
  109. package/dist/services/config/manager.js.map +1 -0
  110. package/dist/services/config/types.d.ts +128 -0
  111. package/dist/services/config/types.d.ts.map +1 -0
  112. package/dist/services/config/types.js +209 -0
  113. package/dist/services/config/types.js.map +1 -0
  114. package/dist/services/index.d.ts +17 -0
  115. package/dist/services/index.d.ts.map +1 -0
  116. package/dist/services/index.js +44 -0
  117. package/dist/services/index.js.map +1 -0
  118. package/dist/services/storage/index.d.ts +63 -0
  119. package/dist/services/storage/index.d.ts.map +1 -0
  120. package/dist/services/storage/index.js +136 -0
  121. package/dist/services/storage/index.js.map +1 -0
  122. package/dist/types/api.d.ts +58 -0
  123. package/dist/types/api.d.ts.map +1 -0
  124. package/dist/types/api.js +5 -0
  125. package/dist/types/api.js.map +1 -0
  126. package/dist/types/auth.d.ts +59 -0
  127. package/dist/types/auth.d.ts.map +1 -0
  128. package/dist/types/auth.js +11 -0
  129. package/dist/types/auth.js.map +1 -0
  130. package/dist/types/business.d.ts +201 -0
  131. package/dist/types/business.d.ts.map +1 -0
  132. package/dist/types/business.js +5 -0
  133. package/dist/types/business.js.map +1 -0
  134. package/dist/types/command.d.ts +106 -0
  135. package/dist/types/command.d.ts.map +1 -0
  136. package/dist/types/command.js +5 -0
  137. package/dist/types/command.js.map +1 -0
  138. package/dist/types/config.d.ts +66 -0
  139. package/dist/types/config.d.ts.map +1 -0
  140. package/dist/types/config.js +5 -0
  141. package/dist/types/config.js.map +1 -0
  142. package/dist/utils/async.d.ts +79 -0
  143. package/dist/utils/async.d.ts.map +1 -0
  144. package/dist/utils/async.js +179 -0
  145. package/dist/utils/async.js.map +1 -0
  146. package/dist/utils/format.d.ts +90 -0
  147. package/dist/utils/format.d.ts.map +1 -0
  148. package/dist/utils/format.js +227 -0
  149. package/dist/utils/format.js.map +1 -0
  150. package/dist/utils/logger.d.ts +136 -0
  151. package/dist/utils/logger.d.ts.map +1 -0
  152. package/dist/utils/logger.js +249 -0
  153. package/dist/utils/logger.js.map +1 -0
  154. package/dist/utils/validation.d.ts +100 -0
  155. package/dist/utils/validation.d.ts.map +1 -0
  156. package/dist/utils/validation.js +334 -0
  157. package/dist/utils/validation.js.map +1 -0
  158. 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
- 关于 Round2AI
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
- R2-CLI 开放 6 大业务域、40+ 命令、12 个 AI Agent Skills,覆盖二手潮奢交易全链路。
16
- 业务域
17
- 能力
18
- 说明
19
- 📊 数据对接
20
- r2 ingest
21
- 对接主流 ERP,统一线上电商、线下门店、仓储履约等多渠道经营数据
22
- 📈 经营分析
23
- r2 report
24
- 生成经营日报 / 周报,涵盖销售、毛利、库龄、异常波动
25
-
26
- r2 ask
27
- 自然语言查询经营数据,实时返回结果
28
- 🔍 市场分析
29
- r2 demand
30
- SKU / 品类 / 区域扫描市场需求热度与供需缺口
31
-
32
- r2 simulate
33
- 竞价成交模拟,输入出价返回预估成交率与利润空间
34
-
35
- r2 bidding strategy
36
- 基于预算与品类生成竞价策略建议
37
- 💰 价格分析
38
- r2 pricing
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
- 查询某个 SKU 的市场行情和建议价格
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
- 安装后,AI Agent 可以直接调用 R2-CLI 的全部交易能力。一句"帮我看看这周哪些款在亏钱",Agent 会自动调用 r2 ask、r2 pricing、r2 inventory risk,给出完整的分析和建议。
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
- Round2AI — 让潮奢循环交易没有摩擦。
115
- Reduce friction in circular commerce.
116
- 本文发布于 2026 年 4 月 1 日。如有巧合,纯属巧合。
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
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * AI 聊天命令 - 简化版
3
+ */
4
+ import { Command } from "commander";
5
+ /**
6
+ * 创建聊天命令
7
+ */
8
+ export declare function createChatCommand(container: any): Command;
9
+ //# sourceMappingURL=chat.d.ts.map
@@ -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"}