@puyinkai/xiaobao-cli 0.1.6 → 0.1.9

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 (51) hide show
  1. package/dist/{api-client-DWbwtQbl.mjs → api-client-CDNjkArS.mjs} +2 -2
  2. package/dist/{api-JZnABA4y.mjs → api-fsHHWWa3.mjs} +5 -4
  3. package/dist/{audio-BHWH6uhw.mjs → audio-CRSMqaKo.mjs} +2 -2
  4. package/dist/{auth-BpzWivxf.mjs → auth-_3hBh87U.mjs} +3 -3
  5. package/dist/cli.mjs +10 -10
  6. package/dist/{consultant-kV5r8Wj8.mjs → consultant-E33hTGUO.mjs} +1 -1
  7. package/dist/{customer-B2OV8BTR.mjs → customer-DcQ83oKD.mjs} +1 -1
  8. package/dist/{focus-BjWD5PRV.mjs → focus-XMRxnHPw.mjs} +1 -1
  9. package/dist/{list-C30zFN6h.mjs → list-B3nN4pd2.mjs} +1 -1
  10. package/dist/{list-CHububT5.mjs → list-CXquxzex.mjs} +1 -1
  11. package/dist/{list-FM3vkQJa.mjs → list-Cc4zcaNz.mjs} +1 -1
  12. package/dist/{list-VpZkzTEE.mjs → list-CnlQdzPp.mjs} +1 -1
  13. package/dist/{list-Bw8dFf8a.mjs → list-CrMOrnS-.mjs} +1 -1
  14. package/dist/{list-h1nuSJiN.mjs → list-DFdDcHFq.mjs} +1 -1
  15. package/dist/{list-CVMSGK08.mjs → list-dm9YaCG1.mjs} +1 -1
  16. package/dist/login-CUUcjWPd.mjs +156 -0
  17. package/dist/{logout-DVJX8_x6.mjs → logout-DP7REhCd.mjs} +2 -1
  18. package/dist/{project-CJkTgGOq.mjs → project-BD0g4oAW.mjs} +1 -1
  19. package/dist/{qa-CQDRFw-g.mjs → qa-CdMcxCE_.mjs} +1 -1
  20. package/dist/{resistance-Ss-eUZoN.mjs → resistance-6_V6At3T.mjs} +1 -1
  21. package/dist/{text-5q8lIWi8.mjs → text-C3Ap6L5n.mjs} +1 -1
  22. package/dist/{token-store-D2umpIk-.mjs → token-store-CXizLE2_.mjs} +37 -1
  23. package/dist/{visit-CUI2ov-H.mjs → visit-DoeECi8w.mjs} +1 -1
  24. package/dist/{whoami-Uv7GBtGB.mjs → whoami-z-76WaCP.mjs} +2 -2
  25. package/package.json +5 -1
  26. package/skills/wangxiaobao-audio-query/SKILL.md +2 -2
  27. package/skills/wangxiaobao-audio-wiki/SKILL.md +4 -4
  28. package/skills/wangxiaobao-customer-focus-query/SKILL.md +2 -2
  29. package/skills/wangxiaobao-customer-query/SKILL.md +2 -2
  30. package/skills/wangxiaobao-customer-resistance-query/SKILL.md +2 -2
  31. package/skills/wangxiaobao-html-to-pdf/SKILL.md +116 -0
  32. package/skills/wangxiaobao-html-to-pdf/scripts/html2pdf.py +132 -0
  33. package/skills/wangxiaobao-html-to-pdf/scripts/html2pdf_exact.py +92 -0
  34. package/skills/wangxiaobao-project-daily-report/SKILL.md +170 -0
  35. package/skills/wangxiaobao-project-daily-report/_meta.json +9 -0
  36. package/skills/wangxiaobao-project-daily-report/references/report_template.html +308 -0
  37. package/skills/wangxiaobao-project-daily-report/scripts/fetch_data.py +219 -0
  38. package/skills/wangxiaobao-project-daily-report/scripts/generate_report.py +1029 -0
  39. package/skills/wangxiaobao-project-daily-report/scripts/run.py +34 -0
  40. package/skills/wangxiaobao-project-weekly-report/SKILL.md +169 -0
  41. package/skills/wangxiaobao-project-weekly-report/scripts/generate_report.py +308 -0
  42. package/skills/wangxiaobao-project-weekly-report/scripts/html2pdf_fast.py +161 -0
  43. package/skills/wangxiaobao-project-weekly-report/scripts/logo_wangai.png +0 -0
  44. package/skills/wangxiaobao-project-weekly-report/scripts/logo_wangxiaobao.png +0 -0
  45. package/skills/wangxiaobao-project-weekly-report/scripts/prepare_data.py +682 -0
  46. package/skills/wangxiaobao-project-weekly-report/scripts/template.py +925 -0
  47. package/skills/wangxiaobao-quick-qa/SKILL.md +2 -2
  48. package/skills/wangxiaobao-shared/SKILL.md +40 -7
  49. package/skills/wangxiaobao-switch-project/SKILL.md +3 -3
  50. package/skills/wangxiaobao-visit-query/SKILL.md +2 -2
  51. package/dist/login-DtDxISE8.mjs +0 -91
