@openlibing/openlibing-cli 0.1.12 → 0.1.14

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 (52) hide show
  1. package/CHANGELOG.md +90 -0
  2. package/README.md +19 -8
  3. package/dist/auth/authedRequest.d.ts +13 -0
  4. package/dist/auth/authedRequest.js +80 -0
  5. package/dist/auth/authedRequest.js.map +1 -0
  6. package/dist/auth/jwt.d.ts +2 -0
  7. package/dist/auth/jwt.js +21 -0
  8. package/dist/auth/jwt.js.map +1 -0
  9. package/dist/auth/login.js +2 -0
  10. package/dist/auth/login.js.map +1 -1
  11. package/dist/auth/refresh.js +2 -0
  12. package/dist/auth/refresh.js.map +1 -1
  13. package/dist/auth/store.d.ts +2 -0
  14. package/dist/auth/store.js.map +1 -1
  15. package/dist/client/reportApi.js +19 -42
  16. package/dist/client/reportApi.js.map +1 -1
  17. package/dist/commands/auth.d.ts +2 -0
  18. package/dist/commands/auth.js +41 -4
  19. package/dist/commands/auth.js.map +1 -1
  20. package/dist/commands/mcp.d.ts +1 -0
  21. package/dist/commands/mcp.js +16 -1
  22. package/dist/commands/mcp.js.map +1 -1
  23. package/dist/errors.d.ts +21 -0
  24. package/dist/errors.js +13 -0
  25. package/dist/errors.js.map +1 -0
  26. package/dist/exitCodes.d.ts +9 -0
  27. package/dist/exitCodes.js +10 -0
  28. package/dist/exitCodes.js.map +1 -0
  29. package/dist/index.js +2 -3
  30. package/dist/index.js.map +1 -1
  31. package/dist/mcp/registry.js +2 -1
  32. package/dist/mcp/registry.js.map +1 -1
  33. package/dist/mcp/server.d.ts +1 -1
  34. package/dist/mcp/server.js +13 -2
  35. package/dist/mcp/server.js.map +1 -1
  36. package/dist/tools/auth/login.js +5 -4
  37. package/dist/tools/auth/login.js.map +1 -1
  38. package/dist/tools/cli/version.d.ts +4 -0
  39. package/dist/tools/cli/version.js +38 -0
  40. package/dist/tools/cli/version.js.map +1 -0
  41. package/dist/tools/report/listTemplates.js +6 -3
  42. package/dist/tools/report/listTemplates.js.map +1 -1
  43. package/dist/tools/types.d.ts +12 -3
  44. package/dist/tools/types.js +23 -1
  45. package/dist/tools/types.js.map +1 -1
  46. package/dist/updateCheck.d.ts +18 -0
  47. package/dist/updateCheck.js +100 -0
  48. package/dist/updateCheck.js.map +1 -0
  49. package/dist/version.d.ts +2 -0
  50. package/dist/version.js +10 -0
  51. package/dist/version.js.map +1 -0
  52. package/package.json +7 -2
