@round2ai/r2-cli 1.0.14 → 1.0.16

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 PURESNAKE
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -5,9 +5,9 @@
5
5
 
6
6
  R2-CLI — 二手潮奢交易命令行工具,由 [Round2AI](https://github.com/Round2AI) 团队维护 — 让人类和 AI Agent 都能在终端中完成商品上架等交易操作。
7
7
 
8
- 覆盖商品上架、挂售、商品信息修改、认证登录等核心业务域,提供 16 个命令及 3 个 AI Agent [Skills](./skills/)。
8
+ 覆盖商品上架、挂售、商品信息修改、认证登录等核心业务域,提供 19 个命令及 3 个 AI Agent [Skills](./skills/)。
9
9
 
10
- [安装](#安装与快速开始) · [AI Agent 快速开始](#快速开始ai-agent) · [Agent Skills](#agent-skills) · [认证](#认证) · [命令](#命令参考) · [安全](#安全与风险提示)
10
+ [安装](#安装与快速开始) · [AI Agent 快速开始](#快速开始ai-agent) · [Agent Skills](#agent-skills) · [认证](#认证) · [命令](#命令参考) · [进阶用法](#进阶用法) · [安全](#安全与风险提示使用前必读) · [反馈](#反馈与支持)
11
11
 
12
12
  ## 为什么选 R2-CLI?
13
13
 
@@ -21,8 +21,8 @@ R2-CLI — 二手潮奢交易命令行工具,由 [Round2AI](https://github.com
21
21
  | 类别 | 能力 |
22
22
  |------|------|
23
23
  | 认证登录 | 扫码登录(第二回合 APP / 微信 / 支付宝)、闲鱼店铺授权、状态查询、登出(Agent 一步式流程) |
24
- | 商品管理 | 商品上架(4 步流程:获取店铺 → 获取仓库 → 获取选品商品 → 提交上架 + 自动轮询上架结果)、店铺查看、仓库查看、选品商品查看、上架列表查询、下架、改价 |
25
- | 闲鱼挂售 | 图片上传 AI 读图识别商品信息 → 自动匹配类目/属性 → 提交挂售 |
24
+ | 商品管理 | 商品上架(4 步流程:获取店铺 → 获取仓库 → 获取选品商品 → 提交上架 + 自动轮询上架结果)、商品信息修改(AI 读图识别 → 自动匹配类目/属性 → 提交修改)、店铺查看、仓库查看、选品商品查看、上架列表查询、下架、改价 |
25
+ | 闲鱼挂售 | 图片上传(自动压缩大图、并行上传、失败重试)→ AI 读图识别商品信息 → 自动匹配类目/属性 → 提交挂售 |
26
26
 
27
27
  ---
28
28
 
@@ -158,6 +158,24 @@ Token 存储在 `~/.r2-cli/config.json`(原子写入防丢失),过期后
158
158
  | `r2-cli goods down --id <id> [--json]` | 下架商品(也可用 `--stock-goods-id <id> --shop-id <id>`) |
159
159
  | `r2-cli goods price --id <id> --price <amount> [--json]` | 修改上架价格(也可用 `--stock-goods-id <id> --shop-id <id>`) |
160
160
 
161
+ ### 修改商品信息
162
+
163
+ 修改已上架商品的标题、描述、品牌、类目、图片、属性等。Agent 可自动读图识别并填充商品信息。
164
+
165
+ | 命令 | 说明 |
166
+ |------|------|
167
+ | `r2-cli goods edit --id <id> --category-id <id> --channel-cat-id <id> --json` | 修改商品信息(必填:定位参数 + 类目) |
168
+ | `r2-cli goods edit --id <id> --category-id <id> --channel-cat-id <id> --image-ids <ids> --item-attrs <json> --brand-name <name> --json` | 带图片和属性修改 |
169
+
170
+ **定位商品**:优先使用 `--id <goodsListingId>`(从上架列表 `id` 字段获取),也可用 `--stock-goods-id <id> --account <shopId>`。**必填参数**:定位参数(二选一)+ `--category-id` + `--channel-cat-id`(后端必填)
171
+
172
+ **关键约束**:
173
+ - **类目 ID 必须传**:即使不改类目也要传 `--category-id` 和 `--channel-cat-id`,后端复用挂售 DTO,缺少会报 `getCategoryId() is null`
174
+ - **`--item-attrs` 必须包含所有属性**:后端替换整个属性列表,漏传的属性会被清除。从 `goods hang-up props --channel-cat-id <id> --json` 获取全部属性后,修改目标值,其他保持原样一并传入
175
+ - **品牌必须双传**:`--brand-name`(文本字段)+ itemAttrs 中的品牌项(含 propId/valueId/valueName/propName/channelCatId 五个字段),缺一不可
176
+
177
+ **可选参数**:`--title`、`--desc`、`--image-ids`(需先通过 `hang-up upload-images` 上传)、`--item-attrs`(JSON,5 字段格式)、`--brand-name`、`--stuff-status`、`--goods-no`、`--original-price`、`--size`
178
+
161
179
  ### 闲鱼挂售(完整商品信息模式)
162
180
 
163
181
  挂售模式支持完整的商品信息:图片、类目、属性、品牌等。Agent 可自动识别图片内容填充商品信息,流程:上传图片 → AI 识别 → 匹配类目/属性 → 提交。
@@ -167,10 +185,13 @@ Token 存储在 `~/.r2-cli/config.json`(原子写入防丢失),过期后
167
185
  | `r2-cli goods hang-up categories [--json]` | 获取闲鱼类目列表(大分类 → 小分类) |
168
186
  | `r2-cli goods hang-up props --channel-cat-id <id> [--json]` | 获取指定类目下的属性列表(含可选值) |
169
187
  | `r2-cli goods hang-up brands --channel-cat-id <id> --prop-id <id> --key <keyword> [--json]` | 品牌搜索 |
188
+ | `r2-cli goods hang-up upload-images --shop-id <id> --files <paths> --json` | 批量上传图片到闲鱼(挂售前必须先上传) |
170
189
  | `r2-cli goods hang-up submit --shop-id <id> --title <> --price <> --category-id <> --channel-cat-id <> --image-ids <> --stuff-status <> --desc <> --out-item-no <> --json` | 提交挂售上架 |
171
190
 
172
191
  **挂售必填参数**:`--shop-id`、`--title`、`--price`、`--category-id`(大分类 ID)、`--channel-cat-id`(小分类 ID)、`--image-ids`(图片 ID,逗号分隔)、`--stuff-status`(成色:100 全新 / -1 准新 / 99 99新 / 95 95新 / 90 9新)、`--desc`(商品描述)、`--out-item-no`(商家编码,同店铺唯一)
173
192
 
193
+ **校验规则**:标题最长 30 单位(半角字符 0.5、全角字符 1,约 30 汉字或 60 英文),售价上限 99,999,999 元,超长/超限提交时自动报错。
194
+
174
195
  **挂售可选参数**:`--brand-name`、`--size`、`--goods-no`、`--original-price`、`--item-attrs`(属性列表 JSON)、`--trade-type`(默认 0 仅在线)、`--transport-fee`(默认 0 包邮)、`--yhb`(验货宝)、`--division-id`(默认 330100 杭州)
175
196
 
176
197
  **售后服务**(默认关闭):提交时自动附带售后服务配置,默认全部关闭。卖家需在闲鱼 APP 开通对应服务后才能开启(我的 → 设置 → 卖家服务 → 保障服务)。
@@ -184,14 +205,70 @@ Token 存储在 `~/.r2-cli/config.json`(原子写入防丢失),过期后
184
205
 
185
206
  ---
186
207
 
187
- ## 安全与风险提示
208
+ ## 进阶用法
209
+
210
+ ### 输出格式
211
+
212
+ 所有命令支持双模输出:
213
+
214
+ - **人类模式**(默认):交互式向导 + 终端表格,适合直接操作
215
+ - **Agent 模式**(`--json`):结构化 JSON 输出,适合 AI Agent 解析
216
+
217
+ ### 分页查询
218
+
219
+ 查询类命令(`goods list`、`goods listing`)支持分页:
220
+
221
+ ```bash
222
+ # 每页 50 条(最大)
223
+ r2-cli goods list --stock-id <id> --page 1 --size 50 --json
224
+ r2-cli goods listing --status up --page 2 --size 50 --json
225
+ ```
226
+
227
+ ### 状态过滤
228
+
229
+ ```bash
230
+ r2-cli goods listing --status up # 已上架
231
+ r2-cli goods listing --status sold # 已售出
232
+ r2-cli goods listing --status down # 已下架
233
+ ```
234
+
235
+ ### 跨店铺操作
236
+
237
+ 同一商品可上架到多个店铺,每个操作独立执行:
238
+
239
+ ```bash
240
+ r2-cli goods up --stock-goods-id <id> --shop-id <shopA> --price <n> --json
241
+ r2-cli goods up --stock-goods-id <id> --shop-id <shopB> --price <n> --json
242
+ ```
243
+
244
+ ### 批量操作
245
+
246
+ 批量上架/下架/改价时每个操作独立执行,一个失败不影响其他。批量操作间隔至少 1 秒,避免触发限流。
247
+
248
+ ---
249
+
250
+ ## 安全与风险提示(使用前必读)
251
+
252
+ 本工具可供 AI Agent 调用以自动化操作二手潮奢交易。Agent 将以您的用户身份在授权范围内执行操作,可能导致商品误上架、价格错误、属性错误等风险,请谨慎操作。
188
253
 
189
- 本工具可供 AI Agent 调用以自动化操作二手潮奢交易,Agent 将以您的用户身份在授权范围内执行操作,可能导致商品误上架、价格错误等风险,请谨慎操作。
254
+ ### Agent 操作约束
190
255
 
191
- 建议:
192
- - Agent 收到"上架"指令时,若用户未明确指定方式(选品上架/挂售上架),**必须询问用户**选择哪种上架方式
193
- - Agent 自动识别图片并填充商品信息,售价必问用户;商家编码优先让用户自定义,不填则自动生成推荐
194
- - Token 存储在本地 `~/.r2-cli/config.json`(原子写入,防止中断导致配置丢失),注意保护
256
+ 上架过程中 Agent 必须遵守以下安全规则:
257
+
258
+ - **上架方式必须确认**:Agent 收到"上架"指令时,若用户未明确指定方式(选品上架/挂售上架),必须询问用户
259
+ - **售价必须询问**:Agent 自动识别图片并填充商品信息后,售价仍需用户确认,不能自行决定
260
+ - **商家编码优先自定义**:Agent 应先询问用户商家编码,用户不填时再自动生成推荐
261
+
262
+ ### 凭证安全
263
+
264
+ Token 存储在 `~/.r2-cli/config.json`(原子写入防丢失),过期后需重新登录。扫码登录自动打开浏览器展示品牌化扫码页面,支持第二回合 APP、微信、支付宝扫码。
265
+
266
+ ### 默认安全保护
267
+
268
+ - 所有 `--json` 命令统一错误格式,通过 `success` 字段判断成败
269
+ - 查询输出自动过滤敏感字段(accessToken、refreshExpireIn)
270
+ - 挂售提交默认关闭所有售后服务,避免未开通服务导致提交失败
271
+ - 网络错误自动重试(最多 2 次),认证错误不重试直接引导重新登录
195
272
 
196
273
  ---
197
274
 
@@ -215,6 +292,7 @@ PURESNAKE 深耕二手潮奢交易流通 6 年,累计鉴定超 400 万单,
215
292
  | 协议 | MIT |
216
293
  | 安装 | `npm install -g @round2ai/r2-cli` |
217
294
  | 授权 | `r2-cli auth login` |
295
+ | 输出格式 | 人类友好(默认) / `--json`(Agent) |
218
296
  | AI Agent Skills | 3 |
219
297
  | 数据源 | 通过 ERP 对接各电商平台、线下 POS、自营仓储 WMS |
220
298
 
@@ -222,6 +300,17 @@ PURESNAKE 深耕二手潮奢交易流通 6 年,累计鉴定超 400 万单,
222
300
 
223
301
  Already used by merchants in production.
224
302
 
303
+ ## 反馈与支持
304
+
305
+ 问题反馈或功能建议请通过以下渠道联系:
306
+
307
+ - 提交 GitHub Issue:https://github.com/Round2AI/r2-cli/issues
308
+ - 内部反馈:联系 Round2AI 团队
309
+
310
+ ## 许可证
311
+
312
+ 本项目基于 MIT 许可证开源。
313
+
225
314
  _Round2AI — 让潮奢循环交易没有摩擦。_
226
315
 
227
316
  _Reduce friction in circular commerce._
package/dist/r2-cli.js CHANGED
@@ -1,49 +1,46 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- var ce=Object.defineProperty;var it=(o,t)=>()=>(o&&(t=o(o=0)),t);var at=(o,t)=>{for(var e in t)ce(o,e,{get:t[e],enumerable:!0})};var fo={};at(fo,{UserInfoCard:()=>Ae});import{Box as H,Text as G}from"ink";import{jsx as q,jsxs as V}from"react/jsx-runtime";function Ae({userInfo:o,lastLogin:t,daysSinceLogin:e}){let r=o.mobile?o.mobile.replace(/(\d{3})\d{4}(\d{4})/,"$1****$2"):"-";return V(H,{flexDirection:"column",marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,children:[q(G,{bold:!0,color:"cyan",children:"\u7528\u6237\u4FE1\u606F"}),V(H,{flexDirection:"row",marginTop:1,children:[q(H,{width:10,children:q(G,{color:"gray",children:"\u6635\u79F0"})}),q(G,{color:"yellow",children:o.nickname})]}),V(H,{flexDirection:"row",children:[q(H,{width:10,children:q(G,{color:"gray",children:"\u624B\u673A\u53F7"})}),q(G,{color:"yellow",children:r})]}),t&&V(H,{flexDirection:"column",marginTop:1,children:[V(G,{color:"gray",children:["\u6700\u540E\u767B\u5F55: ",t.toLocaleString()]}),e!==void 0&&V(G,{color:"gray",children:[" \u8DDD\u4ECA: ",e," \u5929"]})]})]})}var ho=it(()=>{"use strict"});var gt={};at(gt,{renderComponent:()=>$t,renderOnce:()=>yo});import ke from"react";import jt from"chalk";import{render as ve}from"ink";import{Writable as Ne}from"node:stream";function yo(o){let t=jt.level;process.env.NO_COLOR||(jt.level=3);try{let e=[],r=new Ne({write(l,y,m){e.push(Buffer.from(l)),m()}});r.isTTY=!0,r.columns=process.stdout.columns||80,r.rows=process.stdout.rows||24,ve(o,{stdout:r,patchConsole:!1}).unmount();let s=Buffer.concat(e).toString("utf8"),a=(s.split(/\x1B\[2J\x1B\[3J\x1B\[H/).at(-1)||s).replace(/\x1B\[\?[\d;]+[hl]/g,"").trimEnd()+`
4
- `;process.stdout.write(a)}finally{jt.level=t}}function $t(o,t){yo(ke.createElement(o,t))}var et=it(()=>{"use strict"});var jo={};at(jo,{ShopsTable:()=>_e});import{Box as S,Text as N}from"ink";import{jsx as f,jsxs as K}from"react/jsx-runtime";function qe(o){return o.map(t=>"shopName"in t?{id:t.shopId,name:t.shopName,platform:t.platform,expiresIn:t.expiresIn}:{id:t.id,name:t.name,platform:t.thirdUserId,expiresIn:t.expiresIn})}function Je({hasPlatform:o,fillWidth:t}){return K(S,{flexDirection:"row",paddingBottom:0,children:[o&&f(S,{width:zt,children:f(N,{bold:!0,color:"white",children:"\u5E73\u53F0"})}),f(S,{width:t,children:f(N,{bold:!0,color:"white",children:"\u5E97\u94FA\u540D"})}),f(S,{width:Wt,children:f(N,{bold:!0,color:"white",children:"ID"})}),f(S,{width:Ht,children:f(N,{bold:!0,color:"white",children:"\u72B6\u6001"})})]})}function Xe({shop:o,hasPlatform:t,fillWidth:e}){let r=Eo[o.platform]??o.platform;return K(S,{flexDirection:"row",children:[t&&f(S,{width:zt,children:f(N,{color:"cyan",children:r})}),f(S,{width:e,children:f(N,{bold:!0,children:o.name})}),f(S,{width:Wt,children:f(N,{color:"gray",children:o.id})}),f(S,{width:Ht,children:f(N,{color:"green",children:"\u25CF \u6388\u6743\u4E2D"})})]})}function _e({shops:o,platform:t}){let e=qe(o),r=t==="all",n=t==="all"?"\u6240\u6709\u6388\u6743\u5E97\u94FA":`${Eo[t]??t}\u6388\u6743\u5E97\u94FA`,s=process.stdout.columns||80,i=4,a=Wt+Ht+(r?zt:0),l=Math.max(s-i-a,20),y=a+l;return K(S,{flexDirection:"column",marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,children:[K(S,{flexDirection:"row",children:[f(N,{bold:!0,color:"cyan",children:n}),K(N,{color:"gray",children:[" \xB7 ",e.length," \u5BB6"]})]}),K(S,{flexDirection:"column",marginTop:1,children:[f(Je,{hasPlatform:r,fillWidth:l}),f(N,{color:"gray",children:"\u2500".repeat(y)}),e.map(m=>f(Xe,{shop:m,hasPlatform:r,fillWidth:l},m.id))]})]})}var Eo,zt,Wt,Ht,$o=it(()=>{"use strict";Eo={xianyu:"\u95F2\u9C7C",douyin:"\u6296\u97F3"},zt=8,Wt=16,Ht=10});var qo={};at(qo,{StocksTable:()=>ze});import{Box as x,Text as C}from"ink";import{jsx as u,jsxs as Y}from"react/jsx-runtime";function Me({fillWidth:o}){return Y(x,{flexDirection:"row",paddingBottom:0,children:[u(x,{width:Vt,children:u(C,{bold:!0,color:"white",children:"ID"})}),u(x,{width:Kt,children:u(C,{bold:!0,color:"white",children:"\u7528\u6237ID"})}),u(x,{width:Yt,children:u(C,{bold:!0,color:"white",children:"\u4ED3\u5E93ID"})}),u(x,{width:o,children:u(C,{bold:!0,color:"white",children:"\u4ED3\u5E93\u540D\u79F0"})}),u(x,{width:Zt,children:u(C,{bold:!0,color:"white",children:"\u521B\u5EFA\u65F6\u95F4"})})]})}function Fe({stock:o,fillWidth:t}){let e=new Date(o.gmtCreate).toLocaleString("zh-CN");return Y(x,{flexDirection:"row",children:[u(x,{width:Vt,children:u(C,{color:"gray",children:o.id})}),u(x,{width:Kt,children:u(C,{color:"gray",children:o.userId})}),u(x,{width:Yt,children:u(C,{color:"gray",children:o.stockId})}),u(x,{width:t,children:u(C,{bold:!0,children:o.stockName})}),u(x,{width:Zt,children:u(C,{color:"gray",children:e})})]})}function ze({stocks:o}){let t=process.stdout.columns||80,e=4,r=Vt+Kt+Yt+Zt,n=Math.max(t-e-r,20),s=r+n;return Y(x,{flexDirection:"column",marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,children:[Y(x,{flexDirection:"row",children:[u(C,{bold:!0,color:"cyan",children:"\u4ED3\u5E93\u5217\u8868"}),Y(C,{color:"gray",children:[" \xB7 ",o.length," \u4E2A"]})]}),Y(x,{flexDirection:"column",marginTop:1,children:[u(Me,{fillWidth:n}),u(C,{color:"gray",children:"\u2500".repeat(s)}),o.map(i=>u(Fe,{stock:i,fillWidth:n},i.id))]})]})}var Vt,Kt,Yt,Zt,Jo=it(()=>{"use strict";Vt=6,Kt=10,Yt=10,Zt=22});import{Command as br}from"commander";import tt from"chalk";import"commander";import{Command as To}from"commander";import w from"chalk";var M=class o extends Error{constructor(e,r,n){super(e);this.code=r;this.details=n;this.name="R2Error",Error.captureStackTrace&&Error.captureStackTrace(this,o)}code;details},P=class extends M{constructor(e,r,n){super(e,"API_ERROR",n);this.status=r;this.response=n;this.name="ApiError"}status;response},$=class extends M{constructor(e,r,n){super(e,"STORAGE_ERROR",{path:r,code:n});this.path=r;this.code=n;this.name="StorageError"}path;code},I=class extends M{constructor(t){super(t,"AUTH_ERROR"),this.name="AuthError"}},U=class extends M{constructor(e,r,n){super(e,"POLLING_ERROR",{attempts:r,timeout:n});this.attempts=r;this.timeout=n;this.name="PollingError"}attempts;timeout};async function le(o,t,e){let r=new AbortController,n=()=>r.abort();e?.addEventListener("abort",n,{once:!0});let s=setTimeout(()=>r.abort(),t);try{return await o()}catch(i){throw r.signal.aborted&&!e?.aborted?new U("\u5355\u6B21\u8F6E\u8BE2\u8BF7\u6C42\u8D85\u65F6"):i}finally{clearTimeout(s),e?.removeEventListener("abort",n)}}async function F(o,t,e){let{interval:r,timeout:n,condition:s}=t,i=Date.now(),a=0;for(;Date.now()-i<n;){if(e?.aborted)throw new U("\u8F6E\u8BE2\u88AB\u4E2D\u6B62");a++;let l=n-(Date.now()-i),y=await le(o,l,e);if(s(y,a))return y;await de(r,e)}throw new U(`\u8F6E\u8BE2\u8D85\u65F6 (\u5DF2\u7B49\u5F85 ${Date.now()-i}ms, \u5171 ${a} \u6B21)`)}function de(o,t){return new Promise((e,r)=>{if(t?.aborted){r(new U("\u8F6E\u8BE2\u88AB\u4E2D\u6B62"));return}let n=()=>{clearTimeout(s),r(new U("\u8F6E\u8BE2\u88AB\u4E2D\u6B62"))},s=setTimeout(()=>{t?.removeEventListener("abort",n),e()},o);t?.addEventListener("abort",n,{once:!0})})}import ge from"node:fs";import{fileURLToPath as pe}from"node:url";import{createRequire as fe}from"node:module";import co from"node:path";import{exec as he}from"node:child_process";import ue from"node:http";var kt=class o{server=null;pages=new Map;port=0;idleTimer=null;static IDLE_TIMEOUT_MS=1e4;async start(){return this.server?this.port:new Promise((t,e)=>{this.server=ue.createServer((r,n)=>this.handleRequest(r,n)),this.server.listen(0,"127.0.0.1",()=>{let r=this.server.address();typeof r=="object"&&r?(this.port=r.port,t(this.port)):e(new Error("Failed to get server address"))}),this.server.on("error",e)})}registerPage(t,e,r,n){let s=this.pages.get(t);if(s){s.qrBuffer=r,s.status="waiting",s.config=n;let i=`data: ${JSON.stringify({status:"waiting"})}
3
+ var zo=Object.defineProperty;var A=(e,t)=>()=>(e&&(t=e(e=0)),t);var at=(e,t)=>{for(var o in t)zo(e,o,{get:t[o],enumerable:!0})};function z(e){return e instanceof q?e.errorType:e instanceof DOMException&&e.name==="AbortError"?"timeout":e instanceof TypeError?"network":"unknown"}var q,b,G,C,j,D=A(()=>{"use strict";q=class e extends Error{constructor(o,r,n,i="unknown"){super(o);this.code=r;this.details=n;this.errorType=i;this.name="R2Error",Error.captureStackTrace&&Error.captureStackTrace(this,e)}code;details;errorType},b=class extends q{constructor(o,r,n,i){super(o,"API_ERROR",n,i??(r===401?"auth_expired":"business"));this.status=r;this.response=n;this.name="ApiError"}status;response},G=class extends q{constructor(o,r,n){super(o,"STORAGE_ERROR",{path:r,code:n},"storage");this.path=r;this.code=n;this.name="StorageError"}path;code},C=class extends q{constructor(t){super(t,"AUTH_ERROR",void 0,"auth_expired"),this.name="AuthError"}},j=class extends q{constructor(o,r,n){super(o,"POLLING_ERROR",{attempts:r,timeout:n},"polling");this.attempts=r;this.timeout=n;this.name="PollingError"}attempts;timeout}});function E(e){let t=new URLSearchParams;for(let[o,r]of Object.entries(e))r!=null&&r!==""&&t.append(o,String(r));return t}function H(e,t){let o=null;return()=>(o||(o=e(),t?.(o)),o)}var _=A(()=>{"use strict"});import{promises as V}from"node:fs";import Mt from"node:path";import ar from"node:os";var cr,ct,It,Qt=A(()=>{"use strict";D();_();cr=".r2-cli",ct=class{configPath;config;configLoaded=!1;dirEnsured=!1;constructor(){let t=ar.homedir(),o=Mt.join(t,cr);this.configPath=Mt.join(o,"config.json"),this.config={credentials:null}}getConfigPath(){return this.configPath}async loadConfig(){if(this.configLoaded)return this.config;try{let t=await V.readFile(this.configPath,"utf-8");return this.config=JSON.parse(t),this.configLoaded=!0,this.config}catch{return this.config={credentials:null},this.configLoaded=!0,this.config}}async ensureDir(){if(this.dirEnsured)return;let t=Mt.dirname(this.configPath);try{await V.stat(t)}catch(o){if(o.code==="ENOENT")await V.mkdir(t,{recursive:!0});else throw new G("Failed to create directory",t,o.code)}this.dirEnsured=!0}async saveConfig(t){this.config=t,await this.ensureDir();let o=JSON.stringify(t,null,2),r=this.configPath+".tmp";try{await V.writeFile(r,o,"utf-8"),await V.rename(r,this.configPath),this.configLoaded=!0}catch(n){throw await V.unlink(r).catch(i=>{typeof process.env.DEBUG<"u"&&console.error("[config] cleanup tmp failed:",i)}),new G("Failed to save config",this.configPath,n.code)}}},It=H(()=>new ct)});var Ft,lt,Y,zt=A(()=>{"use strict";Qt();_();Ft=300*1e3,lt=class{store=It();isTokenExpired(t){return t.expire?Date.now()>=t.expire-Ft:!1}async saveCredentials(t,o){let r=Date.now(),n=o.expire?Number.parseInt(o.expire,10):0,i={token:t,userInfo:o,timestamp:r,...n>0&&{expire:r+n}},s=await this.store.loadConfig();s.credentials=i,await this.store.saveConfig(s)}async getCredentials(){let t=await this.store.loadConfig();return!t.credentials||this.isTokenExpired(t.credentials)?null:t.credentials}async clearCredentials(){let t=await this.store.loadConfig();t.credentials=null,await this.store.saveConfig(t)}async getToken(){return(await this.getCredentials())?.token??null}async getUserInfo(){return(await this.getCredentials())?.userInfo??null}async isLoggedIn(){return await this.getCredentials()!==null}},Y=H(()=>new lt)});var Wt={};at(Wt,{AuthStorage:()=>lt,ConfigStore:()=>ct,getAuthStorage:()=>Y,getConfigStore:()=>It});var dt=A(()=>{"use strict";Qt();zt()});var ze={};at(ze,{UserInfoCard:()=>mr});import{Box as K,Text as J}from"ink";import{jsx as M,jsxs as Z}from"react/jsx-runtime";function mr({userInfo:e,lastLogin:t,daysSinceLogin:o}){let r=e.mobile?e.mobile.replace(/(\d{3})\d{4}(\d{4})/,"$1****$2"):"-";return Z(K,{flexDirection:"column",marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,alignSelf:"flex-start",children:[M(J,{bold:!0,color:"cyan",children:"\u7528\u6237\u4FE1\u606F"}),Z(K,{flexDirection:"row",marginTop:1,children:[M(K,{width:10,children:M(J,{color:"gray",children:"\u6635\u79F0"})}),M(J,{color:"yellow",children:e.nickname})]}),Z(K,{flexDirection:"row",children:[M(K,{width:10,children:M(J,{color:"gray",children:"\u624B\u673A\u53F7"})}),M(J,{color:"yellow",children:r})]}),t&&Z(K,{flexDirection:"column",marginTop:1,children:[Z(J,{color:"gray",children:["\u6700\u540E\u767B\u5F55: ",t.toLocaleString()]}),o!==void 0&&Z(J,{color:"gray",children:[" \u8DDD\u4ECA: ",o," \u5929"]})]})]})}var We=A(()=>{"use strict"});var St={};at(St,{renderComponent:()=>Vt,renderOnce:()=>He});import ur from"react";import Ht from"chalk";import{render as pr}from"ink";import{Writable as gr}from"node:stream";function He(e){let t=Ht.level;process.env.NO_COLOR||(Ht.level=3);try{let o=[],r=new gr({write(d,w,P){o.push(Buffer.from(d)),P()}});r.isTTY=!0,r.columns=process.stdout.columns||80,r.rows=process.stdout.rows||24,pr(e,{stdout:r,patchConsole:!1}).unmount();let i=Buffer.concat(o).toString("utf8"),a=(i.split(/\x1B\[2J\x1B\[3J\x1B\[H/).at(-1)||i).replace(/\x1B\[\?[\d;]+[hl]/g,"").trimEnd()+`
4
+ `;process.stdout.write(a)}finally{Ht.level=t}}function Vt(e,t){He(ur.createElement(e,t))}var ut=A(()=>{"use strict"});import{Box as we,Text as xe}from"ink";import{jsx as po,jsxs as Ot}from"react/jsx-runtime";function tt(e,t){return e.length>t?e.slice(0,t-1)+"\u2026":e}function et(e){let t=process.stdout.columns||80,r=Math.max(t-4-e,20),n=e+r;return{fillWidth:r,totalWidth:n}}function ot({title:e,count:t,countLabel:o="\u6761",fillWidth:r,totalWidth:n,header:i,children:s}){return Ot(we,{flexDirection:"column",marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,children:[Ot(we,{flexDirection:"row",children:[po(xe,{bold:!0,color:"cyan",children:e}),Ot(xe,{color:"gray",children:[" \xB7 ",t," ",o]})]}),Ot(we,{flexDirection:"column",marginTop:1,children:[i,po(xe,{color:"gray",children:"\u2500".repeat(n)}),s]})]})}var Ut=A(()=>{"use strict"});var fo={};at(fo,{ShopsTable:()=>Xr});import{Box as N,Text as B}from"ink";import{jsx as f,jsxs as ho}from"react/jsx-runtime";function qr(e){return e.map(t=>"shopName"in t?{id:t.shopId,name:t.shopName,platform:t.platform,expiresIn:t.expiresIn}:{id:t.id,name:t.name,platform:t.thirdUserId,expiresIn:t.expiresIn})}function Gr({hasPlatform:e,fillWidth:t}){return ho(N,{flexDirection:"row",paddingBottom:0,children:[e&&f(N,{width:Ie,children:f(B,{bold:!0,color:"white",children:"\u5E73\u53F0"})}),f(N,{width:t,children:f(B,{bold:!0,color:"white",children:"\u5E97\u94FA\u540D"})}),f(N,{width:Se,children:f(B,{bold:!0,color:"white",children:"ID"})}),f(N,{width:Ce,children:f(B,{bold:!0,color:"white",children:"\u72B6\u6001"})})]})}function _r({shop:e,hasPlatform:t,fillWidth:o}){let r=go[e.platform]??e.platform;return ho(N,{flexDirection:"row",children:[t&&f(N,{width:Ie,children:f(B,{color:"cyan",children:r})}),f(N,{width:o,children:f(B,{bold:!0,children:e.name})}),f(N,{width:Se,children:f(B,{color:"gray",children:e.id})}),f(N,{width:Ce,children:f(B,{color:"green",children:"\u25CF \u6388\u6743\u4E2D"})})]})}function Xr({shops:e,platform:t}){let o=qr(e),r=t==="all",n=t==="all"?"\u6240\u6709\u6388\u6743\u5E97\u94FA":`${go[t]??t}\u6388\u6743\u5E97\u94FA`,i=Se+Ce+(r?Ie:0),{fillWidth:s,totalWidth:a}=et(i);return f(ot,{title:n,count:o.length,countLabel:"\u5BB6",fillWidth:s,totalWidth:a,header:f(Gr,{hasPlatform:r,fillWidth:s}),children:o.map(d=>f(_r,{shop:d,hasPlatform:r,fillWidth:s},d.id))})}var go,Ie,Se,Ce,yo=A(()=>{"use strict";Ut();go={xianyu:"\u95F2\u9C7C",douyin:"\u6296\u97F3"},Ie=8,Se=16,Ce=10});var Io={};at(Io,{StocksTable:()=>Fr});import{Box as T,Text as O}from"ink";import{jsx as u,jsxs as So}from"react/jsx-runtime";function Mr({fillWidth:e}){return So(T,{flexDirection:"row",paddingBottom:0,children:[u(T,{width:Te,children:u(O,{bold:!0,color:"white",children:"ID"})}),u(T,{width:be,children:u(O,{bold:!0,color:"white",children:"\u7528\u6237ID"})}),u(T,{width:Pe,children:u(O,{bold:!0,color:"white",children:"\u4ED3\u5E93ID"})}),u(T,{width:e,children:u(O,{bold:!0,color:"white",children:"\u4ED3\u5E93\u540D\u79F0"})}),u(T,{width:Ae,children:u(O,{bold:!0,color:"white",children:"\u521B\u5EFA\u65F6\u95F4"})})]})}function Qr({stock:e,fillWidth:t}){let o=new Date(e.gmtCreate).toLocaleString("zh-CN");return So(T,{flexDirection:"row",children:[u(T,{width:Te,children:u(O,{color:"gray",children:e.id})}),u(T,{width:be,children:u(O,{color:"gray",children:e.userId})}),u(T,{width:Pe,children:u(O,{color:"gray",children:e.stockId})}),u(T,{width:t,children:u(O,{bold:!0,children:e.stockName})}),u(T,{width:Ae,children:u(O,{color:"gray",children:o})})]})}function Fr({stocks:e}){let t=Te+be+Pe+Ae,{fillWidth:o,totalWidth:r}=et(t);return u(ot,{title:"\u4ED3\u5E93\u5217\u8868",count:e.length,countLabel:"\u4E2A",fillWidth:o,totalWidth:r,header:u(Mr,{fillWidth:o}),children:e.map(n=>u(Qr,{stock:n,fillWidth:o},n.id))})}var Te,be,Pe,Ae,Co=A(()=>{"use strict";Ut();Te=6,be=10,Pe=10,Ae=22});import{Command as On}from"commander";import it from"chalk";import"commander";import{Command as io}from"commander";import I from"chalk";D();async function Wo(e,t,o){let r=new AbortController,n=()=>r.abort();o?.addEventListener("abort",n,{once:!0});let i=setTimeout(()=>r.abort(),t);try{return await e()}catch(s){throw r.signal.aborted&&!o?.aborted?new j("\u5355\u6B21\u8F6E\u8BE2\u8BF7\u6C42\u8D85\u65F6"):s}finally{clearTimeout(i),o?.removeEventListener("abort",n)}}async function W(e,t,o){let{interval:r,timeout:n,condition:i}=t,s=Date.now(),a=0;for(;Date.now()-s<n;){if(o?.aborted)throw new j("\u8F6E\u8BE2\u88AB\u4E2D\u6B62");a++;let d=n-(Date.now()-s),w=await Wo(e,d,o);if(i(w,a))return w;await Ho(r,o)}throw new j(`\u8F6E\u8BE2\u8D85\u65F6 (\u5DF2\u7B49\u5F85 ${Date.now()-s}ms, \u5171 ${a} \u6B21)`)}function Ho(e,t){return new Promise((o,r)=>{if(t?.aborted){r(new j("\u8F6E\u8BE2\u88AB\u4E2D\u6B62"));return}let n=()=>{clearTimeout(i),r(new j("\u8F6E\u8BE2\u88AB\u4E2D\u6B62"))},i=setTimeout(()=>{t?.removeEventListener("abort",n),o()},e);t?.addEventListener("abort",n,{once:!0})})}import Ko from"node:fs";import{fileURLToPath as Zo}from"node:url";import{createRequire as tr}from"node:module";import Xe from"node:path";import{exec as er}from"node:child_process";_();import Vo from"node:http";var Gt=class e{server=null;pages=new Map;port=0;idleTimer=null;static IDLE_TIMEOUT_MS=1e4;async start(){return this.server?this.port:new Promise((t,o)=>{this.server=Vo.createServer((r,n)=>this.handleRequest(r,n)),this.server.listen(0,"127.0.0.1",()=>{let r=this.server.address();typeof r=="object"&&r?(this.port=r.port,t(this.port)):o(new Error("Failed to get server address"))}),this.server.on("error",o)})}registerPage(t,o,r,n){let i=this.pages.get(t);if(i){i.qrBuffer=r,i.status="waiting",i.config=n;let s=`data: ${JSON.stringify({status:"waiting"})}
5
5
 
6
- `;for(let a of s.sseClients)a.write(i)}else this.pages.set(t,{html:e,qrBuffer:r,status:"waiting",sseClients:[],config:n});this.resetIdleTimer()}unregisterPage(t){let e=this.pages.get(t);if(e){for(let r of e.sseClients)r.end();e.sseClients.length=0,this.pages.delete(t),this.pages.size===0&&this.close()}}setStatus(t,e){let r=this.pages.get(t);if(!r)return;r.status=e;let n=`data: ${JSON.stringify({status:e})}
6
+ `;for(let a of i.sseClients)a.write(s)}else this.pages.set(t,{html:o,qrBuffer:r,status:"waiting",sseClients:[],config:n});this.resetIdleTimer()}unregisterPage(t){let o=this.pages.get(t);if(o){for(let r of o.sseClients)r.end();o.sseClients.length=0,this.pages.delete(t),this.pages.size===0&&this.close()}}setStatus(t,o){let r=this.pages.get(t);if(!r)return;r.status=o;let n=`data: ${JSON.stringify({status:o})}
7
7
 
8
- `;for(let s of r.sseClients)s.write(n)}close(){if(this.server){this.idleTimer&&(clearTimeout(this.idleTimer),this.idleTimer=null);for(let t of this.pages.values()){for(let e of t.sseClients)e.end();t.sseClients.length=0}this.pages.clear(),this.server.close(),this.server=null,this.port=0,z=null}}resetIdleTimer(){this.idleTimer&&clearTimeout(this.idleTimer),this.idleTimer=setTimeout(()=>{[...this.pages.values()].some(e=>e.sseClients.length>0)||this.close()},o.IDLE_TIMEOUT_MS)}handleRequest(t,e){let r=t.url??"/";for(let[n,s]of this.pages){if(r===n){e.writeHead(302,{Location:n+"/"}),e.end();return}if(r===n+"/"){e.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),e.end(s.html);return}if(r===n+"/qr.png"){e.writeHead(200,{"Content-Type":"image/png","Content-Length":s.qrBuffer.length}),e.end(s.qrBuffer);return}if(r===n+"/events"){e.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),e.write(`data: ${JSON.stringify({status:s.status})}
8
+ `;for(let i of r.sseClients)i.write(n)}close(){if(this.server){this.idleTimer&&(clearTimeout(this.idleTimer),this.idleTimer=null);for(let t of this.pages.values()){for(let o of t.sseClients)o.end();t.sseClients.length=0}this.pages.clear(),this.server.close(),this.server=null,this.port=0}}resetIdleTimer(){this.idleTimer&&clearTimeout(this.idleTimer),this.idleTimer=setTimeout(()=>{[...this.pages.values()].some(o=>o.sseClients.length>0)||this.close()},e.IDLE_TIMEOUT_MS)}handleRequest(t,o){let r=t.url??"/";for(let[n,i]of this.pages){if(r===n){o.writeHead(302,{Location:n+"/"}),o.end();return}if(r===n+"/"){o.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),o.end(i.html);return}if(r===n+"/qr.png"){o.writeHead(200,{"Content-Type":"image/png","Content-Length":i.qrBuffer.length}),o.end(i.qrBuffer);return}if(r===n+"/events"){o.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),o.write(`data: ${JSON.stringify({status:i.status})}
9
9
 
10
- `),s.sseClients.push(e),t.on("close",()=>{let i=s.sseClients.indexOf(e);i>=0&&s.sseClients.splice(i,1)});return}if(r===n+"/config"){e.writeHead(200,{"Content-Type":"application/json"}),e.end(JSON.stringify(s.config??{}));return}}e.writeHead(404,{"Content-Type":"text/plain"}),e.end("Not Found")}},z=null,io=!1;function ct(){z&&z.close()}function me(){io||(io=!0,process.on("exit",ct),process.on("SIGINT",ct),process.on("SIGTERM",ct),setInterval(()=>{process.stdin?.destroyed&&ct()},3e3).unref())}function ao(){return z||(z=new kt,me()),z}var ye=co.dirname(pe(import.meta.url)),we="/login",xe="/login-xianyu",vt=null;async function Ie(o){return ge.promises.readFile(co.join(ye,"pages",o),"utf-8")}async function Se(o){return vt||(vt=fe(import.meta.url)),vt("qrcode").toBuffer(o,{width:300,margin:2})}function B(o){let t=process.platform==="win32"?`start "" "${o}"`:process.platform==="darwin"?`open "${o}"`:`xdg-open "${o}"`;he(t)}async function lo(o,t,e,r){let[n,s]=await Promise.all([Ie(t),Se(e)]),i=ao(),a=await i.start();i.registerPage(o,n,s,r);let l=`http://127.0.0.1:${a}${o}/`;return{url:e,qrUrl:l,setStatus:y=>i.setStatus(o,y),closeServer:()=>i.unregisterPage(o)}}function Nt(o){return lo(we,"login.html",o)}function Rt(o,t){return lo(xe,"xianyu-auth.html",o,{authUrl:t})}import{promises as W}from"node:fs";import Lt from"node:path";import Ce from"node:os";var Te=".r2-cli",lt=class{configPath;config;configLoaded=!1;dirEnsured=!1;constructor(){let t=Ce.homedir(),e=Lt.join(t,Te);this.configPath=Lt.join(e,"config.json"),this.config={credentials:null}}getConfigPath(){return this.configPath}async loadConfig(){if(this.configLoaded)return this.config;try{let t=await W.readFile(this.configPath,"utf-8");return this.config=JSON.parse(t),this.configLoaded=!0,this.config}catch{return this.config={credentials:null},this.configLoaded=!0,this.config}}async ensureDir(){if(this.dirEnsured)return;let t=Lt.dirname(this.configPath);try{await W.stat(t)}catch(e){if(e.code==="ENOENT")await W.mkdir(t,{recursive:!0});else throw new $("Failed to create directory",t,e.code)}this.dirEnsured=!0}async saveConfig(t){this.config=t,await this.ensureDir();let e=JSON.stringify(t,null,2),r=this.configPath+".tmp";try{await W.writeFile(r,e,"utf-8"),await W.rename(r,this.configPath),this.configLoaded=!0}catch(n){throw await W.unlink(r).catch(s=>{typeof process.env.DEBUG<"u"&&console.error("[config] cleanup tmp failed:",s)}),new $("Failed to save config",this.configPath,n.code)}}},Ot=null;function Dt(){return Ot||(Ot=new lt),Ot}var Et=300*1e3,dt=class{store=Dt();isTokenExpired(t){return t.expire?Date.now()>=t.expire-Et:!1}async saveCredentials(t,e){let r=Date.now(),n=e.expire?Number.parseInt(e.expire,10):0,s={token:t,userInfo:e,timestamp:r,...n>0&&{expire:r+n}},i=await this.store.loadConfig();i.credentials=s,await this.store.saveConfig(i)}async getCredentials(){let t=await this.store.loadConfig();return!t.credentials||this.isTokenExpired(t.credentials)?null:t.credentials}async clearCredentials(){let t=await this.store.loadConfig();t.credentials=null,await this.store.saveConfig(t)}async getToken(){return(await this.getCredentials())?.token??null}async getUserInfo(){return(await this.getCredentials())?.userInfo??null}async isLoggedIn(){return await this.getCredentials()!==null}},Ut=null;function ot(){return Ut||(Ut=new dt),Ut}var be="https://api.puresnake.com",ut=class{config;authStorage=null;cachedToken=null;tokenExpiry=0;constructor(t={}){this.config={baseUrl:t.baseUrl??be,version:t.version??"v3",debug:t.debug??!1},this.authStorage=t.auth===!1?null:ot()}buildUrl(t){let e=t.startsWith("/")?t.slice(1):t;return`${this.config.baseUrl}/${this.config.version}/${e}`}async getAuthToken(){if(!this.authStorage)return;if(this.cachedToken&&Date.now()<this.tokenExpiry)return this.cachedToken;let t=await this.authStorage.getCredentials();if(!t)throw new I("\u8BF7\u5148\u8FD0\u884C r2-cli auth login \u767B\u5F55");return this.cachedToken=t.token,this.tokenExpiry=t.expire?t.expire-Et:Date.now()+1800*1e3,t.token}async requestFull(t,e){let r=this.buildUrl(t),{method:n,headers:s,body:i,timeout:a=3e4}=e,l=await this.getAuthToken(),y={...s,...l?{token:l}:{}},m=new AbortController,b=setTimeout(()=>m.abort(),a),_={method:n,headers:{"Content-Type":"application/json",...y},signal:m.signal};i!==void 0&&(_.body=JSON.stringify(i)),this.config.debug&&console.error(`[API ${n}]`,r,i);try{let d=await fetch(r,_);if(!d.ok){if(d.status===401)throw this.authStorage&&(this.cachedToken=null,await this.authStorage.clearCredentials().catch(Q=>{console.error("[API] \u6E05\u9664\u51ED\u8BC1\u5931\u8D25:",Q instanceof Error?Q.message:String(Q))})),new I("\u767B\u5F55\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u8FD0\u884C r2-cli auth login \u91CD\u65B0\u767B\u5F55");let Pt=await d.text();throw new P(Pt||`${d.status} ${d.statusText}`,d.status)}let k=await d.json();if(this.config.debug&&console.error("[API Response]",k),!k.success||k.status!==0)throw new P(k.msg||"\u672A\u77E5\u9519\u8BEF",k.status,k);return k}catch(d){throw d instanceof DOMException&&d.name==="AbortError"?new P(`\u8BF7\u6C42\u8D85\u65F6 (${a}ms)`,408):d}finally{clearTimeout(b)}}async request(t,e){return(await this.requestFull(t,e)).data}async get(t,e,r){let n=e&&e.size>0?`${t}?${e.toString()}`:t;return this.request(n,{method:"GET",headers:r})}async post(t,e,r){return this.request(t,{method:"POST",body:e,headers:r})}async put(t,e,r){return this.request(t,{method:"PUT",body:e,headers:r})}async delete(t,e){return this.request(t,{method:"DELETE",headers:e})}async upload(t,e,r){let n=this.buildUrl(t),s=await this.getAuthToken(),i={...r,...s?{token:s}:{}},a=new AbortController,l=setTimeout(()=>a.abort(),6e4),y={method:"POST",headers:i,body:e,signal:a.signal};this.config.debug&&console.error("[API UPLOAD]",n);try{let m=await fetch(n,y);if(!m.ok){if(m.status===401)throw this.authStorage&&(this.cachedToken=null,await this.authStorage.clearCredentials().catch(()=>{})),new I("\u767B\u5F55\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u8FD0\u884C r2-cli auth login \u91CD\u65B0\u767B\u5F55");let _=await m.text();throw new P(_||`${m.status} ${m.statusText}`,m.status)}let b=await m.json();if(this.config.debug&&console.error("[API Response]",b),!b.success||b.status!==0)throw new P(b.msg||"\u672A\u77E5\u9519\u8BEF",b.status,b);return b.data}catch(m){throw m instanceof DOMException&&m.name==="AbortError"?new P("\u4E0A\u4F20\u8D85\u65F6 (60000ms)",408):m}finally{clearTimeout(l)}}},mt=new ut,uo=new ut({auth:!1});var mo=uo;async function go(){return mo.post("app/qrcode/generate")}async function po(o){let t=new URLSearchParams;t.append("qrToken",o);let e=`app/qrcode/status?${t.toString()}`,r=await mo.requestFull(e,{method:"GET"});return r.token&&typeof r.data=="object"&&r.data!==null&&(r.data.token=r.token),r.data}async function wo(o,t,e){let{UserInfoCard:r}=await Promise.resolve().then(()=>(ho(),fo)),{renderComponent:n}=await Promise.resolve().then(()=>(et(),gt)),s=t!=null?{userInfo:o,lastLogin:t,daysSinceLogin:e??0}:{userInfo:o};n(r,s)}var pt=class{storage;constructor(t){this.storage=t??ot()}async generateQR(){let t=await go(),e=`https://m.puresnake.com/r2/auth/login?qrToken=${t.qrContent}&from=wechat`,r=await Nt(e);return{qrData:t,...r}}async waitForLogin(t,e,r,n,s,i){let a=await F(()=>po(t),{interval:r,timeout:e,condition:l=>{switch(l.status){case"scanned":return i||(console.log(w.cyan(`
11
- \u{1F50D} \u5DF2\u626B\u7801: ${l.userInfo?.nickname||"\u672A\u77E5\u7528\u6237"}`)),console.log(w.yellow("\u8BF7\u5728 APP \u4E0A\u786E\u8BA4\u767B\u5F55"))),s?.("scanning"),!1;case"confirmed":return i||console.log(w.green(`
12
- \u2705 \u7528\u6237\u5DF2\u786E\u8BA4\u767B\u5F55`)),s?.("success"),!0;case"expired":return i||console.log(w.red(`
13
- \u23F0 \u4E8C\u7EF4\u7801\u5DF2\u8FC7\u671F`)),s?.("expired"),!0;case"canceled":return i||console.log(w.red(`
14
- \u{1F6AB} \u7528\u6237\u5DF2\u53D6\u6D88\u767B\u5F55`)),s?.("expired"),!0;default:return!1}}},n??void 0);if(a.status==="confirmed"&&a.token&&a.userInfo)return await this.storage.saveCredentials(a.token,a.userInfo),{userInfo:a.userInfo,token:a.token};throw a.status==="expired"?new I("\u4E8C\u7EF4\u7801\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55"):a.status==="canceled"?new I("\u7528\u6237\u5DF2\u53D6\u6D88\u767B\u5F55"):new I("\u767B\u5F55\u5931\u8D25: \u672A\u83B7\u53D6\u5230\u51ED\u8BC1")}async login(t){console.log(w.cyan(`
15
- \u{1F510} \u6B63\u5728\u542F\u52A8\u626B\u7801\u767B\u5F55...`));let{qrData:e,qrUrl:r,setStatus:n,closeServer:s}=await this.generateQR();console.log(w.green(`\u2705 \u4E8C\u7EF4\u7801\u5DF2\u751F\u6210
16
- `)),console.log(w.cyan(` \u94FE\u63A5: ${r}
17
- `)),B(r),console.log(w.yellow(`\u23F3 \u7B49\u5F85\u626B\u7801...
18
- `));let i=Number.parseInt(e.expireTime,10),a=Number.parseInt(e.pollInterval,10);try{let l=await this.waitForLogin(e.qrToken,i,a,t,n);return console.log(w.green(`
10
+ `),i.sseClients.push(o),t.on("close",()=>{let s=i.sseClients.indexOf(o);s>=0&&i.sseClients.splice(s,1)});return}if(r===n+"/config"){o.writeHead(200,{"Content-Type":"application/json"}),o.end(JSON.stringify(i.config??{}));return}}o.writeHead(404,{"Content-Type":"text/plain"}),o.end("Not Found")}},Ge=!1;function xt(e){e.close()}function Yo(e){Ge||(Ge=!0,process.on("exit",()=>xt(e)),process.on("SIGINT",()=>xt(e)),process.on("SIGTERM",()=>xt(e)),setInterval(()=>{process.stdin?.destroyed&&xt(e)},3e3).unref())}var _e=H(()=>new Gt,Yo);var or=Xe.dirname(Zo(import.meta.url)),rr="/login",nr="/login-xianyu",_t=null;async function ir(e){return Ko.promises.readFile(Xe.join(or,"pages",e),"utf-8")}async function sr(e){return _t||(_t=tr(import.meta.url)),_t("qrcode").toBuffer(e,{width:300,margin:2})}function X(e){let t=process.platform==="win32"?`start "" "${e}"`:process.platform==="darwin"?`open "${e}"`:`xdg-open "${e}"`;er(t)}async function Je(e,t,o,r){let[n,i]=await Promise.all([ir(t),sr(o)]),s=_e(),a=await s.start();s.registerPage(e,n,i,r);let d=`http://127.0.0.1:${a}${e}/`;return{url:o,qrUrl:d,setStatus:w=>s.setStatus(e,w),closeServer:()=>s.unregisterPage(e)}}function Xt(e){return Je(rr,"login.html",e)}function Jt(e,t){return Je(nr,"xianyu-auth.html",e,{authUrl:t})}dt();zt();D();var lr="https://api.puresnake.com",mt=class e{config;authStorage=null;cachedToken=null;tokenExpiry=0;constructor(t={}){this.config={baseUrl:t.baseUrl??lr,version:t.version??"v3",debug:t.debug??!1},this.authStorage=Y()}static createNoAuth(){let t=new e;return t.authStorage=null,t}buildUrl(t){let o=t.startsWith("/")?t.slice(1):t;return`${this.config.baseUrl}/${this.config.version}/${o}`}async getAuthToken(){if(!this.authStorage)return;if(this.cachedToken&&Date.now()<this.tokenExpiry)return this.cachedToken;let t=await this.authStorage.getCredentials();if(!t)throw new C("\u8BF7\u5148\u8FD0\u884C r2-cli auth login \u767B\u5F55");return this.cachedToken=t.token,this.tokenExpiry=t.expire?t.expire-Ft:Date.now()+1800*1e3,t.token}async requestRaw(t,o,r={}){let n=this.buildUrl(t),i=r.timeout??3e4,s=await this.getAuthToken(),a={...o.headers,...s?{token:s}:{}},d=new AbortController,w=setTimeout(()=>d.abort(),i),P={...o,headers:a,signal:d.signal};this.config.debug&&console.error(`[API ${o.method??"GET"}]`,n,o.body);try{let c=await fetch(n,P);if(!c.ok){if(c.status===401)throw this.authStorage&&(this.cachedToken=null,await this.authStorage.clearCredentials().catch(()=>{})),new C("\u767B\u5F55\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u8FD0\u884C r2-cli auth login \u91CD\u65B0\u767B\u5F55");if(c.status===413)throw new b("\u56FE\u7247\u592A\u5927\uFF0C\u4E0A\u4F20\u5931\u8D25\uFF08\u670D\u52A1\u7AEF\u9650\u5236\u7EA6 2MB\uFF09",413);let wt=await c.text();throw new b(wt||`${c.status} ${c.statusText}`,c.status)}let x=await c.json();if(this.config.debug&&console.error("[API Response]",x),!x.success||x.status!==0)throw new b(x.msg||"\u672A\u77E5\u9519\u8BEF",x.status,x);return x}catch(c){throw c instanceof DOMException&&c.name==="AbortError"?new b(`\u8BF7\u6C42\u8D85\u65F6 (${i}ms)`,408,void 0,"timeout"):c instanceof TypeError?new b(`\u7F51\u7EDC\u9519\u8BEF: ${c.message}`,0,void 0,"network"):c}finally{clearTimeout(w)}}async requestFull(t,o){let{method:r,headers:n,body:i,timeout:s=3e4}=o,a={method:r,headers:{"Content-Type":"application/json",...n},...i!==void 0&&{body:JSON.stringify(i)}};return this.requestRaw(t,a,{timeout:s})}async request(t,o){return(await this.requestFull(t,o)).data}async get(t,o,r){let n=o&&o.size>0?`${t}?${o.toString()}`:t;return this.request(n,{method:"GET",headers:r})}async post(t,o,r){return this.request(t,{method:"POST",body:o,headers:r})}async put(t,o,r){return this.request(t,{method:"PUT",body:o,headers:r})}async delete(t,o){return this.request(t,{method:"DELETE",headers:o})}async upload(t,o,r){let n={method:"POST",body:o,headers:r};return(await this.requestRaw(t,n,{timeout:6e4})).data}},v=new mt;var Me=mt.createNoAuth();async function Qe(){return Me.post("app/qrcode/generate")}async function Fe(e){let t=new URLSearchParams;t.append("qrToken",e);let o=`app/qrcode/status?${t.toString()}`,r=await Me.requestFull(o,{method:"GET"});return r.token&&typeof r.data=="object"&&r.data!==null&&(r.data.token=r.token),r.data}dt();D();async function Ve(e,t,o){let{UserInfoCard:r}=await Promise.resolve().then(()=>(We(),ze)),{renderComponent:n}=await Promise.resolve().then(()=>(ut(),St)),i=t!=null?{userInfo:e,lastLogin:t,daysSinceLogin:o??0}:{userInfo:e};n(r,i)}var Ct=class{storage;constructor(t){this.storage=t??Y()}async generateQR(){let t=await Qe(),o=`https://m.puresnake.com/r2/auth/login?qrToken=${t.qrContent}&from=wechat`,r=await Xt(o);return{qrData:t,...r}}async waitForLogin(t,o,r,n,i,s){let a=await W(()=>Fe(t),{interval:r,timeout:o,condition:d=>{switch(d.status){case"scanned":return s||(console.log(I.cyan(`
11
+ \u{1F50D} \u5DF2\u626B\u7801: ${d.userInfo?.nickname||"\u672A\u77E5\u7528\u6237"}`)),console.log(I.yellow("\u8BF7\u5728 APP \u4E0A\u786E\u8BA4\u767B\u5F55"))),i?.("scanning"),!1;case"confirmed":return s||console.log(I.green(`
12
+ \u2705 \u7528\u6237\u5DF2\u786E\u8BA4\u767B\u5F55`)),i?.("success"),!0;case"expired":return s||console.log(I.red(`
13
+ \u23F0 \u4E8C\u7EF4\u7801\u5DF2\u8FC7\u671F`)),i?.("expired"),!0;case"canceled":return s||console.log(I.red(`
14
+ \u{1F6AB} \u7528\u6237\u5DF2\u53D6\u6D88\u767B\u5F55`)),i?.("expired"),!0;default:return!1}}},n??void 0);if(a.status==="confirmed"&&a.token&&a.userInfo)return await this.storage.saveCredentials(a.token,a.userInfo),{userInfo:a.userInfo,token:a.token};throw a.status==="expired"?new C("\u4E8C\u7EF4\u7801\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55"):a.status==="canceled"?new C("\u7528\u6237\u5DF2\u53D6\u6D88\u767B\u5F55"):new C("\u767B\u5F55\u5931\u8D25: \u672A\u83B7\u53D6\u5230\u51ED\u8BC1")}async login(t){console.log(I.cyan(`
15
+ \u{1F510} \u6B63\u5728\u542F\u52A8\u626B\u7801\u767B\u5F55...`));let{qrData:o,qrUrl:r,setStatus:n,closeServer:i}=await this.generateQR();console.log(I.green(`\u2705 \u4E8C\u7EF4\u7801\u5DF2\u751F\u6210
16
+ `)),console.log(I.cyan(` \u94FE\u63A5: ${r}
17
+ `)),X(r),console.log(I.yellow(`\u23F3 \u7B49\u5F85\u626B\u7801...
18
+ `));let s=Number.parseInt(o.expireTime,10),a=Number.parseInt(o.pollInterval,10);try{let d=await this.waitForLogin(o.qrToken,s,a,t,n);return console.log(I.green(`
19
19
  \u2705 \u767B\u5F55\u6210\u529F\uFF01
20
- `)),wo(l.userInfo),l}catch(l){throw console.log(w.red(`
20
+ `)),Ve(d.userInfo),d}catch(d){throw console.log(I.red(`
21
21
  \u274C \u767B\u5F55\u5931\u8D25
22
- `)),l}finally{s()}}async logout(){console.log(w.cyan(`
23
- \u{1F6AA} \u6B63\u5728\u9000\u51FA\u767B\u5F55...`)),await this.storage.clearCredentials(),console.log(w.green(`\u2705 \u5DF2\u9000\u51FA\u767B\u5F55
24
- `))}async status(){if(!await this.storage.isLoggedIn()){console.log(w.yellow(`\u26A0\uFE0F \u5C1A\u672A\u767B\u5F55\u6216\u51ED\u8BC1\u5DF2\u8FC7\u671F
25
- `));return}let e=await this.storage.getCredentials(),r=e.userInfo,n=new Date(e.timestamp),s=Math.floor((Date.now()-e.timestamp)/(1e3*60*60*24));console.log(w.green(`\u2705 \u5DF2\u767B\u5F55
26
- `)),await wo(r,n,s)}},Bt=null;function R(){return Bt||(Bt=new pt),Bt}import J from"chalk";var xo=mt;async function Io(){return xo.get("mms/xianyu/auth/url")}async function So(o){let t=new URLSearchParams({state:o});return xo.get("mms/xianyu/auth/status",t)}async function ft(){let o=await Io(),t=await Rt(o.url,o.url);return{authData:o,...t}}async function rt(o,t,e,r,n){return F(()=>So(o),{interval:e,timeout:t,condition:s=>s.status==="success"?(console.log(J.green(`
27
- \u2705 \u6388\u6743\u6210\u529F\uFF01\u5E97\u94FA: ${s.shopName} (${s.shopId})`)),n?.("success"),!0):s.status==="expired"?(console.log(J.red(`
28
- \u23F0 \u6388\u6743\u94FE\u63A5\u5DF2\u8FC7\u671F`)),n?.("expired"),!0):!1},r)}async function Gt(o){console.log(J.cyan(`
29
- \u{1F517} \u6B63\u5728\u83B7\u53D6\u95F2\u9C7C\u6388\u6743\u5730\u5740...`));let{authData:t,qrUrl:e,setStatus:r,closeServer:n}=await ft();console.log(J.green(`\u2705 \u6388\u6743\u4E8C\u7EF4\u7801\u5DF2\u751F\u6210
30
- `)),console.log(J.cyan(` \u94FE\u63A5: ${e}`)),console.log(J.gray(` \u6216\u590D\u5236\u94FE\u63A5\u6253\u5F00: ${t.url}`)),B(e),console.log(J.yellow(`
22
+ `)),d}finally{i()}}async logout(){console.log(I.cyan(`
23
+ \u{1F6AA} \u6B63\u5728\u9000\u51FA\u767B\u5F55...`)),await this.storage.clearCredentials(),console.log(I.green(`\u2705 \u5DF2\u9000\u51FA\u767B\u5F55
24
+ `))}async status(){if(!await this.storage.isLoggedIn()){console.log(I.yellow(`\u26A0\uFE0F \u5C1A\u672A\u767B\u5F55\u6216\u51ED\u8BC1\u5DF2\u8FC7\u671F
25
+ `));return}let o=await this.storage.getCredentials(),r=o.userInfo,n=new Date(o.timestamp),i=Math.floor((Date.now()-o.timestamp)/(1e3*60*60*24));console.log(I.green(`\u2705 \u5DF2\u767B\u5F55
26
+ `)),await Ve(r,n,i)}},Yt=null;function k(){return Yt||(Yt=new Ct),Yt}import Q from"chalk";var Ye=v;async function Ke(){return Ye.get("mms/xianyu/auth/url")}async function Ze(e){let t=new URLSearchParams({state:e});return Ye.get("mms/xianyu/auth/status",t)}D();async function Tt(){let e=await Ke(),t=await Jt(e.url,e.url);return{authData:e,...t}}async function pt(e,t,o,r,n){return W(()=>Ze(e),{interval:o,timeout:t,condition:i=>i.status==="success"?(console.log(Q.green(`
27
+ \u2705 \u6388\u6743\u6210\u529F\uFF01\u5E97\u94FA: ${i.shopName} (${i.shopId})`)),n?.("success"),!0):i.status==="expired"?(console.log(Q.red(`
28
+ \u23F0 \u6388\u6743\u94FE\u63A5\u5DF2\u8FC7\u671F`)),n?.("expired"),!0):!1},r)}async function Kt(e){console.log(Q.cyan(`
29
+ \u{1F517} \u6B63\u5728\u83B7\u53D6\u95F2\u9C7C\u6388\u6743\u5730\u5740...`));let{authData:t,qrUrl:o,setStatus:r,closeServer:n}=await Tt();console.log(Q.green(`\u2705 \u6388\u6743\u4E8C\u7EF4\u7801\u5DF2\u751F\u6210
30
+ `)),console.log(Q.cyan(` \u94FE\u63A5: ${o}`)),console.log(Q.gray(` \u6216\u590D\u5236\u94FE\u63A5\u6253\u5F00: ${t.url}`)),X(o),console.log(Q.yellow(`
31
31
  \u23F3 \u7B49\u5F85\u6388\u6743...
32
- `));let s=t.expireTime?Number.parseInt(t.expireTime,10):3e5,i=t.pollInterval?Number.parseInt(t.pollInterval,10):1e3;try{let a=await rt(t.state,s,i,o,r);if(a.status==="success")return a;throw new I("\u95F2\u9C7C\u6388\u6743\u5931\u8D25: "+(a.status==="expired"?"\u94FE\u63A5\u5DF2\u8FC7\u671F":"\u672A\u77E5\u72B6\u6001"))}finally{n()}}import E from"chalk";function v(o){if(o instanceof I)console.error(E.red(`
33
- \u25B2 ${o.message}`)),console.error(E.gray(`\u2192 \u8BF7\u5148\u8FD0\u884C: r2-cli auth login
34
- `));else if(o instanceof P)console.error(E.red(`\u25B2 \u64CD\u4F5C\u5931\u8D25: ${o.message}`)),o.status&&console.error(E.gray(` \u72B6\u6001\u7801: ${o.status}`));else if(o instanceof $)console.error(E.red(`\u25B2 \u914D\u7F6E\u6587\u4EF6\u5F02\u5E38: ${o.message}`)),o.path&&console.error(E.gray(` \u8DEF\u5F84: ${o.path}`)),console.error(E.gray(`\u2192 \u8BF7\u5C1D\u8BD5\u91CD\u65B0\u767B\u5F55: r2-cli auth login
35
- `));else{let t=o instanceof Error?o.message:String(o);console.error(E.red(`\u25B2 ${t}`))}process.exit(1)}function qt(o){console.log(JSON.stringify({success:!1,error:o})),process.exit(1)}function p(o){return async t=>{try{await o(t)}catch(e){if(t.json){let r=e instanceof Error?e.message:String(e),n=e instanceof P?e.status:void 0;console.log(JSON.stringify({success:!1,error:r,...n!=null&&{status:n}})),process.exit(1)}v(e)}}}function ht(o){return async(...t)=>{try{await o(...t)}catch(e){let r=e instanceof Error?e.message:String(e);qt(r)}}}var Le=new Set(["accessToken","refreshExpireIn"]);function Co(o){return o.map(t=>{let e={};for(let[r,n]of Object.entries(t))Le.has(r)||(e[r]=n);return e})}async function yt(o){let{qrInfo:t,qrUrl:e,setStatus:r,closeServer:n,waitArgs:s}=await o.generate();console.log(JSON.stringify(t,null,2)),B(e);try{let i=await o.waitResult(s,r);console.log(JSON.stringify(o.formatSuccess(i)))}catch(i){let a=i instanceof Error?i.message:String(i);console.log(JSON.stringify({success:!1,error:a})),process.exit(1)}finally{setTimeout(n,1e3)}}function Jt(){let o=new To("login");o.description("\u626B\u7801\u767B\u5F55 Round2AI \u8D26\u6237").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09");let t=new To("poll").description("\u8F6E\u8BE2\u767B\u5F55\u72B6\u6001\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09").requiredOption("--token <qrToken>","\u4E8C\u7EF4\u7801 token").option("--expire <ms>","\u8FC7\u671F\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09","300000").option("--interval <ms>","\u8F6E\u8BE2\u95F4\u9694\uFF08\u6BEB\u79D2\uFF09","1000").action(ht(async e=>{let n=await R().waitForLogin(e.token,Number.parseInt(e.expire,10),Number.parseInt(e.interval,10));console.log(JSON.stringify({success:!0,...n}))}));return o.addCommand(t),o.action(async e=>{try{e.json?await yt({generate:async()=>{let r=R(),{qrData:n,qrUrl:s,setStatus:i,closeServer:a}=await r.generateQR(),l=Number.parseInt(n.expireTime,10),y=Number.parseInt(n.pollInterval,10);return{qrInfo:{qrToken:n.qrToken,expireTimeMs:l,pollIntervalMs:y,url:`https://m.puresnake.com/r2/auth/login?qrToken=${n.qrContent}&from=wechat`,qrUrl:s},qrUrl:s,setStatus:i,closeServer:a,waitArgs:{qrToken:n.qrToken,expireMs:l,intervalMs:y}}},waitResult:({qrToken:r,expireMs:n,intervalMs:s},i)=>R().waitForLogin(r,n,s,void 0,i,!0),formatSuccess:r=>({success:!0,userInfo:r.userInfo})}):await R().login()}catch(r){if(e.json){let n=r instanceof Error?r.message:String(r);console.log(JSON.stringify({success:!1,error:n})),process.exit(1)}v(r)}}),o}import{Command as Oe}from"commander";function Xt(){let o=new Oe("logout");return o.description("\u9000\u51FA\u767B\u5F55"),o.action(async()=>{try{await R().logout()}catch(t){v(t)}}),o}import{Command as De}from"commander";function _t(){let o=new De("status");return o.description("\u67E5\u770B\u767B\u5F55\u72B6\u6001"),o.action(async()=>{try{await R().status()}catch(t){v(t)}}),o}import{Command as bo}from"commander";function Qt(){let o=new bo("xianyu");o.description("\u95F2\u9C7C\u5E97\u94FA\u6388\u6743").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09");let t=new bo("poll").description("\u8F6E\u8BE2\u95F2\u9C7C\u6388\u6743\u72B6\u6001\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09").requiredOption("--state <state>","\u6388\u6743\u8F6E\u8BE2 token").option("--expire <ms>","\u8FC7\u671F\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09","300000").option("--interval <ms>","\u8F6E\u8BE2\u95F4\u9694\uFF08\u6BEB\u79D2\uFF09","1000").action(ht(async e=>{let r=await rt(e.state,Number.parseInt(e.expire,10),Number.parseInt(e.interval,10));r.status==="success"?console.log(JSON.stringify({success:!0,shopId:r.shopId,shopName:r.shopName})):qt(`\u6388\u6743\u72B6\u6001: ${r.status}`)}));return o.addCommand(t),o.action(async e=>{try{e.json?await yt({generate:async()=>{let{authData:r,qrUrl:n,setStatus:s,closeServer:i}=await ft(),a=r.expireTime?Number.parseInt(r.expireTime,10):3e5,l=r.pollInterval?Number.parseInt(r.pollInterval,10):1e3;return{qrInfo:{state:r.state,expireTimeMs:a,pollIntervalMs:l,qrUrl:n},qrUrl:n,setStatus:s,closeServer:i,waitArgs:{state:r.state,expireMs:a,intervalMs:l}}},waitResult:async({state:r,expireMs:n,intervalMs:s},i)=>{let a=await rt(r,n,s,void 0,i);if(a.status!=="success")throw new Error(`\u6388\u6743\u72B6\u6001: ${a.status}`);return a},formatSuccess:r=>({success:!0,shopId:r.shopId,shopName:r.shopName})}):await Gt()}catch(r){if(e.json){let n=r instanceof Error?r.message:String(r);console.log(JSON.stringify({success:!1,error:n})),process.exit(1)}v(r)}}),o}import{Command as ir}from"commander";import{Command as Ue}from"commander";import L from"chalk";import{select as Ft,input as Ee,confirm as je}from"@inquirer/prompts";function X(o){let t=new URLSearchParams;for(let[e,r]of Object.entries(o))r!=null&&r!==""&&t.append(e,String(r));return t}var A=mt;async function Mt(o){return A.post("mms/goods/listing/up/xianyu",o)}async function Po(o){return A.get("mms/goods/listing/get",X({...o}))}async function Ao(o){return A.post("mms/goods/listing/down/xianyu",o)}async function ko(o){return A.post("mms/goods/listing/update/xyPrice",o)}async function vo(o){return A.get("mms/goods/listing/list",o?X({...o}):void 0)}async function wt(){return await A.get("mms/user/shop/list")??[]}async function xt(){return await A.get("mms/user/stock/list")??[]}async function It(o){let t=o?X({...o}):void 0;return A.get("mms/seller/goods/select/list",t)}async function No(o){return A.post("mms/goods/listing/hang/up/xianyu",o)}async function Ro(o=16){return await A.get("platform/xy/cat",X({spBizType:o}))??[]}async function Lo(o){return await A.get("platform/xy/props",X({channelCatId:o}))??[]}async function Oo(o,t,e){return await A.get("platform/xy/props/value",X({channelCatId:o,propId:t,key:e}))??[]}var $e=2e3,Be=1e4;function Ge(o){let t=o.status?.toLowerCase()??"";return t===""||t==="init"||t==="pending"||t==="processing"}async function Do(o,t,e,r){r||process.stdout.write(L.cyan("\u23F3 \u6B63\u5728\u67E5\u8BE2\u4E0A\u67B6\u8FDB\u5EA6..."));let n=await F(()=>Po({stockGoodsId:o,shopId:t,platform:e}),{interval:$e,timeout:Be,condition:s=>!Ge(s)});return r||process.stdout.write("\r"+" ".repeat(30)+"\r"),n}function Uo(){let o=new Ue("up");return o.description("\u4E0A\u67B6\u5546\u54C1\u5230\u95F2\u9C7C"),o.option("--stock-goods-id <id>","\u5E93\u5B58\u5546\u54C1ID\uFF08\u4ECE goods list \u83B7\u53D6\uFF09").option("--shop-id <id>","\u5E97\u94FAID\uFF08\u4ECE goods shops \u83B7\u53D6\uFF09").option("--price <amount>","\u4E0A\u67B6\u4EF7\u683C").option("-p, --platform <platform>","\u5E73\u53F0","xianyu").option("--json","\u8F93\u51FA JSON\uFF08Agent \u7528\uFF09").action(p(async t=>{if(t.json&&!(t.stockGoodsId&&t.shopId&&t.price)&&(console.log(JSON.stringify({success:!1,error:"Agent \u6A21\u5F0F\u9700\u8981 --stock-goods-id, --shop-id, --price"})),process.exit(1)),t.stockGoodsId&&t.shopId&&t.price){let d=Number(t.stockGoodsId),k=t.shopId,Pt=Number(t.price),Q=t.platform,ie=await Mt({stockGoodsId:d,shopId:k,price:Pt,platform:Q}),At=await Do(d,k,Q,t.json);if(t.json)console.log(JSON.stringify({success:!0,data:{submit:ie,listing:At}},null,2));else{let ae=At.status?.toLowerCase()!=="failed";console.log(ae?L.green("\u2713 \u4E0A\u67B6\u6210\u529F"):L.red("\u2717 \u4E0A\u67B6\u5931\u8D25")),console.log(JSON.stringify(At,null,2))}return}let e=await wt();if(e.length===0){console.log(L.yellow("\u6CA1\u6709\u5DF2\u6388\u6743\u5E97\u94FA\uFF0C\u8BF7\u5148\u8FD0\u884C r2-cli auth xianyu \u6388\u6743"));return}let r=await Ft({message:"\u9009\u62E9\u5E97\u94FA",choices:e.map(d=>({name:`${d.shopName} (${d.platform})`,value:d.shopId}))}),n=await xt();if(n.length===0){console.log(L.yellow("\u6CA1\u6709\u53EF\u7528\u7684\u4ED3\u5E93"));return}let s=await Ft({message:"\u9009\u62E9\u4ED3\u5E93",choices:n.map(d=>({name:d.stockName,value:d.stockId}))}),i=await It({stockId:s,size:100});if(!i.items?.length){console.log(L.yellow("\u8BE5\u4ED3\u5E93\u6CA1\u6709\u53EF\u9009\u7684\u5546\u54C1"));return}let a=await Ft({message:"\u9009\u62E9\u5546\u54C1",choices:i.items.map(d=>({name:`${d.goodsName} ${d.size?`| ${d.size}`:""} | \xA5${d.salePrice}`,value:d.stockGoodsId}))}),l=await Ee({message:"\u8F93\u5165\u4E0A\u67B6\u4EF7\u683C",default:i.items.find(d=>d.stockGoodsId===a)?.salePrice?.toString()??"",validate:d=>Number(d)>0?!0:"\u4EF7\u683C\u5FC5\u987B\u4E3A\u6B63\u6570"});if(!await je({message:`\u786E\u8BA4\u4E0A\u67B6\uFF1F\u4EF7\u683C \xA5${l}`,default:!0})){console.log(L.gray("\u5DF2\u53D6\u6D88"));return}let m=Number(a);await Mt({stockGoodsId:m,shopId:r,price:Number(l),platform:"xianyu"}),console.log(L.green("\u2713 \u4E0A\u67B6\u5DF2\u63D0\u4EA4\uFF0C\u6B63\u5728\u67E5\u8BE2\u8FDB\u5EA6..."));let b=await Do(m,r,"xianyu"),_=b.status?.toLowerCase()!=="failed";console.log(_?L.green("\u2713 \u4E0A\u67B6\u6210\u529F"):L.red("\u2717 \u4E0A\u67B6\u5931\u8D25")),console.log(JSON.stringify(b,null,2))})),o}import{Command as Qe}from"commander";import Bo from"chalk";function Go(){let o=new Qe("shops");return o.description("\u67E5\u770B\u6240\u6709\u5DF2\u6388\u6743\u5E97\u94FA\uFF08\u8DE8\u5E73\u53F0\uFF09"),o.option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09"),o.action(p(async t=>{let e=await wt();if(t.json){console.log(JSON.stringify(Co(e),null,2));return}if(!e.length){console.log(Bo.yellow("\u672A\u627E\u5230\u5DF2\u6388\u6743\u7684\u5E97\u94FA")),console.log(Bo.gray(" \u63D0\u793A: \u8BF7\u5148\u5728\u7B2C\u4E8C\u56DE\u5408 APP \u4E2D\u6388\u6743\u5E97\u94FA"));return}let{ShopsTable:r}=await Promise.resolve().then(()=>($o(),jo)),{renderComponent:n}=await Promise.resolve().then(()=>(et(),gt));n(r,{shops:e,platform:"all"})})),o}import{Command as We}from"commander";import He from"chalk";function Xo(){let o=new We("stocks");return o.description("\u67E5\u770B\u6240\u6709\u4ED3\u5E93"),o.option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09"),o.action(p(async t=>{let e=await xt();if(t.json){console.log(JSON.stringify(e,null,2));return}if(!e.length){console.log(He.yellow("\u672A\u627E\u5230\u4ED3\u5E93\u4FE1\u606F"));return}let{StocksTable:r}=await Promise.resolve().then(()=>(Jo(),qo)),{renderComponent:n}=await Promise.resolve().then(()=>(et(),gt));n(r,{stocks:e})})),o}import{Command as Ve}from"commander";import Z from"chalk";function _o(){let o=new Ve("list");return o.description("\u67E5\u770B\u4ED3\u5E93\u4E2D\u7684\u9009\u54C1\u5546\u54C1"),o.option("--stock-id <id>","\u4ED3\u5E93 ID\uFF08\u4ECE goods stocks \u83B7\u53D6\uFF09").option("--stock-goods-id <id>","\u5E93\u5B58\u5546\u54C1 ID").option("--page <n>","\u9875\u7801","1").option("--size <n>","\u6BCF\u9875\u6570\u91CF\uFF08\u6700\u5927 50\uFF09","20").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09"),o.action(p(async t=>{let r=await It({stockId:t.stockId||void 0,stockGoodsId:t.stockGoodsId||void 0,page:Number(t.page)||1,size:Math.min(Number(t.size)||20,50)})??{items:[],total:0};if(t.json){r.items?.length?console.log(JSON.stringify(r,null,2)):console.log(JSON.stringify({...r,hint:"\u9009\u54C1\u5546\u54C1\u4E3A\u7A7A\uFF0C\u8BF7\u5148\u5728\u540E\u53F0\u751F\u6210\u9009\u54C1\u8868\u6570\u636E\u540E\u518D\u8BD5"},null,2));return}if(!r.items?.length){console.log(Z.yellow("\u6682\u65E0\u9009\u54C1\u5546\u54C1\uFF0C\u8BF7\u5148\u7ED1\u5B9A\u4ED3\u5E93\u6216\u5728\u540E\u53F0\u751F\u6210\u9009\u54C1\u8868\u6570\u636E"));return}console.log(Z.cyan(`
36
- \u9009\u54C1\u5546\u54C1\uFF08\u5171 ${r.total} \u4EF6\uFF0C\u7B2C ${r.page} \u9875\uFF09
37
- `));for(let n of r.items)console.log(` ${Z.bold(n.goodsName)} ${n.size?Z.gray(`| ${n.size}`):""}`),console.log(` \u54C1\u724C: ${n.brand} \u5EFA\u8BAE\u552E\u4EF7: \xA5${n.salePrice} stockGoodsId: ${Z.green(n.stockGoodsId)}`),console.log(Z.gray(` \u5206\u7C7B: ${n.cate1Name} > ${n.cate2Name} > ${n.cate3Name}`)),console.log()})),o}import{Command as or}from"commander";import er from"chalk";et();import{Box as g,Text as h}from"ink";import{jsx as c,jsxs as j}from"react/jsx-runtime";var Ke={init:{label:"\u5F85\u4E0A\u67B6",color:"yellow"},up:{label:"\u5DF2\u4E0A\u67B6",color:"green"},down:{label:"\u5DF2\u4E0B\u67B6",color:"gray"},fail:{label:"\u5931\u8D25",color:"red"},sold:{label:"\u5DF2\u552E\u51FA",color:"blue"}},to=4,oo=8,St=12,eo=10,ro=6,no=8;function Qo(o,t){return o.length>t?o.slice(0,t-1)+"\u2026":o}function Mo(o){if(!o)return"-";let t=new Date(o),e=r=>String(r).padStart(2,"0");return`${e(t.getMonth()+1)}/${e(t.getDate())} ${e(t.getHours())}:${e(t.getMinutes())}`}function Ye({fillWidth:o}){return j(g,{flexDirection:"row",children:[c(g,{width:to,children:c(h,{bold:!0,color:"white",children:"ID"})}),c(g,{width:oo,children:c(h,{bold:!0,color:"white",children:"\u72B6\u6001"})}),c(g,{width:St,children:c(h,{bold:!0,color:"white",children:"\u54C1\u724C"})}),c(g,{width:o,children:c(h,{bold:!0,color:"white",children:"\u5546\u54C1\u540D\u79F0"})}),c(g,{width:eo,children:c(h,{bold:!0,color:"white",children:"\u4EF7\u683C"})}),c(g,{width:ro,children:c(h,{bold:!0,color:"white",children:"\u89C4\u683C"})}),c(g,{width:no,children:c(h,{bold:!0,color:"white",children:"\u5E93\u5B58ID"})})]})}function Ze({item:o}){return c(g,{flexDirection:"column",children:c(h,{color:"gray",children:` shopId: ${o.shopId} thirdItemNo: ${o.thirdItemNo||"-"} outItemNo: ${o.outItemNo||"-"} \u8D27\u53F7: ${o.goodsNo||"-"} ${o.type||"-"} ${o.platform} \u521B\u5EFA: ${Mo(o.gmtCreate)} \u4FEE\u6539: ${Mo(o.gmtModified)}`})})}function tr({item:o,fillWidth:t}){let e=Ke[o.status]??{label:o.status,color:"white"};return j(g,{flexDirection:"column",children:[j(g,{flexDirection:"row",children:[c(g,{width:to,children:c(h,{color:"gray",children:o.id})}),c(g,{width:oo,children:c(h,{color:e.color,children:e.label})}),c(g,{width:St,children:c(h,{color:"cyan",children:Qo(o.brandName||"-",St-1)})}),c(g,{width:t,children:c(h,{children:Qo(o.goodsName,t-1)})}),c(g,{width:eo,children:j(h,{color:"yellow",children:["\xA5",o.price]})}),c(g,{width:ro,children:c(h,{color:"gray",children:o.spec||"-"})}),c(g,{width:no,children:c(h,{color:"gray",children:o.stockGoodsId})})]}),c(Ze,{item:o})]})}function Fo({items:o,total:t}){let e=process.stdout.columns||80,r=4,n=to+oo+St+eo+ro+no,s=Math.max(e-r-n,20),i=n+s;return j(g,{flexDirection:"column",marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,children:[j(g,{flexDirection:"row",children:[c(h,{bold:!0,color:"cyan",children:"\u4E0A\u67B6\u5217\u8868"}),j(h,{color:"gray",children:[" \xB7 \u5171 ",t," \u6761"]})]}),j(g,{flexDirection:"column",marginTop:1,children:[c(Ye,{fillWidth:s}),c(h,{color:"gray",children:"\u2500".repeat(i)}),o.map(a=>c(tr,{item:a,fillWidth:s},a.id))]})]})}function zo(){let o=new or("listing");return o.description("\u67E5\u8BE2\u4E0A\u67B6\u5546\u54C1\u5217\u8868"),o.option("--id <id>","\u4E0A\u67B6\u8BB0\u5F55 ID").option("--stock-goods-id <id>","\u5E93\u5B58\u5546\u54C1 ID").option("--shop-id <id>","\u5E97\u94FA ID").option("--stock-id <id>","\u4ED3\u5E93 ID").option("-s, --status <status>","\u72B6\u6001\u8FC7\u6EE4\uFF08init/up/down/fail/sold\uFF09").option("-p, --platform <platform>","\u5E73\u53F0","xianyu").option("--page <n>","\u9875\u7801","1").option("--size <n>","\u6BCF\u9875\u6570\u91CF\uFF08\u6700\u5927 50\uFF09","20").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09"),o.action(p(async t=>{let r=await vo({id:t.id,stockGoodsId:t.stockGoodsId?Number(t.stockGoodsId):void 0,shopId:t.shopId,stockId:t.stockId,status:t.status,platform:t.platform,page:Number(t.page)||1,size:Math.min(Number(t.size)||20,50)})??{items:[],total:0};if(t.json){r.items?.length?console.log(JSON.stringify(r,null,2)):console.log(JSON.stringify({...r,hint:"\u6682\u65E0\u4E0A\u67B6\u8BB0\u5F55"},null,2));return}if(!r.items?.length){console.log(er.yellow("\u6682\u65E0\u4E0A\u67B6\u8BB0\u5F55"));return}$t(Fo,{items:r.items,total:r.total})})),o}import{Command as rr}from"commander";import so from"chalk";function Wo(){let o=new rr("down");return o.description("\u4E0B\u67B6\u95F2\u9C7C\u5546\u54C1"),o.option("--id <id>","\u4E0A\u67B6\u8BB0\u5F55 ID").option("--stock-goods-id <id>","\u5E93\u5B58\u5546\u54C1 ID").option("--shop-id <id>","\u5E97\u94FA ID").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09"),o.action(p(async t=>{if(!t.id&&!(t.stockGoodsId&&t.shopId)){t.json&&(console.log(JSON.stringify({success:!1,error:"\u8BF7\u6307\u5B9A\u4E0B\u67B6\u6761\u4EF6\uFF1A--id <id> \u6216 --stock-goods-id <id> --shop-id <id>"})),process.exit(1)),console.log(so.yellow("\u8BF7\u6307\u5B9A\u4E0B\u67B6\u6761\u4EF6\uFF1A--id <id> \u6216 --stock-goods-id <id> --shop-id <id>"));return}let e={};t.id&&(e.id=t.id),t.stockGoodsId&&(e.stockGoodsId=Number(t.stockGoodsId)),t.shopId&&(e.shopId=t.shopId),t.json||console.log(so.cyan("\u{1F4E6} \u6B63\u5728\u4E0B\u67B6\u5546\u54C1..."));let r=await Ao(e);t.json?console.log(JSON.stringify({success:!0,data:r},null,2)):(console.log(so.green("\u2705 \u4E0B\u67B6\u6210\u529F")),console.log(JSON.stringify(r,null,2)))})),o}import{Command as nr}from"commander";import Ct from"chalk";function Ho(){let o=new nr("price");return o.description("\u4FEE\u6539\u95F2\u9C7C\u4E0A\u67B6\u5546\u54C1\u4EF7\u683C"),o.option("--id <id>","\u4E0A\u67B6\u8BB0\u5F55 ID").option("--stock-goods-id <id>","\u5E93\u5B58\u5546\u54C1 ID").option("--shop-id <id>","\u5E97\u94FA ID").option("--price <amount>","\u65B0\u4EF7\u683C\uFF08\u5FC5\u586B\uFF09").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09"),o.action(p(async t=>{if(!t.price){t.json&&(console.log(JSON.stringify({success:!1,error:"--price <amount> \u4E3A\u5FC5\u586B\u53C2\u6570"})),process.exit(1)),console.log(Ct.yellow("--price <amount> \u4E3A\u5FC5\u586B\u53C2\u6570"));return}if(!t.id&&!(t.stockGoodsId&&t.shopId)){t.json&&(console.log(JSON.stringify({success:!1,error:"\u8BF7\u6307\u5B9A\u5546\u54C1\uFF1A--id <id> \u6216 --stock-goods-id <id> --shop-id <id>"})),process.exit(1)),console.log(Ct.yellow("\u8BF7\u6307\u5B9A\u5546\u54C1\uFF1A--id <id> \u6216 --stock-goods-id <id> --shop-id <id>"));return}let e={price:Number(t.price)};t.id&&(e.id=t.id),t.stockGoodsId&&(e.stockGoodsId=Number(t.stockGoodsId)),t.shopId&&(e.shopId=t.shopId),t.json||console.log(Ct.cyan(`\u{1F4B0} \u6B63\u5728\u4FEE\u6539\u4EF7\u683C\u4E3A ${t.price}...`));let r=await ko(e);t.json?console.log(JSON.stringify({success:!0,data:r},null,2)):(console.log(Ct.green("\u2705 \u4EF7\u683C\u4FEE\u6539\u6210\u529F")),console.log(JSON.stringify(r,null,2)))})),o}import{Command as Fs}from"commander";import Ws from"chalk";import{Command as nt}from"commander";import T from"chalk";var sr={100:"\u5168\u65B0",[-1]:"\u51C6\u65B0",99:"99\u65B0",95:"95\u65B0",90:"9\u65B0"};function Vo(){let o=new nt("hang-up");return o.description("\u95F2\u9C7C\u6302\u552E\u4E0A\u67B6\uFF08\u5B8C\u6574\u5546\u54C1\u4FE1\u606F\u6A21\u5F0F\uFF09"),o.addCommand(new nt("categories").description("\u83B7\u53D6\u95F2\u9C7C\u7C7B\u76EE\u5217\u8868\uFF08\u5927\u5206\u7C7B \u2192 \u5C0F\u5206\u7C7B\uFF09").option("--sp-biz-type <n>","\u4E1A\u52A1\u5206\u7C7B\uFF0C16=\u5962\u54C1","16").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09").action(p(async t=>{let e=await Ro(Number(t.spBizType));if(t.json){console.log(JSON.stringify(e,null,2));return}let r=new Map;for(let n of e){let s=String(n.catId);r.has(s)||r.set(s,{catName:n.catName,children:[]}),r.get(s).children.push({channel:n.channel,channelCatId:n.channelCatId})}for(let[n,s]of r){console.log(T.bold(`${s.catName} (catId: ${T.green(n)})`));for(let i of s.children)console.log(` ${i.channel} (channelCatId: ${T.green(i.channelCatId)})`)}}))),o.addCommand(new nt("props").description("\u83B7\u53D6\u6307\u5B9A\u7C7B\u76EE\u4E0B\u7684\u5C5E\u6027\u5217\u8868\uFF08\u542B\u53EF\u9009\u503C\uFF09").requiredOption("--channel-cat-id <id>","\u5C0F\u5206\u7C7B ID\uFF08\u4ECE categories \u83B7\u53D6\uFF09").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09").action(p(async t=>{let e=await Lo(t.channelCatId);if(t.json){console.log(JSON.stringify(e,null,2));return}for(let r of e)if(console.log(T.bold(`
38
- ${r.propName} (propId: ${r.propId})`)),r.propsValues?.length)for(let n of r.propsValues)console.log(` ${n.valueName} (valueId: ${n.valueId})`);else console.log(T.gray(" \uFF08\u4F7F\u7528 brands \u5B50\u547D\u4EE4\u641C\u7D22\uFF09"))}))),o.addCommand(new nt("brands").description("\u641C\u7D22\u95F2\u9C7C\u54C1\u724C\uFF08\u6309\u5173\u952E\u5B57\u8FC7\u6EE4\uFF09").requiredOption("--channel-cat-id <id>","\u5C0F\u5206\u7C7B ID").requiredOption("--prop-id <id>","\u5C5E\u6027 ID\uFF08\u54C1\u724C\u5C5E\u6027\u7684 propId\uFF09").requiredOption("--key <keyword>","\u641C\u7D22\u5173\u952E\u5B57").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09").action(p(async t=>{let e=await Oo(t.channelCatId,t.propId,t.key);if(t.json){console.log(JSON.stringify(e,null,2));return}if(!e.length){console.log(T.yellow("\u672A\u627E\u5230\u5339\u914D\u7684\u54C1\u724C"));return}for(let r of e)console.log(` ${r.valueName} (valueId: ${r.valueId})`)}))),o.addCommand(new nt("submit").description("\u63D0\u4EA4\u6302\u552E\u4E0A\u67B6").requiredOption("--shop-id <id>","\u5E97\u94FA ID\uFF08\u5373\u95F2\u9C7C\u7528\u6237\u540D account\uFF09").requiredOption("--title <title>","\u5546\u54C1\u6807\u9898").requiredOption("--price <amount>","\u552E\u4EF7").requiredOption("--category-id <id>","\u5927\u5206\u7C7B ID\uFF08\u4ECE categories \u83B7\u53D6\uFF09").requiredOption("--channel-cat-id <id>","\u5C0F\u5206\u7C7B ID\uFF08\u4ECE categories \u83B7\u53D6\uFF09").requiredOption("--image-ids <ids>","\u56FE\u7247 ID \u5217\u8868\uFF0C\u9017\u53F7\u5206\u9694\uFF08\u5148\u901A\u8FC7 upload-images \u83B7\u53D6\uFF09").requiredOption("--stuff-status <n>","\u6210\u8272\uFF1A100 \u5168\u65B0 / -1 \u51C6\u65B0 / 99 99\u65B0 / 95 95\u65B0 / 90 9\u65B0").option("--item-attrs <json>",'\u5546\u54C1\u5C5E\u6027\u5217\u8868 JSON\uFF0C\u683C\u5F0F: [{"propId":"x","valueId":"y","valueName":"z"}]').option("--brand-name <name>","\u54C1\u724C\u540D\u79F0").option("--desc <desc>","\u5546\u54C1\u63CF\u8FF0").option("--size <size>","\u5C3A\u7801").option("--goods-no <no>","\u8D27\u53F7").option("--original-price <amount>","\u539F\u4EF7").option("--trade-type <n>","\u4EA4\u6613\u65B9\u5F0F\uFF1A0 \u4EC5\u5728\u7EBF / 1 \u4EC5\u7EBF\u4E0B / 2 \u7EBF\u4E0A\u6216\u7EBF\u4E0B","0").option("--transport-fee <amount>","\u8FD0\u8D39\uFF08\u9ED8\u8BA4 0 \u5305\u90AE\uFF09","0").option("--yhb","\u662F\u5426\u5F00\u542F\u9A8C\u8D27\u5B9D").requiredOption("--out-item-no <no>","\u5546\u5BB6\u7F16\u7801\uFF08\u540C\u5E97\u94FA\u552F\u4E00\uFF0C\u7528\u6237\u81EA\u5B9A\u4E49\uFF09").option("--division-id <id>","\u884C\u653F\u533A\u5212 ID\uFF08\u5E02\u7EA7 ID\uFF0C\u9ED8\u8BA4\u676D\u5DDE 330100\uFF09","330100").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09").action(p(async t=>{let e=t.imageIds.split(",").map(s=>s.trim()),r={account:t.shopId,title:t.title,reservePrice:Number(t.price),categoryId:Number(t.categoryId),channelCatId:t.channelCatId,imageIdList:e,stuffStatus:Number(t.stuffStatus),itemBizType:2,spBizType:"16",tradeType:Number(t.tradeType)||0,transportFee:Number(t.transportFee)||0,yhb:t.yhb??!1,...t.brandName&&{brandName:t.brandName},...t.desc&&{desc:t.desc},...t.size&&{size:t.size},...t.goodsNo&&{goodsNo:t.goodsNo},...t.originalPrice&&{originalPrice:Number(t.originalPrice)},outItemNo:t.outItemNo,divisionId:Number(t.divisionId)||330100,apiAfterSalesDo:{supportFd10msPolicy:!1,supportFd24hsPolicy:!1,supportNfrPolicy:!1,supportSdrPolicy:!1,supportVnrPolicy:!1,supportGpaPolicy:!1,supportFd48hsPolicy:!1},...t.itemAttrs&&{itemAttrList:JSON.parse(t.itemAttrs)}};t.json||(console.log(T.cyan("\u6B63\u5728\u63D0\u4EA4\u6302\u552E...")),console.log(T.gray(` \u6807\u9898: ${r.title}`)),console.log(T.gray(` \u552E\u4EF7: \xA5${r.reservePrice}`)),console.log(T.gray(` \u6210\u8272: ${sr[r.stuffStatus]??r.stuffStatus}`)),console.log(T.gray(` \u56FE\u7247: ${e.length} \u5F20`)),r.itemAttrList?.length&&console.log(T.gray(` \u5C5E\u6027: ${r.itemAttrList.length} \u9879`)));let n=await No(r);t.json?console.log(JSON.stringify({success:!0,data:n},null,2)):(console.log(T.green("\u6302\u552E\u63D0\u4EA4\u6210\u529F")),console.log(JSON.stringify(n,null,2)))}))),o}function Ko(){let o=new ir("goods");return o.description("\u5546\u54C1\u7BA1\u7406"),o.addCommand(Go()),o.addCommand(Xo()),o.addCommand(_o()),o.addCommand(zo()),o.addCommand(Wo()),o.addCommand(Ho()),o.addCommand(Uo()),o.addCommand(Vo()),o}import{Command as ar}from"commander";import O from"chalk";import{promises as cr}from"node:fs";import lr from"node:path";import dr from"node:os";import{spawn as ur}from"node:child_process";var Tt="@round2ai/r2-cli";function Yo(){let o=new ar("uninstall");return o.description("\u5378\u8F7D R2-CLI \u5E76\u6E05\u9664\u6240\u6709\u914D\u7F6E"),o.action(async()=>{try{console.log(O.yellow(`
39
- \u26A0\uFE0F \u5373\u5C06\u6267\u884C\u4EE5\u4E0B\u64CD\u4F5C\uFF1A`)),console.log(O.gray(" 1. \u5220\u9664\u914D\u7F6E\u76EE\u5F55 ~/.r2-cli/")),console.log(O.gray(` 2. \u5168\u5C40\u5378\u8F7D ${Tt}
40
- `));let{confirm:t}=await import("@inquirer/prompts");if(!await t({message:"\u786E\u8BA4\u5378\u8F7D\uFF1F",default:!1})){console.log(O.gray("\u5DF2\u53D6\u6D88\u5378\u8F7D"));return}let r=lr.join(dr.homedir(),".r2-cli");try{await cr.rm(r,{recursive:!0,force:!0}),console.log(O.green("\u2705 \u914D\u7F6E\u6587\u4EF6\u5DF2\u6E05\u9664"))}catch{console.log(O.yellow("\u26A0\uFE0F \u914D\u7F6E\u76EE\u5F55\u4E0D\u5B58\u5728\u6216\u65E0\u6CD5\u5220\u9664\uFF08\u53EF\u5FFD\u7565\uFF09"))}console.log(O.cyan(`\u6B63\u5728\u5378\u8F7D ${Tt}...`)),ur("npm",["uninstall","-g",Tt],{stdio:"inherit",shell:!0}).on("exit",s=>{s===0?console.log(O.green(`
41
- \u2705 ${Tt} \u5DF2\u5378\u8F7D`)):(console.log(O.yellow(`
42
- \u26A0\uFE0F npm \u5378\u8F7D\u5931\u8D25 (exit code: ${s})`)),console.log(O.gray(" \u5982\u901A\u8FC7 yarn/pnpm \u5B89\u88C5\uFF0C\u8BF7\u624B\u52A8\u5378\u8F7D"))),process.exit(s??1)})}catch(t){v(t)}}),o}import{Command as pr}from"commander";import st from"chalk";import{spawn as fr,execSync as hr}from"node:child_process";import{readFileSync as mr}from"node:fs";import{join as gr}from"node:path";function bt(){for(let o of["../package.json","../../package.json"])try{return JSON.parse(mr(gr(import.meta.dirname,o),"utf-8")).version}catch{}return"0.0.0"}var Zo="@round2ai/r2-cli";function yr(o,t){return new Promise(e=>{let r=fr(o,t,{stdio:"inherit"});r.on("close",n=>e(n??1)),r.on("error",()=>e(1))})}function te(){return new pr("update").description("\u4E00\u952E\u66F4\u65B0 CLI \u548C\u6280\u80FD").action(async()=>{let o=bt();console.log(st.cyan(`\u5F53\u524D\u7248\u672C: ${o}`)),console.log(st.cyan("\u6B63\u5728\u66F4\u65B0 CLI...")),await yr("npm",["install","-g",`${Zo}@latest`])!==0&&(console.error(st.red(`
43
- \u2717 update failed \xB7 Try: npm install -g ${Zo}@latest`)),process.exit(1));let e=o;try{e=hr("r2-cli --version",{encoding:"utf-8"}).trim()||o}catch{}console.log(st.green(`
44
- \u2713 \u66F4\u65B0\u5B8C\u6210: ${o} \u2192 ${e}`)),console.log(st.green("\u2713 \u6280\u80FD\u5DF2\u540C\u6B65\u66F4\u65B0"))})}function oe(o){let t=o.command("auth").description("\u6388\u6743\u7BA1\u7406");t.addCommand(Jt()),t.addCommand(Xt()),t.addCommand(_t()),t.addCommand(Qt()),o.addCommand(Ko()),o.addCommand(Yo()),o.addCommand(te())}import ee from"chalk";var re="@round2ai/r2-cli",wr=[`https://registry.npmmirror.com/${encodeURIComponent(re)}/latest`,`https://registry.npmjs.org/${encodeURIComponent(re)}/latest`],xr=5e3;async function Ir(o){let t=new AbortController,e=setTimeout(()=>t.abort(),xr);try{let r=await fetch(o,{signal:t.signal});return r.ok?(await r.json()).version??null:null}catch{return null}finally{clearTimeout(e)}}async function Sr(){let o=await Promise.allSettled(wr.map(Ir));for(let t of o)if(t.status==="fulfilled"&&t.value)return t.value;return null}function Cr(o,t){let e=o.split(".").map(Number),r=t.split(".").map(Number);for(let n=0;n<3;n++)if((e[n]??0)!==(r[n]??0))return(e[n]??0)>(r[n]??0);return!1}async function ne(o){let t=await Sr();t&&Cr(t,o)&&Tr(o,t)}function Tr(o,t){console.error(ee.yellow(`
45
- Update available: ${o} \u2192 ${t}`)+ee.gray(`
32
+ `));let i=3e5,s=1e3;try{let a=await pt(t.state,i,s,e,r);if(a.status==="success")return a;throw new C("\u95F2\u9C7C\u6388\u6743\u5931\u8D25: "+(a.status==="expired"?"\u94FE\u63A5\u5DF2\u8FC7\u671F":"\u672A\u77E5\u72B6\u6001"))}finally{n()}}D();import R from"chalk";import to from"chalk";var eo="@round2ai/r2-cli",hr=[`https://registry.npmmirror.com/${encodeURIComponent(eo)}/latest`,`https://registry.npmjs.org/${encodeURIComponent(eo)}/latest`],yr=5e3;async function wr(e){let t=new AbortController,o=setTimeout(()=>t.abort(),yr);try{let r=await fetch(e,{signal:t.signal});return r.ok?(await r.json()).version??null:null}catch{return null}finally{clearTimeout(o)}}async function xr(){let e=await Promise.allSettled(hr.map(wr));for(let t of e)if(t.status==="fulfilled"&&t.value)return t.value;return null}function Ir(e,t){let o=e.split(".").map(Number),r=t.split(".").map(Number);for(let n=0;n<3;n++)if((o[n]??0)!==(r[n]??0))return(o[n]??0)>(r[n]??0);return!1}var Zt=null,bt=null;function oo(){return!Zt||!bt?null:{_notice:{update:{message:`Update available: ${bt} \u2192 ${Zt}`,command:"npm update -g @round2ai/r2-cli && npx skills add Round2AI/r2-cli --all -y"}}}}async function ro(e){let t=await xr();t&&(Ir(t,e)?(Zt=t,bt=e,Sr(e,t)):bt=e)}function Sr(e,t){console.error(to.yellow(`
33
+ Update available: ${e} \u2192 ${t}`)+to.gray(`
46
34
  Run: r2-cli update
47
- `))}async function Pr(){let{default:o}=await import("figlet");console.log(tt.cyan.bold(o.textSync("R2-CLI",{font:"Standard",horizontalLayout:"full"}))),console.log(tt.gray(` \u5411 AI \u5F00\u653E\u4E8C\u624B\u6F6E\u5962\u4EA4\u6613\u5168\u94FE\u8DEF\u80FD\u529B
48
- `))}function Ar(){let o=new br;o.name("r2-cli").description("R2-CLI\uFF0C\u5411 AI \u5F00\u653E\u4E8C\u624B\u6F6E\u5962\u4EA4\u6613\u5168\u94FE\u8DEF\u80FD\u529B");let t=bt();t==="0.0.0"&&console.error(tt.yellow("Warning: unable to read version from package.json")),o.version(t,"-v, --version");let e=ne(t);return o.configureOutput({writeErr:r=>{console.error(tt.red(r.replace("error:","").trim()))}}),o.action(async()=>{await Pr(),o.help()}),oe(o),{program:o,updateCheckPromise:e}}function se(){console.log(tt.gray(`
49
- \u64CD\u4F5C\u5DF2\u53D6\u6D88`)),process.exit(130)}process.on("SIGINT",se);process.on("SIGTERM",se);var{program:kr,updateCheckPromise:vr}=Ar();kr.parse(process.argv);vr.catch(o=>{console.error(tt.gray(`[update-check] ${o instanceof Error?o.message:String(o)}`))});
35
+ `))}function Cr(e){if(e instanceof C)console.error(R.red(`
36
+ \u25B2 ${e.message}`)),console.error(R.gray(`\u2192 \u8BF7\u5148\u8FD0\u884C: r2-cli auth login
37
+ `));else if(e instanceof b)console.error(R.red(`\u25B2 \u64CD\u4F5C\u5931\u8D25: ${e.message}`)),e.status&&console.error(R.gray(` \u72B6\u6001\u7801: ${e.status}`));else if(e instanceof G)console.error(R.red(`\u25B2 \u914D\u7F6E\u6587\u4EF6\u5F02\u5E38: ${e.message}`)),e.path&&console.error(R.gray(` \u8DEF\u5F84: ${e.path}`)),console.error(R.gray(`\u2192 \u8BF7\u5C1D\u8BD5\u91CD\u65B0\u767B\u5F55: r2-cli auth login
38
+ `));else{let t=e instanceof Error?e.message:String(e);console.error(R.red(`\u25B2 ${t}`))}process.exit(1)}function S(e){let t=oo();return t&&Object.assign(e,t),e}function te(e,t){let o={success:!1,error:e};t&&(o.errorType=t),S(o),console.log(JSON.stringify(o)),process.exit(1)}function m(e){return async t=>{try{await e(t)}catch(o){if(t.json){let r=o instanceof Error?o.message:String(o),n=z(o),i=o instanceof b?o.status:void 0,s={success:!1,error:r,errorType:n};i!=null&&(s.status=i),S(s),console.log(JSON.stringify(s)),process.exit(1)}Cr(o)}}}function h(e,t){e.json&&(console.log(JSON.stringify({success:!1,error:t,errorType:"validation"})),process.exit(1)),console.log(R.yellow(t))}function y(e,t,o){if(e.json){let r={success:!0,data:t};S(r),console.log(JSON.stringify(r,null,2))}else o&&console.log(R.green(o)),console.log(JSON.stringify(t,null,2))}function Pt(e){return async(...t)=>{try{await e(...t)}catch(o){let r=o instanceof Error?o.message:String(o),n=z(o);te(r,n)}}}var Tr=new Set(["accessToken","refreshExpireIn"]);function no(e){return e.map(t=>{let o={};for(let[r,n]of Object.entries(t))Tr.has(r)||(o[r]=n);return o})}function At(e){e.option("--expire <ms>","\u8FC7\u671F\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09","300000").option("--interval <ms>","\u8F6E\u8BE2\u95F4\u9694\uFF08\u6BEB\u79D2\uFF09","1000")}function vt(e,t){return{expireMs:Number.parseInt(e.expire??String(t?.expireMs??3e5),10),intervalMs:Number.parseInt(e.interval??String(t?.intervalMs??1e3),10)}}async function kt(e){let{qrInfo:t,qrUrl:o,setStatus:r,closeServer:n,waitArgs:i}=await e.generate();console.log(JSON.stringify(S(t),null,2)),X(o);try{let s=await e.waitResult(i,r);console.log(JSON.stringify(S(e.formatSuccess(s))))}catch(s){let a=s instanceof Error?s.message:String(s);console.log(JSON.stringify(S({success:!1,error:a}))),process.exit(1)}finally{setTimeout(n,1e3)}}function ee(){let e=new io("login");e.description("\u626B\u7801\u767B\u5F55 Round2AI \u8D26\u6237").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09");let t=new io("poll").description("\u8F6E\u8BE2\u767B\u5F55\u72B6\u6001\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09").requiredOption("--token <qrToken>","\u4E8C\u7EF4\u7801 token").action(Pt(async o=>{let r=k(),{expireMs:n,intervalMs:i}=vt(o),s=await r.waitForLogin(o.token,n,i);console.log(JSON.stringify(S({success:!0,...s})))}));return At(t),e.addCommand(t),e.action(m(async o=>{o.json?await kt({generate:async()=>{let r=k(),{qrData:n,qrUrl:i,setStatus:s,closeServer:a}=await r.generateQR(),d=Number.parseInt(n.expireTime,10),w=Number.parseInt(n.pollInterval,10);return{qrInfo:{qrToken:n.qrToken,expireTimeMs:d,pollIntervalMs:w,qrUrl:i},qrUrl:i,setStatus:s,closeServer:a,waitArgs:{qrToken:n.qrToken,expireMs:d,intervalMs:w}}},waitResult:({qrToken:r,expireMs:n,intervalMs:i},s)=>k().waitForLogin(r,n,i,void 0,s,!0),formatSuccess:r=>({success:!0,userInfo:r.userInfo})}):await k().login()})),e}import{Command as br}from"commander";function oe(){let e=new br("logout");return e.description("\u9000\u51FA\u767B\u5F55").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09"),e.action(m(async t=>{if(t.json){let{getAuthStorage:o}=await Promise.resolve().then(()=>(dt(),Wt));await o().clearCredentials(),y(t,null,"\u5DF2\u9000\u51FA\u767B\u5F55")}else await k().logout()})),e}import{Command as Pr}from"commander";function re(){let e=new Pr("status");return e.description("\u67E5\u770B\u767B\u5F55\u72B6\u6001").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09"),e.action(m(async t=>{if(t.json){let{getAuthStorage:o}=await Promise.resolve().then(()=>(dt(),Wt)),r=o();if(!await r.isLoggedIn()){y(t,{loggedIn:!1},"\u672A\u767B\u5F55");return}let i=await r.getCredentials();y(t,{loggedIn:!0,userInfo:i.userInfo,timestamp:i.timestamp})}else await k().status()})),e}import{Command as so}from"commander";function ne(){let e=new so("xianyu");e.description("\u95F2\u9C7C\u5E97\u94FA\u6388\u6743").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09");let t=new so("poll").description("\u8F6E\u8BE2\u95F2\u9C7C\u6388\u6743\u72B6\u6001\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09").requiredOption("--state <state>","\u6388\u6743\u8F6E\u8BE2 token");return At(t),t.action(Pt(async o=>{let{expireMs:r,intervalMs:n}=vt(o),i=await pt(o.state,r,n);i.status==="success"?console.log(JSON.stringify(S({success:!0,shopId:i.shopId,shopName:i.shopName}))):te(`\u6388\u6743\u72B6\u6001: ${i.status}`)})),e.addCommand(t),e.action(m(async o=>{o.json?await kt({generate:async()=>{let{authData:r,qrUrl:n,setStatus:i,closeServer:s}=await Tt(),a=r.expireTime?Number.parseInt(r.expireTime,10):3e5,d=r.pollInterval?Number.parseInt(r.pollInterval,10):1e3;return{qrInfo:{state:r.state,expireTimeMs:a,pollIntervalMs:d,qrUrl:n},qrUrl:n,setStatus:i,closeServer:s,waitArgs:{state:r.state,expireMs:a,intervalMs:d}}},waitResult:async({state:r,expireMs:n,intervalMs:i},s)=>{let a=await pt(r,n,i,void 0,s);if(a.status!=="success")throw new Error(`\u6388\u6743\u72B6\u6001: ${a.status}`);return a},formatSuccess:r=>({success:!0,shopId:r.shopId,shopName:r.shopName})}):await Kt()})),e}import{Command as hn}from"commander";import{Command as Ur}from"commander";import L from"chalk";import{select as ye,input as Er,confirm as jr}from"@inquirer/prompts";_();var F=v;async function Rt(e){return F.post("mms/goods/listing/up/xianyu",e)}async function ie(e){return F.get("mms/goods/listing/get",E(e))}async function se(e){return F.post("mms/goods/listing/down/xianyu",e)}async function ae(e){return F.post("mms/goods/listing/update/xyPrice",e)}async function ce(e){return F.post("mms/goods/listing/update/goodsInfo",e)}async function le(e){return F.get("mms/goods/listing/list",e?E(e):void 0)}async function de(e){return F.post("mms/goods/listing/hang/up/xianyu",e)}_();var me=v;async function gt(){return await me.get("mms/user/shop/list")??[]}async function ft(){return await me.get("mms/user/stock/list")??[]}async function ht(e){let t=e?E(e):void 0;return me.get("mms/seller/goods/select/list",t)}import{basename as Rr}from"node:path";import{stat as Ar,readFile as ao}from"node:fs/promises";import vr from"sharp";var kr=2*1024*1024;async function co(e,t=kr){let{size:o}=await Ar(e);if(o<=t)return ao(e);let r=vr(e);await r.metadata();let n=[80,70,60,50,40,30],i=null;for(let s of n){let a=await r.jpeg({quality:s,mozjpeg:!0}).toBuffer();if(a.length<=t)return a;i=a}return i??ao(e)}var Lr=v;async function ue(e,t){let o=async(s,a=1)=>{for(let d=0;d<=a;d++)try{let w=await co(s),P=Rr(s),c=new FormData;return c.append("file",new Blob([new Uint8Array(w)]),P),await Lr.upload(`platform/xy/media/upload?shopId=${encodeURIComponent(e)}`,c)}catch(w){if(d<a){await new Promise(P=>setTimeout(P,1e3));continue}throw w}throw new Error("unreachable")},r=await Promise.allSettled(t.map(o)),n=[],i=[];for(let s=0;s<r.length;s++){let a=r[s];if(a.status==="fulfilled")n.push(a.value);else{let d=a.reason;i.push({file:t[s],error:d instanceof Error?d.message:`${d}`})}}return{images:n,failed:i}}_();var pe=v;async function ge(e=16){return await pe.get("platform/xy/cat",E({spBizType:e}))??[]}async function fe(e){return await pe.get("platform/xy/props",E({channelCatId:e}))??[]}async function he(e,t,o){return await pe.get("platform/xy/props/value",E({channelCatId:e,propId:t,key:o}))??[]}D();function Nr(e){let t=e.charCodeAt(0);return t>=32&&t<=126}function Or(e){let t=0;for(let o=0;o<e.length;o++)t+=Nr(e[o])?.5:1;return t}function Lt(e,t=30){let o=Or(e);return o>t?`\u6807\u9898\u8FC7\u957F\uFF08${o}/${t}\uFF09\uFF0C\u95F2\u9C7C\u6807\u9898\u4E0A\u9650 30 \u4E2A\u6C49\u5B57\uFF08\u6216 60 \u4E2A\u82F1\u6587\u5B57\u7B26\uFF09`:null}var lo=99999999;function Nt(e,t="\u552E\u4EF7"){return e<=0?`${t}\u5FC5\u987B\u5927\u4E8E 0`:e>lo?`${t}\u4E0D\u80FD\u8D85\u8FC7 ${lo} \u5143`:null}var Dr=2e3,$r=1e4;function Br(e){let t=e.status?.toLowerCase()??"";return t===""||t==="init"||t==="pending"||t==="processing"}async function mo(e,t,o,r){r||process.stdout.write(L.cyan("\u23F3 \u6B63\u5728\u67E5\u8BE2\u4E0A\u67B6\u8FDB\u5EA6..."));let n=await W(()=>ie({stockGoodsId:e,shopId:t,platform:o}),{interval:Dr,timeout:$r,condition:i=>!Br(i)});return r||process.stdout.write("\r"+" ".repeat(30)+"\r"),n}function uo(){let e=new Ur("up");return e.description("\u4E0A\u67B6\u5546\u54C1\u5230\u95F2\u9C7C"),e.option("--stock-goods-id <id>","\u5E93\u5B58\u5546\u54C1ID\uFF08\u4ECE goods list \u83B7\u53D6\uFF09").option("--shop-id <id>","\u5E97\u94FAID\uFF08\u4ECE goods shops \u83B7\u53D6\uFF09").option("--price <amount>","\u4E0A\u67B6\u4EF7\u683C").option("-p, --platform <platform>","\u5E73\u53F0","xianyu").option("--json","\u8F93\u51FA JSON\uFF08Agent \u7528\uFF09").action(m(async t=>{if(t.json&&!(t.stockGoodsId&&t.shopId&&t.price)){h(t,"Agent \u6A21\u5F0F\u9700\u8981 --stock-goods-id, --shop-id, --price");return}if(t.stockGoodsId&&t.shopId&&t.price){let c=Number(t.stockGoodsId),x=t.shopId,wt=Number(t.price),je=t.platform,De=Nt(wt);if(De){h(t,De);return}let $e;try{$e=await Rt({stockGoodsId:c,shopId:x,price:wt,platform:je})}catch(U){let Qo=U instanceof Error?U.message:String(U),Fo=z(U);console.log(JSON.stringify(S({success:!1,error:Qo,errorType:Fo}))),process.exit(1)}let qt,Be,qe;try{qt=await mo(c,x,je,t.json)}catch(U){Be=U instanceof Error?U.message:String(U),qe=z(U)}let st={submit:$e};qt?st.listing=qt:(st.listing=null,st.warning=`\u63D0\u4EA4\u6210\u529F\u4F46\u56DE\u67E5\u5931\u8D25\uFF1A${Be}`,st.verifyStatus=qe),console.log(JSON.stringify(S({success:!0,data:st}),null,2));return}let o=await gt();if(o.length===0){console.log(L.yellow("\u6CA1\u6709\u5DF2\u6388\u6743\u5E97\u94FA\uFF0C\u8BF7\u5148\u8FD0\u884C r2-cli auth xianyu \u6388\u6743"));return}let r=await ye({message:"\u9009\u62E9\u5E97\u94FA",choices:o.map(c=>({name:`${c.shopName} (${c.platform})`,value:c.shopId}))}),n=await ft();if(n.length===0){console.log(L.yellow("\u6CA1\u6709\u53EF\u7528\u7684\u4ED3\u5E93"));return}let i=await ye({message:"\u9009\u62E9\u4ED3\u5E93",choices:n.map(c=>({name:c.stockName,value:c.stockId}))}),s=await ht({stockId:i,size:100});if(!s.items?.length){console.log(L.yellow("\u8BE5\u4ED3\u5E93\u6CA1\u6709\u53EF\u9009\u7684\u5546\u54C1"));return}let a=await ye({message:"\u9009\u62E9\u5546\u54C1",choices:s.items.map(c=>({name:`${c.goodsName} ${c.size?`| ${c.size}`:""} | \xA5${c.salePrice}`,value:c.stockGoodsId}))}),d=await Er({message:"\u8F93\u5165\u4E0A\u67B6\u4EF7\u683C",default:s.items.find(c=>c.stockGoodsId===a)?.salePrice?.toString()??"",validate:c=>Number(c)>0?!0:"\u4EF7\u683C\u5FC5\u987B\u4E3A\u6B63\u6570"});if(!await jr({message:`\u786E\u8BA4\u4E0A\u67B6\uFF1F\u4EF7\u683C \xA5${d}`,default:!0})){console.log(L.gray("\u5DF2\u53D6\u6D88"));return}let P=Number(a);await Rt({stockGoodsId:P,shopId:r,price:Number(d),platform:"xianyu"}),console.log(L.green("\u2713 \u4E0A\u67B6\u5DF2\u63D0\u4EA4\uFF0C\u6B63\u5728\u67E5\u8BE2\u8FDB\u5EA6..."));try{let c=await mo(P,r,"xianyu"),x=c.status?.toLowerCase()!=="failed";console.log(x?L.green("\u2713 \u4E0A\u67B6\u6210\u529F"):L.red("\u2717 \u4E0A\u67B6\u5931\u8D25")),console.log(JSON.stringify(c,null,2))}catch(c){let x=c instanceof Error?c.message:String(c);console.log(L.yellow("\u26A0 \u5DF2\u63D0\u4EA4\uFF0C\u4F46\u56DE\u67E5\u5931\u8D25\uFF1A"+x)),console.log(L.gray("\u2192 \u8BF7\u7528 r2-cli goods listing \u786E\u8BA4\u4E0A\u67B6\u7ED3\u679C"))}})),e}import{Command as Jr}from"commander";import wo from"chalk";function xo(){let e=new Jr("shops");return e.description("\u67E5\u770B\u6240\u6709\u5DF2\u6388\u6743\u5E97\u94FA\uFF08\u8DE8\u5E73\u53F0\uFF09"),e.option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09"),e.action(m(async t=>{let o=await gt();if(t.json){console.log(JSON.stringify(no(o),null,2));return}if(!o.length){console.log(wo.yellow("\u672A\u627E\u5230\u5DF2\u6388\u6743\u7684\u5E97\u94FA")),console.log(wo.gray(" \u63D0\u793A: \u8BF7\u5148\u5728\u7B2C\u4E8C\u56DE\u5408 APP \u4E2D\u6388\u6743\u5E97\u94FA"));return}let{ShopsTable:r}=await Promise.resolve().then(()=>(yo(),fo)),{renderComponent:n}=await Promise.resolve().then(()=>(ut(),St));n(r,{shops:o,platform:"all"})})),e}import{Command as zr}from"commander";import Wr from"chalk";function To(){let e=new zr("stocks");return e.description("\u67E5\u770B\u6240\u6709\u4ED3\u5E93"),e.option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09"),e.action(m(async t=>{let o=await ft();if(t.json){console.log(JSON.stringify(o,null,2));return}if(!o.length){console.log(Wr.yellow("\u672A\u627E\u5230\u4ED3\u5E93\u4FE1\u606F"));return}let{StocksTable:r}=await Promise.resolve().then(()=>(Co(),Io)),{renderComponent:n}=await Promise.resolve().then(()=>(ut(),St));n(r,{stocks:o})})),e}import{Command as Hr}from"commander";import rt from"chalk";function bo(){let e=new Hr("list");return e.description("\u67E5\u770B\u4ED3\u5E93\u4E2D\u7684\u9009\u54C1\u5546\u54C1"),e.option("--stock-id <id>","\u4ED3\u5E93 ID\uFF08\u4ECE goods stocks \u83B7\u53D6\uFF09").option("--stock-goods-id <id>","\u5E93\u5B58\u5546\u54C1 ID").option("--page <n>","\u9875\u7801","1").option("--size <n>","\u6BCF\u9875\u6570\u91CF\uFF08\u6700\u5927 50\uFF09","20").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09"),e.action(m(async t=>{let r=await ht({stockId:t.stockId||void 0,stockGoodsId:t.stockGoodsId||void 0,page:Number(t.page)||1,size:Math.min(Number(t.size)||20,50)})??{items:[],total:0};if(t.json){r.items?.length?console.log(JSON.stringify(r,null,2)):console.log(JSON.stringify({...r,hint:"\u9009\u54C1\u5546\u54C1\u4E3A\u7A7A\uFF0C\u8BF7\u5148\u5728\u540E\u53F0\u751F\u6210\u9009\u54C1\u8868\u6570\u636E\u540E\u518D\u8BD5"},null,2));return}if(!r.items?.length){console.log(rt.yellow("\u6682\u65E0\u9009\u54C1\u5546\u54C1\uFF0C\u8BF7\u5148\u7ED1\u5B9A\u4ED3\u5E93\u6216\u5728\u540E\u53F0\u751F\u6210\u9009\u54C1\u8868\u6570\u636E"));return}console.log(rt.cyan(`
39
+ \u9009\u54C1\u5546\u54C1\uFF08\u5171 ${r.total} \u4EF6\uFF0C\u7B2C ${r.page} \u9875\uFF09
40
+ `));for(let n of r.items)console.log(` ${rt.bold(n.goodsName)} ${n.size?rt.gray(`| ${n.size}`):""}`),console.log(` \u54C1\u724C: ${n.brand} \u5EFA\u8BAE\u552E\u4EF7: \xA5${n.salePrice} stockGoodsId: ${rt.green(n.stockGoodsId)}`),console.log(rt.gray(` \u5206\u7C7B: ${n.cate1Name} > ${n.cate2Name} > ${n.cate3Name}`)),console.log()})),e}import{Command as Zr}from"commander";import tn from"chalk";ut();Ut();import{Box as p,Text as g}from"ink";import{jsx as l,jsxs as ve}from"react/jsx-runtime";var Vr={init:{label:"\u5F85\u4E0A\u67B6",color:"yellow"},up:{label:"\u5DF2\u4E0A\u67B6",color:"green"},down:{label:"\u5DF2\u4E0B\u67B6",color:"gray"},fail:{label:"\u5931\u8D25",color:"red"},sold:{label:"\u5DF2\u552E\u51FA",color:"blue"}},ke=4,Re=8,Et=8,Le=8,Ne=8,Oe=11,jt=10,Dt=10,$t=12;function Yr({fillWidth:e}){return ve(p,{flexDirection:"row",children:[l(p,{width:ke,children:l(g,{bold:!0,color:"white",children:"ID"})}),l(p,{width:Re,children:l(g,{bold:!0,color:"white",children:"\u72B6\u6001"})}),l(p,{width:Et,children:l(g,{bold:!0,color:"white",children:"\u54C1\u724C"})}),l(p,{width:e,children:l(g,{bold:!0,color:"white",children:"\u5546\u54C1\u540D\u79F0"})}),l(p,{width:Le,children:l(g,{bold:!0,color:"white",children:"\u4EF7\u683C"})}),l(p,{width:Ne,children:l(g,{bold:!0,color:"white",children:"\u5E73\u53F0"})}),l(p,{width:Oe,children:l(g,{bold:!0,color:"white",children:"\u5E97\u94FA"})}),l(p,{width:jt,children:l(g,{bold:!0,color:"white",children:"\u4ED3\u5E93\u5546\u54C1"})}),l(p,{width:Dt,children:l(g,{bold:!0,color:"white",children:"\u8D27\u53F7"})}),l(p,{width:$t,children:l(g,{bold:!0,color:"white",children:"\u4E09\u65B9\u7F16\u53F7"})})]})}function Kr({item:e,fillWidth:t}){let o=Vr[e.status]??{label:e.status,color:"white"};return ve(p,{flexDirection:"row",children:[l(p,{width:ke,children:l(g,{color:"gray",children:e.id})}),l(p,{width:Re,children:l(g,{color:o.color,children:o.label})}),l(p,{width:Et,children:l(g,{color:"cyan",children:tt(e.brandName||"-",Et-1)})}),l(p,{width:t,children:l(g,{children:tt(e.goodsName,t-1)})}),l(p,{width:Le,children:ve(g,{color:"yellow",children:["\xA5",e.price]})}),l(p,{width:Ne,children:l(g,{color:"gray",children:e.platform})}),l(p,{width:Oe,children:l(g,{color:"gray",children:e.shopId})}),l(p,{width:jt,children:l(g,{color:"gray",children:tt(`${e.stockGoodsId}`,jt-1)})}),l(p,{width:Dt,children:l(g,{color:"gray",children:tt(e.goodsNo||"-",Dt-1)})}),l(p,{width:$t,children:l(g,{color:"gray",children:tt(e.thirdItemNo||"-",$t-1)})})]})}function Po({items:e,total:t}){let o=ke+Re+Et+Le+Ne+Oe+jt+Dt+$t,{fillWidth:r,totalWidth:n}=et(o);return l(ot,{title:"\u4E0A\u67B6\u5217\u8868",count:t,fillWidth:r,totalWidth:n,header:l(Yr,{fillWidth:r}),children:e.map(i=>l(Kr,{item:i,fillWidth:r},i.id))})}function Ao(){let e=new Zr("listing");return e.description("\u67E5\u8BE2\u4E0A\u67B6\u5546\u54C1\u5217\u8868"),e.option("--id <id>","\u4E0A\u67B6\u8BB0\u5F55 ID").option("--stock-goods-id <id>","\u5E93\u5B58\u5546\u54C1 ID").option("--shop-id <id>","\u5E97\u94FA ID").option("--stock-id <id>","\u4ED3\u5E93 ID").option("-s, --status <status>","\u72B6\u6001\u8FC7\u6EE4\uFF08init/up/down/fail/sold\uFF09").option("-p, --platform <platform>","\u5E73\u53F0","xianyu").option("--page <n>","\u9875\u7801","1").option("--size <n>","\u6BCF\u9875\u6570\u91CF\uFF08\u6700\u5927 50\uFF09","20").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09"),e.action(m(async t=>{let r=await le({id:t.id,stockGoodsId:t.stockGoodsId?Number(t.stockGoodsId):void 0,shopId:t.shopId,stockId:t.stockId,status:t.status,platform:t.platform,page:Number(t.page)||1,size:Math.min(Number(t.size)||20,50)})??{items:[],total:0};if(t.json){r.items?.length?console.log(JSON.stringify(r,null,2)):console.log(JSON.stringify({...r,hint:"\u6682\u65E0\u4E0A\u67B6\u8BB0\u5F55"},null,2));return}if(!r.items?.length){console.log(tn.yellow("\u6682\u65E0\u4E0A\u67B6\u8BB0\u5F55"));return}Vt(Po,{items:r.items,total:Number(r.total)})})),e}import{Command as en}from"commander";import on from"chalk";function vo(){let e=new en("down");return e.description("\u4E0B\u67B6\u95F2\u9C7C\u5546\u54C1"),e.option("--id <id>","\u4E0A\u67B6\u8BB0\u5F55 ID").option("--stock-goods-id <id>","\u5E93\u5B58\u5546\u54C1 ID").option("--shop-id <id>","\u5E97\u94FA ID").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09"),e.action(m(async t=>{if(!t.id&&!(t.stockGoodsId&&t.shopId)){h(t,"\u8BF7\u6307\u5B9A\u4E0B\u67B6\u6761\u4EF6\uFF1A--id <id> \u6216 --stock-goods-id <id> --shop-id <id>");return}let o={};t.id&&(o.id=t.id),t.stockGoodsId&&(o.stockGoodsId=Number(t.stockGoodsId)),t.shopId&&(o.shopId=t.shopId),t.json||console.log(on.cyan("\u{1F4E6} \u6B63\u5728\u4E0B\u67B6\u5546\u54C1..."));let r=await se(o);y(t,r,"\u2705 \u4E0B\u67B6\u6210\u529F")})),e}import{Command as rn}from"commander";import nn from"chalk";function ko(){let e=new rn("price");return e.description("\u4FEE\u6539\u95F2\u9C7C\u4E0A\u67B6\u5546\u54C1\u4EF7\u683C"),e.option("--id <id>","\u4E0A\u67B6\u8BB0\u5F55 ID").option("--stock-goods-id <id>","\u5E93\u5B58\u5546\u54C1 ID").option("--shop-id <id>","\u5E97\u94FA ID").option("--price <amount>","\u65B0\u4EF7\u683C\uFF08\u5FC5\u586B\uFF09").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09"),e.action(m(async t=>{if(!t.price){h(t,"--price <amount> \u4E3A\u5FC5\u586B\u53C2\u6570");return}if(!t.id&&!(t.stockGoodsId&&t.shopId)){h(t,"\u8BF7\u6307\u5B9A\u5546\u54C1\uFF1A--id <id> \u6216 --stock-goods-id <id> --shop-id <id>");return}let o={price:Number(t.price)};t.id&&(o.id=t.id),t.stockGoodsId&&(o.stockGoodsId=Number(t.stockGoodsId)),t.shopId&&(o.shopId=t.shopId),t.json||console.log(nn.cyan(`\u{1F4B0} \u6B63\u5728\u4FEE\u6539\u4EF7\u683C\u4E3A ${t.price}...`));let r=await ae(o);y(t,r,"\u2705 \u4EF7\u683C\u4FEE\u6539\u6210\u529F")})),e}import{Command as sn}from"commander";import an from"chalk";function Ro(){let e=new sn("edit");return e.description("\u4FEE\u6539\u5DF2\u4E0A\u67B6\u5546\u54C1\u4FE1\u606F\uFF08\u6807\u9898\u3001\u63CF\u8FF0\u3001\u54C1\u724C\u3001\u7C7B\u76EE\u3001\u56FE\u7247\u3001\u5C5E\u6027\u7B49\uFF09"),e.option("--id <id>","\u5546\u54C1\u4E0A\u67B6 ID\uFF08goodsListingId\uFF0C\u63A8\u8350\uFF09").option("--stock-goods-id <id>","\u5E93\u5B58\u5546\u54C1 ID\uFF08\u4E0E --account \u914D\u5408\uFF09").option("--account <shopId>","\u95F2\u9C7C\u7528\u6237\u540D/\u5E97\u94FA ID\uFF08\u4E0E --stock-goods-id \u914D\u5408\uFF09").option("--title <title>","\u5546\u54C1\u6807\u9898").option("--desc <desc>","\u5546\u54C1\u63CF\u8FF0").requiredOption("--category-id <id>","\u5546\u54C1\u7C7B\u76EE ID\uFF08\u5927\u5206\u7C7B\uFF0C\u540E\u7AEF\u5FC5\u586B\uFF09").requiredOption("--channel-cat-id <id>","\u6E20\u9053\u7C7B\u76EE ID\uFF08\u5C0F\u5206\u7C7B\uFF0C\u540E\u7AEF\u5FC5\u586B\uFF09").option("--image-ids <ids>","\u56FE\u7247 ID \u5217\u8868\uFF08\u9017\u53F7\u5206\u9694\uFF09").option("--item-attrs <json>","\u5546\u54C1\u5C5E\u6027\u5217\u8868\uFF08JSON \u5B57\u7B26\u4E32\uFF09").option("--brand-name <name>","\u54C1\u724C\u540D\u79F0").option("--stuff-status <status>","\u6210\u8272\u7B49\u7EA7\uFF1A100=\u5168\u65B0 -1=\u51C6\u65B0 99=99\u65B0 95=95\u65B0 90=9\u65B0").option("--goods-no <no>","\u8D27\u53F7").option("--original-price <price>","\u539F\u4EF7\uFF08\u5355\u4F4D\uFF1A\u5143\uFF09").option("--size <size>","\u5C3A\u7801").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09"),e.action(m(async t=>{if(!t.id&&!(t.stockGoodsId&&t.account)){h(t,"\u8BF7\u6307\u5B9A\u5546\u54C1\uFF1A--id <goodsListingId> \u6216 --stock-goods-id <id> --account <shopId>");return}let o={categoryId:Number(t.categoryId),channelCatId:t.channelCatId};if(t.id&&(o.goodsListingId=Number(t.id)),t.stockGoodsId&&(o.stockGoodsId=Number(t.stockGoodsId)),t.account&&(o.account=t.account),t.title){let i=Lt(t.title);if(i){h(t,i);return}o.title=t.title}if(t.desc&&(o.desc=t.desc),t.imageIds&&(o.imageIdList=t.imageIds.split(",").map(i=>i.trim())),t.brandName&&(o.brandName=t.brandName),t.stuffStatus&&(o.stuffStatus=Number(t.stuffStatus)),t.goodsNo&&(o.goodsNo=t.goodsNo),t.originalPrice&&(o.originalPrice=Number(t.originalPrice)),t.size&&(o.size=t.size),t.itemAttrs)try{o.itemAttrList=JSON.parse(t.itemAttrs)}catch{h(t,"--item-attrs JSON \u89E3\u6790\u5931\u8D25");return}if(!Object.keys(o).some(i=>!["goodsListingId","stockGoodsId","account"].includes(i))){h(t,"\u672A\u6307\u5B9A\u9700\u8981\u4FEE\u6539\u7684\u5B57\u6BB5");return}t.json||console.log(an.cyan("\u6B63\u5728\u4FEE\u6539\u5546\u54C1\u4FE1\u606F..."));let n=await ce(o);y(t,n,"\u2705 \u5546\u54C1\u4FE1\u606F\u4FEE\u6539\u6210\u529F")})),e}import{Command as fn}from"commander";import{Command as cn}from"commander";import Ue from"chalk";function Lo(){return new cn("categories").description("\u83B7\u53D6\u95F2\u9C7C\u7C7B\u76EE\u5217\u8868\uFF08\u5927\u5206\u7C7B \u2192 \u5C0F\u5206\u7C7B\uFF09").option("--sp-biz-type <n>","\u4E1A\u52A1\u5206\u7C7B\uFF0C16=\u5962\u54C1","16").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09").action(m(async e=>{let t=await ge(Number(e.spBizType));if(e.json){console.log(JSON.stringify(t,null,2));return}let o=new Map;for(let r of t){let n=String(r.catId);o.has(n)||o.set(n,{catName:r.catName,children:[]}),o.get(n).children.push({channel:r.channel,channelCatId:r.channelCatId})}for(let[r,n]of o){console.log(Ue.bold(`${n.catName} (catId: ${Ue.green(r)})`));for(let i of n.children)console.log(` ${i.channel} (channelCatId: ${Ue.green(i.channelCatId)})`)}}))}import{Command as ln}from"commander";import No from"chalk";function Oo(){return new ln("props").description("\u83B7\u53D6\u6307\u5B9A\u7C7B\u76EE\u4E0B\u7684\u5C5E\u6027\u5217\u8868\uFF08\u542B\u53EF\u9009\u503C\uFF09").requiredOption("--channel-cat-id <id>","\u5C0F\u5206\u7C7B ID\uFF08\u4ECE categories \u83B7\u53D6\uFF09").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09").action(m(async e=>{let t=await fe(e.channelCatId);if(e.json){console.log(JSON.stringify(t,null,2));return}for(let o of t)if(console.log(No.bold(`
41
+ ${o.propName} (propId: ${o.propId})`)),o.propsValues?.length)for(let r of o.propsValues)console.log(` ${r.valueName} (valueId: ${r.valueId})`);else console.log(No.gray(" \uFF08\u4F7F\u7528 brands \u5B50\u547D\u4EE4\u641C\u7D22\uFF09"))}))}import{Command as dn}from"commander";import mn from"chalk";function Uo(){return new dn("brands").description("\u641C\u7D22\u95F2\u9C7C\u54C1\u724C\uFF08\u6309\u5173\u952E\u5B57\u8FC7\u6EE4\uFF09").requiredOption("--channel-cat-id <id>","\u5C0F\u5206\u7C7B ID").requiredOption("--prop-id <id>","\u5C5E\u6027 ID\uFF08\u54C1\u724C\u5C5E\u6027\u7684 propId\uFF09").requiredOption("--key <keyword>","\u641C\u7D22\u5173\u952E\u5B57").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09").action(m(async e=>{let t=await he(e.channelCatId,e.propId,e.key);if(e.json){console.log(JSON.stringify(t,null,2));return}if(!t.length){console.log(mn.yellow("\u672A\u627E\u5230\u5339\u914D\u7684\u54C1\u724C"));return}for(let o of t)console.log(` ${o.valueName} (valueId: ${o.valueId})`)}))}import{Command as un}from"commander";import Ee from"chalk";function Eo(){return new un("upload-images").description("\u6279\u91CF\u4E0A\u4F20\u56FE\u7247\u5230\u95F2\u9C7C\uFF08\u6302\u552E\u524D\u5FC5\u987B\u5148\u4E0A\u4F20\u56FE\u7247\uFF09").requiredOption("--shop-id <id>","\u5E97\u94FA ID").requiredOption("--files <paths>","\u56FE\u7247\u6587\u4EF6\u8DEF\u5F84\uFF0C\u9017\u53F7\u5206\u9694").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09").action(m(async e=>{let t=e.files.split(",").map(n=>n.trim()).filter(Boolean);if(t.length===0){h(e,"\u8BF7\u63D0\u4F9B\u81F3\u5C11\u4E00\u5F20\u56FE\u7247");return}e.json||console.log(Ee.cyan(`\u6B63\u5728\u4E0A\u4F20 ${t.length} \u5F20\u56FE\u7247...`));let{images:o,failed:r}=await ue(e.shopId,t);if(e.json){let n={success:!0,images:o};r.length&&(n.warning=`${r.length} \u5F20\u56FE\u7247\u4E0A\u4F20\u5931\u8D25`,n.failed=r),console.log(JSON.stringify(n,null,2))}else{if(o.length){console.log(Ee.green(`\u4E0A\u4F20\u6210\u529F\uFF0C\u5171 ${o.length} \u5F20`));for(let n of o)console.log(` \u56FE\u7247ID: ${n.value}`)}if(r.length){console.log(Ee.yellow(`
42
+ ${r.length} \u5F20\u4E0A\u4F20\u5931\u8D25:`));for(let n of r)console.log(` ${n.file}: ${n.error}`)}}}))}import{Command as pn}from"commander";import nt from"chalk";var gn={100:"\u5168\u65B0",[-1]:"\u51C6\u65B0",99:"99\u65B0",95:"95\u65B0",90:"9\u65B0"};function jo(){return new pn("submit").description("\u63D0\u4EA4\u6302\u552E\u4E0A\u67B6").requiredOption("--shop-id <id>","\u5E97\u94FA ID\uFF08\u5373\u95F2\u9C7C\u7528\u6237\u540D account\uFF09").requiredOption("--title <title>","\u5546\u54C1\u6807\u9898").requiredOption("--price <amount>","\u552E\u4EF7").requiredOption("--category-id <id>","\u5927\u5206\u7C7B ID\uFF08\u4ECE categories \u83B7\u53D6\uFF09").requiredOption("--channel-cat-id <id>","\u5C0F\u5206\u7C7B ID\uFF08\u4ECE categories \u83B7\u53D6\uFF09").requiredOption("--image-ids <ids>","\u56FE\u7247 ID \u5217\u8868\uFF0C\u9017\u53F7\u5206\u9694\uFF08\u5148\u901A\u8FC7 upload-images \u83B7\u53D6\uFF09").requiredOption("--stuff-status <n>","\u6210\u8272\uFF1A100 \u5168\u65B0 / -1 \u51C6\u65B0 / 99 99\u65B0 / 95 95\u65B0 / 90 9\u65B0").option("--item-attrs <json>",'\u5546\u54C1\u5C5E\u6027\u5217\u8868 JSON\uFF0C\u683C\u5F0F: [{"valueName":"x","valueId":"y","propId":"z"}]').option("--brand-name <name>","\u54C1\u724C\u540D\u79F0").requiredOption("--desc <desc>","\u5546\u54C1\u63CF\u8FF0").option("--size <size>","\u5C3A\u7801").option("--goods-no <no>","\u8D27\u53F7").option("--original-price <amount>","\u539F\u4EF7").option("--trade-type <n>","\u4EA4\u6613\u65B9\u5F0F\uFF1A0 \u4EC5\u5728\u7EBF / 1 \u4EC5\u7EBF\u4E0B / 2 \u7EBF\u4E0A\u6216\u7EBF\u4E0B","0").option("--transport-fee <amount>","\u8FD0\u8D39\uFF08\u9ED8\u8BA4 0 \u5305\u90AE\uFF09","0").option("--yhb","\u662F\u5426\u5F00\u542F\u9A8C\u8D27\u5B9D").requiredOption("--out-item-no <no>","\u5546\u5BB6\u7F16\u7801\uFF08\u540C\u5E97\u94FA\u552F\u4E00\uFF0C\u7528\u6237\u81EA\u5B9A\u4E49\uFF09").option("--division-id <id>","\u884C\u653F\u533A\u5212 ID\uFF08\u5E02\u7EA7 ID\uFF0C\u9ED8\u8BA4\u676D\u5DDE 330100\uFF09","330100").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09").action(m(async e=>{let t=Lt(e.title);if(t){h(e,t);return}let o=Number(e.price),r=Nt(o);if(r){h(e,r);return}let n=e.imageIds.split(",").map(d=>d.trim()),i=e.itemAttrs?JSON.parse(e.itemAttrs):void 0,s={account:e.shopId,title:e.title,reservePrice:Number(e.price),categoryId:Number(e.categoryId),channelCatId:e.channelCatId,imageIdList:n,stuffStatus:Number(e.stuffStatus),itemBizType:2,spBizType:"16",tradeType:Number(e.tradeType)||0,transportFee:Number(e.transportFee)||0,yhb:e.yhb??!1,...e.brandName&&{brandName:e.brandName},desc:e.desc,...e.size&&{size:e.size},...e.goodsNo&&{goodsNo:e.goodsNo},...e.originalPrice&&{originalPrice:Number(e.originalPrice)},...i?.length&&{itemAttrList:i},outItemNo:e.outItemNo,divisionId:Number(e.divisionId)||330100,apiAfterSalesDo:{supportFd10msPolicy:!1,supportFd24hsPolicy:!1,supportNfrPolicy:!1,supportSdrPolicy:!1,supportVnrPolicy:!1,supportGpaPolicy:!1,supportFd48hsPolicy:!1}};e.json||(console.log(nt.cyan("\u6B63\u5728\u63D0\u4EA4\u6302\u552E...")),console.log(nt.gray(` \u6807\u9898: ${s.title}`)),console.log(nt.gray(` \u552E\u4EF7: \xA5${s.reservePrice}`)),console.log(nt.gray(` \u6210\u8272: ${gn[s.stuffStatus]??s.stuffStatus}`)),console.log(nt.gray(` \u56FE\u7247: ${n.length} \u5F20`)),i?.length&&console.log(nt.gray(` \u5C5E\u6027: ${i.length} \u9879`)));let a=await de(s);y(e,a,"\u6302\u552E\u63D0\u4EA4\u6210\u529F")}))}function Do(){let e=new fn("hang-up");return e.description("\u95F2\u9C7C\u6302\u552E\u4E0A\u67B6\uFF08\u5B8C\u6574\u5546\u54C1\u4FE1\u606F\u6A21\u5F0F\uFF09"),e.addCommand(Lo()),e.addCommand(Oo()),e.addCommand(Uo()),e.addCommand(Eo()),e.addCommand(jo()),e}function $o(){let e=new hn("goods");return e.description("\u5546\u54C1\u7BA1\u7406"),e.addCommand(xo()),e.addCommand(To()),e.addCommand(bo()),e.addCommand(Ao()),e.addCommand(vo()),e.addCommand(ko()),e.addCommand(Ro()),e.addCommand(uo()),e.addCommand(Do()),e}import{Command as yn}from"commander";import yt from"chalk";import{promises as wn}from"node:fs";import xn from"node:path";import In from"node:os";import{spawn as Sn}from"node:child_process";var Bo="@round2ai/r2-cli";function Cn(){return new Promise(e=>{let t=Sn("npm",["uninstall","-g",Bo],{stdio:"inherit",shell:!0});t.on("exit",o=>e(o??1)),t.on("error",()=>e(1))})}function qo(){let e=new yn("uninstall");return e.description("\u5378\u8F7D R2-CLI \u5E76\u6E05\u9664\u6240\u6709\u914D\u7F6E").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09"),e.action(m(async t=>{let o=xn.join(In.homedir(),".r2-cli"),r=!0;try{await wn.rm(o,{recursive:!0,force:!0})}catch{r=!1}let n=await Cn(),i=n===0;if(t.json){y(t,{configCleared:r,npmUninstalled:i,exitCode:n});return}console.log(r?yt.green("\u2705 \u914D\u7F6E\u6587\u4EF6\u5DF2\u6E05\u9664"):yt.yellow("\u26A0\uFE0F \u914D\u7F6E\u76EE\u5F55\u4E0D\u5B58\u5728\u6216\u65E0\u6CD5\u5220\u9664\uFF08\u53EF\u5FFD\u7565\uFF09")),i?console.log(yt.green(`\u2705 ${Bo} \u5DF2\u5378\u8F7D`)):(console.log(yt.yellow(`\u26A0\uFE0F npm \u5378\u8F7D\u5931\u8D25 (exit code: ${n})`)),console.log(yt.gray(" \u5982\u901A\u8FC7 yarn/pnpm \u5B89\u88C5\uFF0C\u8BF7\u624B\u52A8\u5378\u8F7D")))})),e}import{Command as kn}from"commander";import Go from"chalk";import{spawn as Rn,execSync as Ln}from"node:child_process";import{readFileSync as Tn}from"node:fs";import{dirname as bn,join as Pn}from"node:path";import{fileURLToPath as An}from"node:url";var vn=bn(An(import.meta.url));function Bt(){for(let e of["../package.json","../../package.json"])try{return JSON.parse(Tn(Pn(vn,e),"utf-8")).version}catch{}return"0.0.0"}var _o="@round2ai/r2-cli";function Nn(e,t){return new Promise(o=>{let r=Rn(e,t,{stdio:"inherit"});r.on("close",n=>o(n??1)),r.on("error",()=>o(1))})}function Xo(){return new kn("update").description("\u4E00\u952E\u66F4\u65B0 CLI \u548C\u6280\u80FD").option("--json","\u8F93\u51FA JSON\uFF08\u4F9B AI Agent \u4F7F\u7528\uFF09").action(m(async e=>{let t=Bt();if(e.json||(console.log(Go.cyan(`\u5F53\u524D\u7248\u672C: ${t}`)),console.log(Go.cyan("\u6B63\u5728\u66F4\u65B0 CLI..."))),await Nn("npm",["install","-g",`${_o}@latest`])!==0)throw new Error(`\u66F4\u65B0\u5931\u8D25\uFF0C\u8BF7\u624B\u52A8\u8FD0\u884C: npm install -g ${_o}@latest`);let r=t;try{r=Ln("r2-cli --version",{encoding:"utf-8"}).trim()||t}catch{}y(e,{oldVersion:t,newVersion:r},`
43
+ \u2713 \u66F4\u65B0\u5B8C\u6210: ${t} \u2192 ${r}
44
+ \u2713 \u6280\u80FD\u5DF2\u540C\u6B65\u66F4\u65B0`)}))}function Jo(e){let t=e.command("auth").description("\u6388\u6743\u7BA1\u7406");t.addCommand(ee()),t.addCommand(oe()),t.addCommand(re()),t.addCommand(ne()),e.addCommand($o()),e.addCommand(qo()),e.addCommand(Xo())}async function Un(){let{default:e}=await import("figlet");console.log(it.cyan.bold(e.textSync("R2-CLI",{font:"Standard",horizontalLayout:"full"}))),console.log(it.gray(` \u5411 AI \u5F00\u653E\u4E8C\u624B\u6F6E\u5962\u4EA4\u6613\u5168\u94FE\u8DEF\u80FD\u529B
45
+ `))}function En(){let e=new On;e.name("r2-cli").description("R2-CLI\uFF0C\u5411 AI \u5F00\u653E\u4E8C\u624B\u6F6E\u5962\u4EA4\u6613\u5168\u94FE\u8DEF\u80FD\u529B");let t=Bt();t==="0.0.0"&&console.error(it.yellow("Warning: unable to read version from package.json")),e.version(`r2-cli version ${t}`,"-v, --version");let o=ro(t);return e.configureOutput({writeErr:r=>{console.error(it.red(r.replace("error:","").trim()))}}),e.action(async()=>{await Un(),e.help()}),Jo(e),{program:e,updateCheckPromise:o}}function Mo(){console.log(it.gray(`
46
+ \u64CD\u4F5C\u5DF2\u53D6\u6D88`)),process.exit(130)}process.on("SIGINT",Mo);process.on("SIGTERM",Mo);var{program:jn,updateCheckPromise:Dn}=En();jn.parse(process.argv);Dn.catch(e=>{console.error(it.gray(`[update-check] ${e instanceof Error?e.message:String(e)}`))});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@round2ai/r2-cli",
3
- "version": "1.0.14",
3
+ "version": "1.0.16",
4
4
  "description": "R2-CLI,向 AI 开放二手潮奢交易全链路能力",
5
5
  "main": "dist/r2-cli.js",
6
6
  "type": "module",
@@ -34,6 +34,9 @@
34
34
  ],
35
35
  "author": "Round2AI - PURESNAKE Team",
36
36
  "license": "MIT",
37
+ "publishConfig": {
38
+ "access": "public"
39
+ },
37
40
  "engines": {
38
41
  "node": ">=18.0.0"
39
42
  },
@@ -49,7 +52,8 @@
49
52
  "ink": "^7.0.0",
50
53
  "ora": "^9.3.0",
51
54
  "qrcode": "^1.5.4",
52
- "react": "^19.2.5"
55
+ "react": "^19.2.5",
56
+ "sharp": "^0.34.5"
53
57
  },
54
58
  "devDependencies": {
55
59
  "@types/node": "^25.5.2",