@@ -17,7 +17,7 @@ metadata:
17
17
 
18
18
  ## 执行前必读
19
19
 
20
- - 必须有有效 token:先调 `xiaobao-cli auth whoami`;未登录 / 过期就调 `xiaobao-cli auth login`
20
+ - 必须有有效 token:先调 `xiaobao-cli auth whoami`;未登录 / 过期就走 `auth login --no-wait` split-flow(见 wangxiaobao-shared)
21
21
  - **必须有激活项目**:命令内部自动从激活项目状态读 tenant/project,
22
22
  调用方**不要传** tenant/project 参数。如果 命令 返回
23
23
  `error: 'NO_ACTIVE_PROJECT'`,让用户跑 `wangxiaobao-switch-project` skill
@@ -178,7 +178,7 @@ xiaobao-cli qa "评估一下客户 12345 的成交概率,相关录音 audioId:
178
178
 
179
179
  - **`error: 'NO_ACTIVE_PROJECT'`** — 还没设过激活项目 → 跑
180
180
  `wangxiaobao-switch-project` skill 后重试
181
- - **401 / token 过期** — `xiaobao-cli auth login --force` 重登,重试一次
181
+ - **401 / token 过期** — `auth login --no-wait --force` split-flow 重登,重试一次
182
182
  - **响应耗时 > 30 分钟** — 后端慢到打满 CLI timeout → 告诉用户"上游慢,稍后重试"
183
183
  - **answer 为空** — 上游这一轮没产出最终文本 → 让用户换个 prompt 重试
184
184
  - **用户想"批量出报告"** — 拦住:本期 CLI 没有报告生成 skill,
@@ -30,8 +30,8 @@ npx -y @puyinkai/xiaobao-cli <subcommand>...
30
30
  任何 xiaobao-cli 命令的**前置 3 步**:
31
31
 
32
32
  ```bash
33
- # 1. 登录(OAuth device flow,5 分钟内浏览器授权一次,token 自动缓存)
34
- xiaobao-cli auth login
33
+ # 1. 登录(OAuth device flow 非阻塞 split-flow,token 自动缓存)—— 见下方
34
+ xiaobao-cli auth login --no-wait
35
35
 
36
36
  # 2. 选激活项目(多租户 / 多项目场景必做;旺小宝是多租户业务)
37
37
  xiaobao-cli project list # 列可选
@@ -44,6 +44,34 @@ xiaobao-cli customer list --portrait 高意向
44
44
  # ...
45
45
  ```
46
46
 
