@round2ai/r2-cli 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/README.md +1 -1
  2. package/dist/index.js +843 -181
  3. package/dist/index.js.map +7 -1
  4. package/package.json +8 -4
  5. package/dist/api.d.ts +0 -45
  6. package/dist/api.d.ts.map +0 -1
  7. package/dist/api.js +0 -90
  8. package/dist/api.js.map +0 -1
  9. package/dist/auth.d.ts +0 -35
  10. package/dist/auth.d.ts.map +0 -1
  11. package/dist/auth.js +0 -240
  12. package/dist/auth.js.map +0 -1
  13. package/dist/commands/ai/chat.d.ts +0 -9
  14. package/dist/commands/ai/chat.d.ts.map +0 -1
  15. package/dist/commands/ai/chat.js +0 -16
  16. package/dist/commands/ai/chat.js.map +0 -1
  17. package/dist/commands/ai/skills.d.ts +0 -9
  18. package/dist/commands/ai/skills.d.ts.map +0 -1
  19. package/dist/commands/ai/skills.js +0 -16
  20. package/dist/commands/ai/skills.js.map +0 -1
  21. package/dist/commands/auth/login.d.ts +0 -24
  22. package/dist/commands/auth/login.d.ts.map +0 -1
  23. package/dist/commands/auth/login.js +0 -288
  24. package/dist/commands/auth/login.js.map +0 -1
  25. package/dist/commands/auth/logout.d.ts +0 -16
  26. package/dist/commands/auth/logout.d.ts.map +0 -1
  27. package/dist/commands/auth/logout.js +0 -49
  28. package/dist/commands/auth/logout.js.map +0 -1
  29. package/dist/commands/auth/status.d.ts +0 -28
  30. package/dist/commands/auth/status.d.ts.map +0 -1
  31. package/dist/commands/auth/status.js +0 -92
  32. package/dist/commands/auth/status.js.map +0 -1
  33. package/dist/commands/base.d.ts +0 -107
  34. package/dist/commands/base.d.ts.map +0 -1
  35. package/dist/commands/base.js +0 -153
  36. package/dist/commands/base.js.map +0 -1
  37. package/dist/commands/business/pricing.d.ts +0 -9
  38. package/dist/commands/business/pricing.d.ts.map +0 -1
  39. package/dist/commands/business/pricing.js +0 -16
  40. package/dist/commands/business/pricing.js.map +0 -1
  41. package/dist/commands/business/report.d.ts +0 -9
  42. package/dist/commands/business/report.d.ts.map +0 -1
  43. package/dist/commands/business/report.js +0 -16
  44. package/dist/commands/business/report.js.map +0 -1
  45. package/dist/commands/inventory/risk.d.ts +0 -9
  46. package/dist/commands/inventory/risk.d.ts.map +0 -1
  47. package/dist/commands/inventory/risk.js +0 -16
  48. package/dist/commands/inventory/risk.js.map +0 -1
  49. package/dist/config.d.ts +0 -54
  50. package/dist/config.d.ts.map +0 -1
  51. package/dist/config.js +0 -111
  52. package/dist/config.js.map +0 -1
  53. package/dist/index.d.ts +0 -7
  54. package/dist/index.d.ts.map +0 -1
  55. package/dist/query/executor.d.ts +0 -138
  56. package/dist/query/executor.d.ts.map +0 -1
  57. package/dist/query/executor.js +0 -232
  58. package/dist/query/executor.js.map +0 -1
  59. package/dist/query/types.d.ts +0 -116
  60. package/dist/query/types.d.ts.map +0 -1
  61. package/dist/query/types.js +0 -15
  62. package/dist/query/types.js.map +0 -1
  63. package/dist/query/utils.d.ts +0 -99
  64. package/dist/query/utils.d.ts.map +0 -1
  65. package/dist/query/utils.js +0 -151
  66. package/dist/query/utils.js.map +0 -1
  67. package/dist/services/ServiceContainer.d.ts +0 -110
  68. package/dist/services/ServiceContainer.d.ts.map +0 -1
  69. package/dist/services/ServiceContainer.js +0 -242
  70. package/dist/services/ServiceContainer.js.map +0 -1
  71. package/dist/services/api/client.d.ts +0 -88
  72. package/dist/services/api/client.d.ts.map +0 -1
  73. package/dist/services/api/client.js +0 -188
  74. package/dist/services/api/client.js.map +0 -1
  75. package/dist/services/api/types.d.ts +0 -233
  76. package/dist/services/api/types.d.ts.map +0 -1
  77. package/dist/services/api/types.js +0 -83
  78. package/dist/services/api/types.js.map +0 -1
  79. package/dist/services/auth/provider.d.ts +0 -73
  80. package/dist/services/auth/provider.d.ts.map +0 -1
  81. package/dist/services/auth/provider.js +0 -339
  82. package/dist/services/auth/provider.js.map +0 -1
  83. package/dist/services/auth/session.d.ts +0 -73
  84. package/dist/services/auth/session.d.ts.map +0 -1
  85. package/dist/services/auth/session.js +0 -200
  86. package/dist/services/auth/session.js.map +0 -1
  87. package/dist/services/business/demand.d.ts +0 -70
  88. package/dist/services/business/demand.d.ts.map +0 -1
  89. package/dist/services/business/demand.js +0 -240
  90. package/dist/services/business/demand.js.map +0 -1
  91. package/dist/services/business/fulfillment.d.ts +0 -122
  92. package/dist/services/business/fulfillment.d.ts.map +0 -1
  93. package/dist/services/business/fulfillment.js +0 -267
  94. package/dist/services/business/fulfillment.js.map +0 -1
  95. package/dist/services/business/inventory.d.ts +0 -54
  96. package/dist/services/business/inventory.d.ts.map +0 -1
  97. package/dist/services/business/inventory.js +0 -245
  98. package/dist/services/business/inventory.js.map +0 -1
  99. package/dist/services/business/pricing.d.ts +0 -41
  100. package/dist/services/business/pricing.d.ts.map +0 -1
  101. package/dist/services/business/pricing.js +0 -133
  102. package/dist/services/business/pricing.js.map +0 -1
  103. package/dist/services/business/report.d.ts +0 -74
  104. package/dist/services/business/report.d.ts.map +0 -1
  105. package/dist/services/business/report.js +0 -380
  106. package/dist/services/business/report.js.map +0 -1
  107. package/dist/services/config/manager.d.ts +0 -105
  108. package/dist/services/config/manager.d.ts.map +0 -1
  109. package/dist/services/config/manager.js +0 -324
  110. package/dist/services/config/manager.js.map +0 -1
  111. package/dist/services/config/types.d.ts +0 -128
  112. package/dist/services/config/types.d.ts.map +0 -1
  113. package/dist/services/config/types.js +0 -209
  114. package/dist/services/config/types.js.map +0 -1
  115. package/dist/services/index.d.ts +0 -17
  116. package/dist/services/index.d.ts.map +0 -1
  117. package/dist/services/index.js +0 -44
  118. package/dist/services/index.js.map +0 -1
  119. package/dist/services/storage/index.d.ts +0 -63
  120. package/dist/services/storage/index.d.ts.map +0 -1
  121. package/dist/services/storage/index.js +0 -136
  122. package/dist/services/storage/index.js.map +0 -1
  123. package/dist/types/api.d.ts +0 -58
  124. package/dist/types/api.d.ts.map +0 -1
  125. package/dist/types/api.js +0 -5
  126. package/dist/types/api.js.map +0 -1
  127. package/dist/types/auth.d.ts +0 -59
  128. package/dist/types/auth.d.ts.map +0 -1
  129. package/dist/types/auth.js +0 -11
  130. package/dist/types/auth.js.map +0 -1
  131. package/dist/types/business.d.ts +0 -201
  132. package/dist/types/business.d.ts.map +0 -1
  133. package/dist/types/business.js +0 -5
  134. package/dist/types/business.js.map +0 -1
  135. package/dist/types/command.d.ts +0 -106
  136. package/dist/types/command.d.ts.map +0 -1
  137. package/dist/types/command.js +0 -5
  138. package/dist/types/command.js.map +0 -1
  139. package/dist/types/config.d.ts +0 -66
  140. package/dist/types/config.d.ts.map +0 -1
  141. package/dist/types/config.js +0 -5
  142. package/dist/types/config.js.map +0 -1
  143. package/dist/utils/async.d.ts +0 -79
  144. package/dist/utils/async.d.ts.map +0 -1
  145. package/dist/utils/async.js +0 -179
  146. package/dist/utils/async.js.map +0 -1
  147. package/dist/utils/format.d.ts +0 -90
  148. package/dist/utils/format.d.ts.map +0 -1
  149. package/dist/utils/format.js +0 -227
  150. package/dist/utils/format.js.map +0 -1
  151. package/dist/utils/logger.d.ts +0 -136
  152. package/dist/utils/logger.d.ts.map +0 -1
  153. package/dist/utils/logger.js +0 -249
  154. package/dist/utils/logger.js.map +0 -1
  155. package/dist/utils/validation.d.ts +0 -100
  156. package/dist/utils/validation.d.ts.map +0 -1
  157. package/dist/utils/validation.js +0 -334
  158. package/dist/utils/validation.js.map +0 -1