package/CHANGELOG.md ADDED
@@ -0,0 +1,90 @@
1
+ # 变更记录
2
+
3
+ 本文件记录 `@openlibing/openlibing-cli` 的版本变更(自 0.1.8 起)。
4
+ 0.1.8 之前为旧包 `@openlibing/mcp-cli`(已 deprecated),迁移说明见 README。
5
+
6
+ 格式参考 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/),版本号遵循 [SemVer](https://semver.org/lang/zh-CN/)。
7
+
8
+ ## [0.1.14] - 2026-10-29
9
+
10
+ ### Added
11
+
12
+ - 新增 MCP 工具 `cli_version`:查询当前运行的 CLI 版本并检查是否有新版本(24h 节流、失败静默)
13
+ - `mcp start` 启动横幅(stderr)打印 CLI 版本,并后台检查更新(有新版时提示改用 `@latest` 升级)
14
+ - `mcp list` / `auth status` 展示 CLI 版本(`--json` 输出含 `cliVersion` 字段)
15
+ - 环境变量 `OPENLIBING_NO_UPDATE_NOTIFIER=1`:关闭更新检查(MCP 客户端配置 `env` 中设置)
16
+
17
+ ### Changed
18
+
19
+ - 客户端配置示例改用 `@openlibing/openlibing-cli@latest`(固定版本会导致升级后仍运行旧版)
20
+
21
+ ### Docs
22
+
23
+ - README 补充更新检查开关说明与"如何查询当前实际运行版本"指引
24
+
25
+ ## [0.1.13] - 2026-10-29
26
+
27
+ ### Added
28
+
29
+ - `auth status --json`:机器可读输出(环境 / 登录状态 / 账号 / token 过期时间 / 凭证路径),未登录时退出码 4
30
+ - CLI 退出码约定:`0` 成功 / `1` 一般错误 / `4` 认证未建立或凭证失效(脚本可据此触发重新登录)
31
+ - 凭证新增 `expiresAt`(从 JWT exp 解析):调用前临近过期自动预续期(CSRF 滑窗 25 分钟 / token 临期 5 分钟)
32
+
33
+ ### Changed
34
+
35
+ - MCP 工具失败返回统一为 `isError` + `{error,type,hint,details}` 结构化结果,AI 客户端可据 `type` 编程分支
36
+ - 401 续期逻辑收敛至 `authedRequest` 统一入口(预刷新 + 401 自动续期重试 + 结构化认证错误),
37
+ `reportApi` 去除重复逻辑,新增业务 API 自动具备续期能力
38
+
39
+ ### Fixed
40
+
41
+ - `SERVER_INFO.version` / `--version` 改为动态读取 package.json,修复硬编码 `0.1.0` 与实际包版本脱节
42
+
43
+ ## [0.1.12] - 2026-10-29
44
+
45
+ ### Changed
46
+
47
+ - `report_listTemplates` 改为渐进式返回:不传 `modelCode` 返回模板概览列表(modelCode / modelName / description);
48
+ 传入 `modelCode` 返回该模板完整详情(字段元数据 + 仓库列表);不存在时返回错误引导与可用 code 列表
49
+
50
+ ### Docs
51
+
52
+ - README 修正:401 描述对齐实际行为、版本信息更新、新增 MCP 工具说明表与超时配置说明
53
+ (`START_MCP_TIMEOUT_MS` / `RUN_MCP_TIMEOUT_MS` 归属 Trae 客户端)
54
+
55
+ ## [0.1.11] - 2026-10-28
56
+
57
+ ### Changed
58
+
59
+ - CLI 默认环境由 `beta` 改为 `prod`(未设置 `OPENLIBING_ENV` 时生效),
60
+ 修复 CLI auth 写入 beta 凭证、与 MCP 客户端 prod 配置错配的问题
61
+
62
+ ### Added
63
+
64
+ - `auth login` / `auth status` / `auth logout` 输出当前环境标识
65
+
66
+ ### Docs
67
+
68
+ - README 客户端配置示例与 `OPENLIBING_ENV` 默认值同步改为 prod,移除 gamma 描述
69
+
70
+ ## [0.1.10] - 2026-10-13
71
+
72
+ ### Changed
73
+
74
+ - 401 引导改造(面向 AI):服务级 `instructions` 随 initialize 下发(401 时先重新授权、不要排查源码);
75
+ 401 错误文案第一行动项改为"直接调用 auth_login 工具";`auth_login` 工具描述补充"其他工具返回 401 时应首选调用本工具"
76
+
77
+ ## [0.1.9] - 2026-09-23
78
+
79
+ ### Added
80
+
81
+ - 凭证按环境分文件存储(`~/.openlibing-cli/auth.{env}.json`),beta / prod 独立登录、互不覆盖,
82
+ 避免"beta 凭证调 prod 网关"导致 401 / 续期失败
83
+
84
+ ## [0.1.8] - 2026-09-20
85
+
86
+ ### Changed
87
+
88
+ - 更名:npm 包 `@openlibing/mcp-cli` → `@openlibing/openlibing-cli`;bin 命令 `mcp-cli` → `openlibing-cli`;
89
+ 插件 ID 与凭证目录同步调整(迁移说明见 README)
90
+ - 返回字段命名同步 workflow 与 job 级时间
package/README.md CHANGED
@@ -12,12 +12,14 @@ OpenLibing MCP 本地 CLI:把 ops 报告等只读能力包装为 MCP 工具(
12
12
  | `report_listTemplates` | 查询报告模板:不传参数返回模板概览列表(modelCode / modelName / description);传 `modelCode` 返回该模板完整详情(字段元数据 + 已上报仓库列表) |
13
13
  | `report_queryData` | 按模板与条件查询报告数据:支持仓库多选、时间范围、字段过滤与分页(默认 20 条/页,上限 500) |
14
14
  | `auth_login` | 触发登录授权(自动弹浏览器,点一次授权即完成);其他工具返回 401 / 提示凭证失效时调用 |
15
+ | `cli_version` | 查询当前运行的 CLI 版本并检查是否有新版本(24h 节流;用户问版本 / 是否最新 / 如何升级时调用) |
15
16
 
16
17
  > 推荐流程:先 `report_listTemplates` 确认模板与字段,再 `report_queryData` 查询数据(AI 客户端会按此流程自动调用)。
17
18
 
18
19
  ## 特性
19
20
 
20
- - **MCP 工具**(stdio):`report_listTemplates` / `report_queryData` / `auth_login`
21
+ - **MCP 工具**(stdio):`report_listTemplates` / `report_queryData` / `auth_login` / `cli_version`
22
+ - **版本可见与更新提示**:`mcp start` 启动横幅与 `auth status` 展示 CLI 版本;`cli_version` 工具可查询是否有新版;启动时后台检查更新(24h 节流,`OPENLIBING_NO_UPDATE_NOTIFIER=1` 可关)
21
23
  - **连接即授权**:`mcp start` 启动时自动续期凭证;凭证失效自动弹出浏览器授权,**点一次即完成**
22
24
  - **平台选择**:登录时弹出平台选择页(GitCode / Gitee / GitHub / UniPortal / OpenUBMC),点选后跳转对应平台授权
23
25
  - **凭证安全**:token/refresh/csrf 本地 AES-256-GCM 加密存储(`~/.openlibing-cli/auth.{env}.json`,**按环境分文件**,beta/prod 互不覆盖),不落服务端
@@ -46,7 +48,7 @@ npm install -g @openlibing/openlibing-cli
46
48
  "mcpServers": {
47
49
  "openlibing-report": {
48
50
  "command": "npx",
49
- "args": ["-y", "@openlibing/openlibing-cli", "mcp", "start"],
51
+ "args": ["-y", "@openlibing/openlibing-cli@latest", "mcp", "start"],
50
52
  "env": {
51
53
  "OPENLIBING_ENV": "prod",
52
54
  "START_MCP_TIMEOUT_MS": "300000"
@@ -56,7 +58,9 @@ npm install -g @openlibing/openlibing-cli
56
58
  }
57
59
  ```
58
60
 
59
- > `START_MCP_TIMEOUT_MS` / `RUN_MCP_TIMEOUT_MS` 为 **Trae 客户端读取的配置**(不是 CLI 环境变量):前者是 MCP 服务启动超时(默认 60000ms),首次授权建议 ≥ 300000(5 分钟),避免超时误判失败;后者是工具调用超时(默认 60000ms),大查询可适当调大。
61
+ > - 包名后缀 `@latest` 让 npx 每次解析最新版本(推荐);固定版本会导致升级后仍运行旧版。
62
+ > - `OPENLIBING_NO_UPDATE_NOTIFIER=1`:加到 `env` 中可关闭启动时的版本更新检查(默认开启:24h 只查一次、后台异步、失败静默)。
63
+ > - `START_MCP_TIMEOUT_MS` / `RUN_MCP_TIMEOUT_MS` 为 **Trae 客户端读取的配置**(不是 CLI 环境变量):前者是 MCP 服务启动超时(默认 60000ms),首次授权建议 ≥ 300000(5 分钟),避免超时误判失败;后者是工具调用超时(默认 60000ms),大查询可适当调大。
60
64
 
61
65
  ### OpenCode(opencode.jsonc)
62
66
 
@@ -65,7 +69,7 @@ npm install -g @openlibing/openlibing-cli
65
69
  "mcp": {
66
70
  "openlibing-report": {
67
71
  "type": "local",
68
- "command": ["npx", "-y", "@openlibing/openlibing-cli", "mcp", "start"],
72
+ "command": ["npx", "-y", "@openlibing/openlibing-cli@latest", "mcp", "start"],
69
73
  "environment": { "OPENLIBING_ENV": "prod" },
70
74
  "enabled": true
71
75
  }
@@ -73,6 +77,8 @@ npm install -g @openlibing/openlibing-cli
73
77
  }
74
78
  ```
75
79
 
80
+ > 想确认当前实际运行的版本:让 AI 调用 `cli_version` 工具,或查看 `mcp start` 的启动日志(首行打印版本横幅)。
81
+
76
82
  ## 登录(点一次授权)
77
83
 
78
84
  MCP 连接时若本地无有效凭证,会自动弹出浏览器:
@@ -92,11 +98,13 @@ npx -y @openlibing/openlibing-cli auth login --manual
92
98
 
93
99
  # 查看登录状态 / 续期 / 退出
94
100
  npx -y @openlibing/openlibing-cli auth status
101
+ npx -y @openlibing/openlibing-cli auth status --json # 机器可读输出(脚本/Agent 消费,含 token 过期时间)
95
102
  npx -y @openlibing/openlibing-cli auth refresh
96
103
  npx -y @openlibing/openlibing-cli auth logout
97
104
  ```
98
105
 
99
106
  > 自动登录依赖本机 Chrome 或 Edge(优先 Chrome,失败回退 Edge)。两者都没有时回退手动粘贴方式。
107
+ > CLI 退出码约定:`0` 成功;`1` 一般错误;`4` 认证未建立或凭证失效(脚本可据此触发 `auth login` 重新登录)。
100
108
 
101
109
  ## 环境变量
102
110
 
@@ -109,19 +117,20 @@ npx -y @openlibing/openlibing-cli auth logout
109
117
  | `OPENLIBING_PLUGIN_CLIENT` | `agent_arena` | 插件登录 client(须在网关白名单) |
110
118
  | `OPENLIBING_PLUGIN_ID` | `openlibing-cli` | 插件标识 |
111
119
  | `OPENLIBING_AUTH_FILE` | `~/.openlibing-cli/auth.{env}.json` | 覆盖凭证文件路径(测试隔离用) |
120
+ | `OPENLIBING_NO_UPDATE_NOTIFIER` | 未设置(开启检查) | 设为 `1` 关闭启动时的 npm 版本更新检查(结果缓存 24h,见 `~/.openlibing-cli/update-check.json`) |
112
121
 
113
122
  ## 凭证与安全
114
123
 
115
124
  - 凭证文件:`~/.openlibing-cli/auth.{env}.json`(如 `auth.prod.json` / `auth.beta.json`;AES-256-GCM,密钥由本机标识派生,换机器/用户不可解密)
116
125
  - **环境隔离**:各环境独立登录、独立凭证文件;切换 `OPENLIBING_ENV` 自动读写对应环境凭证,不再互相覆盖
117
- - token / csrf 有效期约 30 分钟:`mcp start` 启动和 401 时自动用 refresh token 续期,无需手动干预
126
+ - token 有效期 8 小时(JWT exp);csrf 为 30 分钟滑动有效期:凭证临近过期时调用会自动**预续期**,401 时自动续期并重试,无需手动干预
118
127
  - refresh token 失效后需重新授权(自动弹浏览器,点一次即可)
119
128
  - 401 错误信息明确指引 AI 调用 `auth_login` 工具重新授权(命令行 `auth login` 为备选),不会引导获取网关 cookie
120
129
 
121
130
  ## 发布与维护
122
131
 
123
- - 版本发布走项目级 `npm-manage` skill(`publish.py` 解密 npm token 发布,token 不落明文)
124
- - 当前版本:`0.1.11`(0.1.9 凭证按环境分文件 / 0.1.10 401 引导调用 auth_login / 0.1.11 默认环境改为 prod;更早特性:登录平台选择、连接即授权、Playwright 自动登录、登录态持久化)
132
+ - 变更记录:[CHANGELOG.md](https://gitcode.com/w30060144/openlibing-cli/blob/main/CHANGELOG.md)
133
+ - 发版流程:更新 CHANGELOG → `npm version --no-git-tag-version` bump 版本 → 提交并打 tag(`vX.Y.Z`)→ 运行 `npm-manage` 的 `publish.py` 发布(npm token 不落明文)
125
134
  - 包名:`@openlibing/openlibing-cli`(原 `@openlibing/mcp-cli` 已 deprecated,迁移说明见下)
126
135
 
127
136
  ### 迁移说明(mcp-cli → openlibing-cli)
@@ -147,7 +156,9 @@ npm test # vitest(握手/凭证/工具注册)
147
156
  | `src/auth/browser.ts` | 系统浏览器启动(chrome→edge 回退)、平台选择页、回调捕获 |
148
157
  | `src/auth/login.ts` | 插件登录 / 自动授权 / 凭证续期 / MCP 启动鉴权 |
149
158
  | `src/auth/store.ts` | 凭证 AES-256-GCM 本地加密存储 |
150
- | `src/client/reportApi.ts` | 报告接口客户端(401 自动续期 + 引导错误) |
159
+ | `src/auth/authedRequest.ts` | 认证请求入口:预刷新 + 401 续期重试 + 结构化错误(业务 API 统一经此) |
160
+ | `src/updateCheck.ts` | 版本更新检查(npm registry、24h 节流缓存、静默失败、可开关) |
161
+ | `src/client/reportApi.ts` | 报告接口客户端 |
151
162
  | `src/tools/` | MCP 工具定义(name / description / schema / handler) |
152
163
  | `src/config/env.ts` | 环境解析(网关 / ops 地址、默认 prod) |
153
164
  | `src/mcp/server.ts` | MCP stdio server 组装 |
@@ -0,0 +1,13 @@
1
+ /**
2
+ * 认证请求入口:所有需要登录态的业务 API 统一经此发起(续期逻辑单点维护,新增 API 自动具备)。
3
+ *
4
+ * 策略(依据 gateway 行为,见 LoginServiceImpl/AuthFilter):
5
+ * 1. 预刷新:CSRF 为 Redis 滑动 30 分钟(每次请求续期),access token exp 8 小时。
6
+ * 若本地凭证 updatedAt(续期时会同步重取 CSRF)距今超过 25 分钟(留 5 分钟余量),
7
+ * 或 token 剩余有效期不足 5 分钟,则先续期再发起请求——避免“必然失败一次再重试”的往返;
8
+ * 2. 401 兜底:任何 401(含 CSRF 过期、token 失效)自动续期一次并重试;
9
+ * 3. 续期仍失败 → 抛 CliError(type=auth),引导 AI 调用 auth_login(与既有行为指引一致)。
10
+ */
11
+ import { type RequestOptions } from "../client/http.js";
12
+ /** 发起需要登录态的请求:预刷新 → 请求 → 401 自动续期重试一次 → 结构化认证错误 */
13
+ export declare function authedRequest<T>(url: string, opts?: RequestOptions): Promise<T>;
@@ -0,0 +1,80 @@
1
+ /**
2
+ * 认证请求入口:所有需要登录态的业务 API 统一经此发起(续期逻辑单点维护,新增 API 自动具备)。
3
+ *
4
+ * 策略(依据 gateway 行为,见 LoginServiceImpl/AuthFilter):
5
+ * 1. 预刷新:CSRF 为 Redis 滑动 30 分钟(每次请求续期),access token exp 8 小时。
6
+ * 若本地凭证 updatedAt(续期时会同步重取 CSRF)距今超过 25 分钟(留 5 分钟余量),
7
+ * 或 token 剩余有效期不足 5 分钟,则先续期再发起请求——避免“必然失败一次再重试”的往返;
8
+ * 2. 401 兜底:任何 401(含 CSRF 过期、token 失效)自动续期一次并重试;
9
+ * 3. 续期仍失败 → 抛 CliError(type=auth),引导 AI 调用 auth_login(与既有行为指引一致)。
10
+ */
11
+ import { ApiError, request } from "../client/http.js";
12
+ import { refreshToken } from "./refresh.js";
13
+ import { loadAuth } from "./store.js";
14
+ import { CliError } from "../errors.js";
15
+ /** CSRF 滑窗 30 分钟,提前 5 分钟预刷新 */
16
+ const CSRF_REFRESH_WINDOW_MS = 25 * 60_000;
17
+ /** access token 临期 5 分钟内预刷新 */
18
+ const TOKEN_REFRESH_WINDOW_MS = 5 * 60_000;
19
+ /** 凭证失效错误:第一行动项为调用 auth_login(AI 可直接执行),命令行登录为备选;不点名具体 skill */
20
+ function authRequiredError() {
21
+ return new CliError({
22
+ message: "访问被拒绝(HTTP 401):本地 MCP 凭证已失效,自动续期失败。",
23
+ type: "auth",
24
+ hint: "请直接调用 auth_login 工具完成重新授权(会自动弹出浏览器,用户点一次授权即可)。" +
25
+ "若工具不可用,再由用户手动运行 `openlibing-cli auth login` 重新登录" +
26
+ "(凭证按环境独立存储于 ~/.openlibing-cli/auth.{env}.json,与浏览器 cookie 无关)。",
27
+ });
28
+ }
29
+ /** 预刷新判断:凭证临近 CSRF 滑窗或 token 临期时先续期(失败不阻塞,走 401 兜底) */
30
+ async function ensureFreshAuth() {
31
+ const auth = loadAuth();
32
+ if (!auth) {
33
+ throw new CliError({
34
+ message: "未检测到本地登录凭证。",
35
+ type: "auth",
36
+ hint: "请先调用 auth_login 工具完成授权,或由用户运行 `openlibing-cli auth login` 登录。",
37
+ });
38
+ }
39
+ const now = Date.now();
40
+ const csrfStale = now - Date.parse(auth.updatedAt) > CSRF_REFRESH_WINDOW_MS;
41
+ const tokenExpiring = auth.expiresAt
42
+ ? Date.parse(auth.expiresAt) - now < TOKEN_REFRESH_WINDOW_MS
43
+ : false;
44
+ if (csrfStale || tokenExpiring) {
45
+ try {
46
+ await refreshToken();
47
+ }
48
+ catch {
49
+ // 预刷新失败不阻塞:请求若 401 会再触发一次续期(并产出行动导向错误)
50
+ }
51
+ }
52
+ }
53
+ /** 发起需要登录态的请求:预刷新 → 请求 → 401 自动续期重试一次 → 结构化认证错误 */
54
+ export async function authedRequest(url, opts = {}) {
55
+ await ensureFreshAuth();
56
+ try {
57
+ return await request(url, { ...opts, auth: true });
58
+ }
59
+ catch (err) {
60
+ if (!(err instanceof ApiError) || err.status !== 401)
61
+ throw err;
62
+ // 401:续期一次后重试
63
+ try {
64
+ await refreshToken();
65
+ }
66
+ catch {
67
+ throw authRequiredError();
68
+ }
69
+ try {
70
+ return await request(url, { ...opts, auth: true });
71
+ }
72
+ catch (retryErr) {
73
+ if (retryErr instanceof ApiError && retryErr.status === 401) {
74
+ throw authRequiredError();
75
+ }
76
+ throw retryErr;
77
+ }
78
+ }
79
+ }
80
+ //# sourceMappingURL=authedRequest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authedRequest.js","sourceRoot":"","sources":["../../src/auth/authedRequest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAuB,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,+BAA+B;AAC/B,MAAM,sBAAsB,GAAG,EAAE,GAAG,MAAM,CAAC;AAC3C,+BAA+B;AAC/B,MAAM,uBAAuB,GAAG,CAAC,GAAG,MAAM,CAAC;AAE3C,gEAAgE;AAChE,SAAS,iBAAiB;IACxB,OAAO,IAAI,QAAQ,CAAC;QAClB,OAAO,EAAE,sCAAsC;QAC/C,IAAI,EAAE,MAAM;QACZ,IAAI,EACF,gDAAgD;YAChD,kDAAkD;YAClD,gEAAgE;KACnE,CAAC,CAAC;AACL,CAAC;AAED,uDAAuD;AACvD,KAAK,UAAU,eAAe;IAC5B,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;IACxB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,QAAQ,CAAC;YACjB,OAAO,EAAE,aAAa;YACtB,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,+DAA+D;SACtE,CAAC,CAAC;IACL,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,SAAS,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,sBAAsB,CAAC;IAC5E,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS;QAClC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,GAAG,GAAG,uBAAuB;QAC5D,CAAC,CAAC,KAAK,CAAC;IACV,IAAI,SAAS,IAAI,aAAa,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,YAAY,EAAE,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,uCAAuC;QACzC,CAAC;IACH,CAAC;AACH,CAAC;AAED,mDAAmD;AACnD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAW,EACX,IAAI,GAAmB,EAAE;IAEzB,MAAM,eAAe,EAAE,CAAC;IACxB,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAI,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,CAAC,GAAG,YAAY,QAAQ,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,MAAM,GAAG,CAAC;QAChE,cAAc;QACd,IAAI,CAAC;YACH,MAAM,YAAY,EAAE,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,iBAAiB,EAAE,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,CAAI,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,QAAQ,EAAE,CAAC;YAClB,IAAI,QAAQ,YAAY,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5D,MAAM,iBAAiB,EAAE,CAAC;YAC5B,CAAC;YACD,MAAM,QAAQ,CAAC;QACjB,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ /** 解析 JWT payload 的 exp(秒)并转为 ISO 时间;解析失败返回 undefined(旧凭证/非 JWT 均按无过期信息处理) */
2
+ export declare function parseJwtExpiresAt(token: string): string | undefined;
@@ -0,0 +1,21 @@
1
+ /**
2
+ * JWT 本地解析(不验签):仅用于读取 exp 做本地过期判断与展示,不用于任何安全决策。
3
+ * 插件 access token 为网关签发的标准 JWT(exp = 8 小时),见 LoginServiceImpl#generatePluginAuth。
4
+ */
5
+ import { Buffer } from "node:buffer";
6
+ /** 解析 JWT payload 的 exp(秒)并转为 ISO 时间;解析失败返回 undefined(旧凭证/非 JWT 均按无过期信息处理) */
7
+ export function parseJwtExpiresAt(token) {
8
+ try {
9
+ const payload = token.split(".")[1];
10
+ if (!payload)
11
+ return undefined;
12
+ const json = JSON.parse(Buffer.from(payload, "base64url").toString("utf8"));
13
+ return typeof json.exp === "number"
14
+ ? new Date(json.exp * 1000).toISOString()
15
+ : undefined;
16
+ }
17
+ catch {
18
+ return undefined;
19
+ }
20
+ }
21
+ //# sourceMappingURL=jwt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt.js","sourceRoot":"","sources":["../../src/auth/jwt.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,8EAA8E;AAC9E,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO;YAAE,OAAO,SAAS,CAAC;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CACrB,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAC/B,CAAC;QACtB,OAAO,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ;YACjC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;YACzC,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -13,6 +13,7 @@ import { createInterface } from "node:readline";
13
13
  import { env } from "../config/env.js";
14
14
  import { request } from "../client/http.js";
15
15
  import { refreshToken } from "./refresh.js";
16
+ import { parseJwtExpiresAt } from "./jwt.js";
16
17
  import { clearAuth, fingerprint, loadAuth, saveAuth } from "./store.js";
17
18
  import { waitForCallbackUrlWithPicker } from "./browser.js";
18
19
  /** 打开系统浏览器 */
@@ -61,6 +62,7 @@ export async function exchangeCode(code) {
61
62
  accountId: data.accountId,
62
63
  email: data.email,
63
64
  updatedAt: new Date().toISOString(),
65
+ expiresAt: parseJwtExpiresAt(data.token),
64
66
  };
65
67
  }
66
68
  const BROWSER_UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36";
@@ -1 +1 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/auth/login.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/auth/login.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@
5
5
  import { env } from "../config/env.js";
6
6
  import { request } from "../client/http.js";
7
7
  import { fetchCsrf } from "./login.js";
8
+ import { parseJwtExpiresAt } from "./jwt.js";
8
9
  import { loadAuth, saveAuth } from "./store.js";
9
10
  /** 用 refresh token 换新 access token;成功后更新本地凭证 */
10
11
  export async function refreshToken() {
@@ -22,6 +23,7 @@ export async function refreshToken() {
22
23
  token: data.token,
23
24
  refreshedToken: data.refreshedToken ?? current.refreshedToken,
24
25
  updatedAt: new Date().toISOString(),
26
+ expiresAt: parseJwtExpiresAt(data.token),
25
27
  };
26
28
  // csrf 与 token 同为 30 分钟有效期,续期后同步刷新(失败不阻塞,业务调用时会再次触发续期)
27
29
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"refresh.js","sourceRoot":"","sources":["../../src/auth/refresh.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAwB,MAAM,YAAY,CAAC;AAetE,gDAAgD;AAChD,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,OAAO,GAAG,QAAQ,EAAE,CAAC;IAC3B,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,GAAG,GAAG,CAAC,cAAc,2CAA2C,EAChE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,EAAE,CACrE,CAAC;IACF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,IAAI,MAAM,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,SAAS,MAAM,CAAC,OAAO,IAAI,kBAAkB,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,MAAM,OAAO,GAAoB;QAC/B,GAAG,OAAO;QACV,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,OAAO,CAAC,cAAc;QAC7D,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IACF,uDAAuD;IACvD,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,gCAAgC;IAClC,CAAC;IACD,QAAQ,CAAC,OAAO,CAAC,CAAC;IAClB,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"refresh.js","sourceRoot":"","sources":["../../src/auth/refresh.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAwB,MAAM,YAAY,CAAC;AAetE,gDAAgD;AAChD,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,OAAO,GAAG,QAAQ,EAAE,CAAC;IAC3B,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,GAAG,GAAG,CAAC,cAAc,2CAA2C,EAChE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,EAAE,CACrE,CAAC;IACF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,IAAI,MAAM,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,SAAS,MAAM,CAAC,OAAO,IAAI,kBAAkB,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,MAAM,OAAO,GAAoB;QAC/B,GAAG,OAAO;QACV,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,OAAO,CAAC,cAAc;QAC7D,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,SAAS,EAAE,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC;KACzC,CAAC;IACF,uDAAuD;IACvD,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,gCAAgC;IAClC,CAAC;IACD,QAAQ,CAAC,OAAO,CAAC,CAAC;IAClB,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -10,6 +10,8 @@ export interface AuthCredentials {
10
10
  email?: string;
11
11
  /** 本地保存时间 ISO */
12
12
  updatedAt: string;
13
+ /** access token 过期时间 ISO(从 JWT exp 解析,可选:旧凭证无此字段时按 401 兜底处理) */
14
+ expiresAt?: string;
13
15
  }
14
16
  export declare function authFilePath(): string;
15
17
  export declare function loadAuth(): AuthCredentials | null;
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/auth/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/auth/store.ts"],"names":[],"mappings":"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"}
@@ -2,54 +2,31 @@
2
2
  * 报告功能组 REST 客户端:真实调用 ops 报告接口(走网关转发)。
3
3
  * 对应 ops ReportController:POST /test-report/template/list、POST /test-report/data/query。
4
4
  * 响应为 ops 统一 Result<T>({code, messageCn, messageEn, data})。
5
+ * 认证与 401 续期由 authedRequest 统一处理(预刷新 + 401 重试 + 结构化认证错误)。
5
6
  */
6
7
  import { env } from "../config/env.js";
7
- import { ApiError, request } from "./http.js";
8
- import { refreshToken } from "../auth/refresh.js";
9
- /**
10
- * 401 处理(面向 AI 的行动引导):
11
- * 1. 自动用 refresh token 续期一次并重试;
12
- * 2. 续期失败则抛出行动指向明确的错误——第一行动项是“调用 auth_login 工具”(AI 可直接执行),
13
- * 命令行登录作为备选(AI 不一定有 shell 权限);不点名具体 skill,避免反向引导 AI 去排查源码。
14
- */
15
- async function withAuthRetry(fn) {
16
- try {
17
- return await fn();
18
- }
19
- catch (err) {
20
- if (err instanceof ApiError && err.status === 401) {
21
- try {
22
- await refreshToken();
23
- return await fn();
24
- }
25
- catch {
26
- throw new Error("访问被拒绝(HTTP 401):本地 MCP 凭证已失效,自动续期失败。\n" +
27
- "下一步:请直接调用 auth_login 工具完成重新授权(会自动弹出浏览器,用户点一次授权即可)。\n" +
28
- "若工具不可用,再由用户手动运行 `openlibing-cli auth login` 重新登录" +
29
- "(凭证按环境独立存储于 ~/.openlibing-cli/auth.{env}.json,与浏览器 cookie 无关)。");
30
- }
31
- }
32
- throw err;
33
- }
34
- }
8
+ import { authedRequest } from "../auth/authedRequest.js";
9
+ import { CliError } from "../errors.js";
35
10
  /** 查询测试报告模板列表 */
36
11
  export async function listReportTemplates() {
37
- return withAuthRetry(async () => {
38
- const result = await request(`${env.opsBaseUrl}/test-report/template/list`, { method: "POST", body: {}, auth: true });
39
- if (result.code !== 200) {
40
- throw new Error(`listTemplates 失败: ${result.messageCn ?? result.messageEn ?? result.code}`);
41
- }
42
- return result.data;
43
- });
12
+ const result = await authedRequest(`${env.opsBaseUrl}/test-report/template/list`, { method: "POST", body: {} });
13
+ if (result.code !== 200) {
14
+ throw new CliError({
15
+ message: `listTemplates 失败: ${result.messageCn ?? result.messageEn ?? result.code}`,
16
+ type: "api_error",
17
+ });
18
+ }
19
+ return result.data;
44
20
  }
45
21
  /** 按条件查询测试报告数据,分页返回 */
46
22
  export async function queryReportData(params) {
47
- return withAuthRetry(async () => {
48
- const result = await request(`${env.opsBaseUrl}/test-report/data/query`, { method: "POST", body: params, auth: true });
49
- if (result.code !== 200) {
50
- throw new Error(`queryData 失败: ${result.messageCn ?? result.messageEn ?? result.code}`);
51
- }
52
- return result.data;
53
- });
23
+ const result = await authedRequest(`${env.opsBaseUrl}/test-report/data/query`, { method: "POST", body: params });
24
+ if (result.code !== 200) {
25
+ throw new CliError({
26
+ message: `queryData 失败: ${result.messageCn ?? result.messageEn ?? result.code}`,
27
+ type: "api_error",
28
+ });
29
+ }
30
+ return result.data;
54
31
  }
55
32
  //# sourceMappingURL=reportApi.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reportApi.js","sourceRoot":"","sources":["../../src/client/reportApi.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AA+DlD;;;;;GAKG;AACH,KAAK,UAAU,aAAa,CAAI,EAAoB;IAClD,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,EAAE,CAAC;IACpB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAClD,IAAI,CAAC;gBACH,MAAM,YAAY,EAAE,CAAC;gBACrB,OAAO,MAAM,EAAE,EAAE,CAAC;YACpB,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,IAAI,KAAK,CACb,wCAAwC;oBACxC,sDAAsD;oBACtD,kDAAkD;oBAClD,gEAAgE,CACjE,CAAC;YACJ,CAAC;QACH,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,iBAAiB;AACjB,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,OAAO,aAAa,CAAC,KAAK,IAAI,EAAE;QAC9B,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,GAAG,GAAG,CAAC,UAAU,4BAA4B,EAC7C,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CACzC,CAAC;QACF,IAAI,MAAM,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,qBAAqB,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9F,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,uBAAuB;AACvB,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAA6B;IAE7B,OAAO,aAAa,CAAC,KAAK,IAAI,EAAE;QAC9B,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,GAAG,GAAG,CAAC,UAAU,yBAAyB,EAC1C,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAC7C,CAAC;QACF,IAAI,MAAM,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,iBAAiB,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1F,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"reportApi.js","sourceRoot":"","sources":["../../src/client/reportApi.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AA+DxC,iBAAiB;AACjB,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,MAAM,MAAM,GAAG,MAAM,aAAa,CAChC,GAAG,GAAG,CAAC,UAAU,4BAA4B,EAC7C,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAC7B,CAAC;IACF,IAAI,MAAM,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;QACxB,MAAM,IAAI,QAAQ,CAAC;YACjB,OAAO,EAAE,qBAAqB,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,EAAE;YACnF,IAAI,EAAE,WAAW;SAClB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,uBAAuB;AACvB,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAA6B;IAE7B,MAAM,MAAM,GAAG,MAAM,aAAa,CAChC,GAAG,GAAG,CAAC,UAAU,yBAAyB,EAC1C,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CACjC,CAAC;IACF,IAAI,MAAM,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;QACxB,MAAM,IAAI,QAAQ,CAAC;YACjB,OAAO,EAAE,iBAAiB,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,EAAE;YAC/E,IAAI,EAAE,WAAW;SAClB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC"}
@@ -1,5 +1,7 @@
1
1
  /**
2
2
  * auth 子命令:auth login / auth status / auth logout / auth refresh。
3
+ * 退出码约定:成功 0;认证未建立或凭证失效 4(EXIT_AUTH,脚本可据此触发登录);其他失败 1。
4
+ * auth status 支持 --json 机器可读输出(脚本/Agent 消费;未登录时为 {loggedIn:false} + 退出码 4)。
3
5
  */
4
6
  import { Command } from "commander";
5
7
  export declare function authCommand(program: Command): void;
@@ -2,6 +2,18 @@ import { login, logout, fingerprint } from "../auth/login.js";
2
2
  import { refreshToken } from "../auth/refresh.js";
3
3
  import { loadAuth, authFilePath } from "../auth/store.js";
4
4
  import { env } from "../config/env.js";
5
+ import { APP_VERSION } from "../version.js";
6
+ import { EXIT_AUTH } from "../exitCodes.js";
7
+ /** 剩余有效时间的人类可读描述(基于本地时钟差值,仅作展示) */
8
+ function remainingText(iso) {
9
+ const ms = Date.parse(iso) - Date.now();
10
+ if (Number.isNaN(ms))
11
+ return "未知";
12
+ if (ms <= 0)
13
+ return "已过期";
14
+ const minutes = Math.floor(ms / 60_000);
15
+ return minutes >= 60 ? `${Math.floor(minutes / 60)} 小时 ${minutes % 60} 分钟` : `${minutes} 分钟`;
16
+ }
5
17
  export function authCommand(program) {
6
18
  const cmd = program
7
19
  .command("auth")
@@ -17,22 +29,47 @@ export function authCommand(program) {
17
29
  }
18
30
  catch (err) {
19
31
  console.error(`登录失败:${err.message}`);
20
- process.exitCode = 1;
32
+ process.exitCode = EXIT_AUTH;
21
33
  }
22
34
  });
23
35
  cmd
24
36
  .command("status")
25
37
  .description("查看登录状态与凭证位置")
26
- .action(() => {
27
- console.log(`当前环境:${env.env}`);
38
+ .option("--json", "以 JSON 输出(脚本/Agent 消费;未登录时退出码 4)")
39
+ .action((opts) => {
28
40
  const auth = loadAuth();
41
+ if (opts.json) {
42
+ const payload = {
43
+ env: env.env,
44
+ cliVersion: APP_VERSION,
45
+ loggedIn: auth !== null,
46
+ accountName: auth?.accountName,
47
+ accountId: auth?.accountId,
48
+ email: auth?.email,
49
+ updatedAt: auth?.updatedAt,
50
+ /** access token 过期时间(JWT exp 解析;旧凭证可能缺失) */
51
+ expiresAt: auth?.expiresAt,
52
+ authFile: authFilePath(),
53
+ };
54
+ console.log(JSON.stringify(payload, null, 2));
55
+ if (!auth) {
56
+ process.exitCode = EXIT_AUTH;
57
+ }
58
+ return;
59
+ }
60
+ console.log(`当前环境:${env.env}`);
61
+ console.log(`CLI 版本:${APP_VERSION}`);
29
62
  if (!auth) {
30
63
  console.log("未登录。执行 openlibing-cli auth login 完成授权。");
64
+ process.exitCode = EXIT_AUTH;
31
65
  return;
32
66
  }
33
67
  console.log(`已登录:${auth.accountName ?? "unknown"}(fingerprint=${fingerprint(auth.accountId)})`);
34
68
  console.log(`凭证文件:${authFilePath()}`);
35
69
  console.log(`保存时间:${auth.updatedAt}`);
70
+ if (auth.expiresAt) {
71
+ console.log(`token 有效期至:${auth.expiresAt}(剩余约 ${remainingText(auth.expiresAt)},到期前调用会自动续期)`);
72
+ }
36
73
  });
37
74
  cmd
38
75
  .command("logout")
@@ -51,7 +88,7 @@ export function authCommand(program) {
51
88
  }
52
89
  catch (err) {
53
90
  console.error(`续期失败:${err.message}`);
54
- process.exitCode = 1;
91
+ process.exitCode = EXIT_AUTH;
55
92
  }
56
93
  });
57
94
  }
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAEvC,MAAM,UAAU,WAAW,CAAC,OAAgB;IAC1C,MAAM,GAAG,GAAG,OAAO;SAChB,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,WAAW,CAAC,CAAC;IAE5B,GAAG;SACA,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,qCAAqC,CAAC;SAClD,MAAM,CAAC,UAAU,EAAE,uCAAuC,CAAC;SAC3D,MAAM,CAAC,KAAK,EAAE,IAA0B,EAAE,EAAE;QAC3C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,WAAW,IAAI,SAAS,OAAO,GAAG,CAAC,GAAG,gBAAgB,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACjH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,QAAS,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YAChD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,aAAa,CAAC;SAC1B,MAAM,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;QAC/B,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;YACtD,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,WAAW,IAAI,SAAS,gBAAgB,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAChG,OAAO,CAAC,GAAG,CAAC,QAAQ,YAAY,EAAE,EAAE,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,QAAQ,CAAC;SACrB,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,iCAAiC,CAAC;SAC9C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,YAAY,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,WAAW,IAAI,SAAS,gBAAgB,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACnG,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,QAAS,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YAChD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  /**
2
2
  * mcp 子命令:mcp start(启动 stdio MCP Server)/ mcp list(列出已注册工具)。
3
+ * 启动时打印版本横幅(stderr,客户端日志可见)并后台检查更新(不阻塞、24h 节流、失败静默)。
3
4
  */
4
5
  import { Command } from "commander";
5
6
  export declare function mcpCommand(program: Command): void;