47
+ ### 登录 —— 用 `--no-wait` split-flow(两步、不阻塞)
48
+
49
+ 登录走 OAuth device flow,固定用下面的两步、全程不阻塞。**不要跑裸
50
+ `xiaobao-cli auth login`** —— 它会阻塞轮询、卡满一整轮对话。
51
+
52
+ ```bash
53
+ # 步骤 A:发起,立即返回(约 0.5s),拿到 verification_uri
54
+ xiaobao-cli auth login --no-wait
55
+ # stdout: { "awaiting_authorization": true, "verification_uri": "...",
56
+ # "user_code": "...", "expires_in": 300, "interval": 5, ... }
57
+ # device_code 不在 stdout —— 已安全存到 ~/.xiaobao/pending-auth.json(0600)
58
+ ```
59
+
60
+ agent 拿到后:把 `verification_uri` **原样**发给用户(放进只含 URL 的代码块,
61
+ 不要改写不要做 URL 编码),让用户浏览器打开授权,然后**结束本轮**,把控制权
62
+ 交还用户。
63
+
64
+ ```bash
65
+ # 步骤 B:用户回复"授权完成"后,直接换 token(秒级)——
66
+ # device_code 已由步骤 A 存在本地,--resume 自动读取,agent 无需持有 / 传递它
67
+ xiaobao-cli auth login --resume
68
+ # stdout: { "source": "device-flow", "expires_at": ..., "scope": "..." }
69
+ ```
70
+
71
+ device_code 有效期 `expires_in` 秒(约 5 分钟)。超时就重跑步骤 A。
72
+ 若 token 仍有效 / refresh_token 可用,`--no-wait` 会直接走 cache/refresh
73
+ 快速返回(`source: cache` / `refresh`),不发起新的 device flow,也无需步骤 B。
74
+
47
75
  查身份 / 当前激活项目(任何时候都可以):
48
76
 