package/dist/auth.js DELETED
@@ -1,240 +0,0 @@
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 DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,16 +0,0 @@
1
- /**
2
- * AI 聊天命令 - 简化版
3
- */
4
- import { Command } from "commander";
5
- /**
6
- * 创建聊天命令
7
- */
8
- export function createChatCommand(container) {
9
- const command = new Command("chat");
10
- command.description("与 AI 助手聊天,获取经营建议");
11
- command.action(() => {
12
- console.log("AI 聊天功能开发中...");
13
- });
14
- return command;
15
- }
16
- //# sourceMappingURL=chat.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../src/commands/ai/chat.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAc;IAC9C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACpC,OAAO,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC;IAExC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE;QAClB,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -1,9 +0,0 @@
1
- /**
2
- * AI 技能管理命令 - 简化版
3
- */
4
- import { Command } from "commander";
5
- /**
6
- * 创建技能管理命令
7
- */
8
- export declare function createSkillsCommand(container: any): Command;
9
- //# sourceMappingURL=skills.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../../src/commands/ai/skills.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,GAAG,GAAG,OAAO,CAS3D"}
@@ -1,16 +0,0 @@
1
- /**
2
- * AI 技能管理命令 - 简化版
3
- */
4
- import { Command } from "commander";
5
- /**
6
- * 创建技能管理命令
7
- */
8
- export function createSkillsCommand(container) {
9
- const command = new Command("skills");
10
- command.description("AI Agent 技能管理");
11
- command.action(() => {
12
- console.log("技能管理功能开发中...");
13
- });
14
- return command;
15
- }
16
- //# sourceMappingURL=skills.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/commands/ai/skills.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAc;IAChD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;IACtC,OAAO,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;IAErC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE;QAClB,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -1,24 +0,0 @@
1
- /**
2
- * 扫码登录命令实现
3
- *
4
- * 参考 claude-code 的查询执行模式,实现完整的扫码登录流程:
5
- * 1. 生成二维码
6
- * 2. 显示二维码(使用终端 ASCII 艺术或链接)
7
- * 3. 轮询查询状态
8
- * 4. 等待用户扫码确认
9
- * 5. 保存登录凭证
10
- */
11
- import type { Command } from "commander";
12
- /**
13
- * 创建登录命令
14
- */
15
- export declare function createLoginCommand(): Command;
16
- /**
17
- * 创建登出命令
18
- */
19
- export declare function createLogoutCommand(): Command;
20
- /**
21
- * 创建状态命令
22
- */
23
- export declare function createStatusCommand(): Command;
24
- //# sourceMappingURL=login.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/login.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkQzC;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CA6B5C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAkB7C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAkB7C"}
@@ -1,288 +0,0 @@
1
- /**
2
- * 扫码登录命令实现
3
- *
4
- * 参考 claude-code 的查询执行模式,实现完整的扫码登录流程:
5
- * 1. 生成二维码
6
- * 2. 显示二维码(使用终端 ASCII 艺术或链接)
7
- * 3. 轮询查询状态
8
- * 4. 等待用户扫码确认
9
- * 5. 保存登录凭证
10
- */
11
- import chalk from "chalk";
12
- import { executePollingQuery } from "../../query/executor.js";
13
- import { createQRCodeAuthApi, createApiClient } from "../../services/api/client.js";
14
- import { createStorageService } from "../../services/storage/index.js";
15
- // 动态导入 qrcode-terminal(CommonJS)
16
- import { createRequire } from "node:module";
17
- const require = createRequire(import.meta.url);
18
- const qrcodeTerminal = require("qrcode-terminal");
19
- // ==================== 登录服务 ====================
20
- /**
21
- * 登录服务类
22
- */
23
- class LoginService {
24
- apiClient;
25
- authApi;
26
- storage = createStorageService();
27
- constructor() {
28
- this.apiClient = createApiClient();
29
- this.authApi = createQRCodeAuthApi(this.apiClient);
30
- }
31
- /**
32
- * 执行扫码登录
33
- */
34
- async login(signal) {
35
- console.log(chalk.cyan("\n🔐 正在启动扫码登录..."));
36
- // 1. 生成二维码
37
- const qrData = await this.authApi.generateQRCode();
38
- console.log(chalk.green("✅ 二维码已生成\n"));
39
- // 2. 显示二维码
40
- this.displayQRCode(qrData);
41
- // 3. 构建轮询查询
42
- const query = {
43
- id: "qrcode-status-poll",
44
- description: "查询二维码登录状态",
45
- deps: {
46
- signal: signal ?? null,
47
- uuid: () => Math.random().toString(36),
48
- api: {
49
- get: async (url) => {
50
- // 忽略 url 参数,使用内部方法调用
51
- return this.authApi.getQRCodeStatus(qrData.qrToken);
52
- },
53
- post: async (_url, _body) => {
54
- throw new Error("Not implemented");
55
- },
56
- },
57
- log: {
58
- info: (msg) => console.log(chalk.blue(`[INFO] ${msg}`)),
59
- error: (msg) => console.error(chalk.red(`[ERROR] ${msg}`)),
60
- debug: (msg) => console.log(chalk.gray(`[DEBUG] ${msg}`)),
61
- },
62
- },
63
- execute: async () => {
64
- return this.authApi.getQRCodeStatus(qrData.qrToken);
65
- },
66
- options: {
67
- timeout: Number.parseInt(qrData.expireTime, 10),
68
- enableProgress: true,
69
- },
70
- };
71
- // 4. 执行轮询查询
72
- try {
73
- const result = await this.pollLoginStatus(query, qrData);
74
- // 5. 保存登录凭证
75
- if (result.data.token && result.data.userInfo) {
76
- await this.saveCredentials(result.data.token, result.data.userInfo);
77
- console.log(chalk.green("\n✅ 登录成功!\n"));
78
- this.displayUserInfo(result.data.userInfo);
79
- return {
80
- userInfo: result.data.userInfo,
81
- token: result.data.token,
82
- };
83
- }
84
- throw new Error("登录失败: 未获取到凭证");
85
- }
86
- catch (error) {
87
- console.log(chalk.red("\n❌ 登录失败\n"));
88
- throw error;
89
- }
90
- }
91
- /**
92
- * 显示二维码
93
- */
94
- displayQRCode(qrData) {
95
- console.log(chalk.yellow("📱 请使用 第二回合APP 扫描二维码登录\n"));
96
- // 使用 qrcode-terminal 显示二维码
97
- qrcodeTerminal.generate(`r2://auth/login?qrToken=${qrData.qrContent}`, { small: true });
98
- const expireTimeMs = Number.parseInt(qrData.expireTime, 10);
99
- const pollIntervalMs = Number.parseInt(qrData.pollInterval, 10);
100
- console.log(chalk.gray("\n二维码内容: ") + chalk.white(qrData.qrContent));
101
- console.log(chalk.gray("过期时间: ") + chalk.white(`${expireTimeMs / 1000} 秒`));
102
- console.log(chalk.gray("轮询间隔: ") + chalk.white(`${pollIntervalMs} 毫秒`));
103
- console.log(chalk.yellow("\n⏳ 等待扫码..."));
104
- }
105
- /**
106
- * 轮询登录状态
107
- */
108
- async pollLoginStatus(query, qrData) {
109
- let lastStatus = "waiting";
110
- const expireTimeMs = Number.parseInt(qrData.expireTime, 10);
111
- const pollIntervalMs = Number.parseInt(qrData.pollInterval, 10);
112
- const pollingIterator = executePollingQuery(query, {
113
- interval: pollIntervalMs,
114
- timeout: expireTimeMs,
115
- condition: (data) => {
116
- // 检查状态变化
117
- if (data.status !== lastStatus) {
118
- lastStatus = data.status;
119
- switch (data.status) {
120
- case "scanned":
121
- console.log(chalk.cyan(`\n🔍 已扫码: ${data.userInfo?.nickname || "未知用户"}`));
122
- console.log(chalk.yellow("请在 APP 上确认登录"));
123
- break;
124
- case "confirmed":
125
- console.log(chalk.green("\n✅ 用户已确认登录"));
126
- break;
127
- case "expired":
128
- console.log(chalk.red("\n⏰ 二维码已过期"));
129
- break;
130
- case "canceled":
131
- console.log(chalk.red("\n🚫 用户已取消登录"));
132
- break;
133
- }
134
- }
135
- return data.status === "confirmed";
136
- },
137
- });
138
- let result = null;
139
- // 手动迭代以获取 AsyncGenerator 的返回值
140
- let done = false;
141
- while (!done) {
142
- const { value, done: iterationDone } = await pollingIterator.next();
143
- done = iterationDone ?? true;
144
- // 返回值在最后一次迭代时在 value 中
145
- if (done) {
146
- if (value && "data" in value) {
147
- result = { data: value.data };
148
- }
149
- }
150
- else {
151
- // 这是 yield 的 ProgressEvent,不需要处理
152
- }
153
- }
154
- if (result) {
155
- return result;
156
- }
157
- throw new Error("轮询异常终止");
158
- }
159
- /**
160
- * 显示用户信息
161
- */
162
- displayUserInfo(userInfo) {
163
- console.log(chalk.white("━━━━━━━━━━━━━━━━━━━━━━━━━━━━"));
164
- console.log(chalk.cyan("用户信息:"));
165
- console.log(chalk.white(" 用户名: ") + chalk.yellow(userInfo.username));
166
- console.log(chalk.white(" 昵称: ") + chalk.yellow(userInfo.nickname));
167
- console.log(chalk.white(" 手机号: ") + chalk.yellow(userInfo.mobile));
168
- console.log(chalk.white(" 用户ID: ") + chalk.yellow(userInfo.userId.toString()));
169
- console.log(chalk.white("━━━━━━━━━━━━━━━━━━━━━━━━━━━━"));
170
- }
171
- /**
172
- * 保存登录凭证
173
- */
174
- async saveCredentials(token, userInfo) {
175
- await this.storage.saveCredentials(token, userInfo);
176
- const credentials = await this.storage.getCredentials();
177
- // console.log(chalk.gray("\n💾 凭证已保存到: " + this.storage.getConfigPath()));
178
- // console.log(chalk.gray(` Token: ${token.substring(0, 20)}...`));
179
- // console.log(chalk.gray(` 用户: ${userInfo.nickname} (${userInfo.username})`));
180
- // console.log(chalk.gray(` 保存时间: ${new Date(credentials!.timestamp).toLocaleString()}`));
181
- }
182
- /**
183
- * 登出
184
- */
185
- async logout() {
186
- console.log(chalk.cyan("\n🚪 正在退出登录..."));
187
- // 清除本地凭证
188
- await this.clearCredentials();
189
- console.log(chalk.green("✅ 已退出登录\n"));
190
- }
191
- /**
192
- * 查看登录状态
193
- */
194
- async status() {
195
- console.log(chalk.cyan("\n📊 查看登录状态...\n"));
196
- const isLoggedIn = await this.storage.isLoggedIn();
197
- if (!isLoggedIn) {
198
- console.log(chalk.yellow("⚠️ 尚未登录或凭证已过期\n"));
199
- return;
200
- }
201
- const credentials = await this.storage.getCredentials();
202
- const userInfo = credentials.userInfo;
203
- const lastLogin = new Date(credentials.timestamp);
204
- const daysSinceLogin = Math.floor((Date.now() - credentials.timestamp) / (1000 * 60 * 60 * 24));
205
- console.log(chalk.green("✅ 已登录\n"));
206
- this.displayUserInfo(userInfo);
207
- console.log(chalk.gray("\n📅 最后登录: " + lastLogin.toLocaleString()));
208
- console.log(chalk.gray(" 距离今天: " + daysSinceLogin + " 天前"));
209
- // console.log(chalk.gray("\n💾 配置文件: " + this.storage.getConfigPath()));
210
- }
211
- /**
212
- * 清除登录凭证
213
- */
214
- async clearCredentials() {
215
- await this.storage.clearCredentials();
216
- // console.log(chalk.gray("💾 凭证已从 " + this.storage.getConfigPath() + " 清除"));
217
- }
218
- }
219
- // ==================== 命令工厂 ====================
220
- /**
221
- * 创建登录命令
222
- */
223
- export function createLoginCommand() {
224
- const { Command } = require("commander");
225
- const command = new Command("login");
226
- command.description("扫码登录 Round2AI 账户");
227
- command.option("--timeout <ms>", "超时时间(毫秒)", "300000");
228
- command.option("--debug", "启用调试模式", false);
229
- command.action(async (options) => {
230
- try {
231
- const loginService = new LoginService();
232
- const controller = new AbortController();
233
- // 设置超时
234
- const timeout = setTimeout(() => {
235
- controller.abort();
236
- }, Number.parseInt(options.timeout ?? "300000", 10));
237
- await loginService.login(controller.signal);
238
- clearTimeout(timeout);
239
- }
240
- catch (error) {
241
- const errorMessage = error instanceof Error ? error.message : String(error);
242
- console.error(chalk.red(`❌ ${errorMessage}`));
243
- process.exit(1);
244
- }
245
- });
246
- return command;
247
- }
248
- /**
249
- * 创建登出命令
250
- */
251
- export function createLogoutCommand() {
252
- const { Command } = require("commander");
253
- const command = new Command("logout");
254
- command.description("退出登录");
255
- command.action(async () => {
256
- try {
257
- const loginService = new LoginService();
258
- await loginService.logout();
259
- }
260
- catch (error) {
261
- const errorMessage = error instanceof Error ? error.message : String(error);
262
- console.error(chalk.red(`❌ ${errorMessage}`));
263
- process.exit(1);
264
- }
265
- });
266
- return command;
267
- }
268
- /**
269
- * 创建状态命令
270
- */
271
- export function createStatusCommand() {
272
- const { Command } = require("commander");
273
- const command = new Command("status");
274
- command.description("查看登录状态");
275
- command.action(async () => {
276
- try {
277
- const loginService = new LoginService();
278
- await loginService.status();
279
- }
280
- catch (error) {
281
- const errorMessage = error instanceof Error ? error.message : String(error);
282
- console.error(chalk.red(`❌ ${errorMessage}`));
283
- process.exit(1);
284
- }
285
- });
286
- return command;
287
- }
288
- //# sourceMappingURL=login.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/commands/auth/login.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,mBAAmB,EAAwB,MAAM,yBAAyB,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAEvE,iCAAiC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,cAAc,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAElD,iDAAiD;AAEjD;;GAEG;AACH,MAAM,YAAY;IACR,SAAS,CAAqC;IAC9C,OAAO,CAAyC;IAChD,OAAO,GAAG,oBAAoB,EAAE,CAAC;IAEzC;QACE,IAAI,CAAC,SAAS,GAAG,eAAe,EAAE,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,MAAoB;QAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAE5C,WAAW;QACX,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;QAEvC,WAAW;QACX,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAE3B,YAAY;QACZ,MAAM,KAAK,GAA+F;YACxG,EAAE,EAAE,oBAAoB;YACxB,WAAW,EAAE,WAAW;YACxB,IAAI,EAAE;gBACJ,MAAM,EAAE,MAAM,IAAI,IAAI;gBACtB,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACtC,GAAG,EAAE;oBACH,GAAG,EAAE,KAAK,EAAe,GAAW,EAAc,EAAE;wBAClD,qBAAqB;wBACrB,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAM,CAAC;oBAC3D,CAAC;oBACD,IAAI,EAAE,KAAK,EAAe,IAAY,EAAE,KAAe,EAAc,EAAE;wBACrE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;oBACrC,CAAC;iBACF;gBACD,GAAG,EAAE;oBACH,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;oBACvD,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;oBAC1D,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;iBAC1D;aACF;YACD,OAAO,EAAE,KAAK,IAAI,EAAE;gBAClB,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACtD,CAAC;YACD,OAAO,EAAE;gBACP,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;gBAC/C,cAAc,EAAE,IAAI;aACrB;SACF,CAAC;QAEF,YAAY;QACZ,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAEzD,YAAY;YACZ,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC9C,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAEpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;gBACxC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAE3C,OAAO;oBACL,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ;oBAC9B,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK;iBACzB,CAAC;YACJ,CAAC;YAED,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;YACrC,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,MAA0B;QAC9C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC,CAAC;QAEtD,2BAA2B;QAC3B,cAAc,CAAC,QAAQ,CAAC,2BAA2B,MAAM,CAAC,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAExF,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAC5D,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QAEhE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,YAAY,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC;QAC5E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,cAAc,KAAK,CAAC,CAAC,CAAC;QAExE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,eAAe,CAC3B,KAIE,EACF,MAA0B;QAE1B,IAAI,UAAU,GAAiB,SAAS,CAAC;QAEzC,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAC5D,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QAEhE,MAAM,eAAe,GAAG,mBAAmB,CAAC,KAAK,EAAE;YACjD,QAAQ,EAAE,cAAc;YACxB,OAAO,EAAE,YAAY;YACrB,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;gBAClB,SAAS;gBACT,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;oBAC/B,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;oBAEzB,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;wBACpB,KAAK,SAAS;4BACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,QAAQ,EAAE,QAAQ,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC;4BAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;4BAC1C,MAAM;wBACR,KAAK,WAAW;4BACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;4BACxC,MAAM;wBACR,KAAK,SAAS;4BACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;4BACrC,MAAM;wBACR,KAAK,UAAU;4BACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;4BACvC,MAAM;oBACV,CAAC;gBACH,CAAC;gBAED,OAAO,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC;YACrC,CAAC;SACF,CAAC,CAAC;QAEH,IAAI,MAAM,GAA+F,IAAI,CAAC;QAE9G,8BAA8B;QAC9B,IAAI,IAAI,GAAG,KAAK,CAAC;QACjB,OAAO,CAAC,IAAI,EAAE,CAAC;YACb,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,CAAC;YACpE,IAAI,GAAG,aAAa,IAAI,IAAI,CAAC;YAE7B,uBAAuB;YACvB,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,KAAK,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;oBAC7B,MAAM,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;gBAChC,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,iCAAiC;YACnC,CAAC;QACH,CAAC;QAED,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,QAAkB;QACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAChF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,eAAe,CAAC,KAAa,EAAE,QAAkB;QAC7D,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAEpD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QACxD,2EAA2E;QAC3E,qEAAqE;QACrE,iFAAiF;QACjF,4FAA4F;IAC9F,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM;QACV,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAE1C,SAAS;QACT,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAE9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM;QACV,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAE5C,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAEnD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC;YAC9C,OAAO;QACT,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QACxD,MAAM,QAAQ,GAAG,WAAY,CAAC,QAAQ,CAAC;QACvC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,WAAY,CAAC,SAAS,CAAC,CAAC;QACnD,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,WAAY,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAEjG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,GAAG,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC;QAC9D,yEAAyE;IAC3E,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,gBAAgB;QAC5B,MAAM,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;QACtC,8EAA8E;IAChF,CAAC;CACF;AAED,iDAAiD;AAEjD;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAEzC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,OAAO,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC;IAExC,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IACvD,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAE3C,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,OAA8C,EAAE,EAAE;QACtE,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;YACxC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YAEzC,OAAO;YACP,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC9B,UAAU,CAAC,KAAK,EAAE,CAAC;YACrB,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,IAAI,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;YAErD,MAAM,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAC5C,YAAY,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5E,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,YAAY,EAAE,CAAC,CAAC,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAEzC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;IACtC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAE5B,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;QACxB,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;YACxC,MAAM,YAAY,CAAC,MAAM,EAAE,CAAC;QAC9B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5E,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,YAAY,EAAE,CAAC,CAAC,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAEzC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;IACtC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAE9B,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;QACxB,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;YACxC,MAAM,YAAY,CAAC,MAAM,EAAE,CAAC;QAC9B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5E,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,YAAY,EAAE,CAAC,CAAC,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC"}