@puyinkai/xiaobao-cli 0.5.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/README.md +6 -0
  2. package/dist/add-CCuWFy1O.mjs +21 -0
  3. package/dist/{admin-BOL_otwc.mjs → admin-CpPlecd5.mjs} +2 -2
  4. package/dist/analyze-DsiZ9O18.mjs +72 -0
  5. package/dist/{api-client-D3sCv6L3.mjs → api-client-JrgUZpe8.mjs} +19 -1
  6. package/dist/{api-BaX_r5S5.mjs → api-nDku2tzx.mjs} +1 -1
  7. package/dist/{audio-DzcmDYVu.mjs → audio-D-XxOe-n.mjs} +3 -2
  8. package/dist/{auth-DvvYyJBK.mjs → auth-sQwZSTNA.mjs} +4 -4
  9. package/dist/beautx-CK9SR4Tg.mjs +16 -0
  10. package/dist/cli.mjs +20 -13
  11. package/dist/config-WGgTcEU1.mjs +11 -0
  12. package/dist/{consultant-Ccnjnhzz.mjs → consultant-aWz8jHvH.mjs} +1 -1
  13. package/dist/{customer-D_LctjqX.mjs → customer-B410Tvlz.mjs} +1 -1
  14. package/dist/date-BcQMKhIT.mjs +21 -0
  15. package/dist/deal-analysis-C3yn-bFg.mjs +10 -0
  16. package/dist/diff-8I1_L-nU.mjs +21 -0
  17. package/dist/{doc-CC08fj8m.mjs → doc-CrY6qNkG.mjs} +1 -1
  18. package/dist/{doc-content-DktnDECM.mjs → doc-content-YKxaMDEp.mjs} +1 -1
  19. package/dist/{docs-DtQy3Zoc.mjs → docs-BpowF7jz.mjs} +1 -1
  20. package/dist/fields-iyCGxxkh.mjs +54 -0
  21. package/dist/{focus-BPPyRCBb.mjs → focus-DFxVA1UZ.mjs} +1 -1
  22. package/dist/follow-BLq9XK6s.mjs +14 -0
  23. package/dist/get-Cvl1PgHr.mjs +66 -0
  24. package/dist/{kb-DpBUFdFV.mjs → kb-B1sxz-PW.mjs} +4 -4
  25. package/dist/last-7-days-VKMMIzDz.mjs +5 -0
  26. package/dist/list-B8QkIq76.mjs +76 -0
  27. package/dist/{list-Ca5Fvq_e.mjs → list-BZVeH1P0.mjs} +2 -2
  28. package/dist/{list-DPyzRkq4.mjs → list-Bu9oehY8.mjs} +1 -1
  29. package/dist/{list-DciEIXpx.mjs → list-BvZ0SnDf.mjs} +2 -2
  30. package/dist/{list-xbJZbyGQ.mjs → list-C3bNdA1t.mjs} +2 -2
  31. package/dist/{list-CTSX1XuK.mjs → list-CjLiGMIC.mjs} +2 -2
  32. package/dist/{list-D_8QLOZ1.mjs → list-CtICqXPF.mjs} +2 -2
  33. package/dist/list-D3P2E5vT.mjs +43 -0
  34. package/dist/{list-Ikc5mo6a.mjs → list-DqLKhW5s.mjs} +1 -1
  35. package/dist/now-Ce3ViNOw.mjs +9 -0
  36. package/dist/plan-DC7ZFHWK.mjs +10 -0
  37. package/dist/portrait-D6oQPQfC.mjs +14 -0
  38. package/dist/portrait-tags-DGjYKGDf.mjs +10 -0
  39. package/dist/{project-CYA9qd8k.mjs → project-UkyNWPm6.mjs} +3 -3
  40. package/dist/{qa-CDYWW-19.mjs → qa-Dm1X6IoO.mjs} +1 -1
  41. package/dist/{quantum-Dyhp2Clf.mjs → quantum-DIuY6j7I.mjs} +3 -3
  42. package/dist/range-CSJiXTp3.mjs +18 -0
  43. package/dist/{resistance-BhlYgeUx.mjs → resistance-B-v-lfkT.mjs} +1 -1
  44. package/dist/{sales-report-BIfyfucO.mjs → sales-report-Daps9Vr5.mjs} +1 -1
  45. package/dist/{search-ChFFOKV4.mjs → search-VsAp96Co.mjs} +2 -2
  46. package/dist/shared-BEkL4JRB.mjs +11 -0
  47. package/dist/shared-CYALikq5.mjs +277 -0
  48. package/dist/shared-DtIllnrz.mjs +92 -0
  49. package/dist/subtract-B4XTXD_X.mjs +21 -0
  50. package/dist/{summary-C3poiB2C.mjs → summary-CF2uhuE3.mjs} +2 -2
  51. package/dist/summary-CgBgJOw2.mjs +65 -0
  52. package/dist/{text-K7uP8bat.mjs → text-8R0TuzgK.mjs} +1 -1
  53. package/dist/this-month-BRdfmc1s.mjs +5 -0
  54. package/dist/this-week-2GoqEaXU.mjs +5 -0
  55. package/dist/today-BhQnSMJH.mjs +5 -0
  56. package/dist/today-CdlU96lq.mjs +9 -0
  57. package/dist/today-so-far-D2g98rKv.mjs +5 -0
  58. package/dist/{token-usage-y46b3_7C.mjs → token-usage-BvWb3N3J.mjs} +1 -1
  59. package/dist/tomorrow-BgSEBV69.mjs +9 -0
  60. package/dist/{visit-qf8Lwf_s.mjs → visit-4xsa_DFD.mjs} +2 -2
  61. package/dist/visit-evaluate-BvmghATK.mjs +9 -0
  62. package/dist/weekday-CgEg7n7U.mjs +14 -0
  63. package/dist/yesterday-CHAh1DlJ.mjs +5 -0
  64. package/dist/yesterday-DW-YiRTt.mjs +9 -0
  65. package/package.json +1 -1
  66. package/skills/wangxiaobao-audio-analyze/SKILL.md +42 -0
  67. package/skills/wangxiaobao-beautx/SKILL.md +42 -0
  68. package/skills/wangxiaobao-customer-portrait/SKILL.md +45 -0
  69. package/skills/wangxiaobao-customer-query/SKILL.md +1 -1
  70. package/skills/wangxiaobao-follow-query/SKILL.md +45 -0
  71. package/skills/wangxiaobao-quantum-stats/SKILL.md +3 -1
  72. package/skills/wangxiaobao-quantum-stats/references/quantum-metrics.md +3 -2
  73. package/skills/wangxiaobao-shared/SKILL.md +5 -1
  74. /package/dist/{current-CaUOiS5G.mjs → current-ABh6R3vp.mjs} +0 -0
  75. /package/dist/{login-COK74GKN.mjs → login-Bp2W2Hnj.mjs} +0 -0
  76. /package/dist/{logout-BQnDwD5-.mjs → logout-BnoEQxKZ.mjs} +0 -0
  77. /package/dist/{status-DR0tFzju.mjs → status-CrpCtf5U.mjs} +0 -0
  78. /package/dist/{use-DwoZynR9.mjs → use-rAR4OVC7.mjs} +0 -0
  79. /package/dist/{util-pyTg7qwY.mjs → util-BuoFIeLS.mjs} +0 -0
  80. /package/dist/{whoami-CtuWBu20.mjs → whoami-oRc8gILN.mjs} +0 -0