49
77
  ```bash
@@ -90,12 +118,12 @@ Agent 消费时**只 parse stdout JSON**,stderr 是辅助。
90
118
 
91
119
  ### 常见错误码
92
120
 
93
- | code | 触发场景 | hint 内 actionable 命令 |
94
- | --- | --- | --- |
95
- | `NOT_AUTHENTICATED` | 未登录 / token 过期且 refresh_token 也失效 | `xiaobao-cli auth login` |
96
- | `NO_ACTIVE_PROJECT` | 没设激活项目就跑了需要 tenant/project 的命令 | `xiaobao-cli project list` + `xiaobao-cli project use ...` |
121
+ | code | 触发场景 | hint 内 actionable 命令 |
122
+ | --- | --- |---------------------------------------------------------------|
123
+ | `NOT_AUTHENTICATED` | 未登录 / token 过期且 refresh_token 也失效 | `xiaobao-cli auth login --no-wait`(split-flow,见上方登录段) |
124
+ | `NO_ACTIVE_PROJECT` | 没设激活项目就跑了需要 tenant/project 的命令 | `xiaobao-cli project list` + `xiaobao-cli project use ...` |
97
125
  | `API_ERROR` | 上游 ai-open / saas API 返非 2xx | 看 `details.status` 和 `details.body`,可能 token scope 不够 / 上游临时挂 |
98
- | `BAD_METHOD` | `api` 命令传错 HTTP method | 用 GET / POST / PUT / PATCH / DELETE |
126
+ | `BAD_METHOD` | `api` 命令传错 HTTP method | 用 GET / POST / PUT / PATCH / DELETE |
99
127
 
100
128
  遇到 `NOT_AUTHENTICATED` 或 `NO_ACTIVE_PROJECT` 时**立即按 hint 走**,不要追问用户。
101
129
 
@@ -106,6 +134,11 @@ Agent 消费时**只 parse stdout JSON**,stderr 是辅助。
106
134
  | OAuth tokens | access_token + refresh_token + id_token + expires_at | `~/.xiaobao/token.json` | 0600 |
107
135
  | Active project | tenantId / tenantName / projectId / projectName / updatedAt | `~/.xiaobao/active-project.json` | 0600 |
108
136
  | User config(可选) | 覆盖 authBase / apiBase / scopes | `~/.xiaobao/config.json` | 0600 |
137
+ | Pending auth(临时) | `--no-wait` split-flow 进行中的 device_code / user_code / 过期时间 | `~/.xiaobao/pending-auth.json` | 0600 |
138
+
139
+ `pending-auth.json` 是 split-flow 的临时凭据中转:`--no-wait` 写入、`--resume`
140
+ 成功换到 token 后删除,`auth logout` 或 device_code 过期时也会清掉。device_code
141
+ 属凭据级数据,**只落本地文件、绝不进 stdout / agent 上下文**。
109
142
 
110
143
  ### `~/.openclaw/state/wangxiaobao/` fallback(向后兼容 openclaw-xiaobao plugin 用户)
111
144
 
@@ -17,7 +17,7 @@ metadata:
17
17
 
18
18
  ## 执行前必读
19
19
 
20
- - 必须先通过 `xiaobao-cli auth login` 完成 OAuth 登录;token 没拿到时本 skill 不能继续
20
+ - 必须先走 `auth login --no-wait` split-flow 完成 OAuth 登录(见 wangxiaobao-shared);token 没拿到时本 skill 不能继续
21
21
  - **不要**自己 fs.writeFile 写 `.env` 或任何文件——状态落地走
22
22
  `xiaobao-cli project use`,由 CLI 统一管理权限和路径
23
23
  - 多个项目时**必须让用户挑**,绝对不要自动选择第一个;只有一个项目时才可以自动选
@@ -58,7 +58,7 @@ metadata:
58
58
  或不带 keyword 看全量;**不要**直接说"没有项目"
59
59
  - **没带 `--keyword`** → 账号确实没有可访问的项目,结束
60
60
 
61
- 如果 命令 报错(401 / token 过期等),先调 `xiaobao-cli auth login --force` 重新登录,再重试一次。
61
+ 如果 命令 报错(401 / token 过期等),先走 `auth login --no-wait --force` split-flow 重新登录,再重试一次。
62
62
 
63
63
  ### 第 2 步:展示并让用户选
64
64
 
@@ -146,7 +146,7 @@ tenant/project + `updatedAt`。如果用户问"现在是哪个项目""当前激
146
146
 
147
147
  | 错误现象 | 根本原因 | 解决方案 |
148
148
  |---|---|---|
149
- | `xiaobao-cli project list` 返回 401 / token 过期 | 没登录或 refresh 失败 | `xiaobao-cli auth login --force` 重新走 device flow |
149
+ | `xiaobao-cli project list` 返回 401 / token 过期 | 没登录或 refresh 失败 | `auth login --no-wait --force` split-flow 重登 |
150
150
  | `count == 0`(没带 keyword) | 账号无任何租户/项目权限 | 让用户找管理员加权限,本 skill 不继续 |
151
151
  | `count == 0`(带了 keyword) | 关键字没匹配到任何项目 | 换更短关键字 / 不带 keyword 看全量,别直接说"没项目" |
152
152
  | 用户输入的编号超出范围 | 选错了 | 重新提示当前可选编号区间 |
@@ -16,7 +16,7 @@ metadata:
16
16
 
17
17
  ## 执行前必读
18
18
 
19
- - 必须有有效 token:先调 `xiaobao-cli auth whoami`;未登录就 `xiaobao-cli auth login`
19
+ - 必须有有效 token:先调 `xiaobao-cli auth whoami`;未登录就走 `auth login --no-wait` split-flow(见 wangxiaobao-shared)
20
20
  - **必须有激活项目**:命令内部自动读,缺失返回 `NO_ACTIVE_PROJECT`
21
21
  - **数据权限隔离**:跟客户接口一样,按当前用户授权可见顾问范围过滤
22
22
  - LocalDateTime 格式:`yyyy-MM-dd HH:mm:ss`(空格分隔),CLI 自动转
@@ -194,7 +194,7 @@ xiaobao-cli visit list --customer-id 1685535452481236993 --page 1 --size 5
194
194
  ## 常见错误与排查
195
195
 
196
196
  - **`error: 'NO_ACTIVE_PROJECT'`** — 跑 `wangxiaobao-switch-project` skill
197
- - **401 / token 过期** — `xiaobao-cli auth login --force` 重登
197
+ - **401 / token 过期** — `auth login --no-wait --force` split-flow 重登
198
198
  - **`total: 0`** — 时间窗内确实没数据,或当前用户授权范围内没有匹配的接待顾问
199
199
  - **customerName 模糊但没匹到** — 客户名拼写差异("李女士" vs "李小姐");
200
200
  改用 `xiaobao-cli customer list` 反查精确 customerId
@@ -1,91 +0,0 @@
1
- import { a as resolveConfig, n as pollForToken, r as refreshToken, t as initiateDeviceAuthorization } from "./device-flow-D6JVcEap.mjs";
2
- import { a as writeToken, i as readToken, r as isAccessTokenValid, t as clearToken } from "./token-store-D2umpIk-.mjs";
3
- import { n as writeResult, t as writeError } from "./format-yjmxrbNm.mjs";
4
- import { defineCommand } from "citty";
5
- //#region src/commands/auth/login.ts
6
- /**
7
- * `xiaobao-cli auth login` — OAuth 2.0 Device Authorization Grant.
8
- *
9
- * Behaviour:
10
- * 1. Cache hit (valid access_token, no --force) → return immediately.
11
- * 2. Refresh path (cached refresh_token, no --force) → refresh & store.
12
- * 3. Device flow → print verification URL + user_code to stderr (humans see
13
- * it in the terminal), and synchronously poll until success/denial/expiry.
14
- * Polls foreground so the CLI exits with a final structured result on
15
- * stdout (agents waiting on stdout JSON get a definitive answer).
16
- */
17
- var login_default = defineCommand({
18
- meta: {
19
- name: "login",
20
- description: "走 OAuth device flow 登录"
21
- },
22
- args: {
23
- force: {
24
- type: "boolean",
25
- description: "强制清除缓存并重新发起设备授权流程"
26
- },
27
- "api-base": {
28
- type: "string",
29
- description: "覆盖 API base URL"
30
- },
31
- "auth-base": {
32
- type: "string",
33
- description: "覆盖 auth base URL"
34
- },
35
- format: {
36
- type: "string",
37
- default: "json"
38
- }
39
- },
40
- async run({ args }) {
41
- const config = resolveConfig({
42
- apiBase: args["api-base"],
43
- authBase: args["auth-base"]
44
- });
45
- const fmt = args.format;
46
- try {
47
- if (!args.force) {
48
- const cached = await readToken();
49
- if (isAccessTokenValid(cached)) {
50
- writeResult({
51
- source: "cache",
52
- expires_at: cached.expires_at,
53
- scope: cached.scope
54
- }, fmt);
55
- return;
56
- }
57
- if (cached?.refresh_token) try {
58
- const saved = await writeToken(await refreshToken(config, cached.refresh_token));
59
- writeResult({
60
- source: "refresh",
61
- expires_at: saved.expires_at,
62
- scope: saved.scope
63
- }, fmt);
64
- return;
65
- } catch {
66
- await clearToken();
67
- }
68
- } else await clearToken();
69
- const init = await initiateDeviceAuthorization(config);
70
- const verificationUri = init.verification_uri_complete || init.verification_uri;
71
- const expiresMinutes = Math.max(1, Math.round(init.expires_in / 60));
72
- const interval = init.interval ?? 5;
73
- process.stderr.write(`
74
- 请在浏览器中打开以下链接完成登录并授权访问你的旺小宝账号:
75
- \n 🔗 ${verificationUri}\n\n 设备验证码: ${init.user_code}\n 有效期约 ${expiresMinutes} 分钟\n\n等待你在浏览器中确认 ...
76
- `);
77
- const saved = await writeToken(await pollForToken(config, init.device_code, interval, init.expires_in));
78
- writeResult({
79
- source: "device-flow",
80
- expires_at: saved.expires_at,
81
- scope: saved.scope,
82
- message: "登录成功,token 已缓存到 ~/.xiaobao/token.json"
83
- }, fmt);
84
- } catch (err) {
85
- writeError(err, fmt);
86
- process.exit(1);
87
- }
88
- }
89
- });
90
- //#endregion
91
- export { login_default as default };