package/README.md CHANGED
@@ -56,6 +56,12 @@ xiaobao-cli audio list --from "2026-05-01 00:00:00" --to "2026-05-02 00:00:00" -
56
56
  | `kb doc <doc-id>` | 新增 · 知识库文档详情 |
57
57
  | `kb doc-content <doc-id> [--offset] [--limit]` | 新增 · 知识库文档正文分页 |
58
58
  | `quantum <metric> [--view] [--visit-type] …` | 新增 · 量子看板 / KPI 统计(20 指标) |
59
+ | `follow list` / `follow summary` | 新增 · 旺跟进明细分页 / 电话微信指标汇总 |
60
+ | `portrait list` / `portrait get <字段>` | 新增 · 画像字段清单 / 单字段饼图分布 |
61
+ | `config fields` | 新增 · 客户字段配置字典(解读 dynamic_tags) |
62
+ | `audio analyze <query> [--customer-id]` | 新增 · 录音批量分析(LLM) |
63
+ | `beautx plan\|deal-analysis\|portrait-tags\|visit-evaluate` | 新增 · 医美四查询 |
64
+ | `date now\|today\|range this-week …` | 新增 · 本地日期工具(不走网络) |
59
65
  | `admin sales-report --from --to [--by project\|zone]` | 新增 · 公司经营数据 出库/回款(super-admin,独立白名单) |
60
66
  | `admin token-usage --from --to [--model] …` | 新增 · LLM token 用量(super-admin,独立白名单) |
61
67
  | `api <METHOD> <path>` | `xiaobao_api` |
@@ -0,0 +1,21 @@
1
+ import { n as parsePositiveDays, r as addDays, t as defineDateCommand } from "./shared-CYALikq5.mjs";
2
+ //#region src/commands/date/add.ts
3
+ var add_default = defineDateCommand({
4
+ name: "add",
5
+ description: "日期往后推 N 天",
6
+ args: {
7
+ date: {
8
+ type: "positional",
9
+ required: true,
10
+ description: "基准日期 YYYY-MM-DD"
11
+ },
12
+ days: {
13
+ type: "positional",
14
+ required: true,
15
+ description: "往后推的天数(非负整数)"
16
+ }
17
+ },
18
+ run: ({ args }) => addDays(args.date, parsePositiveDays(args.days, "days"), args.timezone)
19
+ });
20
+ //#endregion
21
+ export { add_default as default };
@@ -6,8 +6,8 @@ var admin_default = defineCommand({
6
6
  description: "super-admin 经营报表:公司经营数据(出库/回款)/ LLM token 用量(独立白名单)"
7
7
  },
8
8
  subCommands: {
9
- "sales-report": () => import("./sales-report-BIfyfucO.mjs").then((m) => m.default),
10
- "token-usage": () => import("./token-usage-y46b3_7C.mjs").then((m) => m.default)
9
+ "sales-report": () => import("./sales-report-Daps9Vr5.mjs").then((m) => m.default),
10
+ "token-usage": () => import("./token-usage-BvWb3N3J.mjs").then((m) => m.default)
11
11
  }
12
12
  });
13
13
  //#endregion
@@ -0,0 +1,72 @@
1
+ import { o as resolveConfig } from "./device-flow-j10PFOQL.mjs";
2
+ import { t as xbApiFetch } from "./api-client-JrgUZpe8.mjs";
3
+ import { n as requireActiveProject } from "./project-store-CudTRvbA.mjs";
4
+ import { t as tenantProjectHeaders } from "./headers-Dy5gROBB.mjs";
5
+ import { n as writeResult, t as writeError } from "./format-DfVypHID.mjs";
6
+ import { t as csvToArray } from "./util-BuoFIeLS.mjs";
7
+ import { defineCommand } from "citty";
8
+ //#region src/commands/audio/analyze.ts
9
+ /**
10
+ * `xiaobao-cli audio analyze` — 录音批量分析(LLM)。
11
+ *
12
+ * 对指定客户/顾问范围的录音做 LLM 分析(共性抗性、话术问题等开放问题)。
13
+ * 与 `audio list/text`(元数据/逐字稿查询)不同,这是耗时的生成式分析。
14
+ * 调 POST /ai-open/audio/analyze。
15
+ */
16
+ var analyze_default = defineCommand({
17
+ meta: {
18
+ name: "analyze",
19
+ description: "录音批量分析(LLM,耗时较长;元数据查询用 audio list)"
20
+ },
21
+ args: {
22
+ query: {
23
+ type: "positional",
24
+ required: true,
25
+ description: "分析问题/指令"
26
+ },
27
+ type: {
28
+ type: "string",
29
+ description: "分析类型:general_analysis(默认)| timeline_analysis"
30
+ },
31
+ "customer-id": {
32
+ type: "string",
33
+ description: "单个客户 wang_id"
34
+ },
35
+ "customer-ids": {
36
+ type: "string",
37
+ description: "CSV: 客户 wang_id 列表"
38
+ },
39
+ "advisor-ids": {
40
+ type: "string",
41
+ description: "CSV: 顾问 userId 列表"
42
+ },
43
+ "api-base": { type: "string" },
44
+ "auth-base": { type: "string" },
45
+ format: {
46
+ type: "string",
47
+ default: "toon"
48
+ }
49
+ },
50
+ async run({ args }) {
51
+ try {
52
+ writeResult(await xbApiFetch(resolveConfig({
53
+ apiBase: args["api-base"],
54
+ authBase: args["auth-base"]
55
+ }), "POST", "/ai-open/audio/analyze", {
56
+ headers: tenantProjectHeaders(await requireActiveProject()),
57
+ body: {
58
+ query: String(args.query),
59
+ analysisType: args.type,
60
+ customerId: args["customer-id"],
61
+ customerIds: csvToArray(args["customer-ids"]),
62
+ advisorIds: csvToArray(args["advisor-ids"])
63
+ }
64
+ }), args.format);
65
+ } catch (err) {
66
+ writeError(err, args.format);
67
+ process.exit(1);
68
+ }
69
+ }
70
+ });
71
+ //#endregion
72
+ export { analyze_default as default };
@@ -30,6 +30,24 @@ function buildUrl(apiBase, path, query) {
30
30
  if (query) for (const [k, v] of Object.entries(query)) url.searchParams.set(k, v);
31
31
  return url.toString();
32
32
  }
33
+ /**
34
+ * fetch with retry on transient network errors (undici "TypeError: fetch
35
+ * failed" — connection reset / unreachable). HTTP error responses and
36
+ * timeouts are NOT retried; backoff 200ms → 400ms → 800ms, max 3 retries.
37
+ */
38
+ async function fetchWithRetry(url, init) {
39
+ let lastErr;
40
+ for (let attempt = 0; attempt <= 3; attempt++) {
41
+ if (attempt > 0) await new Promise((r) => setTimeout(r, 200 * 2 ** (attempt - 1)));
42
+ try {
43
+ return await fetch(url, init);
44
+ } catch (err) {
45
+ lastErr = err;
46
+ if (!(err instanceof TypeError)) throw err;
47
+ }
48
+ }
49
+ throw lastErr;
50
+ }
33
51
  async function doFetch(url, method, token, opts) {
34
52
  const headers = {
35
53
  Accept: "application/json",
@@ -42,7 +60,7 @@ async function doFetch(url, method, token, opts) {
42
60
  body = JSON.stringify(opts.body);
43
61
  if (!headers["Content-Type"]) headers["Content-Type"] = "application/json";
44
62
  }
45
- const resp = await fetch(url, {
63
+ const resp = await fetchWithRetry(url, {
46
64
  method,
47
65
  headers,
48
66
  body,
@@ -1,5 +1,5 @@
1
1
  import { o as resolveConfig } from "./device-flow-j10PFOQL.mjs";
2
- import { t as xbApiFetch } from "./api-client-D3sCv6L3.mjs";
2
+ import { t as xbApiFetch } from "./api-client-JrgUZpe8.mjs";
3
3
  import { t as loadActiveProject } from "./project-store-CudTRvbA.mjs";
4
4
  import { t as tenantProjectHeaders } from "./headers-Dy5gROBB.mjs";
5
5
  import { n as writeResult, t as writeError } from "./format-DfVypHID.mjs";
@@ -6,8 +6,9 @@ var audio_default = defineCommand({
6
6
  description: "录音元数据分页 / 单条文本查询"
7
7
  },
8
8
  subCommands: {
9
- list: () => import("./list-CTSX1XuK.mjs").then((m) => m.default),
10
- text: () => import("./text-K7uP8bat.mjs").then((m) => m.default)
9
+ list: () => import("./list-CjLiGMIC.mjs").then((m) => m.default),
10
+ text: () => import("./text-8R0TuzgK.mjs").then((m) => m.default),
11
+ analyze: () => import("./analyze-DsiZ9O18.mjs").then((m) => m.default)
11
12
  }
12
13
  });
13
14
  //#endregion
@@ -6,10 +6,10 @@ var auth_default = defineCommand({
6
6
  description: "OAuth 登录 / 身份查询 / 登出(device flow)"
7
7
  },
8
8
  subCommands: {
9
- login: () => import("./login-COK74GKN.mjs").then((m) => m.default),
10
- whoami: () => import("./whoami-CtuWBu20.mjs").then((m) => m.default),
11
- status: () => import("./status-DR0tFzju.mjs").then((m) => m.default),
12
- logout: () => import("./logout-BQnDwD5-.mjs").then((m) => m.default)
9
+ login: () => import("./login-Bp2W2Hnj.mjs").then((m) => m.default),
10
+ whoami: () => import("./whoami-oRc8gILN.mjs").then((m) => m.default),
11
+ status: () => import("./status-CrpCtf5U.mjs").then((m) => m.default),
12
+ logout: () => import("./logout-BnoEQxKZ.mjs").then((m) => m.default)
13
13
  }
14
14
  });
15
15
  //#endregion
@@ -0,0 +1,16 @@
1
+ import { defineCommand } from "citty";
2
+ //#region src/commands/beautx/index.ts
3
+ var beautx_default = defineCommand({
4
+ meta: {
5
+ name: "beautx",
6
+ description: "医美:变美计划(plan) / 成交分析(deal-analysis) / 画像标签(portrait-tags) / 接诊评价(visit-evaluate)"
7
+ },
8
+ subCommands: {
9
+ plan: () => import("./plan-DC7ZFHWK.mjs").then((m) => m.default),
10
+ "deal-analysis": () => import("./deal-analysis-C3yn-bFg.mjs").then((m) => m.default),
11
+ "portrait-tags": () => import("./portrait-tags-DGjYKGDf.mjs").then((m) => m.default),
12
+ "visit-evaluate": () => import("./visit-evaluate-BvmghATK.mjs").then((m) => m.default)
13
+ }
14
+ });
15
+ //#endregion
16
+ export { beautx_default as default };
package/dist/cli.mjs CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env node
2
+ import { setDefaultResultOrder } from "node:dns";
2
3
  import { readFileSync } from "node:fs";
3
4
  import { dirname, join } from "node:path";
4
5
  import { fileURLToPath } from "node:url";
@@ -11,6 +12,7 @@ import { defineCommand, runMain } from "citty";
11
12
  * plus visit-summary, knowledge-base and quantum KPI stats — all proxied
12
13
  * through ai-open → wang-ai-mcp. See README for the full command map.
13
14
  */
15
+ setDefaultResultOrder("ipv4first");
14
16
  const pkgPath = join(dirname(fileURLToPath(import.meta.url)), "..", "package.json");
15
17
  runMain(defineCommand({
16
18
  meta: {
@@ -19,19 +21,24 @@ runMain(defineCommand({
19
21
  description: "旺小宝 CLI — host-agnostic 业务数据 / 问数 / 来访总结 / 知识库 能力 (openclaw-xiaobao plugin 的 CLI 等价物)"
20
22
  },
21
23
  subCommands: {
22
- auth: () => import("./auth-DvvYyJBK.mjs").then((m) => m.default),
23
- project: () => import("./project-CYA9qd8k.mjs").then((m) => m.default),
24
- consultant: () => import("./consultant-Ccnjnhzz.mjs").then((m) => m.default),
25
- audio: () => import("./audio-DzcmDYVu.mjs").then((m) => m.default),
26
- customer: () => import("./customer-D_LctjqX.mjs").then((m) => m.default),
27
- visit: () => import("./visit-qf8Lwf_s.mjs").then((m) => m.default),
28
- focus: () => import("./focus-BPPyRCBb.mjs").then((m) => m.default),
29
- resistance: () => import("./resistance-BhlYgeUx.mjs").then((m) => m.default),
30
- qa: () => import("./qa-CDYWW-19.mjs").then((m) => m.default),
31
- kb: () => import("./kb-DpBUFdFV.mjs").then((m) => m.default),
32
- quantum: () => import("./quantum-Dyhp2Clf.mjs").then((m) => m.default),
33
- admin: () => import("./admin-BOL_otwc.mjs").then((m) => m.default),
34
- api: () => import("./api-BaX_r5S5.mjs").then((m) => m.default)
24
+ auth: () => import("./auth-sQwZSTNA.mjs").then((m) => m.default),
25
+ project: () => import("./project-UkyNWPm6.mjs").then((m) => m.default),
26
+ consultant: () => import("./consultant-aWz8jHvH.mjs").then((m) => m.default),
27
+ audio: () => import("./audio-D-XxOe-n.mjs").then((m) => m.default),
28
+ customer: () => import("./customer-B410Tvlz.mjs").then((m) => m.default),
29
+ visit: () => import("./visit-4xsa_DFD.mjs").then((m) => m.default),
30
+ focus: () => import("./focus-DFxVA1UZ.mjs").then((m) => m.default),
31
+ resistance: () => import("./resistance-B-v-lfkT.mjs").then((m) => m.default),
32
+ qa: () => import("./qa-Dm1X6IoO.mjs").then((m) => m.default),
33
+ kb: () => import("./kb-B1sxz-PW.mjs").then((m) => m.default),
34
+ quantum: () => import("./quantum-DIuY6j7I.mjs").then((m) => m.default),
35
+ follow: () => import("./follow-BLq9XK6s.mjs").then((m) => m.default),
36
+ portrait: () => import("./portrait-D6oQPQfC.mjs").then((m) => m.default),
37
+ config: () => import("./config-WGgTcEU1.mjs").then((m) => m.default),
38
+ beautx: () => import("./beautx-CK9SR4Tg.mjs").then((m) => m.default),
39
+ date: () => import("./date-BcQMKhIT.mjs").then((m) => m.default),
40
+ admin: () => import("./admin-CpPlecd5.mjs").then((m) => m.default),
41
+ api: () => import("./api-nDku2tzx.mjs").then((m) => m.default)
35
42
  }
36
43
  }));
37
44
  //#endregion
@@ -0,0 +1,11 @@
1
+ import { defineCommand } from "citty";
2
+ //#region src/commands/config/index.ts
3
+ var config_default = defineCommand({
4
+ meta: {
5
+ name: "config",
6
+ description: "项目配置:客户字段配置(fields,解读 dynamic_tags 标签含义)"
7
+ },
8
+ subCommands: { fields: () => import("./fields-iyCGxxkh.mjs").then((m) => m.default) }
9
+ });
10
+ //#endregion
11
+ export { config_default as default };
@@ -5,7 +5,7 @@ var consultant_default = defineCommand({
5
5
  name: "consultant",
6
6
  description: "查询有权限的置业顾问列表"
7
7
  },
8
- subCommands: { list: () => import("./list-Ikc5mo6a.mjs").then((m) => m.default) }
8
+ subCommands: { list: () => import("./list-DqLKhW5s.mjs").then((m) => m.default) }
9
9
  });
10
10
  //#endregion
11
11
  export { consultant_default as default };
@@ -5,7 +5,7 @@ var customer_default = defineCommand({
5
5
  name: "customer",
6
6
  description: "客户画像分页查询"
7
7
  },
8
- subCommands: { list: () => import("./list-xbJZbyGQ.mjs").then((m) => m.default) }
8
+ subCommands: { list: () => import("./list-C3bNdA1t.mjs").then((m) => m.default) }
9
9
  });
10
10
  //#endregion
11
11
  export { customer_default as default };
@@ -0,0 +1,21 @@
1
+ import { defineCommand } from "citty";
2
+ //#region src/commands/date/index.ts
3
+ var date_default = defineCommand({
4
+ meta: {
5
+ name: "date",
6
+ description: "本地日期/时间(不走 MCP):now、today、weekday、range 等"
7
+ },
8
+ subCommands: {
9
+ now: () => import("./now-Ce3ViNOw.mjs").then((m) => m.default),
10
+ today: () => import("./today-CdlU96lq.mjs").then((m) => m.default),
11
+ yesterday: () => import("./yesterday-DW-YiRTt.mjs").then((m) => m.default),
12
+ tomorrow: () => import("./tomorrow-BgSEBV69.mjs").then((m) => m.default),
13
+ weekday: () => import("./weekday-CgEg7n7U.mjs").then((m) => m.default),
14
+ add: () => import("./add-CCuWFy1O.mjs").then((m) => m.default),
15
+ subtract: () => import("./subtract-B4XTXD_X.mjs").then((m) => m.default),
16
+ diff: () => import("./diff-8I1_L-nU.mjs").then((m) => m.default),
17
+ range: () => import("./range-CSJiXTp3.mjs").then((m) => m.default)
18
+ }
19
+ });
20
+ //#endregion
21
+ export { date_default as default };
@@ -0,0 +1,10 @@
1
+ import { t as defineBeautxCommand } from "./shared-DtIllnrz.mjs";
2
+ //#region src/commands/beautx/deal-analysis.ts
3
+ var deal_analysis_default = defineBeautxCommand({
4
+ name: "deal-analysis",
5
+ description: "医美成交分析分页(成交状态/未成交点/分析原因与结果)",
6
+ path: "/ai-open/beautx/deal-analyses",
7
+ supportsLatestOnly: true
8
+ });
9
+ //#endregion
10
+ export { deal_analysis_default as default };
@@ -0,0 +1,21 @@
1
+ import { i as dateDiff, t as defineDateCommand } from "./shared-CYALikq5.mjs";
2
+ //#region src/commands/date/diff.ts
3
+ var diff_default = defineDateCommand({
4
+ name: "diff",
5
+ description: "计算两日期相差天数(end - start)",
6
+ args: {
7
+ start: {
8
+ type: "string",
9
+ description: "开始日期 YYYY-MM-DD",
10
+ required: true
11
+ },
12
+ end: {
13
+ type: "string",
14
+ description: "结束日期 YYYY-MM-DD",
15
+ required: true
16
+ }
17
+ },
18
+ run: ({ args }) => dateDiff(args.start, args.end)
19
+ });
20
+ //#endregion
21
+ export { diff_default as default };
@@ -1,5 +1,5 @@
1
1
  import { o as resolveConfig } from "./device-flow-j10PFOQL.mjs";
2
- import { t as xbApiFetch } from "./api-client-D3sCv6L3.mjs";
2
+ import { t as xbApiFetch } from "./api-client-JrgUZpe8.mjs";
3
3
  import { n as requireActiveProject } from "./project-store-CudTRvbA.mjs";
4
4
  import { t as tenantProjectHeaders } from "./headers-Dy5gROBB.mjs";
5
5
  import { n as writeResult, t as writeError } from "./format-DfVypHID.mjs";
@@ -1,5 +1,5 @@
1
1
  import { o as resolveConfig } from "./device-flow-j10PFOQL.mjs";
2
- import { t as xbApiFetch } from "./api-client-D3sCv6L3.mjs";
2
+ import { t as xbApiFetch } from "./api-client-JrgUZpe8.mjs";
3
3
  import { n as requireActiveProject } from "./project-store-CudTRvbA.mjs";
4
4
  import { t as tenantProjectHeaders } from "./headers-Dy5gROBB.mjs";
5
5
  import { n as writeResult, t as writeError } from "./format-DfVypHID.mjs";
@@ -1,5 +1,5 @@
1
1
  import { o as resolveConfig } from "./device-flow-j10PFOQL.mjs";
2
- import { t as xbApiFetch } from "./api-client-D3sCv6L3.mjs";
2
+ import { t as xbApiFetch } from "./api-client-JrgUZpe8.mjs";
3
3
  import { n as requireActiveProject } from "./project-store-CudTRvbA.mjs";
4
4
  import { t as tenantProjectHeaders } from "./headers-Dy5gROBB.mjs";
5
5
  import { n as writeResult, t as writeError } from "./format-DfVypHID.mjs";
@@ -0,0 +1,54 @@
1
+ import { o as resolveConfig } from "./device-flow-j10PFOQL.mjs";
2
+ import { t as xbApiFetch } from "./api-client-JrgUZpe8.mjs";
3
+ import { n as requireActiveProject } from "./project-store-CudTRvbA.mjs";
4
+ import { t as tenantProjectHeaders } from "./headers-Dy5gROBB.mjs";
5
+ import { n as writeResult, t as writeError } from "./format-DfVypHID.mjs";
6
+ import { defineCommand } from "citty";
7
+ //#region src/commands/config/fields.ts
8
+ /**
9
+ * `xiaobao-cli config fields` — 客户字段配置分页。
10
+ *
11
+ * 返回本项目客户字段(名称/格式/说明/分类/AI 映射名),供解读
12
+ * customer list 里 dynamic_tags 各标签的含义。调 POST /ai-open/customers/fields。
13
+ */
14
+ var fields_default = defineCommand({
15
+ meta: {
16
+ name: "fields",
17
+ description: "客户字段配置分页(解读 dynamic_tags 标签含义)"
18
+ },
19
+ args: {
20
+ page: {
21
+ type: "string",
22
+ default: "1"
23
+ },
24
+ size: {
25
+ type: "string",
26
+ default: "50"
27
+ },
28
+ "api-base": { type: "string" },
29
+ "auth-base": { type: "string" },
30
+ format: {
31
+ type: "string",
32
+ default: "toon"
33
+ }
34
+ },
35
+ async run({ args }) {
36
+ try {
37
+ writeResult(await xbApiFetch(resolveConfig({
38
+ apiBase: args["api-base"],
39
+ authBase: args["auth-base"]
40
+ }), "POST", "/ai-open/customers/fields", {
41
+ headers: tenantProjectHeaders(await requireActiveProject()),
42
+ body: {
43
+ page: Number(args.page),
44
+ size: Number(args.size)
45
+ }
46
+ }), args.format);
47
+ } catch (err) {
48
+ writeError(err, args.format);
49
+ process.exit(1);
50
+ }
51
+ }
52
+ });
53
+ //#endregion
54
+ export { fields_default as default };
@@ -5,7 +5,7 @@ var focus_default = defineCommand({
5
5
  name: "focus",
6
6
  description: "客户关注点标签分页查询"
7
7
  },
8
- subCommands: { list: () => import("./list-D_8QLOZ1.mjs").then((m) => m.default) }
8
+ subCommands: { list: () => import("./list-CtICqXPF.mjs").then((m) => m.default) }
9
9
  });
10
10
  //#endregion
11
11
  export { focus_default as default };
@@ -0,0 +1,14 @@
1
+ import { defineCommand } from "citty";
2
+ //#region src/commands/follow/index.ts
3
+ var follow_default = defineCommand({
4
+ meta: {
5
+ name: "follow",
6
+ description: "旺跟进:明细分页(list) / 电话微信指标汇总(summary)(聚合统计卡片用 quantum follow)"
7
+ },
8
+ subCommands: {
9
+ list: () => import("./list-B8QkIq76.mjs").then((m) => m.default),
10
+ summary: () => import("./summary-CgBgJOw2.mjs").then((m) => m.default)
11
+ }
12
+ });
13
+ //#endregion
14
+ export { follow_default as default };
@@ -0,0 +1,66 @@
1
+ import { o as resolveConfig } from "./device-flow-j10PFOQL.mjs";
2
+ import { t as xbApiFetch } from "./api-client-JrgUZpe8.mjs";
3
+ import { n as requireActiveProject } from "./project-store-CudTRvbA.mjs";
4
+ import { t as tenantProjectHeaders } from "./headers-Dy5gROBB.mjs";
5
+ import { n as writeResult, t as writeError } from "./format-DfVypHID.mjs";
6
+ import { r as toLocalDateTime, t as csvToArray } from "./util-BuoFIeLS.mjs";
7
+ import { defineCommand } from "citty";
8
+ //#region src/commands/portrait/get.ts
9
+ /**
10
+ * `xiaobao-cli portrait get <field>` — 单个画像字段的饼图分布。
11
+ *
12
+ * 回答"全项目客户的<意向级别/预算/…>分布比例"类问题(count + items[].name/count/rate)。
13
+ * field 用 `portrait list` 返回的中文字段名。调 POST /ai-open/portraits/get。
14
+ */
15
+ var get_default = defineCommand({
16
+ meta: {
17
+ name: "get",
18
+ description: "画像饼图数据(按单个字段中文名查询分布)"
19
+ },
20
+ args: {
21
+ field: {
22
+ type: "positional",
23
+ required: true,
24
+ description: "画像字段中文名(portrait list 的 fieldName)"
25
+ },
26
+ from: {
27
+ type: "string",
28
+ description: "开始时间(含)"
29
+ },
30
+ to: {
31
+ type: "string",
32
+ description: "结束时间(不含)"
33
+ },
34
+ "user-ids": {
35
+ type: "string",
36
+ description: "CSV: 数据范围 userIds;不传按当前授权范围"
37
+ },
38
+ "api-base": { type: "string" },
39
+ "auth-base": { type: "string" },
40
+ format: {
41
+ type: "string",
42
+ default: "toon"
43
+ }
44
+ },
45
+ async run({ args }) {
46
+ try {
47
+ writeResult(await xbApiFetch(resolveConfig({
48
+ apiBase: args["api-base"],
49
+ authBase: args["auth-base"]
50
+ }), "POST", "/ai-open/portraits/get", {
51
+ headers: tenantProjectHeaders(await requireActiveProject()),
52
+ body: {
53
+ field: String(args.field),
54
+ fromDate: toLocalDateTime(args.from),
55
+ toDate: toLocalDateTime(args.to),
56
+ userIds: csvToArray(args["user-ids"])?.map(Number)
57
+ }
58
+ }), args.format);
59
+ } catch (err) {
60
+ writeError(err, args.format);
61
+ process.exit(1);
62
+ }
63
+ }
64
+ });
65
+ //#endregion
66
+ export { get_default as default };
@@ -6,10 +6,10 @@ var kb_default = defineCommand({
6
6
  description: "项目知识库:语义检索 / 文档列表 / 文档详情 / 文档正文分页"
7
7
  },
8
8
  subCommands: {
9
- search: () => import("./search-ChFFOKV4.mjs").then((m) => m.default),
10
- docs: () => import("./docs-DtQy3Zoc.mjs").then((m) => m.default),
11
- doc: () => import("./doc-CC08fj8m.mjs").then((m) => m.default),
12
- "doc-content": () => import("./doc-content-DktnDECM.mjs").then((m) => m.default)
9
+ search: () => import("./search-VsAp96Co.mjs").then((m) => m.default),
10
+ docs: () => import("./docs-BpowF7jz.mjs").then((m) => m.default),
11
+ doc: () => import("./doc-CrY6qNkG.mjs").then((m) => m.default),
12
+ "doc-content": () => import("./doc-content-YKxaMDEp.mjs").then((m) => m.default)
13
13
  }
14
14
  });
15
15
  //#endregion
@@ -0,0 +1,5 @@
1
+ import { t as defineRangePresetCommand } from "./shared-BEkL4JRB.mjs";
2
+ //#region src/commands/date/range/last-7-days.ts
3
+ var last_7_days_default = defineRangePresetCommand("last-7-days", "最近 7 天(含今天):from=6 天前 00:00,to=明天 00:00");
4
+ //#endregion
5
+ export { last_7_days_default as default };
@@ -0,0 +1,76 @@
1
+ import { o as resolveConfig } from "./device-flow-j10PFOQL.mjs";
2
+ import { t as xbApiFetch } from "./api-client-JrgUZpe8.mjs";
3
+ import { n as requireActiveProject } from "./project-store-CudTRvbA.mjs";
4
+ import { t as tenantProjectHeaders } from "./headers-Dy5gROBB.mjs";
5
+ import { n as writeResult, t as writeError } from "./format-DfVypHID.mjs";
6
+ import { r as toLocalDateTime, t as csvToArray } from "./util-BuoFIeLS.mjs";
7
+ import { defineCommand } from "citty";
8
+ //#region src/commands/follow/list.ts
9
+ /**
10
+ * `xiaobao-cli follow list` — 旺跟进明细分页。
11
+ *
12
+ * 每条 = 一次跟进动作(电话/短信/微信/企微…,含通话时长、消息条数)。
13
+ * 聚合统计卡片(summary/rank/team/time)走 `quantum follow`;
14
+ * 电话/微信指标汇总走 `follow summary`。调 POST /ai-open/follows/page。
15
+ */
16
+ var list_default = defineCommand({
17
+ meta: {
18
+ name: "list",
19
+ description: "旺跟进明细分页(谁/何时/以什么方式跟进了哪个客户)"
20
+ },
21
+ args: {
22
+ "user-ids": {
23
+ type: "string",
24
+ description: "CSV: 跟进人 userId 过滤;不传按当前授权范围"
25
+ },
26
+ "customer-ids": {
27
+ type: "string",
28
+ description: "CSV: 客户 wang_id 过滤"
29
+ },
30
+ from: {
31
+ type: "string",
32
+ description: "开始时间(含)"
33
+ },
34
+ to: {
35
+ type: "string",
36
+ description: "结束时间(不含)"
37
+ },
38
+ page: {
39
+ type: "string",
40
+ default: "1"
41
+ },
42
+ size: {
43
+ type: "string",
44
+ default: "10"
45
+ },
46
+ "api-base": { type: "string" },
47
+ "auth-base": { type: "string" },
48
+ format: {
49
+ type: "string",
50
+ default: "toon"
51
+ }
52
+ },
53
+ async run({ args }) {
54
+ try {
55
+ writeResult(await xbApiFetch(resolveConfig({
56
+ apiBase: args["api-base"],
57
+ authBase: args["auth-base"]
58
+ }), "POST", "/ai-open/follows/page", {
59
+ headers: tenantProjectHeaders(await requireActiveProject()),
60
+ body: {
61
+ userIds: csvToArray(args["user-ids"])?.map(Number),
62
+ customerIds: csvToArray(args["customer-ids"])?.map(Number),
63
+ fromDate: toLocalDateTime(args.from),
64
+ toDate: toLocalDateTime(args.to),
65
+ page: Number(args.page),
66
+ size: Number(args.size)
67
+ }
68
+ }), args.format);
69
+ } catch (err) {
70
+ writeError(err, args.format);
71
+ process.exit(1);
72
+ }
73
+ }
74
+ });
75
+ //#endregion
76
+ export { list_default as default };
@@ -1,9 +1,9 @@
1
1
  import { o as resolveConfig } from "./device-flow-j10PFOQL.mjs";
2
- import { t as xbApiFetch } from "./api-client-D3sCv6L3.mjs";
2
+ import { t as xbApiFetch } from "./api-client-JrgUZpe8.mjs";
3
3
  import { n as requireActiveProject } from "./project-store-CudTRvbA.mjs";
4
4
  import { t as tenantProjectHeaders } from "./headers-Dy5gROBB.mjs";
5
5
  import { n as writeResult, t as writeError } from "./format-DfVypHID.mjs";
6
- import { r as toLocalDateTime } from "./util-pyTg7qwY.mjs";
6
+ import { r as toLocalDateTime } from "./util-BuoFIeLS.mjs";
7
7
  import { defineCommand } from "citty";
8
8
  //#region src/commands/visit/list.ts
9
9
  /**
@@ -1,5 +1,5 @@
1
1
  import { o as resolveConfig } from "./device-flow-j10PFOQL.mjs";
2
- import { t as xbApiFetch } from "./api-client-D3sCv6L3.mjs";
2
+ import { t as xbApiFetch } from "./api-client-JrgUZpe8.mjs";
3
3
  import { n as writeResult, t as writeError } from "./format-DfVypHID.mjs";
4
4
  import { defineCommand } from "citty";
5
5
  //#region src/commands/project/list.ts